Цикл с предусловием выполняется так
Цикл с предусловием используется, когда заранее неизвестно сколько раз должен выполниться цикл.
Формат записи цикла:
While (логическое выражение) do оператор
While (логическое выражение) do
Пример 1:
Вывести на экран первые 5 натуральных чисел.
Пример 2:
Составить программу вычисления факториала числа n, т. е. n!. (0! = 1)
| Блок-схема задачи:
| Программный код: Program Problem1; <Вычисление факториала числа n! > var n, f, i: integer; begin write(«Введите натуральное число «); readln(n); f := 1; i:=1; if n <> 0 then while i begin f:=f*i; i:=i+1; end writeln («Факториал числа «, n, » равен «, f); readln; end. |
Задания повышенной сложности
Циклы
Введение. Циклы с предусловием.
П ри решении практических задач постоянно возникает необходимость в повторении действия заданное количество раз, или до достижения какого-либо условия. Например, вывести список всех пользователей, замостить плоскость текстурой, провести вычисления над каждым элементом массива данных и т.п. В си для этих целей используются три вида циклов: с предусловием, постусловием и цикл for со счётчиком (хотя, это условное название, потому что счётчика может и не быть).
Рассмотрим цикл с предусловием.
Очень важно, чтобы условие выхода из цикла когда-нибудь выполнилось, иначе произойдёт зацикливание, и программа не завершится. К примеру
В этом цикле не изменяется переменная i, которая служит для определения условия останова, поэтому цикл не завершится.
В этой программе цикл, конечно, завершится, но из-за неправильного действия он будет выполнен гораздо больше 10 раз. Так как си не следит за переполнением переменной, нужно будет ждать, пока переменная переполнится и станет меньше нуля.
У этого примера неопределённое поведение. Так как переменная i заранее не инициализирована, то она хранит мусор, заранее неизвестное значение. При различном содержимом переменной i будет меняться поведение.
Если тело цикла while содержит один оператор, то фигурные скобки можно опустить.
Здесь мы инкрементируем переменную i при вызове функции printf. Следует избегать такого стиля кодирования. Отсутствие фигурных скобок, особенно в начале обучения, может приводить к ошибкам. Кроме того, код читается хуже, да и лишние скобки не сильно раздувают листинги.
Циклы с постусловием.
Ц икл с постусловием отличается от цикла while тем, что условие в нём проверяется после выполнения цикла, то есть этот цикл будет повторён как минимум один раз (в отличие от цикла while, который может вообще не выполняться). Синтаксис цикла
Предыдущий пример с использованием цикла do будет выглядеть как
Давайте рассмотрим пример использования цикла с постусловием и предусловием. Пусть нам необходимо проинтегрировать функцию.
∫ a b f ⁡ x d x = ∑ i = a b f ⁡ i h
Для нахождения интеграла необходимо пройти от a до b с некоторым шагом h, и прибавлять к сумме площадь прямоугольника со сторонами f(x) и h.
Программа выводит 0.328.
∫ 0 1 x 2 d x = x 3 3 | 0 1 = 1 3 ≈ 0.333
Если посмотреть на график, то видно, что каждый раз мы находим значение функции в левой точке. Поэтому такой метод численного интегрирования называют методом левых прямоугольников. Аналогично, можно взять правое значение. Тогда это будет метод правых прямоугольников.
Сумма в этом случае будет равна 0.338. Метод левых и правых прямоугольников не очень точен. Мы фактически аппроксимировали (приблизили) гладкий график монотонно возрастающей функции гистограммой. Если немного подумать, то аппроксимацию можно проводить не только суммируя прямоугольники, но и суммируя трапеции.
Приближение с помощью трапеций на самом деле является кусочной аппроксимацией кривыми первого порядка (ax+b). Мы соединяем точки на графике с помощью отрезков. Можно усложнить, соединяя точки не отрезками, а кусками параболы, тогда это будет метод Симпсона. Если ещё усложнить, то придём к сплайн интерполяции, но это уже другой, очень долгий разговор.
Вернёмся к нашим баранам. Рассмотрим 4 цикла.
Если выполнить эти примеры, то будет видно, что циклы выполняются от двух, до четырёх раз. На это стоит обратить внимание, потому что неверное изменение счётчика цикла часто приводит к ошибкам.
Часто случается, что нам необходимо выйти из цикла, не дожидаясь, пока будет поднят какой-то флаг, или значение переменной изменится. Для этих целей служит оператор break, который заставляет программу выйти из текущего цикла.
Давайте решим простую задачу. Пользователь вводит числа до тех пор, пока не будет введено число 0, после этого выводит самое большое из введённых. Здесь есть одна загвоздка. Сколько чисел введёт пользователь не известно. Поэтому мы создадим бесконечный цикл, а выходить из него будем с помощью оператора break. Внутри цикла мы будем получать от пользователя данные и выбирать максимальное число.
В этом случае мы выходим из цикла с помощью break; Для начала в качестве максимального задаём 0. Пользователь вводит число, после чего мы проверяем, ноль это или нет. Если это не ноль, то сравниваем его с текущим максимальным.
Бесконечные циклы используются достаточно часто, так как не всегда заранее известны входные данные, либо они могут меняться во время работы программы.
Когда нам необходимо пропустить тело цикла, но при этом продолжить выполнение цикла, используется оператор continue. Простой пример: пользователь вводит десять чисел. Найти сумму всех положительных чисел, которые он ввёл.
Вот ещё один пример. Необходимо, чтобы пользователь ввёл целое число больше нуля и меньше 100. Пока необходимое число не будет введено, программа будет продолжать опрос.
Цикл for
О дним из самых используемых является цикл со счётчиком for. Его синтаксис
Например, выведем квадраты первых ста чисел.
Одним из замечательных моментов цикла for является то, что он может работать не только с целыми числами.
Этот цикл выведет числа от 5.3 до 0.1. Цикл for может не иметь некоторых «блоков» кода, например, может отсутствовать инициализация, проверка (тогда цикл становится бесконечным) или изменение счётчика. Вот пример с интегралом, реализованный с применением счётчика for
Давайте рассмотрим кусок кода
Его можно изменить так
Более того, используя оператор break, можно убрать условие и написать
кроме того, используя оператор «,», можно часть действий перенести
ЗАМЕЧАНИЕ: несмотря на то, что так можно делать, пожалуйста, не делайте так! Это ухудшает читаемость кода и приводит к трудноуловимым ошибкам.
Возьмём точку на кривой с координатами (x; f(x)), сдвинемся на шаг h вперёд, получим точку (x+h, f(x+h)), тогда производная будет
То есть, отношение малого приращения функции к малому приращению аргумента. Внимательный читатель может задать вопрос, почему мы двигаемся вперёд по функции, а не назад. Ну пойдёмте назад
Возьмём среднее от этих двух значений, получим
В общем-то теперь задача становится тривиальной: идём от точки a до точки b и находим минимальное значение производной, а также точку, в которой производная принимает это значение. Для решения нам понадобятся, как и в задаче с интегралом, переменные для границ области поиска a и b, текущее значение x и шаг h. Кроме того, необходимо максимальное значение maxVal и координата maxX этого максимального значения. Для работы возьмём функцию x • sin ⁡ x
На выходе программа выдаёт max value = 1.391 at 1.077
Численное решение даёт такие же (с точностью до погрешности) результаты, что и наша программа.
Вложенные циклы
Рассмотрим пример, где циклы вложены друг в друга. Выведем таблицу умножения.
В этом примере в первый цикл по переменной i вложен второй цикл по переменной j. Последовательность действий такая: сначала мы входим в цикл по i, после этого для текущего i 10 раз подряд осуществляется вывод чисел. После этого необходимо перейти на новую строку. Теперь давайте выведем только элементы под главной диагональю
Как вы видите, оператор break позволяет выйти только из текущего цикла. Этот пример может быть переписан следующим образом
В данном случае мы используем во вложенном цикле счётчик первого цикла.
Цикл с предусловием ( while ) и постусловием ( repeat )
При составлении программ часто возникает необходимость сократить запись кода при повторении однообразных команд. А когда количество их повторений заранее неизвестно и определяется некоторым условием, то можно использовать структуру — цикл с предусловием или цикл с постусловием.
Цикл — одна из форм управляющих конструкций в языках программирования. Используется для многократного выполнения набора команд.
Цикл с предусловием ( while do )
На рисунке ниже представлена блок-схема цикла с предусловием. Другие названия цикла: цикл-пока, цикл с заданным условием продолжения работы.
Особенность данного вида цикла while : операторы цикла будут повторяться до тех пор, пока условие истинно. Его проверка делается каждый раз перед выполнением операторов цикла. Цикл может ни разу не выполниться, если его условие ложно.

На рисунке показано два варианта записи данной структуры на языке программирования Паскаль:
Задачи на циклы Паскаль
Задание 1. Даны два положительных числа A и B (A > B). На отрезке длины A размещено максимально возможное количество отрезков длины B (без
наложений). Не используя операции умножения и деления, найдите длину незанятой части отрезка A.
Решение:
Вариант 1
Вариант 2 (с подсказками)
Задание 3. Найти сумму ряда чисел с точностью (ε=10**-6).
Решение для 1 ряда:
Формула текущего элемента для второго ряда a:=1/(i*(i+1)*(i+2)); для третьего — a:=1/(i*(i+2));
Вычисление суммы ряда с определенной точностью ε означает, что сумма ряда вычисляется до тех пор, пока модуль разности между текущим и предыдущим членом последовательности больше ε. В виде формулы это утверждение можно записать так:|a – aр| > ε, то есть пока это выражение истинно, вычисления продолжаются.
Цикл с постусловием ( repeat )
На рисунке ниже представлена блок-схема цикла с постусловием. Другие названия цикла: цикл-до, цикл с заданным условием окончания работы.
Особенность данного вида цикла ( repeat ) — операторы цикла будут повторяться до тех пор, пока условие ложно. Его проверка делается каждый раз после выполнения операторов цикла. Команды, входящие в тело цикла, всегда выполняются хотя бы один раз.

