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

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

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

Написать калькулятор с объектно–ориентированным подходом - C++

29.05.2014, 12:08. Просмотров 624. Ответов 12
Метки нет (Все метки)

Написать калькулятор, но с объектно–ориентированным подходом, и выводом пользователю информации о возможных ошибках (деление на 0, ввод оператора %, ввод знака $ ). Программа разбивается на три блока(секции): ВВОД данных, ОБРАБОТКА данных (вычисления результата или фиксирование ошибки. В этом блоке ничего не выводится на консоль), ВЫВОД результатов ( показ в консоли результата операции или ошибки, которая была сделана).

Прошу подсказать принцип решения задачи. Что-то не то как бы не пробовал написать код...

Я попробовал следующим образом:
в переменную dRes записывать результат. Либо ответ double типа. Либо переменную char cEr1, cEr2, cEr3. При определенном условии(IF) в дРес записываем определеннюу сЕр переменную.

Если есть идеи как можно еще решить задачу, прошу поделиться. Код сам напишу. Спасибо.

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
#include <iostream>
using namespace std;
 
int main()
    {           
        //Блок вводу данних. Ввести значення 1, значення 2, оператор.
        
        double dVal1;// цифрове значення 1
        double dVal2; // цифрове значення 2
        double dRes; // результат рівняння
    
        char func, cEr1, cEr2, cEr3; // оперант     
        
        // вводимо значення 
        cout << "Введите Enter Number_1 :  "; // 
        dVal1 = (char) dVal1;
        cin >> dVal1;
        
        cout << "Enter Number_2 :  ";
        dVal2 = (char) dVal2;
        cin >> dVal2;
        
        cout << "Enter Function  :  ";
        cin >> func;
        
        //Блок опрацювання.  Перевірити на наявність помилок. Опрацювати введені данні
        
        
        if ( dVal1 == '$' || dVal2 == '$' )
            dRes =  cEr1;
        
        if (dVal1 != 0 || dVal2 != 0 )
            {
                if(func == '*') 
                    dRes = dVal1 * dVal2;
                    
                else if(func == '+') 
                    dRes = dVal1 + dVal2;
                
                else if(func == '-')
                    dRes = dVal1 - dVal2;
                    
                else if (func ==  '/')
                {
                    if (dVal1 == 0 || dVal2 == 0 )
                        dRes = cEr2;
                    dRes = dVal1 / dVal2;
                }
                
                else if (func ==  '%')
                    dRes = cEr3;
            }
        
            //Блок виводу результату.
                
            if (dRes = cEr1)
                cout << "You enter $, instead Number_1 or Number_2. \n";
            
            else if (dRes = cEr2)
                cout << "You enter 0, instead Number_1 or Number_2. You can`t deal at 0. \n";
            
            else if (dRes = cEr3)
                cout << "You enter %, instead. \n";
                
            else 
                cout << dRes;
            
        return 0;
    }
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.05.2014, 12:08
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Написать калькулятор с объектно–ориентированным подходом (C++):

Помогите с Объектно Ориентированным Программированием. Комплексные числа - C++
Нужно разработать класс для работы с комплексными числами (2 поля - действительное и мнимое) Методы: Сложение, вычитание и умножение,...

Простой калькулятор в объектно-ориентированном стиле - C++
Здравствуйте. А можно написать совсем простой калькулятор типа: Введите 2 числа Выберите операцию Результат с классом?...

объектно-ориентированный анализ,объектно-ориентированное проектирование - C++
Прошу помочь построить диаграмму прециндентов и диаграмму классов,мне необходимо только начало диаграммы или хотя-бы какой-нибудь пример с...

Работа с Ориентированным графом - C++
Дан орграф. После удаления произвольных вершин может произойти всё что угодно, вопрос таков: Для каждого компонета связности выделить...

Написать калькулятор - C++
Здравствуйте, нужно написать калькулятор, задание звучит так: Произвести синтаксический анализ строки, задающей...

Написать строковый калькулятор - C++
здравствуйте. просьба, хотя бы идейно, а лучше с примером подсказать, как научить программу решать пример. суть: 5 + 5 - 28 * 3. нажимаю...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Ilot
Модератор
Эксперт С++
1811 / 1168 / 229
Регистрация: 16.05.2013
Сообщений: 3,082
Записей в блоге: 5
Завершенные тесты: 1
29.05.2014, 12:45 #2
Откройте тайну каков сакральный смысл это ереси?
C++
1
        dVal1 = (char) dVal1;
Да еще до ввода данных...
0
dzrkot
zzzZZZ...
519 / 349 / 53
Регистрация: 11.09.2013
Сообщений: 1,998
29.05.2014, 13:39 #3

Не по теме:

Цитата Сообщение от MMt Посмотреть сообщение
if ( dVal1 == '$' || dVal2 == '$' ) dRes = cEr1; if (dVal1 != 0 || dVal2 != 0 ) { if(func == '*') dRes = dVal1 * dVal2; else if(func == '+') dRes = dVal1 + dVal2; else if(func == '-') dRes = dVal1 - dVal2; else if (func == '/') { if (dVal1 == 0 || dVal2 == 0 ) dRes = cEr2; dRes = dVal1 / dVal2; } else if (func == '%') dRes = cEr3; }
за такое надо 2 ставить


используйте switch() , это же просто и намного нагляднее, чем куча if, esle
0
MMt
0 / 0 / 0
Регистрация: 29.04.2014
Сообщений: 169
29.05.2014, 17:58  [ТС] #4
На занятиях свич еще не проходили. Дошли до If и решить хочу с помощью If.

смысл этой ереси в том чтоб преобразовать переменную dVal1 из типа Дабл в тип чар. Тогда в случае ввода $ вместо цифроого значения калькулятор проверит что я ввел и выдаст ошибку. Проверяет на строке 29-30. Возможно, скорее всего, почти уверен, что это и в самом деле ересь.

Но пока ничего другого не придумал. ИМХО сильно запутанно и надо все сделать намного проще, но я заблудился с своих вариантах решения.

может быть в самом конце проверку сделать?

C++
1
2
if ( dVal1 != double || dVal2 != double )
                 dRes =  cEr1;
тоесть сравнить какой тип данных я ввел для переменных дВал1 дВал2. Если он отличаеться от типа данных дабл значит ошибка. И как правильно сравнить переменную с типом введенного значения? Подскажите пожалуйста.
0
dzrkot
zzzZZZ...
519 / 349 / 53
Регистрация: 11.09.2013
Сообщений: 1,998
29.05.2014, 18:13 #5
Цитата Сообщение от MMt Посмотреть сообщение
смысл этой ереси в том чтоб преобразовать переменную dVal1 из типа Дабл в тип чар. Тогда в случае ввода $ вместо цифроого значения калькулятор проверит что я ввел и выдаст ошибку. Проверяет на строке 29-30. Возможно, скорее всего, почти уверен, что это и в самом деле ересь.
чему вас учат, октуда вы взяли такие вещи?
Цитата Сообщение от MMt Посмотреть сообщение
if ( dVal1 != double || dVal2 != double ) dRes = cEr1;
0
MMt
0 / 0 / 0
Регистрация: 29.04.2014
Сообщений: 169
29.05.2014, 18:42  [ТС] #6
dzrtkot, тонко намекаю первый раз.

Американский форум: Ты задаешь вопрос, тебе дают ответ
Еврейский форум: Ты задаешь вопрос, тебе задают вопрос в ответ
Русский форум: Ты задаешь вопрос, тебе долго объясняют какой ты мудак...

Если нечего сказать по сути или полезного, прошу в эту тему больше не флудить.
0
dzrkot
zzzZZZ...
519 / 349 / 53
Регистрация: 11.09.2013
Сообщений: 1,998
29.05.2014, 19:21 #7
Цитата Сообщение от MMt Посмотреть сообщение
Если нечего сказать по сути или полезного, прошу в эту тему больше не флудить.
вообще мн действительно интересен ваш ВУЗ , и я написал вам ваш калькулятор, скинуть только забыл т.к. работаю, но раз вы хамите...
Из полезного:
1)используйте строки для ввода, а не double, если числа м.б. десятичными, то учитывайте ввод точки.
2)Литература C++ - очень рекомендую т.к. вы не знаете даже элементарного синтаксиса.
Удачи.
0
MMt
0 / 0 / 0
Регистрация: 29.04.2014
Сообщений: 169
30.05.2014, 01:26  [ТС] #8
dzrtkot, я прошу прощения если мои слова каким либо образом оскорбили Вас. Я не хотел Вас обидеть или оскорбить и тем более хамить.

Вуз у меня хороший и преподаватель не плохой, все дает понятно и скурпулезно преподносит информацию. Но как я уже написал ранее "На занятиях свич еще не проходили. Дошли до If и решить хочу с помощью If. " Это означает что дали задание и инструмент для его решения. Наверняка на то у учителя были обоснованные причины. На этом форуме большая часть людей работает Вы как и я не исключение. И когда задают вопрос с четко поставленой задачей и инструментом как этот вопрос решить и т.д... То ответ хочеться увидеть в формате как БУКВАЛЬНО в соседних ветках:
Среднеарифметическое каждого столбца матрицы: перевод программы с Pascal
Отсортировать массив по убыванию через алгоритм пирамидальной сортировки
Возможно я не прав, но мне не очень нравиться когда на поставленый вопрос получаешь ответ формата:
Цитата Сообщение от MMt Посмотреть сообщение
Русский форум:...
переписал код:
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
#include <iostream>
using namespace std;
 
int main()
    {           
        //Áëîê ââîäó Г¤Г*Г*Г*ГЁГµ. Ââåñòè Г§Г*Г*Г·ГҐГ*Г*Гї 1, Г§Г*Г*Г·ГҐГ*Г*Гї 2, îïåðГ*òîð.
        
        double dVal1;// öèôðîâå Г§Г*Г*Г·ГҐГ*Г*Гї 1
        double dVal2; // öèôðîâå Г§Г*Г*Г·ГҐГ*Г*Гї 2
        double dRes; // ðåçóëüòГ*ГІ ð³âГ*ГїГ*Г*Гї
    
        char func,  cEr3, cEr2, cEr1; // îïåðГ*Г*ГІ     
                
        
        // ââîäèìî Г§Г*Г*Г·ГҐГ*Г*Гї 
        cout << "Enter Number_1 :  "; // 
        cin >> dVal1;
        
        cout << "Enter Number_2 :  ";
        cin >> dVal2;
        
        cout << "Enter Function :  ";
        cin >> func;
        
        //Áëîê îïðГ*öþâГ*Г*Г*Гї.  ГЏГҐГ°ГҐГўВіГ°ГЁГІГЁ Г*Г* Г*Г*ГїГўГ*ВіГ±ГІГј ïîìèëîê. ГЋГЇГ°Г*öþâГ*ГІГЁ ââåäåГ*Ві Г¤Г*Г*Г*Ві/
        
        if ( dVal1 == '$' || dVal2 == '$' )
            cEr1 = 10; // ГЋГёГЁГЎГЄГ*  ГЇГ°ГЁ ââîäå $ âìåñòî îäГ*Г® ГЁГ§ ÷èñëåГ*Г*ûõ Г§Г*Г*Г·ГҐГ*ГЁГ©.
    
        if ( func == '%' )
            cEr2 = 20;  // ГЋГёГЁГЎГЄГ* ïðè èñïîëüçîâГ*Г*ГЁГЁ Г§Г*Г*ГЄГ* %.
                
                else if(func == '*') 
                    dRes = dVal1 * dVal2;
                    
                else if(func == '+') 
                    dRes = dVal1 + dVal2;
                
                else if(func == '-')
                    dRes = dVal1 - dVal2;
                    
                else if (func ==  '/')
                
                {
                    if (dVal1 == 0 || dVal2 == 0)
                        cEr3 = 30;
                    else dRes = dVal1 / dVal2;
                }
        
        
            //Áëîê âèâîäó ðåçóëüòГ*ГІГі.
                
             if ( cEr1 == 10 )
                cout << "You enter $, instead Number_1 or Number_2. \n";
            
             if ( cEr3 == 30 )
                cout << "You enter 0, instead Number_1 or Number_2. You can`t deal at 0. \n";
            
             if ( cEr2 == 20 )
                cout << "You enter %, instead '/'. \n";
                
             else if (cEr1 != 10 && cEr2 != 20 && cEr3 != 30)
                cout << "Result: "<< dRes << endl;
                
        return 0;
    }
Хотелось бы знать почему после в случае ввода $; программа сразу прекращает выполняться и выдает результат ошибки. Как изолировать првоерку или дать команду подождат ьпока пользователь полность не введет все переменные.... ?
имхо: тут, в программировании, как в кун-фу: кун-фу нельзя научить - кун-фу можно научиться.
0
dzrkot
zzzZZZ...
519 / 349 / 53
Регистрация: 11.09.2013
Сообщений: 1,998
30.05.2014, 08:12 #9
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от MMt Посмотреть сообщение
Хотелось бы знать почему после в случае ввода $; программа сразу прекращает выполняться и выдает результат ошибки. Как изолировать првоерку или дать команду подождат ьпока пользователь полность не введет все переменные.... ?
при попытке ввода в double символа '$' ваш компилятор по всей видимости генерирует исключение (это вы пройдёте через какое-то время), обойти это можно 2мя способами, или перехватить это исключение и сделать свою обработку (но думаю вам это делать ещё рано), или как я уже ранее и сказал - числа в char*, а потом преобразовывать их для дальнейших операций

