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

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

Восстановить пароль Регистрация
 
sergton
0 / 0 / 0
Регистрация: 25.06.2013
Сообщений: 42
25.06.2013, 01:13     Реализовать класс Bankomat #1
Реализовать класс Bankomat, моделирующий работу банкомата. В классе долж-ны содержаться поля для хранения идентификационного номера банкомата, информации о текущей сумме денег, оставшейся в банкомате, минимальной и максимальной суммах, которые позволяется снять клиенту в один день. Сумма денег представляется полями-номиналами 10-1000. Реализовать метод инициализации банкомата, метод загрузки купюр в банкомат и метод снятия определенной суммы денег. Метод снятия денег должен выполнять проверку на корректность снимаемой суммы: она не должна быть меньше минимального значения и не должна превышать максимальное значение.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
razor_ua
10 / 10 / 0
Регистрация: 20.05.2011
Сообщений: 71
25.06.2013, 01:23     Реализовать класс Bankomat #2
https://encrypted-tbn1.gstatic.com/i...pEqOQiiJXcuWPw

сойдет?
SergLIme
Сообщений: n/a
25.06.2013, 01:24     Реализовать класс Bankomat #3
хорошая реализация
sergton
0 / 0 / 0
Регистрация: 25.06.2013
Сообщений: 42
25.06.2013, 01:35  [ТС]     Реализовать класс Bankomat #4
Необходима реализация на С++. Буду примного благодарен.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
25.06.2013, 10:45     Реализовать класс Bankomat #5
Тестить на различных случаях было лень, так что может где и закралась ошибка.

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());
}
sergton
0 / 0 / 0
Регистрация: 25.06.2013
Сообщений: 42
20.08.2013, 15:48  [ТС]     Реализовать класс Bankomat #6
Цитата Сообщение от ForEveR Посмотреть сообщение
Тестить на различных случаях было лень, так что может где и закралась ошибка.

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());
}
Спасибо тебе огромное
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.08.2013, 14:15     Реализовать класс Bankomat
Еще ссылки по теме:

C++ BANKOMAT
Реализовать класс Bankomat, моделирующий работу банкомата C++
C++ Необходимо реализовать шаблонный класс Array, и грамотно реализовать push_back

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
lemegeton
 Аватар для lemegeton
2909 / 1338 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
21.08.2013, 14:15     Реализовать класс Bankomat #7
Просто так.
Наивная реализация, полный проход по купюрам.
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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
#include <iostream>
#include <iterator>
#include <list>
#include <algorithm>
#include <map>
#include <stdexcept>
 
class Atm {
 public:
  Atm() : cash(0), banknotes() {}
  void addBanknote(int banknoteValue) {
    std::list<int>::iterator insertPosition = std::lower_bound(
      banknotes.begin(), banknotes.end(), banknoteValue);
    banknotes.insert(insertPosition, banknoteValue);
  }
  void addBanknotes(const std::list<int> &banknotes) {
    std::list<int> orderedBanknotes(banknotes);
    orderedBanknotes.sort();
    this->banknotes.merge(orderedBanknotes);
    cash += calculateCash(banknotes);
  }
  const std::list<int> &listBanknotes() const {
    return banknotes;
  }
  bool containsAllBanknotes(const std::list<int> &banknotes) {
    std::list<int> orderedBanknotes(banknotes);
    orderedBanknotes.sort();
    return std::includes(this->banknotes.begin(), this->banknotes.end(),
      orderedBanknotes.begin(), orderedBanknotes.end());
  }
  void removeBanknotes(const std::list<int> &banknotes)  throw(std::runtime_error) {
    std::list<int> orderedBanknotes(banknotes);
    orderedBanknotes.sort();
    if (!std::includes(this->banknotes.begin(), this->banknotes.end(),
      orderedBanknotes.begin(), orderedBanknotes.end())) {
      throw std::runtime_error("Not all banknotes are available.");
    }
    for (std::list<int>::const_iterator i = orderedBanknotes.begin();
      i != orderedBanknotes.end(); ++i) {
      this->banknotes.erase(std::find(this->banknotes.begin(),
        this->banknotes.end(), *i));
    }
    cash -= calculateCash(banknotes);
  }
  long getCash() const {
    return cash;
  }
  bool canGetBanknotesForCash(long cash) {
    for (std::list<int>::const_reverse_iterator i = banknotes.rbegin();
      i != banknotes.rend(); ++i) {
      if (cash >= *i) {
        std::cout << "DEBUG: " << *i << ", cash = " << cash << std::endl;
        cash -= *i;
      }
    }
    return cash == 0;
  }
  std::list<int> getBanknotesForCash(long cash) {
    if (cash > cash || cash < 0) {
      throw std::runtime_error("Not enough banknotes.");
    }
    std::list<int> result;
    for (std::list<int>::const_reverse_iterator i = banknotes.rbegin();
      i != banknotes.rend(); ++i) {
      if (cash >= *i) {
        std::cout << "DEBUG: " << *i << ", cash = " << cash << std::endl;
        cash -= *i;
        result.push_back(*i);
      }
    }
    if (cash > 0) {
      throw std::runtime_error("Not enough banknotes to form requested cash.");
    }
    return result;
  }
 private:
  static long calculateCash(const std::list<int> &banknotes) {
    long cash = 0;
    for (std::list<int>::const_iterator i = banknotes.begin(); 
      i != banknotes.end(); ++i) {
      cash += *i;
    }
    return cash;
  }
  long cash;
  std::list<int> banknotes;
};
 
std::ostream &operator<<(std::ostream &stream, const std::list<int> &list) {
  std::list<int>::const_iterator i = list.begin();
  while (i != list.end()) {
    stream << *i;
    if (++i != list.end()) {
      stream << ", ";
    }
  }
  return stream;
}
 
std::ostream &operator<<(std::ostream &stream, const Atm &atm) {
  return stream << "Atm{banknotes=[" <<
    atm.listBanknotes() << "]}";
}
 
int main(int, char**) {
  Atm atm;
  
  atm.addBanknote(10);
  atm.addBanknote(100);
  atm.addBanknote(100);
  atm.addBanknote(100);
  atm.addBanknote(100);
  atm.addBanknote(1000);
  atm.addBanknote(1000);
  atm.addBanknote(1000);
  atm.addBanknote(1000);
  atm.addBanknote(10);
  atm.addBanknote(10);
  atm.addBanknote(10);
  atm.addBanknote(10);
  atm.addBanknote(50);
  atm.addBanknote(50);
  atm.addBanknote(50);
  atm.addBanknote(10);
  atm.addBanknote(500);
  atm.addBanknote(100);
 
  std::cout << atm << std::endl;
 
  int cash = 1700;
  try {
    if (atm.canGetBanknotesForCash(cash)) {
      std::list<int> banknotes = atm.getBanknotesForCash(cash);
      atm.removeBanknotes(banknotes);
      std::cout << "Here you are: " << banknotes << std::endl;
    } else {
      std::cout << "Not enough banknotes to pay out " << cash << std::endl;
    }
  } catch (std::exception &e) {
    std::cout << e.what();
  }
}
Yandex
Объявления
21.08.2013, 14:15     Реализовать класс Bankomat
Ответ Создать тему
Опции темы

Текущее время: 12:59. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru