Форум программистов, компьютерный форум CyberForum.ru

Реализовать класс Bankomat - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Перегрузка >> http://www.cyberforum.ru/cpp-beginners/thread911269.html
Доброго времени суток. Есть учебный пример перегрузки операций >> и <<. #include "stdafx.h" #include <iostream> using namespace std; class PhoneNumber { public: friend ostream &operator << (ostream &, const PhoneNumber &);
C++ Описать структуру с именем BAZA Описать структуру с именем BAZA, содержащую следующие поля: фамилия, имя, отчество, домашний адрес, год рождения, место работы, должность, размер зарплаты. Написать программу, выполняющую следующие действия: Ввод с клавиатуры данных в массив, состоящий из восьми элементов типа BAZA, вывод на экран информации о человеке, чья фамилия введена с клавиатуры. Упорядочить структуры по возрасту (по... http://www.cyberforum.ru/cpp-beginners/thread911261.html
C++ Структура-пара
Поле first — дробное число; поле second — целое полож. число, показатель степени. Реализовать метод Power() — возведение числа first в степень second. Метод должен правильно работать при любых допустимых значениях first и second. Примерная реализация: #include <iostream.h> #include <conio.h> #include <math.h> struct Para { void Read(); void Display();
Пожскажите с функцией sort() или qsort() C++
Есть программа, которая генерирует случайно 10 неповторяющихся чисел от 1 до 10 и записывает их в массив array, вот код: #include<iostream> #include<time.h> using namespace std; int main() { int i,array,pointer,max=0,j; srand(time(NULL)); for(i=0;i<10;i++) {
C++ Описать структуру с именем ZNAK http://www.cyberforum.ru/cpp-beginners/thread911241.html
Описать структуру с именем ZNAK, содержащую следующие поля: фамилия, имя, знак зодиака, дата рождения (массив из трёх чисел). Написать программу, выполняющую следующие действия: Ввод с клавиатуры данных в массив, состоящий из восьми структур типа ZNAK, вывод на экран информации о человеке, чья фамилия введена с клавиатуры. Упорядочить структуры по алфавиту (фамилии).
C++ Распараллеливание циклов Возникли трудности с освоением OpenMP Непонимаю, почему если закоментировать вот этот фрагмент кода, то программа работает вы разы быстрее: //from #pragma omp parallel for schedule(dynamic, pieces) for (int i = 0; i < size; i++) for (int j = 0; j < size; j++) temp = matrix; #pragma omp parallel for schedule(dynamic, pieces) подробнее

Показать сообщение отдельно
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
25.06.2013, 10:45     Реализовать класс Bankomat
Тестить на различных случаях было лень, так что может где и закралась ошибка.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#include <iostream>
#include <map>
#include <stdexcept>
#include <cassert>
 
class ATMFactory;
 
class ATM
{
public:
   friend class ATMFactory;
   std::map<int, int> get_money(int64_t amount)
   {
      if (amount >= min_amount && amount <= max_amount)
      {
         return calculate(amount);
      }
      throw std::out_of_range("invalid_amount. Less than " + std::to_string(min_amount) + 
            " or more than " + std::to_string(max_amount));
   }
   int get_id() const
   {
      return id_;
   }
   enum monetary_unit { TEN = 10, FIFTY = 50, HUNDRED = 100, FIVE_HUNDRED = 500, THOUSAND = 1000 };
private:
   ATM(int id, int64_t min, int64_t max) :
      id_(id), min_amount(min), max_amount(max)
   {
   }
 
   void load_money(int ten, int fifty, int hundred, int five_hundred, int thousand)
   {
      money[TEN] = ten;
      money[FIFTY] = fifty;
      money[HUNDRED] = hundred;
      money[FIVE_HUNDRED] = five_hundred;
      money[THOUSAND] = thousand;
   }
 
   int64_t calculate_current(int64_t amount, std::map<int, int>& result, monetary_unit unit)
   {
      while (amount >= unit)
      {
         int cnt = amount / unit;
         if (money[unit] < cnt)
         {
            break;
         }
         result[unit] = cnt;
         money[unit] -= cnt;
         amount %= unit;
      }
      return amount;
   }
 
   std::map<int, int> calculate(int64_t amount)
   {
      if (amount % TEN)
      {
         throw std::invalid_argument("invalid_amount. Can't div to " + std::to_string(TEN));
      }
      std::map<int, int> result;
      amount = calculate_current(amount, result, THOUSAND);
      amount = calculate_current(amount, result, FIVE_HUNDRED);
      amount = calculate_current(amount, result, HUNDRED);
      amount = calculate_current(amount, result, FIFTY);
      amount = calculate_current(amount, result, TEN);
      return result;
   }
 
   const int id_;
   std::map<int, int> money;
   const int64_t min_amount;
   const int64_t max_amount;
};
 
class ATMFactory
{
public:
   static ATM create(int64_t min, int64_t max, int ten, int fifty, int hundred, int five_hundred, int thousand)
   {
      static int id = 0;
      ATM result(id++, min, max);
      result.load_money(ten, fifty, hundred, five_hundred, thousand);
      return result;
   }
};
 
int main()
{
   ATM test_atm = ATMFactory::create(0, 5000, 1, 1, 1, 1, 1);
   assert(test_atm.get_id() == 0);
   std::map<int, int> money = test_atm.get_money(1660);
   assert(money[ATM::TEN] == 1 && money[ATM::FIFTY] == 1 && money[ATM::HUNDRED] == 1 &&
          money[ATM::FIVE_HUNDRED] == 1 && money[ATM::THOUSAND] == 1);
   money = test_atm.get_money(10);
   assert(money.empty());
}
 
Текущее время: 15:47. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru