Для параметра, принимающего значения от начального до конечного с шагом «единица», делай тело цикла

Механизм выполнения оператора:

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, начиная с нулевой и заканчивая десятой».

· Составить программу, которая при заданном целом положительном числе а, находит Для параметра, принимающего значения от начального до конечного с шагом «единица», делай тело цикла - student2.ru (не вводите большой показатель степени, помните о типах данных).

Четвертый блок

§ Составьте программу к задаче: «Соблюдая диету, человек в первый день сбросил 1 кг. Каждый последующий день он скидывал на 200 г больше, чем в предыдущий. Сколько человек потеряет в весе за неделю?».

· Составьте программу к задаче: «Первоначальная выручка предприятия за месяц работы равна х руб. Каждый месяц выручка возрастает на а% от выручки предыдущего месяца. Какова будет месячная выручка через k месяцев?».

· Составьте программу к задаче: «На весах стояло n гирь. Первая весила m г. Каждая следующая гиря на 15% тяжелее предыдущей. Найти общий вес гирь, средний вес гирь и самую тяжелую гирю».

¨ Составьте программу к задаче: «На яблоне было х яблок. В первый день с яблони упало а яблок. Каждый следующий день опадало в 2 раза больше яблок, чем в предыдущий. Сколько яблок останется через k дней?».

· Составить программу поиска трехзначного числа, которое кратно заданному числу m и, в котором цифры расположены по возрастанию. Если такого числа не существует, сообщите об этом.

v Составьте программу к задаче: «Мама дает ученику на карманные расходы а руб. в день. Ученик тратит b руб. Каждый день расходы его увеличиваются на 3% от расходов предыдущего дня. Сколько денег ему выпросить у папы, чтобы прожить 10 дней. Если денег просить не придется, то сообщите об этом».

Пятый блок

§ Составить программу, которая запрашивает ввести n чисел и находит среди них максимальное число.

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

§ Составить программу, вычисляющую сумму Для параметра, принимающего значения от начального до конечного с шагом «единица», делай тело цикла - student2.ru .

¨ Составить программу, вычисляющую сумму Для параметра, принимающего значения от начального до конечного с шагом «единица», делай тело цикла - student2.ru , где знаменатель взят из промежутка от 1 до n.

· Составить программу, находящую сумму квадратов нечетных чисел среди чисел промежутка от 1 до n.

· Составить программу, вычисляющую значение дроби Для параметра, принимающего значения от начального до конечного с шагом «единица», делай тело цикла - student2.ru , где используются числа из промежутка от 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 называются «пифагоровой тройкой», если выполняется условие Для параметра, принимающего значения от начального до конечного с шагом «единица», делай тело цикла - student2.ru . Отыщите все «пифагоровы тройки» среди чисел от 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.

Выводы:

  1. Если программа содержит оператор цикла с параметром, то его, при необходимости, можно заменить одним из циклов с условием («ПОКА» или «ДО»);
  2. Цикл с предусловием («ПОКА») является универсальным. С ним можно составить любую программу, содержащую циклический алгоритм.

Вопросы и задания:

¨ Какой вид циклов является универсальным и почему?

¨ Какой из циклов самый заменимый и почему?

¨ Составить программу, которая среди 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).

Решение: Чтобы определить, количество цифр в числе, надо знать цифры. Для поиска и подсчета цифр будет повторяться серия команд

Наши рекомендации