Тема 12. Алгоритми з повтореннями для опрацювання величин.
Цикл із передумовою
Повторення — базова алгоритмічна структура, призначена для організації багаторазового виконання набору команд.
Вираз «багаторазове виконання» означає, що команди будуть виконуватися скінченну кількість разів.
У мовах програмування для опису структури повторення використовують оператори циклу.
Будь-який оператор циклу складається з двох частин:
- Заголовка
- Тіла
- У заголовку циклу записуються умови, за яких виконання циклу триватиме або завершиться
- В тілі циклу містяться команди, виконання яких потрібно повторювати
У програмі цикл може бути реалізований за допомогою конструкцій for, while і repeat.
Цикл із передумовою
У мові програмування Lazarus цикл із передумовою описується оператором while...
Скорочена форма оператора while працює таким чином.
- Визначається значення логічного виразу.
- Якщо це значення True, то виконується команда, записана після службового слова do.
- Якщо значення логічного виразу False, то цикл завершується й управління передається команді, записаній у програмному коді після тіла циклу.
- У тілі циклу обов'язково використовують команду, яка змінюватиме значення величини, що використовується в логічному виразі.
Повна форма оператора while мовою програмування Lazarus передбачає, що після службового слова do будуть виконуватись команди, які містяться між операторними дужками:
begin
end
Компонент ListBox (Список).
Для виведення отримуваних у циклі значень змінних у кілька рядків зручно скористатися компонентом ListBox (Список).
- Компонент Listbox (вкладка Standard на палітрі компонентів) призначений для зберігання й опрацювання текстових даних.
- Кожен рядок Listbox зберігає рядок даних у форматі String.
- Доступ до рядків надає властивість Items цього компонента.
- Для додавання рядка до списку програмним шляхом призначено метод Add. Синтаксис його виклику такий:
ListBox1.Items.Add(‘Новий_рядок');
Наприклад, додати до списку ListBox значення виразу 2 * х:
ListBox1.ltems.Add (IntToStr (2 * х));
- Щоб очистити вміст списку, для елемента керування ListBox викликають метод Clear:
ListBox1.Clear;
- Властивість Count зберігає кількість рядків, доданих до списку.
|
Багаторядкове текстове поле.
Компонент Memo
є вікном редагування багаторядкового тексту.


Властивості компонента Memo

Методи компонента Memo

|
Розробка проектів з використанням циклу із передумовою
Вправа 1. Поки змінна a менше або дорівнює 100, збільшувати значення a на 15 одиниць, значення змінної k для рахунку кількості повторень. Виводити значення змінних як в елемент керування Label так і в елемент керування ListBox (для порівняння особливості виводу інформації за допомогою цих елементів керування)
У процесі вирішення деяких завдань виникає потреба затримки виконання операцій. Для цих цілей нам підійде метод ProcessMessages та функція Sleep (n), де n це число мілісекунд - тривалість паузи.
Для призупинення роботи програми на 500 мілісекунд ми і використаемо процедуру Sleep.
Або для виведення значень змінних a, k застосуємо елемент керування ListBox
Алгоритм проекту

|
Варіант програмного коду
var a, k: Integer; // значення змінної k для рахунку кількості повторень
begin
а := 0; k := 0 // початкові значення а, k
While а <= 100 do // умова продовження циклу
begin
a:= a+ 15; k:= k +1;
Label1.Caption := ' k= ' + IntToStr(k) + ' a = ' + IntToStr(a);
ListBox1.Items.Add(' k= ' + IntToStr(k) + ' a = ' + IntToStr(a));
Application.ProcessMessages; // обробка повідомлень
Sleep(500); // зупинка на 0,5 с
end;
end;
|
Варіант інтерфейсу проекта

|
PS !!!
Виконуючи операції які вимагають тривалих часових затрат, програма не відповідає на дії користувача і не реагує на події додатків, візуальні зміни на формі не відображаються, програма зависає на деякий час. Подібні ситуації можливі в роботі циклів, коли відбувається обробка великого числа даних.
Для того щоб виправити становище, що склалося необхідно використовувати метод ProcessMessages. Даний метод зобов'язує додаток обробити повідомлення які надійшли і які очікують своєї черги.
Вправа 2. Розташуємо на формі компоненти Label і кнопки: "пуск-пауза", "пуск" та "вихід"
За допомогою оператора циклу змусимо перебирати числа від 1 до 1000. І якщо не буде рядка Application.ProcessMessages; - то програма на час зависне поки не видасть кінцевий результат. Тому обробник натискання кнопки (пуск-пауза)повинен бути таким:
Обробник натискання кнопки (пуск-пауза)
procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
begin
i:= 1;
While i<=1000 do
begin
Label1.Caption := 'Значение равно ' +IntToStr(i);
Application.ProcessMessages;
sleep(10);
i:= i + 1;
end;
end;
|
Для порівнянна обробник натискання кнопки (пуск) :
procedure TForm1.Button2Click(Sender: TObject);
var
i: integer;
begin
i:= 1;
While i<=1000 do
begin
Label1.Caption := 'Значение равно ' +IntToStr(i);
sleep(10);
i:= i + 1;
end;
end;
|
Інтерфейс проекту
або 
Цикл While..do. Вправи
Цикл з лічильником
Цикл з післяумовою
Практична робота
|