Розробка інформаційної системи мовою програмування С

67862
знака
1
таблица
1
изображение

Одеський національний політехнічний університет

Інститут комп'ютерний систем

Кафедра системного програмного забезпечення

КУРСОВИЙ ПРОЕКТ

(РОБОТА)

з дисципліни: "Основи програмування"

на тему:

"Розробка інформаційної системи мовою програмування С"

Студента 1 курсу  групи АС-131

напряму підготовки бакалавра

спеціальності програмна інженерія

Романюк К.Г.

Керівник: Жиро Л.С.

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

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

Оцінка: ECTS _____

                                                                     Члени комісії          ________________                Комлева Н.О.

                                                                                                                                             (підпис)                       

                                                                                                      ________________                   Жиро Л.С.

                                                                                                                                              (підпис)                       

м. Одеса – 2014 рік

Завдання до курсової роботи

У рамках даної курсової роботи студент повинен розробити програмну інформаційну систему згідно зі своїм варіантом.

Програма передбачає роботу користувача в одному з двох режимів роботи.

Після запуску програми на виконання користувачеві надається можливість вибору режиму роботи: адміністратор чи оператор. При виборі режиму Адміністратор у користувача запитується пароль, вхід в режимі Оператора відбувається без введення пароля.

Далі на екрані відкривається головне меню з наступними командами:

1. Завдання.

2. Вміст бази даних.

3. Функція 1 (згідно з варіантом).

4. Функція 2 (згідно з варіантом).

5. Функція 3 (згідно з варіантом).

6. Функція 4 (згідно з варіантом).

7. Функція 5 (згідно з варіантом).

8. Додавання запису (тільки для адміністратора).

9. Видалення запису (тільки для адміністратора).

10. Вихід.

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

Аналогічний повернення проводиться при відпрацюванні всіх інших пунктів меню, крім пункту "Вихід".

Вибір "Вмісту бази даних" дозволяє відобразити всі записи, що містяться у файлі даних. Необхідно організувати виведення інформації в зручній для сприйняття табличній формі.

При виборі користувачем пунктів "Функція 0" - "5" виконуються відповідні дії і результат відображається на екрані. При цьому кожної функції завдання повинні відповідати розроблені студентом одна або більше програмні функції.

Пункти меню "Додавання запису" і "Видалення запису" доступні тільки в режимі адміністратора. При додаванні нового запису необхідно ввести значення для всіх полів, а потім додати запис в кінець файлу. При видаленні запису також необхідно задати значення всіх полів для ідентифікації запису. У разі необхідності можна використовувати проміжні змінні і масиви.

При виборі користувачем пункту меню "Вихід" необхідно організувати вихід з програми. При цьому повинні бути закриті всі відкриті раніше файли (файл).

Необхідно передбачити контроль за діями користувача таким чином, щоб помилки при введенні даних або команд не приводили до аварійного завершення програми і видавалося повідомлення, що характеризує помилку.

Студент може використовувати спеціальні засоби для створення інтерфейсу.

Проте в цьому випадку він повинен бути готовий дати вичерпну відповідь про роботу і організацію використовуваних програмних засобів. Не припускається використання інтерфейсних засобів з об’єктно - орієнтованою ідеологією.

У процесі розробки програми треба виконувати її тестування.

Для всіх модулів необхідно розробити драйвера та заглушки потрібного типу (A, B, C, D).

Крім того, робота модулів повинна бути перевірена засобами тестування «білого ящика»:

- тестування базового шляху (обов’язково для кожного модуля),

- тестування умов (тестування гілок і операторів відношень),

- тестування потоків даних,

- тестування циклів.

Варіант 13.

Предметна область – супермаркет. Об’єкт – продавець. Дані об’єкту:

Ø ПІБ;

Ø адреса;

Ø відділ (одяг, взуття, бакалея и т.д.);

Ø посада;

Ø стаж праці;

Ø заробітна плата.

Функції:

1. Вивести по одному продавцю з найбільшим стажем праці з кожного відділу.

2. Вивести адреси продавців, згрупованих по відділам.

3. Вивести продавця (продавців) з найменшою заробітною платою.

4. Підрахувати кількість продавців, які працюють в кожному відділі.

5. Визначити посаду, яку займає продавець, який проживає за вказаною адресою.


Анотація

Метою даної курсової роботи є закріплення основних теоретичних та практичних навичок з дисципліни "Основи програмування": створення алгоритмів для реалізації програм та написання цих програм на мові програмування "С". Також курсова робота допомагає закріпити необхідний теоретичний та практичний матеріал по реалізації тестування роботи та функціонування програмного забезпечення.

В представленій роботі розглядається розробка інформаційної системи для автоматизації та більш швидкого доступу до бажаної інформації. В роботі розроблена інформаційна система під назвою "Магазин", що реалізує роботу з різноманітними товарами.

Програмне забезпечення може застосовуватися не тільки для продуктових магазинів, воно може використовуватися для всіх типів магазинів. В використанні цього програмного продукту також можуть бути зацікавлені покупці магазину, які матимуть можливість отримати основну інформацію про товари у магазині.

Для адміністраторів магазину розроблений спеціальний режим роботи з інформаційною системою. Цей режим представлений для додавання чи видалення товару з програми.

У простого користувача обмежені можливості, що охоплюють лише доступ до бажаної інформації.

Вся інформація, що зберігається та оброблюється за допомогою програми, зберігається в окремому файлі, що є доступним для програми при такій необхідності. Це надає можливість розробляти більш складніші за структурою програми.

В заключній частині курсової роботи представлені приклади з різних підходів до тестування окремих програмних модулів.

Також курсова робота додатково включає в себе 2 додатки: лістинг програми та лист зі схемами алгоритму формату А1.


1.jpg

ЗМІСТ

Вступ6

1 Вибір та аналіз обраних структур даних7

2 Функції прогами8

    2.1. Функція 18

        2.1.1. Ідея реалізації8

        2.1.2. Структура даних8
        2.1.3. Опис роботи функції по схемам алгоритму9
        2.1.4. Тестування методом драйверів та заглушок10
        2.1.5. Тестування методом білого ящика10
    2.1. Функція 211

        2.2.1. Ідея реалізації11

2.jpg        2.2.2. Структура даних11
        2.2.3. Опис роботи функції по схемам алгоритму12
        2.2.4. Тестування методом драйверів та заглушок13
        2.2.5. Тестування методом білого ящика13
    2.1. Функція 314

        2.3.1. Ідея реалізації14

У К        2.3.2. Структура даних14
        2.3.3. Опис роботи функції по схемам алгоритму15
        2.3.4. Тестування методом драйверів та заглушок16
        2.3.5. Тестування методом білого ящика17
    2.1. Функція 418

        2.4.1. Ідея реалізації18

У К        2.4.2. Структура даних18
        2.4.3. Опис роботи функції по схемам алгоритму19
        2.4.4. Тестування методом драйверів та заглушок20
        2.4.5. Тестування методом білого ящика20
    2.1. Функція 521

        2.5.1. Ідея реалізації21

5.jpgУ К        2.5.2. Структура даних21
        2.5.3. Опис роботи функції по схемам алгоритму22
        2.5.4. Тестування методом драйверів та заглушок23
        2.5.5. Тестування методом білого ящика23
3. Опис роботи профілю користувача25

    3.1. Користувач25

    3.2. Адміністратор25

У К4. Опис роботи з базою даних25
5. Керівництво користувача26
  5.1. Перший пункт26
  5.2. Другий пункт26

  5.3. Третій пункт26
  5.4. Четвертий пункт27

  5.5. П’ятий пункт27

  5.6. Шостий пункт27

У КУ К  5.7. Сьомий пункт28
  5.8. Восьмий пункт29

  5.9. Дев’ятий пункт29
6. Контрольний приклад30

Висновок31
Список літератури31
Лістинг програми32

У К


Вступ

У світі існує безліч різноманітних професій. Людина, проходячи перші важливі ступені життя, обирає собі окремий шлях по професійному ухилу, вподобанню, бажанню реалізувати себе в тій чи іншій сфері. І щоб дійсно досягти поставлених цілей, людині потрібно осягнути дуже багато напрямів своєї професії та пройти через безліч перешкод.

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

Однією з таких дисциплін-фундаментів мого напряму я вважаю предмет "Основи програмування". Він вчить мене основним принципам побудови алгоритмів, програм, вибору структур даних. Ця дисципліна вчить мене думати, надає мені практичних знань та досвіду, щоб розробляти модель програми ще до стадії набору програми на заданій мові програмування. Ця дисципліна вчить мене тим основним речам, без яких жоден представник вибраної мною професії не може обійтись у своїй праці, тим основам, які повинні буди зі мною не тільки на протязі всього навчання у вищому навчальному закладі, а і у подальшій професійній діяльності.

Освоївши цю дисципліну, в подальшому можна буде без проблем осягати й інші мови, маючи основні теоретичні та практичні навички, а також значний досвід.


1. Вибір та аналіз відповідних структур даних

Відповідно до завдання, наша предметна область – «Супермаркет», об'єкт – продавець. Данні об’єкту:

Ø ПІБ;

Ø адреса;

Ø відділ (одяг, взуття, бакалея и т.д.);

Ø посада;

Ø стаж праці;

Ø заробітна плата;

Для реалізації цих показників ми повинні створити структуру даних під назвою sell, яка буде складатися з наступних частин:

1. ПІБ будемо зберігати у структурі даних FIO, яка складається із рядкового масиву F, де будемо зберігати дані про прізвище продавця, та із рядкового масиву IO, де будемо зберігати дані про ім’я та по-батькові продавця.

2. Адресу будемо зберігати у структурі даних adds, яка складається із рядкового масиву str, де будемо зберігати дані про вулицю, на якій мешкає продавець, та із змінної цілих чисел h, де будемо зберігати дані про номер будинку, в якому мешкає продавець.

3. Відділ будемо зберігати у рядковому масиві dep, в якому будемо зберігати назву відділу, в якому працює продавець.

4. Посаду будемо зберігати у рядковому масиві post, в якому будемо зберігати назву посади, яку займає продавець.

5. Стаж праці будемо зберігати у змінній цілих чисел exp, в якій будемо зберігати дані про кількість місяців, які працював продавець.

6. Заробітну плату будемо зберігати у змінній чисел із плаваючою комою wage, в якій будемо зберігати дані, про кількість гривень, яку отримує продавець за місяць, як заробітну плату.


2. Функції програми

Для функціонування нашої інформаційної бази даних розроблено п'ять функцій:

ü Вивід по одному продавцю з найбільшим стажем праці з кожного відділу.

ü Вивід адрес продавців, згрупованих по відділам.

ü Вивід продавця (продавців) з найменшою заробітною платою.

ü Підрахунок кількості продавців, які працюють в кожному відділі.

ü Визначення посаду, яку займає продавець, який проживає за вказаною адресою.

2.1. Функція 1

ВИВІД ПО ОДНОМУ ПРОДАВЦЮ

З НАЙБІЛЬШИМ СТАЖЕМ ПРАЦІ З КОЖНОГО ВІДДІЛУ

2.1.1. Ідея реалізації

1) В множині продавців фіксуємо продавця.

2) Віднімаємо зафіксованого продавця з множини продавців.

3) Додаємо фіксованого продавця у множину переглянутих продавців.

4) Додаємо стаж праці фіксованого продавця у множину знайдених максимальних стажів праці.

5) Якщо в множині знайдених максимальних стажів праці не знаходяться два стажа праці різного значення, то виконуємо пункт 1).

6) Якщо в множині знайдених максимальних стажів праці знаходяться два стажи праці різного значення, то виконуємо пункт 7)

7) Віднімаємо стаж праці меншого значення з множини знайдених максимальних стажів праці.

8) Якщо множина продавців не пуста, то виконуємо пункт 1).

9) Прирівняємо множину переглянутих продавців множині продавців.

2.1.2. Структура даних

Для реалізації даної функції нам знадобляться такі структури даних:

Ø Файл “А.bin”, де знаходяться дані про продавців;

Ø Структура даних sell, в якій знаходяться впорядковані дані про продавців та структура даних sell_max, в якій знаходяться впорядковані дані про продавців з найбільшим стажем праці з кожного відділу;

Ø Змінна цілих чисел i для реалізації циклів з фіксованою кількістю повторень, які пишуть «-» для таблиць та для реалізації функції sort_dep.

2.1.3. Опис роботи функції по схемам алгоритму

Блок 1. Сортуємо продавців за посадою.

Блок 2. Відкриваємо бінарний файл “A.bin” для читання (r).

Блок 3. Якщо бінарний файл “A.bin” не вдалося відкрити, то виконуємо Блок 4, інакше виконуємо Блок 5.

Блок 4. Повертаємо функції значення 1 (return 1).

Блок 5. Виводимо на екран “Seller with max experience from every department” та «Шапку таблиці».

Блок 6. Якщо не дійшли до кінця бінарного файлу “A.bin”, то виконуємо Блок 7, інакше виконуємо Блок 17.

Блок 7. Зчитуємо дані з бінарного файлу “A.bin”.

Блок 8. Якщо не дійшли до кінця бінарного файлу “A.bin”, то виконуємо Блок 9, інакше виконуємо Блок 17.

Блок 9. Присвоюємо даним структури sell_max даних структури sell.

Блок 10. Якщо не дійшли до кінця бінарного файлу “A.bin”, то виконуємо Блок 11, інакше виконуємо Блок 17.

Блок 11. Зчитуємо дані з бінарного файлу “A.bin”.

Блок 12. Якщо не дійшли до кінця бінарного файлу “A.bin”, то виконуємо Блок 13, інакше виконуємо Блок 17.

Блок 13. Якщо рядковий масив sell_max.dep співпадає з рядковим масивом sell.dep, то виконуємо Блок 14, інакше виконуємо Блок 16.

Блок 14. Якщо значення змінної цілих чисел sell_max.exp менше, ніж значення змінної цілих чисел sell.exp, то виконуємо Блок 15, інакше виконуємо повернення до Блоку 10.

Блок 15. Присвоюємо даним структури sell_max даних структури sell.
Повертаємося до Блоку 10.

Блок 16. Виводимо на екран рядкові масиви sell_max.FIO.F, sell_max.FIO.IO, sell_max.adds.str, sell_max.dep, sell_max.post, змінні цілих чисел sell_max.adds.h, sell_max.exp, змінну чисел з плаваючою комою sell_max.wage.
Повертаємося до Блоку 10.

Блок 17. Виводимо на екран рядкові масиви sell_max.FIO.F, sell_max.FIO.IO, sell_max.adds.str, sell_max.dep, sell_max.post, змінні цілих чисел sell_max.adds.h, sell_max.exp, змінну чисел з плаваючою комою sell_max.wage.
Виводимо на екран «Закриття таблиці».

Блок 18. Закриваємо бінарний файл “A.bin” та повертаємо функції значення 0 (return 0).


2.1.4. Тестування методом драйверів та заглушок

Функція int function_1 () має драйвер та заглушку типу С, оскільки цій функції не передається ніякий параметр, але вона повертає результат.

Драйвер

            printf ("Тестування функції 1:\n");

            result=function_1 ();

            if (result==1)

                        printf("Функція 1 не виконується \n");

Заглушка:

int function_1 ()

{

printf ("Функція 1 працює\n");

int result;

scanf ("%d", &result)

return result;

}

2.1.5 Тестування методом білого ящика

Цикломатична складність графу дорівнює 11.

Незалежні шляхи:

Шлях 1: 1-2-3

Шлях 2: 1-2-4-5-6-7-8-9-10-11-12-24-25-26-27-28

Шлях 3: 1-2-4-5-6-7-8-9-10-11-12-13-14-15-16-17-18-19-20-21-22-23-24-25-26-27-28

Тестовий варіант 1

Вхідні дані: нема бінарного файлу “А.bin”.

Очікуваний результат: функція не працює.

Тестовий варіант 2

Вхідні дані: незаповнений бінарний файл “А.bin”.

Очікуваний результат: функція не працює.

Тестовий варіант 3

Вхідні дані: заповнений бінарний файл “А.bin”.

Очікуваний результат: виведення одного продавця з найбільшим стажем праці з кожного відділу.


2.2. Функція 2

ВИВІД АДРЕС ПРОДАВЦІВ, ЗГРУПОВАНИХ ПО ВІДДІЛАМ

2.2.1. Ідея реалізації

1) В множині продавців фіксуємо продавця.

2) Віднімаємо фіксованого продавця з множини продавців.

3) Додаємо відділ та адресу фіксованого продавця у множину одного відділа.

4) Додаємо фіксованого продавця у множину використаних продавців.

5) Якщо в множині одного відділу не знаходяться два різних відділи, то виконуємо пункт 1).

6) Віднімаємо відділ та адресу фіксованого продавця з множини одного відділа.

7) Додаємо фіксованого продавця у множину переглянутих продавців.

8) Якщо множина продавців не пуста, то виконуємо пункт 1).

9) Додаємо з множини одного відділа у множину адрес продавців кожного відділу кортеж адрес множини одного відділу і відділ будь-якого продавця множини одного відділу.

10) В множині переглянутих продавців фіксуємо продавця.

11) Віднімаємо фіксованого продавця з множини переглянутих продавців.

12) Додаємо фіксованого продавця у множину продавців.

13) Якщо множина переглянутих продавців не пуста, то виконуємо пункт 10).

14) Якщо множина продавців не пуста, то виконуємо пункт 1).

15) Прирівняємо множину переглянутих продавців множині продавців.

2.2.2. Структура даних

Ø Файл “А.bin”, де знаходяться дані про продавців;

Ø Структура даних sell, в якій знаходяться впорядковані дані про продавців;

Ø Змінна цілих чисел i для реалізації циклів з фіксованою кількістю повторень, які пишуть «-» для таблиць та для реалізації функції sort_dep.


2.2.3. Опис роботи функції по схемам алгоритму

Блок 1. Сортуємо продавців за посадою.

Блок 2. Відкриваємо бінарний файл “A.bin” для читання (r).

Блок 3. Якщо бінарний файл “A.bin” не вдалося відкрити, то виконуємо Блок 4, інакше виконуємо Блок 5.

Блок 4. Повертаємо функції значення 1 (return 1).

Блок 5. Виводимо на екран “Sellers’ addresses by departments”.

Блок 6. Якщо не дійшли до кінця бінарного файлу “A.bin”, то виконуємо Блок 7, інакше виконуємо Блок 16.

Блок 7. Зчитуємо дані з бінарного файлу “A.bin”.

Блок 8. Якщо не дійшли до кінця бінарного файлу “A.bin”, то виконуємо Блок 9, інакше виконуємо Блок 16.

Блок 9. Виводимо на екран «Шапку таблиці» та рядкові масиви sell.adds.str, sell.adds.h, sell.dep.

Блок 10. Якщо не дійшли до кінця бінарного файлу “A.bin”, то виконуємо Блок 11, інакше виконуємо Блок 14.

Блок 11. Зчитуємо дані з бінарного файлу “A.bin”.

Блок 12. Якщо не дійшли до кінця бінарного файлу “A.bin”, то виконуємо Блок 13, інакше повертаємося до Блоку 10.

Блок 13. Виводимо на екран рядкові масиви sell.adds.str, sell.adds.h, sell.dep.
Повертаємося до Блоку 10.

Блок 14. Виводимо на екран «Закриття таблиці».

Блок 15. Закриваємо файл “A.bin”.

Блок 16. Повертаємо функції значення 0 (return 0).


2.2.4. Тестування методом драйверів та заглушок

Функція int function_1 () має драйвер та заглушку типу С, оскільки цій функції не передається ніякий параметр, але вона повертає результат.

Драйвер

            printf ("Тестування функції 2:\n");

            result=function_2 ();

            if (result==1)

                        printf("Функція 2 не виконується \n");

Заглушка:

int function_2 ()

{

printf ("Функція 2 працює\n");

int result;

scanf ("%d", &result)

return result;

}

2.2.5 Тестування методом білого ящика

Цикломатична складність графу дорівнює 9.

Незалежні шляхи:

Шлях 1: 1-2-3

Шлях 2: 1-2-4-24

Шлях 3: 1-2-4-5-6-7-8-9-10-11-12-13-14-15-16-17-18-19-20-21-22-23-24

Тестовий варіант 1

Вхідні дані: немає бінарного файлу “А.bin”.

Очікуваний результат: функція не працює.

Тестовий варіант 2

Вхідні дані: незаповнений бінарний файл “А.bin”.

Очікуваний результат: функція не працює.

Тестовий варіант 3

Вхідні дані: заповнений бінарний файл “А.bin”.

Очікуваний результат: функція виводить адреси продавців, згрупованих по відділам.


2.3. Функція 3

ВИВІД ПРОДАВЦЯ (ПРОДАВЦІВ)

З НАЙМЕНШОЮ ЗАРОБІТНОЮ ПЛАТОЮ

2.3.1. Ідея реалізації

1) В множині продавців фіксуємо продавця.

2) Віднімаємо зафіксованого продавця з множини продавців.

3) Додаємо фіксованого продавця у множину переглянутих продавців.

4) Додаємо заробітну плату фіксованого продавця у множину знайдених мінімальних заробітних плат.

5) Якщо в множині знайдених мінімальних заробітних плат не знаходяться дві заробітні плати різного значення, то виконуємо пункт 1).

6) Якщо в множині знайдених мінімальних заробітних плат знаходяться дві заробітні плати різного значення, то виконуємо пункт 7)

7) Віднімаємо заробітну плату більшого значення з множини знайдених мінімальних заробітних плат.

8) Якщо множина продавців не пуста, то виконуємо пункт 1).

9) Прирівняємо множину переглянутих продавців множині продавців.

2.3.2. Структура даних

Ø Файл “А.bin”, де знаходяться дані про продавців;

Ø Файл “T.bin”, куди ми будемо записувати дані про продавця (продавців) з найменшою заробітною платою;

Ø Структура даних sell, в якій знаходяться впорядковані дані про продавців;

Ø Змінна чисел з плаваючою комою wage_min, з якою ми будемо порівнювати заробітну плату продавців і шукати найменшу заробітну плату.


2.3.3. Опис роботи функції по схемам алгоритму

Блок 1. Відкриваємо файл “A.bin” для читання (r).

Блок 2. Якщо бінарний файл “A.bin” не вдалося відкрити, то виконуємо Блок 3, інакше виконуємо Блок 4.

Блок 3. Повертаємо функції значення 1 (return 1).

Блок 4. Якщо не дійшли до кінця бінарного файлу “A.bin”, то виконуємо Блок 5, інакше виконуємо Блок 12.

Блок 5. Зчитуємо дані з бінарного файлу “A.bin”.

Блок 6. Якщо не дійшли до кінця бінарного файлу “A.bin”, то виконуємо Блок 7, інакше виконуємо Блок 12.

Блок 7. Присвоюємо змінній з плаваючою комою wage_min значення змінної з плаваючою комою sell.wage. Створюємо бінарний файл “T.bin” для запису, а потім читання (w+).

Блок 8. Якщо бінарний файл “Т.bin” не вдалося відкрити, то виконуємо Блок 9, інакше виконуємо Блок 10.

Блок 9. Повертаємо функції значення 1 (return 1).

Блок 10. Записуємо дані у бінарний файл “Т.bin”.

Блок 11. Закриваємо бінарний файл “Т.bin”.

Блок 12. Якщо не дійшли до кінця бінарного файлу “A.bin”, то виконуємо Блок 13, інакше виконуємо Блок 27.

Блок 13. Зчитуємо дані з бінарного файлу “A.bin”.

Блок 14. Якщо не дійшли до кінця бінарного файлу “A.bin”, то виконуємо Блок 15, інакше повертаємося до Блоку 12.

Блок 15. Якщо значення змінної з плаваючою комою sell.wage дорівнює значенню змінної з плаваючою комою wage_min, то виконуємо Блок 16, інакше виконуємо Блок 21.

Блок 16. Відкриваємо бінарний файл “Т.bin” для дозапису, а потім читання (a+).

Блок 17. Якщо бінарний файл “Т.bin” не вдалося відкрити, то виконуємо Блок 18, інакше виконуємо Блок 19

Блок 18. Повертаємо функції значення 1 (return 1).

Блок 19. Записуємо дані у бінарний файл “Т.bin”.

Блок 20. Закриваємо бінарний файл “Т.bin”.

Блок 21. Якщо значення змінної з плаваючою комою sell.wage менше, ніж значення змінної з плаваючою комою wage_min, то виконуємо Блок 22, інакше повертаємося до Блоку 12.

Блок 22. Присвоюємо значенню змінної з плаваючою комою wage_min значення змінної з плаваючою комою sell.wage. Створюємо бінарний файл “T.bin” для запису, а потім читання (w+).

Блок 23. Якщо бінарний файл “Т.bin” не вдалося відкрити, то виконуємо Блок 24, інакше виконуємо Блок 25.

Блок 24. Повертаємо функції значення 1 (return 1).

Блок 25. Записуємо дані у бінарний файл “Т.bin”.

Блок 26. Закриваємо бінарний файл “T.bin”. Повертаємося до Блоку 12.

Блок 27. Відкриваємо бінарний файл “T.bin” для читання, а потім запису (r+).

Блок 28. Якщо бінарний файл “Т.bin” не вдалося відкрити, то виконуємо Блок 29, інакше виконуємо Блок 30.

Блок 29. Повертаємо функції значення 1 (return 1).

Блок 30. Виводимо на екран “Seller with minimal sallary”.

Блок 31. Виводимо на екран дані з бінарного файлу “Т.bin”.

Блок 32. Закриваємо бінарний файл “Т.bin” та видаляємо бінарний файл “Т.bin”.

Блок 33. Повертаємо функції значення 0 (return 0).

2.3.4. Тестування методом драйверів та заглушок

Функція int function_1 () має драйвер та заглушку типу С, оскільки цій функції не передається ніякий параметр, але вона повертає результат.

Драйвер

            printf ("Тестування функції 3:\n");

            result=function_3 ();

            if (result==1)

                        printf("Функція 3 не виконується \n");

Заглушка:

int function_3 ()

{

printf ("Функція 3 працює\n");

int result;

scanf ("%d", &result)

return result;

}


2.3.5 Тестування методом білого ящика

Цикломатична складність графу дорівнює 12.

Незалежні шляхи:

Шлях 1: 1-2

Шлях 2: 1-2-4-5-6-7-8-9

Шлях 3: 1-2-4-5-6-7-8-10-11-12-13-14-15-16-17

Шлях 4: 1-2-4-5-6-7-8-10-11-12-13-14-15-16-18-19-20-21-22

Шлях 5: 1-2-24-25-26-27

Шлях 6: 1-2-4-5-6-7-8-10-11-12-13-14-15-16-18-19-20-21-23-24 -25-26-27

Тестовий варіант 1

Вхідні дані: немає бінарного файлу “А.bin”.

Очікуваний результат: функція не працює.

Тестовий варіант 2

Вхідні дані: немає бінарного файлу “Т.bin”.

Очікуваний результат: функція не працює.

Тестовий варіант 3

Вхідні дані: немає бінарного файлу “Т.bin”.

Очікуваний результат: функція не працює.

Тестовий варіант 4

Вхідні дані: немає бінарного файлу “Т.bin”.

Очікуваний результат: функція не працює.

Тестовий варіант 5

Вхідні дані: незаповнений бінарний файл “А.bin”.

Очікуваний результат: функція не працює.

Тестовий варіант 6

Вхідні дані: заповнений бінарний файл “А.bin”.

Очікуваний результат: функція виводить продавця (продавців) з найменшою заробітною платою.


2.4. Функція 4

ПІДРАХУНОК КІЛЬКІСТІ ПРОДАВЦІВ,

ЯКІ ПРАЦЮЮТЬ В КОЖНОМУ ВІДДІЛІ

2.4.1. Ідея реалізації

1) В множині продавців фіксуємо продавця.

2) Віднімаємо фіксованого продавця з множини продавців.

3) Додаємо відділ фіксованого продавця у множину одного відділа.

4) Додаємо фіксованого продавця у множину використаних продавців.

5) Якщо в множині одного відділу не знаходяться два різних відділи, то виконуємо пункт 1).

6) Віднімаємо відділ фіксованого продавця з множини одного відділа.

7) Додаємо фіксованого продавця у множину переглянутих продавців.

8) Якщо множина продавців не пуста, то виконуємо пункт 1).

9) Додаємо з множини одного відділа у множину кількості продавців кожного відділу кортеж потужності множини одного відділу і відділ продавця множини одного відділу.

10) В множині переглянутих продавців фіксуємо продавця.

11) Віднімаємо фіксованого продавця з множини переглянутих продавців.

12) Додаємо фіксованого продавця у множину продавців.

13) Якщо множина переглянутих продавців не пуста, то виконуємо пункт 10).

14) Якщо множина продавців не пуста, то виконуємо пункт 1).

15) Прирівняємо множину переглянутих продавців множині продавців.

2.4.2. Структура даних

Ø Файл А, де знаходяться дані про продавців;

Ø Структура даних sell, в якій знаходяться впорядковані дані про продавців;

Ø Рядковий масив sell_dep, в який ми будемо записувати назву відділу, щоб не повторювати ці назви;

Ø Змінна цілих чисел i для реалізації циклів з фіксованою кількістю повторень, які пишуть «-» для таблиць та для реалізації функції sort_dep.

Ø Змінна цілих чисел k_dep, якій ми будемо присвоювати кількість продавців, які працюють у визначеному відділі.


2.4.3. Опис роботи функції по схемам алгоритму

Блок 1. Сортуємо продавців за посадою.

Блок 2. Відкриваємо бінарний файл “A.bin” для читання (r).

Блок 3. Якщо бінарний файл “A.bin” не вдалося відкрити, то виконуємо Блок 4, інакше виконуємо Блок 5.

Блок 4. Повертаємо функції значення 1 (return 1).

Блок 5. Якщо не дійшли до кінця бінарного файлу “A.bin”, то виконуємо Блок 6, інакше виконуємо Блок 18.

Блок 6. Зчитуємо дані з бінарного файлу “A.bin”.

Блок 7. Якщо не дійшли до кінця бінарного файлу “A.bin”, то виконуємо Блок 8, інакше виконуємо Блок 15.

Блок 8. Виводимо на екран “Sellers’ quantity in departments” та «Шапки таблиці».

Блок 9. Присвоюємо змінній цілих чисел k_dep значення 1. Копіюємо рядковий масив sell.dep у рядковий масив sell_dep.

Блок 10. Якщо не дійшли до кінця бінарного файлу “A.bin”, то виконуємо Блок 11, інакше виконуємо Блок 17.

Блок 11. Зчитуємо дані з бінарного файлу “A.bin”.

Блок 12. Якщо не дійшли до кінця бінарного файлу “A.bin”, то виконуємо Блок 13, інакше повертаємося до Блоку 10.

Блок 13. Якщо значення рядкового масиву sell_dep співпадає зі значенням рядкового масиву sell.dep, то виконуємо Блок 14, інакше виконуємо Блок 15.

Блок 14. Присвоюємо змінній цілих чисел k_dep значення k_dep+1. Повертаємося до Блоку 10.

Блок 15. Виводимо на екран рядковий масив sell_dep та змінну цілих чисел k_dep.

Блок 16. Присвоюємо змінній цілих чисел k_dep значення 1. Копіюємо рядковий масив sell.dep у рядковий масив sell_dep. Повертаємося до Блоку 10.

Блок 17. Виводимо на екран рядковий масив sell_dep, змінну цілих чисел k_dep
та «Закриття таблиці».

Блок 18. Закриваємо бінарний файл “А.bin”. Повертаємо функції значення 0 (return 0).


2.4.4. Тестування методом драйверів та заглушок

Функція int function_1 () має драйвер та заглушку типу С, оскільки цій функції не передається ніякий параметр, але вона повертає результат.

Драйвер

            printf ("Тестування функції 4:\n");

            result=function_4 ();

            if (result==1)

                        printf("Функція 4 не виконується \n");

Заглушка:

int function_4 ()

{

printf ("Функція 4 працює\n");

int result;

scanf ("%d", &result)

return result;

}

2.4.5 Тестування методом білого ящика

Цикломатична складність графу дорівнює 10.

Незалежні шляхи:

Шлях 1: 1-2-3

Шлях 2: 1-2-27

Шлях 3: 1-2-4-5-6-7-8-9-10-11-12-13-14-15-16-17-18-19-20-21-22-23-24-25-26-27

Тестовий варіант 1

Вхідні дані: немає бінарного файлу “А.bin”.

Очікуваний результат: функція не працює.

Тестовий варіант 2

Вхідні дані: незаповнений бінарний файл “А.bin”.

Очікуваний результат: функція не працює.

Тестовий варіант 3

Вхідні дані: заповнений бінарний файл “А.bin”.

Очікуваний результат: функція підраховує кількість продавців, які працюють в кожному відділі.


2.5. Функція 5

ВИЗНАЧЕННЯ ПОСАДИ, ЯКУ ЗАЙМАЄ ПРОДАВЕЦЬ,

ЯКИЙ ПРОЖИВАЄ ЗА ВКАЗАНОЮ АДРЕСОЮ

2.5.1. Ідея реалізації

1) В множині продавців фіксуємо продавця.

2) Віднімаємо фіксованого продавця з множини продавців.

3) Додаємо фіксованого продавця у множину переглянутих продавців.

4) Якщо адреса фіксованого продавця не співпадає із заданою адресою, то виконуємо пункт 1).

5) Додаємо посаду фіксованого продавця у множину знайдених посад.

6) Якщо множина продавців не пуста, то виконуємо пункт 1).

7) Прирівняємо множину переглянутих продавців множині продавців.

2.5.2. Структура даних

Ø Файл “A.bin”, де знаходяться дані про продавців;

Ø Структура даних sell, в якій знаходяться впорядковані дані про продавців; Рядковий масив sell_post, в який ми будемо записувати назву посади, яку займає продавець, який живе за вказаною адресою;

Ø Рядковий масив sell_adds_str, в який ми будемо записувати вулицю, щоб знайти її в базі даних продавців;

Ø Рядковий масив sell_adds_hc, в який ми будемо записувати номер будинку, щоб перевірити його на наявність цілого числа;

Ø Змінна цілих чисел sell_adds_h, в яку ми будемо записувати номер будинку, щоб знайти його в базі даних продавців;

Ø Змінна цілих чисел flag, в яку ми будемо записувати значення 0, якщо шапка таблиці ще не виведена або введеної адреси не було знайдено в базі даних продавців, та в яку ми будемо записувати значення 1, якщо шапка таблиці вже виведена або якщо всі посади продавців, які проживають за вказаною адресою виведені та треба закривати таблицю;

Ø Змінна цілих чисел i для реалізації циклів з фіксованою кількістю повторень, які пишуть«-» для таблиць.


2.5.3. Опис роботи функції по схемам алгоритму

Блок 1. Відкриваємо бінарний файл “A.bin” для читання (r).

Блок 2. Якщо бінарного файл “A.bin” не вдалося відкрити, то виконуємо Блок 3, інакше виконуємо Блок 4.

Блок 3. Повертаємо функції значення 1 (return 1).

Блок 4. Присвоюємо змінній цілих чисел flag значення 0.

Блок 5. Виводимо на екран дані бінарного файлу “A.bin”.

Блок 6. Переміщаємо вказівник в бінарному файлі “A.bin” на початок.

Блок 7. Виводимо на екран «Input seller’s address».

Блок 8. Вводимо на клавіатурі рядковий масив sell_adds_h та рядковий масив sell_adds_hc.

Блок 9. Створюємо ліміт на 2 символи для рядкового масиву sell_adds_hc.

Блок 10. Якщо рядковий масив sell_adds_hc містить в собі нечислові символи,
то виконуємо Блок 11, інакше виконуємо Блок 13.

Блок 11. Виводимо на екран «Wrong data was insert».

Блок 12. Закриваємо файл “A.bin”. Повертаємо функції значення 1 (return 1).

Блок 13. Якщо не дійшли до кінця бінарного файлу “A.bin”, то виконуємо Блок 14, інакше виконуємо Блок 21.

Блок 14. Зчитуємо дані з бінарного файлу “A.bin”.

Блок 15. Якщо не дійшли до кінця бінарного файлу “A.bin”, то виконуємо Блок 16, інакше повертаємося до Блоку 13.

Блок 16. Якщо змінна цілих чисел sell.adds.h дорівнює змінній цілих чисел sell_adds_h та порівняння строкового масиву sell.adds.str із строковим масивом sell_adds_str дає 1, то виконуємо Блок 17, інакше повертаємося до Блоку 13.

Блок 17. Якщо змінна цілих чисел flag дорівнює значенню 0, то виконуємо Блок 18, інакше виконуємо Блок 20.

Блок 18. Присвоюємо змінній цілих чисел flag значення 1.

Блок 19. Виводимо на екран «Шапки таблиці», рядкового масиву sell.post, рядкового масиву sell.adds.str та рядкового масиву sell.adds.h. Повертаємося до Блоку 13.

Блок 20. Виводимо на екран рядкові масиви sell.post, sell.adds.str, sell.adds.h.
Повернення до Блоку 13.

Блок 21. Якщо змінна цілих чисел flag дорівнює значенню 0, то виконуємо Блок 22, інакше виконуємо Блок 23.

Блок 22. Виводимо на екран «No address in data».

Блок 23. Виводимо на екран «Закриття таблиці».

Блок 24. Закриваємо бінарний файл “A.bin” .Повертаємо функції значення 0 (return 0).


2.5.4. Тестування методом драйверів та заглушок

Функція int function_5 () має драйвер та заглушку типу С, оскільки цій функції не передається ніякий параметр, але вона повертає результат.

Драйвер

            printf ("Тестування функції 5:\n");

            result=function_5 ();

            if (result==1)

                        printf("Функція 5 не виконується \n");

Заглушка:

int function_5 ()

{

printf ("Функція 5 працює\n");

int result;

scanf ("%d", &result)

return result;

}

2.5.5 Тестування методом білого ящика

Цикломатична складність графу дорівнює 11.

Незалежні шляхи:

Шлях 1: 1-2

Шлях 2: 1-2-4-5

Шлях 3: 1-2-4-5-6

Шлях 4: 1-2-4-5-22-23-28

Шлях 5: 1-2-4-5-7-8-9-10-11-12-13-14-15-16-17-18-19-20-21-24-25-26-27-28

Тестовий варіант 1

Вхідні дані: немає бінарного файлу “А.bin”.

Очікуваний результат: функція не працює.

Тестовий варіант 2

Вхідні дані: незаповнений бінарний файл “А.bin”.

Очікуваний результат: функція не працює.

Тестовий варіант 3

Вхідні дані: у строчці sell_adds_h неправильно введений номер будинку (літерами).

Очікуваний результат: вивід на екран “Wrong data was insert.”.

Тестовий варіант 4

Вхідні дані: введений адрес, якого немає у бінарному файлі “А.bin”.

Очікуваний результат: вивід на екран “No address in data”.

Тестовий варіант 5

Вхідні дані: заповнений бінарний файл “А.bin”, правильно введено строку sell_adds_h, такий введений адрес є у бінарному файлі “А.bin”.

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


3. Опис роботи профілю користувача

Після запуску програми, вона запитує у користувача Логін та Пароль. Можна увійти в одному з двох режимів:

1) в режимі користувача;

2) в режимі адміністратора.

3.1. Користувач

Для того, щоб зайти у програму в режимі користувача, треба ввести будь-які дані у строчку Логіна, <Enter> або <Space>, та будь-які дані у строчку Пароль.

Користувач може зчитувати інформацію та виконувати запити по відповідним п’ятьом функціям без права додавати або видаляти дані з бази даних.

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

3.2. Адміністратор

Для того, щоб зайти у програму в режимі адміністратора, треба ввести «admin» у строчку Логіна, та «admin» у строчку Пароль.

Адміністратор може зчитувати інформацію, виконувати запити по відповідним п’ятьом функціям з правом додавання та видалення даних з бази даних.

Цей профіль розроблений для відновлення інформації у супермаркеті серед продавців.

4. Опис роботи з базою даних

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


5. Керівництво користувача

Для того, щоб користуватися цією програмою, вимагається лише клавіатура. Для запуску програми треба відкрити файл «Course Work Programming1.sln». При запуску програма просить користувача ввести Логін та Пароль.

Якщо користувач хоче зайти в режимі користувача (не може додавати або видаляти дані з бази даних), то він може ввести будь які дані в строках Логін та Пароль.

Якщо користувач хоче зайти, як адміністратор (може додавати або видаляти дані з бази даних), то для цього йому потрібно ввести відповідні правильні Логін та Пароль.

Після входу відображається режим, в який зайшов користувач («Welcome to admin mode!» – режим адміністратора ; «Welcome to user mode!» - режим користувача), та напис «No data», якщо дані ще не були введені або таблиця, в якій можна побачити дані про продавців супермаркету.

Дана програма містить 9 пунктів меню:

5.1. Перший пункт меню

Для вибору цього пункту натисніть <1> на клавіатурі. Функція виводить одного продавця з найбільшим стажем праці з кожного відділу. Щоб виконати будь-яку іншу функцію, треба натиснути на клавіатурі клавішу від <0> до <7> в залежності від номера функції з перечня всіх функцій. Щоб повернутися до головного меню, достатньо натиснути будь-яку клавішу на клавіатурі, окрім клавіш від <0> до <7> та <Esc>. Щоб вийти з програми, достатньо натиснути двічі клавішу <Esc>.

5.2. Другий пункт меню

Для вибору цього пункту натисніть <2> на клавіатурі. Функція виводить адреси продавців, згрупованих по відділам. Щоб виконати будь-яку іншу функцію, треба натиснути на клавіатурі клавішу від <0> до <7>  в залежності від номера функції з перечня всіх функцій. Щоб повернутися до головного меню, достатньо натиснути будь-яку клавішу на клавіатурі, окрім клавіш від <0> до <7> та <Esc>. Щоб вийти з програми, достатньо натиснути двічі клавішу <Esc>.

5.3. Третій пункт меню

Для вибору цього пункту натисніть <3> на клавіатурі. Функція виводить продавця (продавців) з найменшою заробітною платою. Щоб виконати будь-яку іншу функцію, треба натиснути на клавіатурі клавішу від <0> до <7> в залежності від номера функції з перечня всіх функцій. Щоб повернутися до головного меню, достатньо натиснути будь-яку клавішу на клавіатурі, окрім клавіш від <0> до <7> та <Esc>. Щоб вийти з програми, достатньо натиснути двічі клавішу <Esc>.


5.4. Четвертий пункт меню

Для вибору цього пункту натисніть <4> на клавіатурі. Функція рахує кількість продавців, які працюють в кожному відділі. Щоб виконати будь-яку іншу функцію, треба натиснути на клавіатурі клавішу від <0> до <7>  в залежності від номера функції з перечня всіх функцій. Щоб повернутися до головного меню, достатньо натиснути будь-яку клавішу на клавіатурі, окрім клавіш від <0> до <7> та <Esc>. Щоб вийти з програми, достатньо натиснути двічі клавішу <Esc>.

5.5. П’ятий пункт меню

Для вибору цього пункту натисніть <5> на клавіатурі. Функція визначає посаду, яку займає продавець, який живе за вказаною адресою. Для цього треба ввести адресу продавця. Якщо такої адреси немає, то на екрані виведеться «No address (ім’я вулиці) (номер будинку) in data.». Якщо адреса вказана невірно (наприклад замість номера будинку були записані текстові символи), то на екрані виведеться «Wrong data was inserted.». Щоб виконати будь-яку іншу функцію, треба натиснути на клавіатурі клавішу від <0> до <7> в залежності від номера функції з перечня всіх функцій. Щоб повернутися до головного меню, достатньо натиснути будь-яку клавішу на клавіатурі, окрім клавіш від <0> до <7> та <Esc>. Щоб вийти з програми, достатньо натиснути двічі клавішу <Esc>.

5.6. Шостий пункт меню

Для вибору цього пункту натисніть <6> на клавіатурі. Функція доступна лише в режимі адміністратора. Функція додає дані нового продавця до бази даних. Після вибору цього пункту треба послідовно ввести інформацію про нового продавця, натискаючи клавішу <Space> після кожного елементу даних і клавішу <Enter> після введення всіх даних, а саме:

1) Фамілію продавця;

2) Ім’я та По-батькові (дві літери)продавця;

3) Назва вулиці, на якій мешкає продавець;

4) Номер будинку, в якому мешкає продавець (дві цифри);

5) Назва відділу, в якому працює продавець;

6) Назва посади, яку займає продавець;

7) Стаж праці, тобто скільки місяців продавець вже від працював;

8) Заробітна плата, яку отримує продавець за місяць своєї праці.

Якщо при додаванні даних в режимі адміністратора ввести більше 100 символів, то це призведе до переповнення стеку рядкових масивів після чого дана програма вилетить, так як у програмі для кожного елементу структури при введені виділено 100 символів.

Якщо при додаванні даних в режимі адміністратора ввести менше 100 символів, то функція check_data зробить ліміт на таку кількість символів, щоб зберегти вигляд таблиці.


Якщо в пункті 4) 7) або 8) були неправильно введені дані (замість цифрових значень були введені текстові), то на екрані виводиться «Wrong data was inserted.» і дані про продавця не додаються до бази даних.

Щоб виконати будь-яку іншу функцію, треба натиснути на клавіатурі клавішу від <0> до <7> в залежності від номера функції з перечня всіх функцій. Щоб повернутися до головного меню, достатньо натиснути будь-яку клавішу на клавіатурі, окрім клавіш від <0> до <7> та <Esc>. Щоб вийти з програми, достатньо натиснути двічі клавішу <Esc>.

5.7. Сьомий пункт меню

Для вибору цього пункту натисніть <7> на клавіатурі. Функція доступна лише в режимі адміністратора. Функція видаляє дані про продавця з бази даних. Після вибору цього пункту треба послідовно ввести повну інформацію про продавця, якого треба видалити з бази, натискаючи клавішу <Space> після кожного елементу даних і клавішу <Enter> після введення всіх даних, а саме:

1) Фамілію продавця;

2) Ім’я та По-батькові (дві літери)продавця;

3) Назва вулиці, на якій мешкає продавець;

4) Номер будинку, в якому мешкає продавець (дві цифри);

5) Назва відділу, в якому працює продавець;

6) Назва посади, яку займає продавець;

7) Стаж праці, тобто скільки місяців продавець вже від працював;

8) Заробітна плата, яку отримує продавець за місяць своєї праці.

Якщо при видаленні даних в режимі адміністратора ввести більше 100 символів, то це призведе до переповнення стеку рядкових масивів після чого дана програма вилетить, так як у програмі для кожного елементу структури при введені виділено 100 символів.

Якщо при видаленні даних в режимі адміністратора ввести менше 100 символів, то функція check_data зробить ліміт на таку кількість символів, щоб можна було порівняти введені дані та базу даних всіх продавців.

Якщо в пункті 4) 7) або 8) були неправильно введені дані (замість цифрових значень були введені текстові), то на екрані виводиться «Wrong data was inserted.» і дані про продавця не видаляються з бази даних.

Щоб виконати будь-яку іншу функцію, треба натиснути на клавіатурі клавішу від <0> до <7> в залежності від номера функції з перечня всіх функцій. Щоб повернутися до головного меню, достатньо натиснути будь-яку клавішу на клавіатурі, окрім клавіш від <0> до <7> та <Esc>. Щоб вийти з програми, достатньо натиснути двічі клавішу <Esc>.


5.8. Восьмий пункт меню

Для вибору цього пункту натисніть <0> на клавіатурі. Функція виводить автора, який написав цю курсову роботу та дані про завдання щодо курсової. Щоб виконати будь-яку іншу функцію, треба натиснути на клавіатурі клавішу від <0> до <7> в залежності від номера функції з перечня всіх функцій. Щоб повернутися до головного меню, достатньо натиснути будь-яку клавішу на клавіатурі, окрім клавіш від <0> до <7> та <Esc>. Щоб вийти з програми, достатньо натиснути двічі клавішу <Esc>.

5.9. Дев’ятий пункт меню

Для вибору цього пункту натисніть < Esc > на клавіатурі. Функція дає можливість виходу з програми. Для остаточного виходу треба натиснути клавішу <Esc> ще раз.

6. Контрольний приклад

Після введення Логіна та Паролю, ми побачимо на екрані

або привітання, як до користувача,

або привітання, як до адміністратора.

Нижче ми побачимо нашу базу даних, де знаходяться дані про продавців супермаркету.

Ще нижче – пункти меню.

Робота функції 1 –

Робота функції 2 -

Робота функції 3 -

Робота функції 4 -

Робота функції 5 -

Вихід з програми.


Висновок

В процесі виконання курсової роботи був закріплений великий обсяг теоретичний та практичних знань з дисципліни "Основи програмування". Була розроблена достатньо складна структурна та функціональна програма, здатна вирішувати поставлені цілі. Були розроблені схеми алгоритмів, за якими чітко та доступно можна прослідкувати, як реалізована та чи інша функція, як функціонує кожний програмний модуль. Було проведено тестування всіх модулів різними методами. Тестування дало всій результат, адже не 100% тестів дали правильний результат. Отже в програмі ще є дірки, які за умови подальшої праці з даною програмою мають бути ліквідовані.

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


Список літератури

1. Единая система программной документации. – М.: Изд-во стандартов, 1991. – 128 с.

2. Шилдт Г. Программирование на Borland C++ для профессионалов /Пер. с англ. – Мн.: ООО «Попурри», 1999. – 800 с.

3. Дейтел Х., Дейтел П. Как программировать на С: Третье издание. Пер. с англ. – М.: Бином-Пресс, 2002. – 1168 с.

4. Комлева Н.О., Кунгурцев О.Б. Основи програмування і алгоритмічні мови. – Одеса: Наука і техніка, 2005. – 136 с.

5. Кунгурцев О.Б. Об’єктно-оріентована технологія створення програмних продуктів. Уніфікований ітераційний процес. Навч. Посібник для вищих навчальних закладів. – Одеса: ВМВ, 2006. – 182 с.

6. Шилдт Г. Справочник программиста по С/С++ (4-е издание).

7. Методичні вказівки по дипломному проектуванню для студентів фаху 7.080403 -програмне забезпечення автоматизованих систем/Авт.: В.А. Крісілов, Ф.С. Шапо,

О.М. Паулін, Л.С. Жиро. - Одеса:  Наука і техніка, 2010 -  47 с.

8. "Методичні вказівки до курсового проектування з дисципліни “Основи програмування” для студентів спеціальності 6.050103." – Комлева Н.О.


Лістинг програми

файл «global variable.h»

struct adds_type {char str[13]; int h;};

struct fio_type {char F[15], IO[3];};

struct sell_type {fio_type FIO; adds_type adds; char dep[16], post[11]; int exp; float wage;};

sell_type sell;

файл «check.h»

int char_to_int (char str[], int* a) /* функція, яка перевіряє символьний текст на наявність

                                     цілого числа */

{

       int num,i,flag;

       i=0;

       flag=1;

       while (str[i]!='\0')

             if (str[i]>='0' && str[i]<='9')

                    i++;

             else

                    {

                    flag=0;

                    i++;

                    }

       if (flag==0)

             return 1;   

       i=0;

       num=0;

       while (str[i]!='\0')

             {

             num=num*10+str[i]-48;

             i++;

             }

       *a=num;

       return 0;

}

int char_to_float (char str[], float* a) /* функція, яка перевіряє символьний текст на

                                         наявність числа з плаваючою комою*/

{

       int i, n_point, flag;

       float num;

       i=0;

       flag=1;

       n_point=0;

       *a=0;

       num=1;

       while (str[i]!='\0')

             if (str[i]>='0' && str[i]<='9')

                    i++;

             else

                    if (str[i]=='.')

                           {

                           i++;

                           n_point++;

                           }

                    else

                           {

                           flag=0;

                           i++;

                           }


       if ((flag==0) || (n_point>1))

             return 1;   

       i=0;  

       while ((str[i]!='\0') && (str[i]!='.'))

             {

             *a=*a*10+str[i]-48;

             i++;

             }

       while (str[i]!='\0')

             {

             if (str[i]!='.')

                    {

                    num/=10;

                    *a+=(str[i]-48)*num;

                    }

             i++;

             }

       return 0;

}

int check_data() /* функція перевірки введених данних */

{

       char f[100], io[100], str [100], h[100], dep[100], post[100], exp[100], wage[100];

       int i_h, i_exp;

       float f_wage;

            

       scanf ("%s", f);

       scanf ("%s", io);

       scanf ("%s", str);

       scanf ("%s", h);

       scanf ("%s", dep);

       scanf ("%s", post);

       scanf ("%s", exp);

       scanf ("%s", wage);       

       printf ("\n");

       f[14]='\0';

       io[2]='\0';

       str[12]='\0';

       h[2]='\0';

       dep[15]='\0';

       post[10]='\0';

       exp[5]='\0';

       wage[10]='\0';

       if (char_to_int (h, &i_h))

             return 1;

       if (char_to_int (exp, &i_exp))

             return 1;

       if (char_to_float (wage, &f_wage)||(f_wage>=10000000))

             return 1;

       strcpy (sell.FIO.F, f);

       strcpy (sell.FIO.IO, io);

       strcpy (sell.adds.str, str);

       sell.adds.h=i_h;

       strcpy (sell.dep, dep);

       strcpy (sell.post, post);

       sell.exp=i_exp;

       sell.wage=f_wage;

       return 0;

}


файл «data.h»

void read_string (FILE *A) /* функція зчитування даних з бінарного файла */

{

       fread (&sell.FIO.F, sizeof(char), 13 ,A);

       fread (&sell.FIO.IO, sizeof(char), 2, A);

       fread (&sell.adds.str, sizeof(char), 12, A);

       fread (&sell.adds.h, sizeof(int), 1, A);

       fread (&sell.dep, sizeof(char), 15, A);

       fread (&sell.post, sizeof(char), 10, A);

       fread (&sell.exp, sizeof(int), 1, A);

       fread (&sell.wage, sizeof(float), 1, A);

}

void write_string (FILE *A) /* функція введення даних у бінарний файл */

{

       fwrite (&sell.FIO.F, sizeof(char), 13 ,A);

       fwrite (&sell.FIO.IO, sizeof(char), 2, A);

       fwrite (&sell.adds.str, sizeof(char), 12, A);

       fwrite (&sell.adds.h, sizeof(int), 1, A);

       fwrite (&sell.dep, sizeof(char), 15, A);

       fwrite (&sell.post, sizeof(char), 10, A);

       fwrite (&sell.exp, sizeof(int), 1, A);

       fwrite (&sell.wage, sizeof(float), 1, A);

}

void print_data (FILE *A) /* функція виведення даних на екран */

{     

       int i;

       for (i=0;i<79;i++)

             printf("-");

       printf ("\n|   Familia IO  |   Address   |  Department  |  Post  | Exp |   Wage   |\n");

for (i=0;i<79;i++)

             printf("-");

       printf("\n");

       while(!feof(A))

             {           

             read_string (A);          

             if(!feof(A))

                    printf("|%14s %2s|%12s %2d|%15s|%10s|%5d|%10.2f|\n",

                           sell.FIO.F, sell.FIO.IO, sell.adds.str, sell.adds.h, sell.dep,

sell.post, sell.exp, sell.wage);

             }

       for (i=0;i<79;i++)

             printf("-");

       printf("\n");

}


int function_6 () /* функція введення даних продавця у базу данних */

{

       FILE *A;

            

       A=fopen ("A.bin"," a+");

       if (A==NULL)

             return 1;

       print_data(A);

       rewind(A);  

       printf ("Add new seller to base\n");

       if (check_data())

             {

             printf ("Wrong data was insert.\n");

             fclose(A);

             return 1;

             }

             write_string (A);

       fclose(A);

       return 0;

}

int function_7 () /* функція виведення даних продавця з бази даних */

{

       FILE *A,*T;

       sell_type sell_del;

            

       A=fopen("A.bin"," r+");

       if (A==NULL)

             return 1;          

       print_data(A);

       rewind(A);

       printf ("Delete seller from base\n");

       if (check_data())

             {

printf ("Wrong data was insert.\n");

             fclose(A);

             return 1;

             }

       sell_del=sell;

       while (!feof (A))

             {

             read_string (A);

             if (!feof (A))

                    if     (strcmp (sell.FIO.F, sell_del.FIO.F) ||

strcmp (sell.FIO.IO, sell_del.FIO.IO) ||

                           strcmp (sell.adds.str, sell_del.adds.str) ||

(sell.adds.h!=sell_del.adds.h) ||

                           strcmp (sell.dep, sell_del.dep) ||

strcmp (sell.post, sell_del.post) ||

                           (sell.exp!=sell_del.exp) || (sell.wage!=sell_del.wage))

                           {

                           T=fopen ("T.bin"," a+");

                           if (T==NULL)

return 1;

                           write_string (T);

                          fclose (T);

                           }

             }

       fclose (A);

       remove ("A.bin");

       rename ("T.bin", "A.bin");

       return 0;

}


файл «departmaent sorting.h»

int sort_dep ()   /* сортування продавців за посадами */

{     

       FILE *A,*B,*C,*T;

       char sort_dep[16];

      

       A=fopen ("A.bin","r+");

       if (A==NULL)

             return 1;   

       B=fopen ("B.bin","w+");

       if (B==NULL)

             return 1;

       while (!feof(A))

             {

             read_string (A);

             if(!feof(A))

                    write_string (B);

             }

       fclose (A);

       fclose (B);

       B=fopen ("B.bin","r+");

       if (B==NULL)

             return 1;

       T=fopen ("T.bin","w+");

       if (T==NULL)

             return 1;

       while (!feof(B))

             {           

             read_string (B);

             if (!feof (B))

                    {

                    C=fopen ("C.bin","w+");

                    if (C==NULL)

                           return 1;

                    strcpy(sort_dep, sell.dep);      

                    write_string (T);

                    while (!feof (B))

                           {

                           read_string (B);

                           if (!feof (B))

                                  {

                                  if (!strcmp(sell.dep, sort_dep))

                                        write_string (T);

                                  else write_string (C);

                                  }

                           }

             fclose (C);

             fclose (B);

             remove ("B.bin");

             rename ("C.bin", "B.bin");

             B=fopen ("B.bin","r+");

             if (B==NULL)

                    return 1;

                    }

             }

       fclose (T);

       fclose (B); 

       remove ("A.bin");

       remove ("B.bin");

       rename ("T.bin", "A.bin");

       return 0;

}


файл «functions.h»

int function_1 () /* функція виведення по одному продавцю з найбільшим стажем праці з кожного

                   відділу */

{

       FILE *A;

       sell_type sell_max;

       int i;

       i=sort_dep ();

       A=fopen ("A.bin","r");

       if (A==NULL)

return 1;

       printf ("Seller with max experience from every department:\n");

       for (i=0;i<79;i++)

             printf("-");

       printf ("\n|   Familia IO  |   Address   |  Department |  Post   | Exp |   Wage   |\n");

for (i=0;i<79;i++)

             printf("-");

       printf("\n");

       if (!feof(A))

             {           

             read_string (A);   

             if (!feof(A))

                    {

                    sell_max=sell;

                     while (!feof(A))

                           {                         

                           read_string (A);

                           if (!feof(A))

if(!strcmp (sell_max.dep,sell.dep))

                                         {

if (sell_max.exp<sell.exp)

sell_max=sell;

}

                                  else

                                         {

                                         printf ("|%14s %2s|%12s %2d|%15s|%10s|%5d|%10.2f|\n",

sell_max.FIO.F, sell_max.FIO.IO, sell_max.adds.str,

sell_max.adds.h, sell_max.dep, sell_max.post, sell_max.exp, sell_max.wage);

                                         sell_max=sell;

                                         }

                           }

                    }

             }

       printf ("|%14s %2s|%12s %2d|%15s|%10s|%5d|%10.2f|\n",sell_max.FIO.F, sell_max.FIO.IO,

             sell_max.adds.str, sell_max.adds.h, sell_max.dep, sell_max.post, sell_max.exp,

sell_max.wage);

       for (i=0;i<79;i++)

             printf("-");

       printf ("\n");

       fclose (A);

       return 0;

}


int function_2 () /* функція виведення адрес продавців, згрупованих по відділам */

{

       int i;

       FILE *A;

      

       i=sort_dep ();

       A=fopen ("A.bin","r");

       if (A==NULL)

             return 1;

       printf ("Sellers' addresses by departments:\n");

       if (!feof (A))

             {           

             read_string (A);

             if (!feof (A))

                    {

                    for (i=0;i<33;i++)

                           printf ("-");

                    printf ("\n|    Address    |   Department  |\n");

                    for (i=0;i<33;i++)

                           printf ("-");

                    printf ("\n");

                    printf ("|%12s %2d|%15s|\n", sell.adds.str, sell.adds.h, sell.dep);

                    while (!feof (A))

                           {                         

                           read_string (A);

                           if (!feof (A))

                                  printf ("|%12s %2d|%15s|\n", sell.adds.str, sell.adds.h,

sell.dep);

                           }

                    for (i=0;i<33;i++)

                           printf ("-");

                    printf ("\n");

                    fclose (A);

                    }

             }

       return 0;

}


int function_3 () /* функція виведення продавця (продавців) з найменьшою заробітньою платою */

