При составлении программ часто возникает необходимость сократить запись кода при повторении однообразных команд. А когда количество их повторений заранее неизвестно и определяется некоторым условием, то можно использовать структуру — цикл с предусловием или цикл с постусловием.
Цикл — одна из форм управляющих конструкций в языках программирования. Используется для многократного выполнения набора команд.
Цикл с предусловием ( while do )
На рисунке ниже представлена блок-схема цикла с предусловием. Другие названия цикла: цикл-пока, цикл с заданным условием продолжения работы.
Особенность данного вида цикла while : операторы цикла будут повторяться до тех пор, пока условие истинно. Его проверка делается каждый раз перед выполнением операторов цикла. Цикл может ни разу не выполниться, если его условие ложно.
На рисунке показано два варианта записи данной структуры на языке программирования Паскаль:
- с использованием операторных скобок (begin end), выполнение двух и более команд;
- запись с одной командой.
Задачи на циклы Паскаль
Задание 1. Даны два положительных числа A и B (A > B). На отрезке длины A размещено максимально возможное количество отрезков длины B (без
наложений). Не используя операции умножения и деления, найдите длину незанятой части отрезка A.
Решение:
Вариант 1
program cycle1; var a,b:real; {a,b - вещественные числа } begin read(a,b); { ввод исходных значений длин отрезков } while a > b do a:=a-b; { цикл - вычисление остатка отрезка А } write(a); { вывод остатка отрезка А } end.
Вариант 2 (с подсказками)
program cycle1; var a,b:real; begin write('Введите длину отрезка А '); { вывод текстовой подсказки на экран } readln(a); { ввод исходного значения длины отрезка А } write('Введите длину отрезка В '); { вывод текстовой подсказки на экран } readln(b); { ввод исходного значения длины отрезка В } while a > b do a:=a-b; { цикл - вычисление остатка отрезка А } write('Длина незанятой части отрезка А равна ',a); { вывод остатка отрезка А } end.
Задание 2. Найти сумму ряда чисел с точностью (ε=10**-6).
- 1 ряд: 1/1*2 + 1/2*4 +1/3*6…
- 2 ряд: 1/1*2*3 + 1/2*3*4 + 1/3*4*5….
- 3 ряд: 1/1*3 + 1/2*4 +1/3*5…
Решение для 1 ряда:
var a,ap,s:real;{а - текущий элемент, ар - предыдущий элемент} i:integer;{счетчик элементов ряда} begin s:=0;{первоначальная сумма} i:=1;{начинаем ряд с первого элемента} a:=0;{ это значение нужно для запуска цикла} ap:=1;{это значение нужно для запуска цикла} while Abs(a-ap)>1e-6 do {модуль разницы между соседними должен быть больше заданной точности для работы цикла} begin ap:=a;{запоминаем предыдущий элемент} a:=1/(i*i*2);{вычисляем текущий элемент} s:=s+a;{считаем сумму} i:=i+1;{переходим к следующему} end; write('Сумма ряда = ',s);{вывод результата} end.
Формула текущего элемента для второго ряда a:=1/(i*(i+1)*(i+2)); для третьего — a:=1/(i*(i+2));
Вычисление суммы ряда с определенной точностью ε означает, что сумма ряда вычисляется до тех пор, пока модуль разности между текущим и предыдущим членом последовательности больше ε. В виде формулы это утверждение можно записать так:|a – aр| > ε, то есть пока это выражение истинно, вычисления продолжаются.
Цикл с постусловием ( repeat )
На рисунке ниже представлена блок-схема цикла с постусловием. Другие названия цикла: цикл-до, цикл с заданным условием окончания работы.
Особенность данного вида цикла ( repeat ) — операторы цикла будут повторяться до тех пор, пока условие ложно. Его проверка делается каждый раз после выполнения операторов цикла. Команды, входящие в тело цикла, всегда выполняются хотя бы один раз.
Задание 3. Дано целое число N (>0). Найти наименьшее целое положительное число K, квадрат которого превосходит N: K2 > N. Функцию извлечения квадратного корня не использовать.
Решение:
program cycle2; var n,k:integer; { n - заданное целое, k - искомое число} begin read(n); { ввод значения числа N } repeat k:=k+1; { вычисление проверяемого числа } until k*k > n; { проверка найденного числа на соответствие условию завершения цикла} write(k); { вывод найденного числа } end.
Задание 4. Дано натуральное число N. Найти сумму первой и последней цифры этого числа
Решение:
var a,c1,c2:int64; begin write('Введите исходное число => '); readln(a); c1:=a mod 10; if a>9 then while a>0 do begin c2:=a; a:=a div 10; end; write('Сумма первой и последней цифры = ',c1+c2); end.
Задача 5. Покупатель должен заплатить в кассу S руб. У него есть купюры номиналом: 1,2,5,10,50,100,500. Сколько купюр разного номинала отдаст покупатель, если он начинает платить с самых крупных?
Следующая тема для изучения Цикл с параметром