You are on page 1of 56

ДНІПРОВСЬКИЙ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ

ІМЕНІ ОЛЕСЯ ГОНЧАРА


Кафедра електронних обчислювальних машин

КУРСОВА РОБОТА
з дисципліни «Програмування»

Студента І курсу групи KI-


19-1
Спеціальності 123–«Комп’ютерна
інженерія»
Стурова
Ю.В.
Керівник: доц. Карпенко
Н.В.

Кількість балів __________


Національна шкала __________

Члени комісії:
__________ _____________________
(підпис) (прізвище та ініціали)
__________ _____________________
(підпис) (прізвище та ініціали)
__________ ______________________
(підпис) (прізвище та ініціали)
2

м. Дніпро
2020
Завдання на курсову роботу
Завдання 1. Робота з символьними рядками
Мета: поглиблення і закріплення теоретичних знань та набуття практичних
навичок роботи з символьними рядками та забезпечення функціональної
модульності програми.
Постановка задачі: Скласти функцію для обробки символьних рядків та програму
для перевірки працездатності функції. За зразок можна брати бібліотечні функції
обробки рядків мови С, але не використовувати їх в своїй функції.
При виконанні 1-го завдання необхідно:
1. Рядки для тестування функції вводити в головній програмі з клавіатури.
2. Передбачити обробку помилок в завданні параметрів та особливі випадки.
3. Розробити два варіанти заданої функції з використанням:
а) індексованих масивів;
б) вказівників.
Варіант індивідуального завдання:
Функція digit(s)
Призначення: визначає довжину найдовшої послідовності цифр в символьному
рядку.

Завдання 2. Робота з двовимірними масивами


Мета: поглиблення і закріплення теоретичних знань та набуття практичних
навичок роботи з двовимірними масивами.
Постановка задачі: Задано двовимірний масив дійсних чисел розміром N х N (6 <=
N <= 10). Реалізувати його обробку, як вказано у варіанті завдання.
При виконанні 2-го завдання необхідно:
1. Передбачити функцію для ручного введення елементів масиву.
3

2. Передбачити функцію для автоматичного заповнення масиву А даними через


використання генератору випадкових чисел.
3. Передбачити обробку помилок під час введення даних та особливі випадки.
Варіант індивідуального завдання:
Виконати поворот двомірної квадратної матриці на 90° проти руху годинникової
стрілки.

Завдання 3. Робота з бітами


Мета: поглиблення і закріплення теоретичних знань та набуття практичних
навичок роботи з порозрядними логічними операціями та операціями зсуву.
Постановка задачі: в завданні передбачається використання побітових операцій.
Дані вводяться з файлу. Результат роботи програми слід вивести на монітор та
записати в файл. Імена вхідного та вихідного файлів слід задавати в командному
рядку.
Рекомендації для виконання 3-го завдання:
1. При відкритті чи створенні будь-яких файлів необхідно перевіряти наявність
помилок введення-виведення.
2. Результат виконання завдання на моніторі повинен бути представлений в наочній
формі. Наприклад, виконання побітової операції «І» між числами 57894 і 2 можна
представити наступним чином:
Варіант індивідуального завдання:
Скласти програму кодування/декодування текстового файлу за наступним
алгоритмом: над кожним символом з файлу виконується побітова операція
«виключне або» з заданим паролем, тобто Свих=Свх ^ p, где Свих — символ, що
одержано після кодування, Свх — символ, що потрібно закодувати, p — пароль
(число). Пароль та вибір режиму роботи (кодування/декодування) слід задавати з
клавіатури.
4

Завдання 4. Робота зі структурами. Сортування та пошук даних


Мета: поглиблення і закріплення теоретичних знань та набуття практичних
навичок роботи зі складними типами даних, що зберігаються в файлі;
ознайомлення з методами сортування та пошуку даних.
Постановка задачі: Дані зберігаються в файлі на диску. Слід реалізувати їх
обробку, сортування та пошук даних, як вказано у варіанті завдання.
При виконанні завдання необхідно:
1. Ім’я файлу задається в командному рядку. Якщо воно там не було задано, то
після відповідного запиту вводиться користувачем.
2. Використовувати динамічне виділення пам’яті (розмір масиву задається
користувачем після відповідного запиту). Після використання масиву слід
обов’язково звільнити пам’ять.
3. Пошук інформації здійснювати двома методами — лінійним та бінарним.
4. Вихідну інформацію виводити у вигляді таблиці і записувати до файлу.
5. Інформацію для пошуку слід вводити з клавіатури.
Варіант індивідуального завдання:
Є інформація щодо продажу зонтів: країна-виробник, тип механізму (механічний,
напівавтомат, автомат), колір, наявність рисунку на зонті (так чи ні), ціна за
одиницю товару, дата продажу. Визначити загальну кількість проданих зонтів без
рисунку з вересня 2018 року по травень 2019 року. Впорядкувати інформацію про
зонти за датою продажу методом бульбашки (Bubble sort). Організувати пошук
зонтів за типом механізму.
5

Зміст
Вступ....................................................................................................................................................................... 7
1. Робота з символьними рядками.....................................................................................................................8
1.1 Умова завдання...........................................................................................................................................8
1.2 Опис методу рішення.................................................................................................................................8
1.3 Опис логічної структури...........................................................................................................................9
1.4 Дані для тестування.................................................................................................................................10
2. Робота з двовимірними масивами...............................................................................................................11
2.1 Умова завдання.........................................................................................................................................11
2.2 Опис методу рішення...............................................................................................................................11
2.3 Опис логічної структури.........................................................................................................................11
2.4 Дані для тестування.................................................................................................................................13
3. Робота з бітами................................................................................................................................................14
3.1 Умова завдання.........................................................................................................................................14
3.2 Опис методу рішення...............................................................................................................................14
3.3 Опис логічної структури.........................................................................................................................15
3.4 Дані для тестування.................................................................................................................................16
4. Робота зі структурами. Сортування та пошук даних...............................................................................18
4.1 Умова завдання.........................................................................................................................................18
4.2 Опис методу рішення...............................................................................................................................18
4.3 Опис логічної структури.........................................................................................................................19
4.4 Дані для тестування.................................................................................................................................21
Висновок..............................................................................................................................................................24
Список використаних джерел..........................................................................................................................25
Додаток А............................................................................................................................................................. 26
Рис. A.1. — Блок-схема алгоритму функції main()...................................................................................26
Рис. A.2. — Блок-схема алгоритму функції digit(s)...................................................................................27
Рис. A.3. — Блок-схема алгоритму функції digitpointer(s).......................................................................28
Додаток Б.............................................................................................................................................................29
Рис. Б.1. — Блок-схема алгоритму функції main()....................................................................................29
Рис. Б.2. — Блок-схема алгоритму функції vvod(str)................................................................................30
6

Рис. Б.3. — Блок-схема алгоритму функції random(str)..........................................................................31


Рис. Б.4. — Блок-схема алгоритму функції strprint(str)...........................................................................32
Рис. Б.5. — Блок-схема алгоритму функції povorot(str)...........................................................................33
Додаток В............................................................................................................................................................. 34
Рис. В.1. — Блок-схема алгоритму функції main()....................................................................................34
Рис. В.2. — Блок-схема алгоритму функції printsymb(a, result, b).........................................................35
Рис. В.3. — Блок-схема алгоритму функції printbit(a).............................................................................36
Рис. В.4. — Блок-схема алгоритму функції codesymb(firstfile[],secondfile[], a).....................................37
Додаток Г............................................................................................................................................................. 38
Рис. Г.1. — Блок-схема алгоритму функції main()....................................................................................38
Рис. Г.2. — Блок-схема алгоритму функції dimlong(filename)................................................................39
Рис. Г.3. — Блок-схема алгоритму функції initArray(dimension, filename)...........................................40
Рис. Г.4. — Блок-схема алгоритму функції displayArray(massive, dimension)......................................41
Рис. Г.5. — Блок-схема алгоритму функції displayTrip(general)............................................................41
Рис. Г.6. — Блок-схема алгоритму функції countChoise(massive, dimension, int Umonth, Uyear,
image, Lmonth, Lyear).....................................................................................................................................42
Рис. Г.7. — Блок-схема алгоритму функції sortPrice(massive, dimension).............................................43
Рис. Г.8. — Блок-схема алгоритму функції displayChoise(massive, dimension, secondfile[],
mechanism[]).....................................................................................................................................................44
Додаток Л.............................................................................................................................................................45
Лістинг Л.1 — Лістинг алгоритму розв’язання задачі з обробки двовимірних масивів....................45
Лістинг Л.2 — Лістинг алгоритму розв’язання задачі з обробки символьних рядків.......................47
Лістинг Л.3 — Лістинг алгоритму розв’язання задачі з обробки бітів.................................................49
Лістинг Л.4 — Лістинг алгоритму розв’язання задачі з роботи зі структурами, сортуванню та
пошуку даних..................................................................................................................................................51
7

Вступ
Мова програмування С - це універсальна мова з багатим набором операторів і
компактним способом запису виразів. Завдяки гнучкості, виразності і компактності
своїх конструкцій С завоював найбільшу популярність у середовищі професійних
програмістів і широко використовується при розробці системних і прикладних
програм. За цей період навчання ми здобули багато теоретичних знать та
практичних навичок. Ми вивчили такі теми як, оператори циклу , масиви ,
функції ,вказівники, робота з файлами, структури тощо.
Мета роботи: освоїти алгоритми вирішення задач, користуючись набутими
протягорм курсу знаннями. Дослідити типові задачі з програмування, а саме:
 розробка функцій для обробки символьних рядків;
 робота з одновимірними та двовимірними масивами даних;
 робота з динамічними структурами та файлами;
 використання методів сортування та пошуку даних.
Основна частина, яка для кожного завдання має такі підрозділи:
 умова завдання;
 метод рішення (стислі відомості про особливості використаних операторів та
методів, опис вхідних та вихідних даних для кожної функції);
 логічна структура програми (алгоритми роботи для кожної функції, що
складають програму, та їх опис);
 тестування програми при різних наборах вхідних даних (дані для тестування,
результати тестування та аналіз одержаних результатів).
 блок-схеми алгоритму функцій програми
 лістинг (текст) програми;

8

1. Робота з символьними рядками


1.1 Умова завдання
Скласти функцію digit(s), яка визначає довжину найдовшої послідовності цифр в
символьному рядку.
1.2 Опис методу рішення
Символьний рядок представляє собою набір з одного або більше символів. В
мові Сі немає спеціального типу даних, який можна було б використовувати для
опису рядків. Замість цього рядки представляються у вигляді масиву елементів
типу char. Це означає, що символи рядка розташовуються в пам'яті в сусідніх
комірках, по одному символу в комірці. Необхідно відмітити, що останнім
елементом масиву є символ '\0'. Це нульовий символ (байт, кожний біт якого рівний
нулю). У мові Сі він використовується для того, щоб визначати кінець рядка.
Символьний рядок, як і будь-який інший масив можна обробляти або
традиційним методом — з використанням операції індексації, або через вказівники,
з використанням операцій адресної арифметики. Довжина рядку заздалегідь
невідома, тому цикли повинні бути організовані не з лічильником, а до появи
ознаки кінця рядку. Для того щоб ввести символьний рядок використаємо функцію
gets().
Функція повинна реалізовувати поставлене завдання та мати універсальний
характер. Функція має повертати прогнозоване значення. В даному випадку
функція повертає кількість довжину найдовшої послідовності цифр в рядку.

Визначимо склад параметрів функції:


digit(s);
де s - вхідний символьний рядок, який вводиться з клавіатури.
9

1.3 Опис логічної структури


Програма складається з одного програмного модуля — файл exe1.c. До
складу модуля входять три функції — main(), digit(s) і digitpointer(s). Глобальних
змінних у програмі немає.
Опис алгоритму функції main()
Функція main() є головною функцією програми, вона призначена для
введення початкових даних, виклику інших функцій і наочної демонстрації
результатів.
У функції визначені такі змінні:
 s –вхідний рядок;
Опис алгоритму функції digit(s)
Функція digit(s) виконує поставлене завдання через індексовані масиви. Вона
має один параметр s-вхідний рядок, також вона має змінні count=0 ,яка буде
зберігати довжину поточної послідовності, і maxcount = 0 , яка буде зберігати
довжину найбільшої послідовності цифр. Локальна змінна i слугує індексом
масиву. Функція перебирає кожен символ рядку в циклі. Якщо символ дорівнює
цифрі то змінна count збільшується на одиницю, потім вона порівнюється зі
змінною maxcount, якщо maxcount менше ніж count, maxcount привласнюється
значення count. Якщо символ не дорівнює цифрі значення count обнуляється.
Функція повертає довжину найбільшої послідовності цифр, запис: return maxcount;.
Опис алгоритму функції digitpointer(s)
Функція digitpointer(s) працює аналогічно функції digit(s) . Блок-схеми алгоритмів
цих функцій зазначено в додатку А, а лістинг наведено в – Л.
10

1.4 Дані для тестування


Введення початкових даних для перевірки функцій зазначено в таблиці 1.1.
Результати наведено на рисунку 1.1 і 1.2. Обмеження на роботу програми: вхідний
та вихідний рядки не повинні перевищувати 100 символів.
Таблиця 1.1 — Початкові дані для тестування функцій digit(s) та digitpointer(s)
Варіант s[100]
1 123ыва4567457счав123
2 rt0`12ug90000
3 123123^^DF12
4

Рис. 1.1 — Результати тестування програми з значеннями початкових даних:


а — випадок 1: найбільша послідовність цифр посередині рядка
б — випадок 2: найбільша послідовність цифр в кінці рядка
в — випадок 3: найбільша послідовність цифр на початку рядка
г — випадок 3: рядок пустий
11

2. Робота з двовимірними масивами


2.1 Умова завдання
Скласти функцію, яка виконає поворот квадратної матриці на 90° проти
годинникової стрілки.
2.2 Опис методу рішення
Масиви - це послідовна група елементів пам'яті, що мають однакове ім'я, при
цьому звернеться до елементу масиву можна, вказавши номер позиції елементу
масиву. Двовимірний масив - це масив, який має кілька рядків. Обробляти
двовимірні масиви можна за допомогою індексації та адресної арифметики. Так як
нам заздалегідь відомі розміри матриці, цикли в функції будуть організовані за
допомогою лічильника.
Функція буде універсальна лише для цілочисельних двовимірних масивів
певної розмірності, яка визначена макроконстантою K.
Визначимо склад параметрів функції:
void povorot(str)
де str – двовимірний масив цілих чисел
2.3 Опис логічної структури
Програма складається з одного програмного модуля — файл exe2.c. До
складу модуля входять п’ять функцій — main(), random(str), strprint(str),
vvod(str), povorot(str). Глобальних змінних у програмі немає. Макроконстантою K
визначена розмірність матриці – 6.
Опис алгоритму функції main()
Функція main() є головною функцією в цій програмі, вона слугує для того,
щоб вводити початкові дані , передавати параметри і викликати функції введення,
виведення, псевдорандомного заповнення, та повороту матриці. За допомогою
оператора switch організовано вібір між заповненням масиву вручну чи за
допомогою функції псевдорандому. Обробка виключних ситуацій організована
циклом do while. У функції визначені такі змінні:
 str –вхідний і вихідний двовимірний масив;
 h - змінна , яка є виразом оператора switch
12

Опис алгоритму функції vvod(str)


Функцією vvod(str) забезпечено заповнення масиву вручну. Функція
використовує індексацію масивів. Параметр str[][] – двовимірний масив (матриця).
Локальні змінні i та j - індекси елементів масиву. Функція scanf забезпечує
введення елементу масиву.
Опис алгоритму функції random (str)
Функція random (str) має схожий з функцією vvod(str) алгоритм, проте
функцію scanf замінює функція rand().
Опис алгоритму функції strprint (str)
Функція strprint (str) також має схожий з функцією vvod(str) алгоритм
проте, призначена для виведення масиву.
Опис алгоритму функції povorot (str)
Функція povorot (str) виконує поставлене завдання за допомогою індексації.
Вона має один параметр str – вхідний двовимірний масив. Має також змінну arr[K]
[K] – двовимірний масив, у який функція використовує як проміжний, записуючи
туди повернену матрицю, щоб потім з нього переписати у вхідний масив. Локальні
змінні i та j використовуються в масивах для перебору елементів. Функція зчитує із
вхідного масиву str елемент рядка(j) стовпця(K-1-i) і присвоює його значення
елементу масиву arr рядка(i) стовпця(j). Потім, зчитуючи елемент масиву arr
рядка(i) стовпця(j), присвоює його значення відповідним елементам масиву str.

Блок-схеми алгоритмів цих функцій зазначено в додатку Б, а лістинг наведено в –


Л.
13

2.4 Дані для тестування


На рисунку 2.1 наведено вхідні дані та результат роботи функції povorot.

Рис. 2.1 — Результати тестування програми з значеннями початкових даних


а — введення вручну
б — введення за допомогою функції псевдорандому
14

3. Робота з бітами
3.1 Умова завдання
Скласти програму кодування/декодування текстового файлу за наступним
алгоритмом: над кожним символом з файлу виконується побітова операція
«виключне або» з заданим паролем, тобто Свих=Свх ^ p, где Свих — символ, що
одержано після кодування, Свх — символ, що потрібно закодувати, p — пароль
(число). Пароль та вибір режиму роботи (кодування/декодування) слід задавати з
клавіатури.
3.2 Опис методу рішення
Символ – це умовне позначення деякої сутності: літери, цифри, знаку,
пунктуації, тощо. Для роботи з символами в мові C використовується тип даних
char. Оскільки процесори комп’ютерів обробляють інформацію в двійковій системі,
кожен символ в програмуванні представлений деяким числом. Це число – код
символу. Під char виділяється 1 байт тобто, максимальне число, яке можна
записати в 1 байт, це 255 (буде виглядати як 11111111). Це означає що діапазон
паролів, які ми будемо використовувати, буде від 1 до 255 включно. Оскільки
принцип кодування таким чином Свих=Свх ^ p, не відрізняється під принципу
декодування, вважаю, що вибір режиму роботи в даній програмі не потрібен.
Визначимо склад параметрів функції кодування(декодування):
void codesymb(firstfile, secondfile, a)
де firstfile – масив, який зберігає ім’я файлу для читання
secondfile – масив, який зберігає ім’я файлу для запису
a – змінна int, яка зберігає числовий пароль
15

3.3 Опис логічної структури


Програма складається з одного програмного модуля — файл exe3.c. До
складу модуля входять чотири функції — main(), codesymb(firstfile, secondfile, a),
printbit(a) printsymb(a, result, b). Глобальних змінних у програмі немає.
Опис алгоритму функції main()
Функція main() є головною функцією в цій програмі, вона слугує для того
щоб вводити імена файлів та паролю для кодування/декодування, викликати інші
функції та передавати в них параметри.
У функції визначені такі змінні:
 filename - символьний рядок, що зберігає ім’я файлу для читання
 secondfile – символьний рядок, що зберігає ім’я файлу для запису
 pass – змінна int, яка зберігає числовий пароль
Опис алгоритму функції printbit (a)
Функція призначена для виведення на екран двійкового коду символу.
В якості параметра функція приймає ціле число, оскільки символ в програмуванні
можна представити числом це прийнятно. Функція записує в масив str[8] остачу від
ділення на 2 числового коду символу. Потім виводить елементи масиву на екран.

Опис алгоритму функції printsymb (a, result, b)


За допомогою printsymb забезпечено наочну демонстрацію роботи функції
codesymb. Функція виводить на екран вхідні, вихідні символи і пароль та викликає
функцію printbit, яка виводить двійковий код символів.
Опис алгоритму функції codesymb (firstfile, secondfile, а)
Функція, кодує та декодує символи в файлі. Параметри: ім’я файлу для
зчитування символів, ім’я файлу для запису символів, числовий пароль. *mf, *mf2 -
вказівники на потоки файлів, symb – змінна для зберігання вхідного символу, result
– змінна для зберігання вихідного символу. Так як довжина тексту може бути
довільна, цикл буде закриватись, коли вхідний символ буде дорівнювати символу
закінчення файлу. Функція зчитує символ із файлу, застосовує до нього маску
Свих=Свх ^ p і записує вихідний символ у інший файл.
16

Блок-схеми алгоритмів цих функцій зазначено в додатку В, а лістинг наведено в –


Л.

3.4 Дані для тестування


В таблиці 3.1 наведені початкові дані для тестування програми На рисунках
3.1, 3.2, 3.3 наведено результати роботи програми

Варіант 1 файл 2 файл код


1 text.txt textout.txt 78
2 textout.txt textoutput.txt 78
3 textout.txt textoutput.txt 76

Таблиця 3.1 — Дані для тестування програми

Рис. 3.1 — Результати тестування програми. Випадок 1: кодування,


пароль - 78
17

Рис. 3.2 — Результати тестування програми. Випадок 2: декодування,


пароль – 78 (вірний)

Рис. 3.3 — Результати тестування програми. Випадок 3: декодування,


пароль – 76 (невірний)
18

4. Робота зі структурами. Сортування та пошук даних


4.1 Умова завдання
Є інформація щодо продажу зонтів: країна-виробник, тип механізму
(механічний, напівавтомат, автомат), колір, наявність рисунку на зонті (так чи ні),
ціна за одиницю товару, дата продажу. Визначити загальну кількість проданих
зонтів без рисунку з вересня 2018 року по травень 2019 року. Впорядкувати
інформацію про зонти за датою продажу методом бульбашки (Bubble sort).
Організувати пошук зонтів за типом механізму.
4.2 Опис методу рішення
Структура – це складний тип даних, який складається із простих типів.
Оскільки в файлі може бути інформація про необмежену кількість членів
структури, будемо використовувати динамічне виділення пам’яті. Оскільки
потрібно знати не тільки рік продажу а й місяць ведемо дві змінні, одна буде
відповідати на рік, інша за місяць. Для зчитування інформації про члени структури
Будемо використовувати функцію форматованого введення інформації з файлу
fscanf. Для запису в файл будемо використовувати fprintf. Нам потрібно виділити
пам’ять під елементи структури, ми знаємо, що інформація в файлі записана так:
один елемент – один рядок. Потрібна функція яка порахує кількість рядків в файлі.
Для корекного визначення кількості проданих зонтів потрібно попередньо
відсортувати елементи. Сортування будемо проводити двічі, спочатку за місяцем,
потім за роком. Для вибору типу механізму будемо використовувати switch.
19

4.3 Опис логічної структури


Програма складається з одного програмного модуля — файл exe4.c. До
складу модуля входять вісім функцій — main(), initArray(dimension, filename[]),
dimlong(filename), displayArray(massive, dimension), displayTrip(general),
countChoise(massive, dimension, Umonth, Uyear, image[], Lmonth, Lyear),

sortPrice(massive, dimension), displayChoise(massive, dimension, secondfile[],


mechanism[]). Максроконстантами K i B визначені максимальні довжини рядків.

Оголошено новий структурний тип даних Trip.

Опис алгоритму функції main()

Функція main() є головною функцією програми, вона призначена для


введення початкових даних, виклику інших функцій. Також має оператор вибору
значення для пошуку.

Опис алгоритму функції dimlong(filename[])

Функція визначає кількість рядків у файлі. Вона зчитує рядки і рахує їх доки
вказівник не досягне кінця файлу. Параметр функції ім’я файлу. Повертає кількість
рядків.

Опис алгоритму функції initArray(dimension, filename[])

Функція виділяє пам’ять під масив структур та присвоює елементам масиву


інформацію із файлу, за допомогою функції форматованого введення fscanf.
Параметри функції: кількість елементів масиву, ім’я файлу. Повертає масив
структур.

Опис алгоритму функції displayArray(massive, dimension)

Функція виводу елементів масиву структур в командний рядок. В якості


параметрів отримує масив структур та кількість елементів. Викликає функцію
displayTrip.
20

Опис алгоритму функції displayTrip(general)

Функція виведення кожної змінної структурного елементу. Параметр –


елемент масиву структур.

Опис алгоритму функції countChoise (massive, dimension, Umonth, Uyear,


image[], Lmonth, Lyear)

Функція виведення та підрахування кількості проданих зонтів з рисунком чи


без, з певної дати (місяць, рік) по певну дату (місяць, рік). Функція починає перебір
масиву структур. Коли дата продажу елементу буде більше або дорівнювати
нижньому ліміту дати продажу, відкривається внутрішній цикл, який збільшує
лічильник та виводить на екран елементи масиву, доки дата продажу елементу не
стане більше ніж верхній ліміт дати продажу. Після цього функція друкує кількість
знайдених елементів. Параметри: масив структур, кількість елементів масиву,
верхній ліміт дати (місяць), верхній ліміт дати (рік), масив в якому визначена
наявність рисунку, нижній ліміт дати (місяць), нижній ліміт дати (рік).

Опис алгоритму функції sortPrice(massive, dimension)

Функція сортування елементів масиву за датою продажу методом бульбашки,

Спочатку сортує за місяцем, потім за роком.

Опис алгоритму функції displayChoise(massive, dimension, secondfile[],


mechanism[])

Функція виводу на екран та запису до файлу елементів масиву що


задовольняють критерію «тип механізму», введеного користувачем. Функція
використовує лінійний пошук. Параметри: масив структур, кількість елементів,
масив, який зберігає ім’я файлу для запису, масив, який зберігає тип механізму.

Блок-схеми алгоритмів цих функцій зазначено в додатку Г, а лістинг наведено в –


Л.
21

4.4 Дані для тестування


В таблиці 4.1 наведені початкові дані для тестування програми На рисунках
3.1, 3.2, 3.3 наведено результати роботи функції
Варіант Тип механізму
1 mechanical
2 semiautomatic
3 automatic
Таблиця 4.1 — Дані для тестування програми
22

Рис. 4.1 — Результати тестування програми. Варіант 1: mechanical


23

Рис. 4.2 — Результати тестування програми. Варіант 2: semiautomatic

Рис. 4.3 — Результати тестування програми. Варіант 3: automatic


24

Висновок
Підбиваючи підсумки проведеної роботи, шо мова програмування C не
втратила своєї актуальності й у 2020 році. C – це хороша мова для навчання, знати
її потрібно, щоб розуміти як працювати з пам’яттю, знати звідки вона береться і
куди вона дівається; розвити в собі уважність, в C потрібно чітко уявляти, що й де
записано, на яку пам'ять ми посилаємося, коли і ким ця пам'ять буде очищена;
розуміти як працює комп’ютер, файлові операції тощо;

Виконуючи вищенаведені завдання я закріпив свої набуті протягом цього


курсу знання. Зокрема такі теми: символьні рядки, двовимірні масиви, робота з
файлами, побітові операції, структури, робота з командним рядком тощо. Написані
мною програми виконують поставлені задачі та є універсальними, вони можуть
виконувати типові завдання без або з мінімальними корективами коду.

Хочеться додати, що с деякими труднощами для розуміння мені далися такі


речі як робота з файлами та побітові операції. Тому мені довелося вдатися до
вивчення додаткової літератури. Також мною ще не докінця опановано роботу з
командним рядком.
25

Списки використаних джерел.


Книги

1. Карпенко Н. В. Розробка програм на мові С у сучасних середовищах: навч.-


метод. посіб. Д.: ЛІРА, 2016. 144 с.
2. Шпак З. Я. Програмування мовою С. Львів: Видавництво Львівської
політехніки, 2011. 436 с.
3. Naveen Toppo, Hrishikesh Dewan “Pointers in C” 2013, 222 с.
4. Браян В. Кернiган, Денiс М. Рiчi ,«Мова програмування C.», 222c
5. Керниган Б. У., Ритчи Д. М. Язык программирования C = C programming
language. — 2-е изд. — М.: «Вильямс», 2007. — С. 304.
Електронні ресурси

6. Програмування на C та C++. URL: http://www.c-cpp.ru/.


7. Опис функцій мови C. URL: http://all-ht.ru/inf/prog/c/func/.
8. Бітові операції в С. URL: https://learnc.info/c/bitwise_operators.html.
26

9. Б

Додаток А

Рис. A.1. — Блок-схема алгоритму функції main()


27

Рис. A.2. — Блок-схема алгоритму функції digit(s)


28

Рис. A.3. — Блок-схема алгоритму функції digitpointer(s)


29

Додаток Б

Рис. Б.1. — Блок-схема алгоритму функції main()


30

Рис. Б.2. — Блок-схема алгоритму функції vvod(str)


31

Рис. Б.3. — Блок-схема алгоритму функції random(str)


32

Рис. Б.4. — Блок-схема алгоритму функції strprint(str)


33

Рис. Б.5. — Блок-схема алгоритму функції povorot(str)


34

Додаток В

Рис. В.1. — Блок-схема алгоритму функції main()


35

Рис. В.2. — Блок-схема алгоритму функції printsymb(a, result, b)


36

Рис. В.3. — Блок-схема алгоритму функції printbit(a)


37

Рис. В.4. — Блок-схема алгоритму функції codesymb(firstfile[],secondfile[], a)


38

Додаток Г
39

Рис. Г.1. — Блок-схема алгоритму функції main()


40

Рис. Г.2. — Блок-схема алгоритму функції dimlong(filename)


41

Рис. Г.3. — Блок-схема алгоритму функції initArray(dimension, filename)


42

Рис. Г.4. — Блок-схема алгоритму функції displayArray(massive, dimension)

Рис. Г.5. — Блок-схема алгоритму функції displayTrip(general)


43

Рис. Г.6. — Блок-схема алгоритму функції countChoise(massive, dimension, int


Umonth, Uyear, image, Lmonth, Lyear)
44

Рис. Г.7. — Блок-схема алгоритму функції sortPrice(massive, dimension)


45

Рис. Г.8. — Блок-схема алгоритму функції displayChoise(massive, dimension,


secondfile[], mechanism[])
46

Додаток Л
Лістинг Л.1 — Лістинг алгоритму розв’язання задачі з обробки двовимірних
масивів
#include<conio.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>

/*функція для визначення найдовшої послідосності цифр в символьному


рядку за допомогою вказівників*/
int digitpointer(char *s) {
int count = 0, maxcount = 0;
for (int i = 0; i<strlen(s); i++)
{
if (*(s + i) >= '0'&&*(s + i) <= '9')
{
count++;
if (maxcount < count)
maxcount = count;
}
else count = 0;
}
return maxcount;
}
/*функція для визначення найдовшої послідосності цифр в символьному
рядку за допомогою індексів*/
int digit(char s[]) {
int count = 0, maxcount = 0; //об'явлення лічильників
for (int i = 0; s[i]; i++) //цикл перебору символів в
рядку
{
if (s[i] >= '0'&&s[i] <= '9') //умова "чи дорівнює символ
цифрі"
{
count++; //якщо символ це цифра
збільшуемо лічильник
if (maxcount < count) //порівнюємо максимальний
лічильник із лічильником
maxcount = count; //якщо максимальний
лічильник мешне звичайного привласнюємо йому значення лічильника
}
else count = 0; //якщо символ не дорівнює
цифрі обнуяємо лічильник
}
return maxcount; //повертаємо максимальний
лічильник
}

void main() {
char s[100];
47

printf("Enter the array\n");


gets(s); //вводимо рядок з клавіатури
gets(s);
printf("Index:");
printf("The biggest sequence of numbers has %d elements\n",
digit(s)); //викликаємо функцію з індексами та виводимо
результат в командний рядок
printf("Pointers:");
printf("The biggest sequence of numbers has %d elements",
digitpointer(s)); //викликаємо функцію з вказівниками та виводимо
результат в командний рядок
_getch();
}
48

Лістинг Л.2 — Лістинг алгоритму розв’язання задачі з обробки символьних


рядків

#include<conio.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>

/*функція друку матриці*/


void strprint(int str[K][K]) {
for (int i = 0; i < K; i++) //зовнішній цикл
{
printf("\n\n"); //розділові пробіли
for (int j = 0; j < K; j++) //внутрішній цикл
printf("%4d", str[i][j]); //виведення значення
елементу на командний рядок
}
}
/*функція заповнення матриці рандомними числами*/
void random(int str[K][K]) {
for (int i = 0; i < K; i++) //зовнішній цикл
for (int j = 0; j < K; j++) //внутрішній цикл
str[i][j] = rand() % 10; //присвоювання
елементум матриці рандомного значення
}
/*функція повороту матриці матриці */
void povorot(int str[K][K]) {
int arr[K][K];
for (int i = 0; i < K; i++) //зовнішній цикл
for (int j = 0; j < K; j++) //внутрішній цикл
arr[i][j] = str[j][K - 1 - i]; //присвоювання
елементум масиву arr значення елементів масива str з поворотом на 90
градусів
for (int i = 0; i < K; i++) //зовнішній цикл
for (int j = 0; j < K; j++) //внутрішній цикл
str[i][j] = arr[i][j]; //преприсвоювання
значення елементів матриці arr елементум матриці str

}
/*функція заповнення матриці через командний рядок*/
void vvod(int str[K][K]) {
printf("Enter the matrix");
for (int i = 0; i < K; i++) //зовнішній
цикл
for (int j = 0; j < K; j++) //внутрішній
цикл
scanf("%d", &str[i][j]); //введення елементу
з командного рядка

}
49

void exercise2() {
int str[K][K], h;

printf("Enter with the console - 1\n");


printf("Do it by random - 2\n");
do { //цикл перевірки
правильності вводу числа
scanf("%d", &h);
if (h < 1 || h>2) //якщо число
більше двох або менше одного цикл запускається заново
printf("ERROR please try again\n");
} while (h < 1 || h>2);
switch (h) {
case 1: vvod(str); break; //вибір варіанту
введення
case 2: random(str); break;
default:printf("Error"); break;
}

printf("Incoming matrix:");
strprint(str); //виклик функції
друку матриці
printf("\n\nTurned matrix:");
povorot(str); //виклик функції
повороту матриці
strprint(str); //виклик функції
друку матриці
printf("\n");
_getch(); }
50

Лістинг Л.3 — Лістинг алгоритму розв’язання задачі з обробки бітів


#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
/*функція кодування/декодування файлів*/
void codesymb(char firstfile[], char secondfile[], int a) {
FILE *mf, *mf2;
int symb, result;
mf = fopen(firstfile, "r"); //відкриття файлу для
читання
if (mf == NULL) { //перевірка чи
відкрився файл
printf("Cannot open read file.\n");
}
mf2 = fopen(secondfile, "w"); //відкриття файлу для
запису
if (mf2 == NULL) { //перевірка чи
відкрився файл
printf("Cannot open write file.\n");
}
while (1) //цикл перебору
символів у файлі
{
symb = fgetc(mf); //взяття символу
if (symb == EOF) //перевірка на кінець
файлу
{
break;
}
result = symb^a;
//кодування/декодування символу
printsymb(symb,result,a); //виклик функції
друку
fputc(result, mf2); //запис символу у
файл
}
fclose(mf); //закриваємо потоки
fclose(mf2);
}
/*функція друку бітів*/
void printbit(int a) {
int str[8];
for (int i = 7; i >= 0; i--)
{
str[i] = a % 2; //записуємо до масиву остачу
від ділення числа на 2
a = a / 2;
}
for (int i = 0; i < 8; i++)
{
51

printf("%d", str[i]); //виводимо зміст масиву в


командний рядок
}
printf("\n");
}
/*функція друку*/
void printsymb(int a, int result, int b) {
printf("%c = ", a); //друк вхідного символу
printbit(a); //друк бітів вхідного
символу
printf("%d = ", b); //друк паролю
printbit(b); //друк бітів паролю
printf("result= ");
printbit(result); //друк бітів вихідного
символу
printf("\n");
}

void exercise3() {
char filename[20], secondfile[20];
int pass;
printf("Enter a file to read ");
scanf("%s", filename); //введення ім'я файлу
для читання
printf("Enter a file to write ");
scanf("%s", secondfile); //введення ім'я файлу
для запису
printf("Enter a pass from 1 to 255 :");
do {
scanf("%d", &pass); //цикл перевірки
паролю
} while (pass < 1 || pass>255);

codesymb(filename, secondfile, pass); //виклик функції


кодування/декодування
}
52

Лістинг Л.4 — Лістинг алгоритму розв’язання задачі з роботи зі структурами,


сортуванню та пошуку даних.
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#define K 15
#define B 5
/*оголошення нового типу даних (структури) Trip */
typedef struct {
char country[K], mehType[K], color[K], image[B];
int year, month;
float price;
} Trip;

/*прототипи функцій*/
Trip* initArray(int, char[]);
int dimlong(char[]);
void displayArray(Trip*, int);
void countChoise(Trip*, int, int, int, char[], int, int);
void displayTrip(Trip);
void sortPrice(Trip*, int);
void displayChoise(Trip*, int, char[], char[]);
/*головна функція*/
void exercise4() {
int dimension;
char filename[] = "zont.txt", secondfile[] = "selectzont.txt";
Trip* massiveStruct;
dimension = dimlong(filename);
//виклик функції для визначення кількості рядків в файлі
massiveStruct = initArray(dimension, filename);
//виклик финкції для створення масиву структур
if (massiveStruct == NULL) {
//перевірка створення масиву
printf("\nDynamic array don't exist!\n");
printf("\nPress any key to exit...");
}
printf("\nThe list of umbrellas: \n");
displayArray(massiveStruct, dimension);
//функція виведення масиву структур

printf("\n\nThe sorting list of umbrellas: \n");


sortPrice(massiveStruct, dimension);
//сортування масиву структур
displayArray(massiveStruct, dimension);
// виведення масиву структур
int Umonth, Uyear, Lmonth, Lyear;
char Simage[] = "no";
Umonth = 12;
Uyear = 2019;
Lmonth = 9;
Lyear = 2018;
53

printf("\n\nThe list of founded umbrellas: \n");


countChoise(massiveStruct, dimension, Umonth, Uyear, Simage,
Lmonth, Lyear); //виклик функції підрахування зонтів за критеріями
printf("\nChoose the mechanism\nmechanical - 1 \nsemiautomatic -
2 \nautomatic - 3 \n");
int n;
char meh[] = "mechanical", autom[] = "automatic", semi[] =
"semiautomatic"; //об'явлення типів механізму для пошуку
do {
//цикл обробки виключних ситуацій
scanf("%d", &n);
//введення виразу для оператору switch
if (n < 1 || n>3)
{
printf("Error try again");
}
} while (n < 1 || n>3);
printf("\n\nThe list of selected umbrellas: \n");
switch (n) {
//оператор вибору типу механізму для пошуку
case 1: displayChoise(massiveStruct, dimension, secondfile, meh);
break;
case 2: displayChoise(massiveStruct, dimension, secondfile,
semi); break;
case 3: displayChoise(massiveStruct, dimension, secondfile,
autom); break;
default: printf("Error"); break;
}

free(massiveStruct);
//звільнення пам'яті
printf("\nPress any key to exit...\n");

}
/*функція визначення кількості рядків у файлі*/
int dimlong(char filename[]) {
FILE *mf;
char str[200];
int i = 0;
mf = fopen(filename, "r"); //відкриття
потоку
if ((mf = fopen(filename, "r")) == NULL) { //перевірка
відкриття потоку
printf("Cannot open file.\n");
exit(1);
}
while (!feof(mf)) { //цикл перебору
рядків
fgets(str, 200, mf);
i++;
54

}
fclose(mf); //закриття потоку
return i; //повертаємо
кількість рядків
}
/*функція створення масиву, виділення пам'яті та введення інформації
з файлу*/
Trip* initArray(int dimension, char filename[]) {
int i;
Trip* massive = (Trip*)malloc(dimension * sizeof(Trip));
//виділення пам'яті
FILE *mf;
mf = fopen(filename, "r");
//вівдкриття файлу
if (massive == NULL)
return NULL;
//перевірка виділення
if (mf == NULL) { printf("error\n"); return -1; }
//перевірка відкриття
for (i = 0; i < dimension; i++)
//цикл перебору рядків у файлі
{ //введення інформації з файлу в елемент масиву
fscanf(mf, "%s%s%s%s%f%d%d", massive[i].country,
massive[i].mehType, massive[i].color, &massive[i].image,
&massive[i].price, &massive[i].month, &massive[i].year);

}
if (fclose(mf) == EOF) printf("fclose(mf) == EOF\n");
//закриття файлу
return massive;
//повертаєто масив
}

/*функція виведення на єкран масиву структур*/


void displayArray(Trip* massive, int dimension)
{
printf("\n Country MehType Color Image
Price Month Year");
for (int i = 0; i < dimension; i++) //цикл перебору
елементів масиву
{
displayTrip(massive[i]); //виклик функції виводу
елементу
}
}

/*функція виведення на єкран елементів масиву структур*/


void displayTrip(Trip general)
{
55

printf("\n%13s %15s %12s %5s %8g %8d %8d", general.country,


general.mehType, general.color, general.image, general.price,
general.month, general.year);

}
/*функція виведення та підрахування елементів що відповідають
критеріям*/
void countChoise(Trip* massive, int dimension, int Umonth, int Uyear,
char image[], int Lmonth, int Lyear)
{
int count=0; //обнуляємо лічильник
for (int i = 0; i < dimension; i++)
//цикл перебору всіх елементів масиву
{
if ((massive[i].year >= Lyear)&&(massive[i].month >=
Lmonth)|| (massive[i].year > Lyear)) //якщо дата елементу більше
нижньго ліміту дати відкриваємо новий цикл
{
for (int j = i; j < dimension; j++)
{
if ((massive[j].month > Umonth)&&(massive[j].year
>= Uyear)|| (massive[j].year > Uyear)) //якщо дата елементу більше
верхньго ліміту закриваємо функцію
{
goto stop;
}
else if (*(massive[j].image)==*(image)){
//в іншому випадку збільшуємо лічильник
displayTrip(massive[j]);
//та вивиодимо елемент на екран
count++;
i = j;
}
}
}
}
stop: printf("\n\n%d umbrellas found by this search criterias\n\n",
count); //виводимо лічильник
}

/*функція сортування за датою продажу*/


void sortPrice(Trip* massive, int dimension)
{
Trip temp;
for (int i = 0; i <= dimension; i++)
//сортування методом бульбашки за місяцем продажу
for (int j = dimension - 1; j > i; j--)
if (massive[j].month<massive[j - 1].month)
{
temp = massive[j];
massive[j] = massive[j - 1];
massive[j - 1] = temp;
56

}
for (int i = 0; i <= dimension; i++)
//сортування методом бульбашки за роком продажу
for (int j = dimension - 1; j > i; j--)
if (massive[j].year<massive[j - 1].year)
{
temp = massive[j];
massive[j] = massive[j - 1];
massive[j - 1] = temp;
}
}
void displayChoise(Trip* massive, int dimension, char secondfile[],
char mechanism[])
{
FILE * pFile;
pFile = fopen(secondfile, "w"); //відкриття потоку
для запису

for (int i = 0; i < dimension; i++) //цикл


перебору елементів
{
if (strcmp(massive[i].mehType, mechanism) == 0)
//порівняння символьних рядків
{ //якщо співпадають друкуємо у файл
fprintf(pFile, "%13s %15s %12s %5s %8g %8d %8d\n",
massive[i].country, massive[i].mehType, massive[i].color,
massive[i].image, massive[i].price, massive[i].month,
massive[i].year);
displayTrip(massive[i]); //та виводимо на екран
}
}
fclose(pFile); //закриття потоку
}

You might also like