- •Основи програмування мовою Паскаль
- •Часть 1. Основы языка Паскаль 2
- •Часть 2. Элементы профессионального программирования на Паскалі 62
- •Частина 1. Основи мови Паскаль
- •1. Алгоритм і програма
- •1.1. Алгоритм
- •1.2. Властивості алгоритму
- •1.3. Форми запису алгоритму
- •1.4. Програма й програмне забезпечення
- •1.5. Етапи розробки програми
- •2. Дані в мові Паскаль
- •2.1 Константи
- •2.2 Змінні й типи змінних
- •3. Арифметичні вирази
- •4. Лінійний обчислювальний процес
- •4.1 Оператор присвоювання
- •4.2 Оператор уведення
- •4.3 Оператор виведення
- •4.4 Керування виводом даних
- •4.5 Вивід на друк
- •5. Структура простої програми на Паскалі
- •6. Компілятор і оболонка Turbo Pascal
- •7. Обчислювальний процес, що розгалужується, і умовний оператор
- •7.4. Короткий умовний оператор
- •If логічний_вираз then оператор1;
- •7.5. Повний умовний оператор
- •If логічний_вираз then оператор1
- •7.7. Вкладені умовні оператори
- •7.9. Приклади програм з умовним оператором
- •8. Директиви компілятора й обробка помилок уведення
- •9. Оператор циклу. Цикли із передумовою і після-умовою
- •10. Цикл із лічильником і дострокове завершення циклів
- •11. Типові алгоритми табулювання функцій, обчислення кількості, суми й добутку
- •11.1 Алгоритм табулювання
- •11.2 Алгоритм організації лічильника
- •11.3 Алгоритми нагромадження суми й добутку
- •12. Типові алгоритми пошуку максимуму й мінімуму
- •13. Розв'язок навчальних завдань на цикли
- •14. Одномірні масиви. Опис, уведення, вивід і обробка масивів на Паскалі
- •15. Розв'язок типових завдань на масиви
- •Частина 2. Елементи професійного програмування на Паскалі
- •16. Кратні цикли
- •16.1 Подвійний цикл і типові завдання на подвійний цикл
- •16.2 Оператор безумовного переходу
- •17. Матриці й типові алгоритми обробки матриць
- •18. Підпрограми
- •18.1 Процедури
- •18.2 Функції
- •18.3 Масиви як параметри підпрограми
- •18.4 Відкриті масиви
- •19. Безлічі й перечислимые типи
- •20. Обробка символьних і строкових даних
- •20.1. Робота із символами
- •20.2 Робота з рядками
- •21. Текстові файли
- •21.1 Загальні операції
- •21.2 Приклади роботи з файлами
- •21.3 Робота з параметрами командного рядка
- •22. Записи. Бінарні файли
- •23. Модулі. Створення модулів
- •23.1. Призначення й структура модулів
- •Implementation
- •23.2. Стандартні модулі Паскаля
- •24. Модуль crt і створення простих інтерфейсів
- •25. Модуль Graph і створення графіки на Паскалі
- •Додаток 1. Таблиці Ascii-Кодів символів для операційних систем dos і Windows
- •Додаток 2. Основні директиви компілятора Паскаля
- •Додаток 3. Основні повідомлення про помилки Паскаля
- •Додаток 4. Додаткові лістинги програм
- •Додаток 5. Розширені коди клавіатури
- •Ascii‑ коди
- •Розширені коди
- •Додаток 6. Правила гарного коду
- •Додаток 7. Рекомендована література
11. Типові алгоритми табулювання функцій, обчислення кількості, суми й добутку
Отже, основне призначення циклів – обробка великого обсягу даних. Математично ця обробка найчастіше зводиться до пошуку, вибору й статистичній обробці потрібних величин. Практично в будь-якім реальнім завданні ми шукаємо максимальні й мінімальні значення в наборі даних, підсумуємо або перемножуємо необхідні дані, визначаємо арифметичне середнє або кількість елементів, що відповідають умові. Для розв'язку всіх цих розповсюджених завдань існують типові алгоритми, що задають правила виконання відповідних розрахунків. Вивченням цих алгоритмів ми займемося в главах 11 і 12.
Зрозуміло, справжні завдання, що встають перед програмістами, значно складніше, чим наведені нижче приклади, але з типових алгоритмів, як із цеглинок, будується будинок будь-якої складної програми.
11.1 Алгоритм табулювання
Застосовується для складання всіляких таблиць, якими можуть бути як абстрактна таблиця значень математичної функції, так і конкретна таблиця вартості товару або платежів, зроблених абонентом стільникового оператора.
У загальному виді алгоритм можна описати так:
до циклу задається початкове значення керуючої змінної, умовою виходу із циклу служить досягнення керуючої змінної кінцевого значення;
у тілі циклу на кожному кроці обчислюється чергове значення функції, що залежить від керуючої змінної, потім формується рядок таблиці:
наприкінці кроку циклу значення керуючої змінної (позначимо її x) змінюється оператором видуx:=x+d;, деd– заданий крок по керуючої змінній.
Пр.Складемо таблицю синусів у межах від 0 до π із кроком по аргументу 0.25. Позначимо аргумент якx, значення синуса відxпозначимо якy. У найпростішому випадку програма табулювання може виглядати так:
var x,y:real;
begin
writeln('x':10,'sin(x)':10);{печатка заголовка таблиці – до циклу}
x:=0; {початкове значення аргументу}
while x<=pi do begin
y:=sin(x); {обчислення функції}
writeln (x:10:2, y:10:2); {печатка рядка таблиці}
x:=x+0.25; {крок по x}
end;
end.
Пр."Розширимо" завдання за рахунок використання довільних границь зміни аргументу й довільного кроку, а також виконання всіх необхідних перевірок коректності. Нехай, наприклад, потрібно скласти таблицю значень наступної функції:
,значення a,b уводяться користувачем.
Напишемо текст програми, супроводивши його відповідними коментарями.
var x,f,a,b,dx:real; {змінні з умови завдання}
n:integer; {лічильник виведених на екран рядків}
begin
repeat {Цикл уведення з контролем правильності значень:
a,dx,b повинні бути числами, dx>0, a+dx повинне бути менше b}
writeln ('Уведіть початкове значення, крок і кінцеве значення:');
{$I-}read (a,dx,b);{$I+}
if Ioresult <> 0 then begin
writeln ('Ви не ввели 3 числових значення, спробуємо ще раз');
continue;
end;
if (dx<=0) or (a+dx>=b) then begin
writeln ('Ви не ввели припустимі дані, спробуємо ще раз');
continue;
end
else break;
until false;
{Печатка заголовка таблиці - робиться один раз до циклу}
writeln;
writeln ('x':10,'f(x)':10);
x:=a;
n:=2; {2 рядка вже зайнятий - порожня й заголовок}
while x<=b+1e-6 do begin
{в умові циклу враховуємо можливу погрішність роботи з real!}
if x<=0 then f:=sqr(x)*x
else f:=exp(1/3*ln(abs(x))); {корінь 3 ступеня побрали через exp і ln}
writeln (x:10:2,f:10:2);
n:=n+1;
if n=24 then begin {На екрані консолі за замовчуванням усього 25 рядків}
write ('Натисніть Enter для продовження...');
reset (input); readln;
n:=1;
end;
x:=x+dx;
end;
writeln ('Таблиця виведена');
reset (input); readln;
end.
Як видне із прикладу, основний порядок дій – такий же, як у попередньому завданні. Тому що екран консолі за замовчуванням містить усього 25 рядків, за допомогою змінної nми додатково контролюємо число вже виведених рядків і робимо по заповненню екрана паузу до натискання користувачем клавішіEnter.
Зрозуміло, інші вивчені нами види циклів також можуть застосовуватися при табулюванні. Розглянемо як приклад наступне завдання:
Пр.Відома вартість одиниці товару. Скласти таблицю вартості 1,2,…,K одиниць товару, значення K уводиться.
Тому що число одиниць товару – свідомо ціле, при програмуванні завдання буде зручний цикл for:
var t:real;
i,k:integer;
begin
writeln;
writeln ('Уведіть вартість одиниці товару:');
read (t);
writeln ('Уведіть кількість одиниць товару для таблиці:');
read (k);
writeln ('Одиниць':10,'Вартість':10);
for i:=1 to k do
writeln (i:10,(i*t):10:2);
end.
Тут для простоти ми виключили зроблені в другому прикладі перевірки. Вартість одиниці товару позначена t, зміннаiнеобхідна для перебору можливих значень одиниць товару в цикліfor. Оскільки лічильник циклуforавтоматично міняється із кроком 1, а операторомwritelnможна виводити не тільки значення змінних, але й вирази, основний цикл програми складається з одного оператора й не має потреби в операторных дужках.