Выполняя программу печати чисел 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;Beginfor i:=1 to 200 doWriteLn(' ФУТБОЛ ')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 - Самоучитель
Лукин С.Н.