3.9.3. Оператор FOR

Этот вид оператора цикла называют или циклом с параметром. В нем важную роль играет переменная-параметр, которая на каждом шаге цикла автоматически изменяет свое значение ровно на единицу — поэтому ее и называют счетчиком.

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

Вариант 1 (с увеличением счетчика).

for Счетчик := НачальноеЗначение to КонечноеЗначение do
     begin
       { Инструкции }
     end;

Ключевые слова for, dо обозначают "для", "выполняй" соответственно. Строка, содержащая for ... do, называется заголовком цикла, оператор, стоящий после do образует его тело. Очень часто тело цикла — составной оператор. Если тело цикла представлено одиночным оператором, то begin и end не пишутся.

На блок-схеме алгоритма цикл с параметром удобно обозначать следующим образом (рис. 3.4).

Рис. 3.4. Условное обозначение на схемах алгоритмов цикла с параметром

Инструкции между begin и end, выполняются столько раз, сколько определяет выражение [(КонечноеЗначение — НачальноеЗначение) + I].

Это соответствует всем значениям счетчика от начального до конечного включительно.

Если НачальноеЗначение больше, чем КонечноеЗначение, то инструкции между begin и end не выполняются ни разу.

Например, выполнение цикла — фрагмента программы:

For i:=10 to 14 do write (i:3);

выведет на экран последовательность цифр в виде:

10 11 12 13 14

Вариант 2 (с уменьшением счетчика).

for Счетчик := НачальноеЗначение downto КонечноеЗначение do
     begin
       { Инструкции }
     end;

Инструкции между begin и end, выполняются столько раз, сколько определяет выражение [(НачальноеЗначение — КонечноеЗначение) + I].

Если НачальноеЗначение меньше, чем КонечноеЗначение, то инструкции между begin и end не выполняются ни разу.

Например, выполнение цикла — фрагмента программы:

For i:=14 downto 10 do write (i:3);

выведет на экран последовательность цифр в виде:

14 13 12 11 10

Если переменная-счетчик имеет символьный char тип, то оператор:

For ch:=’a’ to ‘e’ do write (ch:2);

выведет на экран последовательность букв в виде:

а b с d е

Оператор:

For ch:=’e’ downto ‘a’ do write (ch:2);

выведет на экран последовательность букв в виде:

е d с b а

Обратите внимание — цикл for удобно использовать для организации вывода данных программы. Вместе с оператором if и функцией readln он позволяет выполнить постраничный вывод.

Например, при выполнении следующего цикла программа будет приостанавливать вывод после заполнения экрана столбцом цифр до нажатия клавиши <Еnter>.

for i:=1 to 50 do
     begin
       writeln (i);
       if i mod 24 = 23 then readln;
     end;

Следует знать:

• оператор (инструкция) for используется для организации циклов с фиксированным, заранее известным или определяемым во время выполнения программы числом повторений;

количество повторений цикла определяется начальным и конечным значениями переменной-счетчика. Оператор for обеспечивает выполнение тела цикла до тех пор, пока не будут перебраны все значения параметра цикла: от начального до конечного;

• переменная-счетчик должна быть порядкового типа: чаще — integer, реже — char, boolean или одного из пользовательских типов (см. разд. 2.1.2). Использование вещественного типа недопустимо;

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

• после нормального завершения оператора for значение параметра цикла равно конечному значению. Если оператор for не выполнялся, значение параметра цикла не определено;

параметр цикла for может изменяться (увеличиваться или уменьшаться) каждый раз при выполнении тела цикла только на единицу. Если нужен другой шаг изменения параметра, предпочтительнее циклы repeat и while.

Примером действия оператора for может служить листинг 3.22, который выводит на экран таблицу перевода из градусов по шкале Цельсия(С) в градусы по Фаренгейту(Р) для значений от 15°С до 30°С с шагом 1 градус. Перевод осуществляется по формуле: F = С* 1.8+32.

Листинг 3.22. Таблица перевода из градусов по шкале Цельсия в градусы по Фаренгейту

var
    I: integer;
    F: real ;
begin
   Writeln (' Температура ');
   for I:= 15 to 30 do
      begin
        F:= 1*1.8+32;
        Writeln('По Цельсию =',I,'по Фаренгейту =',F:5:2)
      end;
