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

Задача из Лафоре - C++

Восстановить пароль Регистрация
 
Demelurg
0 / 0 / 0
Регистрация: 12.10.2013
Сообщений: 28
15.11.2013, 19:18     Задача из Лафоре #1
есть задачка из Лафоре ->

Модифицируйте класс bMoney из упражнения 12 главы 7 «Массивы и стро-ки», включив арифметические операции, выполненные с помощью пере-груженных операций:

bMoney = bMoney + bMoney
bMoney = bMoney- bMoney
bМоnеу = bMoney* long double (цена за единицу времени, затраченного на изделие)
long double = bMoney/ bMoney(общая цена, деленная на цену за изделие)
bMoney = bMoney/ long double (общая цена, деленная на количество изделий)

Заметим, что операция / перегружена дважды. Компилятор может разли-чить оба варианта, так как их аргументы разные. Помним, что легче вы-полнять арифметические операции с объектами класса bMoney, выполняя
те же операции с его long double данными.
Убедитесь, что программа main() запросит ввод пользователем двух де-нежных строк и числа с плавающей точкой. Затем она выполнит все пять операций и выведет результаты. Это должно происходить в цикле, так,
чтобы пользователь мог ввести еще числа, если это понадобится.
Некоторые операции с деньгами не имеют смысла: bMoney*bMoney не пред-ставляет ничего реального, так как нет такой вещи, как денежный квад-рат; вы не можете прибавить bMoney к long double (что же будет, если рубли
сложить с изделиями?). Чтобы сделать это невозможным, скомпилируйте такие неправильные операции, не включая операции преобразования для bMoney в long double или long double в bMoney. Если вы это сделаете и запи-шете затем выражение типа: bmon2 = bmon1 + widgets; // это не имеет смысла то компилятор будет автоматически преобразовывать widgets в bMoney и выполнять сложение. Без них компилятор будет отмечать такие преобра-зования как ошибки, что позволит легче найти концептуальные ошибки.

Также сделайте конструкторы преобразований явными.
Вот некоторые другие вероятные операции с деньгами, которые мы еще
не умеем выполнять с помощью перегруженных операций, так как они
требуют объекта справа от знака операции, а не слева:

long double * bMoney // Пока не можем это сделать: bMoney возможен только справа
long double / bMoney // Пока не можем это сделать: bMoney возможен только справа
Мы рассмотрим выход из этой ситуации при изучении дружественных
функций в главе 11.


мы должны ввести 2 строки и число с плавающей точкой ето делать в класе ? типа

C++
1
2
3
4
5
6
class bMoney
{
private:
    long double how_products;
    string cost_product;
    string time_one_product;
или в класе оставить только long double а строки вводить из main() ?

Добавлено через 1 час 22 минуты
видимо не помогут решил вот так пока по другому не придумал есле можете подскажите как лутше .

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
string turn( long double num);
 
class bMoney
{
private:
    long double money;
    string stroka;
public:
    bMoney():money(0.0)
    {}
    bMoney(long double mm):money(mm)
    {}
    bMoney(string ss):stroka(ss)
    {}
 
    void getData()
    {
        cin>>money;
        cout<<endl;
    }
    void showData()
    {
        cout<<endl;
        cout<<" Number products = "<<money;                       
        cout<<endl;     
    }
 
 
    void getStr()
    {
        getline(cin,stroka);
        cout<<endl;
    }
    void showStr()
    {
        cout<<endl;
        cout<<" You str mon -> "<<stroka;
        cout<<endl;
    }
 
    string turn( long double m)
        {
            ostringstream strok;
            strok<<m;
            string s1;
            s1 = strok.str();
            s1.insert(0,"$");
 
            return s1;
        }
    bMoney operator+ (bMoney str0)
    {
        int n = 0 , leng1 = str0.stroka.length();
 
        int k = 0 , leng2 = stroka.length();
 
        char strok1[50] , strok2[50];
 
        long double m1 , m2 , m0 ;
 
        for( int i = 0 ; i < leng1 ; i ++ )
        {
            if( isdigit(str0.stroka[i]) || str0.stroka[i] == '.' )
                {
                    strok1[n] = str0.stroka[i];
                    n++;
                }
 
             m1 = atof(strok1);
        }
 
        for( int j = 0 ; j < leng2 ; j++ )
        {
            if( isdigit(stroka[j]) || stroka[j] == '.' )
                {
                    strok2[k] = stroka[j];
                    k++;
                }
 
            m2 = atof(strok2);
        }
 
        m0 = m1 + m2;
        string s = turn(m0);
 
        return s;
    }
 
    
};
 
 
int main()
{
    bMoney str0 , str1 , str2 , money ;
 
    cout<<" Enter money str1    -> ";
    str1.getStr();
    cout<<" Enter money str2    -> ";
    str2.getStr();
 
    cout<<" Enter money as 1 pr -> ";
    money.getData();
 
    str0 = str1 + str2;
    str0.showStr();
 
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dzrkot
zzzZZZ...
 Аватар для dzrkot
516 / 346 / 53
Регистрация: 11.09.2013
Сообщений: 1,977
15.11.2013, 19:27     Задача из Лафоре #2
выложи весь код и вопрос конкретный задай

просто читать всю задачу и разбираться ни мне, ни многим остальным не хочется, так что конкретизируйте и вам помогут, пока что я не понимаю что вам необходимо
Sabbat
 Аватар для Sabbat
135 / 23 / 1
Регистрация: 19.10.2012
Сообщений: 43
15.11.2013, 21:00     Задача из Лафоре #3
делал я это упражнение изначально поняв что денежное значение должно быть в объекте класса string, но мне кажется что они понимают строку как массив char[].
Мой вариант для string, для char не делал.
Думаю, кто-то сделает попроще для string.
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
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
#include <iostream>
#include <string>
#include <cmath>
#include <iomanip>
#include <sstream>
using namespace std;
class bMoney
{
   private:
      long double money;
      int kpt;          //колличество точек после запятой
   public:
      explicit bMoney()
       {money = 0.0; kpt = 0;}
      explicit bMoney(long double m, int k): money(m), kpt(k)
       {}
      bMoney operator+(bMoney m1) //метод для сложения 2-х объектов bMoney
           {
               bMoney temp;
               temp.money = money+m1.money;
               temp.kpt = (kpt>=m1.kpt)?kpt:m1.kpt;
               return temp;
           }
      void operator+(long double ld) 
           {
              cout<<"bad operation"<<endl;
           }     
      bMoney operator-(bMoney m1) //метод для вычитания 2-х объектов bMoney
           {
               bMoney temp;
               temp.money = money-m1.money;
               temp.kpt = (kpt>=m1.kpt)?kpt:m1.kpt;
               return temp;
           }
      bMoney operator*(long double ld) //метод для умножения объекта bMoney на величину типа long double
           {
               bMoney temp;
               temp.money = money*ld;
               temp.kpt = kpt;
               return temp;
           }
     void operator*(bMoney m1) 
           {
               cout<<"bad operation"<<endl;
           }
     long double operator/(bMoney bM) //метод для деления объекта bMoney на объект bMoney
           {
               return money/bM.money;
           }
     bMoney operator/(long double ld) //метод для деления объекта bMoney на величину типа long double
           {
               bMoney temp;
               temp.money = money/ld;
               temp.kpt = kpt;
               return temp;
           }
      void getmoney()//метод для ввода
        {
           string mstr;
           string sch;
           int j;
           int is;
           getline(cin,mstr);
           j=0;
           // Выделение символов цифр и символа точки
             for(int i=0;i<static_cast<int>(mstr.length());i++)
             {
                if((mstr[i]>='0') && (mstr[i]<='9') || mstr[i]=='.')
                 sch[j++]=mstr[i];
             }
            sch[j]='0';
            //Преобразование символов строки в число типа long double
            money = 0.0;
            is=0;
            for(int s=0; s < j; s++) //находим положение точки
              {
                if(sch[s]=='.')
                    is=s;
              }
 
              if (is!=0)
            {
              for(int n=0; n<j; n++)
               {
                 if(n>=is)
                    money+=static_cast<long double>(sch[n+1]-'0')*pow(10.0,is-1-n);
                 else
                    money+=static_cast<long double>(sch[n]-'0')*pow(10.0,is-1-n);
               }
            }
            else
            {
              is=j-1;
              for(int n=0; n<j; n++)
               {
                    money+=static_cast<long double>(sch[n]-'0')*pow(10.0,j-n-1);
               }
            }
              kpt= j-is-1;
        }
      void putmoney() const//метод для вывода 
        {
 
               string ustring;
               string outstring;   //строка на вывод
               stringstream ss;
               ss<<setiosflags(ios::fixed)         //преобразование long double в string
                 <<setiosflags(ios::showpoint)
                 <<setprecision(kpt)
                 <<money<<endl;
                 ustring=ss.str();
               int sz  = ustring.size();                  //размер строки суммы
               int dot = ustring.find(".");               //порядковый номер точки в строке
               int zp=3;                                  //колличество символов через которые ставится запятая
               outstring.insert(0,"$");                   //добавление символа '$' в начало выводимой строки
 
               outstring.insert(1,ustring,0,dot%zp);
               for(int i=0; i<(dot-dot%zp)/zp; i++)
               {
                if((dot%zp)==0)
                    {
                          outstring.insert(i*(1+zp)+1,  ustring,i*zp,zp);
                          if ((dot/zp-i)>1)
                          outstring.insert(i*(1+zp)+zp+1,",");
                    }
                else
                    {
                          outstring.insert(dot%zp+i*(1+zp)+1,",");
                          outstring.insert(dot%zp+i*(1+zp)+2,  ustring,dot%zp+i*zp,zp);
                    }
               }
               if(sz - dot== 2)
                  outstring.insert(outstring.size(),ustring,dot,sz-dot-2);
               else
                  outstring.insert(outstring.size(),ustring,dot,sz-dot-1);
               cout<<outstring<<endl;
        }
};
 
int main()
{
   bMoney mon1, mon2;
   bMoney mon;
   long double numb;
   long double outn;
 
   cout<<"1 (STRING): "; mon1.getmoney();
   cout<<"2 (STRING): "; mon2.getmoney();
   cout<<"(LONG DOUBLE): "; cin>>numb;
 
   mon = mon1 + mon2;   cout<<"s1 + s2 = ";     mon.putmoney();
   mon = mon1 - mon2;   cout<<"s1 - s2 = ";     mon.putmoney();
   mon = mon1 * numb;   cout<<"s1 * ld = ";     mon.putmoney();
   outn = mon1 / mon2;  cout<<"s1 / s2 = "<<outn<<endl;
   mon = mon1 / numb;   cout<<"s1 / ld = ";      mon.putmoney();
   cout<<"s1 * s2 = ";  mon1 * mon2;
   cout<<"s1 + ld = ";  mon1 + numb;
   return 0;
}
Demelurg
0 / 0 / 0
Регистрация: 12.10.2013
Сообщений: 28
16.11.2013, 19:27  [ТС]     Задача из Лафоре #4
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
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
string turn( long double num);//походу можно и не писать
 
class bMoney
{
private:
    long double money;
    string stroka;
public:
    //конструктори 
 
    bMoney():money(0.0)
    {}
 
    bMoney(long double mm):money(mm)
    {}
 
    bMoney(string ss):stroka(ss)
    {}
 
    // ввод строк з баблом
 
    void getStr()
    {
        getline(cin,stroka);
        cout<<endl;
    }
    void showStr()
    {
        cout<<endl;
        cout<<" You str mon -> "<<stroka;
        cout<<endl;
    }
 
    //перетворення строк в числовий тип long double
 
    long double turn_Str_LD(bMoney StR)
    {
        int k = 0 , leng2 = StR.stroka.length();
 
        char strok1[50] ;
        
        for( int i = 0 ; i < leng2 ; i ++ )
        {
            if( isdigit(StR.stroka[i]) || StR.stroka[i] == '.' )
                {
                    strok1[k] = StR.stroka[i];
                    k++;
                }
 
             money = atof(strok1);
        }
 
       return money;
    }
    long double turn_Str_LD_for_string(string StR)
    {
        int k = 0 , leng2 = StR.length();
 
        char strok0[50] ;
 
        for( int i = 0 ; i < leng2 ; i ++ )
        {
            if( isdigit(StR[i]) || StR[i] == '.' )
                {
                    strok0[k] = StR[i];
                    k++;
                }
 
            money = atof(strok0);
        }
 
       return money;
    }
 
    //перетворенння з long double в string
 
    string turn( long double m)
        {
            ostringstream strok;
            strok<<m;
            string s1;
            s1 = strok.str();
            s1.insert(0,"$");
 
            return s1;
        }
    
 
    // дії над строками
    
    // -
 
    bMoney operator- (bMoney str0)
    {
        long double m1 , m2 , m3;
 
        m2 = turn_Str_LD(str0.stroka);
        m3 = turn_Str_LD_for_string(stroka);
 
        if( m2 < m3 )
            {
                cout<<endl;
                m1 = m2 - m3;
                string ss = turn(m1);
                return ss;
            }
        
    }
    bMoney operator- (long double str0)
    {
        long double m1 , m3;
 
        m3 = turn_Str_LD_for_string(stroka);
 
        if( str0 < m3 )
            {
                cout<<endl;
                m1 = str0 - m3;
                string ss = turn(m1);
                return ss;
            }
        
    }
 
    // +
 
    bMoney operator+ (bMoney str0)
    {
        long double m1 , m2 , m0 ;
        
        m1 = turn_Str_LD(str0.stroka);
        m2 = turn_Str_LD_for_string(stroka);
 
        m0 = m1 + m2;
 
        string ss = turn(m0);
 
        return ss;
    }
    bMoney operator+ (long double str0)
    {
        long double m1 , m0 ;
        
        m1 = turn_Str_LD_for_string(stroka);
 
        m0 = m1 + str0;
 
        string ss = turn(m0);
 
        return ss;
    }
    
    // *
 
    bMoney operator* (bMoney str0)
    {
        long double m1 , m2 , m0 ;
        
        m1 = turn_Str_LD(str0.stroka);
        m2 = turn_Str_LD_for_string(stroka);
 
        m0 = m1 * m2;
 
        string ss = turn(m0);
 
        return ss;
    }
    bMoney operator* (long double str0)
    {
        long double m2 , m0 ;
        
        m2 = turn_Str_LD_for_string(stroka);
 
        m0 = str0 * m2;
 
        string ss = turn(m0);
 
        return ss;
    }
 
    // /
 
    bMoney operator/ (bMoney str0)
    {
        long double m1 , m2 , m0 ;
        
        m1 = turn_Str_LD(str0.stroka);
        m2 = turn_Str_LD_for_string(stroka);
 
        m0 = m1 / m2;
 
        string ss = turn(m0);
 
        return ss;
    }
    bMoney operator/ (long double str0)
    {
        long double m2 , m0 ;
        
        m2 = turn_Str_LD_for_string(stroka);
 
        m0 = str0 / m2;
 
        string ss = turn(m0);
 
        return ss;
    }
    
};
 
int main()
{
    setlocale( LC_ALL,"Russian" );
 
    bMoney str0 , str1 , str2;
    long double m2 ;
    int symb;
 
    cout<<" Enter money str1    -> ";
    str1.getStr();
    cout<<" Enter money str2    -> ";
    str2.getStr();
    cout<<" Enter money         -> ";
    cin>>m2;
 
    cout<<endl<<"=============================================================";cout<<endl; 
    cout<<endl;
    cout<<"       1.  bMoney = bMoney + bMoney ";
    cout<<endl<<endl;
    cout<<"       2.  bMoney = bMoney - bMoney ";
    cout<<endl<<endl;
    cout<<"       3.  цена за единицу времени, затраченного на изделие "<<endl;
    cout<<"                   bМоnеу = bMoney * long double ";   
    cout<<endl<<endl;
    cout<<"       4.  общая цена, деленная на цену за изделие "<<endl;
    cout<<"                long double = bMoney / bMoney ";            
    cout<<endl<<endl;
    cout<<"       5.  общая цена, деленная на количество изделий "<<endl;
    cout<<"                 bMoney = bMoney / long doubl  ";         
    cout<<endl<<endl;
 
    cout<<" Viberete deystvie -> ";
    cin>>symb;
 
    switch(symb)
    {
        case 1: 
            str0 = str1 + str2;
            str0.showStr();
            break;           
                case 2:
                    str0 = str1 - str2;
                    str0.showStr();
                    break;  
                        case 3:
                            str0 = str1 * m2;
                            str0.showStr(); 
                            break;
                                case 4:
                                    str0 = str1 / str2;
                                    str0.showStr();
                                    break;
                                        case 5:
                                            str0 = str1 / m2;
                                            str0.showStr();
                                            break;
    }
 
 
    return 0;
}
Подскажите есле что не правильно.
Yandex
Объявления
16.11.2013, 19:27     Задача из Лафоре
Ответ Создать тему
Опции темы

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