Урок 12. Циклы в Pascal: repeat, while, for
Урок 12. Циклы в Pascal: repeat, while, for
Здравствуйте, дорогие читатели! Вот мы с вами и подошли к изучению циклов. Циклы в Паскаль. Что это такое? Как этим пользоваться? Для чего они нужны? Именно на эти вопросы я сегодня и отвечу.
Если вы читали этот урок, то знаете, что существует три вида алгоритмов: линейный, разветвляющийся и циклический. Мы с вами уже знаем, как реализовывать линейные и разветвляющиеся алгоритмы на Паскале. Приступим к изучению последнего типа алгоритмов.
В языке Pascal, как и в большинстве языков программирования, существует три типа циклических конструкций.
Любой цикл состоит из тела и заголовка. Тело цикла — это набор повторяющихся операторов, а условие — это логическое выражение, в зависимости от результата которого и происходит повторное выполнение цикла.
Возьмем одну задачу, которую будем решать, используя различные виды циклов.
Задача 1. Вывести все числа от 1 до числа, введенного с клавиатуры.
Учитель информатики
§ 3.5 Программирование циклических алгоритмов
Информатика. 8 класса. Босова Л.Л. Оглавление
Ключевые слова:
• while (цикл-ПОКА)
• repeat (цикл-ДО)
• for (цикл с параметром)
3.5.1. Программирование циклов с заданным условием продолжения работы
Цикл с заданным условием продолжения работы (цикл-ПОКА) программируется в языке Паскаль с помощью оператора while. Общий вид оператора:
while <условие> do <оператор>
<условие> — логическое выражение; пока оно истинно, выполняется тело цикла;
<оператор> — простой или составной оператор, с помощью которого записано тело цикла.
Запишем на языке Паскаль рассмотренный в п. 2.4.3 (пример 14) алгоритм получения частного q и остатка r от деления натурального числа х на натуральное число y без использования операции деления.
Каким будет результат выполнения программы при х = -10 и у = 3? Как вы можете объяснить этот результат?
3.5.2. Программирование циклов с заданным условием окончания работы
Цикл с заданным условием окончания работы (цикл-ДО) программируется в языке Паскаль с помощью оператора repeat. Общий вид оператора:
repeat <оператор1; оператор2; …; > until <условие>
<оператор1>; <оператор2>; … — операторы, образующие тело цикла;
<условие> — логическое выражение; если оно ложно, то выполняется тело цикла.
Запишем на языке Паскаль рассмотренный в п. 2.4.3 (пример 17) алгоритм решения задачи о графике тренировок спортсмена.
3.5.3. Программирование циклов с заданным числом повторений
Цикл с заданным числом повторений (цикл-ДЛЯ) программируется в языке Паскаль с помощью оператора for. Его общий вид:
for <параметр>:=<начальное_значение> to <конечное_значение> do <оператор>
<параметр> — переменная целого типа;
<начальное_значение> и <конечное_значение> — выражения того же типа, что и параметр, вычисляемые перед началом цикла;
<оператор> — простой или составной оператор — тело цикла.
При выполнении этого оператора после каждого выполнения тела цикла происходит увеличение на единицу параметра цикла; условием выхода из цикла является превышение параметром конечного значения.
Запишем на языке Паскаль рассмотренный в п. 2.4.3 (пример 19) алгоритм вычисления степени с натуральным показателем n для любого вещественного числа а.
3.5.4. Различные варианты программирования циклического алгоритма
Особенностью программирования является то, что для решения одной и той же задачи могут быть созданы разные программы. Вы могли убедиться в этом, программируя ветвления. Рассмотрим пример, показывающий, что и циклический алгоритм может быть запрограммирован разными способами.
Пример. Напишем программу, в которой осуществляется ввод целых чисел (ввод осуществляется до тех пор, пока не будет введён ноль) и подсчёт количества введённых положительных и отрицательных чисел.
Так как здесь в явном виде задано условие окончания работы, то воспользуемся оператором repeat.
Имеющееся условие окончания работы можно достаточно просто преобразовать в условие продолжения работы — работа продолжается, пока n≠0. И мы можем воспользоваться оператором while:
В рассмотренном примере число повторений тела цикла заранее не известно, и поэтому оператор for здесь применить нельзя. Если число повторений тела цикла известно, то лучше воспользоваться оператором for. Вместе с тем любая задача, в которой число повторений тела цикла определено заранее, может быть запрограммирована с помощью любого из трёх рассмотренных выше циклов.
САМОЕ ГЛАВНОЕ
В языке Паскаль имеются три вида операторов цикла: while (цикл-ПОКА), repeat (цикл-ДО), for (цикл с параметром). Если число повторений тела цикла известно, то лучше воспользоваться оператором for; в остальных случаях используются операторы while и repeat.
Вопросы и задания
1. Ознакомьтесь с материалами презентации к параграфу, содержащейся в электронном приложении к учебнику. Используйте эти материалы при подготовке ответов на вопросы и выполнении заданий.
2. Дана последовательность операторов:
Сколько раз будет повторен цикл и какими будут значения переменных a, b, s после исполнения этой последовательности операторов?
3. Требовалось написать программу вычисления факториала числа n (факториал числа n есть произведение всех целых чисел от 1 до n). Программист торопился и написал программу неправильцо. Ниже приведён фрагмент его программы, в котором содержатся пять ошибок:
Найдите ошибки. Допишите необходимые операторы и выполните программу на компьютере.
4. Проанализируйте следующий цикл:
while a<b do
В чём его особенность?
5. Запишите на языке Паскаль программы решения задач № 25-29 из § 2.4. Используйте оператор while.
6. Дана последовательность операторов:
Сколько раз будет повторён цикл и какими будут значения переменных а, b, s после исполнения этой последовательности операторов?
7. Напишите программу, в которой осуществляется ввод целых чисел (ввод осуществляется до тех пор, пока не будет введён ноль) и подсчёт суммы и среднего арифметического введённых положительных чисел. Используйте оператор repeat.
8. Напишите программу, в которой осуществляется ввод целых чисел (ввод осуществляется до тех пор, пока не будет введён ноль) и определение максимального (наибольшего) из введённых чисел. Используйте оператор repeat.
9. Напишите программу вычисления наибольшего общего делителя двух целых чисел:
а) используйте оператор repeat;
б) используйте оператор while.
10. Сколько раз будет выполнен цикл?
а) for i:=0 to 15 do s:=s+l;
б) for i:=10 to 15 do s:=s+l;
в) for i:=-l to 1 do s:=s+l;
г)for i:=10 to 10 do s:=s+l;
д)k:=5;
for i:=k-l to k+1 do s:=s+l;
11. Напишите программу, которая 10 раз выводит на экран ваши имя и фамилию.
12. Напишите программу, выводящую на экран изображение шахматной доски, где чёрные клетки изображаются звёздочками, а белые — пробелами. Рекомендуемый вид экрана после выполнения программы:
13. Напишите программу, которая вычисляет сумму:
а) первых n натуральных чисел;
б) квадратов первых п натуральных чисел;
в) всех чётных чисел в диапазоне от 1 до n;
г) всех двузначных чисел.
14. Напишите программу, которая генерирует 10 случайных чисел в диапазоне от 1 до 20, выводит эти числа на экран и вычисляет их среднее арифметическое.
15. Запишите на языке Паскаль программы решения задач № 32, 33 из § 2.4. Используйте оператор for.
16. Напишите программу, которая выводит на экран таблицу степеней двойки (от нулевой до десятой). Рекомендуемый вид экрана после выполнения программы:
17. Напишите программу, которая выводит на экран таблицу умножения на n (n — целое число в диапазоне от 2 до 10, вводимое с клавиатуры).
18. Какой из трёх рассмотренных операторов цикла является, по вашему мнению, основным, т. е. таким, что им можно заменить два других? Обоснуйте свою точку зрения.
Цикл do . while()
Как видно из его названия, цикл do . while() похож на while(), но в нем мы сначала выполняем некие операции, а уже потом проверяем условие, поэтому цикл do . while() еще называют циклом с постусловием. Как и в предыдущем цикле действия внутри фигурных скобок (тела цикла) выполняются до тех пор, пока условие возвращает true . Как только условие вернет false , выполнение цикла прекращается, и программа выполняет действия после него.
Цикл do . while() также может стать бесконечным, если вы сформировали условие таким образом, что оно все время возвращает true . Так, как на картинке выше :).
Синтаксис цикла do . while()
Т.е. в отличие от цикла while() цикл do . while() выполнится хотя бы раз даже, если условие вернет false .
В примере ниже мы используем цикл do . while() для того, чтобы показать построчно строчки стихотворения. Здесь мы сочетаем возможности JavaScript с возможностями анимации CSS3, а именно свойств animation и animation-delay , а также директивы @keyframes . С помощью css-свойств мы можем создать анимацию, не задействуя такие методы JavaScript, как setTimeout() или setInterval() , а с помощью цикла — задать задержку animation-delay , которую мы увеличиваем для каждой следующей строки.
Давайте посмотрим пример в действии:
Кстати, при формировании css-стилей для примера, был использован подход с созданием перекрывающего черного полупрозрачного слоя overlay из этой статьи.
Оператор break
Давайте рассмотрим еще один пример do . while() , в котором в условии у нас указано true , т.е. мы все-таки сделаем бесконечный цикл. Необходимо как-то из него найти выход. Для этого в JavaScript существует оператор break (англ. — ломать, нарушать, прерывать), который как раз и предназначен для прерывания цикла. Обычно это осуществляется при выполнении какого-либо условия внутри цикла.
С чего начать?
Изучаем концепции программирования
Прежде чем приступать к изучению алгоритмов, я бы порекомендовал освоить такие понятия программирования, как переменные, функции, классы и особенно понятия объектно-ориентированного программирования (ООП). Это будет вашим фундаментом для понимания более продвинутых концепций из области компьютерных наук.
Осваиваем алгоритмы и их принципы работы
- анализа временной и пространственной сложности;
- терминов “O” большое и “o” малое;
- рекурсии;
- базовых структур данных, таких как массивы, матрицы, связные списки, стеки, очереди, деревья и т. д.;
- основных алгоритмов, таких как алгоритмы поиска и сортировки.
Анализ временной и пространственной сложности — это очень важная тема, которую необходимо освоить, чтобы анализировать алгоритмы. Затем можно перейти к более продвинутым алгоритмам, таким как алгоритмы на графах.
Самое важное — чётко понимать, что происходит внутри алгоритма. Раньше я брал простые примеры и применял алгоритм, чтобы посмотреть, что происходит на каждом его шаге. Проработка примеров помогала мне лучше понять, что происходит в алгоритме, причём мне никогда не приходилось эти алгоритмы запоминать. Если меня попросят написать псевдокод для алгоритма, я смогу легко связать его с примером и проработать его, вместо того чтобы запоминать каждый шаг.
Погружаемся в код с головой
На курсе нам предлагалось реализовать различные структуры данных с нуля, используя основные их операции. Например, двоичные деревья поиска (BST) в C++ с операциями вставки, удаления, поиска, обхода с предварительной выборкой, обхода с отложенной выборкой и обхода с порядковой выборкой. Приходилось создавать класс BST и реализовывать все эти операции в виде функций. Предлагалось даже сравнивать время выполнения определённых операций с различными размерами наборов данных. Это был отличный опыт. Я многому научился благодаря этим занятиям и стал лучше разбираться в операциях. Такой учебный процесс с практическими заданиями помог мне лучше понять концепцию алгоритмов.
Можно начать программировать с языков, поддерживающих ООП. Это легко с очень простыми в освоении языками:
- C++
- Java
- Python
Для новичков один из этих языков будет в самый раз.
[ Сборник задач ]
Тема 10. Работа с циклами
Цикл for позволяет перебирать элементы по индексу или напрямую.
Оба вида циклических структур могут включать условные выражения и специальные «прерыватели»: continue , break .
Для успешного решения заданий необходимо понимать устройство циклов в Python, уметь использовать вложенные циклы, стремиться минимизировать количество итераций (при такой возможности).
Читайте также
Несмотря на то, что и for и while необходимы для повторения некоего количества раз одной и той же операции , циклы отличаются друг от друга и имеют свою специфику. Даже с учетом их формальной взаимозаменяемости.
While удобен тогда, когда повторяющаяся операция проводится до тех пор, пока условие верно, т.е. возвращает True . Отсюда возможна ситуация, когда цикл не сработает ни разу либо будет повторяться бесконечно. Чтобы была возможность применить данный вид цикла для объекта, тот обязан иметь атрибут __bool__() .
Цикл for применяется для последовательного манипулирования с элементами итератора. Другими словами, он проходит по очереди элементы объекта (например, списка) и заканчивается (в общем случае) после их полного перебора.
Таким образом, for удобен для перебора, а while – проверки истинности условия перед каждой итерацией.
Проще всего бесконечный цикл привести на примере цикла while . Так как он проверяет истинность условия, то его искусственно можно сделать таковым всегда.
Пример – Интерактивный режим
—-
>>> while True:
. x = 10
Вместо явного указания True можно использовать любую комбинацию, результирующую в истинность (например, 1 + 1 == 2, 7 > 5 , bool(‘Python’) и т.п.)
Любой код, написанный после данного цикла, не будет достигнут.
Инструкция for редко приводит к возникновению бесконечных циклов. Правда, и ее возможно принудить к бесконечному выполнению.
Пример – Интерактивный режим
—-
>>> from itertools import count
>>> for number in count():
. number += 7
Функция count() последовательно выводит все числа от 1 до бесконечности с шагом 1 (т.е. 1, 2, 3, 4… ) по умолчанию.
Может показаться, что бесконечные циклы никому не нужны. Однако, они достаточно часто применяются (например, окно программы, которое будет показываться до тех пор, пока вы его принудительно не закроете).
3. Сработает ли инструкция else в нижеследующем примере? Поясните ответ.
Пример – IDE
—-
for letter in ‘программист’:
____if letter == ‘П’:
________break
else:
____print(‘Перебор букв в слове закончен’)
Как известно, инструкция else в циклах срабатывает только в том случае, когда цикл не прерван командой break . В нашем примере имеется данная команда. Тем не менее, в слове программист были перебраны все буквы и не найдена заглавная П , которая бы его прервала.
Поэтому ответ очевиден: else сработает. Проверим.
Пример – Интерактивный режим
—-
>>> for letter in ‘программист’:
. if letter == ‘П’:
. break
. else:
. print(‘Перебор букв в слове закончен’)
.
Перебор букв в слове закончен
При исполнении поставленных перед программистом задач важно понимать вычислительную сложность предлагаемого алгоритма решения. Ведь зачастую может случиться так, что алгоритм решения неэффективен (занимает неприемлемое количество времени или операций).
Для этого приходится определять сложность решения « О большое » (асимптотическая нотация, нотация Бахмана-Ландау). Это позволяет понять, насколько оптимален алгоритм.
Так, при переборе элементов множества через цикл for в худшем случае потребуется пройтись по каждому из них. Следовательно, необходимо осуществить количество операций, равное размеру объекта.
В обозначениях асимптотической нотации это выглядит так: O(n) , где n – размер множества.
5*. Замените цикл for в примере ниже на 2 другие структуры (представьте, что for в классическом виде использовать нельзя, но код должен вернуть требуемый результат).
Пример – IDE
——
lst = [2, 4, 5, 8, 9, 13]
for number in range(len(lst)):
____lst[number] *= number
print(lst)
Результат выполнения
—
[0, 4, 10, 24, 36, 65]
Как видно из задания, нам требуется создать новый список, в котором каждое число умножается на его индекс.
Цикл for в приведенном примере легко заменяется списковым включением или функцией map.
1 — Списковое включение
Пример – IDE
—-
lst = [2, 4, 5, 8, 9, 13]
lst = [lst[number] * number for number in range(len(lst))]
print(lst)
Результат выполнения
—-
[0, 4, 10, 24, 36, 65]
2 – Функция map()
2 – Функция map()
Пример – IDE
—-
lst = [2, 4, 5, 8, 9, 13]
lst = list(map(lambda number: number * lst.index(number), lst))
print(lst)
Результат выполнения
—-
[0, 4, 10, 24, 36, 65]
Евгению предоставили строку, состоящую из русских букв разных регистров, и попросили очистить ее от заглавных литер. Как ему показалось, он написал верный код, но результат совсем не порадовал. Ниже представлен пример работы «чистильщика строк», которому срочно требуется ваша помощь.
Пример – IDE
—-
letters = ‘ЫгВЫоЯСремДШНККАыкЩЙФа’
for letter in letters:
____if letter.upper() = letters:
________letters.replace(letter, »)
print(letters)
Анна решила представить некую таблицу с заглавными и строчными буквами русского алфавита в красивом формате. Об этом ее попросили англоязычные друзья из социальных сетей.
Недолго думая девушка создала скрипт, который выполнял подобную операцию. Результат работы программы продемонстрирован ниже. Сможете повторить (в строках с галочками — их 27 штук, чтобы вам не пришлось долго считать)? Для идентичности результатов примените любой моноширинный шрифт (в котором все символы имеют одинаковую ширину).
Для идентификации своего круга проверенных лиц будущий тайный агент (ведь все о чем-то мечтают) Максим решил пускать на свою страничку в Интернете только тех, чьи никнеймы есть в его секретном списке. Он уверен в своих людях (особенно в том, что они по глупости не расскажут никому своё секретное прозвище), как и в том, что имена товарищей невозможно подобрать случайно.
К слову, вот этот список: Мавпродош, Лорнектиф, Древерол, Фиригарпиг, Клодобродыч. По мере увеличения круга знакомых Максим, естественно, дополнит данный список.
Ваша задача такова: повторите код, который будет спрашивать у пользователя его ник и либо пускать на сайт (выведется сообщение Т ы – свой. Приветствую, любезный <НИК_ПОСЕТИТЕЛЯ>! ), либо нет (в этом случае будет такой текст: Тут ничего нет. Еще есть вопросы? . Фактически, будущий супергерой решил поиздеваться над теми, кого нет в его удивительном перечне, так как им будет показываться это сообщение постоянно. Очень коварный замысел!).
Для проверки прозвищ посетителей используйте встроенную функцию input() .
Валентина прогуляла лекцию по математике. Преподаватель решил подшутить над нерадивой студенткой и попросил ее на практическом занятии перечислить все положительные делители некоторых целых чисел. Для несложных примеров студентка быстро нашла решения (для числа 6 это: 1, 2, 3, 6 ; а для числа 16 это: 1, 2, 4, 8, 16 ), но этим все не закончилось. На домашнее задание ей дали варианты посложнее: 23436 , 190187200 , 380457890232 .
Решить такое вручную, как вы понимаете, практически нереально. Вот Валентина и обратилась к вам за помощью. Помогите ей (при помощи функции all_divisors(number) ). Постарайтесь найти самое оптимальное решение. Результат представьте в виде списка (не забудьте отсортировать по возрастанию).
Задача 1. Базовый уровень
Задача 2. Базовый уровень
Если запустить код Евгения, то получаем синтаксическую ошибку. Вот уж действительно горе-ученик.
Что ж, давайте думать, что нужно исправить:
— в условии if явно не хватает второго знака равно, так как мы не присваиваем переменную, а проверяем ее истинность;
– каждую букву в верхнем регистре нужно сравнивать не со всем набором символом, а с одним знаком;
— заменяя буквы на пустые символы мы создаем новую строку, которую никак не сохраняем. В итоге изначальный объект не поменяется. Нужно создать пустую строку и дополнять ее верными символами, пропуская ненужные. А раз требуется сохранить прежнее название строки, то мы переприсвоим исходной вновь полученную.
Задача 3. Базовый уровень
В идеале требуется провести минимум «издевательств» над входящими данными (т.е. над алфавитом). В нашем случае мы просто записали все буквы русского алфавита в строку.
Также, в задаче требовалось понять алгоритм разбиения знаков на 3 столбца.
Задача 4. Базовый уровень
Задача 5. *Продвинутый уровень
Для решения задания важно не просто подойти к делу в лоб. Требуется оптимизация алгоритма для минимизации времени расчета.
Первое, что приходит на ум – простой перебор всех вариантов. Каким бы мощным не был ваш ПК, число в 380 млрд он будет долго итерировать.
Вторая идея – перебрать все числа только до половины искомого числа (и добавить после этого еще и само число в список). Но и этот вариант не особо сокращает время.
Самый оптимальный вариант – перебрать числа до квадратного корня из искомого. Чтобы пояснить решение, приведем пример попроще. Возьмем число 100 . Оно делится на 1 и на само себя. Сразу заносим в список очевидный набор. Затем начинаем с двойки и идем по всем возможным числам. 100 делится на 2 , его заносим в список, но результат (т.е. 100 : 2 = 50 ) также является делителем числа 100 . Его тоже сразу добавляем. Аналогично поступаем далее, находя пары делителей: (4, 25) , (5, 20) , (10, 10) . Итак, мы дошли до корня квадратного из 100 . Число 10 повторяется, поэтому следует его добавить лишь 1 раз. Есть ли смысл идти дальше в поиске делителей? Ведь далее получим такие делители: 20 , 25 , 50 и 100 , но мы их уже занесли в список. Получается, проверка делителей до корня квадратного из любого положительного числа вполне достаточна.
Почему рекурсия лучше вложенных циклов
Когда вложенных циклов мало, то с ними проще: можно контролировать всё вручную. А вот когда циклов становится не три, а 10 или 50, то сильно вырастает вероятность ошибиться в переменной или забыть про какое-то условие. В рекурсии такой проблемы нет: мы один раз описываем, как нырнуть и как оттуда вынырнуть, и всё, остальное компьютер сделает сам.
Ещё бывает такое, что мы заранее не знаем, сколько будет блоков для перестановок — 4 или 40, например. Рекурсия здесь тоже выигрывает: достаточно в одном цикле перебрать все элементы массива, а дальше всё сработает само.
Понятие алгоритма в информатике
В компьютерной сфере все строится на алгоритмах. Без четких указаний, введенных в виде специального кода, не будет работать ни одна техника или программа. На уроках информатики ученикам стараются дать основные понятия алгоритмов, научить пользоваться ими и самостоятельно их создавать.
Создание и использование алгоритмов в информатике — процесс более творческий, чем, например, выполнение указаний к решению задачи в математике.
Существует также специальная программа «Алгоритм», которая помогает людям, несведущим в области программирования, создавать свои собственные программы. Такой ресурс сможет стать незаменимым помощником для тех, кто делает первые шаги в информатике и хочет создавать свои игры или любые другие программы.
С другой стороны, любая программа — алгоритм. Но если алгоритм несет в себе лишь действия, которые нужно выполнять, вставляя свои данные, то программа уже несет в себе готовые данные. Еще одно отличие — это то, что программа может быть запатентована и являться частной собственностью, а алгоритм нет. Алгоритм — понятие более обширное, нежели программа.