Песни о Паскале | страница 58



конечное_значение DO оператор

Как видите, конструкция построена на трех ключевых словах: FOR-TO-DO. После слова FOR следует оператор присваивания начального значения счетчику цикла. За словом TO указывают конечное значение счетчика, а после DO – выполняемый внутри цикла оператор. Но где наращивается счетчик? А нигде, это происходит автоматически! Теперь задача распечатки чисел может быть решена одним составным оператором.


>var N : integer;       { счетчик }

>begin

>      for N:=1 to 10 do Writeln(N);

>end.


Испытайте эту программку. Согласитесь, что ошибиться здесь труднее, чем в варианте с REPEAT. Как только вы написали FOR, то обязаны тут же указать начальное и конечное значения счетчика, а наращивать его Паскаль будет и без вас. В качестве начального и конечного значений вы вправе указать не только числа, но и выражения, – они будут вычислены один раз в начале цикла. Если начальное значение счетчика окажется равным конечному, цикл выполнится единожды. А если конечное значение окажется меньше начального, то ни разу!

Осталось ответить лишь на один вопрос: что, если внутри цикла надо выполнить несколько операторов? Ведь после слова DO предусмотрен лишь один. Впрочем, те, кто помнит об операторных скобках BEGIN-END, знают ответ. Напомню, что эти скобки превращают группу операторов в единый блок, этим мы и воспользуемся в новой версии экзаменатора.


>{ P_17_1 – экзаменатор, выставляющий оценку }

>var A, B, C : integer; { сомножители и произведение }

>      Q, E : integer; { счетчик вопросов и счетчик ошибок }

>      S: string;

>begin

>      Randomize;

>      E:= 0; { обнуляем счетчики ошибок }

>      for Q:= 1 to 15 do begin { 15 вопросов }

>      A:= 1+ Random(10);       B:= 1+ Random(10);

>      Write(Q,’) Сколько будет ’, A,’ x ’,B, ’ ? ’);

>      Readln(C);

>      { Если ответ неверный, увеличиваем счетчик ошибок }

>      if A*B <> C then E:= E+1;

>      end; { цикл и блок завершаются здесь}

>      case E of { выставляем оценку }

>      0: S:=’Отлично!’;

>      1,2: S:=’Хорошо’;

>      3..5: S:=’Удовлетворительно’;

>      else S:=’Ну оччччень плохо!’;

>      end;

>      Writeln(S, ’ Нажмите Enter’); Readln;

>end.


Рассмотрим изюминки этой программы. В операторе


>      Write(Q,’) Сколько будет ’, A,’ x ’,B, ’ ? ’);


вместе с вопросом печатается его порядковый номер Q.

Но самое интересное – это метки в операторе CASE. Напротив оценки «хорошо» стоит метка из двух разделенных запятой чисел (1, 2), – эта ветвь оператора CASE выполнится для этих двух значений. Такие объединенные метки могут содержать несколько чисел. А если числа следуют подряд, их заменяют числовым диапазоном – это два числа, разделенные двумя точками («многоточием»), причем первое число должно быть меньше второго. Такой диапазон (3..5) служит меткой для ветви «Удовлетворительно».