1. Приклади розв’язків задач з використанням циклів в
Lazarus.
Розглянемо кілька
цікавих і корисних для подальшого вивчення теми задач, в алгоритмах
розв’язування яких використовуються цикли.
Під час
розв’язування багатьох задач доцільно використовувати ще дві арифметичні
операції: знаходження неповної частки та остачі при діленні цілого числа на
натуральне. Нагадаємо, що для будь-якого цілого числа m і натурального
числа n існує єдина пара цілих чисел q і r (0 <= r <
n), таких що m = nq + r. Число q називається неповною
часткою, а число r – остачею. Для знаходження неповної частки
в Lazarus використовується
операція div (англ. divide – поділити), а для
знаходження остачі – mod (англ. modulo – остача від
ділення). Наприклад,
23 div 5 = 4, 23 mod 5 = 3,
28 div 4 = 7, 28
mod 4 = 0,
2 div 3 = 0, 2 mod 3 = 2.
Задача. Дано натуральне число n, більше за 1.
З’ясувати, чи є це число простим.
Нагадаємо, що
простим називається натуральне число, яке має рівно два дільники. Тому можна
перебрати всі натуральні числа від 1 до даного числа і підрахувати кількість
дільників даного числа. Якщо ця кількість дорівнює двом, то це число просте,
якщо більше – не просте. Відповідний фрагмент програми виглядатиме так:
var i, k, n:
Integer;
begin
n := StrToInt (Edit1.Text);
k := 0; //
Кількість дільників числа n
for i := 1 to n do
if n mod i = 0 //Перевірка,
чи є число i дільником числа n
then k := k + 1; {Збільшення на 1 кількості дільників числа n, якщо число i є
його дільником}
if k = 2
then
Label1.Caption := 'просте'
else
Label1.Caption := 'не
просте';
end;
Але час виконання
програми для розв’язування цієї задачі можна суттєво зменшити, якщо врахувати
такі властивості натуральних чисел:
1. Будь-яке
натуральне число, більше за 1, завжди має два дільники (одиницю і саме це число).
Тому простим буде таке натуральне число, яке не матиме інших дільників.
2. Серед
натуральних чисел тільки одне парне число є простим (2), всі інші прості числа –
непарні.
3. Якщо не
враховувати саме число, то у натурального числа немає дільників, які
перевищують арифметичний квадратний корінь з цього числа.
Якщо використати
вказані властивості, то відповідний фрагмент програми може бути таким:
var i, k, n:
Integer; f: Boolean;
begin
n := StrToInt (Edit1.Text);
f := true; {Будемо поки що вважати число n простим, адже дільників у нього поки
що не знайшлося}
if (n mod 2 = 0) and (n <> 2)
then f := false // Якщо число n парне і не дорівнює 2, то воно не просте
else
begin
k := 3; {Якщо
число непарне, то будемо шукати його дільники, починаючи з числа 3}
while (k <= sqrt (n)) and f do {Шукати дільники числа будемо серед чисел, які не
перевищують арифметичний квадратний корінь з числа n, і поки такий
дільник не знайшовся}
if n mod k = 0 //
Перевірка, чи є число k дільником числа n
then f := false
else k := k + 2; {Якщо k не є дільником n, то наступний можливий дільник –
наступне непарне число}
end;
if f
then
Label1.Caption := 'просте'
else
Label1.Caption := 'не
просте';
end;
У наведеному
фрагменті програми використана логічна змінна f. Її значення
визначатиме, чи є число n простим чи ні: true – просте, false –
не просте. Тип логічної змінної в Lazarus позначається Boolean, на честь Джорджа Буля. Для обчислення
арифметичного квадратного кореня використана стандартна функція sqrt (англ.
square root – квадратний корінь).
Задача. Знайти найбільший спільний дільник (НСД) двох
даних натуральних чисел a і b (a > b).
У курсі математики
6-го класу ви навчилися знаходити НСД чисел, розкладаючи їх на прості множники.
Можна скласти програму, в якій реалізується цей метод знаходження НСД.
Але більш простою
виявляється програма, яка реалізує інший метод знаходження НСД, що базується на
такому математичному твердженні:
якщо a >
b, то НСД (a, b) = НСД
(b, r), де r – остача від ділення a на b.
Ідея цього методу
полягає в тому, що послідовно замінюються числа, для яких потрібно знайти НСД:
більше з них замінюється на менше, а менше – на остачу від ділення більшого
числа на менше. Закінчується цей процес замінювання тоді, коли остача від
ділення дорівнює нулю. Тоді НСД дорівнює останній відмінній від 0 остачі від
ділення.
Наприклад,
НСД (80, 12) = НСД (12, 8) = НСД
(8, 4) = НСД (4, 0) = 4,
НСД (125, 54) = НСД (54, 17) = НСД
(17, 3) = НСД (3, 2) = НСД (2, 1) = НСД
(1, 0) = 1.
Цей метод
знаходження НСД називається алгоритмом Евкліда. Перевірте цей метод
знаходження НСД для різних пар натуральних чисел.
Нижче наведено
фрагмент програми, в якому знаходиться НСД двох чисел за алгоритмом Евкліда.
var a, b, r:
Integer;
begin
a := StrToInt (Edit1.Text);
b := StrToInt (Edit2.Text);
r := a mod b;
while r
<> 0 do
begin
a := b;
b := r;
r := a mod b;
end;
Label1.Caption
:= IntToStr (b);
end;
Зверніть увагу, що наведений фрагмент програми працює правильно
і в тих випадках, коли a <= b. Спробуйте самостійно з’ясувати, чому.
Програмування циклічних обчислень.
Увага! Під час роботи з комп’ютером
дотримуйтеся правил безпеки і санітарно-гігієнічних норм.
Завдання:
1. Відкрийте середовище візуального проектування Lazarus.
2. Створіть проект для розв’язування задачі: Перед
початком повені рівень води у річці становив Н м. Під час повені кожну годину
рівень води зростав на Р % від рівня попередньої години. Яким буде рівень води
через N годин після початку повені? Через скільки годин після початку повені
рівень води буде не менше, ніж K м?
- Розмістіть на формі поля для введення початкових даних, написи з текстами, що будуть пояснювати їхні призначення, та три кнопки.
- Установіть на першій кнопці напис Питання 1, на другій – Питання 2, на третій – Спочатку, у полів – порожній текст.
- Складіть обробник події OnClick першої кнопки, виконання якого приведе до виведення у вікно повідомлення відповіді на перше запитання задачі.
- Виконайте складену процедуру і переконайтеся, що результати її роботи правильні.
- Складіть обробник події OnClick другої кнопки, виконання якого приведе до знаходження відповіді на друге запитання задачі та виведення його в окремий напис.
- Виконайте складену процедуру та переконайтеся, що результати її роботи правильні.
- Складіть обробник події OnClick третьої кнопки, виконання якого приведе до очищення тексту в полях і напису з відповіддю на друге запитання задачі.
3. Створіть у власній папці папку Практична 10 і
збережіть у ній проект.
Комментариев нет:
Отправить комментарий