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

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

Восстановить пароль Регистрация
 
MMt
0 / 0 / 0
Регистрация: 29.04.2014
Сообщений: 168
29.05.2014, 12:08     Написать калькулятор с объектно–ориентированным подходом #1
Написать калькулятор, но с объектно–ориентированным подходом, и выводом пользователю информации о возможных ошибках (деление на 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;
    }
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.05.2014, 12:08     Написать калькулятор с объектно–ориентированным подходом
Посмотрите здесь:

объектно-ориентированный анализ,объектно-ориентированное проектирование C++
C++ Простой калькулятор в объектно-ориентированном стиле
C++ Помогите с Объектно Ориентированным Программированием. Комплексные числа
Написать калькулятор логических выражений на С C++
Работа с Ориентированным графом C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 5
Завершенные тесты: 1
29.05.2014, 12:45     Написать калькулятор с объектно–ориентированным подходом #2
Откройте тайну каков сакральный смысл это ереси?
C++
1
        dVal1 = (char) dVal1;
Да еще до ввода данных...
dzrkot
zzzZZZ...
 Аватар для dzrkot
516 / 346 / 53
Регистрация: 11.09.2013
Сообщений: 1,977
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
MMt
0 / 0 / 0
Регистрация: 29.04.2014
Сообщений: 168
29.05.2014, 17:58  [ТС]     Написать калькулятор с объектно–ориентированным подходом #4
На занятиях свич еще не проходили. Дошли до If и решить хочу с помощью If.

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

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

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

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

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

Если нечего сказать по сути или полезного, прошу в эту тему больше не флудить.
dzrkot
zzzZZZ...
 Аватар для dzrkot
516 / 346 / 53
Регистрация: 11.09.2013
Сообщений: 1,977
29.05.2014, 19:21     Написать калькулятор с объектно–ориентированным подходом #7
Цитата Сообщение от MMt Посмотреть сообщение
Если нечего сказать по сути или полезного, прошу в эту тему больше не флудить.
вообще мн действительно интересен ваш ВУЗ , и я написал вам ваш калькулятор, скинуть только забыл т.к. работаю, но раз вы хамите...
Из полезного:
1)используйте строки для ввода, а не double, если числа м.б. десятичными, то учитывайте ввод точки.
2)Литература C++ - очень рекомендую т.к. вы не знаете даже элементарного синтаксиса.
Удачи.
MMt
0 / 0 / 0
Регистрация: 29.04.2014
Сообщений: 168
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;
    }
Хотелось бы знать почему после в случае ввода $; программа сразу прекращает выполняться и выдает результат ошибки. Как изолировать првоерку или дать команду подождат ьпока пользователь полность не введет все переменные.... ?
имхо: тут, в программировании, как в кун-фу: кун-фу нельзя научить - кун-фу можно научиться.
dzrkot
zzzZZZ...
 Аватар для dzrkot
516 / 346 / 53
Регистрация: 11.09.2013
Сообщений: 1,977
30.05.2014, 08:12     Написать калькулятор с объектно–ориентированным подходом #9
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от MMt Посмотреть сообщение
Хотелось бы знать почему после в случае ввода $; программа сразу прекращает выполняться и выдает результат ошибки. Как изолировать првоерку или дать команду подождат ьпока пользователь полность не введет все переменные.... ?
при попытке ввода в double символа '$' ваш компилятор по всей видимости генерирует исключение (это вы пройдёте через какое-то время), обойти это можно 2мя способами, или перехватить это исключение и сделать свою обработку (но думаю вам это делать ещё рано), или как я уже ранее и сказал - числа в char*, а потом преобразовывать их для дальнейших операций

Добавлено через 2 минуты
Цитата Сообщение от dzrkot Посмотреть сообщение
if ( dVal1 != double || dVal2 != double ) dRes = cEr1;
так делать нельзя, компилятор не пропустит. Double -это тип данных typedef. dValx - переменная этого типа, т.е. вещественное число.
rikimaru2013
C++ Game Dev
 Аватар для rikimaru2013
2137 / 970 / 223
Регистрация: 30.11.2013
Сообщений: 3,240
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.
dzrkot
zzzZZZ...
 Аватар для dzrkot
516 / 346 / 53
Регистрация: 11.09.2013
Сообщений: 1,977
30.05.2014, 10:29     Написать калькулятор с объектно–ориентированным подходом #11
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
if ( dVal1 == '$' || dVal2 == '$' ) error = 10;
у него компилятор исключение генерирует на этом моменте вроде
MMt
0 / 0 / 0
Регистрация: 29.04.2014
Сообщений: 168
02.06.2014, 16:56  [ТС]     Написать калькулятор с объектно–ориентированным подходом #12
Выделяю по заданию. Одно из условий, чтоб при вводе выше указаных символов калькулятор выдавал сообщение какой именно символ был введен не верно.

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

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

Думаю больше в эту тему не зайду, так как калькулятор написал.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.06.2014, 16:59     Написать калькулятор с объектно–ориентированным подходом
Еще ссылки по теме:

C++ Посоветуйте как написать калькулятор
Написать калькулятор, работающий с дробями C++
C++ Написать простейший калькулятор

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

Или воспользуйтесь поиском по форуму:
dzrkot
zzzZZZ...
 Аватар для dzrkot
516 / 346 / 53
Регистрация: 11.09.2013
Сообщений: 1,977
02.06.2014, 16:59     Написать калькулятор с объектно–ориентированным подходом #13
Цитата Сообщение от MMt Посмотреть сообщение
читать Шилдта
имхо читайте Дейтла и С.Прата
Yandex
Объявления
02.06.2014, 16:59     Написать калькулятор с объектно–ориентированным подходом
Ответ Создать тему
Опции темы

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