Циклы
Цикл - это многократно повторяющаяся последовательность действий. Первый цикл, с которым мы познакомимся в этом уроке называется While...Do (делай пока верно условие).
Синтаксис:
Сейчас нам нужно открыть Delphi и создать новый проект. Кидаем на форму компоненты Button и Label:
Создаем на кнопке процедуру OnClick и первое, что нам надо сделать - это ввести переменную A типа Integer:
| procedure TForm1.Button1Click(Sender: TObject); |
| var A:integer; |
Теперь между ключевыми словами begin и end установим значение переменной A равное 1:
И сейчас мы напишем сам цикл, с условием A<>100, то есть пока A не равно 100 будет выполняться цикл.
Если же А = 100 - цикл остановится:
Далее, нам нужно что-то сделать в теле цикла. Давайте будем увеличивать значение переменной A на единицу и выводить значение переменной в Label. Вместо комментария (//Тело цикла) мы напишем:
| A:=A+1; |
| Label1.Caption:=IntToStr(A); |
Общий вид кода:
| procedure TForm1.Button1Click(Sender: TObject); |
| var A:integer; |
| begin |
| A:=1; //Присваеваем единицу |
| While A <> 100 do //Пока А не равно 100 - делаем |
| begin |
| A:=a+1; //прибавляяем единицу |
| Label1.Caption:=IntToStr(a); //Выводим значение А |
Компилируем программу, нажимаем на кнопку и видим, что лабел показывает нам сотню. Но почему сразу сотню? Почему не 1,2,3,4 и так до ста. Дело в том, что цикл выполняется на столько быстро, что мы не замечаем как лабел выводит нам сначала 1 потом 2 и потом 3. По этому мы видим только сотню - конечный результат. Кто-то может подумать, что так не интересно :). Хорошо, сейчас сделаем так, чтобы видеть как Delphi выполняет цикл.
Дописываем после строки
| Label1.Caption:=IntToStr(a); |
Вот эти две строчки
| Application.ProcessMessages; |
| sleep(100); |
Они делают следующие:
- Application.HandleMessage - это метод, позволяющий выводить значения переменных во время работы цикла. Не смотря на то, что мы и так выводим переменную в лабел, этот метод необходим.
- sleep(100); - функция Sleep() говорит программе, что нужно поспать, как бы заморозиться на какое-то количество миллисекунд. Миллисекунды указываются в скобках. В секунде 1000 миллисекунд.
Общий вид кода:
| procedure TForm1.Button1Click(Sender: TObject); |
| var A:integer; |
| begin |
| A:=1; //Присваеваем единицу |
| While A <> 100 do //Пока А не равно 100 - делаем |
| begin |
| A:=a+1; //прибавляяем единицу |
| Label1.Caption:=IntToStr(a); //Выводим значение А |
| Application.ProcessMessages; |
| sleep(100); |
Компилируйте и проверяйте.
С циклом While мы закончили, теперь разберем цикл со счетчиком или другое его название For...To...Do. Данный цикл удобно применять, когда нам точно известно кол-во повторений.
Синтаксис:
| For переменная счетчик:=Выражение №1 To выражение №2 Do |
| begin |
Этот цикл называется со счетчиком, потому что он сам увеличивает переменную счетчик на единицу.
Первым делом нам нужно добавить переменную S типа Integer.
| procedure TForm1.Button1Click(Sender: TObject); |
| var A, 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.
И после цикла выводим результат в лабел.
| Label1.Caption:=IntToStr(S); |
Общий вид:
| procedure TForm1.Button1Click(Sender: TObject); |
| var A, S:integer; |
| begin |
| S:=0; //Присваеваем ноль |
| S:=s+a; //Вычисления |
| end; |
| Label1.Caption:=IntToStr(S); |
| end; |
У цикла For есть цикл двойник, он может считать в обратном порядке. Для этого нужно изменить ключевое слово To на DownTo
Пример той же самой программы, но с обратным счетчиком:
| procedure TForm1.Button1Click(Sender: TObject); |
| var A, S:integer; |
| begin |
| S:=0; //Присваеваем ноль |
| For A:=100 downto 1 do |
| begin |
| S:=s+a; //Вычисления |
| end; |
| Label1.Caption:=IntToStr(S); |
| end; |
Далее. Знакомимся с циклом Repeat.
Синтаксис:
Этот цикл сначала выполняет действие, а потом проверяет условие. Цикл выполниться в любом случае хотя бы один раз.
Стираем цикл For в нашей программе и пишем цикл Repeat:
| procedure TForm1.Button1Click(Sender: TObject); |
| var A, S:integer; |
| begin |
| S:=0; //Присваеваем ноль |
| S:=s+a; //Вычисления |
| Until a=100; //цикл будет выполняться пока a не достигнет 100 |
| |
| Label1.Caption:=IntToStr(S); |
Эта программа выполнит тоже самое что и предыдущая.
Ну вот мы и закончили обучение циклам! Сейчас выучим 2 команды для управления ими.
Сразу приведу пример программы, а потом прокомментирую что и как в ней работает:
| procedure TForm1.Button1Click(Sender: TObject); |
| var A, S:integer; |
| begin |
| S:=0; //Присваеваем ноль |
| For A:=1 to 1000 do |
| begin |
| S:=s+a; //Вычисления |
| if S>100 then break else continue; |
| end; |
| Label1.Caption:=IntToStr(S); |
В теле цикла присутствует условие, которое проверяет переменную S. Если S больше 100, то мы экстренно выходим из цикла при помощи команды break, иначе продолжаем цикл командой continue.
Задание на закрепление: напишите программу, которая вычислит сумму двухзначных чисел и выведет ее в Label.