Розробка емулятору роботи банкомату
Банкомат - автоматизований пристрій, що дозволяє віддалено здійснювати операції, пов'язані з аутентифікацією користувача, переглядом поточного стану рахунку та зняттям грошей. Визначення вимог до програмного забезпечення та аналіз предметної області.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | украинский |
Дата добавления | 25.06.2018 |
Размер файла | 1,3 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
- порядок контролю та приймання.
Технічне завдання
1. Вступ
2. Найменування проекту
Моделювання роботи банкомату
3. Область застосування
4. Підстави для розробки.
5. Документи, на підставі яких ведеться проектування
Розробка ведеться відповідно документів:
ДСТУ ГОСТ 2.104:2006 Єдина система конструкторської документації. ОСНОВНІ НАПИСИ;
ДСТУ 3008-2015 Інформація та документація. Звіти у сфері науки і техніки. Структура та правила оформлювання;
ДСТУ ГОСТ 7.1:2006 Бібліографічний запис. Бібліографічний опис. Загальні вимоги та правила складання;
ЗАГАЛЬНІ ВИМОГИ ДО СТРУКТУРИ ККП;
Організація, що затвердила документ, і дата затвердження
Організація, що затвердила документи і дати завершення: Хмельницький національний університет.
Адреса: м. Хмельницький, вулиця Кам'янецька 100.
Дата завершення та здачі проекту: 24 червня 2018 року.
Шрифт теми: Times new roman, 14pt.
5. Призначення розробки
Основне завдання при реалізації таких систем - гарантія високого рівня надійності клієнтів-користувачів банку і інформаційної системи банку. Відсутність таких гарантій може спричинити за собою не тільки прямі витрати банку, пов'язані з конкретними діями зловмисників, а й втрату репутації. Більшість уразливих місць в безпеці систем такого рівня пов'язано з помилками, допущеними при створенні системи. Серед них значну частину становлять помилки в програмному забезпеченні. Для боротьби з такими помилками необхідно застосовувати в розробці методи, що дозволяють уникнути їх ще на стадії проектування. Інша вимога до методу розробки полягає в наявності способу формально доводити коректність реалізації.
6. Вимоги до функціональних характеристик ПЗ
Тепер, можна сформулювати основні вимоги до пристрою банкомата. Він повинен:
* ідентифікувати клієнта;
* виконувати операції «Показати доступні засоби» і «Зняти певну суму грошей»;
* вміти зв'язуватися з банком.
Клієнтська програма запускається і пропонує користувачеві виконувати різні операції з його особистої карткою.
Перше, що потрібно від користувача - вставити карту. У цьому банкоматі цей процес емулюється введенням номера карти. У реальному банкоматі номер карти зчитується з неї автоматично.
Далі користувач вводить свій особистий pin-код. Якщо на сервері бракуватиме запис про рахунку, до введеного номера і pin-кодом, то робота з цією картою припиняється. Якщо ж pin-код і номер рахунку був введений правильно, то користувачеві пропонується виконати одну з наступних операцій:
* «Забрати карту» - повернення карти. Всі поточні операції скасовуються, а карта повертається на руки користувачеві;
* «Баланс» - відображає поточний залишок на рахунку, виводячи його на екран і надаючи можливість роздрукувати на чеку;
* «Зняття грошей» - виробляє операцію зняття грошей з карти. Для цього користувач повинен ввести суму, яку він хоче зняти. Клієнт пошле запит на сервер про поточний баланс, і отримає відповідь. Якщо на карті є достатньо грошей, то операція на сервері завершиться успішно, і банкомат видасть необхідну суму грошей. так само при натисканні на кнопку "Друк" буде надруковано чек по даній операції. Якщо виявиться, що на карті недостатньо грошей, то з картки нічого не зніметься, і клієнт виводить відповідне повідомлення на екран.
Після повернення картки, користувач може вставити її знову або піти, натиснувши кнопку «Вихід».
6.1 Зняття грошей з рахунку
При знятті грошей з рахунку банкомат запитує у користувача введення необхідної йому суми. У реальному банкоматі для цього доступні тільки цифрові клавіші від 0 до 9, емуляція ж буде перевіряти, що лічений з клавіатури значення є невід'ємним цілим числом в десятковій системі числення. Після того, як введення запитуваної суми підтверджено, банкомат додає введену суму до накопиченої інформації і відправляє її на сервер банку.
Тепер відбувається перевірка можливості зняти з рахунку запитувану суму - має бути достатньо грошей на рахунку.
У разі порушення цієї умови банкомату відправляється повідомлення про помилку, яке він відображає користувачеві.
Якщо сервер банку підтверджує транзакцію, то на сервері відбувається її облік (безпосереднє зняття грошей з рахунку), а банкомату відправляється повідомлення про видачу грошей користувачеві. Банкомат відображає користувачеві меню, в якому він може вибрати роздруківку чека з інформацією про транзакції.
Після вдалого або невдалого завершення операції банкомат відображає користувачеві головне меню, повертаючись в початковий стан.
6.2 Стан рахунку
Після вибору цієї операції банкомат відправляє серверу список з інформацією про необхідної операції. Після цього пристрій банкомату отримує повідомлення від сервера, що містить поточний стан рахунку. Користувачеві надається можливість роздрукувати цю інформацію, і в разі позитивної відповіді видається чек. Після цього на екран виводиться стан рахунку. На даному етапі клієнт може забрати карту або продовжити роботу. В останньому випадку банкомат відображає головне меню і повертається в початковий стан.
6.3 Здійснення платежів
Користувач вибирає спочатку оператора послуг мобільного зв'язку, потім вводить номер телефону і кількість грошей, яке він хоче перевести (всі ці дані зберігаються у внутрішньому списку). З метою усунення помилок, пов'язаних з введенням номера (10 цифр), банкомат пропонує користувачеві підтвердити введену інформацію або ввести її заново. У разі підтвердження інформації внутрішній список, що містить опис операції, відправляється на сервер.
Після перевірки можливості здійснення платежу, подібного до того, який був описаний вище, сервер або фіксує факт оплати мобільних послуг і відправляє банкомату повідомлення про успішне завершення транзакції, або відправляє банкомату повідомлення про помилку. У другому випадку користувачеві відображається повідомлення про помилку, а в першому - роздруковується чек з інформацією про скоєний платіж.
6.4 Формальний опис
Для реалізації вищеописаного сценарію необхідно виділити спочатку об'єкти управління, над якими будуть проводитися операції. По-перше, це те, що безпосередньо бачить клієнт, який працює з банкоматом, - призначений для користувача інтерфейс, який буде розглядатися як єдина система, що дозволяє відображати на екрані банкомату інформацію. По-друге, це система віддаленого взаємодії банкомату з сервером. Далі, об'єктом управління буде і сервер банку, що обробляє запити банкомату. Нарешті, виділимо також спеціальну підсистему банку, що відповідає за авторизацію користувачів, - з нею працює сервер банку, перевіряючи таку інформацію, як, наприклад, введений Р / У-код.
Управління перерахованими об'єктами ініціюється джерелами подій, в якості яких розглядаються система, яка реєструє номер картки клієнта, клавіатура банкомату, власне банкомат, що відправляє запити серверу, і сервер, який відповідає на ці запити.
7. Вимоги до надійності
Необхідно застосувати комплекс заходів, які спрямовані на аналіз, виявлення та усунення вразливостей у застосунках та забезпеченні їхньої безпеки. Забезпечення безпеки охоплює заходи підвищення безпеки програми, зазвичай шляхом пошуку, виправлення та запобігання уразливостям системи безпеки. Для цього використовуються методи виявлення таких уразливостей на різних етапах життєвого циклу додатків, таких як проектування, розробка, розгортання, модернізація, технічне обслуговування. На кожному з цих етапів, користувач може зіштовхнутися з певними проблемами, що здебільшого виникають у результаті реалізації додатків, які у свою чергу служать для забезпечення певних потреб користувача.
Надійне (стійке) функціонування програмного комплексу має бути забезпечене шляхом:
- реалізації процесу автентифікації користувача відповідно до стандарту OAuth 2.0 (RFC- 6749);
- забезпечення надійності прикладного програмного інтерфейсу;
- забезпечення надійності виконання бізнес-логіки шляхом покривання модульними тестами;
- забезпечення захищеності доступу до СКБД.
Таким чином можна уникнути небажаних збоїв у системі, а також забезпечити надійність даних користувачів.
8. Вимоги до інформаційної та програмно сумісності
Необхідно врахувати усі вимоги до програмно-технічного середовища функціонування ПЗ. Для збереження даних підійде будь-який ПК з встановленим на нього операційної системи сімейства Windows.
Вимоги до документації.
Документація щодо експлуатації, проектування та розробки “Моделювання роботи банкомату” містить наступні документи:
- пояснювальна записка проекту;
- UML діаграми;
- компакт диск з проектом;
- відомість проекту;
- анотація;
- календарний план;
- приклад програмного коду.
9. Стадії та етапи розробки
Детальний опис стадій проектування наведено в календарному плані проекту.
В загальному, послідовність проектування та розробки даного ПЗ має наступну послідовність дій:
- постановка завдання;
- обґрунтований вибір засобів розробки (програмування);
вибір методу рішення задачі. Аналіз можливості використання раніше розробленого і доступного для програміста ПО;
- розробка алгоритму рішення задачі. Декомпозиція завдання на підзадачі. Визначення послідовності вирішення підзадач. Розробка структури програми;
- кодування засобами вибраної мови програмування;
- верифікація і перевірка коректності. Аналітичний доказ правильності програми;
- тестування програми. Розробка тестів і контрольних прикладів. Зіставлення реальних і очікуваних результатів;
- відладка програми у разі виявлення помилок. Локалізація виявлених помилок. Корекція помилок. Повернення до етапу тестування;
- розробка документації. Текстовий опис програми. Розробка інструкцій користувачеві - особі, що застосовує розроблену програму в своїй роботі. Розробка інструкцій з експлуатації, що містять інформацію, потрібну програмістам, відповідальним за нормальне функціонування програми.
10. Порядок контролю і приймання
Для тестування даного програмного продукту було застосовано модульне тестування . Також при розробці проекту відбувалось такі види тестування як мануальне, модульне, функціональне та інтеграційне тестування, за допомогою якого було виявлено та виправлено роботу певних функцій, які працювали некоректно.
Прийом курсового проекту передбачає його захист на курсі, хмельницького національного університету, факультету програмування та комп'ютерних телерадіокомунікаційних систем.
11. Демонстрацiя результатiв та тестування розробленого ПЗ
11.1 Тестування ПЗ
Для розробки програмного забезпечення було обрано мову програмування C # тому що проекти на даній програмі залежать тільки від фреймворка, це впливає на легке транспортування програми, на будь який комп'ютер на якому є потрібна версія .NET.
Також тому що дана мова програмування має достатньо лаконічний синтаксис що досить спрощує написання програм на цій мові. Об'єктна модель построєна таким чином що у вас ніколи немає проблем з динамічною пам'яттю, код виходить керованим і не представляється важким для від лагодження.
Якщо потрібно створити програмне забезпечення з графічним інтерфейсом(GUI), це дуже зручно зробити в Visual Studio на мові C #.
Для тестування було обрано стандартнi засоби тестування, що вбудованi в Visual Studio, оскільки програма була написана на мові С#.
На рис. 1 представлений графiк навантаження центрального процесору та використання оперативної пам`ятi. Розроблене ПЗ споживає оперативну пам'ять рiвномiрно, але в момент виконання об'ємної задачi кiлькiсть необхідної пам'яті збільшується. А судячи с низького рiвня активностi можна зробити висновок, що ПЗ не є вибагливим до ресурciв.
Рисунок 1- Споживання ресурсів ЦП та ОЗП.
11.2 Представлення результатів, що демонструють функцiональнiсть розробленого ПЗ
Розроблене ПЗ має досить простий та прямолiнiйний інтерфейс.
Рисунок 2 - Початкове вікно емулятора
При запуску емулятора, ми бачимо вікно (рис. 2) , на ньому зображено інформацію.
Про назву банку, корпорацію до якої він відноситься. Далі нам потрібно натиснути будь-яку кнопку для продовження.
Рисунок 3 - Вікно для вводу номера банківської картки.
У наступному вікні (рис. 3) ми бачимо, те що нам потрібно ввести номер своєї банківської картки.
Рисунок 4 - Вікно вводу pin коду банківської картки.
У цьому вікні зображеному на рисунку №4 , нам потрібно ввести пін код , тієї банківської картки , номер якої ми ввели перед цим, після чого буде зроблена ідентифікація даного клієнту банку.
В випадку якщо, номер карти буде введений невірно , то система видасть повідомлення про помилку(рис. 5).
Рисунок 5 - Повідомлення про помилку
І так само буде у випадку введення невірного пін коду банківської карти (рис .6).
Рисунок 6 - Введення невірного пін коду картки
Після ідентифікації системою користувача, ми попадаємо у головне меню (рис. 7) банкомату, де є багато пунктів, детальніше я опишу їх нижче.
Рисунок 7 - Головне меню банкомату
Тут крім пронумерованих пунктів , які дозволяють проводити грошові операції з карткою, зображається дата , яка є на даний момент входу користувача у систему банкомату, зображенна зверху і пункт “Сделайте свой вибор”. Цей пункт дозволяє вибирати пункти головного меню банкомата, щоб вибрати пункт , достатньо ввести цифру того пункту. Ще у цьому пункті зображено особисті данні клієнта .
Далі почнемо розбирати кожен пункт меню банкомату окремо.
Рисунок 8 - Пункт “Депозит” у меню банкомату
У пункті “Депозит” банкомату зображено зверху, тип даного клієнту банку і пункт ”Вставте деньги “. Клієнт банку може у даному пункті, відкрити собі депозитний рахунок, і за допомогою цього збільшити свій баланс на поточному рахунку.
Приведемо приклад, якщо клієнт банку, кладе на депозит одну тисячу(рис. 9), то після виконання даної операції сума на його поточному рахунку збільшиться на три тисячі.
Рисунок 9 - Клієнт поклав на депозит кошти
Рисунок 10 - Пункт “Вывод средств” у меню банку.
У даному пункті (рис 10) зображено так як і у попередньому пункті тип клієнта банку , дату і пункт меню, у який користувач вводить суму яку він хоче зняти зі своєї картки.
Якщо введена сума більша ніж сума більша ніж одна тисяча, то банкомат видасть повідомлення (рис.11) про помилку, і попросить клієнта натиснути будь-яку клавішу , після чого клієнт попаде у головне меню. Даний банкомат має обмеження на одну тисячу, тобто знімати або класти кошти більші за дану суму, є неможливим.
Рисунок 11 - Недостатньо коштів на рахунку
У наступному пункті під назвою “Баланс”(рис.12) клієнт банку може побачити на екрані, Поточний баланс свого рахунку. Також тут зображено тип даного клієнта, і його особисті данні . Щоб попасти на головне меню, клієнту достатньо натиснути будь яку клавішу.
Рисунок 12 - Баланс рахунку
Четвертий пункт у меню, дозволяє клієнту перевести кошти з його рахунку на інший рахунок даного банку (рис. 13)
Рисунок 13 - Зовнішній вигляд четвертого пункту
У четвертому пункті меню клієнту потрібно ввести номер рахунку на який він хоч перевести кошти, після цього ввести суму. Якщо клієнт введе неправильний рахунок то система видасть повідомлення про помилку (рис. 14)
Рисунок 14 - Повідомлення про помилку у четвертому пункті
Рисунок 15 - Зовнішній вигляд п'ятого пункту меню
П'ятий пункт меню (рис. 15) показує клієнту точну дату коли він зайшов у меню банкомату, його особисті данні, неповний номер карти, поточну дату . У даному пункті меню користувач може побачити коротку інформацію про свій рахунок.
Рисунок 16 - Зовнішній вигляд шостого пункту меню
Тут користувач може змінити свій пін код карти на інший, для цього спочатку треба ввести свій поточний пін код , потім ввести бажаний новий пін код і після цього знову його повторити. Протягом декількох секунд пін код буде змінено на новий(рис.16).
У випадку якщо буде введено невірний пін код або введений новий пін код не співпаде з введеним пін кодом у останньому пункті меню, де проситься повторити введений новий пін код. То система видасть помилку (рис. 17).
Рисунок 17 - Помилка невірно введеного пін коду
У пункті меню під номером сім, клієнт побачить свої особисту інформацію, точну дату , коли клієнт авторизувався в системі, Останні п'ять транзакцій по свому рахунку, і дати колі ці транзакції були здійснені, точні суми на які проводились транзакції, поточний баланс рахунку (рис.18).
Рисунок 18 - Зовнішній вигляд сьомого пункту меню
При виборі восьмого пункта меню, клієнт вийде зі свого профілю , банкомат віддасть йому його картку, і виведе на екран прощальний текст (рис. 19).
Рисунок 19 - Вихід клієнта з системи
Якщо у будь якій стадії роботи банкомата, чи то на початку, чи в головному меню, крім тих випадків коли система буде просити клієнта натиснути будь-яку клавішу, буде введено замість цифр , букви, то система видасть помилку і на екрані з'явиться повідомлення що можна ввести , тільки цифри (рис. 20).
Рисунок 20 - Помилка, при вводі клієнтом букв
Якщо клієнт у головному пункті меню введе цифру більшу за вісім, тобто цифру пункта меню якого не існує, то система видасть помилку, і попросить клієнта ввести цифру від одного до восьми (рис. 21).
Рисунок 21 - Помилка вводу, цифри якої не існує в меню
Дана система емуляції банкомату має невелику клієнтську базу, кожен клієнт має свій тип рахунку, економний або стандартний.
Висновки
програмний банкомат аутентифікація
Отже, в курсовому проекті був реалізований моделювання роботи банкомату. Був зроблений емулятор банкомату, який має клієнтську базу.
Розрізняє клієнтів на типи. Ще дана система емуляції банкомату може відкривати депозитні рахунки, перераховувати кошти з рахунка на рахунок.
В результаті можна виділити наступні переваги:
- відсутність схожих за функціоналом емуляторів;
- зручний, інтуїтивний інтерфейс;
Підчас розробки курсового проекту було пройдено усі стадії проектування, було покращено знання таких мов як с#, був отриманий величезний досвід у розробці емуляторів.
Література
1. Андрій Будай. Дизайн патерни - просто, як двері. 2012.
2. Брюс Еккель. Философия Java. 4-е видання «Пітер» 2009 р.
3. ДСТУ ISO 9000:2007. Системи управління якістю. Основні положення та словник термінів. - К.: Держспоживстандарт, 2008. - [Чинний від 2008-01-01] - 35 c.- (Державний стандарт).
4. ДСТУ ГОСТ 2.104:2006. Єдина система конструкторської доку- ментації. Основні написи (ГОСТ 2.104-2006, IDT). - К.: Держспоживстан- дарт України, 2007 - 16 .
5. Конструювання програмного забезпечення [Електронний ресурс]: методичні вказівки до курсового проектування для студентів напряму підготовки “Інженерія програмного забезпечення” /Яшина О.М. - Хмельницький: ХНУ, 2017. - 53 с. Режим доступу: https://msn.khnu.km.ua/ (дата звернення: 10.06.2018). - Назва з екрану.
6. Про організацію навчального процесу з функціонального навчання: Положення [05 листопада 2014 р. № 1398/26175]
7. Фернандес Д. Сoding4Fun, програмування для задоволення. «1500» 2009 р
8. Accessing JPA Data with REST [Електронний ресурс], Режим доступу: https://spring.io/guides/gs/accessing-data-rest/ (дата звернення 19.05.2018) - Назва з екрану
9. Craig Walls. Spring in Action. 4th Edition Manning Publications, 2014, -- 624 pages. -- ISBN 978-1617291203.
10. ISO/IEC 15288 Systems and software engineering - System life cycle processes. - [Чинний від 2008-03-18] - 70 c.- (Міжнародний стандарт).
11. Joshua Bloch. Effective Java (2nd Edition). Addison-Wesley; 2 edition (May 28, 2008). 346 pages.
12. Mike Keith, Merrick Schincariol, Pro JPA 2 (Expert's Voice in Java) 2nd ed. Edition.
13. Mockito - Using Spies [Електронний ресурс], Режим доступу: http://www.baeldung.com/mockito-spy (дата звернення 2.06.2018) - Назва з екрану.
14. Robert C. Martin. Clean Code: A Handbook of Agile Software Craftsmanship 1st Edition. Prentice Hall; 1 edition (August 11, 2008). 464 pages.
15. Setting Up Swagger 2 with a Spring REST API [Електронний ресурс], Режим доступу: http://www.baeldung.com/swagger-2-documentation-for-spring-rest-api (дата звернення 2.06.2018) - Назва з екрану.
16. Spring Boot Reference Guide [Електронний ресурс], Режим доступу: http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/ (дата звернення 2.06.2017) - Назва з екрану.
17. Spring Boot: от начала до продакшена [Електронний ресурс], Режим доступу: https://habrahabr.ru/post/257223/ (дата звернення 2.06.2018) - Назва з екрану.
18. Spring Data JPA - Reference Documentation [Електронний ресурс], Режим доступу: https://docs.spring.io/spring-data/jpa/docs/current/reference/html/ (дата звернення 2.05.2017) - Назва з екрану.
19. Spring Data JPA. JUnit тесты для Services. [Електронний ресурс], Режим доступу: http://devcolibri.com/4482 (дата звернення 12.04.2018) - Назва з екрану.
20. Spring Data JPA. Пишем DAO и Services. [Електронний ресурс], Режим доступу: http://devcolibri.com/4149 (дата звернення 12.05.2018) - Назва з екрану.
21. Spring Data JPA. Работа с БД. [Електронний ресурс], Режим доступу: http://devcolibri.com/3966 (дата звернення 12.05.2018) - Назва з екрану.
Додаток А
UML діаграма
Рисунок 22
Додаток Б
Програмний код
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
namespace E_ATM_Tuhin
{
abstract class Bank
{
protected string acc_no;
protected string acc_ty;
protected double balance;
public static double WITHDRAW_LIMIT = 1000;
public Bank(string acc_no, string acc_type, double balance)
{
this.acc_no = acc_no;
this.acc_ty = acc_type;
this.balance = balance;
}
}
class usrDetails: Bank
{
private string name;
private int TOTAL_TRANX;
private int pin;
private int _trail;
private int _atm_no;
public DateTime? last_access;
public usrDetails(int atm_no, string acc_no, string acc_type, string name, double balance, int pin)
: base(acc_no, acc_type, balance)
{
this.atm_no = atm_no;
this.name = name;
this.pin = pin;
last_access = null;
}
public string[] Trx_date = new string[5];
public double[] Trx_amt = new double[5];
public string[] Trx_mode = new string[5];
public int Trx_count = 0;
public string[] Trx_mini_date = new string[5];
public double[] Trx_mini_amt = new double[5];
public string[] Trx_mini_mode = new string[5];
public int Trx_mini_count = 0;
public string usrName
{
get { return name; }
set { name = value; }
}
public string acc_type
{
get { return acc_ty; }
set { acc_ty = value; }
}
public string usrAcc_no
{
get { return acc_no; }
set { acc_no = value; }
}
public int usrMaxTrail
{
get { return _trail; }
set { _trail = value; }
}
public int usrPin
{
get { return pin; }
set { pin = value; }
}
public int atm_no
{
get { return _atm_no; }
set { _atm_no = value; }
}
public int Tot_Tranx
{
get { return TOTAL_TRANX; }
set { TOTAL_TRANX = value; }
}
public double bal
{
get { return balance; }
set { balance = value; }
}
}
class ATM
{
static public DateTime dt = DateTime.Now;
public usrDetails[] usr = new usrDetails[10];
static string ATM_ID = "SBPX080283";
static string ATM_LOC = "SILLICON VALLEY";
public ATM()
{
usr[0] = new usrDetails(1234, "SBPxxx2093", "економний", "Сашик Четкий", 40000, 1122);
usr[1] = new usrDetails(1111, "ICICxx8690", "стандартний", "Сашик Чирик", 15000, 1111);
usr[2] = new usrDetails(2222, "HDFCxx8690", "економний", "Богдан Козак", 45000, 2222);
usr[3] = new usrDetails(3333, "ICICxx8690", "стандартний", "Константин Яблоко", 15000, 3333);
usr[4] = new usrDetails(4444, "HDFCxx8690", "економний", "Дмитрий Мутка", 50000, 4444);
usr[5] = new usrDetails(5555, "ICICxx8690", "стандартний", "Розана Умница", 65000, 5555);
usr[6] = new usrDetails(6666, "HDFCxx8690", "економний", "Дмитрий Сирдюк", 85000, 6666);
usr[7] = new usrDetails(7777, "ICICxx8690", "стандартний", "Вася Фриз", 95000, 7777);
usr[8] = new usrDetails(8888, "HDFCxx8690", "економний", "Олег Прикол", 75000, 8888);
usr[9] = new usrDetails(9999, "ICICxx8690", "стандартний", "Катя Тактак", 10000, 9999);
}
public static void UI_atm_prompt(String msg)
{
Start.main_header();
Console.WriteLine(Start.st + msg + "\n\n");
Start.footer();
Console.Write(Start.st + "Нажмите любую клавишу:");
Console.ReadKey();
}
public static void UI_loading()
{
Start.main_header();
Console.WriteLine("\n\n\t\t Transaction is being processed!\n\n");
Console.Write("\t\t\t ");
for (int x = 0; x < 20; x++)
{
Console.OutputEncoding = System.Text.Encoding.Unicode;
System.Threading.Thread.Sleep(50);
Console.Write("{0}", (char)178);
}
}
public void deposit(int atm_numb)
{
int i = 0;
bool check = false;
for (int j = 0; j < usr.Length; j++)
{
if (usr[j].atm_no == atm_numb)
{
check = true;
i = j;
}
}
CLEAR:
if (check)
{
if (usr[i].last_access != null)
{
DateTime cur_time = DateTime.Now;
TimeSpan duration = DateTime.Parse(cur_time.ToString()) - (DateTime.Parse(usr[i].last_access.ToString()));
int day = (int)Math.Round(duration.TotalDays);
if (day == 0)
{
Start.UI_error("Transaction limit\n\t\t\t exceeded for today!");
return;
}
else
{
usr[i].last_access = null;
goto CLEAR;
}
}
Start.main_header();
Console.WriteLine("\t\t\t Тип клиента: " + usr[i].acc_type + " \n\n");
Console.Write("\t\t Вставьте деньги: ");
try
{
double temp = double.Parse(Console.ReadLine());
if (temp >= 100)
{
if (temp <= Bank.WITHDRAW_LIMIT)
{
usr[i].bal += temp;
usr[i].Tot_Tranx++;
DateTime d = DateTime.Now;
record_trx(i, d.ToString("d"), temp, "Депозит");
UI_loading();
if (usr[i].Tot_Tranx == 10)
{
usr[i].last_access = DateTime.Now;
}
}
else
{
Start.UI_error("Funds can't exceed Rs.1000\n\t\t\t in single transaction!");
return;
}
}
else
{
Start.UI_error("Invalid Fund!");
return;
}
}
catch (Exception)
{
Start.UI_error("Only numbrers are allowed!");
return;
}
}
}
public void withdraw(int atm_numb)
{
int i = 0;
bool check = false;
for (int j = 0; j < usr.Length; j++)
{
if (usr[j].atm_no == atm_numb)
{
check = true;
i = j;
}
}
if (check)
{
CLEAR:
if (usr[i].last_access != null)
{
DateTime cur_time = DateTime.Now;
TimeSpan duration = DateTime.Parse(cur_time.ToString()) - (DateTime.Parse(usr[i].last_access.ToString()));
int day = (int)Math.Round(duration.TotalDays);
if (day == 0)
{
Start.UI_error("Transaction limit\n\t\t\t exceeded for today!");
return;
}
else
{
usr[i].last_access = null;
goto CLEAR;
}
}
if (usr[i].bal <= 100)
{
Start.UI_error("Insuffcient Fund!");
}
else
{
Start.main_header();
Console.WriteLine("\t\t\t Тип клиента: " + usr[i].acc_type + " \n\n");
Console.Write("\t\t Введите сумму: ");
try
{
double temp = double.Parse(Console.ReadLine());
if (temp >= 100)
{
if (temp <= Bank.WITHDRAW_LIMIT)
{
usr[i].bal -= temp;
usr[i].Tot_Tranx++;
DateTime d = DateTime.Now;
record_trx(i, d.ToString("d"), temp, "Withdraw");
UI_loading();
if (usr[i].Tot_Tranx == 10)
{
usr[i].last_access = DateTime.Now;
}
}
else
{
Start.UI_error("Funds can't exceed Rs.1000\n\t\t\t in single transaction!");
return;
}
}
else
{
Start.UI_error("Invalid Fund!");
return;
}
}
catch (Exception)
{
Start.UI_error("Only numbrers are allowed!");
return;
}
}
}
}
public void balance(int atm_numb)
{
int i = 0;
bool check = false;
for (int j = 0; j < usr.Length; j++)
{
if (usr[j].atm_no == atm_numb)
{
check = true;
i = j;
}
}
if (check)
{
UI_atm_prompt(Start.xst + "Пользователь: " + usr[i].usrName + ".\n\n\t\t\tТип клиента: " + usr[i].acc_type + "\n"
+ Start.mt + "Balace: Rs." + usr[i].bal);
}
}
public void tnfr_fund(int atm_numb)
{
int i = 0;
bool check = false;
for (int j = 0; j < usr.Length; j++)
{
if (usr[j].atm_no == atm_numb)
{
check = true;
i = j;
}
}
if (check)
{
int pae = 0;
bool flag = false;
Start.main_header();
Console.WriteLine("\t\t\t Пользователь: " + usr[i].usrName + " \n\n");
Console.Write("\t\t Enter payee CARD no: ");
try
{
int payee_atm_no = int.Parse(Console.ReadLine());
Console.Write("\t\t Re-Enter payee CARD no: ");
int check_payee = int.Parse(Console.ReadLine());
if (payee_atm_no == check_payee)
{
if (usr[i].atm_no == check_payee)
{
Start.UI_error("You cannot your CARD no!");
return;
}
for (int x = 0; x < usr.Length; x++)
{
if (usr[x].atm_no == check_payee)
{
flag = true;
pae = x;
}
}
if (flag)
{
Console.Write("\t\t Enter amount: ");
double temp = int.Parse(Console.ReadLine());
if (temp >= 100)
{
if (temp <= Bank.WITHDRAW_LIMIT)
{
usr[pae].bal += temp;
record_trx(i, dt.ToString("d"), temp, "-TRNFR:" + payee_atm_no.ToString());
usr[i].bal -= temp;
record_trx(pae, dt.ToString("d"), temp, "+TRNFR:" + usr[i].atm_no.ToString());
UI_loading();
}
else
{
Start.UI_error("Funds can't exceed Rs.1000\n\t\t\t in single transaction!");
return;
}
}
else
{
Start.UI_error("Invalid Fund!");
return;
}
}
else
{
Start.UI_error("CARD number doesn't exist!");
return;
}
}
else
{
Start.UI_error("Both CARD no doesn't match!");
return;
}
}
catch (Exception)
{
}
}
}
public void mini_stmt(int atm_numb, bool choice)
{
int i = 0;
bool check = false;
for (int j = 0; j < usr.Length; j++)
{
if (usr[j].atm_no == atm_numb)
{
check = true;
i = j;
}
}
if (check)
{
Start.main_header();
Console.WriteLine("\t\t\t\tПользователь: " + usr[i].usrName);
Console.Write("\t\t" + ATM_LOC);
Console.WriteLine("\n\n\t\tDATE\t\tTIME\tATM ID \t");
Console.WriteLine("\t\t" + dt.ToString("d") + "\t" + dt.ToString("H:mmtt") + "\t" + ATM_ID);
Console.WriteLine("\t\tAcc No:" + usr[i].usrAcc_no + " " + "CARD No:00xxxx" + usr[i].atm_no);
Console.WriteLine("\t\t------------------------------------");
if (usr[i].Trx_count == 0 && choice)
{
Console.WriteLine("\n\t\t No transactions recorded!\n");
Start.footer();
Console.Write("\t\tНажмите любую клавишу:");
Console.ReadKey();
return;
}
if (choice)
{
Console.WriteLine("\t\t\t LAST 5 TRANSACTIONS");
for (int x = 0; x < usr[i].Trx_count; x++)
{
Console.WriteLine("\t\t" + usr[i].Trx_date[x] + "\tRs." + usr[i].Trx_amt[x] + "\t" + usr[i].Trx_mode[x]);
}
}
else
{
if (usr[i].Trx_mini_count == 0)
{
Console.WriteLine("\n\t\t No transactions recorded!\n");
Start.footer();
Console.Write("\t\tНажмите любую клавишу:");
Console.ReadKey();
return;
}
for (int x = 0; x < usr[i].Trx_mini_count; x++)
{
if (usr[i].Trx_mini_amt[x] == 0)
{
Console.WriteLine("\t\t" + usr[i].Trx_mini_date[x] + "\t" + usr[i].Trx_mini_mode[x]);
}
else
{
Console.WriteLine("\t\t" + usr[i].Trx_mini_date[x] + "\tRs." + usr[i].Trx_mini_amt[x] + "\t" + usr[i].Trx_mini_mode[x]);
}
}
}
Console.WriteLine("\n\t\t AVAIL BAL: \tRs." + usr[i].bal);
Start.footer();
Console.Write("\t\tНажмите любую клавишу:");
Console.ReadKey();
}
}
public void chng_pin(int atm_numb)
{
int i = 0;
bool check = false;
for (int j = 0; j < usr.Length; j++)
{
if (usr[j].atm_no == atm_numb)
{
check = true;
i = j;
}
}
if (check)
{
Start.main_header();
Console.WriteLine("\t\t\t Пользователь: " + usr[i].usrName + " \n\n");
Console.Write("\t\t Enter existing pin: ");
try
{
string old_pin = ""; ;
ConsoleKeyInfo key;
do
{
key = Console.ReadKey(true);
if (key.Key != ConsoleKey.Backspace)
{
old_pin += key.KeyChar;
Console.Write("*");
}
else
{
if ((old_pin.Length - 1) != -1)
{
old_pin = old_pin.Remove(old_pin.Length - 1);
Console.Write("\b \b");
}
}
}
while (key.Key != ConsoleKey.Enter);
if (usr[i].usrPin == int.Parse(old_pin))
{
Console.Write("\n\t\t Enter new pin: ");
ConsoleKeyInfo key1;
old_pin = null;
do
{
key1 = Console.ReadKey(true);
if (key1.Key != ConsoleKey.Backspace)
{
old_pin += key1.KeyChar;
Console.Write("*");
}
else
{
if ((old_pin.Length - 1) != -1)
{
old_pin = old_pin.Remove(old_pin.Length - 1);
Console.Write("\b \b");
}
}
}
while (key1.Key != ConsoleKey.Enter);
Console.Write("\n\t\t Re-Enter new pin: ");
string cur_pin = ""; ;
do
{
key = Console.ReadKey(true);
if (key.Key != ConsoleKey.Backspace)
{
cur_pin += key.KeyChar;
Console.Write("*");
}
else
{
if ((cur_pin.Length - 1) != -1)
{
cur_pin = cur_pin.Remove(cur_pin.Length - 1);
Console.Write("\b \b");
}
}
}
while (key.Key != ConsoleKey.Enter);
if (int.Parse(old_pin) == int.Parse(cur_pin))
{
usr[i].usrPin = int.Parse(cur_pin);
record_mini_trx(i, dt.ToString("d"), 0, "CHANGE OF PIN");
UI_loading();
}
else
{
Start.UI_error("Both Pin doesn't match!");
return;
}
}
else
{
Start.UI_error("Incorrect Pin");
return;
}
}
catch (Exception)
{
}
}
}
public void record_trx(int i, string date, double bal, string mode)
{
record_mini_trx(i, date, bal, mode);
if (usr[i].Trx_count < 5)
{
usr[i].Trx_date[(usr[i].Trx_count)] = date;
usr[i].Trx_amt[(usr[i].Trx_count)] = bal;
usr[i].Trx_mode[(usr[i].Trx_count)] = mode;
usr[i].Trx_count++;
}
else
{
for (int k = 0; k < 4; k++)
{
usr[i].Trx_date[k] = usr[i].Trx_date[k + 1];
usr[i].Trx_amt[i] = usr[i].Trx_amt[k + 1];
usr[i].Trx_mode[i] = usr[i].Trx_mode[k + 1];
}
usr[i].Trx_date[4] = date;
usr[i].Trx_amt[4] = bal;
usr[i].Trx_mode[4] = mode;
}
}
public void record_mini_trx(int i, string date, double bal, string mode)
{
usr[i].Trx_mini_date[(usr[i].Trx_mini_count)] = date;
usr[i].Trx_mini_amt[(usr[i].Trx_mini_count)] = bal;
usr[i].Trx_mini_mode[(usr[i].Trx_mini_count)] = mode;
usr[i].Trx_mini_count++;
}
}
class Start
{
public static string mt = "\t\t\t";
public static string st = "\t\t ";
public static string xst = "\t\t";
static int count, mnuChoice = 0;
public static void header()
{
Console.Clear();
Console.WriteLine("\n\n\n\n\t\t====================================");
Console.WriteLine(mt + "Банк Космический");
Console.WriteLine("\t\t====================================");
}
public static void main_header()
{
Console.Clear();
Console.WriteLine("\n\n\t\t\t" + xst + ATM.dt.ToString("d") + "\n\t\t====================================");
Console.WriteLine(mt + "Банк Космический");
Console.WriteLine("\t\t====================================");
}
public static void footer()
{
Console.WriteLine("\t\t====================================");
}
public static void UI_home()
{
header();
Console.WriteLine("\n\n" + " Корпорация банкоматов Гибилинда Корп");
Console.WriteLine(mt + " Жизнь проста\n\n");
footer();
Console.Write(st + "Нажмите любую клавишуe:");
Console.ReadKey();
}
public static int UI_login(ref ATM u, ref int atm_no)
{
header();
Console.Write(st + "Введите номер карты: ");
try
{
bool check = false;
int i = 0;
int atm_numb = int.Parse(Console.ReadLine());
atm_no = atm_numb;
for (int j = 0; j < u.usr.Length; j++)
{
if (u.usr[j].atm_no == atm_numb)
{
check = true;
i = j;
}
}
if (check)
{
Console.Write(st + "Введите ваш PIN: ");
string acc_pin = ""; ;
ConsoleKeyInfo key;
do
{
key = Console.ReadKey(true);
if (key.Key != ConsoleKey.Backspace)
{
acc_pin += key.KeyChar;
Console.Write("*");
}
else
{
if ((acc_pin.Length - 1) != -1)
{
acc_pin = acc_pin.Remove(acc_pin.Length - 1);
Console.Write("\b \b");
}
}
}
while (key.Key != ConsoleKey.Enter);
if ((u.usr[i].usrPin == int.Parse(acc_pin)) && (u.usr[i].atm_no == atm_numb))
{
return 1;
}
else
{
u.usr[i].usrMaxTrail = count++;
if (u.usr[i].usrMaxTrail >= 2)
{
count = 0;
UI_error("Reached Maxed Limit of Trying");
Main();
}
else
{
return 2;
}
}
}
else
{ return 3; }
}
catch (Exception)
{
return -1;
}
return 0;
}
public static void UI_error(String error)
{
header();
Console.WriteLine("\n\n" + st + " Ошибка: " + error + "\n\n");
footer();
Console.Write(st + "Нажмите любую клавишу:");
Console.ReadKey();
}
public static void UI_msgbox(String msg)
{
header();
Console.WriteLine("\n\n" + st + msg + "\n\n");
footer();
Console.Write(st + "Нажмите любую клавишу:");
Console.ReadKey();
}
public static int UI_main(ref int atm_n)
{
ATM validUsr = new ATM();
string name = "";
main_header();
for (int i = 0; i < validUsr.usr.Length; i++)
{
if (validUsr.usr[i].atm_no == atm_n)
{
name = validUsr.usr[i].usrName;
}
}
Console.WriteLine(xst + "\tЗдраствуйте: " + name + ".\n");
Console.WriteLine(xst + "1.Депозит.\t\t2.Вывод средств.\n");
Console.WriteLine(xst + "3.Баланс.\t\t4.Перевод средств.\n");
Console.WriteLine(xst + "5.Краткая информация.\t6.Сменить Pin.\n");
Console.WriteLine(xst + "7.Последние 5 транзакций.\t8.Выйти.\n");
footer();
Console.Write(st + "Сделайте свой выбор: ");
try
{
int ch = int.Parse(Console.ReadLine());
return ch;
}
catch (Exception)
{
return -1;
}
}
public static void Main()
{
ATM a = new ATM();
SUDO_MAIN:
int getAtm_no = 0;
UI_home();
LOGIN:
int isValidLogin = UI_login(ref a, ref getAtm_no);
switch (isValidLogin)
{
case -1:
UI_error("Только цифры");
goto LOGIN;
case 1:
goto MAIN_MENU;
case 2:
UI_error("Неверный PIN");
goto LOGIN;
case 3:
UI_error("Неверный номер карты");
goto LOGIN;
default:
UI_error("Something Wrong in GUI_login()!");
Main();
break;
}
MAIN:
MAIN_MENU:
while (true)
{
mnuChoice = UI_main(ref getAtm_no);
switch (mnuChoice)
{
case -1:
UI_error("Только цифры");
goto MAIN;
case 1:
a.deposit(getAtm_no);
break;
case 2:
a.withdraw(getAtm_no);
break;
case 3:
a.balance(getAtm_no);
break;
case 4:
a.tnfr_fund(getAtm_no);
break;
case 5:
a.mini_stmt(getAtm_no, false);
break;
case 6:
a.chng_pin(getAtm_no);
break;
case 7:
a.mini_stmt(getAtm_no, true);
break;
case 8:
UI_msgbox("Thankyou for visting SPB ATM.\n");
GC.SuppressFinalize(a);
goto SUDO_MAIN;
default:
UI_error("Ошибка выбора! [1-8].");
Main();
break;
}
}
}
}
}
Размещено на Allbest.ru
...Подобные документы
Розробка програмного забезпечення для автоматизації процесів обслуговування клієнтів в агентстві нерухомості. Характеристика сутностей та атрибутів предметної області, проектування бази даних. Основні функції та лістинг програми, інтерфейс користувача.
курсовая работа [1,5 M], добавлен 10.06.2013Аналіз предметної області, опис проекту бази даних, моделей майбутнього програмного забезпечення гри для персонального комп'ютера "Міста". Функціональні можливості програмного забезпечення, які необхідно реалізувати. Інтерфейс програмного забезпечення.
курсовая работа [2,3 M], добавлен 02.06.2016Аналіз технічного забезпечення, вибір інструментального програмного забезпечення та середовища розробки програм. Створення класів для реалізації необхідних функцій для роботи програмного засобу. Розробка інтерфейсу для користувача та лістинг програми.
курсовая работа [343,9 K], добавлен 24.08.2012Розробка структури інструментального пакету для лабораторних робіт з інформатики на мові JavaScript: аналіз предметної області, написання алгоритму та вибір програмного забезпечення, розрахунок економічних показників готового програмного продукту.
дипломная работа [3,3 M], добавлен 16.09.2011Розробка програмного продукту в програмному середовищі C++ Builder на прикладі гри "Шахи". Опис предметної області: правила пересування фігур по шаховій дошці. Концептуальна модель програмного продукту. Керівництва для програміста та користувача.
отчет по практике [2,8 M], добавлен 27.02.2015Визначення вимог до програмного забезпечення. Проектування архітектури програми, структури даних та інтерфейсу. Програмування графічного редактора, специфікація його класів та алгоритм роботи. Зміна архітектури редактора згідно нових вимог замовника.
дипломная работа [1,2 M], добавлен 05.01.2014Проблеми розробки компонентного програмного забезпечення автоматизованих систем управління. Сучасні компонентні технології обробки інформації. Аналіз вибраного середовища проектування програмного забезпечення: мова програмування PHP та Apache HTTP-сервер.
дипломная работа [2,8 M], добавлен 11.05.2012Аналіз сучасних методів та технологій проектування програмного забезпечення. Вибір цільової мобільної платформи. Розробка екранних форм, діаграми класів. Вимоги до програмного продукту. Аналіз небезпечних факторів у відділі роботи з фізичними особами.
дипломная работа [508,1 K], добавлен 02.12.2015Місце і роль організацій та рухів у сучасному розвитку українського суспільства. Аналіз інформаційного забезпечення предметної області. Проектування структури інформаційної системи. Розробка структури інформаційної системи Громадська рада Запоріжжя.
дипломная работа [3,8 M], добавлен 08.12.2010Етапи розробки проекту. Вимоги до апаратного і програмного забезпечення, до користувача. Специфікація та структура даних, які мають бути розміщеними в системі. Вигляд інтерфейсу системи програмного забезпечення. Розробка бази даних косметичного салону.
дипломная работа [1,8 M], добавлен 21.02.2015Аналіз вимог до програмного забезпечення. Розробка структури бази даних, що дозволить реалізувати різноманітні операції для створення платіжного доручення. Розробка об’єктної моделі, алгоритмів та структури бази даних. Вибір засобу автоматизації.
курсовая работа [3,2 M], добавлен 30.01.2014Аналіз предметної області, розробка програмної прошивки контролера, приклад застосування компоненту розумного будинку. Класифікація вхідної і вихідної інформації у процесі здійснення проектувальних дій. Розробка програмного засобу для створення браузера.
курсовая работа [1,2 M], добавлен 16.05.2021Аналіз предметної області і постановка задачі на розробку програми для автоматизації роботи автопідприємства. Перелік та опис використаних компонентів та основних процедур програми. Опис структур та методів обробки даних. Інструкція для користувача.
курсовая работа [2,3 M], добавлен 15.02.2012Створення програмного забезпечення для управління продажем та орендою нерухомості. Аналіз роботи підприємства з продажу нерухомості; проектування системи взаємодії клієнта з продавцем; визначення вимог до програмного комплексу, який необхідно розробити.
курсовая работа [3,1 M], добавлен 08.07.2012Визначення та застосування фракталів. Огляд предметної області, вибір засобів розробки програмного забезпеченя. Побудова діаграми варіантів використання, послідовності дій, класів та компонентів, математичної моделі. Тестування програмного продукту.
дипломная работа [1,9 M], добавлен 24.05.2015Сутність та атрибути предметної області. Вимоги до програмного забезпечення серверної частини та до клієнтського програмного забезпечення. Встановлення программи Abobe Dreamviewer CS3. Рекомендації для встановлення базового пакету Denwer 3 на комп’ютер.
дипломная работа [6,3 M], добавлен 20.05.2012Узагальнена структурна схема інформаційної системи та алгоритми її роботи. Проект бази даних. Інфологічне проектування і дослідження предметної області. Розробка інфологічної моделі предметної області. Розробка композиційної, логічної системи бази даних.
курсовая работа [861,7 K], добавлен 21.02.2010Створення програми для роботи з веб-камерою з автоматичним визначенням встановленої камери на комп'ютері. Характеристика апаратної конфігурації програми. Опис мови і середовища програмування. Розробка алгоритму, інструкції для програміста та користувача.
курсовая работа [1,2 M], добавлен 26.07.2013Проблеми процесу тестування програмного забезпечення. Розробка алгоритму автоматичної генерації тестів і тестового набору для ручного виконання. Побудова тестів для системи "Банкомат" і для баг-трекінгової системи, представленої графом із циклами.
дипломная работа [1,2 M], добавлен 26.02.2014Розробка бази даних, що дозволяє автоматизувати операції обліку і процеси складання звітних документів, які мають створюватись у відділі кадрів. Можливості засобів СУБД Microsoft Access 2010. Користувальницький інтерфейс. Обстеження предметної області.
курсовая работа [1,6 M], добавлен 27.03.2013