{

       FILE *A,*T;

       float wage_min;

      

       A=fopen ("A.bin","r");

       if (A==NULL)

             return 1;

       if (!feof (A))

             {           

             read_string (A);

             if (!feof(A))

                    {

                    wage_min=sell.wage;

                    T=fopen ("T.bin"," w+");

                    if (T==NULL)

                           return 1;

                    write_string (T);

                    fclose (T);

                    }

             }

       while (!feof (A))

             {           

             read_string (A);

              if (!feof(A))

                    {

                    if (sell.wage==wage_min)

                           {

                           T=fopen ("T.bin","a+");

                           if (T==NULL)

return 1;

                           write_string (T);

                           fclose(T);

                           }

                           if (sell.wage<wage_min)

                                  {

                                  wage_min=sell.wage;

                                  T=fopen ("T.bin"," w+");

                                  if (T==NULL)

                                        return 1;

                                  write_string (T);

                                  fclose (T);

                                  }

                    }

             }

       fclose (A);

       T=fopen("T.bin"," r+");

       if (T==NULL)

             return 1;

       printf ("Seller with minimal sallary:\n");    

       print_data (T);    

       fclose (T);

       remove ("T.bin");

       return 0;

}


int function_4 () /* функція підрахунку кількості продавців, які працюють в кожному відділі */

{

       FILE *A;

       char sell_dep[16];

       int i,k_dep;

       i=sort_dep();

       A=fopen("A.bin","r");

       if (A==NULL)

return 1;

       if (!feof(A))

              {

             read_string (A);

             if (!feof (A))

                    {

                    printf ("Sellers' quantaty in departments:\n");

                    for (i=0;i<22;i++)

                           printf("-");

                    printf ("\n|   Department  |Q-ty|\n");

                    for (i=0;i<22;i++)

                           printf("-");

                    printf("\n");

                    k_dep=1;

                    strcpy (sell_dep, sell.dep);

                    while (!feof (A))

                           {                         

                           read_string (A);

                           if(!feof(A))

                                  if(!strcmp(sell_dep,sell.dep))

                                        k_dep++;

                                  else

                                        {

                                        printf ("|%15s|%4d|\n", sell_dep, k_dep);

                                        k_dep=1;

                                        strcpy(sell_dep,sell.dep);

                                        }

                           }

                    }

              printf ("|%15s|%4d|\n", sell_dep, k_dep);

              for (i=0;i<22;i++)

                     printf ("-");

              printf ("\n");

              }

       fclose (A);

       return 0;

}


int function_5 () /* функція визначення посади, яку займає продавець, який живе за вказаною

                   адресою */

{

       FILE *A;

       char sell_post[10], sell_adds_str[100], sell_adds_hc[100];

       int i, flag=0, sell_adds_h;

      

       A=fopen ("A.bin","r");

       if (A==NULL)

             return 1;   

       print_data (A);

       rewind (A);

       printf ("Input seller's address: ");

       scanf ("%12s%2s",sell_adds_str,sell_adds_hc);

       sell_adds_hc[2]='\0';

       if (char_to_int(sell_adds_hc,&sell_adds_h))

             {

             printf ("Wrong data was insert.\n");

             fclose(A);

             return 1;

             }

       while(!feof(A))

             {     

             read_string (A);

             if(!feof(A))

                    if (!(strcmp (sell_adds_str, sell.adds.str)) && (sell_adds_h==sell.adds.h))

                           if (flag==0)

                                  {

                                  flag=1;

                                  for (i=0;i<28;i++)

                                        printf ("-");

                                  printf ("\n|   Post   |    Address    |\n");

                                  for (i=0;i<28;i++)

                                        printf("-");

                                  printf("\n");

                                  printf ("|%10s|%12s %2d|\n", sell.post, sell.adds.str,

sell.adds.h);

                                  }

                           else printf ("|%10s|%12s %2d|\n",sell.post,sell.adds.str,sell.adds.h);

             }

       if (flag==0)

             printf ("No address %12s %2d in data.\n", sell_adds_str, sell_adds_h);

       else

             {

             for (i=0;i<28;i++)

             printf("-");

             printf("\n");

             }

       fclose (A);

       return 0;

}


int function_0 () /*функція виведення автора курсової роботи та завдання програми */

{

       int i;

       for (i=0;i<79;i++)

             printf("-");

       printf("\n");

       printf ("\t \t \t \t Welcome!\n");

       printf ("\t \t You are using the course work programm\n");

       printf ("\t \t Made by the student of group AC-131\n");

       printf ("\t \t Romanjuk Konstantin Georgievich\n");

       printf ("\t \t \t \t Variant 13\n");

       for (i=0;i<79;i++)

             printf("-");

       printf("\n\n");

       printf ("Predmetnaya oblast - supermarket. Objekt - prodavez.\n\n");

       printf ("Dannie ob objekte - FIO, Address, Otdel, Dolzhnost, Stag raboti, Zarplata.\n\n");

       printf ("In this course work programm I realized 7 functions.\n\n");

       printf ("Function 0: Show the author and the course work task.\n");

       printf ("Function 1: Show one seller with maximal experience from every department.\n");

       printf ("Function 2: Show sellers' adresses, grouped in departments.\n");

       printf ("Function 3: Find seller with minimal salary.\n");

       printf ("Function 4: Sellers' quantaty in departments.\n");

       printf ("Function 5: Find seller's post by his address.\n");

       printf ("Function 6: Insert seller.\n");

       printf ("Function 7: Delete seller.\n\n");

       return 0;

}


#include <stdio.h>

#include <conio.h>

#include <string.h>

#include <windows.h>

#include "global variable.h"

#include "check.h"

#include "data.h"

#include "department sorting.h"

#include "functions.h"

int main() /*функція, яка авторизує користувача або адміністратора, постійно виводить таблицю данних та перечень можливих функцій, містить посилання на функції, а також дає можливість виходу з программи*/

{

       char user[15], pass[15], ch;

       int n_admin;

       int i;

       FILE *A;

      

       printf ("User: "); scanf ("%s",user);

       printf ("Pass: "); scanf ("%s",pass);

       if (!(strcmp(user,"admin") || strcmp(pass,"admin")))

             {

             printf("Welcome to admin mode!\n");

             n_admin=1;

             }

       else

             {

             printf("Welcome to user mode!\n");

             n_admin=0;

             }

       do

             {

             A=fopen("A.bin","r+");

             if (A!=NULL)

                    {

                    print_data(A);

                    fclose(A);

                    }

             else printf ("No data");

             printf ("\n 1. Show one seller with maximal experience from every department.\n");

             printf ("2. Show sellers' adresses, grouped in departments.\n");

             printf ("3. Find seller with minimal salary.\n");

             printf ("4. Sellers' quantaty in departments.\n");

             printf ("5. Find seller's post by his address.\n");

             printf ("6. Insert seller (only admin mode).\n");

             printf ("7. Delete seller (only admin mode).\n");

             printf ("8. Show the author and the course work task.\n");

             printf ("Exit - ESC\n");

             ch = getch();

             system ("cls");

             switch (ch)

                    {

                    case 49: i=function_1(); break;  case 50: i=function_2(); break;

case 51: i=function_3(); break;  case 52: i=function_4(); break;

case 53: i=function_5(); break;

                    case 54:

                           if(n_admin==1)

                                  i=function_6();

                           else printf ("This function works only in admin mode.\n");

                           break;

                    case 55:

                           if (n_admin==1)

                                  i=function_7();

                           else printf ("This function works only in admin mode.\n");

                           break;

                    case 27: printf ("Thank you for good work. Good bye.\n"); break;

                    default: break;

                    case 56: i=function_8(); break;

}

             }

       while (ch!=27);

       getch();

       return 0;

}


Информация о реферате «Розробка інформаційної системи мовою програмування С»
Раздел: Информатика, программирование
Количество знаков с пробелами: 67862
Количество таблиц: 1
Количество изображений: 1

Похожие материалы

Скачать
40651
4
0

... ) iз земельної дiлянки, а також експертна грошова оцiнка земельної дiлянки. 1.4 Постановка задачі У даній роботі розробляється інформаційна система збору даних землевпорядкування для автоматизації процесу оцінки земельних ділянок. Розроблена система буде підґрунтям у роботі в системі ріелторських підприємств та фірм, а також державних підприємств. Головне завдання полягає в наступних ...

Скачать
143644
51
28

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

Скачать
19171
1
4

... . У такий спосіб заглиблюються й послідовно конкретизуються деталі проекту й у результаті вибирається обґрунтований варіант, що доводиться до реалізації. Рис.3. Спіральна модель ЖЦ життєвий цикл інформаційна система Розробка ітераціями відбиває об'єктивно існуючий спіральний цикл створення системи. Неповне завершення робіт на кожному етапі дозволяє переходити на наступний етап, не чекаючи ...

Скачать
259712
25
12

... та знизу ( нижній колонтитул ) у межах одного розділу або всього документа. Правильний вибір цієї інформації дає змогу читачеві краще орієнтуватися в документі. 5.4 Уведення інформації   Інформаційна система маркетингу – це сукупність інформації, апаратно-програмних і технологічних засобів, засобів телекомунікацій, баз і банків даних, методів і процедур, персоналу управління, які реалізують ...

0 комментариев


Наверх