You are on page 1of 44

1

ЛАБОРАТОРНА РОБОТА № 1

ВИВЧЕННЯ МОЖЛИВОСТЕЙ СЕРЕДОВИЩА MICROSOFT VISUAL


C++ СТВОРЕННЯ, ТРАНСЛЯЦІЯ ТА НАЛАГОДЖЕННЯ ПРОГРАМ

ЗАГАЛЬНІ ПОЛОЖЕННЯ

Дисципліна «Алгоритмізація та програмування» є дисципліною циклу


професійної та практичної підготовки студентів. В плані підготовки
студентів дисципліна є базовою. Роль і значення дисципліни полягає в
наступному: уміння програмувати є необхідним навиком для всіх
студентів, які вивчають інформатику; навички, що їх отримують
студенти, повинні забезпечити розширення наукового кругозору
майбутнього фахівця, дати можливість успішно оволодіти суміжними
спеціальностями і ефективно застосовувати сучасні інформаційні
технології, тому опанування програмуванням на початку курсу навчання
гарантує, що студенти матимуть потрібні знання під час переходу до
основних і поглиблених дисциплін, споріднених з програмуванням. Ця
дисципліна дає навики та тренінг, необхідний для студентів у їх
майбутній роботі.
Лабораторні роботи розраховані на самостійну і активну діяльність
кожного студента, добрі знання з основ алгоритмізації та
програмування, дискретної та вищої математики.
Під час підготовки до виконання чергової лабораторної роботи
студенти зобов’язані вивчити відповідні матеріали літератури,
що рекомендується, зазначення щодо їх виконання та
відповідний лекційний матеріал.
Для виконання лабораторних робіт використовуються ПЕОМ,
оснащених стандартним набором приладів введення-виведення. До
складу програмного забезпечення входять засоби операційної системи,
стандартні загальносистемні програмні засоби та інструментальні
засоби створення програм.
Завдання для виконання кожної з лабораторних робіт надає керівник.
Студентам може бути запропонована індивідуальна постановка задачі. У
зв’язку із обмеженою кількістю робочих місць студентська група за
рішенням викладача може бути поділена на декілька підгруп.
Перед початком лабораторної роботи викладач проводить інструктаж
з техніки безпеки з розписом студентів у журналі (Дод. А).
Викладач перед початком лабораторної роботи виконує перевірку
підготовленості студентів до її виконання, результати самостійної роботи
та знання з відповідної теми теоретичного матеріалу. При незадовільній
підготовленості студент може бути відсторонений від виконання
лабораторної роботи.
За наслідками виконання лабораторної роботи кожним студентом
оформлюється звіт.
Зміст звіту, зазначення щодо обробки результатів виконання
лабораторної роботи та їхнього оформлення наведено при описі кожної
лабораторної роботи (Див. додатки Б, В, Г).
2

До здачі звіту допускаються студенти, які виконали відповідні роботи і


отримали позитивні оцінки за наслідками їх виконання. За рішенням
викладача, найбільш успішним студентам залік з відповідною оцінкою
може виставлятися за результатами допуску, виконання лабораторної роботи та
оформлення звіту.
Основний зміст лабораторних робіт полягає у виконанні відповідних
завдань:
1. Вивчення теоретичного матеріалу щодо основ алгоритмізації та
програмування з використанням мови С++.
2. Використання можливостей відповідного середовища C++ (IDE)
щодо створення, трансляції та налагодження програм.
3. Ознайомлення із індивідуальним завданням на виконання
відповідної лабораторної роботи.
4. Розробка алгоритму вирішення задачі щодо індивідуального
завдання.
5. Розробка тексту програми у відповідності із розробленим
алгоритмом.
6. Розробка тестових прикладів по налагодженню програми.
7. Використання середовища C++ для створення програми та її
налагодження.

Порядок виконання лабораторної роботи складається з таких


етапів:
1. Подати керівнику занять підготовлену під час самостійної роботи
програму виконання лабораторної роботи, до складу якої входить:
- оформлені розділи звіту у складі: титульного аркушу, мети роботи,
постановки задачі у відповідності із індивідуальним завданням,
алгоритму та тексту програми, тестових прикладів для перевірки
працездатності програми;
- підготовлені програмні документи у складі специфікації та тексту
програми.
2. Введення тексту програми з використанням середовища C++.
3. Виконання операцій з трансляції та налагодження програми.
4. Аналіз отриманих результатів, дооформлення звіту та програмних
документів.
5. Захист звіту перед викладачем.
Звіт з лабораторної роботи повинен складатися з (Додаток В):
- титульного аркуша із зазначенням назви роботи, групи та прізвища
студента, який виконував роботу (Додаток Б);
- мети роботи;
- постановки задачі у відповідності із індивідуальним завданням;
- розділу "Самостійна робота по підготовці до лабораторної роботи" у
складі опису методу вирішення задачі, алгоритму вирішення задачі та
його опису, тексту програми та контрольних прикладів для перевірки
працездатності програми;
- розділу "Виконання експериментів по налагодженню програми" у
складі результатів трансляції та налагодження програми у відповідності
із підготовленими контрольними прикладами;
3

- висновків за результатами виконання лабораторної роботи;


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

1.1 Мета роботи

Вивчення можливостей середовища Microsoft Visual C++. Створення,


трансляція та налагодження програм. Отримання практичних навичок
алгоритмізації задач та створення програм з використанням мови С++.

1.2 Організація самостійної роботи студентів

Під час підготовки до виконання лабораторної роботи необхідно вивчити


індивідуальне завдання (п. 1.3), виконати розробку алгоритму вирішення задачі
та підготовити текст програми щодо реалізації розробленого алгоритму,
підготовити відповідні розділи звіту та вивчити відповідний теоретичний
матеріал, який викладено у лекціях: „Основи мови С++, структура програми,
типи змінних”, „Операції мови С++: арифметичні, збільшення, зменшення,
логічні”, „Керуючі конструкції мови С++” та у наступних підручниках і
навчальних посібниках
При вивченні теоретичного матеріалу необхідно усвідомити, що будь-яка
програма (проект) на Сі складається з файлів. Файли транслюються Сі-
компілятором незалежно одне від одного, а потім поєднуються програмою
-побудовником задач. За наслідками цього створюється файл із програмою,
готовою до виконання. Файли, що містять тексти Сі-програми, називаються
вихідними.
У мові Сі вихідні файли бувають двох типів:
 заголовні, або h-файли;
 файли реалізації, або Сі-файли.
Назви заголовних файлів мають розширення ".h". Назви файлів реалізації
мають розширення ".c" для мови Сі й ".cpp", ".cxx" або ".cc" для мови C++.
Заголовні файли містять тільки описи. Файли реалізації, або Cі-файли, містять
тексти функцій і визначення глобальних змінних. Говорячи спрощено, Сі-
файли містять самі програми, а h-файли - лише інформацію про програми.
Подання вихідних текстів у вигляді заголовних файлів і файлів реалізації
необхідно для створення великих проектів, що мають модульну структуру.
Заголовні файли використовуються для передачі інформації між модулями.
Файли реалізації – це окремі модулі, які розробляються та транслюються
незалежно одне від одного та поєднуються при створенні виконуваної
програми. Файли реалізації підключають заголовні файли за допомогою
директиви препроцесора #include. Самі заголовні файли також можуть
використовувати інші заголовні файли.
Функція є основною структурною одиницею мови Сі. В інших мовах функції
називають підпрограмами. Функція – це фрагмент програми, що може
викликатися з інших програм. Функція звичайно алгоритм, що описується та
реалізується окремо від інших алгоритмів. При виклику функції передаються
4

аргументи, які можуть бути використані в тілі функції. За результатами роботи


функція повертає значення деякого типу.
Розглянемо приклад програми, яка виводить на екран фразу "Hello, World".
#include <stdio.h>

int main() {
printf("Hello, World\n");
return 0;
}

Перший рядок підключає заголовний файл із описом стандартних функцій


введення даних Сі-бібліотеки. У файлі описаний прототип функції printf (друк
за форматом). Виконання програми починається з функції main, яка повертає
після закінченні роботи ціле число (рядок return 0;), що трактується
операційною системою, як код завершення завдання. Число нуль означає
успішне виконання задачі, але програміст може самостійно визначати коди
завершення.
При розгляді типів змінних у C++ варто розрізняти поняття базового типу та
конструкції, що дозволяє будувати нові типи на основі вже побудованих.
Базових типів зовсім небагато – це цілі та дійсні числа, які розрізняються за
діапазонами можливих значень (або по довжині в байтах) та логічний тип
даних. До конструкцій відноситься масив, покажчик та структура, а також клас.
Цілочисельні типи розрізняються по довжині в байтах і по наявності знака.
Їх чотири – char, short, int і long. Крім того, до опису можна додавати
модифікатори unsigned або signed для беззнакових (ненегативних) або знакових
цілих чисел.
Дійсних типів даних два: довгі дійсні числа double (тобто "подвійна
точність") та коротке дійсне число float (тобто "плаваюче"). Дійсне число типу
double займає 8 байтів, типу float – 4 байти. Тип double є основним для
комп'ютера.
У мові C++ уведено логічний тип bool. Змінні типу bool приймають два
значення: false та true. Слова false та true є ключовими словами мови C++.
При вивченні типів даних необхідно звернути увагу на те, як вони
представлені у машинному форматі та особливості їх опису у програмах.
Для створення нових типів у Сі використовуються конструкції масиву,
покажчика та структури.
Опис масиву складається з назви базового типу, назви масиву та його
розміру, що вказується у квадратних дужках. Розмір масиву обов'язково
повинен бути цілочисельною константою або константним виразом.
Наприклад:
int a[10];
char c[256];
double d[1000];
У першому рядку описаний масив цілих чисел з 10 елементів. Необхідно
пам’ятати, що нумерація в Сі завжди починається з нуля, тому індекси
елементів масиву змінюються в межах від 0 до 9. У другому рядку описаний
масив символів з 256 елементів (індекси в межах 0...255), у третьому – масив
дійсних чисел з 1000 елементів (індекси в межах 0...999). Для доступу до
5

елемента масиву вказується ім'я масиву та індекс елемента у квадратних


дужках, наприклад: a[10], c[255], d[123].
Покажчики – це змінні, які зберігають адреси об'єктів. При описі
покажчика треба задати тип об'єктів, адреси яких будуть знаходитися в ньому.
Перед ім'ям покажчика при описі ставиться зірочка, щоб відрізнити його від
звичайної змінної. Приклади описів покажчиків:
int *a, *b, c, d;
char *e;
void *f;
У першому рядку описані покажчики a і b на тип int та прості змінні c та
d типу int (c і d – не є покажчиками!). З покажчиками можливі наступні дві дії:
1. Присвоїти покажчику адресу деякої змінної. Для цього
використовується операція узяття адреси, що позначається амперсендом &.
Наприклад, рядок a = &c; дозволяє покажчику a присвоїти значення адреси
змінної c;
2. Одержати об'єкт, адреса якого записана у покажчику; для цього
використовується операція зірочка «*», що записується перед покажчиком.
Наприклад, рядок d = *a; присвоює змінній d значення цілочисельної змінної,
адреса якої записана в a.
Конструкції масиву та покажчика при описі типу можна застосовувати
багаторазово в довільному порядку. Крім того, можна описувати прототип
функції. У такий спосіб можна будувати складні описи начебто "масив
покажчиків", "покажчик на покажчик", "покажчик на масив", "функція, що
повертає значення типу покажчик", "покажчик на функцію" та інше. Правила
тут такі:
 для угруповання можна використовувати круглі дужки, наприклад, опис
int *(x[10]); означає "масив з 10 елементів типу покажчик на int";
 при відсутності дужок пріоритети конструкцій опису розподілені в
такий спосіб:
o операція * визначення покажчика має найнижчий пріоритет.
Наприклад, опис int *x[10]; означає "масив з 10 елементів типу
покажчик на int". Тут до ім'я змінної x спочатку застосовується
операція визначення масиву [] (квадратні дужки), оскільки вона має
більше високий пріоритет, чим зірочка. Потім до отриманого масиву
застосовується операція визначення покажчика. У результаті виходить
"масив покажчиків", а не покажчик на масив! Якщо нам потрібно
визначити покажчик на масив, то варто використовувати круглі дужки
при описі: int (*x)[10]; Тут до ім'я x спочатку застосовується операція
* визначення покажчика;
o операції визначення масиву [] (квадратні дужки після ім'я) та
визначення функції (круглі дужки після ім'я) мають однаковий
пріоритет, більше високий, ніж зірочка. Приклади:
- int f(); Описано прототип функції f без аргументів, що повертає
значення типу int;
- int (*f())[10]; Описано прототип функції f без аргументів, що
повертає значення типу покажчик на масив з 10 елементів типу
int;
6

 останній приклад не є очевидним. Загальний алгоритм розбору


складного опису можна охарактеризувати як читання зсередини. Спочатку
знаходимо описуване ім'я. Потім визначаємо, яка операція застосовується до
ім'я першої. Якщо немає круглих дужок для угруповання, то це або визначення
покажчика (зірочка ліворуч від імені), або визначення масиву (квадратні дужки
праворуч від імені), або визначення функції (круглі дужки праворуч від імені).
Так виконується перший крок аналізу складного опису. Потім знаходимо
наступну операцію опису, що застосовується до вже виділеної частини
складного опису, та повторюємо це доти, поки не вичерпаємо весь опис.
Розглянемо цей алгоритм на наступному прикладі:
void (*a[100])(int x);
Описується змінна a. До неї спочатку застосовується операція опису
масиву з 100 елементів, далі – визначення покажчика, далі – функція від одного
цілочисельного аргументу x типу int, нарешті – визначення типу, що
повертається, void. Опис читається в такий спосіб:
o a - це
o Масив з 100 елементів типу
o Покажчик на
o Функцію з одним аргументом x типу int, що повертає значення типу
o void.
Нижче розставлені номери операцій у порядку їхнього застосування в
описі змінної a:
void (* a [100])(int x);
5) 3) 1) 2) 4)
Спеціального типу даних рядок у Сі немає. Рядки представляються
масивами символів (а символи – їхніми числовими кодами). Останнім
символом масиву, що представляє рядок, повинен бути символ з нульовим
кодом. Приклад:
char str[10];
str[0] = 'e'; str[1] = '2';
str[2] = 'e'; str[3] = '4';
str[4] = 0;
Описано масив str з 10 символів, що може представляти рядок довжиною
не більше 9, оскільки один елемент повинен бути зарезервований для
завершального нуля. Далі в масив str записується рядок "e2e4". Рядок
завершується нульовим символом. Усього запис рядка використовує 5 перших
елементів масиву str з індексами 0...4. Останні 5 елементів масиву не
використовуються. Масив можна ініціалізувати безпосередньо при описі,
наприклад:
char t[] = "abc";
Тут не вказується у квадратних дужках розмір масиву t, компілятор його
обчислює сам. Після операції присвоювання записана строкова константа "abc",
що заноситься в масив t. У результаті компілятор створює масив t із чотирьох
елементів, оскільки на рядок приділяється 4 байти, включаючи завершальний
7

нуль. Строкові константи записуються у подвійних апострофах, на відміну від


символьних, які записуються в одинарні.
Вирази у Сі складаються зі змінних або констант, до яких застосовуються
різні операції. Для вказівки порядку операцій можна використовувати круглі
дужки.
Відзначимо, що, крім звичайних операцій, таких, як додавання або
множення, у Сі існує ряд операцій, трохи незвичних для початківців.
Наприклад, кома та знак рівняння (оператор присвоювання) є операціями в Сі;
крім операції додавання +, є ще операція збільшити на += та операція
збільшення на одиницю ++. Найчастіше вони дозволяють писати естетично
гарні, але не дуже зрозумілі для починаючих програми.
Втім, ці незвичні операції можна не використовувати, заміняючи їх
традиційними.
До чотирьох звичайних арифметичних операцій додавання +,
відрахування – , множення * та ділення / у Сі додана операція знаходження
остачі від ділення першого цілого числа на друге, котра позначається символом
відсотка %. Пріоритет в операції обчислення остачі % такий же, як і в ділення
або множення. Відзначимо, що операція % перестановочна з операцією зміни
знака (унарним мінусом), наприклад, за наслідками виконання двох рядків
Операція порівняння порівнює два вирази. За наслідками виробляється
логічне значення – true або false залежно від значень виразів. Приклади:
bool res;
int x, y;
res = (x == y); // true, якщо x дорівнює y, інакше false
res = (x == x); // завжди true
res = (2 < 1); // завжди false
Операції порівняння в Сі позначаються в такий спосіб:
== дорівнює, != не дорівнює,
> більше, >= більше або дорівнює,
< менше, <= менше або дорівнює.
Крім звичайних логічних операцій, у Сі є побітові логічні операції, які
виконуються незалежно для кожного окремого біта операндів. Побітові
операції мають наступні позначення:
& побітове логічне додавання ("і")
| побітове логічне множення ("або")
~ побітове логічне заперечення ("не")
^ побітове додавання по модулі 2 (виключне "або")
(Необхідно пам'ятати, що логічні операції множення та додавання
записуються за допомогою подвійних знаків && або ||, а побітові – за
допомогою одинарних.)
В основному побітові операції застосовуються для маніпуляцій з
бітовими масками. Наприклад, нехай ціле число x описує набір ознак деякого
об'єкта, що складає із чотирьох ознак. Назвемо їх умовно A, B, C, D. Нехай за
ознаку A відповідає нульовий біт слова x (біти у двійковому поданні числа
нумеруються з праворуч на ліворуч, починаючи з нуля). Якщо біт дорівнює
одиниці (програмісти говорять біт установлений), то вважається, що об'єкт має
ознаку A. За ознаки B, C, D відповідають біти з номерами 1, 2, 3.
8

Загальноприйнята практика полягає в тому, щоб визначити константи,


відповідальні за відповідні ознаки (їх звичайно називають масками):
const int MASK_A = 1;
const int MASK_B = 2;
const int MASK_C = 4;
const int MASK_D = 8;
Ці константи містять одиницю у відповідному біті та нулі в інших бітах.
Для того щоб перевірити, чи встановлений у слові x біт, що відповідає,
приміром, ознаці D, використовується операція побітового логічного
множення. Число x множиться на константу MASK_D; якщо результат
відмінний від нуля, то біт встановлений, тобто об'єкт має ознаку D, якщо ні, то
не встановлений. Така перевірка реалізується наступним фрагментом:
if ((x & MASK_D) != 0) {
// Біт D установлений у слові x, тобто
// об'єкт має ознаку D
. . .
} else {
// Об'єкт не має ознаку D
. . .
}
При побітовому логічному множенні константа MASK_D обнулює всі
біти слова x, крім біта D, тобто якби вирізує біт D з x. У двійковому поданні це
виглядає так:
x: 0101110110...10*101
MASK_D: 0000000000...001000
x & MASK_D: 0000000000...00*000
Зірочкою тут позначене довільне значення біта D слова x.
Для встановлення біта D у слові x використовується операція побітового
логічного додавання:
x = (x | MASK_D); // Установити біт D у слові x
Частіше це записується з використанням операції типу "збільшити на":
x |= MASK_D; // Установити біт D у слові x
У двійковому представленні це виглядає так:
x: 0101110110...10*101
MASK_D: 0000000000...001000
x | MASK_D: 0101110110...101101
Операція побітового заперечення "~" інвертує біти слова:
x: 0101110110...101101
~
x: 1010001001...010010
Для очищення (тобто установки в нуль) біта D використовується
комбінація операцій побітового заперечення та побітового логічного множення:
x = (x & ~MASK_D); // Очистити біт D у слові x
або, застосовуючи операцію "&=" типу "помножити на":
x &= ~MASK_D; // Очистити біт D у слові x
9

Тут спочатку інвертується маска, що відповідає біту D,


MASK_D: 0000000000...001000
~
MASK_D: 1111111111...110111
у результаті виходять одиниці у всіх бітах, крім біта D. Потім слово x побітно
помножується на інвертовану маску:
x: 0101110110...10*101
~
MASK_D: 1111111111...110111
x & ~MASK_D: 0101110110...100101
У результаті в слові x біт D обнулюється, а інші біти залишаються
незмінними.

Операції зміщення застосовуються до цілочисельних змінних: двійковий


код числа зміщується вправо або вліво на зазначену кількість позицій.
Зміщення вправо позначається двома символами "більше" >>, зміщення вліво –
двома символами "менше" <<. Приклади:
int x, y;
. . .
x = (y >> 3); // Зрушення на 3 позиції вправо
y = (y << 2); // Зрушення на 2 позиції вліво
При зміщенні вліво на k позицій молодші k розрядів результату
встановлюються в нуль. Зміщення вліво на k позицій еквівалентно множенню
на число 2k. Зміщення вправо більше складне, воно по-різному визначається для
беззнакових та знакових чисел. При зміщенні вправо беззнакового числа на k
позицій k старших розрядів, що звільнилися, установлюються в нуль.
Наприклад, у двійковому записі маємо:
unsigned x;
x = 110111000...10110011
x >> 3 = 000110111000...10110
Зміщення вправо на k позицій відповідає цілочисельному діленню на
число 2k. При зміщенні вправо чисел зі знаком відбувається так зване
"розширення знакового розряду". А саме, якщо число позитивне, тобто
старший, або знаковий, розряд числа дорівнює нулю, то відбувається звичайне
зміщення, як і у випадку беззнакових чисел. Якщо ж число негативне, тобто
його старший розряд дорівнює одиниці, то ті розряди, що звільнилися в
результаті зміщення k старших розрядів, установлюються в одиницю. Число,
таким чином, залишається негативним. При k = 1 це відповідає діленню на 2
тільки для негативних чисел, не рівних -1. Для числа -1, всі біти двійкового
коду якого дорівнюють одиниці, зміщення вправо не приводить до його зміни.
Приклад (використовується двійковий запис):
int x;
x = 110111000...10110011
x >> 3 = 111110111000...10110
У програмах краще не покладатися на цю особливість зміщення вправо
для знакових чисел і використовувати конструкції, які свідомо однаково
працюють для знакових та беззнакових чисел. Наприклад, у наступному
фрагменті коду із цілого числа виділяються його складові байти та записуються
10

до цілочисельних змінних x0, x1, x2, x3, молодший байт в x0, старший в x3. При
цьому байти трактуються як позитивні числа. Фрагмент виконується однаково
для знакових та беззнакових чисел:
int x;
int x0, x1, x2, x3;
. . .
x0 = (x & 255);
x1 = ((x >> 8) & 255);
x2 = ((x >> 16) & 255);
x3 = ((x >> 24) & 255);
Тут число 255 відіграє роль маски. При побітовому множенні на цю
маску із цілого числа вирізьблюється його молодший байт, оскільки маска 255
містить одиниці в молодших вісьмох розрядах. Щоб одержати байт числа x з
номером n, n = 0,1,2,3, необхідно спочатку змістити двійковий код x вправо на
8n розрядів, таким чином, байт із номером n стає молодшим. Потім за
допомогою побітового множення вирізьблюється молодший байт.
Керуючі конструкції дозволяють організовувати цикли та розгалуження в
програмах. У Си всього кілька конструкцій, причому половину з них можна не
використовувати (вони реалізуються через інші).
Оператор if ("якщо") дозволяє організувати розгалуження в програмі. Він
має дві форми: оператор "якщо" і оператор "якщо...інакше". Оператор "якщо"
має вигляд:
if (умова)
дія;
оператор "якщо...інакше" має вигляд
if (умова)
дія1;
else
дія2;
Як умову можна використовувати будь-який вираз логічного або цілого
типу. Нагадаємо, що при використанні цілочисельного виразу значенню
"істина" відповідає будь-яке ненульове значення. При виконанні оператора
"якщо" спочатку обчислюється умовний вираз після if. Якщо воно дійсне, то
виконується дія, якщо воно не дійсне, то нічого не відбувається. Наприклад, у
наступному фрагменті в змінну m записується максимальне зі значень змінних
x та y:
double x, y, m;
. . .
m = x;
if (y > x)
m = y;
При виконанні оператора "якщо...інакше" у випадку, коли умова істинна,
виконується дія, що записана після if; у противному випадку виконується дія
після else. Наприклад, попередній фрагмент запишеться в такий спосіб:
double x, y, m;
. . .
11

if (x > y)
m = x;
else
m = y;
Коли треба виконати кілька дій залежно від істинності умови, необхідно
використовувати фігурні дужки, поєднуючи декілька операторів у блок,
наприклад:
double x, y, d;
. . .
if (d > 1.0) {
x /= d;
y /= d;
}
Тут змінні x та y діляться на d тільки в тому випадку, коли значення d
більше одиниці.
Кілька умовних операторів типу "якщо...інакше" можна записувати
послідовно (тобто дія після else можна знову записати умовний оператор). У
результаті реалізується вибір з декількох можливостей. Конструкція вибору
використовується в програмуванні дуже часто. Приклад: є дійсна змінна x,
необхідно записати у дійсну змінну y значення функції sign(x):
sign(x) = -1, при x < 0
sign(x) = 1, при x > 0
sign(x) = 0, при x = 0

Це робиться з використанням конструкції вибору:


double x, s;
. . .
if (x < 0.0) {
s = (-1.0);
}
else if (x > 0.0) {
s = 1.0;
}
else {
s = 0.0;
}
При виконанні цього фрагмента спершу перевіряється умова x < 0.0.
Якщо вона дійсна, то виконується оператор s = (-1.0); інакше перевіряється
друга умова x < 0.0. У випадку його істинності виконується оператор s = 1.0,
інакше виконується оператор s = 0.0. Фігурні дужки тут додані для поліпшення
структурності тексту програми.
У кожному разі, у результаті виконання конструкції вибору виконується
лише один з операторів (можливо, складових). Умови перевіряються
послідовно зверху донизу. Як тільки є дійсна умова, то виконується відповідна
дія і вибір закінчується.
Конструкція циклу "доки" відповідає циклу while:
while (умова)
дія;
12

Цикл while називають циклом із передумовою, оскільки умова


перевіряється перед виконанням тіла циклу. Цикл while виконується в такий
спосіб: спочатку перевіряється умова. Якщо вона дійсна, то виконується дія.
Потім знову перевіряється умова; якщо вона дійсна, то знову повторюється дія,
і так нескінченно. Цикл завершується, коли умова стає помилковою. Приклад:
int n, p;
. . .
p = 1;
while (2*p <= n)
p *= 2;
У результаті виконання цього фрагмента в змінної p буде обчислений
максимальний ступінь двійки, який не переважає цілого позитивного числа n.
Якщо необхідно перервати виконання циклу, то необхідно
використовувати оператор
break;
Оператор застосовується усередині тіла циклу у фігурних дужках.
Приклад: потрібно знайти корінь цілочисельної функції f(x), дійсної для
цілочисельних аргументів.
int f(int x); // Опис прототипу функції
. . .
int x;
. . .
// Шукаємо корінь функції f(x)
x = 0;
while (true) {
if (f(x) == 0) {
break; // Знайшли корінь
}
// Переходимо до наступного цілого значення x
// у порядку 0, -1, 1, -2, 2, -3, 3, ...
if (x >= 0) {
x = (-x - 1);
}
else {
x = (-x);
}
}
// Твердження: f(x) == 0
Тут використовується нескінченний цикл "while (true)". Вихід із циклу
здійснюється за допомогою оператора "break".
Іноді потрібно пропустити виконання тіла циклу при яких-небудь
значеннях змінних у циклі, переходячи до наступного набору значень і чергової
ітерації. Для цього використовується оператор:
continue;
Оператор continue, так само, як і break, використовується лише в тому
випадку, коли тіло циклу складається більш ніж з одного оператора та
вставлено у фігурні дужки. Його варто розуміти як перехід на фігурну дужку,
13

що закриває тіло циклу. Приклад: нехай заданий n+1 крапка на дійсній прямій
x i , i = 0, 1,..., n; крапки x i будуть називатися вузлами інтерполяції.
Елементарний інтерполяційний багаточлен Лагранжа Lk ( x ) – це багаточлен
ступеня n, що приймає нульові значення у всіх вузлах x i , крім x k . В k-ом
вузлі x k багаточлен Lk ( x ) приймає значення 1. Багаточлен Lk ( x )
обчислюється по наступній формулі:

¿ s≠k ¿¿¿ .¿
n
Нехай потрібно обчислити значення елементарного інтерполяційного
багаточлена Lk ( x ) при значенні x = t. Це робиться за допомогою наступного
фрагмента програми:
double x[100]; // Вузли інтерполяції (не більше 100)
int n; // Кількість вузлів інтерполяції
int k; // Номер вузла
double t; // Крапка, у якій обчислюється значення
double L; // Значення багаточлена L_k(x) у t
int i;
. . .
L = 1.0; // Початкове значення добутку
i = 0;
while (i <= n) {
if (i == k) {
++i; // До наступного вузла
continue; // Пропустити k-й множник
}

// Обчислення добутку
L *= (t - x[i]) / (x[k] - x[i]);
++i; // До наступного вузла
}
// Відповідь у змінної L
Тут оператор continue використовується для того, щоб пропустити
обчислення при i = k.
Циклу for має вигляд:
for (ініціалізація; умова продовження; ітератор)
тіло циклу;
Ініціалізація виконується один раз перед першою перевіркою умови
продовження та першим виконанням тіла циклу. Умова продовження
перевіряється перед кожним виконанням тіла циклу. Якщо умова істинна, то
виконується тіло циклу, інакше цикл завершується. Ітератор виконується після
кожного виконання тіла циклу (перед наступною перевіркою умови
продовження).
Оскільки умова продовження перевіряється перед виконанням тіла циклу,
цикл for є, подібно циклу while, циклом із передумовою. Якщо умова
продовження ніколи не виконується, то тіло циклу не виконується жодного
14

разу, що добре як з погляду надійності програми, так і з погляду простоти та


естетики (оскільки не потрібно окремо розглядати виняткові випадки).
Розглянемо приклад підсумовування масиву з використанням циклу for:
double a[100]; // Масив a містить не більше 100 эл-тів
int n; // Реальна довжина масиву a (n <= 100)
double sum; // Змінна для суми эл-тів масиву
int i; // Змінна циклу
. . .
sum = 0.0;
for (i = 0; i < n; ++i) {
sum += a[i]; // Збільшуємо суму на a[i]
}
Тут цілочисельна змінна i використовується як змінна циклу. В
операторі ініціалізації змінної i присвоюється значення 0. Умовою
продовження циклу є умова i<n. Ітератор ++i збільшує змінну i на одиницю.
Таким чином, змінна i послідовно приймає значення 0, 1, 2,..., n-1. Для кожного
значення i виконується тіло циклу.
При вивченні керуючих конструкцій необхідно ознайомитися із логічним
представлення цих конструкцій у вигляді алгоритмів з використанням
графічної мови, що описана у Єдиній системі програмної документації (ЄСПД).

1.3 Варіанти індивідуальних завдань


1. Виконати виведення на екран результатів обчислення функції:
ìï2,3, if x > 2,3;
y =í x2
ï a- , if x £2,3;
î 2

ì a5 + b, if b < 0;
ï 2
ïa + a , if 0 £b £1.5, a ¹ b;
x =í a- b
ïa 3 + ba 2 + b2 , if 1.5 < b < 2.5;
ï
î a , if 2.5 £ b.
4

Змінна a приймає значення від 0 до 5 із кроком 0,5. Змінна b приймає


значення від [ – 2 до 4 ] із кроком 0,1.

2. Виконати виведення на екран результатів обчислення функції:

ì4,1 , if x > 3;
ï
y =í x 3
ïa - , if x £ 3;
î 2

ì a 4 + b, if b < 0;
ï 5
ï 2 a
x =í a + , if 0 £b £ 5, a ¹ b;
a - b
ïa 3 + 4a 2 + b2 , if 5 < b < 8;
ïa5 , if 8 £ b.
î
15

Змінна a приймає значення від 0 до 5 із кроком 0,5. Змінна b приймає


значення від [– 3 до 11] із кроком 0,1.
16

3. Виконати виведення на екран результатів обчислення функції:

ln ( a−c )
P=3 m2 − 3
b +а ;

b= 0,75a2+сm ;

ìln t + d 2
( )
ï , if d > t, t > 1,
ï 3 t 2d
a =í2t sin(d 2 ), if t > 1;
ï
ït 3d, otherwise.
î

Значення d обирається із множини 0 ¿ 5 із кроком 1,1; значення t


обираються із множини 0 ¿ 3 із кроком 0,2; m=3. Значення змінної с задає
користувач з клавіатури.

4. Визначити значення функції:

ì2,35t 2 + b- tx - a 2 , if m > 0;
ï æ b ö
r =í
b ×tg ç ÷, if m £0;
ï
î è 2m ø

ì a sin(x - 3), if b > 0;


ï
t =í ln(c + b)2
, if b < 0, a < 20.
ï
î b2 + a - 4

Значення m обирається із множини – 5 ¿ 5 із кроком 0,5; a= 3; значення


b обирається із множини [– 3 ¿ 3] із кроком 1; c – із множини 0 ¿ 50 із кроком
10. Значення змінних x задає користувач з клавіатури.

5. Визначити значення функції:

ì a
ï , if a ¹ 0 and a ¹ p ;
y =í ln(sin 2 x)
ï 2
îcos(x + a), otherwise;

ìa + b - 3.5c + | b | a, if
ï ( ) b £ 0;
ï a
x =ítgb + , if b > 0.5;
ï3.5ab,b otherwise.
ï
î
17

Значення a обираються із множини 0 ¿ 4 із кроком 0,1, а значення b – із


множини – 2 ¿ 5 з кроком 0,2. Значення змінної с задає користувач з
клавіатури.

6. Визначити значення функції:


2 m
b=0.25 а + с ;

ìln t + d 2 , if d > t, t > 1, d > 1;


( )
ï
ï
a =í td , if t > 1;
ï2
ï
ît d, otherwise.

ln ( a2 −d )
с=3 m− 3 .
a −d
Значення d обираються із множини 0 ¿ 3 із кроком 1, а значення t – із
множини – 0 ¿ 4 із кроком 0,5. Значення змінних m задає користувач з
клавіатури.

7. Визначити значення функції:


3 2 6
√ a−√ a +1
Z= 7
1− √ 3+a .

n 2
y=√ Z
Значення a обираються із множини 0 ¿ 3 із кроком 1,2, значення n
обираються із множини [-56 ¿ 10] із кроком 5,

8. Виконати виведення на екран результатів обчислення функції:

ì25 (a - 24)26 - 45x , if x > 2,3;


ï - 23
y =í æ x 2
ö
ï21 ç a - ÷ , if x £ 2,3;
î è 2ø
ìa5 + 6b, if b < 0;
ï 2 45a
ï
x =í23a + a - b , if 0 £b £1.5, a ¹ b;
ïa8 + 2ba 2 + b8 , if 1.5 < b < 2.5;
ï
îa - 9b + 21ab, if 2.5 £ b.
4

Змінна a приймає значення від 0 до 5 із кроком 0,5. Змінна b приймає


значення від [ – 2 до 4 ] із кроком 0,1.
18

9. Виконати виведення на екран результатів обчислення функції:

ì x - 78
ï x - 56 +1 , if x > 3;
ï
y =í 3

ï ( x - 2)
ïln(4 - x) , if x £ 3;
î

ì a 7 + 45b + ab, if b < - 10;


ï 45a
ï +19a, if - 10 £b < 0;
ï 36b
ï
x =í 5 8a 3 + 41a 2 - 7b9 , if 5 < b < 8;
ïa , if 8 £ b;
5

ï
ï0, otherwise.
ï
î

Змінна a приймає значення від 0 до 5 із кроком 0,5. Змінна b приймає


значення від [– 3…11] із кроком 0,1.

10. Виконати виведення на екран результатів обчислення функції:


b
P=√ √|12−10m|+1−5 a−2c ;
m+3
b= √ (|3 a−2|+c ) 4 ;
ì( p 2 + 5p + 4)x
ï , if p > x, x > 1;
3 4
ï
3
px
x
ï
ïæ tgp ö
a =íç 2 ÷ , if p > 1;
ïè tg p - 1 ø
ï 3
ïtg x , otherwise.
ï
î 6

Значення p обирається із множини 0 ¿ 5 із кроком 0.9; значення x


обираються із множини 0 ¿ 3 із кроком 0,3; m=3. Значення змінної с задає
користувач з клавіатури.

11. Визначити значення функції:


19

ì162- t + 2 ×43- x - 4tx - a 4 , if m < 0;


ï
ísin 2t ×sin æ 3p + 3a ö + cos æ 5p - 2t ö , if m ³ 0;
ï çè 2 ÷
ø çè 2 ÷
ø
r= î

ìa cos ( 7x - 6 ) + sin ( ap ) , if b > 0;


ï 2
ïln ( c + b)
t =í 2 , if b > 0, c < 20,b ¹ - c;
ï b + c - 4
ïcos2 2b, otherwise.
î

Значення m обирається із множини – 5 ¿ 5 із кроком 0,5; a = 3; значення


b обирається із множини [– 3 ¿ 3] із кроком 1; а c – із множини 0 ¿ 50 із
кроком 10. Значення змінних x задає користувач з клавіатури.

12. Визначити значення функції:

{
y = cos9x - cos7x + cos3a - cos x, if x ¹ 0 and a ¹ p ;
sin3x + sin5a - sin 4x, otherwise;

ì3ab - 3.5×a - 56 + | b | , if b £ 0;
ï ( )
ï a 3
x =ícos 2 + cos 2 b - sin 2 2ab - sin 2 4b, if b > 0.5;
ï 2 2
ï3.5ab, otherwise.
î

Значення a обираються із множини 0 ¿ 5 із кроком 0,1, а значення b – із


множини – -2 ¿ 5 з кроком 0,2.

13. Визначити значення функції:

π π 3π 7π
b=cos a⋅cos 2 c−sin ( ) (
4
+m sin + 4 m + sin
4 ) (
4
+4 a cos
4
−5 c ) ( ) ;

ìln t + d 2 , if d > t, t > 1, d >1;


( )
ï
ï
a =í td , if t >1;
ï2
ï
ît d, otherwise.

1 π
с=tg 3 a−1+ 2
cos d (
−3 ctg −d 3 ⋅3 m .
2 )
Значення d обираються із множини 2 ¿ 15 із кроком 1, а значення t – із
множини – 0 ¿ 5 із кроком 0.5, m обираються із множини -2 ¿ 2 із кроком
0.41.
20

14. По значенню обчислити значення:


2 2 3 3
Z =tgx+ctgx+tg x+ctg x+tg x+ctg x ,
5n 1

y=¿ { √2⋅n⋅0,5 4 √ x−10

Z
−16 2 n( √ x−1)
, Z≠0; ¿ ¿¿¿
.

Значення x обираються із множини 0 ¿ 5 із кроком 0.58, Значення n


обираються із множини 1 ¿ -5 із кроком 0.5.

15. По значенню обчислити значення:

√ a2 +8 a 2
Z =17⋅2 −8+2⋅4 √ a + 8 a .

n 2
y=√ Z
Значення a обираються із множини 0 ¿ 5 із кроком 0.2, значення n
обираються із множини -5 ¿ 10 із кроком 2.5.

16. Виконати виведення на екран результатів обчислення функції:


ì4x 3 - 6a +1, if x > 3.6;
ï
y =í 3 5 - x
ï , if x £ 3.6;
î a
ì æ 1ö æ 2 1 ö
ï7 ç a + ÷- 2 ç b + 2 ÷, if b < 0, a ¹ 0;
ï è bø è a ø
ï 8
ïa 3 - b2 - 3 2 , if 0 £b £1;
x =í a - b +1
ï 2
ï4 a - 9b +1, if 1 < b < 2;
ï7 (a - b)3 - 7 b - a +1 - 3 - 65 , otherwise.
( )
ï
î 8

Змінна a приймає значення від 0.1 до 5 із кроком 0,5. Змінна b приймає


значення від [ – 2, 4 ] із кроком 0,1.

17. Виконати виведення на екран результатів обчислення функції:

ì 12 + x - x 2 12 + x - x 2
ï - , if x >12;
ï
ï x - 11 2x - 9
í
ï1+ cos(2x - 2p ) + cos(4x + 2p ) - cos(6x - p )
ï - 2cos 2x, if x £12;
cos(2p - 2x) + 2cos 2 (2x + p ) - 1
y =ï
î
21

ì a- b b+ a
ï4 +4 , if b ¹ - 3,a ¹ 4;
ï b + 3 a - 4
ï 1- 2cos 2 2a
, if - 10 £ b < 0;
ï æ p ö 2 æp ö
ï2tg 2a - ÷×sin ç + 2b÷
x =í ç è 4ø è4 ø
ï
ï 1 2a - b a + b
ïa + b a - b - 1 , if b ¹ ±a;
+
ï
ï 2 - a + 4b - 3, otherwise.
î

Змінна a приймає значення від 0 до 8 із кроком 0,5. Змінна b приймає


значення від [– 3,11] із кроком 0,2.

18. Виконати виведення на екран результатів обчислення функції:

P = 2b - 1 + 3 + 2b +15 + 9;
;
a
10c
b=− ;
√|2m−1|+5
ì 1
ï4cos p tgx
× - 2cos 2x - , if p > x, x > 1
ï cos 2
p
a =í
æ1 ö
ïç tgx + ctg( p)÷×2sin
( x + tg( p)) , otherwise.
ï
îè 2 ø

Значення p обирається із множини 0 ¿ 15 із кроком 0.741; значення x


обираються із множини 0 ¿ 3 із кроком 0,3; m=3. Значення змінної с задає
користувач з клавіатури.

19. Визначити значення функції:

ì æp öæ æ3p öö
ïctg ç + a ÷×1+ cos ç + 2x
ï è4 øç è è2 ÷
ø÷
ø
ï - ctg2a, if m < 0;
r =í æ 5p ö
cos ç2t - +2
ï è 2÷ø
ï
ï 2 - 3+ a + 2t + x + 4 , if m ³ 0;
î
22

ì b 2a 8a 2
ï - + 2 2
, if b ¹ ±a, x ¹ ±a;
ï x - a x + a b - a
ï 2
ï c - 16 5a
t =í + b- 3+ ,øà x ³ 3, c ¹ ±4, b > 5;
ï x - 3 x - 3
ï 2
ïa - 2 c - 3b, otherwise.
ï
î

Значення m обирається із множини [ – 5 ¿ 5] із кроком 0,5; a = 3;


значення b обирається із множини [– 3 ¿ 3] із кроком 1; а c – із множини 0 ¿
50 із кроком 10. Значення змінних x задає користувач з клавіатури.

20. Визначити значення функції:

ì1- 2sin 2 2a 1+ tg2a


ï - , if x ¹ 0 and a ¹ p ;
y =í 1- sin 4a x
ï x 2 + 3x + 2 - x 2 - x +1 - 1, otherwise;
î

ì3
ï a + b - a - b - a + b , if b £ a;
3 6 2 2

ï
x =í 4 - 4a 3 + b6 + 6 + a - 3 2 , if b > 0.5;
ï 3
ï
î ( )
a a - 2a 3 b + 3 a 2 b2 + 3 a 2 b - 3 ab2 ¸ 3 a 2 +1, otherwise.

Значення a обираються із множини 0 ¿ 5 із кроком 0,1, а значення b – із


множини – -2 ¿ 5 з кроком 0,2.

21. Визначити значення функції:


2
c +1 m
b= + −2 . 9 a
2 √ a2 +1 ;

ì
ït + d, if d > t, t >10, d < 1;
ï
a =í2t 2 - td + 3d 2 - 7t - 12d +1, if t >1;
2
ït d
ïtg6 , otherwise.
î

a 2 - 5d + 4
c= m.
d2 - 4
23

Значення d обираються із множини 3 ¿ 15 із кроком 1, а значення t – з


множини – 0 ¿ 5 із кроком 0.5, m обираються із множини -2 ¿ 2 із кроком
0.41.
22. По значенню обчислити значення:

1 1 a+1
Z= ( √ a+√ a+1 +
√ a+ √ a+1 )( ÷ 1+
√ ) a−1 ,

2 2
Z +n n −Z +2
y= 2 − 2
|Z −n+1|+3 |n −Z−2|+2 .

Значення a обираються із множини 3 ¿ 15 із кроком 0.58, Значення n


обираються із множини 1 ¿ -5 із кроком -0.5.

23. По значенню обчислити значення:

1+ √|1−x| 1−√ 1+x √|1−x|−√1+x


Z=
( +
x 2−1+ √1+x 1+x 2− √1+x
÷
√ x 2−1) ,

8
y=Z 3−n2 − 3 2
|Z −n |+6 .

Значення x обираються із множини [3 ¿ 21] із кроком 0.62, Значення n


обираються із множини 1 ¿ -5 із кроком -0.5.

24. По значенню обчислити значення:

x−2 2 x +2 2 x 2 −4
Z =20( ) ( )
x+ 1
−5
x−1
+ 48 2
x −1 ,
Z
7
2 n2−6
Z
y=7 ( √ 2 ) −( )
4 .

Значення x обираються із множини [3 ¿ 15] із кроком 0.74, Значення n


обираються із множини [-5 ¿ 1] із кроком 0.5.

25.Для трійки натуральних чисел визначити їх найбільший загальний


дільник.

26.Задані координати вершин трикутника та координати точки у ньому.


Визначити віддаль цієї точки до найближчої середини сторони трикутника.
(При вирішенні задачі узято не менш 3-х варіантів координат вершин
трикутника та точки у ньому).
24

27.Задані відрізки a , b, с, d . Для кожної з трійок цих відрізків, з яких


можливо побудувати трикутник, визначити та вивести на екран площу цих
трикутників.
25

Додаток А

ІНСТРУКЦІЯ З ТЕХНІКИ БЕЗПЕКИ ПРИ ВИКОНАННІ


ЛАБОРАТОРНИХ РОБІТ

1. Робочі місця лабораторії, де виконуються лабораторні роботи,


студенти займають тільки за вказівкою керівника занять.
2. Вмикання та вимикання термінальних приладів лабораторного
устаткування категорично забороняється без дозволу керівника занять.
3. Переключення режимів роботи термінальних приладів
лабораторного устаткування категорично забороняється і може
виконуватися тільки у присутності керівника занять.
4. Категорично забороняється знімати кожухи з приладів
лабораторного устаткування, відключати або підключати його
з’єднувачі, пересувати або переносити з місця на місце, відключати
термінальні пристрої робити інші дії, що можуть призвести до
доторкання з відкритими частинами лабораторного устаткування.
5. На кожному робочому місті можуть перебувати одночасно не більш
двох – трьох чоловік, один з яких виконує дії, пов’язані із виконанням
роботи, а інші – стежать за його роботою і, при необхідності,
поправляють.
6. При відключенні, виході з ладу термінального обладнання
лабораторного устаткування або виникненні інших непередбачених
ситуацій необхідно негайно повідомити керівника занять. Самим при
цьому не виконувати жодних дій.
26

Додаток Б

ФОРМА ТИТУЛЬНОГО АРКУШУ ЗВІТУ З ЛАБОРАТОРНОЇ РОБОТИ

Міністерство освіти і науки України


Харківський національний університет радіоелектроніки

Кафедра системотехніки

Дисципліна: «Алгоритмізація та програмування»

ЛАБОРАТОРНА РОБОТА № 1

«ВИВЧЕННЯ МОЖЛИВОСТЕЙ СЕРЕДОВИЩА MICROSOFT VISUAL


C++ СТВОРЕННЯ, ТРАНСЛЯЦІЯ ТА НАЛАГОДЖЕННЯ ПРОГРАМ»

Виконав: Прийняв:
ст. гр..
ФИО з оцінкою «____________»
«____»_______________20___р.

Харків 20___
27

Додаток В

СКЛАД РОЗДІЛІВ ЗВІТУ З ЛАБОРАТОРНОЇ РОБОТИ

Звіт з лабораторної роботи повинен складатися з таких розділів:


1. Мета роботи. Переписується з п’ятого розділу методичних
вказівок до відповідної лабораторної роботи.
2. Постановка задачі. Оформлюється у відповідності із
індивідуальним завданням до відповідної лабораторної роботи
3. Самостійна робота при підготовці до лабораторної роботи.
До складу розділу повинні входити: опис вибраного або розробленого
методи вирішення задачі, опис розробленого алгоритму вирішення
задачі, текст розробленої програми, контрольні приклади для перевірки
та налагодження програми.
4. Виконання експериментів по налагодженню програми. До
складу розділу повинні входити: результати трансляції та налагодження
програму відповідності із контрольними прикладами. Завершальною
частиною цього розділу повинно бути результати виконання
налагодженої програми.
5. Висновки. Повинні включати висновки по результатах виконання
лабораторної роботи з аналізом вибраного методу вирішення задачі та
розробленого алгоритму, процесу налагодження програми,
особливостей реалізації програми з використанням мови С++ та
інструментального засобу Microsoft Visual Studio (або іншої IDE,
програмного середовища).
28

Додаток Г
ОСОБЛИВОСТІ РОЗРОБКИ ЗВІТУ

1. НАЗВАНИЕ ЛАБОРАТОРНОЙ РАБОТЫ

1.1 Цель работы. Чаще всего повторяет цель, которая указывается в


методических указаниях, но должна отражать не столько цель самой
лабораторной работы, сколько цель работ, которые на ней проводятся

1.2 Постановка задачи. Должна описывать исходную информацию,


необходимую для решения задачи или выполнения лабораторной
работы. Если студенту было выдано индивидуальное задание, пример,
задача, полный текст задания и вспомогательная информация должна
указываться в этом разделе

1.3 Ход работы. Если выполнение лабораторной работы


подразумевает наличие промежуточных вычислений, доказательств,
решений, теоретических аспектов или иного рода информации, ее
необходимо указывать в данном разделе. Основной текст отчета
набирается шрифтом Times New Roman, размер 14, межстрочный
интервал – полуторный, выравнивание по ширине. Для выделения
отдельных слов допускается: полужирное начертание символов, а
также использование курсива и подчеркивания; изменение интервала
между символами; использование верхнего или нижнего индексов. Цветовое
оформление не допускается!
Абзац должен иметь следующий формат: отступ слева и справа – 0 см;
первая строка – отступ на 1,25 см; интервалы перед и после абзаца – 0
см; интервал между строками – полуторный; выравнивание – по
ширине.
Рисунки должны быть подписаны, выделяются отступами с верху и с
низу от рисунка. Подпись размещается под рисунком, выравнивание по
центру. Название должно отображать емкую информацию об
изображении.

Рисунок 1 – Пример названия изображения

Рисунки могут быть вставлены в текст.


Формулы должны быть набраны при помощи встроенного редактора
формул. Выделяются стоками сверху и снизу от формулы. Все формулы
вставляются в таблицу с не очерченным контуром, состоящую из двух
колонок: в первой находится формула без абзаца и выровненная по
центру, во второй – номер формулы (если такой имеется) тоже без
абзаца и с выравниванием по правому краю.
τ
lim ∫ Pd τ =п≠0 (1)
τ→ 0 0
.
29

Параметры в редакторе формул должны в точности соответствовать


приведенным ниже.
Размеры:
Обычный 14 пт.
Крупный индекс 12 пт.
Мелкий индекс 10 пт.
Крупный символ 20 пт.
Мелкий символ 12 пт.

Стили (опция меню СТИЛЬ, Определить…)


Текст Times New Roman
Функция Times New Roman
Переменная Times New Roman
Стр. греческие Symbol
Пр. греческие Symbol
Символ Symbol
Матрица-вектор Times New Roman полужирный
Числа Times New Roman

Таблицы создаются только при помощи Microsoft Word. Каждая


таблица имеет нумерацию и название. Название задается вверху
таблицы с абзаца, выравнивание по ширине.

Таблица 1 – Пример задания таблица


Название %

1.4 Результат выполнения лабораторной работы. В данный раздел


включают промежуточные и окончательные результаты, которые были
получены при выполнении лабораторной работы: ответ, тексты
программы, отсортированный массив, Screenshot работы программного
средства и прочее, с кратким описанием полученного результата.

Выводы. В выводах необходимо пошагово воспроизвести каждое


действие, которое выполнялось в ходе лабораторной работы, ответив
для каждого шага на следующие вопросы: что делалось? каким образом?
что ожидалось? что получилось? почему? В конце, необходимо дать
общий вывод по работе. В данном случае, следует говорить о
приобретении навыков написания базовых программных приложений
для решения элементарных математических задач.
30

Базовые функции
Имя Описание
abs Возвращает абсолютную величину целого числа
acos арккосинус
asin арксинус
atan арктангенс
atan2 арктангенс с двумя параметрами
ceil округление до ближайшего большего целого числа
cos косинус
random выводит случайное число от 0 до аргумента функции.
exp вычисление экспоненты
fabs абсолютная величина (числа с плавающей точкой)
floor округление до ближайшего меньшего целого числа
fmod вычисление остатка от деления нацело для чисел с плавающей точкой
frexp разбивает число с плавающей точкой на мантиссу и показатель степени.
ldexp умножение числа с плавающей точкой на целую степень двух
log натуральный логарифм
log10 логарифм по основанию 10
modf(x,p) извлекает целую и дробную части (с учетом знака) из числа с плавающей точкой
pow(x,y) результат возведения x в степень y, xy
sin синус
sinh гиперболический синус
sqrt квадратный корень
tan тангенс
tanh гиперболический тангенс

Функции стандарта C++


Имя Описание
acosh гиперболический арккосинус
asinh гиперболический арксинус
atanh гиперболический арктангенс
cbrt кубический корень
возвращает величину, абсолютное значение которой равно x, но знак которой
copysign(x,y)
соответствует знаку y
erf функция ошибок
erfc дополнительная функция ошибок
exp2(x) значение числа 2, возведённого в степень x, 2x
expm1(x) значение функции ex − 1
fdim(x,y) вычисление положительной разницы между x и y, fmax(x−y, 0)
fma(x,y,z) значение функции (x * y) + z (см. FMA)
fmax(x,y) наибольшее значение среди x и y
fmin(x,y) наименьшее значение среди x и y
hypot(x,y) гипотенуза, sqrt(x² + y²)
ilogb экспонента числа с плавающей точкой, конвертированная в  int
lgamma натуральный логарифм абсолютного значения гамма-функции
llrint округление до ближайшего целого (возвращает  long long )
31

lrint округление до ближайшего целого (возвращает  long )


округление до ближайшего целого в направлении от нуля (возвращает  long
llround
long )
lround округление до ближайшего целого в направлении от нуля (возвращает  long )
log1p(x) натуральный логарифм 1 + x
log2 логарифм по основанию 2
logb целочисленная часть логарифма x по основанию 2
nan(s) возвращает нечисловое значение 'Not a Number'
округление аргумента до целого значения в формате числа с плавающей
nearbyint
точкой
nextafter(x,y) следующий ближайшее представимое для x (по направлению к y)
nexttoward(x,y
то же, что и  nextafter , но y имеет тип  long double
)
remainder(x,y) вычисляет остаток от деления согласно стандарту IEC 60559
remquo(x,y,p) то же, что и  remainder , но сохраняет коэффициент по указателю p (как  int )
округление до целого (возвращает  int ) с вызовом ошибки  inexact , если
rint
результат отличается от аргумента.
round округление до целого (возвращает  double )
scalbln(x,n) x *  FLT_RADIX n (n is  long )
scalbn(x,n) x *  FLT_RADIX n (n is  int )
tgamma гамма-функция
trunc отбрасывание дробной части

Расширения XSI
Эти функции не описаны в стандартах ANSI или ISO C, но могут присутствовать в системах в
качестве расширений X/Open.
Имя Описание
j0(x) значение функций Бесселя первого рода порядков 0 для аргумента x
j1(x) значение функций Бесселя первого рода порядков 1 для аргумента x
jn(n,x) значение функций Бесселя первого рода порядка n
scalb(x,y) x *  FLT_RADIX y (x и y типа  double )
y0(x) значение функций Бесселя второго рода порядков 0 для аргумента x
y1(x) значение функций Бесселя второго рода порядков 1 для аргумента x
yn(n,x) значение функций Бесселя второго рода порядка n
Использование функций конвертации  double -string  ecvt ,  fcvt  и  gcvt  не рекомендуется в
пользу  sprintf .
32

2. МАТЕМАТИЧЕСКИЕ ФУНКЦИИ
2.1 МАТЕМАТИЧЕСКИЕ ФУНКЦИИ ('math.h')

Соответствующие им определения и объявления содержатся в 'math.h'.


Обратим внимание на два определения из 'math.h', которые представляют
собой определенный интерес.
1. Бесконечность в типе double определяется как HUGE_VAL; многие
функции возвращают это значение при переполнении.
2. Структура exception используется при написании определенных Вами
обработчиков ошибок для математических функций. Вы можете определить
свой способ обработки ошибок для большинства этих функций, выбрав
собственную версию matherr; см. описание функции matherr для
выяснения подробностей.
3. Поскольку обработчик ошибок вызывает fputs, математические
подпрограммы требуют заглушек (фиктивных модулей) или минимальных
реализаций (имплементаций) для списка подпрограмм ОС, из fputs: close,
fstat, isatty, lseek, read, sbrk, write. Cм. раздел "System Calls" в The Cygnum
C Support Library, для получения помощи и примеров таких реализаций
программ поддержки.
Альтернативные объявления математическик функций, позволяющие
эффективнее использовать возможности машины, - но, как правило, хуже
отслеживающие ошибки и могущие вызывать дополнительные трудности на
некоторых машинах, - доступны при подключении 'fastmath.h' вместо
'math.h'.

2.2 Версия библиотеки


Существуют четыре различных версии программ математических
библиотек: IEEE, POSIX, X/Open, и SVID. Версия может быть выбрана Вами
в период прогона программы заданием глобальной переменной
_LIB_VERSION, определенной в 'math.h'. Она может принимать значение
одной из следующих констант, определенных в 'math.h': _IEEE_, _POSIX_,
_XOPEN_, или _SVID_. Переменная _LIB_VERSION не является
специальной для каждой части программы, и изменение ее сказывается на
всех частях.
Версии библиотеки различаются только по принципу обработки ошибок.
В режиме IEEE функция matherr не вызывается, не печатается
сообщение об ошибке, и не задается значение переменной errno.
В режиме POSIX переменной errno присваивается необходимое значение,
но функция matherr не вызывается, и не выводится сообщение об ошибке.
В режиме X/Open переменная errno принимает соответствующее
значение, вызывается функция matherr, но сообщение об ошибке не
выводится.
В режиме SVID функции, в случае переполнения, не принимают
значение бесконечности, а становятся равными
3.40282346638528860e+38, максимально возможному одноразрядному
числу с плавающей точкой. Также переменной errno присваивается
правильное значение, вызывается функция matherr, и, если matherr
обращается в 0, то для некоторых ошибок выводится соответствующее
сообщение. Например, в ответ на 'log(-1.0)' печатается сообщение об
ошибке в стандартном виде вывода: log: DOMAIN error. По умолчанию
реализуется режим X/Open.
33

2.3 acos,acosf - арккосинус


#include <math.h>
double acos(double x);
float acosf(float x);
acos вычисляет арккосинус (arccos) от заданного аргумента. Аргумент
для acos должен находиться в отрезке [-1,1].
- acosf идентичен acos, различие состоит в типах (double и floats), с которыми
проводятся вычисления.
- acos и acosf возвращают значения в радианах на промежутке от 0 до pi.
- Если х не в промежутке [-1,1], то возвращаемое значение есть NaN (not a
number), глобальная переменная errno принимает значение EDOM, и в стандартном
выводе выносится сообщение DOMAIN error.
- Вы можете изменить обработку ошибок для этих функций, используя matherr.

2.4 acosh, acoshf - обратный гиперболический косинус


#include <math.h>
double acosh(double x);
float acoshf(float x);
acosh вычисляет обратный гиперболический косинус, который
определяется как ln(x + sqrt(sqr(x) - 1))

- x должен быть больше либо равен 1.


- acoshf аналогичен acosh с точностью до типов.
- acosh и acoshf принимают вычисленные значения. Если х меньше 1,
возвращается NaN, при этом errno получает значение EDOM.
- Вы можете изменить поведение обработчика ошибок с помощью функции
matherr, которая не является стандартной ANSI C - функцией.
- Ни acosh, ни acoshf не удовлетворяют стандарту ANSI C. Не рекомендуется
использовать их в программах, которые могут быть перенесены на другие машины.

2.5 asin, asinf - арксинус


#include <math.h>
double asin(double x);
float asinf(float x);
asin вычисляет арксинус (arcsin) от заданного аргумента. Аргумент для
asin должен находиться в отрезке [-1,1].

- asinf идентичен asin, различие состоит в типах (double и float), с которыми


проводятся вычисления.
- Вы можете изменить обработку ошибок для этих функций, используя matherr.
- asin и asinf возвращают значения в радианах в промежутке от -pi/2 до pi/2.
- Если х не в промежутке [-1,1], то возвращаемое значение есть NaN (not a
number), глобальная переменная errno принимает значение EDOM, и в стандартном
выводе выносится сообщение DOMAIN error.
- Вы можете изменить обработчик ошибок для этих функций, используя matherr.

2.6 asinh, asinhf - обратный гиперболический синус


#include <math.h>
double asinh(double x);
float asinhf(float x);
asinh вычисляет обратный гиперболический синус, который
определяется как sign(x)*ln(ЁxЁ + sqrt(sqr(x) + 1))
34

- asinhf аналогичен с точностью до типов.


- asinh и asinhf возвращают вычисленные значения.
- Ни asinh, ни asinhf не являются ANSI C - функциями.

2.7 atan, atanf - арктангенс


#include <math.h>
double atan(double x);
float atanf(float x);
atan вычисляет арктангенс (arctg) от заданного аргумента.

- atanf аналогичен с точностью до типов.


- atan и atanf возвращают значения в радианах на промежутке от -pi/2 до pi/2.
- atan удовлетворяет стандарту ANSI C. atanf является расширением.

2.8 atan2, atan2f - арктангенс от y/x


#include <math.h>
double atan2(double y, double x);
float atan2f(float y, float x);
atan2 вычисляет арктангенс (arctg) от y/x. atan2 получает верный
результат даже при углах, близких к pi/2 и -pi/2 (т. е. когда х близок к 0).

- atan2f идентичен atan, различие состоит в типах (double и float), с которыми


проводятся вычисления.
- atan2 и atan2f возвращают значения в радианах на промежутке от -pi/2 до pi/2.
- В случае, когда и х и y оба равны нулю, возникает ошибка DOMAIN error.
- Вы можете изменить обработку ошибок для этих функций, используя matherr.
- atan2 удовлетворяет стандарту ANSI C. atan2f является расширением.

2.9 atanh, atanhf - обратный гиперболический тангенс


#include <math.h>
double atanh(double x);
float atanhf(float x);
atanf аналогичен с точностью до типов.

- atanh и atanhf возвращают вычисленное значение.


- Если ЁхЁ превосходит 1, то возвращаемое значение есть NaN, errno принимает
значение EDOM, и выводится сообщение DOMAIN error.
- Если ЁхЁ равно 1, то возвращаемое значение есть бесконечность (infinity) со
знаком аргумента, errno принимает значение EDOM, и выводится сообщение SIGN
error.
- Вы можете изменить обработку ошибок для этих программ, используя matherr.
- Ни atanh, ни atanhf не являются ANSI C - функциями.

2.10 jN,jNf,yN,yNf - функции Бесселя


#include <math.h>
double j0(double x);
float j0f(float x);
double j1(double x);
float j1f(float x);
double jn(int n, double x);
float jnf(int n, float x);
double y0(double x);
float y0f(float x);
double y1(double x);
35
float y1f(float x);
double yn(int n, double x);
float ynf(int n, float x);
Функции Бесселя - это семейство функций - решений
дифференциального уравнения:
2
2 d y dy 2 2
x * --- + x* -- + (x - p )*y = 0
2 dx
dx

Эти функции имеют широкое применение в инженерии и физике.

- jn вычисляет функцию Бесселя первого рода порядка n. j0 и j1 представляют


собой частные случаи с порядками 0 и 1 соответственно.
- Подобно этому, yn вычисляет функцию Бесселя второго рода порядка n, а y0 и y1
- частные случаи с порядками 0 и 1 соответственно.
- jnf, j0f, j1f, ynf, y0f, y1f проводят те же самые вычисления, но с переменными типа
float.
- Каждая функция Бесселя возвращает свое значение в заданной точке х.
- Ни одна из этих функций не входит в ANSI C.

2.11 сbrt,cbrtf - кубический корень


#include <math.h>
double cbrt(double x);
float cbrtf(float x);
cbrt вычисляет кубический корень из аргумента.

- Возвращается кубический корень.


- сbrt принадлежит System V release 4. cbrtf является расширением.

2.12 copysign, copysignf - число с абсолютным значением х и со

- знаком y

#include <math.h>
double copysign(double x, double y);
float copysignf(float x, float y);
copysign образует число с абсолютным значением своего первого
аргумента х и со знаком своего второго аргумента y.

- copysignf производит те же операции, но работает с переменными типа float.


- copysign возвращает число типа double с модулем х и знаком y, copysignf
возвращает число типа float с модулем х и знаком y.
- copysign не входит ни в ANSI C ни в System V Interface Definition, Издание 2.

2.13 cosh, coshf - гиперболический косинус


#include <math.h>
double cosh(double x);
float coshf(float x);
36

cosh вычисляет гиперболический косинус от аргумента х, cosh(x)


определяется как (exp(x)+exp(-x))/2

- Углы определены в радианах. coshf аналогичен с точностью до типов.


- cosh и coshf возвращают вычисленное значение. Когда происходит
переполнение, cosh возвращает значение HUGE_VAL с соответствующим знаком,
глобальная переменная errno принимает значение ERANGE.
- Вы можете изменить обработку ошибок для этих программ, используя matherr.
- cosh coответствует стандарту ANSI. coshf является расширением.

2.14 erf, erff, erfc, erfcf - функции ошибки


#include <math.h>
double erf(double x);
float erff(float x);
double erfc(double x);
float erfcf(float x);
erf вычисляет приближение к "функции ошибки" , которая оценивает
вероятность того, что некое наблюдение окажется внутри рамок
отклонения х от среднего значения на числовой оси (подразумевается
нормальное вероятностное распределение). Функция ошибки определяется
как
x
2 2
⋅∫ e(−t ) dt
√x 0
erfc вычисляет дополнительную вероятность, т. е. erfc(x) = 1 - erf(x).
функция erfc вычисляется непосредственно, поэтому используется для
избежания потери точности, которая возникла бы при вычитании больших
вероятностей (когда x велик) из 1.

- erff и erfcf отличаются только типами входных данных и результатов.


- Для положительных аргументов erf и все ее разновидности возвращают
вероятность - число между 0 и 1.
- Ни один из этих вариантов не в ANSI C.

2.15 exp, expf - экспонента


#include <math.h>
double exp(double x);
float expf(float x);
х exp и expf вычисляют значение экспоненты от х, e (где e - основание
натуральной системы логарифмов, приблизительно равное 2.71828).

- Вы можете использовать функцию matherr (не-ANSI) для выбора обработчика


ошибок для этих функций.
- В случае успеха exp и expf возвращают вычисленное значение. Если результат
слишком мал, возвращается значение 0. Если результат слишком велик,
возвращается значение HUGE_VAL. В обоих случаях errno принимает значение
ERANGE.
- exp coответствует стандарту ANSI. expf является расширением.

2.16 expm1, expm1f - экспонента минус 1


#include <math.h>
double expm1(double x);
float expm1f(float x);
37

expm1 и expm1f вычисляют значение экспоненты от х и вычитают 1, т. е.


е в степени х, минус 1. (где e - основание натуральной системы
логарифмов, приблизительно равное 2.71828). Результат остается точным
даже для малых значениях х, в то время как использование exp(x)-1
вызвало бы потерю многих значащих цифр.

- Ни expм1, ни expm1f не соответствуют стандарту ANSI и System V Interface


Definition.

2.17 fabs, fabsf - абсолютное значение (модуль)


#include <math.h>
double fabs(double x);
float fabsf(float x);
fabs и fabsf вычисляют ЁxЁ, абсолютное значение (модуль) от аргумента
х. непосредственным обращением к битовому представлению аргумента.

- Возвращается вычисленное значение. Никаких ошибок не возникает.


- fabs coответствует стандарту ANSI. fabsf является расширением.

2.18 floor, floorf, ceil, ceilf - наименьшее и наибольшее


ближайшие целые
#include <math.h>
double floor(double x);
float floorf(float x);
double ceil(double x);
float ceilf(float x);
floor и floorf вычисляют ближайшее целое значение, не превосходящее х.
ceil и ceilf вычисляют ближайшее целое значение, не меньшее х.
floor и ceil возвращают вычисленное значение типа double. floorf и ceilf
возвращают вычисленное значение типа float.

- floor и ceil coответствуют стандарту ANSI. floorf и ceilf являются расширениями.

2.19 fmod, fmodf - остаток от деления в виде числа с плавающей


точкой
#include <math.h>
double fmod(double x, double y);
float fmodf(float x, float y);
fmod и fmodf вычисляют остаток от деления х/у в формате плавающей
точки (х ( mod y)).

- Функция fmod возвращает значение x-i*y, для наибольшего такого i, что если y
отличен от 0, результат имеет тот же знак, что и х, а по модулю не превосходит
модуля y.
- fmod(x,0) возвращает NaN, errno присваивается значение EDOM.
- Вы можете изменить обработчик ошибок для этих функций, используя matherr.
- fmod coответствует стандарту ANSI. fmodf является расширением.

2.20 frexp,frexpf - разбиение числа с плавающей точкой


#include <math.h>
double frexp(double val, int *exp);
float frexpf(float val, int *exp);
38

Все ненулевые нормализованные числа можно представить в виде


m*(2**p) . frexp разбивает переменную типа double val на мантиссу m и
степень двойки р. В результате мантисса всегда будет больше 0.5 и
меньше чем 1.0 (поскольку val не ноль). Степень двойки хранится в
переменной *exp.
- m и р вычисляются так что
val = m*2p .
Функция frexpf идентична с точностью до типов.

- frexp возвращает мантиссу m. Если val = 0 или NaN, frexp присваивает *exp
значение 0, и возвращает val.
- frexp coответствует стандарту ANSI. frexpf является расширением.

2.21 gamma, gammaf, lgamma, lgammaf, gamma_r, gammaf_r,


lgamma_r, lgammaf_r
#include <math.h>
double gamma(double x);
float gammaf(float x);
double lgamma(double x);
float lgammaf(float x);
double gamma_r(double x, int *signgamp);
float gammaf_r(float x, int *signgamp);
double lgamma_r(double x, int *signgamp);
float lgammaf_r(float x, int *signgamp);
gamma вычисляет ln(Г(х)), натуральный логарифм от гамма-функции от
х. Гамма-функция (exp(gamma(x)) eсть обобщение факториала и
использует то свойство, что Г(N) = N*Г(N-1). В соответствии с этим,
значения гамма-функции растут очень быстро. gamma определяется как
ln(Г(х)) а не как просто Г(х) для того чтобы расширить полезное поле
представляемых результатов.
- Знак результата сохраняется в глобальной переменной signgam, которая
объявлена в math.h.
- gammaf производит те же вычисления, что и gamma, но оперирует с
переменными типа float.
- lgamma и lgammaf - это альтернативные названия для gamma и gammaf. Они
существуют в качестве напоминания о том, что вычисляется не сама гамма-
функцию, а логарифм от нее.
- Функции gamma_r, gammaf_r, lgamma_r и lgammaf_r подобны функциям gamma,
gammaf, lgamma, lgammaf соответственно, но требуют лишний аргумент. Этот
аргумент - указатель на целое число. Он используется для получения знака
результата, и глобальная переменная signgam не используется. Эти функции могут
быть использованы для входных заявок (но они, тем не менее, будут задавать
значение глобальной переменной errno в случае возникновения ошибки).
- Не путайте функцию gamma_r, которая запрашивает дополнительный аргумент,
являющийся указателем на целое, с функцией _gamma_r, которая запрашивает
дополнительный аргумент, являющийся указателем на структуру повторной
входимости.
- В случае успеха возвращается вычисленное значение.
- Когда х - неположительное число, gamma возвращает HUGE_VAL, а errno
принимает значение EDOM. Если происходит переполнение, gamma возвращает
HUGE_VAL, а errno принимает значение ERANGE.
- Вы можете изменить обработчик ошибок для этих функций, используя matherr.
- Ни gamma, ни gammaf не являются ANSI C - функциями.
39

2.22 hypot, hypotf - расстояние от начала координат


#include <math.h>
double hypot(double x, double y);
float hypotf(float x, float y);
hypot вычисляет евклидово расстояние sqrt( x**2 + y**2 ) между
началом координат и точкой, представленной декартовыми координатами
(х, y). hypotf отличается только типом аргументов и результата.

- В случае успеха возвращается расстояние. При переполнении hypot возвращает


HUGE_VAL и присваивает переменной errno значение ERANGE.
- Эта обработка ошибок может быть изменена с помощью функции matherr.
- Ни hypot, ни hypotf не являются ANSI C - функциями.

2.23 ilogb, ilogbf - получение показателя степени в представлении


числа с плавающей точкой
#include <math.h>
int ilogb(double val);
int ilogbf(float val);
Все ненулевые нормальные числа могут быть представлены в р виде
m*2 . ilogb и ilogbf запрашивают аргумент val и возвращают число p.
Функции frexp и frexpf подобны функциям ilogb и ilogbf, но помимо этого
возвращают m.

- ilogb и ilogbf возвращают степень двойки, которая используется для образования


числа с плавающей точкой. Если аргумент равен 0, они возвращают -INT_MAX
(INT_MAX определен в limits.h). Если val равен бесконечности или NaN, они
возвращают INT_MAX.
- Ни ilogb, ни ilogbf не входят в ANSI C и System V Interface Definition.

2.24 infinity, infinityf - представление бесконечности


#include <math.h>
double infinity(void);
float infinityf(void);
infinity и infinityf возвращают специальное значение, объявленное в IEEE
двойной и единичнойной точности соответственно.

2.25 isnan, isnanf, isinf, isinff, finite, finitef - тест для чисел
структуры exception
#include <ieeefp.h>
int isnan(double arg);
int isinf(double arg);
int finite(double arg);
int isnanf(float arg);
int isinff(float arg);
int finitef(float arg);
Эти функции выдают информацию о заданном аргументе - числе с
плавающей точкой.
Существует пять основных форматов чисел:
zero – число, все биты которого - нули.
subnormal – используется для представления чисел с нулевым показателем, но
ненулевой дробью.
normal – Число с показателем степени и с дробной частью.
40

infinity – Число с показателем, состоящим из одних единиц (в битовом


представлении) и нулевой дробью.
NAN – Число с показателем, состоящим из одних единиц, и ненулевой дробью.

- isnan возвращает 1, если аргумент равен nan. isinf возвращает 1, если аргумент
равен infinity. finite возвращает 1, если аргумент равен zero, subnormal или normal.
isnanf, isinff и finitef производят те же действия, что и их аналоги isnan, isinf и finite, но
с одноразрядными числами с плавающей точкой.

2.26 ldexp, ldexpf - задание показателя


#include <math.h>
double ldexp(double val, int exp);
float ldexpf(float val, int exp);

- ldexp вычисляет величину val*(p**exp). ldexpf аналогична с точностью до типов.


- ldexp и ldexpf возвращают вычисленные значения.
- При переполнении в обе стороны переменной errno присваивается значение
ERANGE. При переполнении в отрицательную сторону ldexp и ldexpf приобретают
значение 0.0. При переполнении в положительную сторону ldexp становится равной
HUGE_VAL со знаком плюс или минус.
- ldexp удовлетворяет стандарту ANSI C. ldexpf является расширением.

2.27 log, logf - натуральные логарифмы


#include <math.h>
double log(double x);
float logf(float x);
Возвращают значение натурального логарифма от х, то есть логарифм по
основанию e ( где e - основание натуральной системы логарифмов,
2.71828...). log и logf идентичны с точностью до типов входных и выходных
данных.

- Вы можете изменить обработку ошибок для этих функций, используя matherr.


- В случае успеха возвращается вычисленное значение. Если х равен нулю,
получаемое значение функции будет -HUGE_VAL а переменная errno станет равной
EDOM. Переиначить поведение обработчика ошибок можно использованием
matherr.
- log удовлетворяет стандарту ANSI C. logf является расширением.

2.28 log10, log10f - логарифмы по основанию 10


#include <math.h>
double log10(double x);
float log10f(float x);
log10 возвращает значение логарифма по основанию 10 от х. Он
определяется как ln(х)/ln(10).

- logf идентичен с точностью до входных и выходных типов.


- Обе функции возвращают вычисленные значения.
- Для получения справки об ошибках, обратитесь к разделу, описывающему log.
- log удовлетворяет стандарту ANSI C. logf является расширением.

2.29 log1p, log1pf - натуральные логарифмы oт (1+x)


#include <math.h>
double log1p(double x);
float log1pf(float x);
41

log1p возвращает значение ln(1+x), натурального логарифма от 1+х.


Предпочтительнее использовать именно log1p а не log(1+x) для большей
точности вычислений при достаточно малых x.

- log1pf идентичен с точностью до входных и выходных типов.


- Обе функции возвращают вычисленные значения, - каждый соответствующего
типа.
- Ни log1p, ни log1pf не входят в ANSI C и System V Interface Definition.

2.30 matherr - изменяемый обработчик математических ошибок


#include <math.h>
int matherr(struct exception *e);
matherr вызывается всегда, когда функция из математической
библиотеки генерирует ошибку. Вы можете видоизменить matherr своей
собственной подпрограммой для того, чтобы выбрать необходимое
обращение с ошибками. Выбранный matherr должен выдавать 0, если ему
не удается распознать ошибку, и число, отличное от нуля в противном
случае.

- Когда matherr принимает ненулевое значение, сообщение об ошибке не


выводится, и значение errno не изменяется. Вы можете подстроить под себя одно
или оба этих обстоятельства в своей версии matherr, используя ту информацию, что
содержится в структуре *e.
- Ниже представлена структура exception (определенная в 'math.h'):

struct exception {
int type;
char *name;
double arj1, arj2, retval;
int err;
};
Поля структуры exception имеют следующие значения:
type – Тип произошедшей ошибки. Множество закодированных типов ошибок также
находится в 'math.h'.
name – Указатель на строку, заканчивающуюся нулем, содержащую имя той
функции из математической библиотеки, в которой произошла ошибка.
arj1, arj2 – Аргументы, вызвавшие ошибку.
retval – Возвращаемое значение ошибки (то значение, которое будет иметь
вызываемая функция).
err – Если не ноль, то это новое значение, присвоенное errno.
Типы ошибок, определенные в 'math.h' представлают собой возможные
математические ошибки типа:
DOMAIN – Аргумент не в области определения функции; например log(-1.0).
SING – Предполагаемые вычисления привели бы к появлению особой точки,
например pow(0.0, -2.0).
OVERFLOW – Вычисления привели бы к результату слишком большому для
представления, например exp(1000.0).
UNDERFLOW – Вычисления привели бы к результату слишком маленькому для
представления, например exp(-1000.0).
TLOSS – Полная потеря разрядности. Результат не имел бы значащих цифр,
например sin(10e70).
PLOSS – Частичная потеря разрядности.
Библиотечное определение matherr возвращает 0 во всех случаях.
42

- Вы можете изменить результат вызываемой функции совершив в matherr


изменение e->retval; этот результат передается к источнику вызова.
- Если функций matherr возвращает 0 (что означает неспособность разрешить
ошибку), источник вызова присваивает errno необходимоеое значение и выводит
сообщение об ошибке.
- matherr - не ANSI-функция.

2.31 modf, modff - разбиение на дробную и целую части


#include <math.h>
double modf(double val, double *ipart);
float modff(float val, float *ipart);
modf разделяет переменную val типа double на целую и дробную части,
возвращая дробную часть и сохраняя целую в *ipart. Не происходит
никакого округления, сумма дробной и целой частей гарантированно
составит val. То есть, если realpart = mod(val, &intpart); тогда 'realpart +
intpart' в точности будет равняться val.

- modff идентичен с точностью до типов.


- Возвращается дробная часть. Знак результата совпадает со знаком исходного
аргумента val.
- modf удовлетворяет стандарту ANSI C. modff является расширением.

2.32 nan, nanf - представление бесконечности


#include <math.h>
double nan(void);
float nanf(void);
nan и nanf возвращают NaN, определенный в IEEE, двойной и одинарной
точности соответственно.
2.33 nextafter, nextafterf - получение ближайшего числа
#include <math.h>
double nextafter(double val, double dir);
float nextafterf(float val, float dir);
nextafter возвращает число с плавающей точкой двойной точности
ближайшее к val в направлении к числу dir. nextafterf производит те же
действия с одинарной точостью. Например, nextafter(0.0,1.0) возвращает
наименьшее положительное число двойной точности.

- возвращает число ближайшее к val в направлении к dir число.


- Ни nextafter, ни nextafterf не входят в ANSI C и System V Interface Definition.

2.34 pow, powf - x в степени y


#include <math.h>
double pow(double x, double y);
float powf(float x, float y);
pow и powf вычисляют x в степени y.

- В случае успеха возвращается вычисленное значение.


- Когда происходит переполнение, pow возвращает HUGE_VAL а errno получает
значение ERANGE. Ecли входной х отрицателен, а y - не целое число, тогда errno
принимает значение EDOM. Если оба аргумента равны 0, pow и powf возвращают 1.
- Вы можете изменить обработку ошибок для этих функций, используя matherr.
- pow отвечает стандарту ANSI C. powf является расширением.
43

2.35 rint, rintf, remainder, remainderf - округление и остаток


#include <math.h>
double rint(double x);
float rintf(float x);
double remainder(double x, double y);
float remainderf(float x, float y);
rint и rintf возвращают свой аргумент, округленный до ближайшего
целого. remainder и remainderf находят остаток от деления x/y; это будет
число между -y/2 и y/2.

- rint и remainder возвращают целое значение в виде double.


- rint и remainder входят в System V release. rintf и remainderf являются
расширениями.
2.36 scalbn, scalbnf - масштабирование
#include <math.h>
double scalbn(double x, int n);
float scalbnf(float x, int n);
scalbn и scalbnf производят операцию масштабирования, возвращая
двойку в степени n, взятую х раз. Результат высчитываетсся посредством
манипуляций с экспонентой, а не через стандартные возведения в степень
и перемножение.
x * 2n
Ни scale, ни scalef не входят в ANSI C и System V Interface Definition.
2.37 sqrt, sqrt - арифметический квадратный корень
#include <math.h>
double sqrt(double x);
float sqrtf(float x);
sqrt вычисляет арифметический (неотрицательный) квадратный корень
из аргумента.

- Вы можете изменить обработку ошибок для этих функций, используя matherr.


- В случае успеха возвращается вычисленное значение квадратного корня. Если х
веществененный и неотрицательный, результат неотрицателен. Если х
вещественный и отрицательный, переменной errno присваивается значение EDOM
(ошибка DOMAIN error).
- sqrt удовлетворяет стандарту ANSI C. sqrtf является расширением.

2.38 sin, sinf, cos, cosf - синус и косинус


#include <math.h>
double sin(double x);
float sinf(float x);
double cos(double x);
float cosf(float x);
sin и cos вычисляют (соответственно) синус и косинус от аргумента х.
Углы определены в радианах.

- sinf и cosf аналогичны с точностью до типов.


- Возвращается значение синуса или косинуса.
- sin и cos отвечают стандарту ANSI C. sinf и cosf являются расширением.

2.39 sinh, sinhf - гиперболический синус


#include <math.h>
double sinh(double x);
44
float sinhf(float x);
sinh вычисляет гиперболический синус от аргумента х. Углы определены
в радианах.

- sinh(x) определяется как (exp(x)-exp(-x))/2


- sinhf аналогичен с точностью до типов.
- sinh и sinhf возвращают вычисленное значение.
- Когда происходит переполнение (результат слишком велик), sinh возвращает
значение HUGE_VAL с соответствующим знаком, глобальная переменная errno
принимает значение ERANGE.
- Вы можете изменить обработку ошибок для этих программ, используя matherr.
- sinh coответствует стандарту ANSI. sinhf является расширением.

2.40 tan, tanf - тангенс


#include <math.h>
double tan(double x);
float tanf(float x);
tan вычисляет тангенс аргумента х. Углы определены в радианах.

- tanf идентичен с точностью до типов.


- Возвращается значение тангенса от х.
- tan отвечает стандарту ANSI C. tanf является расширением.

2.41 tanh, tanhf - гиперболический тангенс


#include <math.h>
double tanh(double x);
float tanhf(float x);
tanh вычисляет гиперболический тангенс от аргумента х. Углы
определены в радианах.

- tanh(x) определяется как sinh(x)/cos(x)


- tanh и tanhf возвращают вычисленное значение гиперболического тангенса.
- tanh coответствует стандарту ANSI. tanhf является расширением.

You might also like