- •Основи програмування мовою Паскаль
- •Часть 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.3 Алгоритми нагромадження суми й добутку
Застосовуються, коли потрібно скласти або перемножити обрані дані. У загальному виді ці широко застосовувані алгоритми можна описати так:
для підрахунку кожної суми або добутку описати по одній змінної того ж типу, що суммируемые або дані, що перемножуються;
до циклу змінної-сумі привласнити початкове значення 0, а добутку – значення1;
у тілі циклу, якщо черговий елемент даних t відповідає умові підсумовування або перемножування, сума накопичується оператором видуs:=s+t;, а добуток – оператором видуp:=p*t;
Очевидно, чому початкове значення добутку – одиниця, а не нуль. Після оператора p:=0;операторp:=p*t;, розташований у тілі циклу, буде повертати тільки нулі.
Пр.Для функції,знайти арифметичне середнє її позитивних значень і добуток ненульових значень.
Для пошуку арифметичного середнього необхідно спочатку знайти суму sі кількістьkпозитивних значень функції. Складемо наступну програму:
var x,f,s,p:real;
k:integer;
begin
s:=0;
k:=0;
p:=1;
x:=-5;
while x<=5+1e-6 do begin
if x<0 then f:=sqr(ln(abs(x)))
else if x>0 then f:=sin(sqr(x))
else f:=0;
if f>0 then begin
s:=s+f;
k:=k+1;
end;
if f<>0 then p:=p*f;
x:=x+0.5;
end;
s:=s/k; {тепер в s - шукане середнє}
writeln ('Середнє позитивних =',s:10:6);
writeln ('Добуток ненульових=',p:10:6);
reset (input); readln;
end.
Пр.Написати програму, що імітує роботу касового апарата: користувач у циклі вводить ціну чергового товару або 0 для завершення введення, програма підсумує ціни. По завершенню циклу введення програма нараховує знижку із загальної вартості товару за правилом:
знижки ні, якщо загальна вартість < 10000 руб.;
знижка = 5%, якщо загальна вартість - від 10000 до 20000 руб.;
знижка = 7%, якщо загальна вартість - понад 20000 руб.
Після нарахування знижки виводиться остаточна вартість покупки.
Позначивши загальну вартість покупки s, а ціну чергового товару –t, напишемо наступну програму:
var s,t:real;
begin
writeln;
s:=0; {початкове значення суми!}
repeat
writeln ('Уведіть вартість товару або 0 для завершення введення:');
{$I-}read(t);{$I+}
if (Ioresult<>0) or (t<0) then begin
writeln ('Помилка! Повторите введення');
continue;
end;
if t=0 then break;
{Округляємо t до 2 знаків після коми - на випадок, якщо є копійки}
t:=Round (t*100) / 100;
s:=s+t; {нагромадження суми!}
until false;
{Нарахування знижки й вивід відповіді}
writeln ('Вартість без знижки:',s:8:2);
if s>20000 then s:=s-s*0.07
else if s>10000 then s:=s-s*0.05;
writeln ('Вартість зі знижкою:',s:8:2);
writeln ('Спасибі за покупку!');
reset (input); readln;
end.
Тип даних realобраний для sіtне випадково – вибірintegerобмежив би діапазон оброблюваних значень і не дозволив у зручному виді ввести копійки. Перевірки коректності введення, що робляться програмою, знайомі по попередніх прикладах і тому не закомментированы.
12. Типові алгоритми пошуку максимуму й мінімуму
У цій главі ми вивчимо найпростіші статистичні алгоритми, головний з яких – визначення максимального й мінімального значення на безлічі даних.
Розглянемо алгоритм у загальному виді:
описати для кожного максимуму й мінімуму по одній змінної того ж типу, що аналізовані дані;
до циклу максимуму привласнюється або свідомо маледля аналізованих даних значення, або перший елемент даних; мінімуму привласнюється абосвідомо великедля аналізованих даних значення, або перший елемент даних;
у тілі циклу кожний підходящий для пошуку елемент даних tобробляється операторами виду: if t>max then max:=t; - для максимуму; if t<min then min:=t;- для мінімуму, де max і min – змінні для максимуму й мінімуму відповідно.
Крок 2 цього алгоритму вимагає коментарів, які ми зробимо на прикладі пошуку максимуму. Очевидно, що сам алгоритм нескладний – кожний елемент даних tпослідовно рівняється з коміркою пам'ятіmaxі, якщо виявлене значенняt, більше поточного значенняmax, воно заноситься вmaxоператоромmax:=t;. Як ми пам'ятаємо, після опису на кроці 1 змінноїmax, її значення ще не визначене, і може виявитися кожним – звідки випливає необхідність завдання початкового значення. Представимо, що після вибору початкового значенняmax, рівного нулю, при аналізі зустрілися тільки негативні значення елементівt. У цьому випадку умоваt>maxне виконається жодного разу й відповіддю будеmax, рівне нулю, що неправильно! Вибірсвідомо малогопочаткового значенняmax(наприклад, значення-1E30, тобто -1030, чи навряд зустрінеться в будь-яких реальних даних) гарантує, що умоваt>maxвиконається хоча б раз і максимум буде знайдений. Альтернативний спосіб – привласнитиmaxзначення окремо обчисленого першого елемента послідовності даних. У цьому випадку відповідь або вже знайдений, якщо перший елемент і є максимальний, або буде знайдений у циклі.
Аналогічні міркування допомагають зрозуміти, чому мінімуму слід привласнювати в якості початкового значення свідомо великечисло.
Перейдемо до прикладів.
Пр.Для функції y(x)=sin2(x),знайти мінімальне серед позитивних і максимальне значення.
Позначивши шукані значення min іmaxвідповідно, складемо наступну програму:
var x,y,max,min:real;
begin
x:=-pi/3;
max:=-2;
min:=2; {ці початкові значення - свідомо мале й велике для синуса}
while x<=pi/3+1e-6 do begin
y:=sqr(sin(x));
if y>0 then {шукаємо min тільки серед позитивних!}
if y<min then min:=y;
if y>max then max:=y;
x:=x+pi/24;
end;
writeln ('Мінімум =',min:8:2);
writeln ('Максимум=',max:8:2);
reset (input); readln;
end.
У наступному прикладі додатково збережемо значення аргументів функції, для яких знайдені мінімум і максимум.
Пр.Послідовність T(k) задана співвідношеннями T(k)=max(sin k, cos k), k=1,2,…,31. Знайти номери максимального й мінімального елементів послідовності.
Пошук номерівне позбавить нас від необхідності пошукузначень. Тому, крім змінних min і max, нам знадобляться дві Цілочисельні змінні для зберігання номерів мінімального й максимального значень, позначимо їх kmin і kmax відповідно. Звернете також увагу, що на кожному кроці циклу додатково буде потрібно знаходити максимальне зі значень sin(k) і cos(k), для занесення його в t.
var t,max,min:real;
k,kmin,kmax:integer;
begin
min:=1e30; {не визначаючи свідомо великого й малого для цих даних значень,}
max:=-1e30;{задаємо "надійні" значення, близькі до плюс і мінус нескінченності}
for k:=1 to 31 do begin
if sin(k)>cos(k) then t:=sin(k)
else t:=cos(k);
if t<min then begin
{ за умовою потрібні 2 оператора - збереження нового хв. значення}
{і збереження номера елемента, звідси операторные дужки!}
min:=t; kmin:=k;
end;
if t>max then begin
max:=t; kmax:=k;
end;
end;
writeln ('Номер хв. елемента =',kmin);
writeln ('Номер макс. елемента=',kmax);
reset (input); readln;
end.