- •Міністерство освіти і науки україни
- •Розділ 1. Арифметичні основи обчислювальних машин
- •1.1. Позиційні системи числення. Переведення числа з однієї системи числення в іншу
- •1.2. Форма представлення чисел. Кодування чисел
- •1.3. Арифметичні операції над двійковими числами. Машинні одиниці інформації
- •Контрольні питання
- •Завдання
- •Розділ 2. Основи алгоритмізації обчислювальних процесів
- •2.1. Поняття і властивості алгоритму
- •2.2. Засоби представлення алгоритмів
- •2.3. Типи алгоритмічних процесів. Приклади
- •Контрольні питання
- •Завдання
- •3.1. Загальна характеристика програми
- •3.3. Кроки для створення та виконання програми
- •3.4. Змінні та константи
- •3.5. Директиви препроцесора
- •Контрольні питання
- •Розділ 4. Введення-виведення даних
- •4.1. Об’єкт виведення даних cout
- •4.2. Функція виведення даних printf
- •4.3. Об’єкт введення даних cin
- •4.4. Функція введення даних scanf
- •Контрольні питання
- •5.2. Операції відношення
- •5.3. Логічні операції
- •5.4. Додаткові операції
- •5.5. Порозрядні операції
- •Контрольні питання
- •Завдання Лінійний обчислювальний процес
- •1. Визначити значення функції y
- •2. Геометричні завдання
- •Розгалужений обчислювальний процес
- •1. Визначити значення функції y
- •3. Перевірити, чи міститься точка з заданими координатами усередині заштрихованої області.
- •Розділ 6. Організація циклів
- •6.1. Організація арифметичних циклів з використанням оператору for
- •6.2. Організація ітераційних циклів з передумовою while та післяумовою do...While
- •6.3. Оператори switch та goto
- •Контрольні питання
- •Завдання Арифметичний цикл
- •Вкладені цикли
- •Ітераційний цикл
- •Суміщення розгалуженого та циклічного процесів
- •Розділ 7. Зовнішні пристрої та символьне введення/виведення. Рядкові, числові функції та функції роботи з датою та часом
- •7.1. Загальна концепція та функції символьного введення-виведення
- •7.2. Символьні функції
- •7.3. Рядкові функції
- •7.4. Числові функції
- •7.5. Функції роботи з датою та часом
- •Контрольні питання
- •Завдання
- •Розділ 8. Вказівки, посилання та масиви
- •8.1. Вказівки
- •8.2. Посилання
- •8.3. Одновимірні масиви
- •8.4. Багатовимірні масиви
- •8.5. Символьні масиви
- •Контрольні питання
- •Завдання Одновимірні масиви
- •Двовимірні масиви
- •Розділ 9. Робота з функціями
- •9.1. Засоби створення функцій
- •9.2. Видимість змінних
- •9.3. Параметри функції та передача значень
- •9.4. Передача масивів в якості параметрів функцій
- •9.5. Функції та вказівки
- •9.6. Перевантаження та шаблони функцій
- •Контрольні питання
- •Завдання
- •Розділ 10. Рекурсивне програмування
- •10.1. Основні поняття рекурсії. Визначення факторіалу числа
- •10.2. Приклади рекурсій
- •Контрольні питання
- •Розділ 11. Робота з файлами
- •11.1. Робота з текстовими та бінарними файлами
- •Можливі режими доступу
- •11.2. Довільний доступ у файлах
- •11.3. Файли потокового введення/виведення з використанням структури file.
- •Контрольні питання
- •Завдання
- •Розділ 12. Структури
- •12.1. Загальна характеристика структури
- •12.2. Масиви структур
- •12.3. Використання масивів, як елементів структур
- •3. Робота зі структурами є універсальною, передбачено додавання записів до файлу (флаг ios:app). Для підрахунку кількості структур на диску приведемо наступні рядки програми:
- •Контрольні питання
- •Завдання
- •Розділ 13. Об’єднання та інші типи даних. Обробка виключних ситуацій
- •13.1. Об’єднання
- •13.2. Перелічені типи даних (enum)
- •13.3. Бітові поля
- •13.4. Обробка виключних ситуацій
- •Контрольні питання
- •Розділ 14. Динамічні структури даних
- •14.1. Стек
- •14.2. Черга
- •14.3. Лінійний список
- •Контрольні питання
- •Завдання
- •Розділ 15. Типові методи сортування масивів
- •15.1. Бульбашкове сортування (bubble sort)
- •15.2. Сортування за допомогою вибору (choice sort)
- •15.3. Сортування вставками (insert sort)
- •15.4. Сортування Шелла
- •15.5. Швидке сортування (quick sort)
- •Контрольні питання
- •Завдання
- •Розділ 16. Чисельне диференціювання та інтегрування
- •16.1. Методи правих та центральних різниць чисельного диференціювання
- •16.2. Методи прямокутників, трапецій, Сімпсона (парабол) чисельного інтегрування
- •Контрольні питання
- •Завдання Чисельне диференціювання
- •Чисельне інтегрування
- •Розділ 17. Чисельні методи розв’язання алгебраїчних рівнянь
- •17.1. Метод половинного ділення (дихотомія)
- •17.2. Метод Ньютона (метод дотичних)
- •17.3. Метод Рибакова
- •Контрольні питання
- •Завдання
- •Розділ 18. Чисельні методи розв’язання системи лінійних алгебраїчних рівнянь
- •18.1. Визначник. Дії над матрицями. Обчислення оберненої матриці
- •18.2. Метод оберненої матриці.
- •18.3. Метод Крамера
- •18.4. Метод Гауса
- •Контрольні питання
- •Завдання
- •1. Розв’язати систему алгебраїчних рівнянь.
- •2. Обчислити добуток матриць.
- •3. Розв’язати матричні рівняння.
- •Список літератури
9.6. Перевантаження та шаблони функцій
Перевантаження функцій.
Для реалізації одного й того ж алгоритму можна використовувати функції, які мають одне й теж ім’я. Використання декількох функцій з одним й тим же ім’ям, але з різними типами параметрів, називають перевантаженням функцій.
По типу вхідних та вихідних параметрів компілятор визначає, яку функцію треба визвати.
Наприклад, треба знайти мінімальне значення з двох чисел.
#include <iostream>
using namespace std;
int min(int x, int y)
{
cout<<"min1 = ";
return (x<y)?x:y;
}
double min(double x, double y)
{
cout<<"min2 = ";
return (x<y)?x:y;
}
void main()
{
cout<<min(3, 4)<<"\n";
cout<<min(3.0, 4.0)<<"\n";
}
Результат виконання програми:
min1 = 3
min2 = 3
Тобто у першому випадку спрацювала функція, яка приймає та повертає значення типу int, у другому випадку – double.
Перевантажені функції можуть мати параметри за умовчанням, при цьому значення одного й того ж параметру у різних функціях повинні мати однакове значення. Функції не можуть бути перевантажені, якщо опис їх параметрів відрізняється тільки модифікатором const або використанням посилання (наприклад int та const int або int та int&).
Шаблони функцій.
За допомогою шаблонів можна створювати родові функції (generic functions). У родовій функції тип даних, з яким функція працює, задається у якості параметру. Це дозволяє одну й ту ж функцію використовувати з декількома різноманітними типами даних та без необхідності програмувати нову версію функції або класу для кожного конкретного типу даних. Таким чином шаблони дають можливість створювати багатократно використовуємі програми.
Родова функція визначає базовий набір операцій, які будуть застосовуватись до різних типів даних. Родова функція працює з тим же типом даних, який вона отримує у якості параметру. Як відомо, багато алгоритмів логічно однакові, незалежно від того, для обробки яких типів даних вони призначені. Наприклад, алгоритм швидкого сортування однаковий як для масивів цілих, так і для масивів дійсних чисел. Це той випадок, коли данні, що сортуються відрізняються тільки по типам. За допомогою створення родової функції можна незалежно від типу даних визначити сутність алгоритму. Після того як це зроблено, компілятор автоматично генерує правильний код для фактично використовуваного при виконанні функції типу даних. При створенні родової функції – створюється функція, яка може автоматично перевантажуватися сама.
Родова функція створюється за допомогою ключового слова template. Нижче представлено типову форму визначення функції-шаблону:
template <class Фтип> повертаєме_значення ім’я_функції (список параметрів)
{
//тіло функції
}
Тут замість Фтип вказується тип використовуваних функцією даних. Цей тип можна вказувати усередині визначення функції. Однак, він є фіктивним, його компілятор автоматично замінить реальним типом даних при створенні конкретної версії функції.
Наведемо приклад програми в якій створюється родова функція, яка міняє місцями значення двох змінних, що передаються їй в якості параметрів. Оскільки процес обміну двох значень не залежить від типу змінних – його реалізація ефективна за допомогою родової функції.
#include <iostream>
using namespace std;
//Функція-шаблон
template <class A> void swap1(A&x, A&y)
{
A temp;
temp = x;
x = y;
y = temp;
}
void main()
{
int a, b;
a = 5; b = 10;
double x, y;
x = 5.8; y = 10.27;
cout<<"a = "<<a<<" b = "<<b<<"\n";
cout<<"x = "<<x<<" y = "<<y<<"\n";
swap1(a, b); //обмін цілих чисел
swap1(x, y); //обмін дійсних чисел
cout<<"a = "<<a<<" b = "<<b<<"\n";
cout<<"x = "<<x<<" y = "<<y<<"\n";
}
Результат виконання програми наступний:
a = 5 b = 10
x = 5.8 y = 10.27
a = 10 b = 5
x = 10.27 y = 5.8
Ключове слово template використовується для визначення родової функції. Рядок:
template <class A> void swap1(A&x, A&y)
повідомляє компілятору дві речі: по-перше, створюється шаблон, та по-друге, починається визначення родової функції. Тут A – родовий тип даних. Після рядка з ключовим словом template функція swap() оголошується з типом даних A значень, що обмінюються. У функції main() функція swap1() викликається з двома різними типами даних: цілими та дійсними. Оскільки функція swap1() – родова функція, компілятор автоматично створює дві її версії: одну для обміну цілих значень, іншу для обміну дійсних значень.
За допомогою інструкції template можна визначити більше одного родового типу даних. Наприклад, у даній програмі створюється родова функція, в якій є два родові типи даних:
#include <iostream>
using namespace std;
//Функція-шаблон
template <class type1, class type2>
void myfunc(type1 x, type2 y)
{
cout<<"x = "<<x<<" y = "<<y<<"\n";
}
void main()
{
myfunc(10,"Hello");
myfunc(5.15,13L);
}
Результат виконання програми наступний:
x = 10 y = Hello
x = 5.15 y = 13
У даному прикладі при генерації конкретних екземплярів функції myfunc(), типи даних type1 та type2 замінюються компілятором на типи даних int та char* або double та long відповідно.