Для параметра, принимающего значения от начального до конечного с шагом «единица», делай тело цикла
Механизм выполнения оператора:
1. Переменная-параметр принимает начальное значение;
2. Если значение параметра не превышает конечное, то выполняется серия операторов, обозначенных в теле цикла;
3. Переменная-параметр увеличивает свое значение на единицу;
4. Если значение параметра не превышает конечное, то выполняется серия операторов, обозначенных в теле цикла;
5. И так далее, пока переменная- параметр не примет конечное значение;
6. Когда переменная-параметр примет конечное значение, тело цикла выполнится в последний раз;
7. Выполняется оператор, следующий после цикла.
Особенности написания оператора цикла:
1. Переменная-параметр, начальное и конечное значения могут быть только целого типа;
2. Переменную-параметр цикла нельзя изменять внутри тела цикла;
Антипример1.
Var i,k,a:integer;
Begin
Read(k);
For i:=1 to k do begin i:=i-1; read(a); end;
End.
На первом шаге цикла параметр примет начальное значение 1, но при выполнении тела цикла снова примет значение 0. На втором шаге значение параметра увеличится на 1 и станет равно 1. Сколько бы не выполнялось тело цикла, значение параметра не достигнет конечного значения, то есть программа будет бесконечно работать.
Антипример2.
Var i,a:integer;
Begin
For i:=1 to 10 do begin i:=i+1; а:=а+i; end;
Write(a);
End.
Здесь параметр будет на каждом шаге дважды увеличивать свое значение: автоматически и внутри тела цикла. Поэтому, параметр никогда не достигнет конечного значения.
Можно привести массу примеров на этот счет.
Запомни главное! Параметр цикла отвечает за количество повторений его тела. Цикл с параметром используют, когда это количество известно. Так зачем намеренно изменять это количество?!!
3. Если тело цикла содержит только один оператор, то операторные скобки можно не писать;
Пример1. Вывести на экран свое имя 100 раз.
Решение: Чтобы вывести на экран имя один раз, нужно использовать процедуру writeln(‘Имя’); . Чтобы имя вывелось 100 раз, надо повторить эту команду 100 раз. Пусть параметр будет именоваться i.
Составим программу:
Var i:integer;
Begin
For i:=1 to 100 do Writeln(‘Имя’);
End.
Пример2. Вывести на экран свое имя n раз.
Дано: n – число повторений (integer);
Решение: Чтобы вывести на экран имя один раз, нужно использовать процедуру writeln(‘Имя’); . Чтобы имя вывелось n раз, надо повторить эту команду n раз. Пусть параметр будет именоваться i.
Составим программу:
Var n,i:integer;
Begin
Writeln(‘Введите количество повторений’);
Read (n);
For i:=1 to n do Writeln(‘Имя’);
End.
Пример3. Ввести с клавиатуры n целых чисел.
Дано: n – число повторений (integer);
Решение: Чтобы ввести с клавиатуры число один раз, нужно использовать процедуру Readln(x); . В результате в ячейку памяти х будет помещено целое число (integer). Чтобы число вводилось n раз, надо повторить эту команду n раз. Тогда ячейка х будет обновляться n раз. Пусть параметр будет именоваться i.
Составим программу:
Var n,i,x:integer;
Begin
Writeln(‘Введите количество повторений’);
Read (n);
For i:=1 to n do readln(x);
End.
Эта задача не имеет наглядного результата, так как результатом является заполнение ячейки памяти. Зато она поможет в решении более сложных задач.
Пример4. Ввести n целых чисел с клавиатуры и найти сумму четных из них.
Дано: n – число повторений (integer);
Найти: sum – сумма четных чисел среди введенных (integer);
Решение: Чтобы ввести с клавиатуры число один раз, нужно использовать процедуру Readln(x); . В результате в ячейку памяти х будет помещено целое число (integer). Чтобы проверить число на четность, нужно использовать условный оператор. И только если число четное, нужно добавить его к сумме, применив оператор присваивания. Чтобы число вводилось n раз, надо повторить эту команду n раз. Тогда ячейка х будет обновляться n раз. Поэтому проверку на четность и увеличение суммы необходимо тоже каждый раз повторять. Таким образом, в теле цикла будет две команды: процедура ввода и условный оператор. Пусть параметр будет именоваться i.
Составим программу:
Var n,i,x,sum:integer;
Begin
Writeln(‘Введите количество повторений’);
Read (n);
For i:=1 to n do begin
read (x);
if x mod 2=0 then sum:=sum+x;
end;
Writeln( sum,’-сумма четных чисел из ’,n,’ введенных’);
End.
Пример5. Вывести на экран все трехзначные числа, кратные 15.
Решение: Все трехзначные числа находятся в промежутке от 100 до 999. Необходимо каждое из них проверить на кратность 15 и в случае истинности вывести на экран. Для проверки условия должен использоваться условный оператор. Условный оператор необходимо повторить столько раз, сколько чисел в промежутке от 100 до 999. Если использовать для повтора оператор цикла с параметром, то за начальное и конечное значения можно взять числа 100 и 999. Тогда переменная-параметр будет принимать значения из указанного диапазона – каждый раз новое значение. Эту переменную мы и будем проверять на кратность 15.
Составим программу:
Var i:integer;
Begin
For i:=100 to 999 do if i mod 15=0 then Writeln( i);
End.
4. Если необходимо вести отсчет шагов в обратном направлении, вместо служебного слова to используется служебное слово downto (шаг –1);
Пример. Найти сумму чисел из промежутка от a до b, где a и b целые числа.
Дано: a,b – целые числа, концы промежутка (integer);
Найти: sum – сумма целых чисел (integer);
Решение: Сумму чисел из указанного промежутка можно отыскать, опираясь на предыдущий пример. Трудность заключается в том, что в предыдущем примере концы промежутка были заданы в явном виде (100 и 999), а здесь это переменные величины. Если окажется что a>b, то отсчет придется вести в обратном направлении.
Составим программу.
Var a,b,i,sum:integer;
Begin
Writeln(‘Введите концы промежутка – два числа’);
Read (a,b);
If a>b then For i:= a downto b do sum:=sum+i
else For i:=a to b do sum:=sum+i;
Writeln(sum,’ –сумма чисел из промежутка от ’,a,’ до’,b);
End.
Вопросы и задания:
Первый блок
¨ Назначение, формат, механизм выполнения и особенности написания оператора цикла с параметром.
§ Внимательно рассмотрите фрагмент программы и ответьте на вопросы:
For i:=1 to 20 do read(a); a:=a+1; write(a);
Какие операторы являются телом данного цикла?
Сколько раз выполнится тело цикла?
Сколько чисел будет выведено на экран?
§ Исправьте ошибки в программе и заполните предложенную таблицу значений после исправления.
Var i,n:real; a:integer;
i | A |
Begin
n:=3; a:=5;
For i:=1 to n do begin
a:=a+i;
i:=i-2;
end;
Write(a:3:2);
End.
§ Составить программу, печатающую на экране 25 раз фразу: «Привет! Я учусь в седьмом классе».
§ Составить программу, печатающую на экране числа от 1 до n.
· Составить программу, печатающую нечетные числа из промежутка от 1 до n.
· Составить программу вычисления факториала числа n. Факториалом числа n (n!) называют произведение целых чисел от 1 до n (1*2*3*..*n).
· Составить программу, находящую сумму четных чисел из промежутка от 1 до n.
¨ Вывести на экран все числа из промежутка от 1 до n, которые делятся на 2, 3 и 5.
¨ Составить программу, находящую сумму всех двузначных чисел.
Второй блок
· Заполнить таблицу значений, опираясь на фрагмент программы.
i | a | b |
a:=1; b:=0;
For i:=5 to 10 do begin
a:=a+i;
b:=b+2*a;
end;
· Найти ошибки в программе:
Var a,b,i,x:real;
Begin
Read(x);
a:=x;
For i:=1 downto b do begin
i:=i+3;
a:=a/2;
x:=x+a;
end;
write(x);
end.
· Рассмотрите фрагменты программ и ответьте на вопрос: «Что будет выведено на экран?».
n:=5; x:=2;
For a:=1 to n do begin
x:=x*3;
writeln(x);
end;
write(n);
n:=4; a:=n;
For x:=1 to n do
a:=a-3;
writeln(a);
§ Составить программу, распечатывающую все трехзначные числа, у которых цифры расположены в порядке возрастания.
· Составить программу, распечатывающую все четырехзначные числа-«перевертыши» (2442 –«перевертыш»).
* | = | |||
* | = | |||
* | = | |||
* | = | |||
* | = | |||
* | = | |||
* | = | |||
* | = | |||
* | = | |||
* | = |
v Составить программу, распечатывающую таблицу умножения на заданное число а. Например, при а =5, на экране должно быть следующее:
v Составить программу, выводящую на экран таблицу значений функции y=ax+b, при заданных a и b для х, принимающего значения от -10 до 10.
Третий блок
§ Составить программу, которая запрашивает ввод десяти чисел.
§ Составить программу, которая запрашивает ввод десяти чисел и находит их сумму.
· Составить программу, которая среди n введенных чисел находит произведение нечетных.
¨ Составить программу, которая среди n введенных чисел считает количество чисел равных 0.
¨ Составить программу, которая запрашивает ввести n чисел и находит произведение тех из них, которые оканчиваются на 3.
· Составить программу, которая запрашивает количество учеников в классе, затем просит ввести рост каждого учащегося и находит средний рост.
§ Составить программу к решению задачи: «Вывести на экран ряд, в котором будут записаны степени числа 3, начиная с нулевой и заканчивая десятой».
· Составить программу, которая при заданном целом положительном числе а, находит (не вводите большой показатель степени, помните о типах данных).
Четвертый блок
§ Составьте программу к задаче: «Соблюдая диету, человек в первый день сбросил 1 кг. Каждый последующий день он скидывал на 200 г больше, чем в предыдущий. Сколько человек потеряет в весе за неделю?».
· Составьте программу к задаче: «Первоначальная выручка предприятия за месяц работы равна х руб. Каждый месяц выручка возрастает на а% от выручки предыдущего месяца. Какова будет месячная выручка через k месяцев?».
· Составьте программу к задаче: «На весах стояло n гирь. Первая весила m г. Каждая следующая гиря на 15% тяжелее предыдущей. Найти общий вес гирь, средний вес гирь и самую тяжелую гирю».
¨ Составьте программу к задаче: «На яблоне было х яблок. В первый день с яблони упало а яблок. Каждый следующий день опадало в 2 раза больше яблок, чем в предыдущий. Сколько яблок останется через k дней?».
· Составить программу поиска трехзначного числа, которое кратно заданному числу m и, в котором цифры расположены по возрастанию. Если такого числа не существует, сообщите об этом.
v Составьте программу к задаче: «Мама дает ученику на карманные расходы а руб. в день. Ученик тратит b руб. Каждый день расходы его увеличиваются на 3% от расходов предыдущего дня. Сколько денег ему выпросить у папы, чтобы прожить 10 дней. Если денег просить не придется, то сообщите об этом».
Пятый блок
§ Составить программу, которая запрашивает ввести n чисел и находит среди них максимальное число.
· Составить программу, которая запрашивает ввести количество учеников в классе, затем рост каждого ученика, и определяет самый большой и самый маленький рост.
§ Составить программу, вычисляющую сумму .
¨ Составить программу, вычисляющую сумму , где знаменатель взят из промежутка от 1 до n.
· Составить программу, находящую сумму квадратов нечетных чисел среди чисел промежутка от 1 до n.
· Составить программу, вычисляющую значение дроби , где используются числа из промежутка от 1 до n.
II. 13. Вложенные циклы
Рассмотрим фрагмент программы:
x:=0; y:=0;
For i:=1 to 3 do begin
For j:=1 to 2 do x:=x+2*j;
y:=y+x*i;
end;
В этом фрагменте присутствуют два цикла с параметрами: цикл по параметру i и цикл по параметру j.
Обратите внимание, что циклы будут выполняться не друг за другом!
Заметьте, что цикл по параметру j входит в тело цикла по параметру i.
! Цикл, входящий в тело другого цикла, называется вложенным.
! Цикл, в теле которого расположен другой цикл, называется внешним.
В нашем примере, цикл по параметру i – внешний, а цикл по параметру j – вложенный.
Проанализируем, как выполняется этот фрагмент программы.
1. Параметр i принял значение 1.
2. Начинает выполняться тело цикла по параметру i. В нем два оператора: цикл по параметру j и оператор присваивания.
ü Вначале, должен полностью выполниться цикл по параметру j. В результате его работы переменная х получит значение 6.
ü Когда цикл по параметру j закончит свою работу будет выполняться оператор присваивания и переменная у получит значение 6.
3. Параметр i увеличивает свое значение на 1. Пункт 2 повторяется, но с учетом того, что переменные х и у уже имеют значения равные 6.
В результате получаем следующую таблицу значений:
i | j | x | y |
Заметьте, что во внешнем цикле было 3 шага, а во внутреннем 2 шага, но тело цикла по параметру j выполнялось 2*3=6 раз.
Вложенные циклы с параметром часто используются в решении задач на перебор вариантов.
Пример. Составить программу к задаче: «Человек купил лотерейный билет. Билет состоит из двух одинаковых частей. На каждой части 10 ячеек, покрытых оболочкой. Под оболочкой цифры от 0 до 9. Игрок может стереть оболочку только на одной из ячеек в первой части билета и на одной из ячеек во второй части. Задача игрока – набрать х баллов (от 0 до 18). Выяснить, какие могут быть варианты и сколько шансов на победу».
Дано: х – количество баллов (число от 0 до 18 – byte);
Найти: a, b – баллы в ячейках на первой и второй половине билета, дающие в сумме х очков (числа от 0 до 9 – byte);
k – количество шансов на победу (byte).
Решение.
Переменная а содержит количество баллов в открытой игроком ячейке на первой половине билета, то есть может принимать значения от 0 до 9. При каждом значении переменной а переменная b (количество баллов в открытой игроком ячейке на второй половине билета) может принимать значения от 0 до 9. Перебирая варианты, необходимо проверять условие a+b=x. Только при истинности этого условия, нужно вывести значения соответствующих ячеек на экран и увеличить счетчик шансов на 1. Только после вывода всех подходящих вариантов следует вывести количество подсчитанных шансов на победу. Для перебора вариантов, нам понадобятся два цикла: внешний цикл с параметром а и вложенный цикл с параметром b. В теле цикла нам понадобится условный оператор, при истинности которого необходимо выводить пару значений (процедура вывода) и увеличивать счетчик шансов (оператор присваивания).
Составим программу:
Var a,b,x,k: byte;
Begin
Writeln(‘Введите количество баллов победителя – от 0 до 18’);
Readln(x);
Writeln(‘Возможные варианты:’);
For a:=0 to 9 do
For b:=0 to 9 do If a+b=x then begin
Writeln(a, ‘ ’,b);
k:=k+1;
end;
Writeln(‘У игрока ’,k, ‘шансов на победу’);
End.
Вопросы и задания:
Первый блок
¨ Какой цикл называют вложенным? Расскажите механизм выполнения компьютером вложенных циклов.
¨ Для чего используют вложенные циклы с параметром?
¨ Составь таблицу значений переменных для данного фрагмента программы.
For i:=1 to 3 do begin
For j:=1 to 3 do begin
For k:=1 to 2 do begin
a:=2*k;
b:=b+a;
end;
b:=b+2;
end;
c:=a+b;
end;
§ Составить программу к задаче: «Сколько шансов при бросании двух игральных костей выбросить х очков (от 2 до 12) и какие это варианты».
· Составить программу к задаче: «Сколько шансов при бросании трех игральных костей выбросить х очков (от 3 до 18) и какие это варианты».
· Составить программу к задаче: «Необходимо перевезти груз через реку. Бочки весят 100 кг, ящики – 50 кг, а пакеты – 0.5 кг. Плот выдержит 1 тонну груза. Как укомплектовать плот, если требуется перевезти 100 предметов?».
¨ Составить программу к задаче: «В кассе остались купюры по 3 и 5 рублей. Кассиру необходимо выдать сумму s рублей (известно, что s>7). Какие могут быть варианты по количеству тех и других купюр?».
· Составить программу к задаче: «Долгожитель обнаружил, что если к сумме квадратов цифр его возраста прибавить число дня его рождения, то получится его возраст. Сколько ему лет?».
¨ Составить программу к задаче: «Числа a, b и c называются «пифагоровой тройкой», если выполняется условие . Отыщите все «пифагоровы тройки» среди чисел от 1 до n».
Второй блок
¨ Составить программу к задаче: «Известно, что число 1?2?? ( знаки вопроса свидетельствуют о пропущенных цифрах) делится нацело на 37. Определите пропущенные цифры и распечатайте это число».
§ Составить программу печати трехзначных чисел, имеющих 10 делителей.
· Составить программу к задаче: «Число называется «совершенным» если оно равно сумме всех своих делителей включая 1, но, не включая само себя. Распечатайте все совершенные числа из промежутка от 1 до n».
· Составить программу к задаче: «Распечатайте все простые числа из промежутка от 1 до n».
v Составить программу к задаче: « Напечатайте число из промежутка от 1 до n с наибольшим количеством делителей».
II. 14. Операторы циклов с условиями
Существуют задачи, решение которых требует повторения серии команд неизвестное количество раз. Обычно, в таких задачах известно либо условие, при истинности которого необходимо повторять эту серию команд, либо условие, при истинности которого следует прекратить повторы. При составлении программ к таким задачам нельзя использовать оператор цикла с параметром для организации повторений. На этот случай существуют другие операторы циклов.
Если известно условие, при котором надо повторять серию команд | Если известно условие, при котором надо прекратить повторы |
Оператор цикла с предусловием (цикл «ПОКА») | Оператор цикла с постусловием (цикл «ДО») |
Формат While <условие>do begin <тело цикла> end; | Формат Repeat <тело цикла> Until<условие>; |
тело цикла – это серия операторов, которые надо повторять. | |
Механизм выполнения оператора | |
1. проверяется условие на истинность; 2. если условие истинно, то выполняется тело цикла; 3. снова проверяется условие на истинность; 4. и так далее, будет выполняться тело цикла, и проверяться истинность условия, пока условие не станет ложным; 5. если условие стало ложным, то выполняется оператор, следующий после цикла. | 1. выполняется тело цикла; 2. проверяется условие на истинность; 3. если условие ложно, то выполняется тело цикла; 4. снова проверяется условие на истинность; 5. и так далее, будет выполняться тело цикла, и проверяться истинность условия, пока условие не станет истинным; 6. если условие стало истинным, то выполняется оператор, следующий после цикла. |
Дословный перевод оператора | |
«Пока условие истинно, делай тело цикла ». | «Повторяй тело цикла до того, как условие станет истинным». |
Особенности написания оператора | |
ü Если тело цикла состоит из одного оператора, то операторные скобки можно не писать. | ü Каким бы ни было тело цикла, операторных скобок здесь не требуется. |
Пример. Составить программу, увеличивающую заданное целое число x вдвое, пока оно не превысит 1000. Дано: x – целое число (integer); Результат: Сообщение о том, что x превысило 1000. Решение: Чтобы увеличить x в два раза понадобится один оператор присваивания x:=x*2. Этот оператор необходимо повторять. Следовательно, понадобится оператор цикла. | |
Количество повторений не известно, но известно условие повторений x<=1000. Воспользуемся оператором цикла «ПОКА». Составим программу. Var x:integer; Begin Writeln(‘Введите число x’); Readln(x); While x<=1000 do x:=x*2; Writeln(‘число превысило 1000 и стало равно’,x); End. | Количество повторений не известно, но известно условие, при котором повторы следует прекратить x>1000. Воспользуемся оператором цикла «ДО». Составим программу. Var x:integer; Begin Writeln(‘Введите число x’); Readln(x); Repeat x:=x*2; Until x>1000 Writeln(‘число превысило 1000 и стало равно’,x); End. |
шаги | х |
X превысило 1000 и стало равно 1600 |
Проанализируем решение задачи. Допустим, введено число 100. Составим таблицу значений переменных для обеих программ.
шаги | х |
X превысило 1000 и стало равно 1600 |
Обе программы выполняются одинаково.
Допустим, введено число большее 1000. Например, 1100. Цикл «ПОКА» проверит условие, убедится в его ложности и программа выведет сообщение «x превысило 1000 и стало равно 1100». Цикл «ДО» вначале выполнит тело цикла, а затем, убедится в истинности условия и прекратит работу. После этого последует сообщение «x превысило 1000 и стало равно 2200». В данном случае вторая программа работает некорректно по отношению к исходным данным.
Отличие в работе циклов в том, что цикл «ПОКА» может не выполниться ни разу, если условие заведомо ложно, а цикл «ДО» хотя бы один раз, но выполнится.
! Если решение задачи связано с реализацией циклического алгоритма, то, работая над задачей, следует выяснить:
1. «Что необходимо повторять?» - тело цикла;
2. а) «При каком условии следует повторять?» - цикл «ПОКА»;
б) «До выполнения, какого условия следует повторять?» - цикл «ДО»;
3. Необходимо, чтобы переменные, участвующие в условии были определены до его проверки;
Пример. Вводить числа с клавиатуры, пока не будет введен 0.
Решение: Для ввода одного числа используем процедуру ввода read(x). Эту процедуру необходимо повторять пока x<>0 или до x=0.
Составим программу двумя способами.
Var x:integer; Begin While x<>0 do read(x); End. | Var x:integer; Begin Repeat read(x); Until x=0; End. |
В этом случае, до проверки условия переменная x не определена, а значит, равна 0. Условие оказалось заведомо ложным, а значит, программа составлена неверно. | В этом случае, до проверки условия переменная x получила свое значение в результате ввода, а значит, программа составлена верно. |
Правильное решение: Var x:integer; Begin Read(x); While x<>0 do read(x); End. |
4. Необходимо, чтобы в теле цикла происходил процесс, ведущий к изменению истинности условия;
Проанализируем фрагмент программы:
X:=4;
While x<10 do write(‘цикл работает’);
В этом фрагменте повторяется вывод фразы «цикл работает». Переменная x на протяжении работы цикла не изменит своего значения и останется равной 4. Следовательно, условие работы цикла не изменит своей истинности, и цикл будет работать бесконечно.
Этот фрагмент можно исправить хотя бы так:
X:=4;
While x<10 do begin write(‘цикл работает’); x:=x+3; end;
В этом случае, на втором шаге работы цикла x примет значение 10, и цикл прекратит работу.
Примеры решения задач
Пример 1. Составить программу к задаче: «Вводить числа с клавиатуры, пока их сумма не превысит 100».
Решение: Для ввода одного числа используем процедуру ввода read(x). Эту процедуру необходимо повторять пока сумма sum<=100 или до sum>100. Первоначальное значение суммы 0. Чтобы изменялась истинность условия, внутри тела цикла сумма должна меняться, увеличиваясь, каждый раз, на введенное число х.
Составим программу.
Цикл «ПОКА»
Var x,sum: integer;
Begin
Sum:=0;
While sum<=100 do begin
Writeln(‘введите целое число’);
Read(x);
Sum:=sum+x;
End;
Writeln(‘сумма превысила 100 и стала равна ’,x);
End.
Цикл «ДО»
Var x,sum: integer;
Begin
Sum:=0;
Repeat
Writeln(‘введите целое число’);
Read(x);
Sum:=sum+x;
Until sum>100;
Writeln(‘сумма превысила 100 и стала равна ’,x);
End.
Пример 2. Составить программу к задаче: «Вводить числа с клавиатуры, пока количество четных чисел, среди введенных, не станет равным k».
Дано: k – целое число (integer);
Результат: сообщение о том, что количество четных чисел равно k;
Решение: Для ввода одного числа используем процедуру ввода read(x). Эту процедуру необходимо повторять пока количество четных чисел kol<>k или до kol=k. Первоначальное значение kol=0. Чтобы изменялась истинность условия, внутри тела цикла количество четных чисел нужно считать. Проверять числа на четность нам поможет условный оператор.
Составим программу.
Цикл «ПОКА»
Var x,k,kol: integer;
Begin
Writeln(‘введите число’);
Readln(k);
kol:=0;
While kol<>k do begin
Writeln(‘введите целое число’);
Read(x);
If x mod 2=0 then kol:=kol+1;
end;
Writeln(‘количество четных чисел равно ’,k);
End.
Цикл «ДО»
Var x,sum: integer;
Begin
Writeln(‘введите число’);
Readln(k);
kol:=0;
Repeat
Writeln(‘введите целое число’);
Read(x);
If x mod 2=0 then kol:=kol+1;
Until kol=k;
Writeln(‘количество четных чисел равно ’,k);
End.
Пример 3. Составить программу к задаче: «Вводить числа с клавиатуры, пока они образуют возрастающую последовательность».
Результат: сообщение о том, что возрастание последовательности нарушилось.
Решение: Для ввода одного числа используем процедуру ввода read(x). Эту процедуру необходимо повторять пока предыдущее число меньше следующего (x1<x) или до (x1>=x). Чтобы условие было определено, необходимо ввести первые два члена последовательности (read(x1,x)). На первом шаге цикла будет введено третье число. Теперь надо сравнить второе и третье. Значит, на место x1 должно встать предыдущее x, а на место x, его новое значение.
Составим программу.
Var x,x1: integer;
Begin
Writeln(‘введите 2 члена последовательности’);
Readln(x1,x);
While x1<x do begin
x1:=x;
Writeln(‘введите следующий член последовательности’);
Read(x);
end;
Writeln(‘возрастание последовательности нарушилось’);
End.
С помощью оператора цикла «ДО» эту задачу решить нельзя!
Вывод: Цикл «ПОКА» универсален!
Вопросы и задания:
Первый блок
¨ Назначение, форматы, механизмы выполнения и особенности написания операторов циклов с условиями.
¨ Назовите отличие в работе операторов циклов «ПОКА» и «ДО».
¨ Как работать над задачей, решение которой содержит циклический алгоритм?
¨ Какой из циклов универсален и почему?
· Составьте программу к задаче «Вводить числа с клавиатуры, пока они положительны».
· Составьте программу к задаче «Вводить числа с клавиатуры, пока не встретится задуманное число x».
¨ Усовершенствуйте предыдущую, чтобы после ввода числа выводилось одно из сообщений «МНОГО» или «МАЛО».
¨ Составьте программу к задаче «Вводить числа с клавиатуры и выводить ответ на вопрос: «является ли число четным?», пока не будет введен ноль».
· Составьте программу к задаче «Дано число x. Делить его на 2 нацело, пока оно не обратится в 0. Посчитать количество делений».
· Составьте программу к задаче «Вводить числа с клавиатуры, пока не встретится число кратное 5. Сколько среди введенных чисел оканчивалось цифрой 2?».
Второй блок
· Перед вами программа к задаче «Вводить пары чисел, пока первое число больше второго».
Var a,b: integer;
Begin
While a>b do begin
writeln(‘введите пару чисел’);
readln(a,b);
end;
Write(‘условие нарушилось’);
End.
Найдите ошибку в программе и исправьте ее.
· Сколько раз выполнится тело цикла:
B:=1; X:=96;
WHILE B=1 DO BEGIN
IF X<3 THEN B:=0;
X:=X DIV 7 +1;
END;
A) 1 раз; B)2 раза; C)3 раза; D)4 раза; E)5 раз;
· Чему будут равны значения целых переменных C и D после выполнения фрагмента программы:
C:=10; A:=46; B:=7; D:=A;
WHILE D>=B DO BEGIN C:=C-1; D:=D-2*B; END;
A) 6; -2; B) 7; 4; C) 7; -1; D) 9; 2; E) 7; 2;
§ Составьте программу к задаче «Вводить числа с клавиатуры, пока они образуют убывающую последовательность. Сколько чисел было введено по возрастанию?».
· Составьте программу к задаче «В первый день выручка предпринимателя составила k рублей. Каждый последующий день выручка увеличивалась на 15 %. Вырученные деньги складываются в копилку. Сколько потребуется дней, чтобы заработать 1000000?».
· Составьте программу к задаче «Вводить числа, пока их сумма не превысит 100. Среди них найти максимальное число».
· Составьте программу к задаче: «Напечатать в возрастающем порядке все трехзначные числа, пока не встретится число, сумма цифр которого равна заданному числу m».
II. 15. Сравнительная характеристика циклов
Рассмотрим решение следующей задачи: «Ввести n чисел с клавиатуры и найти сумму четных положительных из них».
Дано: n – количество чисел (integer);
Найти: sum – сумма четных положительных чисел (integer);
Решение: Для ввода одного числа используем процедуру ввода read(x). Эту процедуру необходимо повторять n раз, то есть можно использовать оператор цикла с параметром. На каждом шаге цикла следует проверять, является ли x четным и положительным. В случае истинности условия, необходимо число добавлять к сумме.
Составим программу:
Var x,sum,n,i: integer;
Begin
Writeln(‘Введите количество чисел’);
Read(n);
Sum:=0;
For i:=1 to n do begin
Writeln(‘Введите число’);
Read(x);
If (x mod 2=0) and (x>0) then sum:=sum+x;
end;
Writeln(‘Сумма четных положительных чисел равна ’,sum);
End.
В этой программе параметр цикла введен для того, чтобы отсчитывать количество введенных чисел. Параметр будет увеличиваться на 1, пока не достигнет значения n, то есть при выполнении условия ( i<n). Очевидно, что программу к задаче можно составить и используя цикл «ПОКА». Только в этом случае необходимо предусмотреть, что этот вид циклов не может менять автоматически значения переменных. До начала ввода чисел значение параметра равно 0, а каждый раз после ввода увеличивается на единицу. Составим программу.
Var x,sum,n,i: integer;
Begin
Writeln(‘Введите количество чисел’);
Read(n);
i:=0;
While i<n do begin
Writeln(‘Введите число’);
Read(x);
i:=i+1;
If (x mod 2=0) and (x>0) then sum:=sum+x;
end;
Writeln(‘Сумма четных положительных чисел равна ’,sum);
End.
Так как можно определить условие работа цикла, то можно определить и условие выхода из него (i=n). Следовательно, можно составить программу и с использованием оператора цикла «ДО». Составим программу.
Var x,sum,n,i: integer;
Begin
Writeln(‘Введите количество чисел’);
Read(n);
i:=0;
Repeat
Writeln(‘Введите число’);
Read(x);
i:=i+1;
If (x mod 2=0) and (x>0) then sum:=sum+x;
Until i=n;
Writeln(‘Сумма четных положительных чисел равна ’,sum);
End.
Выводы:
- Если программа содержит оператор цикла с параметром, то его, при необходимости, можно заменить одним из циклов с условием («ПОКА» или «ДО»);
- Цикл с предусловием («ПОКА») является универсальным. С ним можно составить любую программу, содержащую циклический алгоритм.
Вопросы и задания:
¨ Какой вид циклов является универсальным и почему?
¨ Какой из циклов самый заменимый и почему?
¨ Составить программу, которая среди n введенных чисел считает количество чисел равных 0 или кратных 10 с использованием всех видов циклов.
· Составить программы вывода на экран всех чисел из промежутка от 1 до n, которые делятся на 4 и 5 с использованием всех видов циклов.
· Составить программы нахождения суммы всех двузначных чисел, у которых цифры расположены по возрастанию с использованием всех видов циклов.
v Составить программу, которая находит наименьшее трехзначное число, имеющее 10 делителей.
II. 16. Целочисленная арифметика
Целочисленная арифметика – это вычисления связанные с цифрами целых чисел.
Ряд задач на целочисленную арифметику был уже предложен вам в предыдущих параграфах. Например, задача: «Дан шестизначный номер автобусного билета. Говорят, что билет «НЕВЕЗУЧИЙ», если сумма цифр равна 13. Проверить билет на «невезучесть»».
Вспомним как решать такие задачи.
Дано: n – шестизначный номер (longint);
Результат: одно из сообщений «НЕВЕЗУЧИЙ» или «ОБЫЧНЫЙ».
Решение: Чтобы определить, является ли билет «невезучим», необходимо сравнить сумму его цифр с числом 13. Чтобы посчитать сумму, надо знать цифры. Назовем их a1, a2, a3, a4, a5, a6. Последняя цифра в любом числе находится как остаток от деления этого числа на 10 (a6:=n mod 10). Следующую цифру можно найти, если сделать ее последней в числе. Для этого надо убрать шестую цифру. Чтобы убрать цифру из числа. Нужно поделить число на 10 нацело (n:=n div 10). Теперь можно найти a5 (a5:=n mod 10). И так далее. Пока не найдем все цифры.
Составим программу.
Var n: longint; a1,a2,a3,a4,a5,a6,sum: integer;
Begin
Writeln(‘введите номер вашего билета’);
Read(n);
a6:=n mod 10;
n:=n div 10;
a5:=n mod 10;
n:=n div 10;
a4:=n mod 10;
n:=n div 10;
a3:=n mod 10;
n:=n div 10;
a2:=n mod 10;
n:=n div 10;
a1:=n mod 10;
sum:=a1+a2+a3+a4+a5+a6;
If sum=13 then writeln(‘НЕВЕЗУЧИЙ’) else writeln(‘ОБЫЧНЫЙ’);
End.
Анализируя программу, следует отметить, что в ней повторяется серия одинаковых операций: «найти цифру» и «оторвать цифру». В данной задаче эта серия должна повторяться шесть раз. Возникает желание составить программу с использованием оператора цикла с параметром. Единственное затруднение создают отличные друг от друга имена цифр. Если дать им одно имя, то придется на каждом шаге цикла найденную цифру добавлять к сумме.
Составим программу:
Var n: longint; a,sum,i: integer;
Begin
Writeln(‘введите номер вашего билета’);
Read(n);
For i:=1 to 6 do begin
a:=n mod 10;
n:=n div 10;
sum:=sum+a;
end;
If sum=13 then writeln(‘НЕВЕЗУЧИЙ’) else writeln(‘ОБЫЧНЫЙ’);
End.
Заметьте, как значительно сократился текст программы.
В изложенной задаче было известно количество цифр в исходном числе.
А как быть, если количество цифр неизвестно?
Задача. «Дано целое число. Определить, сколько в нем цифр».
Дано: n – целое число (longint);
Результат: kol – количество цифр в числе (integer).
Решение: Чтобы определить, количество цифр в числе, надо знать цифры. Для поиска и подсчета цифр будет повторяться серия команд