Добавлено через 2 минуты
Цитата Сообщение от dzrkot Посмотреть сообщение
if ( dVal1 != double || dVal2 != double ) dRes = cEr1;
так делать нельзя, компилятор не пропустит. Double -это тип данных typedef. dValx - переменная этого типа, т.е. вещественное число.
0
rikimaru2013
C++ Game Dev
2436 / 1130 / 240
Регистрация: 30.11.2013
Сообщений: 3,687
30.05.2014, 10:27 #10
Цитата Сообщение от MMt Посмотреть сообщение
Прошу подсказать принцип решения задачи. Что-то не то как бы не пробовал написать код...
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
#include <iostream>
using namespace std;
 
int main()
    {           
        double dVal1 = 0; // num1
        double dVal2 = 0; // num2
        double dRes = 0; // result
    
        char func = 0; // оперант  
        int error = 0; // номер ошибки    
      
        cout << "Enter expression ( example:  2 * 3 ):  ";  
        cin >> dVal1 >> func >> dVal2;
 
                
            if ( dVal1 == '$' || dVal2 == '$' )
                error = 10; 
            else if ( func == '%' )
                error = 20; 
            else if(func == '*') 
                dRes = dVal1 * dVal2;                    
            else if(func == '+') 
                dRes = dVal1 + dVal2;                
            else if(func == '-')
                dRes = dVal1 - dVal2;                    
            else if (func ==  '/' && dVal2 != 0)
                dRes = dVal1 / dVal2;
            else if (func ==  '/' && dVal2 == 0)
                error = 30;
            else if(func != 0)
                error = 44; 
            else
                error = 101;
                   
                        
             if ( error == 10 )
                cout << "You enter $, instead Number_1 or Number_2. \n";            
             else if ( error == 30 )
                cout << "You enter 0, instead Number_2. You can`t deal at 0. \n";            
             else if ( error == 20 )
                cout << "You enter %, instead '/'. \n";
             else if ( error == 44 )
                 cout << "You didn't enter correct operant. \n";
             else if( error == 101)
                 cout << "You broken my programm !!! What wrong with you? Why did you do that? \n";
             else 
                cout << "Result: "<< dRes << endl;
                
        return 0;
    }
С теми знаниями, что я вижу у Вас в коде - пока что это оптимальный вариант калькулятора.

P.S. Не пойму зачем вы выделяете % и $ в сообщениях. Для программы эти символы, как и ! & @ это всего лишь какие-то числа типа 52, 13, -27.
0
dzrkot
zzzZZZ...
519 / 349 / 53
Регистрация: 11.09.2013
Сообщений: 1,998
30.05.2014, 10:29 #11
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
if ( dVal1 == '$' || dVal2 == '$' ) error = 10;
у него компилятор исключение генерирует на этом моменте вроде
0
MMt
0 / 0 / 0
Регистрация: 29.04.2014
Сообщений: 169
02.06.2014, 16:56  [ТС] #12
Выделяю по заданию. Одно из условий, чтоб при вводе выше указаных символов калькулятор выдавал сообщение какой именно символ был введен не верно.

Добавлено через 7 минут
dzrkot , спасибо за овтет. Теперь понятно, частично, что к чему. Думаю мне просто не хватает знаний, чтоб преобразовать решение в правильный код. Приходиться плясать из того что знаю.
dzrkot , прошу простить меня, если раньше мои ответы были слишком резкими.

При написании калькулятора с рядом определлных условий, возникают подводные камни и ошбики... а как их исправить? Соответствено я начинаю задаватьсявопросом как их решить и лезу читать Шилдта и т.д... Думаю в этом и есь суть задания, искать не одно решение поставленной задачи. А чтото читать вне программы и развиваться.

Думаю больше в эту тему не зайду, так как калькулятор написал.
0
dzrkot
zzzZZZ...
519 / 349 / 53
Регистрация: 11.09.2013
Сообщений: 1,998
02.06.2014, 16:59 #13
Цитата Сообщение от MMt Посмотреть сообщение
читать Шилдта
имхо читайте Дейтла и С.Прата
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.06.2014, 16:59
Привет! Вот еще темы с ответами:

Написать простейший калькулятор - C++
задача на оператор выбора С++ Написать программу, которая вводит 2 числа и символ операции (*,/,-,+). Затем в зависимости от символа,...

Написать калькулятор, используя класс - C++
Добрый вечер. Не понимаю я ООП и пока трудно оно мне даётся, задача лабы вот такая: &quot;Создайте программу калькулятор, используя класс....

Написать калькулятор, работающий с дробями - C++
Нужна помошь!Долго пытался На с++ не получается написать дробный калькулятор.

Написать калькулятор логических выражений на С - C++
Здравствуйте. Помогите, пожалуйста, написать программу. Реализовать калькулятор – программу которая вычисляет логическое выражение...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
02.06.2014, 16:59
Ответ Создать тему
Опции темы

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