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

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

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

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

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

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

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

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

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

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

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

Bankomat: найти ошибки в коде и прокомментировать его строки - C++
Пормогите найти ошибку в коде и напишите коменты что где и что делает #include <iostream> #include <map> #include <stdexcept> ...

Реализовать класс - C++
Срочно помогите пжл, сижу на контрольной) надо написать реализацию класса Animal с информацией о животном и примером применения

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 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++
Реализовать класс «Правильная треугольная пирамида». Поля класса должны содержать информацию о ребре основания и боковом ребре. Разработать...

Реализовать шаблонный класс - C++
В общем требуется реализовать шаблонный класс FixedArray&lt;T,N&gt; FixedArray - абстракция вокруг T Использование выглядит как...

Реализовать через класс - C++
Дан целочисленный массив. Найти индекс первого максимального элемента и найти количество элементов, между первым и последним элементом

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

Реализовать класс money - C++
Номиналы российских рублей могут принимать значения 1, 2, 5, 10, 50, 100, 500, 1000, 5000. Копейки представить как 0.01 (1 копейка), 0.05...


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

Или воспользуйтесь поиском по форуму:
lemegeton
2918 / 1347 / 134
Регистрация: 29.11.2010
Сообщений: 2,721
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
Ответ Создать тему
Опции темы

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