Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Posibnyk_C.doc
Скачиваний:
23
Добавлен:
03.11.2018
Размер:
1.56 Mб
Скачать

4 Елементарні алгоритми

4.1 Лiнiйна програма

Лiнiйною називається програма, яка виконується в тiй послiдовностi, в якiй записанi її оператори, вона не має ні розгалужень, ні переходiв, ні повторень. Найпростіша лiнiйна програма може складатися з директив препроцесору, оголошень даних, операторiв-виразiв i функцiй вводу-виводу. В чистому вигляді лінійна програма застосовується порівняно рідко, бо тоді ефективність використання комп’ютера найнижча.

Покажемо програму цього типу на прикладі. Нехай потрібно обчислити висоту зубців ht шарошкового долота типу В-93Т після відпрацювання ним t одиниць часу. Зменшення висоти зубців долота в часі обчислюється за формулою [3], де k = 4,14, а ω = -1,94.

Приступаючи до побудови алгоритму, простежимо хід виконання роботи. Зрозуміло, що всі змінні повинні бути ініціалізовані (задані в програмі) перш, ніж будуть використані для обчислень. Змінним k і ω – присвоїмо значення відповідних констант. Конкретне значення t не задано, тому забезпечимо його ввід з клавіатури під час виконання програми. Після обчислення ht його значення буде знаходитися у відповідній комірці пам’яті, для його візуального спостереження передбачимо вивід результату на екран. Виведемо й значення змінної t для візуальної перевірки правильності її вводу.

Графічний алгоритм програми показано на рисунку 4.1. Вiн має лiнiйний тип i складається з шести символів, першим з яких є “Початок”, а останнiм “Кiнець”. Знаки, якi знаходяться мiж ними, вiдповiдають послiдовностi рiшення задачi: присвоєння числових значень змiнним k i ω (блок 2), ввід значення змінної t (блок 3), обчислення заданого виразу i присвоєння його значення змiннiй ht (блок 4) та її вивiд на екран (блок 5).

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

Форма і розміри символів графічного алгоритму стандартизовані, вони вважаються загальноприйнятими в усьому світі. За формою значка можна визначити тип дії, яку він символізує. Наприклад, початок і кінець позначається двома паралельними лініями, заокругленнями з боків, операції вводу-виводу – паралелограмом та ін.

Написи, які визначають вид роботи в кожному символі алгоритму, повинні бути чіткими й лаконічними, проте зрозумілими. Всі символи повинні мати однакові розміри, тому не варто застосовувати надто довгі написи. Якщо напис не поміщається в символі, то його слід скоротити, а в тексті або в підрисунковому написі дати відповідні пояснення, як це, наприклад, зроблено під рисунком 4.1 для f(t).

Таблиця 4.1 Ідентифікатори змінних лінійної програми

Ім’я змінної

у формулі

Ідентифікатор

у програмі

Найменування

ht

ht

висота зубців долота

t

t

кількість годин роботи долота

k = 4,14

k

постійний коєфіцієнт

ω = -1,94

omega

постійний коєфіцієнт

Перед складанням програми замінимо імена змінних заданої вище формули на ідентифікатори, результати заміни показані в таблиці 4.1. Зауважимо, що мова С не має ні надрядкових, ні підрядкових індексів, тому ідентифікатор ht містить дві букви однакових розмірів. Ім’я змінної ω – грецька буква, яка не належить до алфавіту мови С тому вона позначена ідентифікатором omega.

Нижче подано текст програми, яка реалізовує цей алгоритм.

#include<math.h>

#include<stdio.h>

int main(void)

{

const float k=4.14, omega=-1.94;

float ht, t;

scanf("%f", &t);

ht=k*exp(omega*pow(t, 2));

printf("%f%f", ht, t);

return(0);

}

Її можна умовно подiлити на такі двi частини: директиви препроцесору i головна функцiя. Тут є двi директиви. В першiй мiститься вказiвка компiлятору пiд’єднати до програми файл math.h, в якому знаходяться описи математичних функцiй, зокрема, pow() – пiднесення до степеня та exp() – експоненти. В другій – вимога під’єднати до програми файл stdio.h з функціями вводу-виводу. В цьому файлі містяться стандартні функції scanf() і printf(), які й використовуються в нашій програмі, та інші.

Головна функцiя main() являє собою блок, взятий у фiгурнi дужки. Вона починається з оголошення іменованих констант k i omega за допомогою модифікатора const. Він не обов’язковий, але його застосування дозволяє програмісту страхуватися від помилок, наприклад, від випадкової спроби змінити значення констант. Оскільки ці константи є дійсними числами, для них відводиться по одній комірці пам’яті типу float. Вони ініціалізовані під час оголошення – константа k числом 4.14, а omega – -1.94. Є ще й інша причина для надання типу float константам k i omega. Справа в тому, що вони застосовуються в заданому постановкою задачі виразі разом з дісними числами і результат обчислень (ht) буде дісним числом типу float. Якби ці константи мали інший тип, наприклад, не мали дробової частини та виглядали як цілі числа і їм присвоїли тип int, то компілятор змушений був би привести їх до єдиного типу float, а це додало б йому зайвої роботи. Крім того, іноді компілятор може повестися непередбачливо, тому в подібних випадках слід самому контролювати типи даних та їх перетворення.

Змінні ht i t – теж дійсні числа, тому для них теж відводиться по одній комірці пам’яті типу float за допомогою оголошення, яке знаходиться в наступному рядку. Ці числа порівняно короткі і для їх запам’ятовування достатньо типу float.

У наступному рядку програми маємо виклик функції scanf("%f",&t); Вона призначена для вводу значення змінної t під час виконання програми. Функція scanf() має два види параметрів, розділені комою. Першим є перелік специфікаторів форматів (в нашому випадку – f, бо змінна t має тип float), яким передують символи %. У прикладі цей перелік обрамлений подвійними лапками. Далі через кому дається перелік адрес змінних, які підлягають введенню, в нашому прикладі це адреса змінної t. Під час виконання програми функція scanf() її зупиняє, на екрані появляється курсор і комп’ютер очікує вводу числа.

Наступним оператором є оператор-вираз, призначений для обчислення i занесення в оперативну пам’ять значення змiнної ht. Він складається зi знака присвоєння, злiва вiд нього маємо iм’я змiнної ht, яка одержує значення виразу, що розмiщений зправа. Права частина цього оператора містить знаки операції множення * (зірочка) і дві функції: експоненти exp() та піднесення до степеня pow(). Як видно з таблиці 2.6, мова С не має операції піднесення до степеня, натомість має відповідну функцію. Функція pow() має два параметри, записані через кому: основу степеня дійсного типу і показник – неіменовану константу цілого типу. Деякі компілятори (як у нашому прикладі) дозволяють мати показник дісного типу та навіть ідентифікатор змінної або іменованої константи.

Завершується програма виводом на екран результату ht за допомогою функцiї printf(). Подібно до функції scanf() вона теж має два види параметрів, перший з них відповідає на запитання як виводити, ці параметри обрамлені подвійними лапками. Параметри другого виду записуються вслід за ними через кому, це перелік змінних, що виводяться. У нашому прикладі параметрами першого виду є такі:

  • знак % (процент), який означає, що наступним після нього символом є специфiкатор формату (для змінної ht);

  • специфiкатор формату f (типу float). Зауважимо, що специфікатори форматів функцій scanf() i printf() однакові;

  • ще один знак %, наступним після нього символом теж є специфiкатор формату (для змінної t);

  • специфiкатор формату f (типу float).

Специфікаторами форматів функцій printf() та scanf() можуть бути також такі як d або i – для цілих чисел типу int, c – для однієї літери типу char, s – для рядка (масиву) символів типу char та інші. Завдяки наявності специфікаторів форматів ці функції називаються функціями форматованого вводу-виводу.

До параметрів другого виду належать iмена змiнних ht та t, значення яких будуть виведені.

Кожний оператор програми мовою С закінчується символом ; – крапка з комою. Цей символ обов’язковий, на відміну від інших мов програмування, таких, наприклад, як Pascal, де крапка з комою служить не для закінчення оператора, а для розділювання операторів між собою.

Перед запуском готової програми слід надати їй ім’я, наприклад, назвемо нашу програму doloto.с, та записати її в довготривалу пам’ять.

Запустимо програму на виконання. Програма почне виконуватися, але зупиниться, очікуючи на ввід числа t. Нехай t = 0,8, введемо це число, воно матиме вигляд: 0.8. Нагадаємо, що для розділення цілої і дробової частин дійсного числа мовою С служить крапка.

Результати виконання програми побачимо в такому виглядi:

0.8

1.1961350.800000

Вони вірні, але їх важко читати. По-перше, тут одне число набігає на друге, звичайно, що їх варто якось розділити. Це можна зробити, встановивши потрібну кількість пробілів між специфікаторами форматів функції printf(), наприклад, так: %f %f. Маємо й інший спосіб: застосувати символ \t – горизонтальної табуляції. По-друге, варто вставити якісь слова, текстові константи перед специфікаторами форматів, наприклад, ht= та t=, для пояснення результатів. По-третє, варто обмежити кількість виведених розрядів чисел, для цього можна задавати між символами % та f загальну кількість символів виводу, включаючи десяткову крапку, та число цифр після крапки. Нижче подано варіант програми, де для всього числа t відводиться три цифри, а після крапки – одна; довжина числа ht дорівнює 5, а дробова частина ­ – 3 символи. Задавати довжину чисел або слів особливо вигідно тоді, коли виведені значення необхідно представити як таблицю.

Також хорошим тоном програмування є перевід курсора на новий рядок після кожного виводу за допомогою символа \n, доданого до параметрів функції printf().

З метою перегляду результату рекомендується зупиняти програму під час її виконання в потрібному місці за допомогою якоїсь функції, наприклад, getch(), яка теж знаходиться в файлі stdio.h. Ця функція служить для вводу з клавіатури одного символа, але можна розширити область її застосування. Зупинка програми може бути особливо корисною на стадії її налагодження, пошуку помилки в алгоритмі, коли необхідно проконтролювати хід виконання всіх або частини операторів.

Маємо й інші недоліки. Для того, щоб користувач, який експлуатує програму, знав причину її зупинки, під час роботи функції scanf() доцільно використати функцію printf("Введіть значення змінної t: "); яка видасть на екран відповідне запрошення. Цей прийом буде особливо корисним, якщо матимемо багато вводів різних змінних у різних місцях програми.

У даному випадку застосування функції pow() є невигідним, тут простіше використати операцію множення (вираз t*t), бо вона виконується швидше за функцію піднесення до степеня. Крім того, це дозволяє скоротити текст програми, нижче подано такий її варіант. Звичайно, що тоді не треба під’єднувати й файл math.h за допомогою директиви #include, але тут він залишений, бо маємо ще функцію exp().

У нашому прикладі вигідніше використовувати не модифікатор const для констант, а директиву #define, тоді програма виконається швидше і не потребуватиме окремих комірок пам’яті для запам’ятовування констант.

Як правило, кожна програма містить пояснення, коментарі. Їх можна встановлювати в будь-якому місці: між операторами, на початку або наприкінці програми, вони обрамляються символами /* та */. Коментар ігнорується компілятором і служить лише для підвищення “читабельності” тексту програми. Не слід, однак, захаращувати текст зайвими коментарями. У зміненому варіанті програми додано коментар “Лінійна програма”, будемо тут і надалі користуватися коментарем як назвою для посилання на ту чи іншу програму.

#include<math.h> /* Лінійна програма */

#include<stdio.h>

#define k 4.14

#define omega -1.94

int main(void)

{

float ht, t;

printf("Введіть значення змінної t: "); scanf("%f", &t);

ht=k*exp(omega*t*t);

printf("ht = %5.3f\t t = %3.1f\n", ht, t);

getch();

return(0);

}

Результати, видані програмою Лінійна програма, будуть такими:

Введіть значення змінної t: 0.8

ht = 1.196 t = 0.8

За своїм виглядом вони можуть нас задовільнити, в них враховані всі зауваження, висловлені в ході пояснення попередньої програми. Додамо, що одна й та ж програма, складена різними програмістами, видасть по-різному оформлені результати.

В цьому та всіх інших подібних випадках результати повинні бути ретельно перевіреними шляхом паралельного обчислення за допомогою інших обчислювальних засобів, наприклад, калькулятора.

Запитання для самоперевiрки

  1. Що таке препроцесор?

  2. Що таке директива препроцесору?

  3. Якою мовою пишуться директиви препроцесору?

  4. Яка програма називається лiнiйною?

  5. Задано змінні: int i=010, c=97; Чому після виконання операторів i+=2; c++; printf("і=%i c=%c", i, c); одержимо: i=10 та c=b?

  6. Задано змінну: char i='0'; Чому після виконання операторів: i++; printf("i=%i",i); одержимо: i= 49?

  7. Задано змінні: int i=0, a=0xa; Чому в результаті виклику функції printf("i=%d", i+=a++); одержимо і = 10?

  8. Чим відрiзняються між собою оператори: s=s+1; s+=1; s++;?

  9. Назвiть специфiкатори форматiв функцiї printf().

  10. Назвіть два можливi способи занесення в комiрку x значення 3,27.

  11. Чому у програмi прикладу змiнна t має тип float? Який об’єм пам’ятi вона займає? Хто призначає комiрку пам’ятi для цiєї змiнної i чи можна визначити її фiзичну адресу?

  12. Чому для піднесення до квадрату числа t у програмі прикладу використана функцiя pow()? Назвiть iншi можливостi мови С.

  13. Яке число матимемо в комiрцi float е=2.71828182836405;?

  14. В яких випадках іменовані константи вигідніші від неіменованих?

  15. Який клас пам’яті матиме кожна змінна у програмі прикладу?

  16. Який тип буде мати результат виконання виразу, до якого входять змінні різних типів?

  17. Програма виконала операцію x=2+2; Що побачимо на екрані після виводу значення змінної x за допомогою функції printf()?

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]