Язык программирования TurboPascal
- Григоренко Г. Н.
- Просмотров: 6706
Turbo Pascal. Структурированные операторы
Структурированными операторами называются такие операторы, которые включают в себя другие операторы и управляют последовательностью их выполнения. К ним относятся:
- составной оператор;
- условный оператор If;
- условный оператор Case;
- оператор цикла Repeat;
- оператор цикла While;
- оператор цикла For.
Составной оператор
Часто необходимо, чтобы по отношению к какому-то действию несколько операторов воспринимались в программе как один оператор. Такой оператор может быть получен, если необходимую последовательность операторов объединить операторными скобками. Служебные слова Begin и End называются операторными скобками.
Формат оператора:
Begin
оператор №1;
оператор №2;
оператор №3;
...
оператор № n-1;
оператор № n; End;
Слово Begin играет роль открывающей скобки, слово End – роль закрывающей скобки.
Составной оператор воспринимается как единый оператор. Его можно вставлять в любое место программы, где допускается только один оператор.
Операторы, входящие в составной оператор, как и всякие операторы, разделяются точкой с запятой, но перед end этот разделитель можно не ставить. После end точка с запятой необходима как разделитель между составным оператором и следующим оператором.
В последующих разделах смысл и назначение составного оператора будут проиллюстрированы на многочисленных примерах.
Условный оператор IF
Оператор If реализует алгоритмическую конструкцию «Решение» и позволяет изменить порядок выполнения операторов в зависимости от истинности или ложности некоторого условия. Формат оператора может быть записан в двух формах: полной и неполной форме.
Формат оператора в полной форме:
If<условие> Then<оператор 1> Else<оператор 2>
Формат оператора в неполной форме:
If<условие>Then<оператор 1>
If (если), Then (тогда), Else (иначе) – зарезервированные слова.
Блок-схемы оператора if представлены ниже:
Условный оператор работает следующим образом. Сначала вычисляется условное выражение < условие >. Если результат есть True (истина), то выполняется < оператор 1 > (после слова Then), а < оператор 2 > пропускается. Если результат есть False (ложь), то < оператор 1 > пропускается, а выполняется < оператор 2 > (после слова Else). Перед Else никогда не ставится точка с запятой, поскольку это еще не конец оператора If.
Часть Else <оператор 2> условного оператора If может быть опущена. Если < условие > оператора If принимает значение True, то выполняется <оператор 1>, в противном случае этот оператор пропускается. В этом случае формат условного оператора имеет неполную форму:
Сравним две конструкции:
If <условие>Then<оператор 1>;
If <условие>Then<оператор 1>; <оператор 2>;
В первой строке <оператор 1> или выполняется, или не выполняется в зависимости от выполнения <условия>. Во второй строке <оператор 2> выполняется всегда, поскольку после <оператора 1> стоит разделитель «;» и все что стоит поле разделителя считается другим оператором. Поэтому в соответствии с форматом оператора If после зарезервированных слов Then и Else может стоять всего лишь один оператор.
Пример:
If a > 0 Then b:=1;
If a > 0 Then b:=1; a:=b; {оператор a:=b; выполняется всегда}
Если же необходимо выполнить после Then и Else не один, а несколько операторов, то следует поставить операторные скобки, т.е. использовать составной оператор.
В этом случае оператор If будет иметь следующий вид:
If<условие>Then
begin
оператор 11;
...
оператор 1n;
end
Else
begin
оператор 21;
...
оператор 2n;
end;
Пример.
If a>0 Then begin b:=1; a:=b; end;
ЗАДАЧА 1. Вычислить значение функции, заданной неравенствами
y=x+1 при x<0;
y=2∙x при x>0.
program a5;
var
x,y:real;
begin
write(‘Введите значение x: ’);
readln(x);
if x
writeln(‘Значение у равно: ’, y:6:2)
end.
Результаты работы программы:
Введите значения x:0.5
Значение у равно: 1.00
ЗАДАЧА 2. Написать программу решения квадратного уравнения. Если дискриминант меньше нуля, то выводить соответствующее сообщение.
Program a6;
var
a,b,c:real; {коэффициенты уравнения}
x1,x2:real; {корни уравнения}
d:real; {дискриминант}
begin
Writeln(‘Решение квадратного уравнения’:50);
Write(‘Введите значения коэффициентов a,b,c:’);
Readln(a,b,c); {ввод коэффициентов}
d:=b*b-4*a*c;
if (d<0) then
Writeln(‘Уравнение не имеет корней.’)
else
begin {операторные скобки}
x1:=(-b+sqrt(d))/(2*a);
x2:=(-b-sqrt(d))/(2*a);
WriteLn(‘Корни уравнения: ’, x1:8:2,x2:8:2);
end;
end.
Результаты работы программы:
Решение квадратного уравнения
Введите значения коэффициентов a,b,c:3 1 6
Уравнение не имеет корней.
В операторе If может быть использован не только составной оператор, но и любой структурированный оператор. В качестве такого оператора может использоваться и рассмотренный нами условный оператор If. В этом случае говорят о вложенных операторах If.
Пример.
if условие then | |||||
begin | Операторные скобки | ||||
оператор; | вложенный оператор IF, неполная форма |
||||
if условие then опеатор | |||||
else оператор; | |||||
end | |||||
else | |||||
begin | Операторные скобки | ||||
оператор; | вложенный оператор IF, неполная форма |
||||
if условие | |||||
then оператор; | |||||
end; |
При работе с вложенными операторамиif следует учитывать следующие правила:
- перед зарезервированным словом else символ «;» никогда не ставится;
- зарезервированное слово else всегда связывается с ближайшим перед ним стоящим зарезервированным словом then.
ЗАДАЧА 3. Усовершенствуем программу решения квадратного уравнения (ЗАДАЧА 2). При значении коэффициента a=0 уравнение вырождается. В программе этот факт не учитывался, что вызовет фатальную ошибку при исполнении программы (деление на нуль). Для того чтобы исключить деление на нуль, выполним проверку значения коэффициента а после его ввода оператором Readln(a,b,c).
Поскольку переменная a объявлена в программе как переменная вещественного типа, ее численное значение в машине представлено не точно, с некоторой погрешностью. Поэтому запись типа
If a=0 then ... | является ошибочной. По определению значение переменной не может быть точно рано нулю. |
Возможны несколько вариантов проведения корректного сравнения значений вещественной переменной с нулем:
If a<>0 then ... | Знак равенства при сравнении вещественных чисел никогда не применяется. При достаточно малых значениях a возможно переполнение. |
If round(a)=0 then ... | Вещественное число округляется до ближайшего целого числа (функция Round()). |
If a>0.0001 then ... | Это наилучший вариант. Задается относительная погрешность числа a. |
ЗАДАЧА 4. Усовершенствованная программа решения квадратного уравнения.
Program a7;Var
a,b,c:real; {коэффициенты уравнения}
x1,x2:real; {корни уравнения}
d:real; {дискриминант}
begin
Writeln(‘Решение квадратного уравнения’:50);
Write(‘Введите значения коэффициентов a,b,c: ’);
Readln(a,b,c); {ввод коэффициентов}
if round(a)<>0 then
begin
d:=b*b-4*a*c;
if d<0 then
Writeln(‘Уравнение не имеет корней.’)
else
begin{операторные скобки}
x1:=(-b+sqrt(d))/(2*a);
x2:=(-b-sqrt(d))/(2*a);
WriteLN(‘Корни уравнения: ’, x1:8:2,x2:8:2);
end;
end
else
Writeln(‘Деление на нуль.’);
end.
Результаты работы программы:
Решение квадратного уравнения
Введите значения коэффициентов a,b,c:0 1 6
Деление на нуль.
Условный оператор выбора Case
Оператор выбора является обобщением оператора If и используется в тех случаях, когда необходимо выполнить только один оператор из совокупности операторов в зависимости от значения ключа выбора.
В качестве ключа выбора используется выражение, которое располагается между зарезервированными словами Case и of. Выражение может быть целого, логического и символьного типов. Выражение не может иметь тип Real, String.
Формат оператора:
Case of '<ключ выбора>'
константа1:оператор 1;
константа2:оператор 2;
константа3:оператор 3;
...
константаN-1:оператор N-1;
константаN:оператор Nn;
Else оператор
End;
Здесь Сase (в случае), of (из), Else (иначе), End (конец) являются зарезервированными словами.
Ключ выбора – это выражение любого типа кроме Real и String.
Константа1 – константа того же типа, что и выражение .
Оператор1 – произвольный оператор.
Оператор выбора действует следующим образом. Вначале вычисляется выражение <ключ выбора>, а затем в последовательности операторов отыскивается такой, которому предшествует константа, равная вычисленному значению <ключ выбора>. Найденный оператор выполняется, после чего оператор выбора завершает свою работу (управление передается на end). Если в списке констант не будет найдена константа, соответствующая вычисленному значению ключа выбора, управление передается оператору, стоящему за словом Else.
Часть Else <оператора> можно опустить, тогда при отсутствии в списке констант нужной константы ничего не происходит, и оператор выбора просто завершает свою работу.
ЗАДАЧА 5. Написать программу простого калькулятора.
Program a8;
var
x,y:real;
z:real; {результат}
op:char; {ключ выбора}
begin
Write(‘Введите операнды x,y: ’);
Readln(x,y);
Write(‘Введите операцию(+,-,*,/): ’);
Readln(op);
case op of
‘+’:z:=x+y;
‘-‘:z:=x-y;
‘*‘:z:=x*y;
‘/‘:if y0 then z:=x/y
Elsewriteln(‘Деление на нуль’);
Else writeln(‘Действие не предусмотрено!’);
end; {op} {так можно пометить, «чей» end}
writeln(‘Результат равен=’,z:8:2);
end.
Результаты работы программы:
Введите операнды x,y:4 2
Введите операцию (+,-,*,/):*
Результат равен= 8.00
В программе ключом выбора является переменная символьного типа. В зависимости от введенного значения символов (+, -, *, /) выполняется одно из арифметических действий: сложение, вычитание, умножение или деление. Если в качестве делителя будет введен нуль, то деление невозможно и выдается сообщение «Деление на нуль». Если будет введен какой-либо другой символ, то результатом будет сообщение «Действие не предусмотрено!». Если введены допустимые операции, то выдается результат.
ЗАДАЧА 6. Написать программу, которая запрашивает у пользователя номер дня недели, затем выводит название дня недели или сообщение об ошибке, если введены неверные данные.
Program a9;
Var
n: integer; {номер дня недели}
Begin
write(‘Введите номер дня недели:’);
readln(n);
case n of
1: writeln(‘Понедельник’);
2: writeln(‘Вторник’);
3: writeln(‘Среда’);
4: writeln(‘Четверг’);
5: writeln(‘Пятница’);
6: writeln(‘Суббота’);
7: writeln(‘Воскресенье’);
else write(‘вы ошиблись!’)
end; {n}
end.
Результаты работы программы:
Введите номер дня недели:1
Понедельник
Ни одна константа не должна совпадать с другой. Если для нескольких констант необходимо выполнить один и тот же оператор, то их можно перечислить через запятую, например
case n of
1,3,5,7,9: writeln(‘Это нечетные цифры’);
2,4,6,8,10: writeln(‘Это четные цифры’);
end;