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

Создать класс Money - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 5.00
Slight
0 / 0 / 0
Регистрация: 27.12.2013
Сообщений: 36
21.03.2014, 07:35     Создать класс Money #1
Задача:
Создать класс Money для работы с денежными суммами.Число должно быть представлено двумя полями: типом long для рублей и типом unsigned char - для копеек. дробная часть(копейки) при выводе на экран должна быть отделена от целой части запятойю реализовать сложение,вычитание, деление сумм, деление суммы на дробное число, умножение на дробное число и операцию сравнения.

В чем требуется помощь:
1.Написать функцию, которая бы после выполнения операции корректно перевела копейки в рубли(если будет большая сумма копеек, выходящая за рамки копеек) и прибавила их к рублям
2.Помочь с операциями деление сумм, деление суммы на дробное число, умножение на дробное число и операцию сравнения.
3. Помочь разобраться с методом toString

Мой вариант
Програмка в вот такой форме

main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include "money.h"
#include<iostream>
#include<string>
#include<sstream>
 
using namespace std;
 
int main()
{
    money A, B;
 
        std::cout << "\nEnter first summ in format 'roubles'.'copecks':\t";
        std::cin >> A;
        std::cout << "Enter second summ in format 'roubles'.'copecks'':\t";
        std::cin >> B;
        std::cout << "Sum:\t\t" << (A+B) << std::endl;
        std::cout << "Raznost:\t\t" << ( A - B ) << std::endl;
        std::cout << "Delenien:\t\t" << ( A / B ) << std::endl;
 
cout << " to str: " << A.toString() << endl;
 
       return 0;
}
money.h

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
#ifndef MONEY
#define MONEY
#include <iostream>
 
using namespace std;
class money
{
  long roubles;
  unsigned int copecks;
 
 
public:
 std::string toString() const;
    friend istream &operator >>(istream &in,money &A); //Ввод
    friend ostream &operator <<(ostream &out,money A);  //Вывода
    friend money operator+(money A,money B);   //Сложение
    friend money operator-(money A,money B);   //Вычитание
    friend money operator/(money A,money B);
    string operator!();  //в строку
 
    //money add(money& other);
 
};
#endif
money.cpp
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
#include "money.h"
#include<iostream>
#include<string>
#include<sstream>
#include<cmath>
#include <iostream>
#include <iomanip>
#include <limits>
using namespace std;
 
   //Вводим данные
istream &operator>>(istream &in,money &A) {
    in >> A.roubles >> A.copecks;
    return in;
}
//Выводим
ostream &operator<<(ostream &out, money A) {
    out<<"Roubles: "<< A.roubles <<"; Copecks: "<<A.copecks<<endl;
    return out;
 
}
    //Складываем
        money operator+(money B, money A)
        { money temp;
            temp.copecks=A.copecks+B.copecks;
            temp.roubles=(A.roubles+B.roubles);
            return temp;
                }
 
             //Вычитаем
              money operator-(money A, money B)
            { money temp;
                temp.copecks=B.copecks-A.copecks;
                temp.roubles=(B.roubles-A.roubles);
                return temp; }
 
 
            std::string money::toString() const {
    std::ostringstream oss;
    oss<<"Roubles: "<<roubles<<"; Copecks: "<<copecks<<endl;
    return oss.str();
}
 
 
 
            //Делим
                money operator/(money A, money B)
                {     money temp;
                    if(A.roubles!=0 && A.copecks!=0)
                    {
                        temp.copecks=B.copecks/A.copecks;
                        temp.roubles=B.roubles/A.roubles;
                    }
                return temp;}
Добавлено через 3 часа 12 минут
Поможете?

Добавлено через 10 часов 23 минуты
Up =))))
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
21.03.2014, 11:04     Создать класс Money #2
Цитата Сообщение от Slight Посмотреть сообщение
Написать функцию, которая бы после выполнения операции корректно перевела копейки в рубли(если будет большая сумма копеек, выходящая за рамки копеек) и прибавила их к рублям
C++
1
2
3
4
5
void transform(unsigned int fullcopecs)
{
    roubles = fullcopecs / 100;
    copecs = fullcopecs % 100;
}
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
21.03.2014, 11:26     Создать класс Money #3
Slight, Концепция класса не верная, перепишите его используя идею John Prick, все действия производите с переменной (private) fullcopecs, а на печать рубли/копейки выводите как показал John Prick. Тогда Ваш класс должен содержать будет 3 конструктора.
Slight
0 / 0 / 0
Регистрация: 27.12.2013
Сообщений: 36
21.03.2014, 11:58  [ТС]     Создать класс Money #4
Помогите с реализацией, мне нужно оформить программу по такому типу с перегрузкой операторов, ну их вроде перегрузил
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
21.03.2014, 16:42     Создать класс Money #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
100
101
102
103
104
105
106
107
108
109
110
111
112
#include<iostream>
#include<string>
#include<sstream>
#include<cmath>
#include <iostream>
#include <iomanip>
#include <limits> 
 
using namespace std;
class money
{
private:
int fullcopecs;
 
 
public:
 std::string toString() const;
    money() {fullcopecs=0;}
    money(unsigned int a){fullcopecs=a;}
    money(unsigned int r, unsigned int c){fullcopecs=r*100+c;}
    friend istream &operator >>(istream &in,money &A); //Ввод
    friend ostream &operator <<(ostream &out,money A);  //Вывода
    friend money operator+(money A,money B);   //Сложение
    friend money operator-(money A,money B);   //Вычитание
    friend int operator/(money A,money B); //Если делишь кучку денег на кучку денег, то по идеи должно получиться число кучек (а не новая кучка)
    friend money operator/(money A,int B); //Если делишь кучку денег на число кучек, то по идеи должна получиться новая кучка
    string operator!();  //в строку
 
    //money add(money& other);
 
};
 
 
using namespace std;
 
   //Вводим данные
istream &operator>>(istream &in,money &A) {
    unsigned int roubles, copecks;
    in >>roubles >> copecks;
    A.fullcopecs =roubles*100+copecks;
    return in;
}
//Выводим
ostream &operator<<(ostream &out, money A) 
{
    unsigned int roubles, copecks;
    roubles=A.fullcopecs/100;
    copecks=A.fullcopecs%100;
    out<<"Roubles: "<< roubles <<"; Copecks: "<<copecks<<endl;
    return out;
 
}
    //Складываем
money operator+(money B, money A)
{ 
    money temp;
    temp.fullcopecs =A.fullcopecs+B.fullcopecs; 
    return temp;
}
 
             //Вычитаем
money operator-(money A, money B)
{
    money temp;
    temp.fullcopecs= A.fullcopecs-B.fullcopecs; 
    return temp; 
}
 
 
string money::toString() const 
{
    ostringstream oss;
    unsigned int roubles, copecks;
    roubles=fullcopecs/100;
    copecks=fullcopecs%100;
    oss<<"Roubles: "<<roubles<<"; Copecks: "<<copecks<<endl;
    return oss.str();
}
 
 
 
            //Делим
int operator/(money A, money B)
{   
    unsigned int temp=0;
    if(B.fullcopecs!=0) temp=A.fullcopecs /B.fullcopecs;
    return temp;
}
 
money operator/(money A, int B)
{   
    money temp;
    if(B!=0) temp.fullcopecs =A.fullcopecs/B;
    return temp;
}
 
int main()
{
    money A, B;
 
        cout << "\nEnter first summ in format 'roubles'.'copecks':\t";
        cin >> A;
        cout << "Enter second summ in format 'roubles'.'copecks'':\t";
        cin >> B;
        cout << "Sum:\t\t" << (A+B) << endl;
        cout << "Raznost:\t\t" << ( A - B ) <<endl;
        cout << "Delenien:\t\t" << ( A / B ) <<" chasti" << endl;
        cout << "Delenien na 4 chasti:\t\t" << ( A / 4 ) <<" chasti" << endl;
        cout << " to str: " << A.toString() << endl;
        system ("pause");
       return 0;
}
Добавлено через 2 часа 23 минуты
Цитата Сообщение от Slight Посмотреть сообщение
2.Помочь с операциями деление сумм, деление суммы на дробное число, умножение на дробное число и операцию сравнения.
3. Помочь разобраться с методом toString
Учтите это я не правил.... Я лишь поправил подход, ну а с этим разберетесь по аналогии
Slight
0 / 0 / 0
Регистрация: 27.12.2013
Сообщений: 36
21.03.2014, 18:48  [ТС]     Создать класс Money #6
Сделал, спасибо. Просто неправильно понял задачу
Хотелось бы еще спросить насчет сравнения. как я его должен использовать.
C++
1
2
bool money::operator==(const money& that) const {
    return (fullcopecs == that.fullcopecs);}
перегрузил
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
21.03.2014, 19:08     Создать класс Money #7
Да, правильно понимаете, аналогично реализуйте != а также:
C++
1
2
3
4
5
6
7
8
friend money operator*(money A,int B);
 
money operator*(money A, int B)
{   
    money temp;
     temp.fullcopecs =A.fullcopecs*B;
    return temp;
}
Добавлено через 29 секунд
Цитата Сообщение от mustimur Посмотреть сообщение
Помочь разобраться с методом toString
Я так и до конца не понял что надо

Добавлено через 6 минут
Цитата Сообщение от Slight Посмотреть сообщение
как я его должен использовать
Тоже не понял что вы хотели спросить?
Slight
0 / 0 / 0
Регистрация: 27.12.2013
Сообщений: 36
03.04.2014, 08:46  [ТС]     Создать класс Money #8
Что я должен сделать если добаляется условие
Номиналы российских рублей могут принимать значения 1, 2, 5, 10, 50, 100, 500, 1000, 5000. Копейки представить как 0.01 (1 копейка), 0.05 (5копеек), 0.1 (10 копеек), 0.5 (50 копеек). Создать класс Money для работы с денежными суммами.

Сумма должна быть представлена полями-номиналами, значениями которых должно быть количество купюр данного достоинства.

как я должен переписать конструктор, чтобы представить сумму данным образом?

Добавлено через 1 час 20 минут
Если я правильно понял суть того что необъодимо дополнительно реализовать, то это функцию, которая бы делила сумму на номинал из массива money [13]={5000,1000,500,100,50,10,5,2,1,0.5,0,1,0.05,0.01} и записывала их в другой созданный массив
Slight
0 / 0 / 0
Регистрация: 27.12.2013
Сообщений: 36
05.04.2014, 11:47  [ТС]     Создать класс Money #9
Помогите, похалуйста
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
05.04.2014, 15:56     Создать класс Money #10
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
#include<iostream>
#include<string>
#include<sstream>
#include<cmath>
#include <iostream>
#include <iomanip>
#include <limits> 
 
using namespace std;
const int dcup[14]={500000,100000,50000,10000,5000,1000,500,200,100,50,10,5,2,1};
 
class money
{
private:
int fullcopecs;
 
 
public:
 std::string toString() const;
    money() {fullcopecs=0;}
    money(unsigned int a){fullcopecs=a;}
    money(unsigned int r, unsigned int c){fullcopecs=r*100+c;}
    friend istream &operator >>(istream &in,money &A); //Ввод
    friend ostream &operator <<(ostream &out,money A);  //Вывода
    friend money operator+(money A,money B);   //Сложение
    friend money operator-(money A,money B);   //Вычитание
    friend int operator/(money A,money B); //Если делишь кучку денег на кучку денег, то по идеи должно получиться число кучек (а не новая кучка)
    friend money operator/(money A,int B); //Если делишь кучку денег на число кучек, то по идеи должна получиться новая кучка
    string operator!();  //в строку
    const int* GetCup ();
    //money add(money& other);
 
};
 
 
using namespace std;
 
 //Вводим данные
istream &operator>>(istream &in,money &A) {
    unsigned int roubles, copecks;
    in >>roubles >> copecks;
    A.fullcopecs =roubles*100+copecks;
    return in;
}
//Выводим
ostream &operator<<(ostream &out, money A) 
{
    unsigned int roubles, copecks;
    roubles=A.fullcopecs/100;
    copecks=A.fullcopecs%100;
    out<<"Roubles: "<< roubles <<"; Copecks: "<<copecks<<endl;
    return out;
 
}
    //Складываем
money operator+(money B, money A)
{ 
    money temp;
    temp.fullcopecs =A.fullcopecs+B.fullcopecs; 
    return temp;
}
 
             //Вычитаем
money operator-(money A, money B)
{
    money temp;
    temp.fullcopecs= A.fullcopecs-B.fullcopecs; 
    return temp; 
}
 
 
string money::toString() const 
{
    ostringstream oss;
    unsigned int roubles, copecks;
    roubles=fullcopecs/100;
    copecks=fullcopecs%100;
    oss<<"Roubles: "<<roubles<<"; Copecks: "<<copecks<<endl;
    return oss.str();
}
const int* money::GetCup ()
{
int *cup=new int[14];
int fc;
fc=fullcopecs;
for (int i=0;i<13;++i)
{
    cup[i]=fc/dcup[i];
    fc-=cup[i]*dcup[i];
}
cup[14]=fc;
return cup;
}
 
 
            //Делим
int operator/(money A, money B)
{   
    unsigned int temp=0;
    if(B.fullcopecs!=0) temp=A.fullcopecs /B.fullcopecs;
    return temp;
}
 
money operator/(money A, int B)
{   
    money temp;
    if(B!=0) temp.fullcopecs =A.fullcopecs/B;
    return temp;
}
 
int main()
{
    money A, B;
 
        cout << "\nEnter first summ in format 'roubles'.'copecks':\t";
        cin >> A;
      cout << "Enter second summ in format 'roubles'.'copecks'':\t";
        cin >> B;
        cout << "Sum:\t\t" << (A+B) << endl;
        cout << "Raznost:\t\t" << ( A - B ) <<endl;
        cout << "Delenien:\t\t" << ( A / B ) <<" chasti" << endl;
        cout << "Delenien na 4 chasti:\t\t" << ( A / 4 ) <<" chasti" << endl;
        cout << " to str: " << A.toString() << endl;
        const int *cup;
        cup=A.GetCup();
        cout << A<<" Moget bit' slogena iz:"<<endl;
        for (int i=0; i<14;i++)
        {
            if (cup[i]>0)
            {
                if (dcup[i]>=100) 
                    cout<<cup[i]<<" kupur po "<<dcup[i]/100<<" rubley"<< endl; 
                else 
                    cout<<cup[i]<<" monet po "<<dcup[i]<<" kop."<< endl;
 
            }
        }
        system ("pause");
 
       return 0;
}
Это нужно?

Добавлено через 15 минут
Цитата Сообщение от Slight Посмотреть сообщение
как я должен переписать конструктор, чтобы представить сумму данным образом?
Хотя я вообще не понял это... Я лишь переделал класс чтоб он говорил как эту сумму собрать
Slight
0 / 0 / 0
Регистрация: 27.12.2013
Сообщений: 36
05.04.2014, 16:26  [ТС]     Создать класс Money #11
Спасибо

Добавлено через 24 минуты
А если это перегрузить?
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
05.04.2014, 16:32     Создать класс Money #12
Цитата Сообщение от Slight Посмотреть сообщение
А если это перегрузить?
Не понял задачи
Slight
0 / 0 / 0
Регистрация: 27.12.2013
Сообщений: 36
05.04.2014, 16:36  [ТС]     Создать класс Money #13
ну мы получается вызываем разделение только первой суммы на купюры.
Для того чтобы мы вторую сумму делили на купюры надо переписывать аналогичную функцию?

Или можно как-то компактное сделать - к примеру перегрузкой, чтобы мы могли вызывать функцию одновременно для двух сумм
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
05.04.2014, 16:40     Создать класс Money #14
функция const int* money::GetCup () возвращает набор купюр для любого класса.. замените
C++
1
cup=A.GetCup();
на
C++
1
cup=B.GetCup();
Slight
0 / 0 / 0
Регистрация: 27.12.2013
Сообщений: 36
05.04.2014, 16:44  [ТС]     Создать класс Money #15
А если необходимо одновременно для двух сумм?
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
05.04.2014, 16:54     Создать класс Money #16
Ну можно организовать вывод внутри класса, но так лучше не делать.. (хотя вы так уже ряд функций реализовали)
Slight
0 / 0 / 0
Регистрация: 27.12.2013
Сообщений: 36
05.04.2014, 17:14  [ТС]     Создать класс Money #17
просто этот вывод мне необходим для следующей задачи, связанной с банкоматом - реализация с использованием представления суммы из этого класса. Нужно чтобы все было грамотно
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.04.2014, 17:21     Создать класс Money
Еще ссылки по теме:

Разработайте класс MONEY C++
C++ Создать класс Money, содержащий следующие элементы
C++ Создать класс Money

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

Или воспользуйтесь поиском по форуму:
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
05.04.2014, 17:21     Создать класс Money #18
GetCup() Возвращает массив элементов с количеством купюр или монет:
[0]-5000р [1]-1000р ....[13]-1 коп и используйте их, для манипуляций и расчетов.. Это функция возвращает массивы купюр для всех классов money
а вывод на экран в рамках программы а не класса делать надо...
Yandex
Объявления
05.04.2014, 17:21     Создать класс Money
Ответ Создать тему
Опции темы

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