[ЗМІСТ]      [Далі]       [Назад]      [Початок розділу]

 

1.3. Програмування лінійних алгоритмів

 Щойно розглянуті арифметичні алгоритми в силу простоти застосованих тут засобів програмуються практично одним і тим же способом в будь-якій мові програмування. Природним є лише одна незвичайна умова: дійсні ЕОМ, взагалі кажучи, не допускають довільних раціональних чисел, оскільки існує обмеження кінцевого числа значущих цифр. Фактично вигляд допустимих чисел може залежати від типу ЕОМ. Детально ці питання будуть вивчатися пізніше, а зараз ми тільки помітимо, що числа, що належать до цієї обмеженої множини "машинних" раціональних чисел, прийнято називати дійсними, а не раціональними, оскільки вони одночасно є наближеннями для ірраціональних чисел. Тому надалі замість опису рац будемо писати дійсн.

 Відносно натуральних чисел помітимо, що вони, як окрема множина, передбачені не у всіх мовах. Цілі числа виділяються як окрема множина скрізь, але також в певному обмеженому варіанті. Існує декілька варіантів обмежених числових множин кожного з типів. Зараз буде розглянутий тільки один.

 Отже, відкладаючи на подальше питання, пов'язані з можливими ускладненнями, перейдемо до конкретних мов програмування.

 

 Мова програмування Паскаль була першою мовою, в якій знайшли відображення концепції структурного програмування, визначені Дейкстрою і Хоаром. Як такий він являє собою значний крок в розвитку мов програмування. У наш час Паскаль широко застосовується як мова, яка може бути ефективно реалізована, а також як чудовий засіб навчання програмуванню.

 Числові константи записуються звичайним способом. Ідентифікатори складаються з латинських великих і маленьких букв і цифр, причому великі букви ототожнюються з відповідними маленькими, тому, наприклад, Ax, ах, AX і ax - це одна і та ж змінна.

 Визначення символьної константи записується як

 

 const c1 = a1; ...; cn = an;

де n = 1, 2,. ..; c1,. .., cn - ідентифікатори; a1,. .., an - числові константи.

 У системі Турбо-Паскаль є вбудована константа Pi для наближеного представлення числа p.

 Визначення раціональної (дійсної, дивіться зауваження у вступній частини до даного підрозділу) змінної х записується так

 

 var х: real;

цілої z - як

 

 var z: integer;

натуральної n - як

 

 var n: word.

 Скорочення за принципом: замість var х: t; var у: t; пишуть

 var х, у: t;.

 Замість var х: t; var у: s - var х: t; у: s; і так далі тим же способом: перелік змінних одного типу через кому, змінних різних типів - через крапку з комою.

 Обмеження: цілі значення містять числа від -32768 до 32767, натуральні - від 0 до 65535. Тому не будь-яке натуральне число в Паскалі можна замінити цілим еквівалентом!

 Команда введення значення змінної х має вигляд

 

 read(х);

виведення виразу е -

 

 write(е).

 Команди, об'єднані в ланцюг, відділяються одна від одної крапкою з комою. Стандартні скорочення read(х, у,. .., z) замість

 

 read(х); read (у); ...; read (z)

і write(u, v,. .., w) - замість

 

 write(u); write(v); ...; write(w).

 Для введення даних використовується клавіатура персонального комп'ютера. При цьому, користувач програми розділяє значення величин, що вводяться, пропусками.

 Оскільки процеси введення і виведення відображаються на екрані дисплею, який поділений на рядки, маємо дві нові команди, виконання яких не впливає на алгоритм. Це readln - перейти на новий рядок екрана при введенні і writeln - при виведенні.

 Ще одне скорочення readln(х, у,. .., z) замість

 

 read(х); read(у); ...; read(z); readln

і writeln(u, v,. .., w) - замість

 

 write(u); write(v); ...; write(w); writeln.

 При обчисленні арифметичних виразів над даними цілого або натурального типу використовуються операції і функції з множини {+, -, *, div, mod, abs, sqr}, де abs(х) - модуль числа х, а sqr(х) - квадрат числа x. Над полем дійсних чисел визначені операції і функції з множини {+, -, *, /, abs, sqr, sqrt, sin, cos, ln, exp, arctan}, де sqrt(х) - квадратний корінь з х, sin(х) - синус х, cos(х) - косинус х, ln(х) - натуральний логарифм від х, exp(х) - експонента від х, arctan(х) - арктангенс х.

 Команда (узагальненого) присвоєння записується як

 

 х:= е.

 У тексті програми можуть стояти коментарі, які беруться у такі {...} або такі (*...*) дужки.

 Загальний вигляд програми у мові Паскаль видно з розглянутих нижче прикладів.

 Приклад 1P. Обчислення квадратного тричлена (задача 1.1).

 program Trinomial;

 var a, b, c, х, у: real;

 begin

 readln(a, b, c);

 readln(х);

 у:= (а*х+b)*х+c;

 writeln(у);

 end.

 

 Програма Trinomial, правильна з точки зору обчислення шуканої величини, не витримує ніякої критики з точки зору форми подачі результату. Нехай, як це було в п.1.2.2, а=1, b=3, c=-2, х=-1. Відповідь хотілося б отримати на екрані, наприклад, в такому повному вигляді:

 

а*х^2+b*х+c = -4,

при а= 1, b= 3, c= -2, х= -1.

У такому випадку замість writeln(у) доведеться записати

 

 writeln(' а*х^2+b*х+c = ', у);

 writeln(' при а= ', a,' b= ', b,' с= ', c,' х= ', х).

 Тексти, записані в апострофах, просто переносяться на екран, чергуючись з відповідними числами. Цей же прийом можна використати для перетворення процесу введення даних з монолога у діалог, що істотно його полегшує.

 Перш ніж навести остаточний текст програми, останнє зауваження. Спробувавши виконати програму Trinomial при заданих значеннях на ЕОМ, ви можете отримати наприклад

 -4.0000000000Е+00.

 Не дуже дивуйтеся, це стандартний формат зображення дійсного числа. Його точне значення проясниться пізніше. А зараз домовимося вказувати кількість позицій на екрані - поле, відведене для запису числа, і кількість цифр в його дробовій частині. Незначущі нулі на початку поля замінюються пропусками.

 Остаточний варіант програми.

 

 program Trinomial; { кінцева версія }

 var a, b, c, х, у: real;

 begin

 { Діалог при введенні значень аргументів }

 write('a, b, c =?'); readln(a, b, c);

 write('х =?'); readln(х);

 у:= (а*х+b)*х+c;

 writeln(' а*х^2+b*х+c = ', у:4:1);

 writeln(' при а= ', a:4:1,

 ' b= ', b:4:1,

 ' с= ', c:4:1,

 ' х= ', х:4:1)

 end.

 

 Приклад 2P. Період коливань маятника (задача 1.3).

 program Period;

 const G = 981;

 var L, Т: real;

 begin

 write(' Довжина маятника =?'); readln(L);

 Т:= 2*Pi*sqrt(L/G);

 writeln(' Період коливань маятника довжини ', L,' = ', Т)

 end.

 

 У мові Сі спосіб запису числових констант - стандартний. Великі і маленькі літери розрізнюються, отже Ax, ах, AX і ax – це різні змінні. Взагалі у мові Сі прийнято позначати імена змінних маленькими літерами, а імена констант – великими.

 Визначення символьної константи записується як

 

#define c1 a1

...

#define cn an

де n = 1, 2,. ..; c1,. .., cn - ідентифікатори; a1,. .., an - числові константи.

 Визначення раціональної (дійсної, дивіться зауваження у вступній частини до даного підрозділу) змінної х записується так

 

 double х;

цілої z - як

 

 int z;

натуральної n - як

 

 unsigned n;.

 Скорочення за принципом: замість t х; t у; пишуть

 

 t х, у;.

 Вигляд команд введення та виведення у Сі залежить від типу змінної. Наприклад, команда введення цілої змінної х має вигляд

 

 scanf(“%d”,&х);

виведення дійсного виразу е -

 

 printf(“%lf”,е);.

