Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // ConsoleApplication16.cpp : main project file.
- //#include "stdafx.h"
- #include <iostream>
- #include <string>
- #include <iostream>
- #include <cmath>
- using namespace std;
- //ATM - Банкомат
- class ATM
- {
- private:
- int Id;
- int curentMoney;
- enum { max = 1000, min = 10 };
- public:
- ATM() {
- //cout << "Вызван конструктор без параметров" << endl;
- Id = 0;
- curentMoney = 0;
- } //конструктор по-умолчанию
- ATM(int _Id, int _curentMoney) {// конструктор с параметрами
- if (!isValueCorrect(_curentMoney)) {
- throw "Конструктору не понравились ваши данные!";
- }
- cout << "Вызван конструктор с параметрами" << endl;
- Id = _Id;
- curentMoney = _curentMoney;
- }
- friend istream& operator>>(istream &t, ATM &r); // сигнатуры методов
- friend ostream& operator<<(ostream &t, const ATM &r);// реализация вне класса
- void setId(int _Id) { Id = _Id; } // инициализация добавления в банкомат
- int getId() { return Id; }// инициализация полученяи денег из банкомата
- static bool isValueCorrect(int value) {
- if ((value < min) || (value > max)) { //проверка условий
- cout << "Извините, но max = 1000, min = 10";
- return false;
- }
- return true;
- }
- void InsertMoney(int moneyToInsert) { //добавление в банкомат
- if (!isValueCorrect(moneyToInsert)) { //проверка условий
- return;
- }
- if ((curentMoney + moneyToInsert) > max) {
- //если сумма будте больше макс, то заполнит только до макс
- cout << "Добавлено денег = " << max - curentMoney << endl;
- curentMoney = 1000;
- return;
- }
- curentMoney = curentMoney + moneyToInsert;
- //cout << "\nВ банке " << curentMoney << " д/е";
- //cout << this;
- }
- void getMoney(int money) { //получение
- if (!isValueCorrect(money)) {
- return;
- }
- if ((curentMoney - money) < 0) { //если сумма в банке меньше запрашиваемой, то нельзя снять
- cout << "Проблема" << endl
- << "Максимум получить: " << curentMoney << endl;
- }
- else {
- cout << "\nБыло снято " << money << " д/е\n";
- curentMoney -= money;
- }
- }
- void display() const {
- cout << "\nТекущие деньги в банкомате: " << toString(curentMoney) <<" д/е"<< endl;
- }
- // функция преобразует число в числительное в пределах от 0 до 1000
- string toString(int number) const {
- // записываем строковые константы
- const char *numbers1_20[21] = { "ноль","один", "два","три","четыре",
- "пять","шесть", "семь","восемь","девять","десять", "одиннадцать","двенадцать",
- "тринадцать","четырнадцать", "пятнадцать","шестнадцать",
- "семнадцать", "восемнадцать", "девятнадцать","двадцать" };
- const char *numbers10_90[9] = { "десять","двадцать","тридцать","сорок", "пятьдесят",
- "шестьдесят","семьдесят","восемьдесят","девяносто" };
- const char *numbers100_900[9] = { "сто","двести", "триста",
- "четыреста","пятьсот","шестьсот","семьсот","восемьсот","девятьсот" };
- // % - остаток от деления
- // / - деление нацело
- int first = number % 10; // находим разряд единиц из трехзначного числа
- int second = (number / 10)%10;// находим разряд десятков из трехзначного числа
- int third = number / 100;// находим разряд сотен из трехзначного числа
- string result = "";
- if (number == 1000) {// вариает для тысячи
- return "тысяча";// возвращаем ответ и выходим из фунции
- }
- if (number <= 20) {// особый случай для чисел от 0 до 20
- result.append(numbers1_20[number]);
- return result;
- }
- // формируем строку из трех частей - единицы, десятки, сотни
- if (third != 0) {// если разряд не ноль
- // метод append добавляет новую строку из параметра в текущую
- result.append(numbers100_900[third-1]); // берем значение из массива
- // значение разлличное и индекс массива зависит от значения в разряде
- // единицу вычитаем, потому-что нумерация в массивах начинается с нуля
- result.append(" ");
- }
- if (second != 0) {
- result.append(numbers10_90[second-1]);
- result.append(" ");
- }
- if (first != 0) {
- result.append(numbers1_20[first]);
- }
- return result;
- }
- };
- //выводим на экран обьект
- ostream& operator<<(ostream &t, const ATM &r)
- {
- t << "\nБанкомат номер: "<<r.Id << ". Cумма в банкомате: " << r.toString(r.curentMoney) << endl;
- return t;
- }
- // производим операцию добавления денег, считываем значение с клавиатуры
- istream& operator>>(istream &t, ATM &r)
- {
- int money;
- cout << "\nСколько хотите снять?: ";
- cin >> money;
- r.getMoney(money);
- return t;
- }
- int main()
- {
- setlocale(LC_ALL, "Rus");
- ATM bank; //инициализация класса
- ATM banks[100];// создаем массив для сохранения банкоматов
- // иницилизируем этот массив пустыми значениями
- for (int i = 0; i < 100; i++)
- {
- ATM newBank;
- newBank.setId(0);
- banks[i] = newBank;
- }
- int findBankIndex = 0;// индекс найденого банкомата
- int banksAmount = 0;// количество реальных банкоматов в массиве
- int id;
- int moneyToInsert; //доп переменные для добавления в класс
- int money;
- int endCycle = 1;
- bool isFind;// флаг того что такой банкомат уже был
- while (endCycle == 1) {
- isFind = false;// обнуляем флаг
- cout << "Введите идентификатор банкомата :";
- cin >> id;
- cout << "\nВнести денег: ";
- cin >> moneyToInsert;
- // ищем среди всех банкоматов нет ли банкомата с таким id
- for (int i = 0; i < 100; i++)
- {
- ATM newBank;// создаем переменную банкомат
- newBank = banks[i];// записываем туда очередной элмент из массива
- if (newBank.getId() == id) {// если этот элемент с таким же индексом как мы ввели
- bank = newBank;// теперь мы будем работать с этим банкоматом, сохраняем его в рабочуюю переменную
- isFind = true;// поднимаем флаг, говоря, что мы нашли банкомат
- findBankIndex = i; // запоминаем индекс банкомата в массиве, чтобы потом сохранить его обратно
- break;// в туже ячейку. дальше искать нет смысла поэтому выходим из цикла
- }
- }
- if (isFind == false) {
- // если не нашли то создаем новый банкомат
- bank = ATM(id, moneyToInsert);
- }
- else {
- cout << "Такой банкомат уже был\n";
- bank.InsertMoney(moneyToInsert);
- }
- cout << bank;
- cin >> bank;// просим снять
- cout << bank;
- cout << "\nПовторить?(1-да , 2-нет) ";
- cin >> endCycle;
- if (isFind == false) {// если не нашли то сохраняем в ячейки массива начиная с нуля
- banks[banksAmount] = bank;// изначально banksAmount = 0
- banksAmount++;// увеличивем переменную. следующий банкомат поместится в
- // следующию ячейку массива
- }
- else {//если банкомат уже был
- banks[findBankIndex] = bank;// то сохраняем его туда откуда взяли
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement