Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/146: Рейтинг темы: голосов - 146, средняя оценка - 4.55
1 / 1 / 1
Регистрация: 22.10.2013
Сообщений: 42
1

Написать калькулятор, используя класс

24.10.2013, 20:59. Показов 30219. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый вечер. Не понимаю я ООП и пока трудно оно мне даётся, задача лабы вот такая:

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

Вот то, что я сделал:
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
#include <iostream>
#include <math.h>
#include <Windows.h>
using namespace std;
 
 
class Calculator
{
 
 
public:
    float a1,b1,rezult; //чертеж, абстракция класса
    Calculator();//конструктор
    Calculator(float a, float b)//конструктор с параметрами
    {
        a1=a; b1=b;
    }
    
        Calculator operator+(Calculator);//объявляю операцию сложения
        Calculator operator-(Calculator);//Объявляю операцию вычитания
        Calculator operator/(Calculator);//Объявляю операцию деления
        Calculator operator*(Calculator);//Объявляю операцию умножения
 
        
 
            
        
    };
 
int main ()
{
return 0;
}



и что делать дальше , увы, не знаю. Если кто нибудь напишет программу с комментариями буду очень благодарен. Достаточно с одним действием, дальше разберусь. Калькулятор такой : ввожу первую переменную, enter, потом ввожу знак действия,enter, вторая переменная enter, ответ. то есть не в строку пишу всё это.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.10.2013, 20:59
Ответы с готовыми решениями:

Используя рекурсию написать программу Калькулятор
Составьте программу реализации калькулятора, выполняет действия +, –, *, / в арифметическом...

Написать калькулятор используя массив указателей
Добрый вечер уважаемые форумчане. Не так давно начал учить С++ возник вопрос в котором сам к...

Разработать программу используя класс калькулятор с полями x, y - целые числа и методы +, -, /, *) и вывода ре
Разработать программу используя класс калькулятор с полями x, y - целые числа и методы +, -, /, *)...

Класс Калькулятор, написать комментарии
Доброго всем времени суток! Уважаемые жители форума, у меня к вам есть вот какая просьба! Я...

17
16 / 16 / 11
Регистрация: 23.10.2013
Сообщений: 60
24.10.2013, 21:03 2
это в Qt (среда разработки)?

Добавлено через 1 минуту
тебе надо в графике это сделать?
0
1 / 1 / 1
Регистрация: 22.10.2013
Сообщений: 42
24.10.2013, 21:05  [ТС] 3
Спасибо за ответ. Я делаю в Visual Studio, с++, консоль получается. не графика
0
16 / 16 / 11
Регистрация: 23.10.2013
Сообщений: 60
24.10.2013, 21:08 4
хоть у меня visual studio не стоит (там и в графике тоже можно), #include <Windows.h> - походу графика. я постараюсь сделать в консоли. тебе когда сделать надо?
0
1 / 1 / 1
Регистрация: 22.10.2013
Сообщений: 42
24.10.2013, 21:18  [ТС] 5
Ой. не обращай пожалуйста внимание на библиотеку windows.h, я её для себя делаю для задержки экрана во время теста проги с помощью Sleep(50000); просто 50 сек у меня открыта консоль и всё. Без неё нужно делать вобще. извиняюсь, если ввёл этим в заблуждение) мне вобще к завтра сдавать,иначе хвостик, но делай как у тебя со временем. мне в целом то главное понять потом принцип ООП, оценки то фиг с ними.
0
CEO SOVAZ Corp.
386 / 232 / 51
Регистрация: 17.12.2011
Сообщений: 822
Записей в блоге: 1
24.10.2013, 21:52 6
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
#include <iostream>
#include <String>
 
using namespace std;
 
class Calculator {
private:
    double a, b;//переменные класса
    string action;//переменные класса
public:
    Calculator();//конструктор по умолчанию
    Calculator(double a_, string action_, double b_);//конструктор с параметрами
    double result() {//функция расчета и вывода результата
        if(action == "+") {
            cout << a + b;
        }
 
        if(action == "-") {
            cout << a - b;
        }
 
        if(action == "*") {
            cout << a * b;
        }
 
        if(action == "/") {
            if(b == 0) {//проверка на деление на 0
                cout << "Error!";
                return 0;
            }
            cout << a / b;
        }
    }
 
};
 
Calculator::Calculator() : a(2), action("*"), b(4) {} //конструктор по умолчанию
 
Calculator::Calculator(double a_, string action_, double b_) : a(a_), action(action_), b(b_) {} //конструктор с параметрами
 
int main() {
    double a, b;
    string action;
 
    cin >> a >> action >> b;
 
    Calculator calc(a, action, b);//объявление класса Calculator
    calc.result();//выполнение ф-ии result
    cin >> a;//задержка консоли (ожидание ввода) :)
}
3
1 / 1 / 1
Регистрация: 22.10.2013
Сообщений: 42
24.10.2013, 22:08  [ТС] 7
Спасибо большое! Сейчас буду разбираться и понимать:-)
0
CEO SOVAZ Corp.
386 / 232 / 51
Регистрация: 17.12.2011
Сообщений: 822
Записей в блоге: 1
24.10.2013, 22:12 8
Цитата Сообщение от kychka Посмотреть сообщение
Спасибо большое! Сейчас буду разбираться и понимать:-)
Если что, обращайся
1
1 / 1 / 1
Регистрация: 22.10.2013
Сообщений: 42
24.10.2013, 22:47  [ТС] 9
Спасибо такой вопрос возник: почему ты использовал string, а не char? нам ведь всего один символ нужно ввести (знак действия). остальное перевариваю, вроде пока понял в целом
0
CEO SOVAZ Corp.
386 / 232 / 51
Регистрация: 17.12.2011
Сообщений: 822
Записей в блоге: 1
24.10.2013, 22:48 10
Цитата Сообщение от kychka Посмотреть сообщение
Спасибо такой вопрос возник: почему ты использовал string, а не char? нам ведь всего один символ нужно ввести (знак действия). остальное перевариваю, вроде пока понял в целом
Привык к string. Хотя ты прав. Эффективней, конечно, будет char.
0
1 / 1 / 1
Регистрация: 22.10.2013
Сообщений: 42
24.10.2013, 23:09  [ТС] 11
Ага, ок. )Заменил для интереса все string на char, не подключал библиотеку <string> и столкнулся с ошибкой

Вот скрин
http://cs408320.vk.me/v4083203... ADL4AA.jpg


Мне это не критично в самой лабе,но просто лично интересно почему так происходит Я кстати с использованием switch пытался делать эту программу ещё)
0
16 / 16 / 11
Регистрация: 23.10.2013
Сообщений: 60
24.10.2013, 23:15 12
файл calc.h
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
#ifndef CALC
#define CALC
 
#include <cstdlib>
#include <stdio.h>
#include <iostream>
 
class Calculator
{
    private:
    float a_;
    float b_;
    float res;
    char oper;
 
    public:
    Calculator();
    void plus();
    void minus();
    void mul();
    void div();
    void print_res();
};
 
#endif
файл calc.cpp
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
#include "calc.h"
 
Calculator::Calculator()
{
    char str[30];
    char c;
    int i;
    char * a;
    char * b;
    char oper;
    int a_len;
    int b_len;
    bool b_error;
 
    printf("Enter expression: ");
    scanf("%s", str);
 
    i=0;
    c='1';
    a_len=0;
    b_len=0;
    b_error=false;
 
    while(c!='\0')
    {
        c=str[i];
        if(c=='-')
        {
            i++;
            a_len++;
            c=str[i];
        }
        while( (c!='+') && (c!='-') && (c!='*') && (c!='/') && (c!='\0') )
        {
            c=str[i];
            i++;
            a_len++;
        }
        if(c=='\0')
        {
            printf("Error!");
            b_error=true;
            break;
        }
        while(c!='\0')
        {
            c=str[i];
            i++;
            b_len++;
        }
    }
 
    if(b_error==false)
    {
        a_len--;
        b_len--;
 
        a = new char[a_len+1];
        b = new char[b_len+1];
 
        i=0;
        for(int j=0; j<a_len; j++)
        {
            a[j]=str[i];
            i++;
        }
        a[a_len]='\0';
        oper=str[i];
        i++;
        for(int j=0; j<b_len; j++)
        {
            b[j]=str[i];
            i++;
        }
        b[b_len]='\0';
 
        a_=atof(a);
        b_=atof(b);
 
        if(oper=='+')
        {
            plus();
        }
        else if(oper=='-')
        {
            minus();
        }
        else if(oper=='*')
        {
            mul();
        }
        else
        {
            div();
        }
        if(b_==0 && oper=='/')
        {
            printf("Error!");
        }
        else
        {
            print_res();
        }
    }
}
 
void Calculator::plus()
{
    res=a_+b_;
}
 
void Calculator::minus()
{
    res=a_-b_;
}
 
void Calculator::mul()
{
    res=a_*b_;
}
 
void Calculator::div()
{
    if(b_!=0)
    {
        res=a_/b_;
    }
}
 
void Calculator::print_res()
{
    printf("Result:%f",res);
}
файл main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <stdio.h>
#include "calc.h"
 
using namespace std;
 
int main()
{
    class Calculator * calc;
    calc=new Calculator();
    getchar();
    delete calc;
    return 0;
}
Добавлено через 4 минуты
у меня без задержки ввода) прям сразу пишешь выражение и тебе все посчитают)
1
1 / 1 / 1
Регистрация: 22.10.2013
Сообщений: 42
24.10.2013, 23:16  [ТС] 13
и ещё.. для чего черточки после переменных параметров? _
0
16 / 16 / 11
Регистрация: 23.10.2013
Сообщений: 60
24.10.2013, 23:19 14
это просто, чтобы не перепутать с теми, которые используются в конструкторе. там char * a;, а в классе хранятся float a_;
1
1 / 1 / 1
Регистрация: 22.10.2013
Сообщений: 42
24.10.2013, 23:27  [ТС] 15
Спасибо тебе большое! Почему то не могу поставить спасибо, как sovaz1997. нет этой кнопки. как она у тебя появится - я сразу) код буду смотреть еще и понимать. Потом ещё отпишусь Спасибо вам за помощь. =)
0
16 / 16 / 11
Регистрация: 23.10.2013
Сообщений: 60
24.10.2013, 23:45 16
да мне рейтинг не нужен) пожалуйста)
1
0 / 0 / 0
Регистрация: 28.11.2013
Сообщений: 11
07.10.2014, 11:09 17
Подскажите пожалуйста, а как сделать, чтобы не было ограничений на входящие параметры. то есть чтобы пользователь вводил выражение, состоящие из неограниченного кол-ва чисел( операции только сложение и вычитание)?
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
16844 / 6723 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
07.10.2014, 14:54 18
Если по простому, то можно как-то так
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
#include <iostream>
 
struct BadExpression{};
 
class Calculator
{
    enum { MINUS = '-', PLUS = '+' };
    double number;
    char operation;
    double result;
 
public:
    void parse(const std::string&);
    double getResult() const ;
    inline bool isDigitOrDot(const char);
    inline bool isValidSymbol(const char);
};
 
int main(int argc, char *argv[])
{
    std::string line;
    
    std::cout << "Enter expression.." << std::endl;
    std::getline(std::cin, line);
    
    try
    {
        Calculator calc;
        calc.parse(line);
        std::cout << std::endl << "Result: " << calc.getResult() << std::endl;
    }
    catch(BadExpression)
    {
        std::cout << "Bad expression" << std::endl;
    }
}
 
 
void Calculator::parse(const std::string& expression)
{
    result = 0.;
    bool first = true;
    
    for(std::size_t i = 0, cnt = expression.size(); i < cnt; ++i)
    {
        if(!isValidSymbol(expression[i]))
            throw BadExpression();
        if(!isDigitOrDot(expression[i]))
            operation = expression[i++];
        if(!isDigitOrDot(expression[i]))
            throw BadExpression();
        std::string tmp = "";
        while(i < cnt && isDigitOrDot(expression[i]))
            tmp += expression[i++];
        --i;
        number = std::atof(tmp.c_str());
        if(first)
        {
            first = false;
            result = number;
            continue;
        }
        if(operation == MINUS)
            result -= number;
        else if(operation == PLUS)
            result += number;
    }
}
 
double Calculator::getResult() const
{
    return result;
}
 
inline bool Calculator::isDigitOrDot(const char c)
{
    return c == '.' || isdigit(c);
}
 
inline bool Calculator::isValidSymbol(const char c)
{
    return isDigitOrDot(c) || c == MINUS || c == PLUS;
}
0
07.10.2014, 14:54
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.10.2014, 14:54
Помогаю со студенческими работами здесь

Как преобразовать обычный калькулятор в калькулятор использующий класс стек?
#include &lt;iostream&gt; int main(){ int a = 0; int b = 0; char operation; ...

Реализовать класс Goods используя для представления цены класс Money
Реализовать класс Goods (пункт 1 ), используя для представления цены класс Money с пункта 2...

Написать консольный калькулятор используя паттерны проектирования
Нужно было написать калькулятор, который реализует стандартные операции &quot;+,-,*,/&quot;. И выбрать...

Используя оператор выбора, написать программу, которая работала бы как калькулятор
Используя оператор выбора, написать программу, которая работала бы как калькулятор...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru