Advertisement
Guest User

Untitled

a guest
Dec 18th, 2017
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.83 KB | None | 0 0
  1. // ConsoleApplication16.cpp : main project file.
  2.  
  3. //#include "stdafx.h"
  4. #include <iostream>
  5. #include <string>
  6. #include <iostream>
  7. #include <cmath>
  8.  
  9. using namespace std;
  10.  
  11. //ATM - Банкомат
  12. class ATM
  13. {
  14. private:
  15. int Id;
  16. int curentMoney;
  17. enum { max = 1000, min = 10 };
  18. public:
  19. ATM() {
  20. //cout << "Вызван конструктор без параметров" << endl;
  21. Id = 0;
  22. curentMoney = 0;
  23. } //конструктор по-умолчанию
  24. ATM(int _Id, int _curentMoney) {// конструктор с параметрами
  25. if (!isValueCorrect(_curentMoney)) {
  26. throw "Конструктору не понравились ваши данные!";
  27. }
  28. cout << "Вызван конструктор с параметрами" << endl;
  29. Id = _Id;
  30. curentMoney = _curentMoney;
  31. }
  32.  
  33. friend istream& operator>>(istream &t, ATM &r); // сигнатуры методов
  34. friend ostream& operator<<(ostream &t, const ATM &r);// реализация вне класса
  35.  
  36.  
  37. void setId(int _Id) { Id = _Id; } // инициализация добавления в банкомат
  38. int getId() { return Id; }// инициализация полученяи денег из банкомата
  39.  
  40. static bool isValueCorrect(int value) {
  41. if ((value < min) || (value > max)) { //проверка условий
  42. cout << "Извините, но max = 1000, min = 10";
  43. return false;
  44. }
  45. return true;
  46. }
  47. void InsertMoney(int moneyToInsert) { //добавление в банкомат
  48. if (!isValueCorrect(moneyToInsert)) { //проверка условий
  49. return;
  50. }
  51. if ((curentMoney + moneyToInsert) > max) {
  52. //если сумма будте больше макс, то заполнит только до макс
  53. cout << "Добавлено денег = " << max - curentMoney << endl;
  54. curentMoney = 1000;
  55. return;
  56. }
  57. curentMoney = curentMoney + moneyToInsert;
  58. //cout << "\nВ банке " << curentMoney << " д/е";
  59. //cout << this;
  60. }
  61. void getMoney(int money) { //получение
  62. if (!isValueCorrect(money)) {
  63. return;
  64. }
  65. if ((curentMoney - money) < 0) { //если сумма в банке меньше запрашиваемой, то нельзя снять
  66. cout << "Проблема" << endl
  67. << "Максимум получить: " << curentMoney << endl;
  68. }
  69. else {
  70. cout << "\nБыло снято " << money << " д/е\n";
  71. curentMoney -= money;
  72. }
  73. }
  74.  
  75.  
  76.  
  77.  
  78. void display() const {
  79. cout << "\nТекущие деньги в банкомате: " << toString(curentMoney) <<" д/е"<< endl;
  80. }
  81. // функция преобразует число в числительное в пределах от 0 до 1000
  82. string toString(int number) const {
  83. // записываем строковые константы
  84. const char *numbers1_20[21] = { "ноль","один", "два","три","четыре",
  85. "пять","шесть", "семь","восемь","девять","десять", "одиннадцать","двенадцать",
  86. "тринадцать","четырнадцать", "пятнадцать","шестнадцать",
  87. "семнадцать", "восемнадцать", "девятнадцать","двадцать" };
  88. const char *numbers10_90[9] = { "десять","двадцать","тридцать","сорок", "пятьдесят",
  89. "шестьдесят","семьдесят","восемьдесят","девяносто" };
  90. const char *numbers100_900[9] = { "сто","двести", "триста",
  91. "четыреста","пятьсот","шестьсот","семьсот","восемьсот","девятьсот" };
  92.  
  93. // % - остаток от деления
  94. // / - деление нацело
  95. int first = number % 10; // находим разряд единиц из трехзначного числа
  96. int second = (number / 10)%10;// находим разряд десятков из трехзначного числа
  97. int third = number / 100;// находим разряд сотен из трехзначного числа
  98. string result = "";
  99. if (number == 1000) {// вариает для тысячи
  100. return "тысяча";// возвращаем ответ и выходим из фунции
  101. }
  102. if (number <= 20) {// особый случай для чисел от 0 до 20
  103. result.append(numbers1_20[number]);
  104. return result;
  105. }
  106.  
  107. // формируем строку из трех частей - единицы, десятки, сотни
  108. if (third != 0) {// если разряд не ноль
  109. // метод append добавляет новую строку из параметра в текущую
  110. result.append(numbers100_900[third-1]); // берем значение из массива
  111. // значение разлличное и индекс массива зависит от значения в разряде
  112. // единицу вычитаем, потому-что нумерация в массивах начинается с нуля
  113. result.append(" ");
  114. }
  115. if (second != 0) {
  116. result.append(numbers10_90[second-1]);
  117. result.append(" ");
  118. }
  119. if (first != 0) {
  120. result.append(numbers1_20[first]);
  121. }
  122. return result;
  123. }
  124.  
  125. };
  126.  
  127. //выводим на экран обьект
  128. ostream& operator<<(ostream &t, const ATM &r)
  129. {
  130.  
  131. t << "\nБанкомат номер: "<<r.Id << ". Cумма в банкомате: " << r.toString(r.curentMoney) << endl;
  132. return t;
  133. }
  134.  
  135. // производим операцию добавления денег, считываем значение с клавиатуры
  136. istream& operator>>(istream &t, ATM &r)
  137. {
  138. int money;
  139. cout << "\nСколько хотите снять?: ";
  140. cin >> money;
  141. r.getMoney(money);
  142. return t;
  143. }
  144. int main()
  145. {
  146. setlocale(LC_ALL, "Rus");
  147.  
  148.  
  149.  
  150. ATM bank; //инициализация класса
  151. ATM banks[100];// создаем массив для сохранения банкоматов
  152.  
  153.  
  154.  
  155. // иницилизируем этот массив пустыми значениями
  156. for (int i = 0; i < 100; i++)
  157. {
  158. ATM newBank;
  159. newBank.setId(0);
  160.  
  161. banks[i] = newBank;
  162. }
  163. int findBankIndex = 0;// индекс найденого банкомата
  164. int banksAmount = 0;// количество реальных банкоматов в массиве
  165.  
  166. int id;
  167. int moneyToInsert; //доп переменные для добавления в класс
  168. int money;
  169. int endCycle = 1;
  170. bool isFind;// флаг того что такой банкомат уже был
  171. while (endCycle == 1) {
  172.  
  173. isFind = false;// обнуляем флаг
  174. cout << "Введите идентификатор банкомата :";
  175. cin >> id;
  176. cout << "\nВнести денег: ";
  177. cin >> moneyToInsert;
  178.  
  179. // ищем среди всех банкоматов нет ли банкомата с таким id
  180. for (int i = 0; i < 100; i++)
  181. {
  182. ATM newBank;// создаем переменную банкомат
  183. newBank = banks[i];// записываем туда очередной элмент из массива
  184. if (newBank.getId() == id) {// если этот элемент с таким же индексом как мы ввели
  185. bank = newBank;// теперь мы будем работать с этим банкоматом, сохраняем его в рабочуюю переменную
  186. isFind = true;// поднимаем флаг, говоря, что мы нашли банкомат
  187. findBankIndex = i; // запоминаем индекс банкомата в массиве, чтобы потом сохранить его обратно
  188. break;// в туже ячейку. дальше искать нет смысла поэтому выходим из цикла
  189. }
  190.  
  191. }
  192. if (isFind == false) {
  193. // если не нашли то создаем новый банкомат
  194. bank = ATM(id, moneyToInsert);
  195. }
  196.  
  197. else {
  198. cout << "Такой банкомат уже был\n";
  199. bank.InsertMoney(moneyToInsert);
  200. }
  201.  
  202. cout << bank;
  203.  
  204. cin >> bank;// просим снять
  205. cout << bank;
  206. cout << "\nПовторить?(1-да , 2-нет) ";
  207. cin >> endCycle;
  208.  
  209.  
  210. if (isFind == false) {// если не нашли то сохраняем в ячейки массива начиная с нуля
  211. banks[banksAmount] = bank;// изначально banksAmount = 0
  212. banksAmount++;// увеличивем переменную. следующий банкомат поместится в
  213. // следующию ячейку массива
  214. }
  215. else {//если банкомат уже был
  216. banks[findBankIndex] = bank;// то сохраняем его туда откуда взяли
  217. }
  218. }
  219.  
  220. return 0;
  221. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement