Автомат для продажу наливних продуктів

Технічні вимоги створення автомату з продажу наливних продуктів: прийом замовлення, перевірка наявності, прийом оплати, можливість емуляції автоматів різної апаратної конфігурації. Реалізація інтерфейсу програми у середовищі Microsoft Visual Studio.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык украинский
Дата добавления 06.05.2012
Размер файла 1003,7 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ УКРАЇНИ

"КИЇВСЬКИЙ ПОЛІТЕХНІЧНИЙ ІНСТИТУТ"

Кафедра автоматики та управління в технічних системах

Курсова робота

З дисципліни "Об'єктно-орієнтоване програмування"

Автомат для продажу наливних продуктів

Київ - 2012

АНОТАЦІЯ

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

Інтерфейс програми реалізовано мовою програмування високого рівня C# у середовищі Microsoft Visual Studio. Пояснювальна записка розміщена на 22 сторінках і містить два додатки.

ЗМІСТ

  • АНОТАЦІЯ
    • ВСТУП
      • 1. ПОСТАНОВКА ЗАДАЧІ
      • 2. МАТЕМАТИЧНА МОДЕЛЬ ТА СТРУКТУРА ПРОГРАМИ
      • 3. ПЕРЕЛІК ТА ПРИЗНАЧЕННЯ РЕЖИМІВ ТА СТРУКТУРА ДІАЛОГУ
      • 4. СТРУКТУРА ДАНИХ ТА РЕСУРСІВ ПРОГРАМИ
      • 5. ОПИС ПРОГРАМИ
      • 6. ІНСТРУКЦІЯ ПРОГРАМІСТА
      • 7. КЕРІВНИЦТВО КОРИСТУВАЧА
      • ВИСНОВКИ
      • СПИСОК ВИКОРИСТАНИХ ДЖЕРЕЛ
      • ДОДАТКИ

ВСТУП

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

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

Для розробки емулятора використовувалась мова програмування С# v4.0, платформа .NET Framework. Середовище програмування - Microsoft Visual Studio 2010.

C# (вимовляється Сі-шарп) -- об'єктно-орієнтована мова програмування для платформи .NET. Розроблена під егідою Microsoft Research (при фірмі Microsoft).

Синтаксис C# близький до С++ і Java. Мова має строгу статичну типізацію, підтримує поліморфізм, перевантаження операторів, вказівники на функції-члени класів, атрибути, події, властивості, винятки, коментарі у форматі XML. Перейнявши багато що від своїх попередників -- мов С++, Delphi, Модула і Smalltalk -- С#, спираючись на практику їхнього використання, виключає деякі моделі, що зарекомендували себе як проблематичні при розробці програмних систем: так, C# не підтримує множинне спадкування класів (на відміну від C++).

Microsoft .NET (читається дот-нет) -- програмна технологія, запропонована фірмою Microsoft як платформа для створення як звичайних програм, так і веб-програм. Багато в чому є продовженням ідей та принципів, покладених в технологію Java. Хоча .NET є патентованої технологією корпорації Microsoft і офіційно розрахована на роботу під операційними системами сімейства Microsoft Windows, але існують незалежні проекти (перш за все це Mono і Portable.NET), що дозволяють запускати програми. NET на багатьох інших операційних системах.

Microsoft Visual Studio -- серія продуктів фірми Майкрософт, які включають інтегроване середовище розробки програмного забезпечення та ряд інших інструментальних засобів. Visual Studio 2010 включає .NET Framework 4.0. повністю перероблений інтерфейс з використанням WPF(Windows Presentation Foundation), упроваджено наступне покоління інструментів ASP.NET, є підтримка динамічних розширень в мовах програмування C# і Visual Basic, використовуються нові шаблони проектів, інструментарій для документування тестових сценаріїв і велика кількість нових бібліотек, що підтримують Windows 7.

1. ПОСТАНОВКА ЗАДАЧІ

Автомат із продажу наливних продуктів

Технічні вимоги:

- прийом замовлення

- перевірка наявності та прийом оплати

- дозування, упаковка та відпуск продукту

- режим завантаження

- режим настройки

- інтуїтивно зрозумілий інтерфейс

- можливість емуляції автоматів різної апаратної конфігурації

автомат інтерфейс програма microsoft

2. МАТЕМАТИЧНА МОДЕЛЬ ТА СТРУКТУРА ПРОГРАМИ

Зараз існує широкий вибір автоматів для вендингу різноманітної конфігурації. Як зразок було взято реально існуючий автомат для продажу напоїв, який пропонується криворізькою компанією "Vending" .[3]

Технічний опис вендинг автомата

Автомат складається з чотирьох основних функціональних вузлів:

- Антивандальний, пило- та вологозахищений металевий корпус.

- Проточний охолоджувач напою.

- Платіжна система.

- Ємності кег та балон СО2.

Існують корпуси двох типів для розміщення як двох кегів, так і чотирьох кегів ємністю по 50 літрів. Корпус автомата може бути пофарбований у будь-який колір по каталогу RAL(німецький колірний стандарт, розроблений в 1927 році Державним комітетом з умовами поставок).

В автоматі використовується охолоджувач продуктивністю не менше 75л / год.

В автомат може бути встановлено два типи пристроїв видачі стаканів - склянки ємністю 0.2 літра і стакани ємність 0.5 літрів. Перший тип пристрою використовується, якщо автомат буде експлуатуватися для продажу газованої та солодкої води, другий тип більше підійде для продажу квасу і пива. Ємність барабана для склянок 0.2 - 700 склянок, 0.5 - 410 стаканів.

Автомат комплектується купюроприймачем, що приймає купюри номіналом 1,2,5,10 гривень, монетоприймачем, який приймає монети номіналом 5,10,25,50 копійок і 1 гривня, та пристроєм видачі монет здачі.

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

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

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

3. ПЕРЕЛІК ТА ПРИЗНАЧЕННЯ РЕЖИМІВ ТА СТРУКТУРА ДІАЛОГУ

Програма може працювати у трьох режимах:

- Режим користувача.

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

- Режим завантаження та створення меню.

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

- Режим настройки емулятора.

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

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

Рисунок 3.1 - Схема переходу між формами

Діалоги користувача реалізовані стандартними засобами бібліотек .NET Framework : за допомогою стандартних елементів управління Windows Forms(наприклад, складні діалоги режиму завантаження та режиму налаштування) та спливаючих діалогових вікон, коли слід вибрати один з кількох варіантів продовження. Повідомлення програми про виняткові ситуації також виводяться через діалогові вікна. Меню користувача складається з трьох пунктів вибору режиму, і тому відображається на формі входу з можливістю миттєвого вибору кнопки типу Radiobutton(елемент графічного інтерфейсу користувача, що дозволяє користувачеві вибрати тільки один з елементів набору. Також застосовують термін перемикач, проте він же часто застосовується і для прапорців), що відповідає за потрібний режим, та підтвердження вибору натисненням кнопки "OK". У даному випадку це має значні переваги перед меню, створеним звичайними кнопками або системи меню MenuStrip(стандартне меню програм для ОС з графічним інтерфейсом користувача): по-перше, користувачу не потрібно виконувати додаткових дій для того, щоб побачити меню; по-друге, мінімізується можливість неправильного вибору. Результат роботи програми відбувається виведенням спливаючих повідомлень та малювання на формі(у режимі користувача) та внесенням/вилученням елементів списку з елементів управління типу ListBox(елемент графічного інтерфейсу користувача, що дозволяє користувачу вибирати один або декілька пунктів із статичного багаторядкового списку. Користувач вибирає пункт натиснувши на ньому). Інтерфейс програми є інтуїтивно зрозумілим. Для зручності користувачів та уникнення виняткових ситуацій на кожному з елементів управління реалізовано спливання підказки. Схема роботи програми та структура діалогу проста і вимагає від користувача лише мінімальних навиків роботи з операційною системою Windows.

Рисунок 2.3 - Схема роботи програми та структура діалогу

Як бачимо, алгоритм роботи програми полягає у доданні елементів у списки та знаходження їх у списках з наступною зміною даних. Алгоритм додавання до списку реалізовано стандартним методом .NET Framework List.Add(element). Алгоритм покупки продукту:

Знаходимо продукт у списку. Якщо внесених коштів достатньо, то

1. Знаходимо у списках ємностей та тари відповідні параметри продукту.

2. Зменшуємо показник кількості тари на 1, а показник кількості напою у кегу - на ємність тари.

3. Якщо це остання порція продукту - видаляємо його з меню.

4. Видача продукту.

Інакше повертаємо порожнє значення(null).

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

4. СТРУКТУРА ДАНИХ ТА РЕСУРСІВ ПРОГРАМИ

Класи

В даній програмі створені та використані такі класи:

Клас Drink(напій) з такими полями даних:

- ім'я напою string Name;

- колір напою Color DrinkColour.

Клас Tank(кеги для напоїв) з такими полями даних:

- напій у ємності Drink DrinkInside;

- максимальна ємність int Capasity;

- наповненість ємності на даний момент double DrinkAmountNow;

- колір ємності Color TankColour;

- статичне поле private static List<Tank> AllTanks, що містить список усіх ємностей, що використовуються;

та методами:

- public static List<Tank> GetList() - повертає список AllTanks;

- public static void SetList(List<Tank> sourse) - задає список AllTanks.

Клас Packing (слот для тари) з такими полями даних:

- ємність тари double Capasity;

- колір тари Color PackColor;

- посилання на файл з логотипом компанії string LogoName;

- максимальна кількість одиниць тари у слоті int MaxCount;

- кількість тари у слоті на даний момент int Count;

- статичне поле private static List<Packing> AllPackings. Виконує ту ж функцію, що й відповідне поле класу Tank;

та методами:

- public void LoadPacks(int count), що виконує функцію завантаження тари в слот;

- GetList та SetList, виконують ті ж функції, що й відповідні методи класу Tank.

Клас Product(кінцевий продукт, що відпускається користувачеві) з такими полями даних:

- кег, з якого беремо напій Tank DrinkSourse;

- тара, у яку наливаємо його Packing DrinkPack ;

- ціна, за яку ми продаватимемо дану комбінацію decimal Price;

- статичне поле private static List<Product> AllProducts, що містить інформацію про усі доступні користувачеві продукти меню;

та методи:

- public Product OrderDrink(decimal money), що приймає єдиний параметр - введену суму коштів, і повертає замовлений продукт, або null, якщо користувач не вніс достатньо коштів для оплати. У даному методі також виконується перевірка, чи можемо ми і надалі відпускати цей продукт. Якщо ні, він видаляється зі списку.

- GetList та SetList, виконують ті ж функції, що й відповідні методи класів Tank та Packing.

Файли

Для роботи програми необхідні такі файли:

- "tanks.xml"

Текстовий файл.

Зберігає інформацію про список ємностей для напоїв(список Tank.AllTanks).

Характер використання: зчитування та запис.

Структура інформації: XML-розмітка.

- "packs.xml"

Текстовий файл.

Зберігає інформацію про список тари для продуктів(список Packing.AllPackings).

Характер використання: зчитування та запис.

Структура інформації: XML-розмітка.

- "products.xml"

- Текстовий файл.

Зберігає інформацію про список доступних продуктів(список Product.AllProducts).

Характер використання: зчитування та запис.

Структура інформації: XML-розмітка.

- "Logo.gif"

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

5. ОПИС ПРОГРАМИ

Програма "Автомат для продажу наливних продуктів" написана на мові програмування C# 4.0. Були створені класи Drink, Tank, Packing, Product, які описують структурні частини автомата та продукти для продажу. Дані класи також мають усі умови для реалізації програм з потужним графічним інтерфейсом. Діалоги користувача відбуваються стандартними елементами управління .NET Framework, а саме: ListBox та Button, які уже були описані, та TextBox і numericUpDown.

TextBox - поле для вводу та виводу тексту.

NumericUpDown - регулятор Windows для введення числових значень.[2]

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

6. ІНСТРУКЦІЯ ПРОГРАМІСТА

Умови проектування програми

Для проектування необхідно мати:

- Компілятор середовища програмування Microsoft Visual Studio 10

- Набір бібліотек Microsoft .NET Framework 4.0

- Операційна система Windows 7.

- Стандартні засоби вводу-виводу.

Сумісність програми з операційними системами

Програма має виконуватись на всіх ОС сімейства Windows, де встановлено Microsoft .NET Framework 4.0[2].

Повідомлення

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

У середовищі VisualStudio 2010 компілятор допомагає програмісту впоратись з налагодженням програми, видаючи йому повідомлення, і встановлюючи покажчик миші в місце можливої помилки. Також можна скористатись вбудованими засобами налагодження для перегляду операцій, що знаходяться всередині функцій. Зокрема, корисним є застосування точок зупинки [2].

7. КЕРІВНИЦТВО КОРИСТУВАЧА

Системні вимоги

Для застосування програми необхідно мати:

- встановлені бібліотеки .NET Framework 4.0;

- стандартні засоби вводу-виводу.

Інсталяція та деінсталяція програми

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

Послідовність дій користування програмою

Запустіть файл Kursova.exe. Відкриється вікно вибору режиму(Рисунок 7.1).

Рисунок 7.1 - Стартове вікно програми

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

У режимі користувача(Рисунок 7.3)здійснюйте замовлення доступних напоїв з меню. У режимі завантаження(Рисунок 7.4) завантажте тару у доступні слоти та залийте напій, та відредагуйте меню.

Рисунок 7.2 - режим користувача

Рисунок 7.3 - Режим налаштування та завантаження

Рисунок 7.4 - Режим настройки емулятора

ВИСНОВКИ

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

Було освоєно роботу з класами StreamReader, StreamWriter та XmlSerializer, роботу з файлами у мові програмування C#, та створення і зв'язування класів

Класи StreamReader та StreamWriter призначені зля зчитування та запису потоків даних(в тому числі файлів). XmlSerializer - клас для серіалізації об'єктів інших класів у XML(eXtensible Markup Language) файли.

СПИСОК ВИКОРИСТАНИХ ДЖЕРЕЛ

1. Жеребко В.А. Методичні вказівки до виконання та оформлення курсових робіт по курсу "Об'єктно-орієнтоване програмування". [Текст] : Кафедра автоматики та управління в технічних системах НТУУ "КПІ". 2008. - 59с.

2. Шилдт, Герберт. C# 4.0: полное руководство. : Пер. с англ. -- М. : ООО "И.Д.Вильямс", 2011. - 1056 с. : ил.

3. Опис автомата[електронний ресурс] - http://provend.com.ua .

ДОДАТОК А - Тексти програм

Лістинг А.1. - Клас "Напій"(файл Drink.cs)

1

:

using System;

2

:

using System.Collections.Generic;

3

:

using System.Linq;

4

:

using System.Runtime.Serialization;

5

:

using System.Text;

6

:

using System.Drawing;

7

:

8

:

namespace Kursova

9

:

{

10

:

// Клас, що описує напій

11

:

//

12

:

public class Drink

13

:

{

14

:

public string Name

15

:

{

16

:

get { return _name; }

17

:

set

18

:

{

19

:

_name = value;

20

:

if (value.Length < 3)

21

:

_name = "Напій";

22

:

}

23

:

}

24

:

public Color DrinkColour;

25

:

26

:

private string _name;

27

:

28

:

public Drink()

29

:

{}

30

:

31

:

public Drink(string name, Color drinkColour)

32

:

{

33

:

Name = name;

34

:

DrinkColour = drinkColour;

35

:

}

36

:

37

:

public override string ToString()

38

:

{

39

:

return Name + ".";

40

:

}

41

:

}

42

:

}

Лістинг А.2. - Клас "Бак"(файл Tank.cs)

1

:

using System;

2

:

using System.Collections.Generic;

3

:

using System.Drawing;

4

:

5

:

namespace Kursova

6

:

{

7

:

// Клас, що описує баки для напоїв

8

:

//

9

:

public class Tank

10

:

{

11

:

public Drink DrinkInside;

12

:

public int Capasity

13

:

{

14

:

get { return _capasity; }

15

:

set

16

:

{

17

:

if (value < 1)

18

:

_capasity = 1;

19

:

else _capasity = value;

20

:

}

21

:

}

22

:

public Color TankColour;

23

:

public double DrinkAmountNow;

24

:

25

:

private int _capasity;

26

:

27

:

private static List<Tank> AllTanks;

28

:

public Tank()

29

:

{}

30

:

31

:

public Tank(Drink drink, int capasity, Color tankColour, double drinkAmountNow)

32

:

{

33

:

DrinkInside = drink;

34

:

Capasity = capasity;

35

:

TankColour = tankColour;

36

:

DrinkAmountNow = drinkAmountNow;

37

:

AllTanks.Add(this);

38

:

}

39

:

40

:

static Tank()

41

:

{

42

:

AllTanks = new List<Tank>();

43

:

}

44

:

45

:

public static void SetList(List<Tank> sourse)

46

:

{

47

:

AllTanks = sourse;

48

:

}

49

:

50

:

public static List<Tank> GetList()

51

:

{

52

:

return AllTanks;

53

:

}

54

:

55

:

public void FillTankWith(Drink drink, int amount)

56

:

{

57

:

DrinkInside = drink;

58

:

DrinkAmountNow = amount;

59

:

}

60

:

61

:

public override string ToString()

62

:

{

63

:

return String.Concat(DrinkInside.ToString(), "Ємність - ", Capasity, "; Зараз - ", DrinkAmountNow);

64

:

}

65

:

}

66

:

}

Лістинг А.3. - Клас "Упаковка"(файл Packing.cs)

1

:

using System;

2

:

using System.Collections.Generic;

3

:

using System.Drawing;

4

:

5

:

namespace Kursova

6

:

{

7

:

// Клас упаковок, у якому продукт видаватиметься клієнту

8

:

public class Packing

9

:

{

10

:

public double Capasity; // Ємність

11

:

public Color PackColor; // Колір упаковки

12

:

public string LogoName; // Логотип компанії на упаковці

13

:

14

:

public int MaxCount

15

:

{

16

:

get { return _maxcount; }

17

:

set { _maxcount = Math.Max(value, 10); }

18

:

}

19

:

20

:

public int Count;

21

:

22

:

private int _maxcount;

23

:

private static List<Packing> AllPackings;

24

:

25

:

public Packing()

26

:

{

27

:

}

28

:

29

:

public Packing(double capasity, string logo, Color packColor, int count, int maxCount)

30

:

{

31

:

Capasity = capasity;

32

:

PackColor = packColor;

33

:

LogoName = logo;

34

:

Count = count;

35

:

MaxCount = maxCount;

36

:

AllPackings.Add(this);

37

:

}

38

:

39

:

static Packing()

40

:

{

41

:

AllPackings = new List<Packing>();

42

:

}

43

:

44

:

public static void SetList(List<Packing> sourse)

45

:

{

46

:

AllPackings = sourse;

47

:

}

48

:

49

:

public static List<Packing> GetList()

50

:

{

51

:

return AllPackings;

52

:

}

53

:

54

:

public void LoadPacks(int count)

55

:

{

56

:

Count = Math.Min(count + Count, MaxCount);

57

:

}

58

:

public override string ToString()

59

:

{

60

:

return String.Concat(Capasity, "; ", Count, " штук, ", MaxCount, " максимум.");

61

:

}

62

:

}

63

:

}

Лістинг А.4. - Клас "Продукт"(файл Product.cs)

1

:

using System;

2

:

using System.Collections.Generic;

3

:

4

:

namespace Kursova

5

:

{

6

:

// Готовий продукт, який відпускається клієнту

7

:

//

8

:

public class Product

9

:

{

10

:

public Tank DrinkSourse;

11

:

public Packing DrinkPack;

12

:

public decimal Price

13

:

{

14

:

get { return _price; }

15

:

set

16

:

{

17

:

if (value > 0)

18

:

_price = value;

19

:

else _price = 0;

20

:

}

21

:

}

22

:

23

:

private decimal _price ;

24

:

private static List<Product> AllProducts;

25

:

26

:

//

27

:

// Конструктори

28

:

//

29

:

public Product()

30

:

{}

31

:

32

:

public Product(Tank drinkSourse, Packing drinkPack, decimal price)

33

:

{

34

:

DrinkSourse = drinkSourse;

35

:

DrinkPack = drinkPack;

36

:

Price = price;

37

:

AllProducts.Add(this);

38

:

}

39

:

40

:

static Product()

41

:

{

42

:

AllProducts = new List<Product>();

43

:

}

44

:

45

:

//

46

:

// Автоматичне заповнення списку продуктів

47

:

//

48

:

public static void SetList(List<Product> sourse)

49

:

{

50

:

AllProducts = sourse;

51

:

}

52

:

53

:

//

54

:

// Повернення списку продуктів

55

:

//

56

:

public static List<Product> GetList()

57

:

{

58

:

return AllProducts;

59

:

}

60

:

61

:

public override string ToString()

62

:

{

63

:

return String.Concat(DrinkSourse.DrinkInside, "Порція: ", DrinkPack.Capasity, ". Ціна: ", Price.ToString());

64

:

}

65

:

66

:

//

67

:

// Замовлення напою

68

:

//

69

:

public Product OrderDrink(decimal money)

70

:

{

71

:

bool EverythingIsOk = false;

72

:

List<Tank> _tanks = Tank.GetList();

73

:

List<Packing> _packs = Packing.GetList();

74

:

int _tI = _tanks.FindIndex(

75

:

delegate(Tank t)

76

:

{

77

:

return (DrinkSourse.Capasity == t.Capasity) &&

78

:

(DrinkSourse.DrinkInside.Name == t.DrinkInside.Name) &&

79

:

(DrinkSourse.DrinkInside.DrinkColour == t.DrinkInside.DrinkColour);

80

:

});

81

:

82

:

int _pI = _packs.FindIndex(

83

:

delegate(Packing p)

84

:

{

85

:

return (p.Capasity == DrinkPack.Capasity) && (p.PackColor == DrinkPack.PackColor);

86

:

});

87

:

88

:

if ((_tI == -1) || (_pI == -1))

89

:

AllProducts.Remove(this);

90

:

else if ((_tanks[_tI].DrinkAmountNow < DrinkPack.Capasity) || (_packs[_pI].Count <= 0))

91

:

AllProducts.Remove(this);

92

:

else

93

:

EverythingIsOk = (Price <= money);

94

:

if (EverythingIsOk)

95

:

{

96

:

_tanks[_tI].DrinkAmountNow -= DrinkPack.Capasity;

97

:

_packs[_pI].Count -= 1;

98

:

if ((_tanks[_tI].DrinkAmountNow < DrinkPack.Capasity) || (_packs[_pI].Count <= 0))

99

:

AllProducts.Remove(this);

100

:

Tank.SetList(_tanks);

101

:

Packing.SetList(_packs);

102

:

return this;

103

:

}

104

:

return null;

105

:

}

106

:

}

107

:

}

Лістинг А.5. - Клас "FormEnter"(файл FormEnter.cs)

1

:

using System;

2

:

using System.Collections.Generic;

3

:

using System.IO;

4

:

using System.Windows.Forms;

5

:

using System.Xml.Serialization;

6

:

7

:

namespace Kursova

8

:

{

9

:

public partial class FormEnter : Form

10

:

{

11

:

public FormEnter()

12

:

{

13

:

InitializeComponent();

14

:

tTuserMode.SetToolTip(rbDefaultMode, "Режим використання автомата(прийом та виконання замовлень)");

15

:

tTAutomat.SetToolTip(rbAutomatSettings, "Режим налаштування меню та завантаження тари і напоїв");

16

:

tTEmulator.SetToolTip(rbEmulatorSettingsMode, "Режим налаштувань емулятора.\n" +

17

:

"Увага! Вхід до цього режиму скидає усі налаштування!");

18

:

tTEmulator.ToolTipIcon = ToolTipIcon.Warning;

19

:

//

20

:

// При запуску автомата зчитуємо інформацію про його стан

21

:

//

22

:

ReadSettings();

23

:

}

24

:

25

:

// Зчитування налаштувань

26

:

public static void ReadSettings()

27

:

{

28

:

XmlSerializer xmlsTank = new XmlSerializer(typeof(List<Tank>));

29

:

XmlSerializer xmlsPacking = new XmlSerializer(typeof(List<Packing>));

30

:

XmlSerializer xmlsProducts = new XmlSerializer(typeof(List<Product>));

31

:

32

:

StreamReader file = new StreamReader("tanks.xml");

33

:

if (!file.EndOfStream)

34

:

Tank.SetList((List<Tank>) xmlsTank.Deserialize(file));

35

:

file.Close();

36

:

37

:

file = new StreamReader("packs.xml");

38

:

if (!file.EndOfStream)

39

:

Packing.SetList((List<Packing>) xmlsPacking.Deserialize(file));

40

:

file.Close();

41

:

42

:

file = new StreamReader("products.xml");

43

:

if (!file.EndOfStream)

44

:

Product.SetList((List<Product>) xmlsProducts.Deserialize(file));

45

:

file.Close();

46

:

}

47

:

48

:

// Збереження налаштувань

49

:

public static void WriteSettigs()

50

:

{

51

:

XmlSerializer xmlsTank = new XmlSerializer(typeof(List<Tank>));

52

:

XmlSerializer xmlsPacking = new XmlSerializer(typeof(List<Packing>));

53

:

XmlSerializer xmlsProducts = new XmlSerializer(typeof(List<Product>));

54

:

55

:

StreamWriter file = new StreamWriter("tanks.xml");

56

:

xmlsTank.Serialize(file, Tank.GetList());

57

:

file.Close();

58

:

59

:

file = new StreamWriter("packs.xml");

60

:

xmlsPacking.Serialize(file, Packing.GetList());

61

:

file.Close();

62

:

63

:

file = new StreamWriter("products.xml");

64

:

xmlsProducts.Serialize(file, Product.GetList());

65

:

file.Close();

66

:

}

67

:

// Вибір дії вiдповідно до радіобаттона

68

:

//

69

:

private void btnOK_Click(object sender, EventArgs e)

70

:

{

71

:

// Користувацький режим

72

:

if (rbDefaultMode.Checked)

73

:

{

74

:

FormUserMode fum = new FormUserMode();

75

:

fum.ShowDialog();

76

:

}

77

:

// Режим налаштування та завантаження

78

:

if (rbAutomatSettings.Checked)

79

:

{

80

:

FormAutomatSettings fas = new FormAutomatSettings();

81

:

fas.ShowDialog();

82

:

}

83

:

// Режим налаштування емулятора

84

:

if (rbEmulatorSettingsMode.Checked)

85

:

{

86

:

FormEmulatorSettings fes = new FormEmulatorSettings();

87

:

DialogResult result = MessageBox.Show(this,

88

:

"Повернутися до попередніх налаштувань буде неможливо. Бажаєте предовжити?",

89

:

"Увага!", MessageBoxButtons.YesNo);

90

:

if (result == DialogResult.Yes)

91

:

fes.Show();

92

:

}

93

:

}

94

:

}

95

:

}

Лістинг А.6. - Клас "FormAutomatSettings"(файл FormAutomatSettings.cs)

1

:

using System;

2

:

using System.Collections.Generic;

3

:

using System.Drawing;

4

:

using System.Windows.Forms;

5

:

using System.Xml.Serialization;

6

:

7

:

namespace Kursova

8

:

{

9

:

public partial class FormAutomatSettings : Form

10

:

{

11

:

XmlSerializer xmlsProducts = new XmlSerializer(typeof(List<Product>));

12

:

XmlSerializer xmlsTank = new XmlSerializer(typeof(List<Tank>));

13

:

XmlSerializer xmlsPacking = new XmlSerializer(typeof(List<Packing>));

14

:

15

:

private Color DrinkColor = Color.Orange;

16

:

17

:

public FormAutomatSettings()

18

:

{

19

:

InitializeComponent();

20

:

btnSetDrincColor.BackColor = DrinkColor;

21

:

}

22

:

23

:

private void FormAutomatSettings_Load(object sender, EventArgs e)

24

:

{

25

:

lboxTanks.DataSource = Tank.GetList();

26

:

lboxPackings.DataSource = Packing.GetList();

27

:

lboxProducts.DataSource = Product.GetList();

28

:

}

29

:

30

:

// Вибір кольору напою

31

:

//

32

:

private void btnSetDrincColor_Click(object sender, EventArgs e)

33

:

{

34

:

if (cDial_DrincColour.ShowDialog() == DialogResult.OK)

35

:

{

36

:

DrinkColor = cDial_DrincColour.Color;

37

:

btnSetDrincColor.BackColor = DrinkColor;

38

:

}

39

:

}

40

:

41

:

// При зміні вибраного елементу змінюємо максимальне значення

42

:

// у полі відповідного контролу типу "numericUpDown"

43

:

//

44

:

private void lboxTanks_SelectedIndexChanged(object sender, EventArgs e)

45

:

{

46

:

if (lboxTanks.SelectedIndex >= 0)

47

:

nudDrincCount.Maximum = Tank.GetList()[lboxTanks.SelectedIndex].Capasity;

48

:

RefreshListBoxes();

49

:

}

50

:

51

:

private void lboxPackings_SelectedIndexChanged(object sender, EventArgs e)

52

:

{

53

:

if (lboxPackings.SelectedIndex >= 0)

54

:

nudAddPacks.Maximum = Packing.GetList()[lboxPackings.SelectedIndex].MaxCount;

55

:

}

56

:

//

57

:

58

:

// Наповнюємо ємність заданим напоєм

59

:

//

60

:

private void btnFill_Click(object sender, EventArgs e)

61

:

{

62

:

if (Tank.GetList().Count > 0)

63

:

{

64

:

Tank.GetList()[lboxTanks.SelectedIndex].FillTankWith(new Drink(txtbSetDrinkName.Text, DrinkColor), (int)nudDrincCount.Value);

65

:

RefreshListBoxes();

66

:

}

67

:

}

68

:

69

:

private void RefreshListBoxes()

70

:

{

71

:

lboxTanks.DataSource = null;

72

:

lboxTanks.DataSource = Tank.GetList();

73

:

lboxProducts.DataSource = null;

74

:

lboxProducts.DataSource = Product.GetList();

75

:

lboxPackings.DataSource = null;

76

:

lboxPackings.DataSource = Packing.GetList();

77

:

}

78

:

79

:

// Завантажуємо тару у автомат

80

:

//

81

:

private void btnLoadPacks_Click(object sender, EventArgs e)

82

:

{

83

:

if (lboxPackings.SelectedIndex >= 0)

84

:

{

85

:

Packing.GetList()[lboxPackings.SelectedIndex].LoadPacks((int)nudAddPacks.Value);

86

:

}

87

:

RefreshListBoxes();

88

:

}

89

:

90

:

// Додання нового продукту у список доступних

91

:

//

92

:

private void buttonAddProduct_Click(object sender, EventArgs e)

93

:

{

94

:

if ((lboxPackings.SelectedIndex >= 0) && (lboxTanks.SelectedIndex >= 0))

95

:

new Product(Tank.GetList()[lboxTanks.SelectedIndex], Packing.GetList()[lboxPackings.SelectedIndex],

96

:

nudPrice.Value);

97

:

RefreshListBoxes();

98

:

}

99

:

100

:

// Збереження даних та вихыд налаштувань

101

:

//

102

:

private void btnOK_Click(object sender, EventArgs e)

103

:

{

104

:

FormEnter.WriteSettigs();

105

:

106

:

Close();

107

:

}

108

:

109

:

private void btnDelProduct_Click(object sender, EventArgs e)

110

:

{

111

:

if (lboxPackings.SelectedIndex >= 0)

112

:

{

113

:

List<Product> products = Product.GetList();

114

:

products.Remove(products[lboxProducts.SelectedIndex]);

115

:

Product.SetList(products);

116

:

}

117

:

RefreshListBoxes();

118

:

}

119

:

120

:

private void btnCancel_Click(object sender, EventArgs e)

121

:

{

122

:

Close();

123

:

}

124

:

}

125

:

}

Лістинг А.7. - Клас "FormEmulatorSettings"(файл FormEmulatorSettings.cs)

1

:

using System;

2

:

using System.Collections.Generic;

3

:

using System.Drawing;

4

:

using System.Windows.Forms;

5

:

using System.IO;

6

:

using System.Xml.Serialization;

7

:

8

:

namespace Kursova

9

:

{

10

:

public partial class FormEmulatorSettings : Form

11

:

{

12

:

private Color TankColor = Color.Black;

13

:

private Color PackColor = Color.AntiqueWhite;

14

:

15

:

List<Tank> AutomatTanks = new List<Tank>();

16

:

List<Packing> AutomatPacks = new List<Packing>();

17

:

18

:

XmlSerializer xmlsTank = new XmlSerializer(typeof(List<Tank>));

19

:

XmlSerializer xmlsPacking = new XmlSerializer(typeof(List<Packing>));

20

:

21

:

public FormEmulatorSettings()

22

:

{

23

:

InitializeComponent();

24

:

btnChooseTankColor.BackColor = TankColor;

25

:

btnChoosePackColor.BackColor = PackColor;

26

:

}

27

:

28

:

private void FormEmulatorSettings_Load(object sender, EventArgs e)

29

:

{

30

:

Product.SetList(new List<Product>());

31

:

Tank.SetList(new List<Tank>());

32

:

Packing.SetList(new List<Packing>());

33

:

}

34

:

35

:

// Збереження налаштувань

36

:

private void btnOK_Click(object sender, EventArgs e)

37

:

{

38

:

StreamWriter file = new StreamWriter("tanks.xml");

39

:

xmlsTank.Serialize(file, AutomatTanks);

40

:

file.Close();

41

:

file = new StreamWriter("packs.xml");

42

:

xmlsPacking.Serialize(file, AutomatPacks);

43

:

file.Close();

44

:

45

:

Tank.SetList(AutomatTanks);

46

:

Packing.SetList(AutomatPacks);

47

:

48

:

Close();

49

:

}

50

:

51

:

private void btnCancel_Click(object sender, EventArgs e)

52

:

{

53

:

Close();

54

:

}

55

:

56

:

private void RefreshListBoxes()

57

:

{

58

:

lboxListOfTanks.DataSource = null;

59

:

lboxListOfTanks.DataSource = AutomatTanks;

60

:

lboxPackings.DataSource = null;

61

:

lboxPackings.DataSource = AutomatPacks;

62

:

}

63

:

64

:

//

65

:

// Дії зі списком ємностей (додання у список, видалення, вибір кольору)

66

:

//

67

:

private void btnAddTank_Click(object sender, EventArgs e)

68

:

{

69

:

AutomatTanks.Add(new Tank(new Drink("Напій відсутній", Color.Red), (int)nudChooseCapasity.Value, TankColor, 0));

70

:

RefreshListBoxes();

71

:

}

72

:

73

:

private void btnDelTank_Click(object sender, EventArgs e)

74

:

{

75

:

if (lboxListOfTanks.SelectedIndex >= 0)

76

:

AutomatTanks.RemoveAt(lboxListOfTanks.SelectedIndex);

77

:

RefreshListBoxes();

78

:

}

79

:

80

:

private void btnChooseTankColor_Click(object sender, EventArgs e)

81

:

{

82

:

if (cDial_Tank.ShowDialog() == DialogResult.OK)

83

:

{

84

:

TankColor = cDial_Tank.Color;

85

:

btnChooseTankColor.BackColor = TankColor;

86

:

}

87

:

}

88

:

89

:

//

90

:

// Дії зі списком тари (додання у список, видалення, вибір кольору)

91

:

//

92

:

private void btnAddPack_Click(object sender, EventArgs e)

93

:

{

94

:

AutomatPacks.Add(new Packing((double)nudPackCapasity.Value, "Logo.gif", PackColor, 0, (int)nudMaxCount.Value));

95

:

RefreshListBoxes();

96

:

}

97

:

98

:

private void btnDelPack_Click(object sender, EventArgs e)

99

:

{

100

:

if (lboxPackings.SelectedIndex >= 0)

101

:

AutomatPacks.RemoveAt(lboxPackings.SelectedIndex);

102

:

RefreshListBoxes();

103

:

}

104

:

105

:

private void btnChoosePackColor_Click(object sender, EventArgs e)

106

:

{

107

:

if (cDial_Pack.ShowDialog() == DialogResult.OK)

108

:

{

109

:

PackColor = cDial_Pack.Color;

110

:

btnChoosePackColor.BackColor = PackColor;

111

:

}

112

:

}

113

:

}

114

:

}

Лістинг А.8. - Клас "FormUserMode"(файл FormUserMode.cs)

1

:

using System;

2

:

using System.Collections.Generic;

3

:

using System.Drawing;

4

:

using System.Windows.Forms;

5

:

using System.Xml.Serialization;

6

:

7

:

namespace Kursova

8

:

{

9

:

public partial class FormUserMode : Form

10

:

{

11

:

private decimal Deal;

12

:

XmlSerializer xmlsProduct = new XmlSerializer(typeof(List<Product>));

13

:

XmlSerializer xmlsTank = new XmlSerializer(typeof(List<Tank>));

14

:

XmlSerializer xmlsPacking = new XmlSerializer(typeof(List<Packing>));

15

:

16

:

public FormUserMode()

17

:

{

18

:

InitializeComponent();

19

:

tTmenu.SetToolTip(lboxMenu, "Виберіть продукт, який бажаєте замовити");

20

:

tTGetProduct.SetToolTip(grboxDialogResult, "Вікно видачі продуктів");

21

:

tTbutton.SetToolTip(btnOrder, "Виберіть продукт, внесіть достатню суму, та натисніть цю кнопку");

22

:

tTnudSum.SetToolTip(nudPaySum, "Тут введіть суму, яку ви вносите\nСуми має бути достатньо для замовлення напою!");

23

:

24

:

lboxMenu.DataSource = Product.GetList();

25

:

}

26

:

27

:

private void FormUserMode_Load(object sender, EventArgs e)

28

:

{

29

:

FormEnter.ReadSettings();

30

:

}

31

:

32

:

public void RefreshListBox()

33

:

{

34

:

lboxMenu.DataSource = null;

35

:

lboxMenu.DataSource = Product.GetList();

36

:

}

37

:

private void btnOrder_Click(object sender, EventArgs e)

38

:

{

39

:

if (lboxMenu.SelectedIndex >= 0)

40

:

{

41

:

Product ordered = Product.GetList()[lboxMenu.SelectedIndex].OrderDrink(nudPaySum.Value);

42

:

if (ordered != null)

43

:

{

44

:

Paint_Product(grboxDialogResult,

45

:

new PaintEventArgs(grboxDialogResult.CreateGraphics(),

46

:

grboxDialogResult.DisplayRectangle));

47

:

Deal = nudPaySum.Value - ordered.Price;

48

:

nudPaySum.Value = Deal;

49

:

lbDeal.Text = @"Решта: " + Deal + @" грн.";

50

:

}

51

:

else

52

:

{

53

:

MessageBox.Show(this, @"Перевірте, чи достатньо коштів ви внесли!", @"Помилка");

54

:

grboxDialogResult.Invalidate();

55

:

lbDeal.Text = "";

56

:

}

57

:

58

:

// Після кожної операції здійснюємо збереження даних про стан автомата

59

:

//

60

:

FormEnter.WriteSettigs();

61

:

}

62

:

RefreshListBox();

63

:

}

64

:

65

:

private void Paint_Product(object sender, PaintEventArgs e)

66

:

{

67

:

Graphics g = e.Graphics;

68

:

Image i = new Bitmap("Logo.gif");

69

:

g.FillPolygon(new SolidBrush(Color.Red), new PointF[4]

70

:

{

71

:

new PointF(20, 50),

72

:

new PointF(140, 50),

73

:

new PointF(110, 200),

74

:

new PointF(50, 200)

75

:

});

76

:

g.FillEllipse(new SolidBrush(Color.OrangeRed), 20, 30, 120, 40);

77

:

g.DrawImage(new Bitmap("Logo.gif"), 80 - i.Width/2, 150);

78

:

79

:

}

80

:

}

81

:

}

ДОДАТОК Б - Результати роботи програми

На рисунках зображено видачу продуктів та опрацювання виняткових ситуацій.

Размещено на Allbest.ru


Подобные документы

  • Розробка комплексу інтерактивних програмних засобів для обліку і продажу товарів в Інтернет-магазині. Консультативні та довідкові функції інформаційної системи. Створення і реалізація структурної моделі бази даних. Вимоги до ресурсів сервера і ПК клієнта.

    дипломная работа [891,6 K], добавлен 14.02.2015

  • Розробка таблиці для збереження даних у текстовому файлі про фільми в середовищі програмування Visual Studio C++ та їх сортування за країною виробництва. Реалізація таблиці за допомогою компонента dataGridView. Опис і контрольний приклад роботи програми.

    курсовая работа [1,4 M], добавлен 02.11.2016

  • Оптимізація перевезення продуктів із пунктів відправлення до пунктів споживання. Зниження транспортних витрат, розробка і використання оптимальних схем вантажних потоків. Архітектура програмного забезпечення в середовищі Microsoft Visual Studio 2010.

    курсовая работа [675,3 K], добавлен 10.03.2013

  • Базові конструкції мови програмування С++ з позиції об’єктного програмування. Розробка програми для автоматизації обліку товарів на складі магазину парфумів. Реалізація програми в середовищі Visual Studio C++. Розробка інтерфейсу і тестування програми.

    дипломная работа [907,9 K], добавлен 01.04.2016

  • Розробка та проектування інтерфейсу користувача у середовищі Microsoft Visual Studio 2010 з використання Visaul C#. Введення, додавання, вилучення даних. Пошук і фільтрація потрібних записів за допомогою запитів. Реалізація валідації, обробка виключень.

    курсовая работа [1,5 M], добавлен 29.03.2017

  • Послідовність створення бази даних автопарку. Визначення об'єктів та класів і зв’язків між ними. Конструктори та деструктори, успадкування класів. Реалізація програми в середовищі Visual Studio C++, її тестування. Побудова об’єктної моделі додатку.

    курсовая работа [529,0 K], добавлен 25.01.2016

  • Розробка програми для реалізації системи, що забезпечує автоматичне управління та моделювання зміни музичних програм на радіостанції з використанням засобів Microsoft Visual. Програмна реалізація інтерфейсу та процесу моделювання роботи системи.

    курсовая работа [1,7 M], добавлен 08.01.2012

  • Розробка операційного автомату. Розробка машинного алгоритму: граф-схема алгоритму; приклад реалізації. Синтез керуючого автомату: основи теорії керуючих автоматів; опис керуючого автомату Мілі. Кодування граф-схеми автомату. Синтез керуючого автомату.

    курсовая работа [121,0 K], добавлен 26.12.2009

  • Концепції об'єктно-орієнтованого програмування. Конструктори та деструктори. Успадкування класів. Побудова об’єктної моделі. Визначення об'єктів та класів і зв’язків між ними. Реалізація програми в середовищі Visual Studio C++. Інтерфейс програми.

    курсовая работа [743,7 K], добавлен 25.01.2016

  • Принципи технології створення програмних продуктів. Набір файлів, необхідних для створення програми в Delphi, варіанти роботи з ними. Програмування графічного інтерфейсу користувача. Зовнішній вигляд і лістинг програми, використані команди і компоненти.

    курсовая работа [550,5 K], добавлен 03.01.2014

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.