
- •Лабораторна робота №1
- •Порядок виконання роботи
- •Завдання 1
- •Завдання 2
- •Завдання 3
- •Теоретичні відомості Масиви динамічної пам'яті
- •Приклад виконання завдання 1
- •Лістинг програми
- •Приклад виконання завдання 2
- •Лістинг програми
- •Приклад виконання завдання 3
- •Лістинг програми
- •Контрольні запитання
- •Лабораторна робота №2
- •Порядок виконання роботи
- •Завдання 1
- •Завдання 2
- •Теоретичні відомості Читання і запис текстових файлів
- •Читання і запис бінарних файлів
- •Відкриття бінарних файлів
- •Файли з послідовним доступом
- •Запис даних у файл з послідовним доступом
- •Файли з довільним доступом
- •Приклад виконання завдання 1
- •Приклад виконання завдання 2
- •Контрольні запитання
- •Лабораторна робота №3
- •Порядок виконання роботи
- •Завдання 1
- •Завдання 2
- •Завдання 3
- •Теоретичні відомості
- •Обмеження доступу до членів класу
- •Специфікатори доступу
- •Вбудовані функції-члени
- •Приклад виконання завдання 1.
- •Приклад виконання завдання 2.
- •Приклад виконання завдання 3.
- •Контрольні запитання
- •Лабораторна робота №4
- •Порядок виконання роботи
- •Завдання 2
- •Теоретичні відомості Конструктори і деструктори
- •Правила роботи з конструкторами і деструкторами
- •Варіант 10. Розробити описовий алгоритм, схему алгоритму і написати метод для підрахування кількості слів в текстовому файлі.
- •Приклад виконання завдання 2
- •Контрольні запитання
- •Лабораторна робота №5
- •Порядок виконання роботи
- •Завдання 1
- •Завдання 2
- •Теоретичні відомості Принципи спадкування в ооп
- •Оголошення похідних класів
- •Конструктори похідного класу
- •Функції члени похідного класу
- •Заборонені члени класу (Protected)
- •Приклад виконання Завдання 1
- •Контрольні запитання
- •Лабораторна робота №6
- •Порядок виконання роботи
- •Завдання 1
- •Теоретичні відомості Перевантаження операторів
- •Приклад виконання завдання 1
- •Приклад виконання завдання 2
- •Приклад виконання завдання 3
- •Приклад виконання завдання 4
- •Контрольні запитання
- •Лабораторна робота №7
- •Порядок виконання роботи
- •Завдання 1.
- •Завдання 2.
- •Теоретичні відомості
- •Структура наслідування класів
- •Постановка задачі
- •Розробити клас трикутника, чотирикутника, кола, точки
- •Контрольні запитання
- •Лабораторна робота №8
- •Порядок виконання роботи
- •Завдання 1
- •Контрольні запитання
- •Лабораторна робота №9
- •Порядок виконання роботи
- •Завдання 1
- •Теоретичні відомості Множинне спадкування
- •Контрольні запитання
- •Лабораторна робота №10
- •Порядок виконання роботи
- •Завдання 1
- •Теоретичні відомості Шаблони
- •Параметризовані класи
- •Визначені об’єкти-потоки
- •Операції поміщення та вилучення
- •Приклад виконання Завдання з варіанту 2
- •Контрольні запитання.
- •Лабораторна робота №11
- •Порядок виконання
- •Завдання 1
- •Завдання 2
- •Завдання 3 Варіант 1. Задача “Банківське переведення” (дата, час, № рахунку, розмір рахунку).
- •Ітератори
- •Для роботи з вектором необхідно:
- •Приклад роботи з вектором
- •Алгоритми
- •Застосування алгоритмів до вектора
- •Приклад 1 виконання Завдання 1
- •Приклад 2 виконання Завдання 2
- •Приклад 3 виконання завдання №3
- •Контрольні запитання
- •Завдання 1
- •Теоретичні відомості Приклад розробки програми
- •Контрольні запитання
- •Лабораторна робота №13
- •Порядок виконання
- •Завдання 2.
- •Теоретичні відомості
- •Стандартні потоки для базових класів
- •Форматування даних при обмінах з потоками
- •Маніпулятори
- •Приклад розробки програми
- •Контрольні запитання
- •Лабораторна робота №14
- •Порядок виконання
- •Завдання
- •Теоретичні відомості
- •Контрольні запитання
Визначені об’єкти-потоки
Механізм потоків C++ грунтується на перевантаженні функцій (операцій), що забезпечує для кожного типу даних, які передаються, виклик відповідної функції. Застосування процедур обмежено файловими потоками та деякими пристроями, доступ до яких можливий як до визначених потоків. Ці процедури не допускають розширення. Класи C++, завдяки поліморфізму, дозволяють одним і тим же процедурам працювати з потоками різних типів. Широке використання перевантажених функцій дозволяє бібліотеці потоків підтримувати однаковий інтерфейс I/O. Такий інтерфейс робить код більш розбірливим та сприяє кращому абстрагуванню даних. Крім того, застосування у I/O - класах перевантажених операцій приводить до більш простого та зрозумілого синтаксису.
Щоб забезпечити програмі доступ до бібліотеки потоків C++, необхідно включити заголовочний файл iostream.h; також можуть знадобитися файли fstream.h (файловий ввод/вивід), iomaniph (файл маніпуляторів) та strstream.h (резвдентігі потоки).
Бібліотека iostream має чотири визначених об'єкта потока. Всі вони асоційовані зі стандартним інтерфейсом I/O. Ці об'єкти описані у таблиці 10.1 :
Таблиця 10.1 - Функції бібліотеки iostream
Ім’я |
Клас |
Опис |
Сіn |
Istream |
Асоціюється зі стандартним введенням (клавіатурою) |
Cout |
Ostream |
Асоціюється зі стандартним виведенням (екраном) |
Cerr |
Ostream |
Асоціюється зі стандартним пристроєм помилок (екраном) з небуферизованим виводом |
Clog |
Ostream |
Асоціюється зі стандартним пристоєм помилок (екраном) з буферізованим виводом |
Операції поміщення та вилучення
Бібліотека класів C++ передбачає два основних класи для вводу та виводу: відповідно istream та ostream. Потокові оператори застосовуються наступним чином:
об'єкт_потоку_вводу » змінна; об’ект_потоку_виводу « змінна;
Примітка. Ці оператори не слід шугати з відомими побітовими операторами зсуву вліво та вправо. Образно кажучи, в розглядуваному контексті перевантажені оператори » та « однозначно ясно вказують напрямок потоку даних від одного об'єкта до іншого.
Поток cout (character out) - стандартний символьний вихідний шток, що по замовчування відповідає пристрою виведення (дисплей). Клас ostream використовує для виведення перевантажену операцію лівого зсуву («), Якщо ця операція застосовується об'єктом-потоком, вона носить ім'я операції поміщення у поток (insertion operation). Наступний приклад друкує рядок, застосовуючи операцію поміщення до визначеного об'єкту cout
#include<iostream.h>
int main(void)
{
cout «'Hello!';
return 0;
Проаналізуємо, як відпрацює такий фрагмент. По-перше, С++ визначить, що в даній операції « лівий аргумент cout має тип ostream, а правий ~ char*. За цими даними у заголовочному файлі буде знайдений відповідний прототип функції - ostream& operator«(ostream&, char*). Після цього буде згенерований виклик функції поміщення у поток operator« з рядком ‘Hello!’ та екземпляром cout в якості параметрів. Іншими словами, здійснюватиметься виклик стандартної бібліотечної функції operator«(couit'Hello!'), як того у даному випадку вимагає прототип.
Аналогом в традиційному С потоку cout відповідає функція fprintf() та ім'я пристрою виведення stdout Розглянемо простий приклад, що застосовує у двох варіантах відповідно printf() (це тільки скорочена форма fprintf(stdout, ...j) та об'єкт cout:
1 варіант double num=2.35;
printf ("show I:%Id\а", ішш); // "сміття" па виході!
2 варіант double num~2.35;
cout«”show 2=”«num«”\n”; // а тут все буде правильно
Саме тут і впадає в очі перевага потоків. Символи % ld в першому варіанті повідомляють про те, що змінна num відноситься до типу long. У наступному рядку при активації функції виявляється невідповідність типів, і printf() мовчки виконує неправильне виведення. Застосовуючи у другому варіаші об'єкт - поток, подібна помилка просто виключена - інформація про тип автоматично надходить безпосередньо від самого об'єкту cout.
Поток cin(character in) - стандартний символьний поток введення, що по замовчування відповідає клавіатурі. Клас istream використовує для введення перевантажену операцію правого зсуву (>>). У розглядуваному контексті її називають операцією вилучення з потоку (extraction operation). Аналогом цього потоку в Сі відповідає fscanf() та ім'я пристрою stdin. Наступний приклад застосовує операцію вилучення зі стандартного потоку для визначеного об'єкту сіп, аби прочитати рядок з клавіатури:
#include<iostream.h> int main(void)
{
char name [100];
cout«”Введіть ваше ім'я;”;
сіn » name;
cout «"Привіт,";
cout«name;
return 0;
Класи istream та ostream відповідно » та « для усіх вбудованих типів даних. Таке перевантаження дозволяє використовувати однаковий синтаксис для роботи зі змінними різних типів. Наступний приклад ілюструє тотожність синтаксису в такій ситуації:
#include <iostream,h>
int main (void) {
Char c=’A’;
signed char sc =‘B’;
unsigned char uc~C’;
int i = 0xd;
float f= 1.7;
double d = 2.8;
cout« c; // Викликає operator «(char)
cout«sc; //Викликає operator «(signed char)
cout«uc; //Викликає operator «(unsigned char)
cout«i; //Викликає operator «(int)
cout« f; // Викликає operator « (float)
cout« d; // Викликає operator « (double) return 0;}