Паскаль. Составной оператор

Паскаль. Составной оператор

Вот фрагмент программы, которая складывает два числа:

WriteLn('Введите два числа');
ReadLn(a,b);
WriteLn('Сумма равна ' ,a+b);

Вот фрагмент программы, которая возводит число в квадрат:

WriteLn('Введите число');
ReadLn(a);
WriteLn('Квадрат числа равен ' ,a*a);

Пусть мы хотим сделать программу, которая бы по желанию пользователя или складывала два числа, или возводила одно число в квадрат, то есть выполняла или первый или второй фрагмент.

Начинаться наша программа могла бы примерно так:

Var Otvet: String; 	
Begin
WriteLn('Чем займемся - сложением или возведением в квадрат?');
ReadLn(Otvet);
if Otvet = 'сложением' then . . . . else . . . .

Здесь после then мы должны бы вставить первый фрагмент, а после else второй. Однако, тут возникает проблема. Каждый из фрагментов состоит из нескольких операторов, а синтаксис оператора if разрешает ставить после then и else только по одному оператору. Чтобы преодолеть эту трудность, в Паскале есть средство превратить последовательность записанных друг за другом операторов формально в один оператор. Для этого последовательность заключается между словами begin и end и получившаяся конструкция называется составным оператором. Можно привести сравнение с математическими скобками, которыми определяют порядок действий. Например, язык программирования php использует вместо begin и end, фигурные скобки – {…}.

Посмотрим на первый фрагмент в виде составного оператора:

begin
  WriteLn('Введите два числа');
  ReadLn(a,b);
  WriteLn('Сумма равна ' , a+b)
end

Компьютер выполняет составной оператор неотличимо от последовательности операторов, из которых он состоит, однако титул составного оператора позволяет ему считаться одним оператором и поэтому быть вхожим в те места программы, в которые разрешен вход только единичным операторам, а не их последовательностям, как, например, имеет место в нашем случае с оператором if.

Вот какая получится программа для нашей задачи:

Var Otvet: String;
    a,b :Integer;
Begin
  WriteLn('Чем займемся - сложением или возведением в квадрат?');
  ReadLn(Otvet);
  if Otvet = 'сложением' then
    begin
      WriteLn('Введите два числа');
      ReadLn(a,b);
      WriteLn('Сумма равна ', a+b)
    end
  else
    begin
      WriteLn('Введите число');
      ReadLn(a);
      WriteLn('Квадрат числа равен ', a*a)
    end;
  WriteLn('Счет завершен')
End.

У нашей программы есть недостаток. Если при ответе на вопрос компьютера мы чуть-чуть ошибёмся, например, ответим не «сложением», а «сложение», компьютер будет выполнять возведение в квадрат, так как в условии оператора if сравниваемые строки должны совпадать полностью. Научившись выполнять операции над строками, вы научитесь избегать таких ситуаций.

Условимся, что begin и end составного оператора будем писать с маленькой буквы, а Begin и End тела программы с большой. Это поможет избежать путаницы при написании кода.

При написании программы число служебных слов begin должно совпадать с числом служебных слов end.

Пример решение задачи с использованием составного оператора

Задача:

Напишите программу решения квадратного уравнения с проверкой дискриминанта на наличие корней.

Решение:

Var a,b,c: Real;
    D: Real;
    x1,x2: Real;
Begin
  WriteLn('Введите коэффициенты а, b, с '); 
  Readln(a,b,c);
  D:=b*b-4*a*c;
  if d<0 then WriteLn('Корней нет');
  if d=0 then
   begin
     x1:=-b/(2*a);
     WriteLn('Корень уравнения x=', x1:9:3) 
   end;
  if d>0 then
   begin
     x1:=(-b + sqrt(D))/(2*a);
     x2:=(-b-sqrt(D))/(2*a);
     WriteLn('Корни уравнения:'); 
     WriteLn('x1=', x1:9:3 ,'   x1=', x2:9:3)
   end
End.

Задание 1

Найти значение y, если x вводится с клавиатуры.

Паскаль. Составной оператор. Задание 1

Не забудьте проверить выражение внутри корня на равенство отрицательному значению и нулю.

Ступенчатая запись программы

Обратите внимание на то, на что не обращает внимания компьютер, а именно на отступы от левого края листа в записи строк программ. Строки Var, Begin и End записаны без отступа. Между словами Begin и End записаны четыре оператора: WriteLn, ReadLn, if и WriteLn. Все они выполняются по порядку, один за другим, поэтому каждый из них записан с одинаковым отступом. Если оператор сложный, то есть включает в себя другие операторы (мы знаем пока два таких оператора - if и составной), то составляющие его операторы записываются еще правее. Слова, составляющие пару (then и else, begin и end) записываются друг под другом.

Сделано все это для удобства чтения программы, для того, чтобы глаз мог сразу же уловить структуру программы, а именно, из каких частей состоит как сама программа, так и каждый из элементов, ее составляющих. Впрочем, вам с первого взгляда может показаться, что такая запись, наоборот, неудобна для чтения. Однако, заметьте, что ступенчатая запись принята во всем мире и глаза профессиональных программистов привыкли именно к ней. Настолько привыкли, что программа, записанная без соблюдения ступенчатого стиля, вызывает раздражение. Конечно, допустимы и некоторые отклонения от ступенчатого стиля. Например, несколько коротких похожих операторов вполне можно записать в одну строку:

a:=0; b:=0; c:=0; f:=4;

Этим мы экономим дефицитное место по вертикали экрана или листа бумаги.

Турбо-Паскаль 7.0 - Самоучитель
Лукин С.Н.