Задание 2. Дано целое число N (>0). Найти наименьшее целое положительное число K, квадрат которого превосходит N: K 2 > N. Функцию извлечения квадратного корня не использовать.
Внешний вид цикла с параметром в паскале:
Оператор цикла с предусловием выполняет действия заранее неизвестное число раз. Выход из цикла осуществляется, если некоторое логическое выражение или его результат окажется ложным. Так как верность логического выражения проверяется в начале, тело цикла может не выполнится ни одного разу.
Структура цикла с предусловием:
— логическое выражение, истинность которого проверяется вначале выполнения циклического оператора;
— любые выполняемые операторы языка.
Порядок выполнения цикла:
Пока условие истинно выполняется тело цикла. Как только условие становится ложно выполнение цикла прекращается.
Этот оператор аналогичен оператору цикла с предусловием, но отличается от него тем, что проверка условия производится после выполнения тела (действий) цикла. Это обеспечивает его выполнение хотя бы один раз в отличие от ранее разобранных циклов.
Обратите внимание на то, что данный оператор цикла предполагает наличие нескольких операторов в теле цикла, то есть можно выполнять несколько действий, поэтому служебные слова Begin и End не нужны.
Формат записи, структура цикла:
Выводы:
1.Цикл с параметром используется переменная, называемая параметром цикла или счётчиком. Перед выполнением цикла параметру (счётчику) устанавливается начальное значение. После выполнения шага цикла значение параметра увеличивается на единицу. Цикл продолжается до тех пор пока параметр не достигнет своего конечного значения, которое указывается после to (downto).
2. Цикл с предусловием выполняется до тех пор, пока условие выполнения не станет ложным, и продолжается, если условие истинно.
3. Цикл с постусловием выполняется до тех пор, пока условие не станет истинно, если условие ложно, цикл продолжается.
Структура «цикл с предусловием»

На языках программирования структура реализуется так:
| Алгоритмический язык | Бейсик |
| нцпока Кц | DO WHILE LOOP |
| Паскаль | Си |
| while do ; | while ( ) ; |
При решении следующей задачи используется структура цикла с предусловием.
Вводить числа, пока не встретится 0. Определить сумму и количество введенных чисел.

Алгоритмический язык
¦ вывод «Введите число:»
¦ ¦ вывод «Введите число:»
¦ вывод «Сумма чисел=»,s,»их количество=»,k
Бейсик
INPUT «Введите число:»; x
INPUT «Введите число:»; x
PRINT «Сумма чисел=»; s; «их количество=»,k
Паскаль
var s,x:real; k:integer;
writeln(‘Сумма чисел=’,s,’ их количество=’, k);
printf(«Сумма чисел= %e», s);
printf(«их количество= %e»,k);
Структура «цикл с постусловием» (до)
Структура цикла с постусловием также состоит из логического элемента проверки условия Р и функционального блока S – тела цикла.
![]() |
Цикл с постусловием выполняется так: сначала выполняется команда (команды) в теле цикла, затем проверяется условие, т.е. вычисляется значение логического выражения. Если оно ложно, то снова выполняются команды в теле цикла, и так до тех пор, пока значение логического выражения не примет значение истина, после чего выполнение цикла завершается. Необходимо, чтобы в теле цикла существовала команда, влияющая на условие.
Различие между циклами не только в том, что один с постусловием, а другой с предусловием, но и в том, что в цикле с предусловием функциональный блок S может ни разу не выполниться, если условие Р при первой проверке окажется ложным. В цикле с постусловием функциональный блок всегда хотя бы один раз выполнится
На языках программирования структура реализуется так.
Структура цикла с постусловием является дополнительной. Поэтому на некоторых языках программирования для ее реализации нет соответствующего оператора. В частности, нет команды цикла с постусловием в школьном алгоритмическом языке, хотя в других версиях алгоритмического языка данная команда есть.
В языке Си также нет оператора, реализующего данную структуру. Для реализации ее можно использовать оператор:
Рассмотрим задачу, для решения которой можно использовать цикл с постусловием.
Задача. Вычислить сумму ряда 
Решение. Блок-схема










