|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
15.09.2023, 23:48 | #1 |
Новичок
Джуниор
Регистрация: 15.09.2023
Сообщений: 1
|
Реализация симуляции банкомата
Требуется реализовать упрощённую симуляцию работы банкомата. В банкомате могут храниться только бумажные купюры номиналом от 100 до 5000 рублей. Максимально в банкомате может храниться только 1000 купюр. Все они записываются в отдельный файл. У банкомата, как у устройства, две основных операции — снятие денег пользователем и наполнение деньгами инкассаторами банка.
Наполнение банкомата происходит, если при старте программы в консоль вводится символ плюс “+”. Количество купюр рассчитывается так, чтобы банкомат был заполнен полностью. Все купюры при этом выбираются случайным образом. Если на старте программы в консоль вводится минус (“-”), то симулируется снятие пользователем денег. Пользователь указывает сумму с точностью до 100 рублей. Мы будем считать, что каждый клиент обладает неограниченным балансом в системе и теоретически может снять любую сумму. На практике, если данная сумма не может быть снята из-за отсутствия подходящих денег в машине, показывается сообщение, что эта операция невозможна. После выполнения любой из операций программа завершает выполнение. Состояние банкомата должно храниться в отдельном бинарном файле, автономно. По сути все, что требуется я реализовал, остаются некоторые уточнения в которых я начинаю путаться: 1) При старте программа проверяет наличие файла .bin - если он есть(данные по банкомату были сохранены), данные загружаются и на экран выдается информация о текущем состоянии банкомата: каких купюр сколько, и общая сумма. Если файла нет - банкомат "пустой". 2) При "+" заполняются недостающие купюры и выдается информация о текущем состоянии банкомата: каких купюр сколько, и общая сумма. 3) При "-", запрашиваем сумму, выдаем/нет, и выдаем информация о текущем состоянии банкомата: каких купюр сколько, и общая сумма. 4) При выходе из программы, сохраняем состояние банкомата в файл. Выход из программы лучше сделать по отдельной команде, а команды +/- получать в цикле. 5)Корректное использование бинарного файла Если не затруднит, прошу исправить части моего кода в ряду этих уточнений: #include <iostream> #include <fstream> #include <ctime> using namespace std; const int BILLS[] = {100, 200, 500, 1000, 2000, 5000}; void countAllBills(int bills[], int * billsCount) { for (int i = 0; i < 1000; ++i) { switch (bills[i]) { case 5000: billsCount[5]++; break; case 2000: billsCount[4]++; break; case 1000: billsCount[3]++; break; case 500: billsCount[2]++; break; case 200: billsCount[1]++; break; case 100: billsCount[0]++; break; } } } void billWithdrawal (int * bills, int count, int denomination) { for (int i = 0; i < count; ++i) { int j = 0; while (bills[j] != denomination) { ++j; } bills[j] = 0; } } bool isWithdrawalPossible(int sum, int * bills) { int billsCount[6]; billsCount[5] = sum / 5000; sum %= 5000; billsCount[4] = sum / 2000; sum %= 2000; billsCount[3] = sum / 1000; sum %= 1000; billsCount[2] = sum / 500; sum %= 500; billsCount[1] = sum / 200; sum %= 200; billsCount[0] = sum / 100; sum %= 100; int billsInAtm[] = {0, 0, 0, 0, 0, 0}; countAllBills(bills, billsInAtm); if (sum == 0) { if (billsCount[5] <= billsInAtm[5] && billsCount[4] <= billsInAtm[4] && billsCount[3] <= billsInAtm[3] && billsCount[2] <= billsInAtm[2] && billsCount[1] <= billsInAtm[1] && billsCount[0] <= billsInAtm[0]) { for (int i = 0; i < 6; ++i) { billWithdrawal(bills, billsCount[i], BILLS[i]); } return true; } } else { return false; } } int main() { ofstream atm_out("atm.txt", ios::app); ifstream atm_in("atm.txt", ios::binary); if (!atm_out.is_open() || !atm_in.is_open()) { cout << "Could not open the file\n"; return 0; } char operation; cin >> operation; if (operation == '+') { srand(time(nullptr)); string str; for (int i = 0; i < 1000; ++i) { atm_in >> str; if (atm_in.eof()) { atm_out << BILLS[rand() % 6] << "\n"; } } } else if (operation == '-') { int billsInAtm[1000]; for (int i = 0; !atm_in.eof() ; ++i) { atm_in >> billsInAtm[i]; } int withdrawal; cout << "Enter a withdrawal:" << endl; cin >> withdrawal; if (isWithdrawalPossible(withdrawal, billsInAtm)) { cout << "You withdrawn a " << withdrawal << " amount of money\n"; atm_out.close(); atm_out.open("atm.txt"); if (!atm_out.is_open()) { cout << "Could not open the file\n"; return 0; } for (int i = 0; i < 1000; ++i) { if (billsInAtm[i] == 0 || (billsInAtm[i] != BILLS[0] && billsInAtm[i] != BILLS[1] && billsInAtm[i] != BILLS[2] && billsInAtm[i] != BILLS[3] && billsInAtm[i] != BILLS[4] && billsInAtm[i] != BILLS[5])) { continue; } atm_out << billsInAtm[i] << "\n"; } } else { cout << "ATM cannot process this operation\n"; } } atm_out.close(); atm_in.close(); } |
Опции темы | Поиск в этой теме |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Программа банкомата(Помогите) | AndersonOficial | Паскаль, Turbo Pascal, PascalABC.NET | 1 | 21.12.2016 16:02 |
задача Работа банкомата | LVM | Общие вопросы C/C++ | 12 | 08.09.2015 20:05 |
Технологии симуляции жизни в играх | Человек_Борща | Свободное общение | 6 | 22.11.2013 14:59 |
Verilog, только для симуляции или нечто большее? | Ivan_32 | Свободное общение | 0 | 28.08.2010 10:29 |