Паскаль. Оператор цикла For

Паскаль. Оператор цикла For

Выполняя программу печати чисел 3 5 7 9, оператор repeat выполнил цикл 4 раза. То же самое сделал и оператор while. Однако, обычно, когда мы пишем операторы repeat и while, нам совсем неважно знать, сколько раз они выполнят цикл. Тем не менее, существует много задач, для решения которых цикл нужно выполнить именно определенное количество раз. В этом случае удобно использовать оператор цикла for.

Задача:

200 раз напечатать слово ФУТБОЛ.

Попробуем сначала решить задачу при помощи оператора goto. Начнем с такого фрагмента:

m1: WriteLn('ФУТБОЛ');
    goto m1;

Но здесь цикл будет повторяться бесконечно, а нам нужно только 200 раз. Мы уже видели, что для выхода из цикла оператор goto нужно включить в состав оператора if. Кроме этого нужна переменная, меняющая свое значение от одного выполнения цикла к следующему. Придумаем этой величине какое-нибудь имя, скажем i. Проще всего задачу решает такой фрагмент:

    i:=1;
m1: WriteLn(' ФУТБОЛ ');
    i:=i+1;  {увеличение i на 1}
    if i<=200 then goto m1;

Здесь i вначале равно 1, но к каждому следующему выполнению цикла оно увеличивается на 1. В первый раз выполняя оператор if, компьютер проверяет условие 2<=200 и найдя его истинным, выполняет оператор goto m1. Во второй раз проверяется условие 3<=200 и т.д. В 199-й раз компьютер проверяет условие 200<=200 и найдя его истинным, выполняет оператор goto m1. В 200-й раз компьютер проверяет условие 201<=200 и найдя его ложным, выходит из цикла.

В нашем фрагменте «полезную» работу выполняет только одна строка из четырех - WriteLn(' ФУТБОЛ '). Остальные три строки заняты тем, что обеспечивают выполнение «полезной» строки ровно 200 раз. Нам пришлось организовать специальную переменную, значение которой в каждый момент выполнения программы говорит о том, в какой раз выполняется цикл. Переменная с таким свойством называется счетчиком шагов цикла.

А теперь запишем программу полностью, правда, несколько усложнив ее, так чтобы логика ее выполнения полностью соответствовала логике выполнения программы с оператором for.

Используем меткиВариант с For
Label m1,m2;
Var i: Integer;
Begin  i:=1;
m1: if i>200 then goto m2;
         WriteLn(' ФУТБОЛ ');
         i:=i+1;
         goto m1;
m2:     
End.

Var i: Integer;
Begin
for i:=1 to 200 do
WriteLn(' ФУТБОЛ ')
 
 
 
End.

Слово for читается «фо», переводится «ДЛЯ». Слово to читается «ту», переводится «ДО». Слово do читается «ДО», переводится «ДЕЛАЙ». Конструкция for i:=1 to 200 do по-русски читается так: Для i, изменяющегося от 1 до 200, делай оператор, стоящий после слова do. Смысл повторения здесь такой же, как и в операторе while. Оператор, стоящий после do, тоже, конечно, может быть составным.

Синтаксис оператора for:

FOR имя := выражение1 TO выражение2 DO оператор

Пример записи:

for j:=a+b to 2*s do
k:=k+1;

Пояснения к синтаксической схеме: имя - это имя произвольной переменной, в частности целочисленной, называемой переменной цикла, выражение1 и выражение2 - произвольные выражения, в частности - целого.

Работа оператора for:

Прежде всего вычисляется выражение1, и переменной цикла (пусть это будет i) присваивается его значение. Затем вычисляется выражение2 и сравнивается с i. Если i > выражения2, то оператор for завершает свою работу, так ничего и не сделав. В противном случае выполняется оператор, стоящий после do. После выполнения этого оператора значение i увеличивается на 1 и снова сравнивается с выражением1. Если i > выражения2, то оператор for завершает свою работу, иначе снова выполняется оператор, стоящий после do, снова i увеличивается на 1 и т.д.

В нашем примере переменная i кроме того, что обеспечивает нам выход из цикла, никакой «полезной» работы не выполняет. Усложним же немного задачу. Пусть компьютер печатает такую информацию:

10 ФУТБОЛ 11 ФУТБОЛ 12 ФУТБОЛ … 200 ФУТБОЛ

Текст программы:

Var i: Integer;
Begin
for i:=10 to 200 do
  begin
  Write(i);
  Write(' ФУТБОЛ ') 
  end
End.

Здесь после do стоит уже составной оператор.

Можно ли удобно использовать оператор for для печати такой информации?

100 ФУТБОЛ 99 ФУТБОЛ 98 ФУТБОЛ … 40 ФУТБОЛ

Вполне, так как оператор for позволяет не только увеличивать, но и уменьшать переменную цикла. Однако, для этого нельзя писать for i:=100 to 40, а нужно писать for i:=100 downto 40. Читается downto – «даунту», переводится буквально «ВНИЗ ДО». Соответственно, для выхода из цикла должно быть истинным не условие i > выражения2, а условие i < выражения2.

Вот объединенный синтаксис оператора for:

FOR имя := выражение1 TO| DOWNTO выражение2 DO оператор

Вертикальная черта | между двумя элементами конструкции «TO и DOWNTO» говорит о том, что в конструкции должен присутствовать один из этих элементов.

Задание 1

Напечатать с помощью оператора for:

Прямой счет: -5 -4 -3 -2 -1 0 1 2 3 4 5
Обратный счет: 5 4 3 2 1 0-1 -2-3-4-5 Конец счета
Одномерная таблица

Задача:

Используя цикл for, вывести на экран таблицу умножения на 4.

Текст программы:

Var i,N,proizv: Integer;
Begin
{ Переберём все числа от 0 до 10}
for i:= 0 to 10 do 
  begin
  proizv:=4*i; 
  Write(i,' х ',4,' = ',proizv,';  ');
  end;
End.

Усложним задачу и выведем таблицу умножения для любого числа N. Попробуйте самостоятельно написать программу.

Текст программы
Var i,N,proizv: Integer;
Begin
Write('Введите число для умножения: '); ReadLn(N);
for i:= 0 to 10 do 
  begin
  proizv:=i*N;
  Write(i,' х ',N,' = ',proizv,';   ');
  end;
end.

Задание 2

Видоизмените программу вывода таблицы умножения для любого числа N, так, чтобы таблица выводилась только при значении 1<N<9. После умножения на 10, выведите вместо знака точки с запятой точку.

Сумма и произведение всех двузначных чисел

Задача:

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

Попробуйте самостоятельно написать программу.

Текст программы
Var i,sum: Integer;
Begin
sum:=0;
for i:=10 to 99 do 
  sum:=sum+i;
WriteLn('Сумма двухзначных чисел: ', sum);
End.

Задание 3

Используя цикл for, составьте программу вычисления суммы всех чётных трёхзначных чисел.

Значения функции

Задача:

Составить программу для проверки утверждения: «Значение функции  f(x)=x2+x+17 является простым числом, при 0≤x≤15». Все результаты вывести на экран.

Текст программы:

Var x,f: Integer;
Begin
for x:=0 to 15 do 
  begin
  f:=x*x+x+17; 
  Write('x=', x ,'  f=', f ,'  |   ');
  end;
End.

Задание 4

Составить программу для проверки утверждения: «Значение функции  f(x)=2*x2+x-20 является простым числом, при 30≤x≤80». Все результаты вывести на экран.

Сложное условие отбора

Задача:

Найти все двузначные числа, сумма квадратов цифр которых кратна М.

Текст программы:

Var i,M,sum:Integer;
Begin
  WriteLn('Введите число: '); ReadLn(M);
  for i:= 10 to 99 do
    begin
{ x mod 10 - всегда получает последнюю цифру в числе x }
{ x div 10 – в двухзначном числе x, получаем первую цифру }
    sum:=sqr(i div 10) + sqr(i mod 10);
    if (sum = M) then Write(i,'  |  ')
    end;
End.

Задание 5

Задано натуральное число N. Найти количество натуральных чисел, не превышающих N и не делящихся ни на одно из чисел 2, 3, 5.

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