Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.09.2023, 23:48   #1
A7A7A7
Новичок
Джуниор
 
Регистрация: 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();
}
A7A7A7 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа банкомата(Помогите) 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