Предисловие дорогие друзья !

Вид материалаДокументы

Содержание


§19. Оператор цикла с параметром FOR.
Program Ех37; var
Program Ех38; var
Program Ех39; var
Begin y:=sqr(20); For
Program Ех41; Var
If summa=s Then
Program z5Pr16; Var
End; Close(Out); End.
Особенности оператора цикла с параметром.
Program For_1; Var
End; Writeln(K); {сообщите значение k} Readln; End.
End; Writeln(K); {сообщите значение k} Readln; End.
Для любознательных
N человек, если известно, что в самом начале он стоял в начале очереди, и что продали всего M
Подобный материал:
1   ...   8   9   10   11   12   13   14   15   ...   29

§19. Оператор цикла с параметром FOR.


Цикл – это ряд событий, которые регулярно

повторяются в одном и том же порядке.

( Из Оксфордского словаря английского языка )

Решение многих задач содержит повторяющиеся действия. Например, нужно вычислить значение функции при десяти различных значениях аргумента. Чтобы не записывать десять раз функцию, в языке Паскаль предусмотрены операторы повторения, которые называют операторами цикла. Применение циклов в программе позволяет эффективно использовать компьютер, приводит к сокращению длины программы и времени на её составление и отладку.

Для удобства программирования в языке Паскаль предусмотрены три вида операторов цикла:

WHILE оператор цикла с предварительным условием;

REPEAT оператор цикла с последующим условием;

FOR оператор цикла с параметром.

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

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

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

Оператор цикла с параметром имеет две формы записи:

FOR I:=N1 to N2 DO îïåðàòîð;

или

FOR I:=N1 downto N2 DO îïåðàòîð;

Çäåñü FOR (для), TO (до), DOWNTO (уменьшая до), DO (выполнить) — служебные слова; I — ïаðаметр öèêëà (счетчик числа повторений); N1, N2 - âûðàæåíèÿ, îï­ðåäåëÿþùèå íà÷àëüíîå è êîíå÷íîå çíà÷åíèÿ ïаðаìåтра öèêëà. Оператор (тело цикла) — простой или составной оператор.

Тело цикла выполняется для каждого значения параметра цикла I от его начального значения (N1) до конечного значения (N2) включительно.

Íà÷àëüíîå è êîíå÷íîå çíà÷åíèÿ ïàðàìåòðà öèêëà ìîãóò áûòü ïðåäñòàâëåíû êîíñòàíòàìè, ïåðåìåííûìè èëè àðèôìåòè÷åñêèìè âûðàæå­íèÿìè. В качестве параметра цикла может быть только переменная целого типа (строго говоря, параметром цикла может быть переменная любого порядкового типа, в частности, переменная типа CHAR).

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





Рис. 24

Ðàññìîòðèì, êàê âûïîëíÿåòñÿ îïåðàòîð öèêëà ñ ïàðàìåòðîì âèäà

For i:= N1 to N2 DO <оператор>
  1. вычисляются значения выражений N1 и N2.
  2. Параметр цикла получает начальное значение: I:= N1.
  3. если I<= N2, то выполняется тело цикла <оператор>;
  4. Затем значение параметра цикла увеличивается на единицу и сравнивается с конечным значением цикла (N2). если I<= N2, то цикл поворяется. И так далее до тех пор, пока I<= N2.
  5. если I>N2, то цикл завершается и управление передается следующему за оператором For оператору.

Åñëè N1>N2, òî тело цикла не âûïîëíÿåòñÿ íè ðàçó.

Итак, сíà÷àëà âû÷èñëÿþòñÿ çíà÷åíèÿ âûðàæåíèé N1 è N2. Åñëè N1<=N2, òî I ïîñëåäîâàòåëüíî ïðèíèìàåò çíà÷åíèÿ, ðàâíûå N1, N1+1, ..., N2-1, N2 è äëÿ êàæäîãî èç ýòèõ çíà÷åíèé âûïîëíÿåòñÿ <оператор>. Åñëè N1>N2, òî <оператор> íå âûïîëíÿåòñÿ íè ðàçó.

Îïåðàòîð öèêëà ñ ïàðàìåòðîì вида

For I:= N1 Downto N2 Do <оператор>

âûïîëíÿåòñÿ àíàëîãè÷íûì îáðàçîì, íî çíà÷åíèå I èçìå­íÿåòñÿ ñ øàãîì, ðàâíûì минус 1.

Åñëè в самом начале N1< N2, òî тело цикла íå âûïîëíÿåòñÿ íè ðàçó.

Åñëè тело цикла ñîñòîèò èç íåñêîëüêèõ îïåðàòîðîâ, òî используется составной îïåðà­òîð.

Рассмотрим несколько примеров использования оператора цикла с параметром.

Ïðèìåð 37. Найти сумму 10 чисел, которые вводятся с клавиатуры.

Решение. При выполнении программы одни и те же действия (ввод числа и прибавление его к предыдущему значению суммы) повторяются 10 раз. Поэтому воспользуемся оператором цикла с параметром. Тело цикла выполняется повторно 10 раз, при этом параметр цикла I изменяет своё значение от 1 до 10. в результате сначала считывается число, а затем оно прибавляется к сумме.

Блок-схема и программа на языке Паскаль решения задачи могут быть представлены в виде:





Program Ех37;

var I, summa, x:integer; {I – параметр цикла, summa — переменная суммы чисел, х — переменная которой присваивается значение очередного числа}

begin

summa:=0; {Начальное значение суммы}

for i:= 1 to 10 do {Заголовок цикла}

begin{Открывающая операторная скобка}

writeln(‘Ведите ‘, I, ‘-ое число’);{Вывод запроса о вводе очередного числа}

readln(x);{ ввод очередного числа }

summa := summa + x; {Прибавляем значение введённого числа к сумме}

end; {Закрывающая операторная скобка}

writeln(‘summa=’, summa:8); {Выводим значение суммы на экран}

readln {Задерживаем изображение}

end.


Значения переменных могут быть следующими:

I

X

Summa

1

5

5

2

7

12

3

6

18

4

3

21

5

7

28

6

4

32

7

12

44

8

1

45

9

5

50

10

9

59

В результате на экране появится сообщение:

Summa= 59

Ïðèìåð 38. Вывести на экран все буквы английского алфавита и их коды в обратном порядке.

Решение. Для решения задачи воспользуемся оператором цикла FOR. В отличие от предыдущего примера, параметром цикла возьмём символьную переменную С, значения которой будут изменяться от ’z’до ‘a’. Циклическая часть будет состоять из одного оператора вывода, в котором использована функция ORD(C), которая по заданному символу С возвращает его порядковый номер в кодировочной таблице (см. приложение 4).

Program Ех38;

var c:char;

begin

for c:='z' downto 'a' do{Заголовок цикла: ДЛЯ I ОТ ‘z’ УМЕНЬШАЯ ДО ‘a’ ВЫПОЛНИТЬ}

writeln (c,' nr.',ord(c):4); {стандартная функция ord(c) определяет порядковый номер символа в таблице кодов}

readln

end.

Так как значением N1 и N2 являются буквы английского алфавита ‘z’ и ’a’ соответственно, и используется конструкция DOWNTO, то параметр цикла последовательно принимает значение всех букв английского алфавита от ‘z’ до ’a’. в результате выполнения программы на экране появятся строчки:

z nr. 122

y nr. 121



a nr. 97

Параметр цикла будет принимать значение очередной буквы, а опрератор writeln(c,'nr.', ord(c):4); будет выводить на экран эту букву и её номер в кодировочной таблице.

Ïðèìåð 39. Ñëåäóþùàÿ ïðîãðàììà ñ÷èòûâàåò íåêîòîðîå ÷èñëî n (0
Ðåøåíèå. Åñëè äâóçíà÷íîå ÷èñëî óäîâëåòâîðÿåò óñëîâèþ çàäà÷è, òî äëÿ íåãî âûïîëíÿåòñÿ õîòÿ áû îäíî èç òðåõ óñëîâèé: ïåðâàÿ öèôðà ðàâíà n (ð1=n), èëè âòîðàÿ öèôðà ðàâíà n (ð2=n), èëè ñàìî ÷èñëî äåëèòñÿ íà n (k mod n = 0).

Вûäåëèòü ïîñëåäíþþ öèôðó ÷èñëà можно вычислив остаток от деления числа на 10).

Вûäåëèòü ïåðâóþ öèôðó ÷èñëà можно вычислив частное от деления числа на 10).

Для îáú­åäèíåíèÿ ïðîñòûõ óñëîâèé íåîáõîäèìî èñïîëüçîâàòü Or.

Блок-схема и программа на языке Паскаль решения задачи могут быть представлены в виде:




Program Ех39;

var i, n, zehner, einer, summe, teiler: integer;

c:char;

begin

write ('Ââåäè ÷èñëî n èç èíòåðâàëà 0
readln (n);

for i:=0 to 99 do {Перебираем все числа от 0 до 99}

begin

zehner := i div 10; {Выделяем цифру десятков}

einer := i mod 10; { Выделяем цифру единиц }

summe := zehner + einer;{Находим сумму цифр}

teiler := i mod n;{Находим остаток от деления текущего числа на заданное}

if i mod 10 = 0 then writeln;{Начался новый десяток}

if (zehner=n) or (einer=n) or (summe=n) or (teiler=0)

then write('*':4)

else write(i:4) {если выполняется условие, то печатаем «*», иначе — число}

end;

readln;

end.


Ïðèìåð 40. Ñîñòàâèòü ïðîãðàììó âû÷èñëåíèÿ çíà÷åíèÿ âûðàæåíèÿ

ó=(...((202-192)2-182)2-...-12)2.

Ðåøåíèå.  äàííîì ñëó÷àå öåëåñîîáðàçíî îðãàíèçîâàòü öèêë ñ ïàðàìåò­ðîì, èçìåíÿþùèìñÿ îò 19 äî 1, òî åñòü øàã èçìåíåíèÿ ïàðàìåòðà ðà­âåí -1.

Îáîçíà÷èì ÷åðåç ó î÷åðåäíîå çíà÷åíèå êâàäðàòà ÷èñëà, à ÷åðåç n - ïàðàìåòð öèêëà.

Program Ех40;

Var y, n: Integer;

Begin

y:=sqr(20);

For n:=19 Downto 1 Do y:=sqr(y—sqr(n));

Writeln('Çíà÷åíèå âûðàæåíèÿ ðàâíî ', ó);

Readln;

End.

Ïðèìåð 41. Èç ÷èñåë îò 10 äî 99 âûâåñòè òå, ñóììà öèôð êîòîðûõ ðàâíà s (0
Решение. Îáîçíà÷èì k î÷åðåäíîå ÷èñëî, ð1 - первая öèôðà ÷èñëà k, ð2 - вторая öèôðà, summa - ñóììà öèôð ÷èñëà k. ×èñëî k áó­äåì ïå÷àòàòü òîëüêî â òîì ñëó÷àå, êîãäà ñóììà ð1 и ð2 áóäåò ðàâíà s.

Блок-схема и программа на языке Паскаль решения задачи могут быть представлены в виде:




Program Ех41;

Var k, p1, p2, s,summa: Integer;

Begin

Write('Ââåäèòå öåëîå ÷èñëî s èç èíòåðâàëà 0
Readln(s); {Ââîäèì öåëîå ÷èñëî s}

For k:=10 to 99 Do

Begin

p1:=k div 10; {âûäåëÿåì первую öèôðó}

p2:=k mod 10; {âûäåëÿåì вторую öèôðó}

summa:=p1+p2; {íàõîäèì ñóììó öèôð}

If summa=s Then Writeln(k);

End;

Readln;

End.


Пример 42. Написать программу, осуществляющую автоматическое тестирование задачи 5 §16: Äàíû òðè ðàçëè÷íûõ öåëûõ ÷èñëà, íàéòè ñðåäíåå èç íèõ. Ñðåäíèì íàçîâåì ÷èñëî, êîòîðîå áîëüøå íàèìåíüøåãî èç äàííûõ ÷èñåë, íî ìåíüøå íàèáîëüøåãî.

Решение. Исходные данные для задачи будем считывать из файла INPUT.TXT. Первая строка файла содержит число тестов. Каждая следующая строка содержит три числа.

Для решения задачи упорядочим числа по возрастанию, а затем сравним среднее число с большим и меньшим числами. Если условие задачи выполняется, то выведем в выходной файл значение среднего числа, иначе — слово NO. Алгоритм реализуем с помощью цикла FOR.

Program z5Pr16;

Var a,b,c,x,n,i:Integer;

Inp,Out:Text;

Begin

Assign(inp,'input.txt');

Assign(out,'output.txt');

Reset(inp); Rewrite(out);

ReadLn(inp,n); {Считываем количество тестов}

For i:=1 To n Do {Выполняем алгоритм N раз}

Begin

ReadLn(inp,a,b,c); {Считываем очередной тест}

If a>b then begin x:=a; a:=b; b:=x end;

If b>c then begin x:=b; b:=c; c:=x end;

If a>b then begin x:=a; a:=b; b:=x end;

If (b>a) and (b
End;

Close(Out);

End.

Пример файла Input.txt.

10

2 2 2

1 2 3

1 3 2

2 1 3

2 3 1

3 1 2

3 2 1

2 2 1

2 1 2

1 2 2

Файл Output.txt.

no

2

2

2

2

2

2

no

no

no

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

Особенности оператора цикла с параметром.

Параметр цикла не должен переопределяться внутри циклической части.

Если шаг изменения параметра цикла равен +1 и N1>N2, то циклическая часть не выполнится ни разу.

То же самое произойдёт и если шаг изменения параметра цикла равен -1 и N1
После естественного завершения цикла значение параметра цикла равно последнему значению, т.е. i=N2.

Можно прервать естественное выполнение цикла. Для этого можно присвоить параметру цикла значение равное конечному значению, или воспользоваться оператором безусловного перехода GOTO.

Следует обратить внимание на то, что значения выражений N1 и N2 вычисляются один раз и сохраняются на протяжении всей работы цикла. Переменные входящие в выражения N1 и N2, в отличие от параметра цикла, можно изменять. Это никак не влияет на число исполнений тела цикла. Подтвердим сказанное следующими примерами.

Program For_1;

Var I,N1,N2,K:Integer;

Begin

N1:=1; {начальное значение}

N2:=10; {конечное значение}

K:=0; {счетчик числа циклов}

For I:=N1 To N2 Do

Begin

Inc(K); {увеличиваем счетчик}

Dec(N2,K); {уменьшаем конечное значение на k}

End;

Writeln(K); {сообщите значение k}

Readln;

End.


Program For_2;

Var I,N1,N2,K:Integer;

Begin

N2:=10; {начальное значение}

N1:=1; {конечное значение}

K:=0; {счетчик циклов}

For I:=N2 Downto N1 Do

Begin

Inc(N1,2); {увеличиваем конечное значение на 2}

Inc(K); {увеличиваем счетчик циклов}

End;

Writeln(K); {сообщите значение k}

Readln;

End.

В процессе выполнения программ, мы изменяли значение N2, но в результате на экране появится число 10. Столько раз выполнялся цикл.

Измените текст программы так чтобы проследить, как поведёт себя программа, если изменять значение N1. Используйте при этом режим отладки. поместите в окно WATCHES имена переменных K, N1, N2, I.

Вопросы и задания.
  1. Сколько раз выполняется цикл с параметром?
  2. Сколько существует вариантов цикла с параметром?
  3. Что называют параметром цикла, начальным и конечным значением параметра цикла?
  4. Что такое тело цикла?
  5. Может ли тело оператора цикла с параметром не выполняться ни разу?
  6. как должен быть оформлен оператор цикла с параметром, чтобы тело цикла выполнялось при уменьшающихся значениях параметра цикла? Как он будет работать (что будет происходить при его выполнении)? Нарисовать графическую схему выполнения.
  7. В программировании существует правило: нельзя изменять параметр цикла в теле цикла. Приведите примеры, когда изменение параметра цикла приводит к его бесконечному выполнению.
  8. Напечатать ряд из повторяющихся чисел 20 в виде:

20 20 20 20 20 20 20 20 20 20.
  1. Напечатать столбиком все целые числа от 20 до 35.
  2. Напечатать столбиком все целые числа от a до b (значения a и b вводятся с клавиатуры; b ≥ а).
  3. Одна штука некоторого товара стоит 2040 руб. Напечатать таблицу стоимости 2, 3, …, 20 штук этого товара.
  4. Напечатать таблицу соответствия между весом в фунтах и весом в килограммах для значений 1, 2, …, 10 фунтов (1 фунт = 0,453 кг).
  5. Напечатать таблицу соответствия расстояний в дюймах расстояниям в сантиметрах для значений 10, 11, …, 22 дюйма (1 дюйм = 25,4 мм).
  6. Напечатать таблицу перевода 1, 2, …, 20 долларов США в рубли по текущему курсу (значение курса вводится с клавиатуры).
  7. Вычислить сумму Значение N вводится с клавиатуры.
  8. Найти сумму
  1. квадратов первых n натуральных чисел;
  2. кубов первых n натуральных чисел.
  1. Построить и записать в виде программы алгоритм вычисления суммы квадратов десяти произвольных чисел, водимых с клавиатуры в процессе выполнения программы.
  2. Запросите у пользователя положительное число А, и найдите сумму всех натуральных чисел из промежутка [1, А].
  3. Составить программу для расчёта факториала натурального числа n (факториал числа n, обозначается n!, равен 1·2·3·…·n).
  4. Составить программу, проверяющую, является ли последовательность из 10 целых чисел, вводимых с клавиатуры, возрастающей (каждое следующее число больше предыдущего).
  5. Составить программу, печатающую все делители целого числа в порядке возрастания.
  6. Вводятся 14 чисел. Определить, сколько среди них положительных (включая 0) и сколько отрицательных. (Числа вводятся в одну переменную в цикле)
  7. Запросите 16 чисел и выведите на экран для каждого, делится ли оно нацело на 11.
  8. Спросите у пользователя, сколько нужно проанализировать чисел, а затем запросите эти числа и сделайте для каждого вывод, является ли оно четным или отрицательным.
  9. Составить программу, печатающую все делители целого числа в порядке убывания.
  10. Вывести на экран числа, кратные К из промежутка [А, В]. Числа А, В, К задает пользователь.

Для любознательных

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

Ваша задача состоит в том, чтобы определить место Пети в очереди, состоящей из N человек, если известно, что в самом начале он стоял в начале очереди, и что продали всего M мороженых.

Ввод: N,M (1<=N,M<=1000).

Вывод: единственное число – место Пети в очереди.

Пример:

input.txt output.txt

7 3 5