end.

В блоке описания переменных описаны параметр цикла I типа integer и переменная F — температура по Фаренгейту типа real. Переменная I, помимо функций управляющей переменной, является переменной, хранящей целочисленные значения температуры по шкале Цельсия. В начале выполнения программы на экран выводится надпись ' Температура ', а затем оператором повтора выводится таблица соотношения температуры в шкалах Цельсия и Фаренгейта. Печать таблицы выполняется оператором Writeln(Tlo Цельсию= ' ,1,' по Фаренгейту= ', F:5:2)

Цикл выполняется следующим образом.

При первом обращении к оператору for вычисляются значения начального (15) и конечного (30) параметров цикла, и управляющей переменной I присваивается начальное значение 15.

Затем циклически выполняется следующее:

1. Проверяется условие I<=30.

2. Если оно соблюдается, то выполняется составной оператор в теле цикла, т. е. рассчитывается значение выражения 1*1.8+32, затем оно присваивается переменной F, и на экран выводится сообщение 'По Цельсию= ' ,1,' по Фаренгейту= х, F:5:2

Если условие I<=30 не соблюдается, т. е. как только I станет > 30, оператор тела цикла не выполняется, а управление в программе передается за пределы оператора for, в нашем примере на оператор end;.Программа завершает работу.

3. Значение параметра цикла I увеличивается на единицу, и управление передается в заголовок цикла for для проверки условия.

Далее цикл повторяется с п.1.

Листинг 3.23 содержит программу "Тест по таблице умножения", измененную таким образом, чтобы она задавала ученику ровно пять вопросов, а в конце тестирования выставляла оценку по пятибалльной системе. Естественно, в такой постановке задачи наилучшим решением будет являться цикл for.

Листинг 3.23. Тест по таблице умножения (вариант № 4)

uses crt;
var s1,s2,otvet,k,prav:integer;
begin
    randomize; { инициализация датчика случайных чисел }
    clrscr; { очистка экрана }
    for k:=1 to 5 do
      begin
        s1:=random(18)+2; s2:=random(18)+2;
        write('Сколько будет ',s1,' * ',s2,'? '); readln(otvet);
        if otvet=s1*s2 then
          begin
            write('Правильно! '); prav:=prav+1;
          end
        else write('Неверно...');
      end;
    clrscr; { очистка экрана }
    writeln('Ваша оценка: ',prav); readln;
end.

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

Листинг 3.24. Определение среднее, минимума и максимума в группе чисел

var
    a: real; { очередное число }
    n: integer; { количество чисел }
    sum,average: real; { сумма и среднее арифметическое }
    min,max: real; { минимальное и максимальное число }
    i: integer; { счетчик цикла }
begin
    write('Введите количество чисел последовательности: '); readln(п);
    writeln('Вводите последовательность');
    write('->'); readln(a); { вводим первое число последовательности }
    { предположим, что: }
    min:=a; { первое число является минимальным }
    mах:=а; { первое число является максимальным }
    sum:=a;
    { введем остальные числа }
    for i:=1 to n-1 do
      begin
        write('->'); readln(a);
        sum:=sum+a;
        if a < min then min:=a;
        if a > max then max:=a;
      end;
    average:=sum/n;
    writeln('Количество чисел: ', n) ;
    writeln('Среднее арифметическое:',average:7:3);
    writeln('Минимальное число: ',min:7:3);
    writeln('Максимальное число:',max:7:3);
end.

Листинг 3.25 содержит программу, которая вычисляет частичные суммы n членов ряда 1, -1/3, +1/5, -1/7, +..., сходящихся к значению p/4.

Листинг 3.25. вычисление частичной суммы членов ряда

var
    х: real; { член ряда }
    summ: real; { частичная сумма }
    n: word; { количество суммируемых членов }
    i: word; { счетчик цикла }
begin
    write('Введите кол-во суммируемых членов ряда: '); readln(n);
   х:=1; summ:=0;
    for i:=1 to n do
      begin
        summ:=summ+1/x;
        if x>0 then x:=-(x+2) else x:=-(x-2);
      end;
    writeln('Сумма ряда: ',summ:10:6);
   writeln('Значение pi/4:',pi/4:10:6);
end.

 предыдущая         меню        вверх         следующая

Hosted by uCoz