
AP_RGZ_2015
.pdf61
2.2.4.6 Сортування підрахунком
В сортуванні підрахунком (counting sort) передбачається, що всі n елементів – цілі числа, які лежать в інтервалі від 0 до k, де k – деяка ціла стала.
Основна ідея сортування підрахунком полягає в тому, щоб для кожного вхідного елементу x визначити кількість елементів, які менші за x. За допомогою даної інформації елемент x можна розташувати на тій позиції вихідного масиву, де він повинен знаходитись. Наприклад, якщо всього є 17 елементів, які менші за x, то у вихідній послідовності елемент x повинен займати 18-у позицію.
2.2.5 Робота з файлами
У програмах, написаних мовою С/С++, всі операції введення/виведення реалізуються за допомогою бібліотечних функцій, що входять до складу конкретної системи програмування. Під час роботи з файлами дані можуть передаватися у бінарному або в текстовому форматі.
Бібліотека С/С++ підтримує два основні способи роботи з файлами:
–форматоване введення/виведення за допомогою функцій (заголовний файл stdio.h);
–потокове введення/виведення (заголовний файл fstream).
За першого способу роботи з файлами (за допомогою бібліотечних функцій stdio.h) застосовується спеціальна керуюча структура, що містить інформацію про файл та надає тимчасовий буфер для зберігання даних. Дана структура має тип FILE. Крім тимчасового буферу у керуючій структурі міститься інформація про ідентифікатор файлу, його розташування на диску та покажчик поточної позиції у файлі.
Типовий сценарій роботи з файлами:
–відкриття файлу: вказується ім’я файлу, визначається режим доступу (читання, запис, додавання) та тип файлу (текстовий або двійковий);
–читання або запис даних: після того, як відкриття файлу успішно виконано, з нього можна прочитати або записати в нього дані
увизначеному форматі (форматоване введення/виведення);

62
–закриття файлу: для завершення роботи з файлом його необхідно закрити.
Для реалізації даного сценарію в бібліотеці stdio.h призначені наступні функції:
–відкриття файлу – функція fopen();
–форматоване виведення даних – сімейство функцій printf() (fprintf());
–форматоване введення даних – сімейство функцій scanf() (fscanf());
–закриття файлу – fclose().
Функція fopen() має наступний синтаксис:
EXP
FILE* fopen (const char * ім’я_файлу, const char * режим);
У стандарті мови С/С++ серед інших визначено наступні режими доступу до файлів:
–r – доступ тільки для читання (застосовний тільки для існуючого файлу);
–w – доступ для запису: якщо файл існує, його вміст очищується, а якщо файл не існує, то в такому випадку він створюється;
–a – доступ для додавання нової інформації: якщо файл вже існує, дані додаються в кінець, а якщо файл не існує, то в такому випадку він створюється.
При визначенні режиму доступу для двійкового файлу використовується тип файлу b, а для текстового файлу – t.
Функція виведення даних у файл fprintf() має наступний синтаксис:
EXP
int fprintf (FILE * потік, const char * формат, ...);

63
В якості параметра формат може використовуватися довільний рядок, що може містити специфікатори формату наступного вигляду:
EXP
%[прапори][ширина][.точніть][довжина]специфікатор
Поле специфікатор визначає тип та формат даних, що буде записано у файл.
Функція fscanf() має наступний синтаксис:
EXP
int fscanf (FILE * stream, const char * format, ...);
Для читання з файлу або запису в файл структури або масиву використовують наступні функції:
EXP
size_t fread (void * ptr, size_t size, size_t count, FILE * stream); size_t fwrite (const void * ptr, size_t size, size_t count, FILE *
stream);
Дані функції мають наступні параметри:
–ptr – покажчик на масив, що буде прочитано з файлу (або записано в файл);
–size – розмір елементу масиву в байтах;
–count – кількість елементів у масиві;
–stream – покажчик на структуру FILE.
За другого способу роботи з файлами використовуються потоки введення/виведення ifstream та ofstream відповідно.

64
У такому випадку для відкриття файлу можна використати наступні способи на основі створення потоку та застосування відповідних методів, представлений у загальному вигляді:
EXP
ifstream ( const char * filename, mode); ofstream ( const char * filename, mode); void open ( const char * filename, mode); void open ( const char * filename, mode);
При цьому використовуються наступні параметри:
– filename – імя файлу;
– mode – режим доступу до файлу:
а) app – доступ для додавання нової інформації; б) ate – перемістити вказівник файлу в кінець; в) binary – режим доступу до бінарного файлу; г) in – доступ для читання;
д) out – доступ для запису;
е) trunc – створити порожній файл для читання та запису. Приклад відкриття файлів за допомогою потоків:
C++
ifstream in1(“test.in”); ofstream out1(“test.out”);
2.2.6 Створення багатофайлових програмних проектів
У багатофайловому проекті функції, які визначаються в одному файлі програми, можуть використовуватись у іншому.
Наприклад, розглянемо елементарну програму, у якій обчислення суми двох цілих чисел реалізовано у вигляді користувацької функції та винесено в окремий файл.

65
У такому випадку головний файл програми main.cpp містить наступний текст:
C++
#include <iostream> #include "mycalc.h"
using namespace std;
int main(int argc, char *argv[])
{using namespace mycalc; int c=mysum(10,15); cout<<c;
return 0;
}
Текст файлу mycalc.h:
C++
namespace mycalc {int mysum(int, int);
}
Текст файлу mycalc.cpp:
C++
#include "mycalc.h" namespace mycalc
{int mysum (int a, int b) { return a+b;
}
}
66
2.3 Завдання до роботи
2.3.1Ознайомитися з основними теоретичними відомостями за темою роботи, використовуючи дані методичні вказівки, лекції, а також рекомендовану літературу.
2.3.2Роз’язати за допомогою програм мовою С++ завдання відповідно до варіанту.
2.3.2.1 Завдання для варіанта № 1:
а) Сформувати всі k-елементні підмножини множини, члени якої задані у вигляді рядків, за допомогою використання рекурсивного алгоритму. Виділити всі необхідні функції.
Рядки містяться у текстовому файлі, ім’я якого задається користувачем під час роботи програми з клавіатури. Вивести всі сформовані підмножини для заданого користувачем k на екран та у окремий файл. Повторювати відповідні дії, поки в якості k не буде задано не додатне значення. Якщо k більше кількості рядків, вивести відповідне повідомлення.
б) У деякому змаганні беруть участь спортсмени, дані про які представлені у файлі в наступному вигляді: прізвище, ім’я, дата народження, спортивний клуб, результат виступів у п’яти конкурсах (кількість балів). Ім’я файлу задається користувачем з клавіатури.
Програма повинна надавати наступну функціональність, а відповідні програмні функції виділено у окремий файл програми:
– визначення рейтингу спортивних клубів за кількістю призових місць, зайнятих їх спортсменами;
– визначення призових місць у кожному змаганні за віковими категоріями (кількість категорій задається користувачем);
– визначення п’яти найкращих спортсменів, які візьмуть участь
уфінальному змаганні двома способами: за зайнятими місцями (перше місце 10 балів, друге – 5, третє – 3) та за загальною кількістю балів (спосіб обирається користувачем) з формуванням відповідного файлу;
– пошук спортсменів, які займали або перше місце, або не потрапляли у призову трійку (виводити в алфавітному порядку за прізвищем).
Робота з програмою повинна реалізовуватись за допомогою меню, за допомогою якого також має бути реалізовано внесення змін у файл.
67
2.3.2.2 Завдання для варіанта № 2:
а) Підрахувати у заданому файлі кількість слів, речень (речення закінчується крапкою, питальним і/або окличним знаком), друкованих знаків без пробілів, друкованих знаків і пробілів, абзаців. Ім’я файлу та повний шлях до нього передаються під час запуску програми з командного рядка. Виділити всі функції, необхідні для виконання вказаних дій.
б) Інформація про відвідуваність сайту включає: адресу webсторінки, ip-адресу відвідувача, web-браузер відвідувача, дату візиту (ДДММРРРР ГГ:ХХ:СС) та час проведений на даній сторінці. Дана інформація зберігається у файлі webcounter, а дані про всі webсторінки на даному сайті містяться у файлі pages. Адреси файлів webcounter і pages передаються в програму через командний рядок. В програмі визначити також шлях до них за замовчанням. Інформація у файлах може зберігатися у довільному порядку.
Створити багатофайлову програму: у одному файлі програми виконується оброблення даних з файлу (введення, виведення та редагування у вигляді функцій), а у другому забезпечується виконання наступних функцій:
–підрахунок чисельності та середньої тривалості відвідувань кожної сторінки сайту (сортування даних за чисельністю відвідувань, за рівної відвідуваності – за середньою тривалістю);
–визначення динаміки відвідування даного сайту за днями (зазначаючи день тижня), місяцями або роками (на вибір користувача);
–виведення інформації про всі відвідування заданої webсторінки протягом заданого інтервалу часу (сортування за часом відвідування, за рівної дати – за ip-адресою);
–виведення інформації про відвідуваність у набір файлів, кожний з яких має назву, що включає відповідну дату, та містить дані про відвідуваність сторінок за вказану дату.
Режим роботи програми повинен розпочинатися з завантаження даних з файлів, після чого користувач за допомогою меню вибирає, яку з функцій роботи зі статистикою необхідно виконати або яким чином змінити дані у файлах: додати їх або відредагувати існуючі (наприклад, змінити проведений час на сторінці або будь-які інші параметри).
68
2.3.2.3 Завдання для варіанта № 3:
а) У кожному рядку текстового файлу містяться багаточлени. Кожен одночлен у багаточлені відділяється від іншого одночлена арифметичною операцією (додавання або віднімання). Кожен одночлен містить набір змінних, імена кожної з яких складаються з однієї літери, та чисел. Перше число в одночлені – коефіцієнт, який може бути пропущено. Наступні числа, що є цілими числами (необов’язково невід’ємними), – ступені змінних.
Передбачити функцію, яка виділяє одночлени з багаточлена. Виконати приведення багаточленів. Для цього передбачити
необхідні функції.
б) Журнал подій операційної системи містить назву додатку, рівень події (помилка, попередження тощо), код події, дату події, час події, активність (активна чи ні) та деякий текст повідомлення. Дані журналу подій зберігаються у файлі, назва якого задається користувачем на самому початку роботи програми з клавіатури.
Створити окремий програмний файл для роботи з даними, що забезпечує виконання наступних функцій:
–виведення інформації про події з зазначенням часу (днів, годин, хвилин), що пройшов на поточний момент з даної події;
–підрахування кількості помилок, що відбулись за вказану дату, та виведення інформації про кожну з них;
–підрахування кількості активних попереджень за поточний день та виведення інформації про кожне з них;
–виведення інформації про події у набір файлів, кожний з яких має назву, що включає відповідну дату, та містить дані про події операційної системи за вказану дату.
Всі повідомлення виводити у порядку за датою та часом події. Після того, як відповідне повідомлення було виведено на екран,
передбачити зміну його активності на неактивне (після додавання події в файл повідомлення активне).
Режим роботи даної багато файлової програми повинен розпочинатися з визначення шляху до файлу з журналом подій, завантаження даних з нього, після чого користувач за допомогою меню вибирає, яку з функцій роботи необхідно виконати. Передбачити додавання інформації про нові події до файлу користувачем.
69
2.3.2.4 Завдання для варіанта № 4:
а) Згенерувати всі k-елементні підмножини n-елементної множини, члени якої задані у вигляді чисел з плаваючою крапкою, за допомогою використання рекурсивного алгоритму. Набір чисел міститься у бінарному файлі, ім’я якого передається з командного рядка під час запуску. Передбачити файл за замовчанням. Виділити всі необхідні функції.
б) Статистика відправлення повідомлень міститься у файлі та включає e-mail відправника, e-mail одержувача, дату відправлення, час відправлення, заголовок повідомлення, розмір повідомлення. Ім’я файлу задається з командного рядка під час запуску програми.
Програма повинна складатися з декількох файлів, у першому з яких виконується оброблення даних з файлу (введення, виведення та редагування у вигляді функцій), а у другому забезпечується виконання наступних функцій:
–виведення інформації про всі повідомлення даного користувача, зазначаючи час, який пройшов з моменту його відправлення (сортування за даним показником);
–виведення інформації про всі повідомлення, відправлені протягом заданого інтервалу часу (сортування за розміром повідомлень);
–пошук всіх повідомлень за заданою тематикою (ключовими словами з заголовку) з зазначенням кількості таких повідомлень (сортування виконувати за заголовками, а вразі однакових заголовків
–за відправником);
–виведення інформації про електронні повідомлення у набір файлів, кожний з яких має назву, що включає e-mail відправника, та містить дані про повідомлення, відправлені з відповідного e-mail.
Робота програми повинна бути реалізована у вигляді меню, звідки користувач може вибрати, яку з функцій роботи необхідно виконати. За допомогою меню передбачити також додавання інформації про нові повідомлення до файлу користувачем та зчитування даних з файлу (якщо зчитування не виконано, а запитується виконання функцій аналізу даних, вивести відповідне повідомлення).
2.3.2.5 Завдання для варіанта № 5:
а) У файлі міститься набір цілих чисел у десятковій системі числення. Перетворити їх у двійкову систему та поміняти місцями
70
парні та непарні біти кожного числа. У результаті сформувати другий файл, у якому містяться числа у десятковій системі числення. Передбачити також функцію для виконання зворотних дій.
Передбачити можливість роботи з цілими числами зі знаком та без. Для одного варіанту біт, що відповідає за знак числа, не змінювати, у другому – змінювати і його. Варіант роботи обирається користувачем. Імена файлів задаються користувачем з клавіатури.
Функції шифрування та дешифрування мають бути виділені в окремий файл багато файлової програми.
б) Інформація про співробітників містить прізвище, ім’я та по батькові, посаду, погодинний тариф. У другому файлі міститься інформація про облік роботи кожного співробітника за місяць. Кожний запис містить прізвище, ініціали, дату, час виходу на роботу, час завершення роботи. Шлях до кожного з файлів задається з командного рядка під час запуску програми.
Відомо, що робочий час понад 144 години вважається понаднормовим та сплачується подвійно. Вивести розмір заробітної платні кожного співробітника фірми з вирахуванням податків, розмір яких прийняти рівним 22 % від нарахованої суми.
Реалізувати можливість заповнення файлів програмно. Передбачити можливість змінення посади та погодинного тарифу для кожного співробітника.
2.3.2.6 Завдання для варіанта № 6:
а) Пряма на площині задається рівнянням. Коефіцієнти рівняння задаються цілими числами та зберігаються у текстовому файлі.
Сформовано два файли. Перший файл містить набори прямих (задані коефіцієнтами), які між собою паралельні. Другий файл містить набори перпендикулярних між собою прямих. Якщо прямі в наборах повторюються, то залишити тільки одну з них.
Вивести у третій та четвертий файл відповідно дані про прямі, які між собою паралельні та перпендикулярні. Дані у файл виводити наступними групами: число, яке задає кількість прямих, та параметри кожної з них. У кожній групі всі прямі (окрім першої) повинні бути перпендикулярні або паралельні першій прямій.
Визначити необхідні функції. Імена файлів задаються користувачем з клавіатури.
б) Робота кондиціонера в системі «Розумний будинок» характеризується датою та часом вмикання кондиціонера,