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

калькулятор с++ Обыкновенные дроби в двух формах: - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.71
samich
1 / 1 / 0
Регистрация: 20.05.2012
Сообщений: 53
22.01.2013, 20:35     калькулятор с++ Обыкновенные дроби в двух формах: #1
помогите написать калькулятор с ++
Обыкновенные дроби в
двух формах:
- числитель/
знаменатель;
- целая часть
числитель/знаменатель.

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

буду очень признателен, и готов отблагодарить. щедрость благодарения обсудима
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
samich
1 / 1 / 0
Регистрация: 20.05.2012
Сообщений: 53
26.01.2013, 23:38  [ТС]     калькулятор с++ Обыкновенные дроби в двух формах: #2
помогите найти ошибку
в данном случае не работаем сумма, разность умножение и деление выдает всегда 1
вводить дробь нужно через пробел. получается к примеру 4 7 это 4/7
что странно запускали в другой студии в 12 там программа работает как и положенно, у меня в 10 вставляю без разницы пусть то просто код или срр файл программа не работает полностью где то ошибка. то ли у меня со студией что то не так. сохраняли проект в 12 и на том компе открывали просто файл ехе работает у меня пишет ошибку. не является приложение вин 32
вот сам код если у кого работает то скажите хотя бы что работает в какой студии запускали и какая у вас винда.
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
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
#include <iostream>
#include <cmath>
#include <fstream>
#include <string>
 
class Rational
{
   private:
      int a, b;
      void reduce();
   public:
      Rational();
      Rational( int a0, int b0 );
      explicit Rational( const Rational &r );
      Rational& operator= ( const Rational &r );
      void init( int a0, int b0 );
      friend std::ostream& operator<< ( std::ostream &os, const Rational &rat );
      friend std::istream& operator>> ( std::istream &is, Rational &rat );
      Rational& operator+ ( Rational &r );
      Rational& operator- ( Rational &r );
      Rational& operator* ( Rational &r );
      Rational& operator/ ( Rational &r );
      Rational& operator^ ( int );
      void swap();
      friend void toLog( std::ifstream &f, std::string &msg, Rational &rat );
      void exchangeSign();
};
 
void Rational::reduce()
{
   int min, sign = 1;
   if ( a < 0 && b < 0 )
   {
       a = -a;
       b = -b;
   }
   else if ( a < 0 )
   {
       sign = -1;
       a = -a;
   }
   else if ( b < 0 )
   {
       sign = -1;
       b = -b;
   }
   min = ( a < b ) ? ( a ) : ( b );
   for( int i = min; i >= 2; i-- )
      if ( a % i == 0 && b % i == 0 )
      {
         a /= i;
         b /= i;
      }
   a *= sign;
}
 
Rational::Rational( int a0, int b0 )
{
   a = a0;
   b = b0;
   reduce();
}
 
Rational::Rational()
{
   a = 0;
   b = 1;
}
 
Rational::Rational( const Rational &r )
{
   a = r.a;
    b = r.b;
   reduce();
}
 
void Rational::init( int a0, int b0 )
{
   a = a0;
   b = b0;
   reduce();
}
 
std::ostream& operator<< ( std::ostream &os, const Rational &rat )
{
    if ( rat.b == 1 || rat.a == 0 )
        os << rat.a;
    else os << rat.a << "/" << rat.b;
    return os;
}
 
std::istream& operator>> ( std::istream &is, Rational &rat )
{
    is >> rat.a >> rat.b;
    return is;
}
 
Rational& Rational::operator= ( const Rational &r )
{
    a = r.a;
    b = r.b;
    reduce();
    return *this;
}
 
Rational& Rational::operator+( Rational &r )
{
    Rational temp;
    temp.a = r.a * b + a * r.b;
    temp.b = r.b * b;
    temp.reduce();
    return temp;
}
 
Rational& Rational::operator- ( Rational &r )
{
    Rational temp;
    temp.a = a * r.b - b * r.a;
    temp.b = b * r.b;
    temp.reduce();
    return temp;
}
 
Rational& Rational::operator* ( Rational &r )
{
    Rational temp;
    temp.a = a * r.a;
    temp.b = b * r.b;
    temp.reduce();
    return temp;
}
 
Rational& Rational::operator/ ( Rational &r )
{
    Rational temp;
    temp.a = a * r.b;
    temp.b = b * r.a;
    temp.reduce();
    return temp;
}
 
Rational& Rational::operator^ ( int deg )
{
    Rational temp;
    temp.a = a;
    temp.b = b;
    for( int i = 1; i < deg; ++i )
    {
        temp.a *= a;
        temp.b *= b;
    }
    //temp.reduce();
    return temp;
}
 
void Rational::swap()
{
    int temp = a;
    a = b;
    b = temp;
}
 
void Rational::exchangeSign()
{
    if ( a * b < 0 )
    {
        a = abs( a ); b = abs( b );
    }
    else
    {
        a = -a;
    }
}
 
void toLog( std::fstream &f, std::string &msg, Rational &rat )
{
    f << "=====================================================" << std::endl;
    f << msg << " => " << rat << std::endl;
    f << "=====================================================" << std::endl;
}
 
void printLogFile( std::fstream &f )
{
    f.close();
    f.open( "log.txt" );
    std::string s;
    while ( std::getline( f, s ) )
        std::cout << s << std::endl;
    std::cout << std::endl;
    f.close();
}
 
void menu()
{
    std::cout << std::endl;
    std::cout << "1) Ввод двух дробей;" << std::endl;
    std::cout << "2) Сумма;" << std::endl;
    std::cout << "3) Разность;" << std::endl;
    std::cout << "4) Произведение;" << std::endl;
    std::cout << "5) Деление первой на вторую;" << std::endl;
    std::cout << "6) Возведение двух дробей в степень;" << std::endl;
    std::cout << "7) Обмен местами числителей и занменателей двух дробей;" << std::endl;
    std::cout << "8) Смена знака у двух дробей;" << std::endl;
    std::cout << "9) Просмотреть лог - файл;" << std::endl;
    std::cout << "0) Выход;" << std::endl;
    std::cout << std::endl;
}
 
int main()
{
    setlocale( 0, "" );
 
    std::fstream logFile( "log.txt", std::ios::app );
 
    Rational first, second, third( 0, 0 );
   
    int choice;
 
    do
    {
        menu();
        std::cout << "Ваш выбор : ";
        std::cin >> choice;
 
        switch ( choice )
        {
            case 1 : {
                        std::cout << "Введите первую дробь : "; std::cin >> first;
                        toLog( logFile, std::string( "Ввод первой дроби" ), first );
                        std::cout << "Введите вторую дробь : "; std::cin >> second;
                        toLog( logFile, std::string( "Ввод второй дроби" ), second );
                     } break;
            case 2 : {
                        third = first + second;
                        std::cout << "Сумма : " << third << std::endl;
                        toLog( logFile, std::string( "Сумма двух дробей" ), third );
                     } break;
            case 3 : {
                        third = first - second;
                        std::cout << "Разность : " << third << std::endl;
                        toLog( logFile, std::string( "Разность двух дробей" ), third );
                     } break;
            case 5 : {
                        third = first / second;
                        std::cout << "Деление : " << third << std::endl;
                        toLog( logFile, std::string( "Деление первой дроби на вторую" ), third );
                     } break;
            case 4 : {
                        third = first * second;
                        std::cout << "Произведение : " << third << std::endl;
                        toLog( logFile, std::string( "Произведение двух дробей" ), third );
                     } break;
            case 6 : {
                        int deg;
                        std::cout << "Введите степень : ";
                        std::cin >> deg;
                        first = first ^ deg;
                        second = second ^ deg;
 
                        std::cout << "Возведение первой в степень : " << first << std::endl;
                        std::cout << "Возведение второй в степень : " << second << std::endl;
                        toLog( logFile, std::string( "Возведение в степень первой дроби" ), first );
                        toLog( logFile, std::string( "Возведение в степень второй дроби" ), second );
                     } break;
            case 7 : {
                        first.swap();
                        second.swap();
                        std::cout << "Обмен местами числителя и знаменателя : " << first << " " << second << std::endl;
                        toLog( logFile, std::string( "Обмен первой дроби" ), first );
                        toLog( logFile, std::string( "Обмен второй дроби" ), second );
                     } break;
            case 8 : {
                        first.exchangeSign();
                        second.exchangeSign();
                        std::cout << "Обмен знаков : " << first << " " << second << std::endl;
                        toLog( logFile, std::string( "Обмен у первой дроби" ), first );
                        toLog( logFile, std::string( "Обмен у второй дроби" ), second );
                     } break;
            case 9 : {
                        printLogFile( logFile );
                        logFile.open( "log.txt", std::ios::app );
                     } break;
        }
    }
    while ( choice != 0 );
   
 
    return 0;
}
Добавлено через 1 минуту
и помогите с комментариями хотя бы для первой половины. во второй более менее все понятно
samich
1 / 1 / 0
Регистрация: 20.05.2012
Сообщений: 53
28.01.2013, 23:03  [ТС]     калькулятор с++ Обыкновенные дроби в двух формах: #3
разве нет добрых людей готовых помочь советом?
grindaah
20 / 20 / 0
Регистрация: 25.05.2011
Сообщений: 62
29.01.2013, 00:15     калькулятор с++ Обыкновенные дроби в двух формах: #4
мне не верится, что этот код где-то работал.

Возвращение по ссылке результата работы оператора - это неправильно. Можете погуглить предыдущее предложение как запрос, думаю, найдете для себя что-нибудь интересное.

Исправления:
C++
1
2
     explicit Rational( const Rational &r );
на Rational( const Rational &r );
Все объявления и реализации
C++
1
Rational& operator
r на
C++
1
Rational operator
Вроде бы ничего не забыл, если не скомпилируется и не разберетесь - пишите ошибки компиляции сюда.

Добавлено через 1 минуту
ps У std::ostream& операторов символ '&' убирать не надо
samich
1 / 1 / 0
Регистрация: 20.05.2012
Сообщений: 53
29.01.2013, 00:34  [ТС]     калькулятор с++ Обыкновенные дроби в двух формах: #5
спасибо хоть кто то обратил внимание. я тут все мучился почему у меня не работает. попросил у кого есть vs12 там все работает. стал в своем капашится. решил создать проект из успешного когда вставил код который имеется и о чудо проект заработал без ошибок. Тогда возник второй вопрос почему это при одном и том же коде в 12 работает а в 10 не хочет разве там что то есть дополнительное??? сейчас попробую исправить ваше предложение посмотрю что получится
grindaah
20 / 20 / 0
Регистрация: 25.05.2011
Сообщений: 62
29.01.2013, 10:06     калькулятор с++ Обыкновенные дроби в двух формах: #6
Как говорят у нас на форуме, "спасибо" на репутацию не намажешь

Ответ на вопрос, почему в одном работает, а в другом нет: какие-то опции компилятора, выставленные в других SDK могут не вызывать принудительно деструктор временных объектов, поэтому возвращаемые вами ссылки остаются валидными, впрочем, не уверен в этом, кто-нибудь меня поправит, если я не прав.
samich
1 / 1 / 0
Регистрация: 20.05.2012
Сообщений: 53
29.01.2013, 19:48  [ТС]     калькулятор с++ Обыкновенные дроби в двух формах: #7
Обязательно нажму. Тут оказывается не просто нужно сделать калькулятор но еще и диаграмму классов написать. А это как? Посмотрел у многих этот талмут станиц на 30. Что там прописывать надо? Где в инете глянуть можно? И у многих разделенно отдельно написан калькулятор, отдельно диалог, и еще пишут подобие если человек не правильно ввел дробь то должна быть надпись типа не корректная дробь, введите по новой.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.01.2013, 20:05     калькулятор с++ Обыкновенные дроби в двух формах:
Еще ссылки по теме:

C++ Дроби
C++ Обыкновенные задачи
Простой калькулятор и калькулятор с парсингом C++

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

Или воспользуйтесь поиском по форуму:
Smetanka
56 / 17 / 1
Регистрация: 14.05.2012
Сообщений: 134
29.01.2013, 20:05     калькулятор с++ Обыкновенные дроби в двух формах: #8
grindaah, c новой студией вышла и новая платформа .NET. Чтобы проект из 10 студии заработал под 12 надо поменять в свойствах проекта "набор инструментов платформы".
Yandex
Объявления
29.01.2013, 20:05     калькулятор с++ Обыкновенные дроби в двух формах:
Ответ Создать тему
Опции темы

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