Ім'я файлу: Курсовая ТП.docx Розширення: docx Розмір: 397кб. Дата: 13.02.2023 скачати Пов'язані файли: поняття про якість продовольчих товарів.docx 6Матеріали завдань на курсову. Коклюш.doc -frankln-delano-ruzvelt.pptx Текст диплома111 (1).docx Охорона праці-реферат Гудь Ані 21 ХК.docx 446728.pptx Зміст
Вступ З моменту появи перших великих ЕОМ і до сьогодні інтенсивно вивчаються проблеми розробки та проектування системного та прикладного програмного забезпечення. В даний час розвиваються нові напрямки досліджень у цій галузі, зокрема, системні дослідження в галузі комп'ютерних технологій та систем, методології аналізу та синтезу нових інформаційних рішень. C++ передбачений класичний спосіб роботи з файлами, заснований на бібліотеці stdio.h і доступі до даних через структуру FILE. Існує також альтернативний механізм роботи з файлами у мові C++ на основі потоків та бібліотек 2 Теоритична частина C++ (Сі-плюс-плюс) — універсальна мова програмування високого рівня з підтримкою кількох парадигм програмування: об'єктно-орієнтованої, узагальненої та процедурної. Розроблена Б'ярном Страуструпом (англ. Bjarne Stroustrup) у AT&T Bell Laboratories (Мюррей-Хілл, Нью-Джерсі) у 1979 році та названа «Сі з класами». Страуструп перейменував мову у C++ у 1983р. Базується на мові Сі. Визначено стандартом ISO/IEC 14882:2003. Саме на цій мові програмування будемо створювати програму з обробки структорованих даних. 2.1 Складовий тип даних – структура Структура — це, якесь об'єднання різних змінних (навіть із різними типами даних), якому можна присвоїти ім'я. Наприклад, можна об'єднати дані про об'єкт Будинок: місто (в якому будинок знаходиться), вулиця, кількість квартир, інтернет (проведений чи ні) і т.д. в одній структурі. Загалом можна зібрати в одну сукупність дані про все, що завгодно, точніше про все, що необхідно конкретному програмісту. Всім одразу стало зрозуміло :) Якщо ви тільки приступаєте до знайомства зі структурами С++, спочатку, вам необхідно ознайомитися з синтаксисом структур у мові С++ . Розглянемо простий приклад (таблиця 2.1), який допоможе познайомитись із структурами та покаже, як з ними працювати. У цій програмі ми створимо структуру, створимо об'єкт структури, заповнимо значення елементи структури (дані про об'єкт) і виведемо ці значення на екран. Таблиця 2.1 – Створення структури
Коментарі по коду програми: У рядках 4-10 ми створюємо структуру. Щоб її оголосити використовуємо зарезервоване слово struct і даємо їй будь-яке, бажано логічне ім'я. У нашому випадку – building. З правилами іменування змінних, ви можете ознайомитись у цій статті . Далі відкриваємо фігурну дужку {, перераховуємо 4 елементи структури через крапку з комою; , закриваємо фігурну дужку } і на завершення ставимо крапку з комою;. Це буде наш шаблон (форма) структури. У рядку 16 оголошуємо об'єкт структури. Як і звичайних змінних, необхідно оголосити тип даних. У цьому ролі виступить ім'я нашої створеної структури – building. Як заповнити даними (ініціалізувати) елементи структури? Синтаксис такий: Ім'я об'єкта далі оператор точка . та ім'я елемента структури. Наприклад: apartment1.owner. Таким чином, у рядках 18-21 надаємо дані елементам структури. І так дані ми внесли. Наступне питання: «Як до них звернутися, як працювати та використовувати їх у програмі?» Відповідь - «Дуже просто - так само, як і при ініціалізації, використовуючи точку . та ім'я елемента структури». У рядках 23 - 26 виводимо заповнені елементи структури на екран. Що ще важливо знати: Об'єкт структури можна оголосити до функції main (Таблиця 2.2). Це виглядало б так: Таблиця 2.2 - Оголошення до функції main
2.2 Робота з файлами у C/С++: текстові та бінарні Файл – це набір даних, що зберігається на магнітному носії комп'ютера. Кожен файл має ім'я та розширення, яке вказує операційній системі на те, що це за файл та які дії з ним допустимі. З + + розрізняє два типи файлів (вони не пов'язані з якимись конкретними типами файлів в операційній системі): текстові та бінарні (двійкові). Ці типи умовні: будь-який файл у межах однієї програми може використовуватися як текстовий, і як бінарний. Програма на С++ може виконувати з файлами ті ж дії, що і користувач, який працює з файлом в операційній системі: відкривати та закривати файли; записувати у файл інформацію; читати інформацію, записану у файлі; редагувати дані у файлі. Слід розрізняти фізичний файл (файл, розташований на жорсткому диску і що характеризується ім'ям файлу) та файлову змінну, за допомогою якої програма працює з фізичним файлом. Файлова змінна має особливий тип покажчик на файл. Вона оголошується у програмі так: FILE * f; Після цього оголошення змінну f можна використовувати для звернення до файлу. Щоб програма могла працювати з файлами типу FILE*, потрібно підключити заголовний файл stdio.h: #include Щоб відкрити файл, необхідно скористатися командою fopen_s. При відкритті файлу змінна f зв'язується із файлом на диску (заданим своїм ім'ям). errno_t err = fopen_s(&f, fileName, "r"); //#include це варіант "secure" fopen з кількома додатковими опціями для рядка режиму та іншим методом повернення покажчика потоку та коду помилки. Він був винайдений Microsoft і увійшов до стандарту C 11. Не завжди вдається відкрити файл. При цьому повідомлення про помилку не виводиться, і при спробі виконати будь-які дії з відкритим файлом програма аварійно завершується. Щоб цього не відбувалося, потрібно щоразу після команди fopen перевіряти, чи відкрився файл. Перевірити, чи відкрився файл, можна одночасно з відкриттям: errno_t err; if ((err = fopen_s (&f, filename, "w"))! = 0) printf("File not open.\n"); Текстові файли призначені зберігання текстів, тобто сукупності символьних рядків змінної довжини. Кожен рядок завершується керуючою послідовністю '\n', а роздільниками слів та чисел у рядку є пробіли та символи табуляції. Так як вся інформація текстового файлу - символьна, програмна обробка такого файлу полягає в читанні рядків, виділення з рядка слів і, при необхідності, перетворення цифрових символьних послідовностей числа відповідними функціями перетворення. Створювати та редагувати текстові файли можна не лише у програмі, а й у будь-якому текстовому редакторі, наприклад, Word, WordPad чи Блокноті. Послідовність роботи з файлом під час запису даних така: відкрити або створити файл для запису (або для читання та запису) в кінець файлу: errno_t err; if ((err= fopen_s(&f, filename, "wt+"))!=0) printf("File not open.\n"); 2) записати дані у файл: fputs(s,f); або fprint(f, <дані типу (char *) з форматом чи без>); 3) закрити файл - fclose(f); Тут filename - змінна (C-рядок), яка містить фізичне ім'я файлу, а s – рядок, з якого у файл записуються дані. Читання даних із файлу виконується в такій Послідовності: 1) відкрити файл для читання: errno_t err; if ((err= fopen_s(&f, filename, “rt+"))!=0) printf("File not open.\n"); 2) здійснити читання даних із файлу: fscanf(f, <форматовані дані>) або fgets(s,80,f); 3) закрити файл: fclose (f); Для читання послідовно всіх даних із файлу необхідно організувати цикл доки не досягли кінця файлу, використовуючи або функцію feof(f), яка повертає значення true при досягненні кінця файлу: Бінарні (двійкові) файли зберігають дані в тому ж форматі, в якому вони були оголошені, а їх вигляд є таким самим, як і в пам'яті комп'ютера. Тому відпадає потреба у використанні роздільників: прогалини, керуючих послідовностей, а також, розмір пам'яті, що використовується порівняно з текстовими файлами з аналогічною інформацією значно менше. Крім того, немає потреби у використанні функцій перетворення числових даних. Що саме і в якій послідовності лежить у бінарному файлі, має знати програма. З двійковими файлами можна виконувати ті ж дії, що й текстові. Для відкриття бінарного файлу використовується та ж команда fopen_s, тільки в модифікаторі відкриття файлу – замість літери t потрібно вказати букву b. Приклад використання функції fread: FILE *f; double buff[100]; size_t res; f = fopen("tmp.dat", "rb"); // Відкриваємо файл if (f == 0) { cout<<“File not open“< exit(1); //Завершити роботу з кодом 1 //Намагаємося прочитати 100 дійсних чисел із файлу res = fread(buff, sizeof(double), 100, f); //res дорівнює реальній кількості прочитаних чисел У цьому прикладі файл "tmp.dat" відкривається як бінарний, з нього читаються 100 дійсних чисел розміром 8 байт кожне. Функція fread повертає реальну кількість прочитаних чисел, яка менша або дорівнює 100. 2.3 Робота з датою/часом у С++ Стандартна бібліотека C++ не надає правильного типу дати. C ++ успадковує структури та функції для обробки дат та часу з C. Щоб отримати доступ до функцій та структур, пов'язаних з датою та часом, вам потрібно буде включити заголовний файл Існує чотири типи часу: clock_t, time_t, size_t та tm. Типи - clock_t, size_t і time_t можуть представляти системний час і дату як ціле число. Тип структури tm містить дату та час у вигляді структури C, що має такі елементи: struct tm { int tm_sec; // Seconds of minutes from 0 to 61 int tm_min; // Minutes of hour from 0 to 59 int tm_hour; // Hours of day from 0 to 24 int tm_mday; // day of month from 1 to 31 int tm_mon; // month of year from 0 to 11 int tm_year; // рік since 1900 int tm_wday; // days since sunday int tm_yday; // days since January 1st int tm_isdst; // Hours of daylight savings time } Нижче наведено важливі функції, які ми використовуємо під час роботи з датою та часом на C або C++. Всі ці функції є частиною стандартної бібліотеки C та C++ (таблиця 2.3), і ви можете перевірити їх деталі, використовуючи посилання на стандартну бібліотеку C++, наведену нижче. Таблиця 2.3 - Функції під час роботи з датою та часом
2.4 Алгоритми сортування: вставки, вибору, бульбашковий Сортування вибором (Selection sort) Для того, щоб відсортувати масив у порядку зростання, слід на кожній ітерації знайти елемент із найбільшим значенням. З ним необхідно поміняти місцями останній елемент. Наступний елемент з найбільшим значенням стає на передостаннє місце. Так має відбуватися, поки елементи, що знаходяться на перших місцях у масиві, не виявляться в належному порядку. Приклад наведено у малюнку 2.1. Малюнок 2.1 – Сортування вибором Бульбашкове сортування (Bubble sort) При бульбашковому сортуванні порівнюються сусідні елементи і змінюються місцями, якщо наступний елемент менший за попередній. Потрібно кілька проходів за даними. Під час першого проходу змагаються перші два елементи в масиві. Якщо вони не в порядку, вони змінюються місцями, а потім порівнюються елементи в наступній парі. За тієї ж умови вони також міняються місцями. Таким чином сортування відбувається в кожному циклі, поки не буде досягнутий кінець масиву. Приклад наведено у малюнку 2.2. Малюнок 2.2 - Бульбашкове сортування Сортування вставками (Insertion sort) При сортуванні вставками масив розбивається на дві області: впорядковану та невпорядковану. Спочатку весь масив є невпорядкованою областю. При першому проході перший елемент з невпорядкованої області вилучається та міститься у правильному положенні у впорядкованій області. На кожному проході розмір упорядкованої області зростає на 1, а розмір невпорядкованої зони скорочується на 1. Основний цикл працює у інтервалі від 1 до N-1. На j ітерації елемент [i] вставлений у правильне положення в упорядкованій області. Це зроблено шляхом зсуву всіх елементів упорядкованої області, які більші, ніж [i], на одну позицію вправо. [i] вставляється в інтервал між тими елементами, які менше [i], і тими, що більше [i]. Приклад наведено у малюнку 2.3. Малюнок 2.3 - Сортування вставками 2.5 Обробка виключень у С++ Винятком є проблема, що виникає під час виконання програми. Виняток C ++ - це у відповідь виняткове обставина, що виникає під час роботи програми, наприклад спроба поділу на нуль. Винятки забезпечують спосіб передачі контролю з однієї частини програми до іншої. Обробка винятків C++ побудована на трьох ключових словах: try, catch та throw. throw – програма видає виняток, коли виникає проблема. Це робиться з використанням ключового слова throw. catch - програма вихоплює виняток із обробником винятків у місці у програмі, де ви хочете впоратися з цією проблемою. Ключове слово catch вказує на вилов виключення. try – блок try ідентифікує блок коду, для якого будуть активовані певні винятки. За ним слідує один або кілька блоків catch. Припускаючи, що блок викликає виняток, метод зловить виняток, використовуючи комбінацію ключових слів try і catch . Блок try/catch міститься навколо коду, який може генерувати виняток. Код усередині блоку try/catch називається захищеним кодом та синтаксисом для використання try/catch наступним чином: C++ надає список стандартних винятків, визначених у Таблиця 2.4 - Список стандартних винятків
У нашому випатку достатньо буде виключення типу: try{ if (strcmp(z.Sina, "0") == 0) throw "ERROR! RESTART WRITE FILE"; } catch (const char * m) {printf(m); exit(1); } Яке виводитиме ERROR! RESTART WRITE FILE при введенні 0 до пункту Ціни. 3. Курсове завдання Вміст бінарного файлу: Прайс-лист планшетів у магазині: фірма-виробник, модель, діагональ екрану в дюймах, ціна, дата поставки, наявність 3G-модуля (так/ні). Параметри Сортування: За спаданням значень розміру діагоналі екрану (вибору). Відбір даних за умовою: Планшети Apple із 3G-модулем. 4. Блок схема програми У цьому пункті ми швидко пройдемося по програмі і подивимося, що вона буде робити в цілому. Це показано у таблиці 4.1.
Таблиця 4.1 – Схема програми 5. Розробка програмного коду Ось ми і дійшли до створення програми на С++ за заданим завданням. #include #include #include #include #include using namespace std; //Объявление типа employee struct employee { char Firma[20]; char Model[20]; char Modul[20]; char Sina[20]; char start_date[11]; float Diagonal; }; //Добавление одной записи в бинарный файл. Параметры – указатель на файл и имя файла void add_record(char* name) { employee z; FILE* f; //Открыть файл и проверить успешность открытия errno_t err; if ((err = fopen_s(&f, name, "ab")) != 0) throw "file not open"; //Считать запись с клавиатуры (данные вводятся в строку через табуляцию) scanf_s("%s\t%s\t%s\t%s\t%s\t%f", z.Firma, 20, z.Model, 20, z.Modul, 20,z.Sina, 20, z.start_date, 11, &z.Diagonal); //Обработка исключений в том случае если сумма буде равна нулю. //Записать запись в файл fwrite(&z, sizeof(employee), 1, f); //закрыть файл fclose(f); } //Просмотр файла. Параметры – указатель на файл и имя файла void view_file(char* name) { employee z; FILE* f; errno_t err; if ((err = fopen_s(&f, name, "rb")) != 0) printf("File not open.\n"); cout << "\nView file" << endl; cout << "Firma\tModel\tPatronymic\tSina\tStart date\tDiagonal\n" << endl; //Считывать последовательно записи из файла, пока они не закончатся while (fread(&z, sizeof(employee), 1, f)) { //Вывести запись на экран в строку через табуляцию printf("%s\t%s\t%s\t%s\t%s\t%6.1f\n", z.Firma, z.Model, z.Modul, z.Sina, z.start_date, z.Diagonal); } fclose(f); } //Определения количества записей в файле. int number_of_records2(char* name) { int n = 0; employee z; FILE* f; errno_t err; if ((err = fopen_s(&f, name, "rb")) != 0) printf("File not open.\n"); //Считывать по очереди все записи и увеличивать счётчик на 1 while (fread(&z, sizeof(z), 1, f)) n++; fclose(f); return n; } //Заполнение (создание) массива из бинарного файла. //Параметры – массив, указатель на файл, имя файла. void create_array(employee* a, int kol, char* name) { FILE* f; errno_t err; if ((err = fopen_s(&f, name, "rb")) != 0) printf("File not open.\n"); //Считать kol записей из файла в массив а одной командой fread(a, sizeof(employee), kol, f); fclose(f); } //Сортировка массива void sort_array(employee* a, int kol) { int i; employee x; bool f; //Цикл пока массив не отсортирован. Признаком того, что массив уже отсортирован будет //значение переменной f, равное 0, после очередного прохода по массиву for (int i = 0; i < kol; ++i) { int f = i; for (int j = i + 1l; j < kol; ++j) if (a[f].Diagonal < a[j].Diagonal) f = j; if (f != i) { x = a[i]; a[i] = a[f]; a[f] = x; } } } //Вывод динамического массива на экран void view_array(employee* a, int kol) { cout << "Firma\tModel\tModul\tSina\tStart date\tDiagonal\n" << endl; for (int i = 0; i < kol; i++) printf("%s\t%s\t%s\t%s\t%s\t%10.1f\n", a[i].Firma, a[i].Model, a[i].Modul, a[i].Sina, a[i].start_date, a[i].Diagonal); } //Создание бинарного файла из динамического массива (возвращение данных в файл) void array_to_file(employee* a, int kol, char* name) { FILE* f; errno_t err; if ((err = fopen_s(&f, name, "wb")) != 0) printf("File not open.\n"); fwrite(a, sizeof(employee), kol, f); fclose(f); } //Вывод данных по условию void select_data(char* name) { employee z; FILE* f; errno_t err; if ((err = fopen_s(&f, name, "rb")) != 0) printf("File not open.\n"); cout << "\nSelect records" << endl; cout << "Firma\tModel\tModul\tSina\tStart date\tDiagonal\n" << endl; while (fread(&z, sizeof(employee), 1, f)) { //Если должность - Firma "Apple" и Modul "yes" if (strcmp(z.Firma, "Apple") == 0 && strcmp(z.Modul, "yes") == 0) //Выводим запись на экран printf("%s\t%s\t%s\t%s\t%s\t%6.1f\n", z.Firma, z.Model, z.Modul,z.Sina,z.start_date, z.Diagonal); } fclose(f); } //Создание текстового файла void create_text_file(char* bname, char* tname) { employee z; float sum = 0; FILE* fb; FILE* ft; int k = number_of_records2(bname); //Открываем бинарный файл для чтения errno_t err; if ((err = fopen_s(&fb, bname, "rb")) != 0) printf("File not open.\n"); fseek(fb, 0, 0); //Открываем текстовый файл для записи if ((err = fopen_s(&ft, tname, "wt")) != 0) printf("File not open.\n"); //Идём по бинарному файлу и считываем записи while (fread(&z, sizeof(employee), 1, fb)) { //Если должность - Firma "Apple" и Modul "yes" if (strcmp(z.Firma, "Apple") == 0 && strcmp(z.Modul, "yes") == 0) fprintf(ft, "%s\t%s\t%s\t%s\t%s\t%g\n", z.Firma, z.Model, z.Modul,z.Sina, z.start_date, z.Diagonal); } fclose(ft); fclose(fb); } //Просмотр текстового файла void view_text_file(char* name) { employee z; FILE* f; errno_t err; if ((err = fopen_s(&f, name, "rt")) != 0) printf("File not open.\n"); cout << "\nView text file" << endl; cout << "Firma\tModel\tModul\tSina\tStart date\tDiagonal\n" << endl; while (!feof(f)) { fscanf_s(f, "%s\t%s\t%s\t%s\t%s\t%f\n", z.Firma, 20, z.Model, 20, z.Modul, 20, z.Sina, 20,z.start_date, 11, &z.Diagonal); printf("%s\t%s\t%s\t%s\t%s\t%6.1f\n", z.Firma, z.Model, z.Modul,z.Sina, z.start_date, z.Diagonal); } fclose(f); } //Главная функция int main() { try { char name[] = "kursfile.txt"; char tname[] = "textfile.txt"; //имена файлов //Ввод данных в бинарный файл cout << "Input information about employee:" << endl; cout << "Firma\tModel\tModul\tSina\tStart date\t Diagonal \n" << endl; for (int i = 0; i < 2; i++) add_record(name); //Вывод файла на экран view_file(name); //Определение количества записей в файле int kol = number_of_records2(name); cout << endl << "Number of records in the file: " << kol << endl; //Объявление динамического массива employee* a = new employee[kol]; //Заполнение динамического массива значениями create_array(a, kol, name); //Вывод динамического массива на экран cout << "Array:" << endl; view_array(a, kol); //Сортировка массива sort_array(a, kol); //Вывод динамического массива на экран cout << "\nSorted array:" << endl; view_array(a, kol); //Возвращение отсортированных данных в бинарный файл array_to_file(a, kol, name); //Очистка памяти из-под массива delete[]a; //Вывод файла на экран view_file(name); //Вывод данных из фала на экран по условию select_data(name); //Создание текстового файла из бинарного create_text_file(name, tname); //Вывод содержимого текстового view_text_file(tname); system("pause"); } catch (const char* m) { printf(m); char name[] = "kursfile2.txt"; char tname[] = "textfile.txt"; //имена файлов //Ввод данных в бинарный файл cout << endl << "Input information about employee:" << endl; cout << "Firma\tModel\tModul\tSina\tStart date\t Diagonal \n" << endl; for (int i = 0; i < 5; i++) add_record(name); //Вывод файла на экран view_file(name); //Определение количества записей в файле int kol = number_of_records2(name); cout << endl << "Number of records in the file: " << kol << endl; //Объявление динамического массива employee* a = new employee[kol]; //Заполнение динамического массива значениями create_array(a, kol, name); //Вывод динамического массива на экран cout << "Array:" << endl; view_array(a, kol); //Сортировка массива sort_array(a, kol); //Вывод динамического массива на экран cout << "\nSorted array:" << endl; view_array(a, kol); //Возвращение отсортированных данных в бинарный файл array_to_file(a, kol, name); //Очистка памяти из-под массива delete[]a; //Вывод файла на экран view_file(name); //Вывод данных из фала на экран по условию select_data(name); //Создание текстового файла из бинарного create_text_file(name, tname); //Вывод содержимого текстового view_text_file(tname); system("pause"); } return 0; } 6 Тестування програми Результат роботи програми приведення на (рисунку 6.1). Малюнок 6.1 - Тестування програми При закінченні роботи програми вона створює текстовий файл (рисунок 6.2) у який записує відсортований масив. Малюнок 6.1 - текстовий файл відсортованого масиву. При роботі програми можуть спрацювати винятки (рисунок 6.3) при неможливості відкрити файл. Малюнок 6.3- спрацьовування винятка 7. Висновки Таким чином, у мові C++ відсутні оператори для роботи з файлами. Усі необхідні дії виконуються за допомогою функцій, включених до стандартної бібліотеки. Таким чином, результатом виконання курсової роботи є додаток для відсортування структурних даних, який містить Прайс-лист планшетів у магазині: фірма-виробник, модель, діагональ екрану в дюймах, ціна, дата поставки, наявність 3G-модуля (так/ні), а також приклад роботи з винятком. Такі програми допоможуть відсортувати великі обсяги даних, що може полегшити людині життя замість того, щоб вибирати все вручну. 8 Список літератури 1) Робота з файлами у MS Visual C++ [Електронний ресурс]. – 2012. – Режим доступу до ресурсу: https://www.evkova.org/kursovye-raboty/rabota-s-fajlami-v-ms-visual-c-#ЗАКЛЮЧЕНИЕ . 2) C++ - Обробка винятків [Електронний ресурс]. – 2021. – Режим доступу до ресурсу: https://unetway.com/tutorial/c-obrabotka-isklucenij . 3) Алгоритми сортування: реалізація на С++ [Електронний ресурс]. - 2011. - Режим доступу до ресурсу: https://function-x.ru/cpp_algoritmy_sortirovki.html#paragraph1 . 4) Мова програмування С++ [Електронний ресурс] - Режим доступу до ресурсу: https://stud-baza.ru/mova-programuvannya-s-diplomnaya-rabota-informatika-programmirovanie. 5) Структури С++ [Електронний ресурс]. - 2011. - Режим доступу до ресурсу: http://cppstudio.com/post/7008/ . 6) Структури [Електронний ресурс]. – 2014. – Режим доступу до ресурсу: https://ravesli.com/urok-61-struktury/ . |