
- •Лабораторна робота №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
- •Порядок виконання
- •Завдання
- •Теоретичні відомості
- •Контрольні запитання
Форматування даних при обмінах з потоками
Для форматування даних при обміні з потоками існують такі засоби:
- прапори форматування дозволяють виводити значення з різноманітним вирівнюванням;
- комбінації прапорів поєднують за допомогою диз'юнкції;
- маніпулятори дозволяють використати себе в якості правого операнда операцій << і >> (cout<<модифікатор).
Безпосереднє застосування операцій виведення << (включення в потік) і введення >>; (витяг з потоку) до стандартних потоків cout, cin, cerr, clog для даних базових типів приводить до використання "замовчуваних" форматів зовнішнього представлення значень, що пересилаються. Наприклад, при виведенні чисел кожне з них займає рівно стільки позицій, скільки необхідно для його представлення. Це не завжди зручно і правильно. Наприклад, виконання операторів
int il= 1, i2 = 2, i3 = 3, i4 = 4, i5 = 5;
cout « "\n" « i1 « i2 « i3 « i4 « i5;
приведе до такого результату: 12345
Для поліпшення читання найпростіше явно ввести розділові пробіли. Виконавши оператор
cout « "\n"« i1 ‘ ’« i2 ‘ ’« i3 ‘ ’« i4 ‘ ’« i5 ‘
одержимо більш наочний результат: 12345
Наступний крок - додавання пояснювального тексту і(чи) символів табуляції. Ширина (кількість позицій) зовнішнього представлення кожного числа вибирається автоматично, виходячи з необхідної кількості позицій. Однаковість не завжди влаштовує користувача програми. Наприклад, періодичний дріб 1.0 / 3.0 можна представити дуже різними способами:
0.3 0.3333 3.3е-1 0.3333333е0
Однак стандартне представлення при виведенні за допомогою оператора
cout « "\nl.0/3.0 = " << 1.0 / 3.0;
буде завжди однаковим:
1.0 / 3.0 = 0.333333
Формати представлення виведеної інформації і правила сприйняття даних, що вводяться з потоку, можуть бути змінені програмістом за допомогою прапорів форматування. Прапори: реалізовані у виді окремих фіксованих битов чисел типу long, тому кілька прапорів за допомогою логічних бітових виражень можна поєднувати, тим самим по-різному комбінуючи властивості потоку.
Типи прапорів форматування представлені в таблиці 13.1.
Крім прапорів для керування форматом використовуються компонентні змінні класу ios (табл. 13.2).
У наступній програмі демонструються основні принципи форматування за допомогою компонентних функцій класу ios.
//Р11-02.СРР - форматування виведеної інформації
(include <strstrea.h>
void main ()
(char name[] = "Рядок довжиною 52 символу "
"у поле шириною 58 позицій,";
cout «n\n";
cout.width(58); // Ширина поля виводиться для потоку cout
// Символ заповнення порожніх позицій поля: cout.fill('$');
// Перший вивід рядка в потік cout:
cout <<name<<endl;
cout. width (58) ; // Забрати не можна
// Заповнювач між знаком і значенням:
cout.setf (ios: : internal) ;
double dd = -33.4455;
cout « dd « endl; // Вивід речовинного значення
cout. width ( 58 ); // Забрати не можна
// Зміна вирівнювання :
cout.setf (ios: :left,ios :: adjustfield) ;
// Символ заповнення порожніх позицій поля:
cout.fill(#);
// Другий висновок рядка в потік cout:
cout « name « endl;
long nn = 90000; // Шіснадцяткове значення Oxl5f90
// Зміна підстави числення:
cout.setf (ios: : hex, ios: :basefield) ;
// Виводити ознака підстави числення:
cout.setf (ios: :showbase) ;
// Перехід на верхній регістр :
cout.setf (ios: : uppercase) ;
cout. width (58 ); // Забрати не можна
cout « nn « endl; // Вивід цілого значення типу long
cout, width (58 ); // Забрати не можна
// Зміна вирівнювання:
cout . setf (ios : : internal , ios : : adjustfield) ;
// Символ заповнення порожніх позицій поля:
cout. fill ('$') ;
cout. unsetf (0x0200) ; // Перехід на нижній регістр
cout « nn « endl; // Вивід цілого значення типу long
}
Результат виконання програми:
$$$$$$Рядок довжиною 52 символу в поле шириною 58 позицій.-$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$33.4455
Рядок довжиною 52 символу в поле шириною 58 позицій. ####§!
Ox$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$15f90
Прокоментуємо програму і результати. За замовчуванням ширина поля виведення встановлюється рівній довжині прийнятого представлення виведеного значення. Тому дія функції width() однократне, і її потрібно при кожному виведенні значення явно використовувати, якщо значення ширини, що замовчується, поля виведення не влаштовує програміста. Функція fill () установлює символ заповнення порожніх позицій поля. При першому виведення рядка name[] за замовчуванням установлене вирівнювання по правому краї поля, і символи $ поміщені ліворуч від умісту рядка. Перед виведенням значення дійсної перемінний dd функцією setf() установлений прапор internal. Під його впливом символ заповнення розмістився між знаком '-' і числовим значенням 33.4455. Ширина поля явно зазначена в 58 позицій.
Перед другим виводом рядка name[] "під впливом" другого параметра (adjustfield) функції setf () скинуті прапори right і internal і явно встановлений прапор left вирівнювання по лівому краї. Змінено символ заповнення порожніх позицій ‘#'. Перед виводом довгого цілого числа nn установлена підстава системи числення (basefield - скидає прапори основ числення; hex - явно встановлює шістнацяткову підставу). Установлено прапори showbase і uppercase і ширина поля виведення.
Число 90000 виведене в шіснацятковому виді, ознакою 0х позначена підстава системи числення, для зображення цифр і ознаки підстави використовуються прописні букви. Тому що при переході до вирівнювання по лівому краї прапор internal виявився скинутим, то символ заповнення '#' розміщений не після ознаки підстави числення ох, а заповнює праву порожню частину поля. Заключний вивід значення nn, рівного 90000, виконаний із прапорами internal і left. Для переходу на нижній регістр використана функція unsetf () з явним значенням прапора uppercase.
Таблиця 13.1 – Типи прапорів
Назва |
|
skipws - 0x0001
|
при такім значенні прапора операція вилучення з потоку >>буде ігнорувати (пропускати) узагальнені пробільні символи; |
left = 0x0002 |
вивід значення з лівим вирівнюванням (пригорнути до лівого краю поля); |
right = 0x0004 |
вивід значення з правим вирівнюванням (це значення встановлюється за замовчуванням); |
Internal = 0x0008 |
прийнятий як заповнювач символ (за замовчуванням пробіл) міститься між числовим значенням і знаком числа або ознакою підстави системи числення (див. нижче компонент ios::x_fill); |
dec=0x0010 |
десяткова система числення; |
oct =x0020 |
вісімкова система числення; |
hex = x0040 |
Шіснацяткова система числення; |
showbase=0x0080 |
надрукувати при виведеннік ознак системи числення (0х шіснацяткових чисел, 0 - для восьмеричних чисел); |
showpoint=0x0100 |
при виведенні дійсних чисел обов'язково друкувати десяткову крапку і наступні за нею нулі (навіть для речовинного числа, що має нульову дробову частину); |
uppercase=0x0200 |
при виведенні дійсних чисел обов'язково друкувати десяткову крапку і наступні за нею нулі (навіть для речовинного числа, що має нульову дробову частину); |
showpos = 0x0400 |
друкувати знак числа (символ '+') при виведенні позитивних - чисел ; |
scientific = 0x0800 |
для дійсних чисел (float, double) використовувати представлення у форматі з крапкою, що плаває, (наукове представлення), тобто з указівкою порядку і мантиси, що має одну ненульову (значущу) цифру перед крапкою; |
Продовження таблиці 13.1 – Типи прапорів
Fixed = 0x1000 |
для дійсних чисел (типів float, double) використовувати представлення у форматі з фіксованою крапкою, причому кількість цифр дробової частини визначається заданої за замовчуванням точністю (див. нижче перемінну x_precision); |
unitbuf = 0x2000 |
очищати всі потоки (вивантажити вміст буферів) після кожного виведення (після включення в потік); |
stdio = 0x4000 |
очищати потоки stdout, stderr (вивантажити вміст буферів) після кожного виведення (після включення в потік). |
Таблиця 13.2 - Компонентні змінні класу ios
Int x_width |
задає мінімальну ширину поля виведення |
int x_precision |
задає точність представлення дійсних чисел, тобто максимальна кількість цифр дробової частини при виведення; |
Int x_fill |
визначає символ заповнення поля виведення до мінімальної ширини, визначеної x_width. За замовчуванням x_fill має значення пробілу. |
static long bitalloc () |
повертає значення може бути для установки, очищення і перевірка прапорів. Функція призначена для заданих користувачем прапорів форматування |
char fill() |
повертає поточний символ заповнення незайнятих (порожніх) позицій поля виведення |
charFill(char) |
заміняє символ заповнення значенням параметра, повертає попередній символ заповнення; |
long flags(); |
повертаючий набір бітів прапорів форматування; |
long flags(long); |
установлює біти прапорів форматув. у відповідності зі знач. п-тра. Повертає попереднє значення прапорів; |
Продовження таблиці 13.2 -Компонентні змінні класу ios
Int precision(); |
повертає поточне значення точності представлення при виведенні дійсних чисел (типу float і double) |
Int precision(int n); |
установлює за значенням параметра n точність представлення дійсних чисел, повертає попереднє значення точності; |
long setf(long);
|
установлює прапори відповідно до того, як вони позначені у фактичному параметрі. Повертає попередню установку прапорів; |
long setf(long _setbits, long _field) ; •'?'•
|
установлює прапори у відповідності зі значеннями параметрів. Біти, позначені в параметрі _field, скидаються (очищаються), а потім установлюються ті біти, що відзначені в параметрі _setbits; |
long unsetf(long); |
скидаються (очищаються) усі біти прапорів, що помічені в параметрі. Функція повертає попереднє значення прапорів; |
Int width() ; \ |
повертає встановлене значення ширини поля |
int width (int); |
установлює значення ширини поля у відповідності зі значенням параметра xalloc; |
|
повертає індекс масиву до тих пір поки не використованих слів, які можна використовувати в якості визначених файлів форматування |