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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
sergton
0 / 0 / 0
Регистрация: 25.06.2013
Сообщений: 42
#1

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

25.06.2013, 01:13. Просмотров 903. Ответов 6
Метки нет (Все метки)

Реализовать класс Bankomat, моделирующий работу банкомата. В классе долж-ны содержаться поля для хранения идентификационного номера банкомата, информации о текущей сумме денег, оставшейся в банкомате, минимальной и максимальной суммах, которые позволяется снять клиенту в один день. Сумма денег представляется полями-номиналами 10-1000. Реализовать метод инициализации банкомата, метод загрузки купюр в банкомат и метод снятия определенной суммы денег. Метод снятия денег должен выполнять проверку на корректность снимаемой суммы: она не должна быть меньше минимального значения и не должна превышать максимальное значение.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.06.2013, 01:13
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Реализовать класс Bankomat (C++):

Реализовать класс Bankomat - C++
Реализовать класс Bankomat моделирующий работу банкомата. В классе должны содержатся поля для хранения идентификационного номера банкомата,...

Реализовать класс bankomat - C++
помогите пожалуйста...я совершенно не представляю себе работу с классами а тут такая задачка( реализовать класс Bankomat моделирующий...

Реализовать класс Bankomat моделирующий работу банкомата. - C++
Реализовать класс Bankomat моделирующий работу банкомата. В классе должны содержатся поля для хранения идентификационного номера банкомата,...

Реализовать класс Bankomat, моделирующий работу банкомата - C++
Ребят беда, такая интересная задачка попалась мне, вроде ничего особенного но посмотрев глубже показалось очень тяжкой, половина реализаций...

Необходимо реализовать шаблонный класс Array, и грамотно реализовать push_back - C++
Необходимо реализовать шаблонный класс Array, параметризируемый типом хранимых элементов. Класс Array представляет собой...

Реализовать класс Goods используя для представления цены класс Money - C++
Реализовать класс Goods (пункт 1 ), используя для представления цены класс Money с пункта 2 Реализовать метод уценки товара, уменьшая цену...

6
razor_ua
10 / 10 / 0
Регистрация: 20.05.2011
Сообщений: 71
25.06.2013, 01:23 #2
https://encrypted-tbn1.gstatic.com/i...pEqOQiiJXcuWPw

сойдет?
0
SergLIme
Сообщений: n/a
25.06.2013, 01:24 #3
хорошая реализация
sergton
0 / 0 / 0
Регистрация: 25.06.2013
Сообщений: 42
25.06.2013, 01:35  [ТС] #4
Необходима реализация на С++. Буду примного благодарен.
0
ForEveR
В астрале
Эксперт С++
7979 / 4738 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
25.06.2013, 10:45 #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());
}
1
sergton
0 / 0 / 0
Регистрация: 25.06.2013
Сообщений: 42
20.08.2013, 15:48  [ТС] #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());
}
Спасибо тебе огромное
0
lemegeton
2925 / 1354 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
21.08.2013, 14:15 #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();
  }
}
1
21.08.2013, 14:15
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.08.2013, 14:15
Привет! Вот еще темы с ответами:

Класс Matrix: реализовать шаблонный класс для двумерных массивов - C++
Доброго времени суток. У меня вопрос: я создал класс Array со внутренним динамическим массивом и объекты этого типа смог создать и я ими...

Реализовать класс Triangle (задание 25), опираясь на класс Angle из задания 26 для представления углов - C++
Реализовать класс Triangle (задание 25), опираясь на класс Angle из задания 26 для представления углов. Собственно вот такая проблема. Не...

Реализовать пользовательские типы: класс Person и класс String - C++
1)Разработать класс Person, который содержит соответствующие члены для хранения: имени, возраста, пола и телефонного номера. ...

Реализовать класс Money, используя класс Fraction - C++
// реализовать класс Money используя класс Fraction #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;sstream&gt; #include...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru