Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
0 / 0 / 0
Регистрация: 04.02.2019
Сообщений: 18

Усовершенствованный калькулятор рациональных дробей

04.02.2019, 17:38. Показов 4115. Ответов 34
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добавил операторы сравнения и равно, всё скомпилировалось, ровно работает, при добавлении <=,>=,!= в отдельных case,
всё компилируется, но в консоли при запуске и вводе одного из этих операторов начинается непрерывный опрос пользователя о вводе операции и снова и снова и снова, бесконечно. Почему так может быть?
C++ (Qt)
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
#include<iostream>
#include <Windows.h>
#include <locale>
 
using namespace std;//определяем стандартную область имён
 
int getNod(int x, int y)    //создаём функцию, возвращающую НОД для x и y (НОД - Наибольший Общий Делитель)
{
    if (y == 0) //условный оператор, при выполнении заданных условий, выполняет действие (return x)
        return x;
    return getNod(y, x % y);
}
bool func (int a, int b)
{
    if (a >= b)
        return true;
    else
        return false;
}
int main()
{
    setlocale(LC_ALL, "");    //определяет русскоязычный текст в консоли
    SetConsoleOutputCP(1251);
 
    int ch1,zn1,ch2,zn2, resCh, resZn, nod;   //resCh, resZn;  числитель и знаменатель результирующей дроби
 
    char c = 0;   //char - это символьная переменная. Любые операции (сложение, вычитание…),
                 // применяемые к обычным целым числам, можно применять к символам char.
 
    for(;c!='q' && c!='Q';)    //если ввели 'q' или 'Q', то программа завершит работу
    {
        cout<<"Введите числитель первой дроби-> "<<endl; //cout - выводит текст в кавычках на экран, endl - переход на новую строку
        cin>>ch1;                                        //cin - принимает значение от пользователя
        cout<<"Введите знаменатель первой дроби-> "<<endl;
        cin>>zn1;
        cout<<"Введите числитель второй дроби-> "<<endl;
        cin>>ch2;
        cout<<"Введите знаменатель второй дроби-> "<<endl;
        cin>>zn2;
        cout<<"Введите действие (+,-,*,/,<,>,=,Q - выход)-> "<<endl;
        cin >> c;
 
    switch (c) //оператор многозначного выбора
        {
    case '+':    //соответственно после того как определили оператор многозначного выбора начинается выбор
        {        //действия пользователем, то есть в данном случае case - при вводе "+", выполнить след. действия:
            resCh = ch1*zn2+ch2*zn1;
            resZn = zn1*zn2;
 
            nod = getNod(resCh, resZn);
            resCh /= nod; resZn /= nod;
 
            cout << resCh << "/" << resZn << endl;
            break;
        }
    case '-':   //при выборе "-", аналогично выполнение след. действий:
        {
            resCh = ch1*zn2-ch2*zn1;
            resZn = zn1*zn2;
 
            nod = getNod(resCh, resZn);
            resCh /= nod; resZn /= nod;
 
            cout << resCh << "/" << resZn << endl;
            break;
        }
    case '*':
        {
            resCh = ch1*ch2;
            resZn = zn1*zn2;
 
            nod = getNod(resCh, resZn);
            resCh /= nod; resZn /= nod;
 
            cout << resCh << "/" << resZn << endl;
            break;
        }
    case '/':
        {
            resCh = ch1*zn2;
            resZn = ch2*zn1;
 
            nod = getNod(resCh, resZn);
            resCh /= nod; resZn /= nod;
 
            cout << resCh << "/" << resZn << endl;
            break;
        }
    case '<':
        {
            if(ch1/zn1<ch2/zn2)
                cout<< "Действительно, "<<ch1<<"/"<<zn1<<" меньше, чем "<<ch2<<"/"<<zn2<<endl;
            else
                cout<< "Нет, "<<ch1<<"/"<<zn1<<" больше, чем "<<ch2<<"/"<<zn2<<endl;
            break;
        }
    case '>':
        {
            if(ch1/zn1>ch2/zn2)
                cout<< "Действительно, "<<ch1<<"/"<<zn1<<" больше, чем "<<ch2<<"/"<<zn2<<endl;
            else
                cout<< "Нет, "<<ch1<<"/"<<zn1<<" меньше, чем "<<ch2<<"/"<<zn2<<endl;
            break;
        }
    case '=':
        {
            if(ch1/zn1!=ch2/zn2)
                cout<< "Нет, "<<ch1<<"/"<<zn1<<" != "<<ch2<<"/"<<zn2<<endl;
            else
                cout<< "Действительно, "<<ch1<<"/"<<zn1<<" = "<<ch2<<"/"<<zn2<<endl;
            break;
        }
        default:    //default - можно сказать "при вводе любого другогозначения кроме предложенных выполнить след. действия":
        {
            if(c!='q' && c!='Q')      // при вводе значения не соответсв. q и Q, в консоли:
                cout << "Введено неверное действие, пробуйте снова." << endl;
        }
    }
 
 }
}
Миниатюры
Усовершенствованный калькулятор рациональных дробей  
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.02.2019, 17:38
Ответы с готовыми решениями:

Калькулятор рациональных дробей
Первая программа принимает от пользователя три строки, (первая и третья строки – это правильные рациональные или десятичные дроби вида ...

Олимпиадное задание "Калькулятор рациональных дробей"
Калькулятор рациональных дробей (выполнение операций сложения, вычитания, умножения, деления).

Матрица рациональных дробей
П.5.4.Правил Запрещено создавать темы с бессмысленными названиями вроде &quot;Помогите!&quot;, &quot;Вопрос&quot; и т.п. Есть матрица.txt,...

34
0 / 0 / 0
Регистрация: 04.02.2019
Сообщений: 18
04.02.2019, 18:04  [ТС]
Булеву функцию убрал, хотел с её помощью, тоже косяк какой то
0
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
04.02.2019, 18:06
cheff373, скорее всего ввод символа после числа. попробуйте поставить после строки 39
C++
1
2
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
0
0 / 0 / 0
Регистрация: 04.02.2019
Сообщений: 18
04.02.2019, 18:20  [ТС]
Не компилируется(((

Добавлено через 28 секунд
Не компилируется(((
0
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,243
04.02.2019, 18:25
Цитата Сообщение от cheff373 Посмотреть сообщение
<=,>=,!=
Для ввода такой последовательности нужны ДВА символа.
Лучше сделайте так
C++
1
2
3
4
5
6
7
8
9
10
11
cout<<"Введите действие" 
    "1  сложение\n"
    "2 вычитание\n"
    ...
    "8 - >=\n"
    ...;
    int c;cin>>c;
    cin >> c;
    switch(c)
    {
     case 1:
Если хочется, то можете 1,2,3... занумеровать через enum.
0
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
04.02.2019, 18:25
cheff373, вверху добавьте #include <limits>
0
0 / 0 / 0
Регистрация: 04.02.2019
Сообщений: 18
04.02.2019, 18:28  [ТС]
Скомпилировал добавив #include <limits>, но!!! как теперь вот с этим справиться??? (картинка выделено красным)
Миниатюры
Усовершенствованный калькулятор рациональных дробей  
0
0 / 0 / 0
Регистрация: 04.02.2019
Сообщений: 18
04.02.2019, 18:29  [ТС]
Спасибо, но это учебный код, преподавателю надо показать работу с функциями, операторами, условиями и так далее)))
0
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
04.02.2019, 18:31
cheff373, я не обратил внимание, что Вы 2 символа пытаетесь в char определить (char - это один символ). сделайте как советует zss.
0
0 / 0 / 0
Регистрация: 04.02.2019
Сообщений: 18
04.02.2019, 18:36  [ТС]
Точно, спасибо всем, как подправлю, отпишусь)))
0
Злостный нарушитель
 Аватар для Verevkin
10307 / 5729 / 1269
Регистрация: 12.03.2015
Сообщений: 26,540
04.02.2019, 18:53
Делать консольный калькулятор - это ректальная аппендектомия.
Как звучит задание буквально?
0
0 / 0 / 0
Регистрация: 04.02.2019
Сообщений: 18
04.02.2019, 18:57  [ТС]
Люди спасибо Вам огромное, всё чётко получилось))) (картинка)
Миниатюры
Усовершенствованный калькулятор рациональных дробей  
0
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
04.02.2019, 19:28
cheff373, только действия - это только первые четыре операции. и лучше (логичнее) оставить не цифры, а символы +,-,*,/ - всё будет работать. а что Вы собираетесь делать в пунктах 5-10 ? я вот про что - так разве не лучше будет:
C++
1
2
3
4
5
6
cout << "Выберите действие:\n "  
    << " +  сложение\n "
    << " -  вычитание\n "
    << " *  умножение\n "
    << " /  деление\n "
    << " ?  сравнение\n ";
0
0 / 0 / 0
Регистрация: 04.02.2019
Сообщений: 18
04.02.2019, 19:43  [ТС]
Там в задании прям написано: операции сравнения «<», «>», «=», «!=», «>=», «<=»),
выполняет требуемую операцию над полученными операндами, и выводит
результат на экран, вот мой код, единственное теперь после добавления cin.ignore(numeric_limits<streamsize>::m ax(), '\n'); не выходит из программы:
C++ (Qt)
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
#include<iostream>
#include <Windows.h>
#include <locale>
#include <limits>   //подключаем библиотечки для использования строки 36
 
