Цикл с постусловием делфи

Цикл с постусловием делфи

В данном разделе осуществляется изучение операторов цикла языка Delphi, приобретение навыков программирования простых циклических алгоритмов, ввода, компиляции и отладки программ.

На языке Delphiсуществуют три оператора цикла:

Цикл с предусловием (while).

Цикл с постусловием (repeat).

Цикл со счетчиком (for).

Оператор цикла while

Рассмотрим схему алгоритма оператора while(рис. 4.1).

Рис. 4.1. Схема алгоритма оператора while

Условие представляет собой булевское выражение, тело цикла – один простой или составной оператор. Если тело цикла состоит из нескольких операторов, то эти операторы нужно заключать в операторные скобки. Если результат вычисления условия равенtrue(правда), то тело цикла выполняется и снова осуществляется переход к проверке условия. Если результат вычисления условия равенfalse(ложь), то происходит выход из цикла и переход к оператору, следующему за циклическим операторомwhile. Если перед первым выполнением цикла значение выражения былоfalse, тело цикла вообще не выполняется и происходит переход к следующему оператору.

Вычислить сумму нечетных чисел в интервале 0 – 10.

var K, S: integer;

Рассмотрим схему алгоритма оператора for(рис. 4.3).

Рис. 4.3. Схема алгоритма оператора for

В операторе цикла forможно использовать только два значения шага счетчика цикла: либо +1, либо –1. В теле цикла оператораforне допускаются изменения счетчика цикла.

Счетчик цикла увеличивается на 1 при каждом выполнении тела цикла.

Счетчик цикла уменьшается на 1 при каждом выполнении тела цикла.

s1 иs2 – выражения, определяющие соответственно начальное и конечное значения счетчика цикла. Тело цикла – один простой или составной оператор. Счетчик цикла, его начальное и конечное значения должны принадлежать к одному и тому же типу данных.Счетчик цикла может быть только порядкового типа. Не допускается вещественный тип.

Тело цикла не выполнится ни разу, если для оператора for tо начальное значение счетчикаs1 больше конечного значенияs2, а для оператораfordowntoначальное значение счетчикаs1 меньше конечного значенияs2.

Приведённые ниже примеры операторов циклов демонстрируют значения, принимаемые счетчиками циклов в процессе выполнения программы.

fork:= 10to14do10 11 12 13 14

for k := 14 downto 11 do 14 13 12 11

for c := ’a’ to ‘e’ do a b c d e

for c := ’e’ downto ‘a’ do e d c b a

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

Пример программирования циклического алгоритма

Задание. Вычислить сумму целых чисел, значения которых лежат в диапазоне отx1 доx2.

1. Разработка алгоритма (рис. 4.4):

а) входные данные: х1, x2 – целочисленные переменные;

б) выходные данные: s– целочисленная переменная.

Рис. 4.4. Схема алгоритма вычисления суммы чисел

2. Разработка формы (рис. 4.5).

Рис. 4.5. Внешний вид формы

Чтобы сконструировать форму, изменим свойства каждой компоненты соответствующим образом (табл. 4.1).

Цикл — это многократно повторяющаяся последовательность действий. Первый цикл, с которым мы познакомимся в этом уроке называется While. Do (делай пока верно условие).

Синтаксис: Сейчас нам нужно открыть Delphi и создать новый проект. Кидаем на форму компоненты Button и Label:

