Програмування циклічних обчислень


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. Установіть на першій кнопці напис Питання 1, на другій – Питання 2, на третій – Спочатку, у полів – порожній текст.
  3. Складіть обробник події OnClick першої кнопки, виконання якого приведе до виведення у вікно повідомлення відповіді на перше запитання задачі.
  4. Виконайте складену процедуру і переконайтеся, що результати її роботи правильні.
  5. Складіть обробник події OnClick другої кнопки, виконання якого приведе до знаходження відповіді на друге запитання задачі та виведення його в окремий напис.
  6. Виконайте складену процедуру та переконайтеся, що результати її роботи правильні.
  7. Складіть обробник події OnClick третьої кнопки, виконання якого приведе до очищення тексту в полях і напису з відповіддю на друге запитання задачі.

3. Створіть у власній папці папку Практична 10 і збережіть у ній проект.

Комментариев нет:

Отправить комментарий