using namespace std;//определяем стандартную область имён
 
int getNod(int x, int y)    //создаём функцию, возвращающую НОД для x и y (НОД - Наибольший Общий Делитель)
{
    if (y == 0) //условный оператор, при выполнении заданных условий, выполняет действие (return x)
        return x;
    return getNod(y, x % y);
}
 
int main()
{
    setlocale(LC_ALL, "");    //определяет русскоязычный текст в консоли
    SetConsoleOutputCP(1251);
 
    int ch1,zn1,ch2,zn2, resCh, resZn, nod;   //resCh, resZn;  числитель и знаменатель результирующей дроби
 
    int c = 0;   //char - это символьная переменная. Любые операции (сложение, вычитание…),
                 // применяемые к обычным целым числам, можно применять к символам char.
 
    for(;c!='q' && c!='Q';)    //если ввели 'q' или 'Q', то программа завершит работу
    {
        cout<<"Введите числитель первой дроби-> "<<endl; //cout - выводит текст в кавычках на экран, endl - переход на новую строку
        cin>>ch1;                                        //cin - принимает значение от пользователя
        cout<<"Введите знаменатель первой дроби-> "<<endl;
        cin>>zn1;
        cout<<"Введите числитель второй дроби-> "<<endl;
        cin>>ch2;
        cout<<"Введите знаменатель второй дроби-> "<<endl;
        cin>>zn2;
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');   //устанавливает максимальную количество символов для игнорирования
        cout<<"Введите действие: "<<endl<<"1-сложение;"<<endl
        <<"2-вычитание;"<<endl<<"3-умножение;"<<endl<<"4-деление;"<<endl
        <<"5-меньше;"<<endl<<"6-больше"<<endl<<"7-равно"<<endl<<"8 - <="<<endl
        <<"9 - >="<<endl<<"10 - !="<<endl<<"Q - выход"<<endl;
        cin >> c;
 
    switch (c) //оператор многозначного выбора
        {
    case 1:    //соответственно после того как определили оператор многозначного выбора начинается выбор
        {        //действия пользователем, то есть в данном случае case - при вводе "+", выполнить след. действия:
            resCh = ch1*zn2+ch2*zn1;
            resZn = zn1*zn2;
 
            nod = getNod(resCh, resZn);
            resCh /= nod; resZn /= nod;
 
            cout << resCh << "/" << resZn << endl;
            break;
        }
    case 2:   //при выборе "-", аналогично выполнение след. действий:
        {
            resCh = ch1*zn2-ch2*zn1;
            resZn = zn1*zn2;
 
            nod = getNod(resCh, resZn);
            resCh /= nod; resZn /= nod;
 
            cout << resCh << "/" << resZn << endl;
            break;
        }
    case 3:
        {
            resCh = ch1*ch2;
            resZn = zn1*zn2;
 
            nod = getNod(resCh, resZn);
            resCh /= nod; resZn /= nod;
 
            cout << resCh << "/" << resZn << endl;
            break;
        }
    case 4:
        {
            resCh = ch1*zn2;
            resZn = ch2*zn1;
 
            nod = getNod(resCh, resZn);
            resCh /= nod; resZn /= nod;
 
            cout << resCh << "/" << resZn << endl;
            break;
        }
    case 5:
        {
            if(ch1/zn1<ch2/zn2)
                cout<< "Действительно, "<<ch1<<"/"<<zn1<<" меньше, чем "<<ch2<<"/"<<zn2<<endl;
            else
                cout<< "Нет, "<<ch1<<"/"<<zn1<<" больше, чем "<<ch2<<"/"<<zn2<<endl;
            break;
        }
    case 6:
        {
            if(ch1/zn1>ch2/zn2)
                cout<< "Действительно, "<<ch1<<"/"<<zn1<<" больше, чем "<<ch2<<"/"<<zn2<<endl;
            else
                cout<< "Нет, "<<ch1<<"/"<<zn1<<" меньше, чем "<<ch2<<"/"<<zn2<<endl;
            break;
        }
    case 7:
        {
            if(ch1/zn1!=ch2/zn2)
                cout<< "Нет, "<<ch1<<"/"<<zn1<<" != "<<ch2<<"/"<<zn2<<endl;
            else
                cout<< "Действительно, "<<ch1<<"/"<<zn1<<" = "<<ch2<<"/"<<zn2<<endl;
            break;
         }
    case 8:
        {
            if(ch1/zn1<=ch2/zn2)
                cout<< "Действительно, "<<ch1<<"/"<<zn1<<" <= "<<ch2<<"/"<<zn2<<endl;
            else
                cout<< "Нет, "<<ch1<<"/"<<zn1<<" больше, чем "<<ch2<<"/"<<zn2<<endl;
            break;
        }
    case 9:
        {
            if(ch1/zn1>=ch2/zn2)
                cout<< "Действительно, "<<ch1<<"/"<<zn1<<" >= "<<ch2<<"/"<<zn2<<endl;
            else
                cout<< "Нет, "<<ch1<<"/"<<zn1<<" меньше, чем "<<ch2<<"/"<<zn2<<endl;
            break;
        }
    case 10:
        {
            if(ch1/zn1!=ch2/zn2)
                cout<< "Действительно, "<<ch1<<"/"<<zn1<<" != "<<ch2<<"/"<<zn2<<endl;
            else
                cout<< "Нет, "<<ch1<<"/"<<zn1<<" = "<<ch2<<"/"<<zn2<<endl;
            break;
        }
    default:    //default - можно сказать "при вводе любого другогозначения кроме предложенных выполнить след. действия":
        {
            if(c!='q' && c!='Q')      // при вводе значения не соответсв. q и Q, в консоли:
                cout << "Введено неверное действие, пробуйте снова." << endl;
            break;
        }
    }
 
 }
}
0
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
04.02.2019, 19:56
Цитата Сообщение от cheff373 Посмотреть сообщение
Там в задании прям написано: операции сравнения «<», «>», «=», «!=», «>=», «<=»
напишите задание - есть вероятность, что Вы что-то не так поняли. строки 35-36 уберите - они не для этого случая.
0
0 / 0 / 0
Регистрация: 04.02.2019
Сообщений: 18
04.02.2019, 20:04  [ТС]
если я уберу эти строки, то при вводе ошибки будет бесконечный запрос на ввод данных. А задание вот:
Программа принимает от пользователя три строки, (первая
и третья строки – это правильные рациональные или десятичные дроби вида
«1/3» или «0,5», вторая строка – это знак арифметической операции вида «+»,
«-», «*», «/» либо операции сравнения «<», «>», «=», «!=», «>=», «<=»),
выполняет требуемую операцию над полученными операндами, и выводит
результат на экран. Обеспечить также сокращение дроби при необходимости.
Если оба операнда арифметической операции являются рациональными
дробями, результатом тоже должна быть рациональная дробь. Для операций
сравнения достаточно результата «Истина» или «Ложь»
Миниатюры
Усовершенствованный калькулятор рациональных дробей  
0
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
04.02.2019, 20:14
cheff373, так в задании совсем другой ввод (дробь в строке), а не отдельно числитель и знаменатель, и последовательность ввода другая.
0
0 / 0 / 0
Регистрация: 04.02.2019
Сообщений: 18
04.02.2019, 20:30  [ТС]
думаете не прокатит такой код? я просто на этом же форуме увидел такое задание и там было предложено доделать вот этот самый калич, не так дописал что то?

Добавлено через 5 минут
А если
C++ (Qt)
1
2
3
4
5
float a,b;
cout<<"Введите первую десятичную дробь:"<<endl;
cin a;
cout<<"Введите вторую десятичную дробь:"<<endl;
cin b;
0
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
04.02.2019, 20:35
Лучший ответ Сообщение было отмечено cheff373 как решение

Решение

Цитата Сообщение от cheff373 Посмотреть сообщение
не прокатит такой код?
это халтура. насчёт прокатит - не прокатит не знаю. но то что не соответствует заданию - это точно. нужно вводить дроби в строковом виде и отдельно извлекать из строки числитель и знаменатель. и ещё потребуется достаточно много новых строк кода.
Цитата Сообщение от cheff373 Посмотреть сообщение
А если
дробь через точку вводится. а задание спецом так сформулировано.

числитель и знаменатель найти можно, я там дальше не в курсе как сокращать.
0
0 / 0 / 0
Регистрация: 04.02.2019
Сообщений: 18
04.02.2019, 20:40  [ТС]
Yetty, может поможете хоть немного кода, че то совсем не пойму как это сформулировать
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.02.2019, 20:40
Помогаю со студенческими работами здесь

Класс рациональных дробей
Написать пользоват. тип рациональных дробей. Внутреннее представление типа: int a, b; должно быть таким, что число a/b должно...

Класс рациональных дробей RatNum
Класс RatNum имитирует работу с обычными дробями. Полями этого класса должны быть два поля типа int: числитель и знаменатель дроби....

Разработать класс рациональных дробей
азработать класс рациональных дробей. Предусмотреть в нём все методы, которые необходимы, чтобы новый тип данных мог быть использован...

Преобразование к типу double (класс рациональных дробей)
Имеется класс рациональных дробей (чтоб код лишним не нагружать оставил только перегрузки операций сложения дробей и чисел). все работает и...

Калькулятор рациональных чисел
Мне нужно написать программу калькулятора рациональных чисел. Числа должны быть представлены в виде n1, n2/n3, где n1 - целое число n2 -...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru