КрНУ

Інформаційний портал – Коледжу Кременчуцького національного університету імені Михайла Остроградського!

Циклы. Команда цикла с параметром (FOR), команда цикла с предпосылкой (WHILE), команда цикла С после условием (REPEAT).

Основные разделы темы.
1. Циклический алгоритм.
2. Оператор цикла с параметром.
3. Два вида оператора for.
4. Команда цикла с предусловием (while).
5. Команда цикла с постусловием (repeat).
6. Вкладенные циклы.
В программах, связанных с обработкой данных или вычислениями, часто выполняются циклически повторяющиеся действия.
Цикл-это последовательность операторов, которая выполняется неоднократно. Различают три вида операторов циклов: со счетчиком, с предпосылкой и с
постусловием.
Оператор цикла с параметром (for).
Оператор for используется для организации циклов с фиксированным числом повторений.
В языке программирования Паскаль есть два вида операторов for.
I. for <счетчик> := <начальное значение> to < конечное значение> do
<оператор>;
где счетчик — это переменная целого, символьного, логического или перечисленного
типов.
Действие оператора. Если значение счетчика меньше конечного значения, то выполняется оператор. После этого значение счетчика автоматически увеличивается на единицу и т.д. Когда значение счетчика станет больше, чем конечное значение, то выполняется следующий после цикла оператор.
Пример 1. Пусть s = 0. После выполнения команды
for i := 4 to 6 do begin
s := s + i;
z := 2 * i;
end;
переменная s получит значение 0+4+5+6=15, а переменная z = 12.
Пример 2. Вывести строку из одинаковых символов.
for i := 1 to 35 do write(‘ -‘);
II. for < счетчик > := < начальное значение > downto < конечное значение > do
< оператор>;
Эта команда действует, как и предыдущая, но шаг изменения счетчика равный -1.
Пример. Хай s = 0. После выполнения команды
for i := 6 downto 4 do begin
s := s + i;
z := 2 * i;
end;
значение переменной s будет равно 0 + 6 + 5 + 4 = 15, а переменной z = 8.
Замечание. Значение счетчика в середине цикла изменять нельзя.
Задача 7.
Вычислить суммы заданного количества чисел
program SUM;
var N, sum, I, Num:integer;
begin {начало тела главной программы}
writeln (‘<<вычисление суммы n чисел >>>’);
writeln; {- пропуск строки}
write (‘введите количество суммируемых чисел N = ? -> ‘); readln(N);
sum:=0;
for i:=1 to n do
Begin
writeln (‘введите’, I, ‘ – е число Num = ? -> ‘);
readln(Num);
sum:=sum+ Num; {Суммирование с накоплением}
end;
writeln(‘сумма ‘,N, ‘ чисел равна ‘, sum);
end.
Задача 8.
Составить таблицу соответствия между унциями и граммами для нескольких значений
унций. Известно, что 1 унция = 28,353495 г. Начальное значение количества унций
(uncia), шаг изменения (h) этого значения и количество значений (k) задать самостоятельно в режиме диалога.
program Mera;
var uncia, grammy, h : real;
i, к: integer;
begin
write(‘Введите начальное значение, шаг изменения’);
writeln(‘ и количество значений – строк в таблице’);
readln (uncia, h, к); writeln; {формируем пустую строку}
writeln (“унции граммы’);
for i: = 1 to к do {выводим таблицу на экран}
begin
grammy:=28.353495 * uncia; writeln(uncia:5:2, ‘ ‘, grammy: 10:6);
uncia := uncia + h;
end;
end.
Задача 9.
Вычислить значение выражения, состоящего из суммы и произведения
program SummaProisved;
var i : integer;
summa, prod, в: real;
fact : longint;
begin
summa: = 0; {первоначально сумма равна нулю, а произведение (prod) единиц
prod := 1;
fact := 1;
for i := 1 to 25 do
begin
fact: = fact * i; {вычисляем i! = 1*2 * 3 * … * i}
summa := summa + 5 * sqr(i)/ fact; {Вычисляем сумму}
prod := prod * i * i; {Вычисляем произведение}
end;
в: = summa + prod;
writeln(‘y = ‘, в:7:2);
end.
Команда цикла с предпосылкой (while).
Оператор цикла с предпосылкой WHILE используется, если какое-то действие или
несколько действий необходимо выполнить много раз, но наперед неизвестно сколько раз и это зависит от какого-то условия. Команда while выглядит так:
while <логическое выражение > do < оператор>;
Конструкция читается: пока выполняется условие делать …
Условие-это логическое выражение, истинность которого проверяется в начале каждой итерации.
Оператор, следующий за ключевым словом do называется телом цикла. На месте тела цикла может быть записан составной оператор begin … end. В этом случае цикл с предпосылкой будет иметь вид:
while < логическое выражение > do
begin
<операторы>
end;
Действие оператора. Перед каждым новым выполнением тела цикла проверяется
логическое выражение и если оно истинно (TRUE), то выполняется тело цикла, а
иначе цикл заканчивается и выполняется команда, следующая за данной
алгоритмической конструкцией.
Примечание:
1. Внутри тела цикла обязательно должен быть выражение, которое меняет логическое выражение, в противном случае возникает ситуация так называемого “бесконечного цикла”.
2. Цикл может ни разу не выполниться, если логическое выражение изначально ложный.
Пример. Пусть переменные х, s равны х = 4, s = 0. После выполнения команды
while х <= 8 do
begin s := s + х; х := х + 1 end;
они получат значение s=4+5+6+7+8= 30, х = 9.
Пример. Вывести на экран таблицу чисел от 20 до 30, их
квадраты и кубы, используя команду while, можно так:
i := 20;
while i <= 30 do
begin
writeln(i:4, i * i:6, i * i * i:8);
i := i + 1
end;
Задача 10.
Определить действительное положительное число а, для которого выполняется соотношение
а / 2 = 0 в компьютерной арифметике действительных чисел. Такое число является значением
нижней положительной границы типа данных real.
program MinRealNumber;
var a: real;
begin
а:=l;
while а / 2 > 0 do а := а / 2;
writeln (‘a=’, а) {ответ: а = 2.9 E-39};
end.
Команда цикла с постусловием (repeat).
Цикл с постусловием repeat организует выполнение цикла, состоящего из любого числа операторов, с неизвестным наперед числом повторений. Тело цикла выполняется хотя бы один раз. Выход из цикла осуществляется при истинности некоторого логического выражения.
repeat < операторы > until < логическое выражение >;
Операторы, записанные между ключевыми словами repeat и until, составляют тело
цикла. Поскольку слова rеpeat и until являются своеобразными операторными скобками, то точку с запятой перед словом until можно не ставить. Тело цикла может быть пустым или содержать один или более операторов.
Действие оператора. Операторы выполняются в цикле, пока значение логического
выражение не станет истинным. Истинное логическое выражение эквивалентно
условии выхода из цикла. Цикл всегда выполнится хотя бы один раз не глядя на значение логического выражения.
Задача 11.
Вычислить сумму введенных чисел до подтверждения окончания ввода.
program SUM_Repеat;
var sum, I, Num:integer;
Ch:Char;
begin {начало тела главной программы}
writeln; {- пропуск строки}
writeln (‘<<вычисление суммы чисел >>>’);
writeln; {- пропуск строки}
sum:=0;
I:=1;
Repeat
writeln (‘введите’, I, – е число ” Num = ? -> ‘);
readln(Num);
sum:=sum+ Num; {Суммирование с накоплением}
Inc (I); {увеличение и на 1}
writeln (‘закончить суммирование Y (да)’);
readln(Ch);
Until ( (Ch=’Y’) OR (Ch=’y’));
writeln(‘ было просуммировано’, I, ‘ чисел, сумма чисел равна ‘, sum);
end.
Задача 12.
Найти самый большой общий делитель (НОД) двух чисел. НОД-это больше всего
целое число, на которое делятся без остатка оба числа.
Решение: заданные числа а и b, для чисел а и b выполняется равенство
НОД (А, b)=НОД (b, r), где r-остача от деления а на b .
r= a mod b=a- (a div b)*b

Program NOD;
var
a,b:longint;
begin
writeln (‘введите два числа’);
readln(a,b);
REPEAT
if a>b then a:=a mod b else b:=b mod a
UNTIL (a=0) or (b=0);
writeln (‘НОД=’, a + b);
readln;
end.
Задача 13.
Написать программу на угадывание числа с заданным количеством попыток.
Решение:
program ugaday;
var npop,comp,igrok,n:integer;
begin
randomize;
comp:=random(50)+1;
writeln (‘угадай число от 1 до 50 ‘);
writeln (‘введите количество попыток);
readln(npop);
while (n<npop) and (comp <> igrok) do
begin
write (‘введите число -> ‘);
readln(igrok);
if comp<igrok then writeln (‘меньше’);
if comp>igrok then writeln(‘больше’);
n:=n+1;
end;
if comp = igrok
then writeln(‘вы угадали за ‘,n,’ попыток’)
else writeln (‘вы не угадали, компьютер загадал число’, comp);
end.
Задание 4:
1. Модифицируйте данную программу так, чтобы использовать оператор с после условием
2. Модифицируйте данную программу так, чтобы использовать оператор с параметром.
Задача 14. (таблица функции Y=X2
)
program tablf;
var x,y:integer;
n:integer;
begin
write(‘|’);
for n:=1 to 35 do
write(‘-‘);
write(‘|’);
writeln;
writeln (‘/таблица значений функции/’);
write(‘|’);
for n:=1 to 35 do
write(‘-‘);
write(‘|’);
writeln;
writeln(‘| X | У |’);
write(‘|’);
for n:=1 to 35 do
write(‘-‘);
write(‘|’);
writeln;
for x:=1 to 10 do
begin
в:=x*x;
writeln(‘| ‘,X:2,’ | ‘,Y:2,’ |’);
end;
write(‘|’);
for n:=1 to 35 do
write(‘-‘);
write(‘|’);
writeln;
end.
Задание 5:
1. Модифицируйте данную программу так, чтобы использовать оператор с пред условием
2. Модифицируйте данную программу так, чтобы использовать оператор с после условием
3. Модифицируйте данную программу так, чтобы вычислять функцию:
y=4x
2
-3x+5
Задача 15:
Дано натуральное число n (n<=9999). Определить, является ли оно палиндромом
(“перевертышем”), с учетом четырех цифр. Например, палиндромами
являются числа: 2222, 6116, 0440.
Пусть, у нас четырехзначное число, поэтому переменная оператора, оператора For
изменяется от 1 до 4. В переменной m сохраняется “остаток” числа, сначала он
равно введенному числу. В переменной с именем r формируем значение числа –
“перевертыша”. Основными операциями являются: r:=10*r + m Mod 10 m:=m Div 10.
Результат трассировки приведен в таблице

Program ex1;
Var
n,m,r,i : Integer;
Begin
writeln (‘введите целое число, меньше чем 10000’);
readln(n);
m:=n; r:=0;
For i:=1 to 4 do
begin
r:=r*10+m mod 10; m:=m Div 10;
end;
if r=n Then Writeln (’Да’);
Else Writeln (‘Нет’);
readln;
end.
Задание 6:
1. Измените программу так, чтобы можно было обрабатывать целые числа из диапазона
Longint.
2. Замените цикл for В программе, на циклы While и Repeat …Until
Задача 16:
Дано натуральное число n. Нужно подсчитать количество цифр этого числа.
Решение: подсчет цифр начнем с последней цифры числа. Число делим на 10, убирая последнюю цифру и так далее. Пусть m-это число, n-счетчик цифр.
Program ex2;
var
m,n : Longint;
k : Integer;
50
begin
writeln (‘введите целое число’);
readln(n); m:=n; k:=0;
While m< >0 Do
begin Inc(k); m:=m Div 10 end;
writeln (‘в числе’, n,’‘’, k, ‘ цифр ‘);
end.
Задание 7.
Модифицируйте программу ех2, решите следующие задачи:
1. Найдите сумму цифр числа;
2. Найдите первую цифру числа;
3. Измените порядок цифр числа на обратный;
4. Найдите количество четных цифр числа
5. найдите самую большую цифру числа;
6. Найдите сумму цифр числа, большую 5;
7. ответьте на вопрос, сколько раз эта цифра встречается в числе
Задача 17:
Натуральное число р называется простым, если оно делится только на 1 и на себя. По соглашению 1 не считают простым числом. Начало последовательности простых чисел имеет вид: 2,3,5,7,11,13, 17, 19, 23, ….
Решение: в программе ех3 определяется, является ли это число простым. Мы ищем
делители числа n в интервале от 2 до n div 2, хотя можно было бы ограничиться интервалом от 2 до целой части √n
program ex3;
Var
i, n :Longint;
Begin
Writeln (‘введите натуральное число’);
Readln(n);
i:=1;
Repeat
inc(i)
Until (i>n div 2) or (n mod i = 0);
if i> n div 2 Then Writeln(‘число ’,n,’простое’);
Еlse Writeln(‘Число ‘,i,’- первый делитель
числа’, n, ‘ , больше 1’);
end.
Задание 8
1. Решите задачу с использованием оператора While.
2. Измените программу так, чтобы в ней осуществлялся вывод всех делителей
числа n.
Подсказка. Логическое выражение в операторе Repeat….Until упростится, а останется
только условие i > n div 2, а в теле цикла появится оператор
if n mod i = 0 Then Writeln(….,i).
Укаденные циклы.
Для решения задач довольно часто требуется использовать две и более циклические конструкции, одна из которых расположена внутри другой(других). Такие конструкции называют вложенными циклами. Какие именно циклы при этом используются, роли не играет, они могут быть организованы с помощью любых рассмотренных ранее операторов (For, While, Repeat … Until).
Задача 18
Сколько можно купить быков, коров и телят, если бык стоит 10 рублей, корову-5
рублей, теленок – полтинник(0,5 рубля), при условии, что на 100 рублей нужно купить
100 голов скота.
Развязывание:
Обозначим через b – количество быков, k – количество коров, t – количество телят. После
этого можно записать два уравнения: 10b+5k+0,5 t=100 и b+k+t=100 Превратим
их: 20b+10k+t=200 и b+k+t=100 На 100 рублей можно купить:
* не более 10 быков, т. е. 0<=b<=10;
* не более 20 коров, т. е. 0<=k<=20;
* не более 200 телят, т. е. 0<=t<=200;
Таким образом получаем:
Program skot;
Var
b,k,t : integer;
Begin
For b:=0 to 10 do
For k:=0 to 20 do
For t:=0 to 200 do
if (20*b+10*k+t=200) and (b+k+t=100) then
writeln(‘быков ‘,b,‘ коров ’,k,’ телят ’,t);
end.
Задание 9
1. Условие будет проверяться 11*21*201=46431 раз. Но задачу можно сократить на
один цикл если количество телят вычислять по формуле: t=100-(b+k).
Модифицируйте программуЦиклы. Команда цикла с параметром (FOR), команда цикла с предпосылкой (WHILE), команда цикла С после условием (REPEAT).