Top.Mail.Ru

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 представлены ниже:

Блок-схема условного оператора If в полной форме

Условный оператор работает следующим образом. Сначала вычисляется условное выражение < условие >. Если результат есть True (истина), то выполняется < оператор 1 > (после слова Then), а < оператор 2 > пропускается. Если результат есть False (ложь), то < оператор 1 > пропускается, а выполняется < оператор 2 > (после слова Else). Перед Else никогда не ставится точка с запятой, поскольку это еще не конец оператора If.

Блок-схема оператора 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  vlogennie operatori2 Операторные скобки
     оператор;  vlogennie operatori1   вложенный
оператор IF,
неполная форма
     if условие then опеатор 
     else оператор; 
 end 
 else 
 begin  vlogennie operatori2 Операторные скобки
     оператор;  vlogennie operatori1 вложенный
оператор 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;

Работа оператора Case

Здесь С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;