Взагалі, при введенні та виведенні у printf та scanf спочатку вказують рядок форматів. Рядок складається з елементів форматів та інших символів. Елементи формату вказують, змінні яких типів повинні вводитись або виводитись. Кожен елемент формату починається символом „%”, за яким йдуть один або декілька символів. Кількість елементів формату повинна відповідати кількості змінних, що вводяться та виводяться.

Для типу double застосовують елемент формату %lf, для int - %d, для unsigned - %u.

      Для введення декількох змінних x1, … , xn будемо використовувати

 

scanf(“%p1 %p2 … %pn”,&х1,&x2, … ,&xn);,

де p1, p2, … , pn – елементи формату для типів змінних x1, x2, … , xn. Призначення символу “&” (читається - амперсанд) при введенні буде розглянуто пізніше.

      Для виведення декількох виразів e1, … , en будемо використовувати

 

printf(“%p1 %p2 … %pn”,e1,e2, … ,en);,

де p1, p2, … , pn – елементи формату для типів виразів e1, e2, … , en.

При введенні даних, користувач програми розділяє значення величин, що вводяться, пропусками.

Команда введення scanf у Сі є аналогом readln у Паскалі, а команда виведення printf – аналогом write у Паскалі. Для переходу на новий рядок при виведенні, треба у рядку форматів вказати „\n.

При обчисленні арифметичних виразів над даними цілого або натурального типу використовуються операції з множини {+, -, *, /, %}. Над полем дійсних чисел визначені операції з множини {+, -, *, /}. Отже, символ “/” позначає ділення для дійсних, натуральних та цілих даних, але для натуральних та цілих “/” означає цілочисельне ділення з остачею.

Команда (узагальненого) присвоєння записується як

 

 x = е;.

У мові Сі є також спеціальні випадки присвоєнь, які допускають скорочення:

 

замість i = i + 1;            i++; або ++i;

замість i = i - 1;            i--; або --i;

замість x = x + y;            x += y;

замість x = x - y;            x -= y;

замість x = x * y;            x *= y;

замість x = x / y;            x /= y;.

 

Особливістю Сі є те, що присвоєння сприймається не тільки як команда, але й як вираз, значенням якого є значення змінної в лівій частині присвоєння після його виконання. Така інтерпретація присвоєння робить можливими, зокрема, команди виду: a = b = c = 0; для присвоєння всім змінним a, b та c значення 0. Присвоєння має нижчий пріоритет у порівнянніз арифметичними операціями.

Кожна команда у Сі завершується крапкою з комою („;”). Тому команди, об'єднані в ланцюг, просто записуються послідовно.

У тексті програми можуть стояти коментарі, які беруться у символи /*...*/.

Загальний вигляд програми у мові Сі видно з розглянутих нижче прикладів.

Приклад 1C. Обчислення квадратного тричлена (задача 1.1).

#include <stdio.h>

/* Trinomial*/

main()

{

 double a, b, c, х, у;

 

 printf(“a, b, c =?”); scanf(“%lf %lf %lf”, &a, &b, &c);

 printf(“x =?”); scanf(“%lf”, &x);

 у = (а*х+b)*х+c;

 printf(“y=%lf”, y);

}

 

Як видно з розглянутого прикладу, програма починається рядком

#include <stdio.h>.

Докладно призначення його буде розглянуто пізніше, а поки що зауважимо, що цей рядок означає підключення стандартної бібліотеки функцій. Програма у Сі не має також власного імені, як це було для алгоритмічної мови або Паскаля. Усі програми поки що будуть називатись “main”. Для того, щоб пов’язати програму з раніше розглянутими прикладами у алгоритмічній мові або Паскалі, будемо використовувати коментар.

 Приклад 2C. Період коливань маятника (задача 1.3).

#include <stdio.h>

#include <math.h>

/* Period */

#define G 981

#define Pi 3.1415926

main()

{

 double l, t;

 

 printf(“ Довжина маятника =?”); scanf(“%lf”,&l);

 t = 2*Pi*sqrt(l/G);

 printf(“ Період коливань маятника довжини %lf = %lf”, l, t);

}

 

[ЗМІСТ]      [Далі]       [Назад]      [Початок розділу]