Создаем на кнопке процедуру OnClick и первое, что нам надо сделать — это ввести переменную A типа Integer: Теперь между ключевыми словами begin и end установим значение переменной A равное 1: И сейчас мы напишем сам цикл, с условием A<>100, то есть пока A не равно 100 будет выполняться цикл.
Если же А = 100 — цикл остановится: Далее, нам нужно что-то сделать в теле цикла. Давайте будем увеличивать значение переменной A на единицу и выводить значение переменной в Label. Вместо комментария (//Тело цикла) мы напишем: Общий вид кода: Компилируем программу, нажимаем на кнопку и видим, что лабел показывает нам сотню. Но почему сразу сотню? Почему не 1,2,3,4 и так до ста. Дело в том, что цикл выполняется на столько быстро, что мы не замечаем как лабел выводит нам сначала 1 потом 2 и потом 3. По этому мы видим только сотню — конечный результат. Кто-то может подумать, что так не интересно :). Хорошо, сейчас сделаем так, чтобы видеть как Delphi выполняет цикл.

Дописываем после строки Вот эти две строчки Они делают следующие:

  • Application.HandleMessage — это метод, позволяющий выводить значения переменных во время работы цикла. Не смотря на то, что мы и так выводим переменную в лабел, этот метод необходим.
  • sleep(100); — функция Sleep() говорит программе, что нужно поспать, как бы заморозиться на какое-то количество миллисекунд. Миллисекунды указываются в скобках. В секунде 1000 миллисекунд.
Читайте также:  Как настроить смартфон после покупки

Общий вид кода: Компилируйте и проверяйте.

С циклом While мы закончили, теперь разберем цикл со счетчиком или другое его название For. To. Do. Данный цикл удобно применять, когда нам точно известно кол-во повторений.

Синтаксис: Этот цикл называется со счетчиком, потому что он сам увеличивает переменную счетчик на единицу.

Первым делом нам нужно добавить переменную S типа Integer. Далее, пишем программу, которая будет считать сумму чисел от 1 до 100.
То есть имеется ряд чисел 1 2 3 4 5 6 7 . 100.
Программа будет складывать эти числа между собой, то есть 1+2+3+4+5+6+7+. +100.

Стираем цикл While и пишем цикл For, но перед ним присвойте переменной S ноль: Этот цикл повторит действия в теле 100 раз.

В тело цикла мы запишем: Программа будет считать сумму чисел от 1 до 100, прибавляя к переменной S переменную счетчик A.

И после цикла выводим результат в лабел.

Общий вид: У цикла For есть цикл двойник, он может считать в обратном порядке. Для этого нужно изменить ключевое слово To на DownTo

Пример той же самой программы, но с обратным счетчиком: Далее. Знакомимся с циклом Repeat.

Синтаксис: Этот цикл сначала выполняет действие, а потом проверяет условие. Цикл выполниться в любом случае хотя бы один раз.

Стираем цикл For в нашей программе и пишем цикл Repeat: Эта программа выполнит тоже самое что и предыдущая.

Ну вот мы и закончили обучение циклам! Сейчас выучим 2 команды для управления ими.

Сразу приведу пример программы, а потом прокомментирую что и как в ней работает: В теле цикла присутствует условие, которое проверяет переменную S. Если S больше 100, то мы экстренно выходим из цикла при помощи команды break, иначе продолжаем цикл командой continue. Пример программы не очень удачный, так как цикл будет работать даже если мы стерем команду continue, но я надеюсь, что суть вы уловили.
Экспериментируйте и всё получится. Жду комментов 😉

Задание на закрепление: напишите программу, которая вычислит сумму двухзначных чисел и выведет ее в Label.

Ну вот и всё! Удачи!
Встретимся в следующем уроке!

Источник: www.thedelphi.ru
Автор: Савельев Александр
Опубликовано: 12 Июля 2012
Просмотров:

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

Сегодня:

Последние:
— 27.12, 20:12 / #6692
— 29.03, 23:32 / #6682
— 30 апреля 2012

Сейчас онлайн:
На сайте — 5
На IRC-канале — 2

Введение

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

Задача

Определить количество натуральных чисел, рассматривая их в порядке возрастания, сумма кубов которых не превышает 50000. Т.е. мы должны последовательно суммировать кубы чисел 1, 2, 3, . и делать это до тех пор, пока сумма не достигнет 50000, а в результате должны узнать, сколько чисел было пройдено.

Понятно, что решить задачу лучше использованием цикла. Но будет ли решение с циклом FOR оптимальным? Конечно, можно задать диапазон пробегаемых значений от 1 до 50000 — количество чисел точно будет найдено (очевидно, это кол-во будет даже менее 50, ведь 50^3 >> 50000). Но в этом случае придётся ставить дополнительное условие на значение суммы и выполнение команды Break.

Есть способ проще!

Цикл WHILE — цикл с предусловием

Цикл WHILE (англ. "пока") — цикл, в котором условие находится перед телом цикла, а сам цикл выполняется до тех пор, пока условие не станет ложным.

В качестве условия задаётся логическое выражение. Те операции, что будут выполняться в цикле, называются телом цикла .

Особенностью цикла с предусловием является то, что он может не выполниться ни разу — это произойдёт, если указанное условие изначально будет ложным. При этом, цикл может и стать "вечным" — если условие никогда не примет значения False. Именно поэтому следует следить за тем, чтобы всегда присутствовали условия для завершения работы цикла.

Решение задачи с помощью цикла WHILE

Вернёмся к нашей задаче. С помощью цикла с предусловием задача решается очень просто. Во-первых, нам потребуется переменная, в которой будет храниться текущее обрабатываемое число — это будут числа 1, 2, 3 и т.д. Во-вторых, ещё одна переменная потребуется для хранения суммы кубов чисел. Всё, этого достаточно. Теперь разберёмся, что писать в теле цикла. Там мы должны: а) увеличивать переменную-счётчик на единицу, чтобы последовательно проходить числа; б) увеличивать сумму на куб текущего числа. Условием цикла будет главное условие нашей задачи — достижение суммой 50000. Вот что получается:

В данном случае процесс "повешен" на кнопку (Button1), а результат выводится в текстовую метку (Label1). Вы спросите, почему выводится i-1, а не само число i ? Всё просто. Ведь переменная-счётчик увеличивается после того, как проверяется условие цикла, а значит и результат получится на единицу больше. Удостовериться в этом можно, добавив в тело цикла вывод промежуточных результатов (в примере — в текстовое поле Memo1):

Читайте также:  Neffos отзывы о смартфонах

Цикл REPEAT — цикл с постусловием

Завершает тройку циклов цикл с постусловием — REPEAT (англ. "повтор"). Примечательно, что этого цикла во многих языках программирования нет — есть только FOR и WHILE. Между тем, цикл с постусловием очень удобен.

Работает цикл точно так же, как и WHILE, но с одним лишь отличием, следующим из его названия — условие цикла располагается после тела цикла, а не до него.

Есть несколько моментов, на которые стоит обратить внимание. Во-первых, в качестве условия задаётся уже условие выхода из цикла, в то время как в цикле WHILE задаётся условие продолжения цикла. Во-вторых, при наличии нескольких команд, которые помещаются в тело цикла, заключать их в блок BEGIN .. END не нужно — зарезервированные слова REPEAT .. UNTIL сами составляют аналогичный блок.

Цикл с постусловием, в отличие от цикла с предусловием, всегда выполняется хотя бы один раз! Но, как и цикл WHILE, при неверно написанном условии цикл станет "вечным".

Решение задачи с помощью цикла REPEAT

Решение нашей задачи практически не изменится — всё останется, только условие будет стоять в конце, а само условие изменится на противоположное:

Команды Break и Continue

Команда Break , выполняющая досрочный выход из цикла, работает не только в цикле FOR, но и в циклах WHILE и REPEAT. Аналогично, команда Continue , немедленно запускающая следующую итерацию цикла, может использоваться в циклах WHILE и REPEAT.

Как остановить цикл?

Очень часто спрашивают, как написать такой цикл, который можно было бы остановить нажатием кнопки на форме, или, к примеру, клавишей [Esc]. В простейшем случае реализовать такой механизм достаточно просто. Однако, данный метод является не совсем верным — есть более удобные и правильные средства для организации таких операций. Тем не менее, рассмотрим пример.

Задание: при нажатии кнопки "Старт" программа начинает генерировать случайные комбинации из латинских букв (верхнего регистра) длиной 10 символов и все эти комбинации отображаются в текстовом поле TMemo. При нажатии кнопки "Стоп" генерация должна быть прекращена.

Каким образом решить поставленную задачу? Сначала сделаем акцент на механизме остановки. Понятно, что в данном случае нужно задать вечный цикл, да-да, самый настоящий, но каким образом предусмотреть его остановку? Очевидно, что выбор падает либо на WHILE, либо на REPEAT. Остановить цикл можно либо изменив значение логического выражения, заданного для цикла, либо вызвав команду Break. Вопрос стоит теперь в том, как при нажатии кнопки "Стоп" изменить условие цикла, описанного в обработчике кнопки "Старт". Ответ прост — использовать ту память, которая доступна обработчикам обеих кнопок. Итак, заведём глобальную переменную, которая будет видна во всей программе. Глобальные переменные описываются над словом implementation модуля, там, где идёт описание формы:

В этой логической переменной мы будем хранить состояние процесса. Изначально будет стоять значение "ложь", а когда пользователь щёлкнет по кнопке "Стоп", мы изменим его в "истина".

На форме разместим Memo1 (TMemo) и 2 кнопки: Button1 ("Старт"), Button2 ("Стоп"). У кнопки "Стоп" поставим Enabled = False, т.е. выключим её.

Сразу приведу обработчики обеих кнопок, после чего подробно разберём их работу:

Начнём с кнопки "Стоп" (Button2). При её нажатии:
1) Значение переменной Stop устанавливается в True, т.е. мы подаём сигнал, что нужно остановиться;
2) Кнопку "Стоп" мы снова выключаем;
3) Кнопку "Старт" — наоборот, включаем.

Теперь кнопка "Старт" (Button1):
1) Кнопка "Стоп" включается, кнопка "Старт" выключается;
2) Переменной Stop присваивается значение False (если этого не сделать, то запустить процесс генерации второй раз будет невозможно);
3) Цикл с генерацией строки с условием на переменную Stop — цикл будет работать до тех пор, пока переменная Stop имеет значение False. Как только значение станет True, цикл сам завершит свою работу.

А теперь более подробно о том, что происходит в теле цикла. Начнём с генерации строки символов. Напомню, что строки можно складывать. Если сложить строку ‘A’ со строкой ‘B’, то получится строка ‘AB’. Именно этот приём здесь и использован. Сначала мы делаем строку пустой, а затем последовательно добавляем в неё 10 произвольных символов. Как происходит добавление. Ну естественно с помощью цикла на 10 итераций. А вот выбор случайной из латинских букв не совсем прост и не для всех очевиден. Конечно, можно было заранее записать все буквы куда-либо (например, в массив, или в другую строковую переменную), а затем брать их оттуда. Но это не совсем хорошо, ведь можно сделать гораздо проще. В данном случае решающим фактором является то, что латинские буквы в кодовой таблице символов идут по порядку. Т.е. ‘A’ имеет некоторый код n, ‘B’ имеет код n+1 и т.д. — весь алфавит идёт последовательно, без разрывов. Убедиться в этом можно с помощью программы "Таблица символов", которая есть в Windows.

Читайте также:  Темы для диплома по программированию

Вернёмся к нашей задаче. Мы должны выбрать случайную из букв ‘A’..’Z’. Так как коды этих символов последовательны, то мы должны выбрать произвольное число от код_символа_A до код_символа_Z. Напомню, что для выбора случайного числа используется функция Random(n), возвращающая случайное число от 0 до n-1. Недостаток функции в том, что она берёт числа всё время от нуля, а код символа ‘A‘ уж явно не 0. Но и здесь ничего сложного нет: сначала узнаём "ширину" диапазона кодов — из кода символа ‘Z‘ вычитаем код символа ‘A‘. Не забываем прибавить 1, иначе буква ‘Z‘ никогда не попадёт в строку, т.к. число берётся от 0 до n-1. Ну и дальше мы делаем сдвиг числа на код символа ‘A‘.
На буквах: от ‘A‘ до ‘Z‘ p позиций. Сама ‘A‘ стоит в позиции n. Очевидно, ‘Z‘ стоит в позиции p+n. Берём случайное число от 0 до p, а прибавив n получаем число из интервала от n до n+p. Простая арифметика, которая не для всех кажется простой.
Итак, код символа мы получили — осталось только добавить соответствующий символ в нашу строку. Функция Chr() возвращает символ с указанным кодом.

Для справки: очень часто, глядя на такой код, говорят, что он неоптимален — мол, коды символов будут постоянно рассчитываться (речь о функции Ord). Однако знающие люди никогда этого не скажут, ведь в Delphi есть маленькая хитрость: компилятор вычислит эти значения ещё на этапе компиляции и в программе они будут просто константами. Т.е. Ord(‘Z’) и Ord(‘A’) в программе не будут считаться никогда — там будут стоять вполне реальные числа, а значит никакого избытка вычислений идти не будет. Более того, даже вычитание будет произведено на этапе компиляции, ведь оба слагаемых являются константами. Мы пишем Ord(‘A’) и Ord(‘Z’) только из-за того, чтобы не лезть в кодовую таблицу, и не смотреть вручную коды этих символов. Кроме того, если вместо этого записать реальные коды, другой человек может испытать затрудение при чтении кода — он ведь не знает, откуда вы взяли эти числа и не помнит всю кодовую таблицу, чтобы определить, каким символам эти числа соответствуют.

Далее полученная строка s добавляется в Memo1 уже известным способом. А вот последняя строка в теле цикла — это маленькая хитрость. В одном из уроков об этой команде уже упоминалось. Дело в том, что при отсутствии этой команды программа просто зависнет с точки зрения пользовательского интерфейса — никаких изменений в Memo видно не будет, да и само окно перестанет реагировать на щелчки. На самом деле, конечно, программа будет работать, в памяти генерация строк будет идти полным ходом. Команда Application.ProcessMessages заставляет приложение обработать всю очередь задач, в том числе по отрисовке окна программы и элементов формы. Если при генерации каждой строки это будет происходить, программа будет выглядеть вполне живой — можно будет легко переместить окно по экрану и, что самое главное, нажать на заветную кнопку "Стоп". Ради эксперимента попробуйте убрать эту строку, и посмотреть, что получится.

Как было сказано ранее, такой способ является не совсем верным. В серьёзных программах программировать процессы таким образом не допускается. Для параллельного выполнения операций, которые не должны мешать друг другу, существуют потоки, т.е. когда процессы работают одновременно, а сама программа при этом ими управляет. У потоков очень много преимуществ — поток можно легко остановить, можно задать его приоритет и др. Работа с потоками достаточно сложна для начинающих программистов, поэтому мы пока ограничимся тем примером, что был приведён выше. В конце концов, наш урок посвящён циклам.

Подводим итог

Итак, мы познакомились с циклами — специальными конструкциями языка для многократного выполнения одних и тех же команд. Как правило, циклы встречаются практически везде, даже в простых на первый взгляд программах. Что уж говорить о каких-либо вычислениях или работе с базами данных.

Автор: Ерёмин А.А.

Статья добавлена: 31 января 2008

Ссылка на основную публикацию
Формула частота в excel
При анализе данных периодически возникает задача подсчитать количество значений, попадающих в заданные интервалы "от и до" (в статистике их называют...
Уравнение плоскости по двум пересекающимся прямым
УСЛОВИЕ: Составить уравнение плоскости, проходящей через две параллельные прямые x-2/3=y+1/2=z-3/-2 x-1/3=y-2/2=z+3/-2 Добавил yelymcheav , просмотры: ☺ 1976 ⌚ 2019-05-14 15:35:56....
Уравнение баланса мощностей формула
При решений электротехнических задач, часто нужно проверить правильность найденных значений. Для этого в науке ТОЭ, существует так называемый баланс мощностей....
Формула тейлора с остатком в форме пеано
Формулировка: Если существует , то представима в следующем виде: Это выражение называется формулой Тейлора с остаточным членом в форме Пеано...
Adblock detector