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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.64
ozzy_b
2 / 2 / 0
Регистрация: 02.10.2012
Сообщений: 169
#1

Функция дужки(приоритет операций) в калькуляторе - C++

21.11.2012, 12:47. Просмотров 1726. Ответов 24
Метки нет (Все метки)

Надо сделать скобки в калькуляторе: сделать дополнительную ф-цию которая будет считать введеные даные после ввода "(", после ввода ")" возвращает результат в главную функцию(ну вместо ). Ну глянув на код ошибок вроде нет, но не компиируесть он.
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
#include <iostream>
#include <conio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
using namespace std;
int calc2(int);
int main ()
{
    float g, res=0, res2;
    bool EXIT = false;
    char str[100],op='\0',history[255];
    history[0]='\0';
    while (EXIT == false)
    {
        cout << "Input string: ";
        cin >> str;
        strcat(history,str);
        if (str[0] == '=') EXIT = true;
        g = atof(str);
        float G = atof(str);
        if (g==0) op = str[0];
        else
        {  
            if  (op!='\0')
            {
                if (op == '+') res+=g;
                if (op == '-') res-=g;
                if (op == '*') res*=g;
                if (op == '/') res/=g;
                if (op == 's') res=(sin(g));
                if (op == 'c') res=cos(g);
                if (op == 't') res=tan(g);
                if ((op == 'С')&& (g!=0)) res=1/(tan(g));
                if (op == 'l') res=log(g);
                if (op == '^') res=pow(res,g);
                if (op == '(') 
                    {
                        calc2(res2);
                        if (op == ')')
                        res=res2;
                    }
                op = '\0';
            }
            else res = g;
        }
    }
    cout << history << res; 
    getch();
    return 0;
}
int calc2(int res2)
{
    float g;
    bool EXIT = false;
    char str[100],op='\0';
    while (EXIT == false)
    {
        cout << "Input string: ";
        cin >> str;
        if (str[0] == '=') EXIT = true;
        g = atof(str);
        float G = atof(str);
        if (g==0) op = str[0];
        else
        {  
            if  (op!='\0')
            {
                if (op == '+') res2+=g;
                if (op == '-') res2-=g;
                if (op == '*') res2*=g;
                if (op == '/') res2/=g;
                if (op == 's') res2=(sin(g));
                if (op == 'c') res2=cos(g);
                if (op == 't') res2=tan(g);
                if ((op == 'С')&& (g!=0)) res2=1/(tan(g));
                if (op == 'l') res2=log(g);
                if (op == '^') res2=pow(res2,g);
                if (op == ')') return res2;
                op = '\0';
            }
            
        }
}
Добавлено через 7 минут
Теперь компилюеться, но не работает так как надо(
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>
#include <conio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h> 
using namespace std;
int calc2(int);
int main ()
{
    float g, res=0, res2=0;
    bool EXIT = false;
    char str[100],op='\0',history[255];
    history[0]='\0';
    while (EXIT == false)
    {
        cout << "Input string: ";
        cin >> str;
        strcat(history,str);
        if (str[0] == '=') EXIT = true;
        g = atof(str);
        float G = atof(str);
        if (g==0) op = str[0];
        else
        {  
            if  (op!='\0')
            {
                if (op == '+') res+=g;
                if (op == '-') res-=g;
                if (op == '*') res*=g;
                if (op == '/') res/=g;
                if (op == 's') res=(sin(g));
                if (op == 'c') res=cos(g);
                if (op == 't') res=tan(g);
                if ((op == 'С')&& (g!=0)) res=1/(tan(g));
                if (op == 'l') res=log(g);
                if (op == '^') res=pow(res,g);
                if (op == '(') 
                    {
                        calc2(res2);
                        res=res2;
                    }
                op = '\0';
            }
            else res = g;
        }
    }
    cout << history << res; 
    getch();
    return 0;
}
int calc2(int res2)
{
    float g;
    bool EXIT = false;
    char str[100],op='\0';
    while (EXIT == false)
    {
        cout << "Input string: ";
        cin >> str;
        if (str[0] == '=') EXIT = true;
        g = atof(str);
        float G = atof(str);
        if (g==0) op = str[0];
        else
        {  
            if  (op!='\0')
            {
                if (op == '+') res2+=g;
                if (op == '-') res2-=g;
                if (op == '*') res2*=g;
                if (op == '/') res2/=g;
                if (op == 's') res2=(sin(g));
                if (op == 'c') res2=cos(g);
                if (op == 't') res2=tan(g);
                if ((op == 'С')&& (g!=0)) res2=1/(tan(g));
                if (op == 'l') res2=log(g);
                if (op == '^') res2=pow(res2,g);
                if (op == ')') return res2;
                op = '\0';
            }
        }
}
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.11.2012, 12:47
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Функция дужки(приоритет операций) в калькуляторе (C++):

Приоритет операций - C++
Здравствуйте, а не подскажите что в С-подобных языках приоритетнее: сложение/вычитание, побитовые операции, умножение/деление

приоритет операций - C++
while(*a++==*b++ &amp;&amp; *a!=NULL) хочу сравнить до конца строки &quot;а&quot;. почему не работает? где-то дело в приоритете, а где найти не...

Приоритет побитовых операций - C++
Всем привет. Столкнулся с непоняшкой: // Объявляем два массива и инициализируем их unsigned char A={0xFF, 0x03, 0x00,...

Логические операции и приоритет операций - C++
Привет всем, объясните, пожалуйста: 1)За что отвечает эта часть кода? bool xor(bool a, bool b) { return (a||b)&amp;&amp;!(a&amp;&amp;b); } ...

Перегрузка операций: friend-функция или функция-член класса - C++
Здравствуйте, меня интересует вопрос, в чем разница при перегрузке операторов через operator и friend. Вот к примеру такой код. class...

Відкрити текстовий файл та вивести його вміст на екран ЕОМ за виключенням усіх узятих у дужки фраз - C++
Відкрити текстовий файл та вивести його вміст на екран ЕОМ за виключенням усіх узятих у дужки фраз. Символи дужок також не друкувати

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Oberok
5 / 5 / 0
Регистрация: 11.03.2011
Сообщений: 40
21.11.2012, 12:48 #2
Не хватает закрывающей фигурной скобки в функции "calc2"
margarin
36 / 36 / 0
Регистрация: 02.06.2012
Сообщений: 332
21.11.2012, 13:11 #3
приведи пример (чему равно res2) из этой строки:
C++
1
if ((op == 'С')&& (g!=0)) res2=1/(tan(g));
ozzy_b
2 / 2 / 0
Регистрация: 02.10.2012
Сообщений: 169
21.11.2012, 13:31  [ТС] #4
margarin, в смысле?
margarin
36 / 36 / 0
Регистрация: 02.06.2012
Сообщений: 332
21.11.2012, 13:50 #5
спрашиваю, целочисленный тип для res2 подходит?
Цитата Сообщение от ozzy_b Посмотреть сообщение
C++
1
int calc2(int);
Цитата Сообщение от ozzy_b Посмотреть сообщение
C++
1
float g, res=0, res2=0;
второй вопрос, что ты тут вводишь?
C++
1
cin >> str;
ozzy_b
2 / 2 / 0
Регистрация: 02.10.2012
Сообщений: 169
21.11.2012, 13:57  [ТС] #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
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
#include <iostream>
#include <conio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h> 
using namespace std;
int calc2(int);
int main ()
{
    float g, res=0, res2=0;
    bool EXIT = false;
    char str[100],op='\0',history[255];
    history[0]='\0';
    while (EXIT == false)
    {
        cout << "Input string: ";
        cin >> str;
        strcat(history,str);
        if (str[0] == '=') EXIT = true;
        
        g = atof(str);
        float G = atof(str);
        if (g==0) op = str[0];
        else
        {  
            if  (op!='\0')
            {
                if (op == '+') res+=g;
                if (op == '-') res-=g;
                if (op == '*') res*=g;
                if (op == '/') res/=g;
                if (op == 's') res=(sin(g));
                if (op == 'c') res=cos(g);
                if (op == 't') res=tan(g);
                if (op == 'l') res=log(g);
                if (op == '^') res=pow(res,g);  
                if (op == '(') 
                {
                    calc2(res2);
                    res=res2;
                }
                op = '\0';
            }
            else res = g;
        }
    }
    cout << history << res; 
    getch();
    return 0;
}
int calc2(int res2)
{
    float g;
    bool EXIT = false;
    char str[100],op='\0';
    while (EXIT == false)
    {
        cout << "Input string: ";
        cin >> str;
        if (str[0] == ')') return res2;
        g = atof(str);
        float G = atof(str);
        if (g==0) op = str[0];
        else
        {  
            if  (op!='\0')
            {
                if (op == '+') res2+=g;
                if (op == '-') res2-=g;
                if (op == '*') res2*=g;
                if (op == '/') res2/=g;
                if (op == 's') res2=(sin(g));
                if (op == 'c') res2=cos(g);
                if (op == 't') res2=tan(g);
                if (op == 'l') res2=log(g);
                if (op == '^') res2=pow(res2,g);
                op = '\0';
            }
        }
    }
}
Добавлено через 2 минуты
margarin, нет, так как в скобках тоже надо вводить действительные числа. "cin >> str;" - Здесь вводиться строка(сначала число, ентер, знак операции, ентер, опять число.... или = и вивод результата)

Добавлено через 4 минуты
Цитата Сообщение от margarin Посмотреть сообщение
спрашиваю, целочисленный тип для res2 подходит?




второй вопрос, что ты тут вводишь?
C++
1
cin >> str;
а, понял, там был флоат, а там инт. исправил. Но всеравно, как сделать правильно скобки не знаю(

Добавлено через 21 секунду
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
#include <iostream>
#include <conio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h> 
using namespace std;
float calc2(float);
int main ()
{
    float g, res=0, res2=0;
    bool EXIT = false;
    char str[100],op='\0',history[255];
    history[0]='\0';
    while (EXIT == false)
    {
        cout << "Input string: ";
        cin >> str;
        strcat(history,str);
        if (str[0] == '=') EXIT = true;
        g = atof(str);
        float G = atof(str);
        if (g==0) op = str[0];
        else
        {  
            if  (op!='\0')
            {
                if (op == '+') res+=g;
                if (op == '-') res-=g;
                if (op == '*') res*=g;
                if (op == '/') res/=g;
                if (op == 's') res=(sin(g));
                if (op == 'c') res=cos(g);
                if (op == 't') res=tan(g);
                if (op == 'l') res=log(g);
                if (op == '^') res=pow(res,g);  
                if (op == '(') 
                {
                    calc2(res2);
                    res=res2;
                }
                op = '\0';
            }
            else res = g;
        }
    }
    cout << history << res; 
    getch();
    return 0;
}
float calc2(float res2)
{
    float g;
    bool EXIT = false;
    char str[100],op='\0';
    while (EXIT == false)
    {
        cout << "Input string: ";
        cin >> str;
        if (str[0] == ')') return res2;
        g = atof(str);
        float G = atof(str);
        if (g==0) op = str[0];
        else
        {  
            if  (op!='\0')
            {
                if (op == '+') res2+=g;
                if (op == '-') res2-=g;
                if (op == '*') res2*=g;
                if (op == '/') res2/=g;
                if (op == 's') res2=(sin(g));
                if (op == 'c') res2=cos(g);
                if (op == 't') res2=tan(g);
                if (op == 'l') res2=log(g);
                if (op == '^') res2=pow(res2,g);
                op = '\0';
            }
        }
    }
}
margarin
21.11.2012, 14:18
  #7

Не по теме:

а зачем ты str массивом сделал то?О_о

ozzy_b
2 / 2 / 0
Регистрация: 02.10.2012
Сообщений: 169
21.11.2012, 14:24  [ТС] #8
margarin, я не знаю, как препод написал на доске, так я и сделал себе. Несчитая скобок, калькулятор считал все правильно.
margarin
36 / 36 / 0
Регистрация: 02.06.2012
Сообщений: 332
21.11.2012, 14:30 #9
Цитата Сообщение от ozzy_b Посмотреть сообщение
C++
1
history[0]='\0';
Цитата Сообщение от ozzy_b Посмотреть сообщение
C++
1
strcat(history,str);
ты какой то беспощадный программист
Если я правильно понимаю, то тут так же нужно писать str[0] или нет?

На счёт скобок:
ты передаешь
C++
1
calc2(res2);
а потом? ты же возвращаемое значение никуда не записываешь, не?

Добавлено через 1 минуту

Не по теме:

если даже всё работает - это не значит, что всё правильно и в следствии могут вылезти проблемы...

ozzy_b
2 / 2 / 0
Регистрация: 02.10.2012
Сообщений: 169
21.11.2012, 14:31  [ТС] #10
margarin, я же res2 тут просваеваю значения(зависимо от операции)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
if  (op!='\0')
            {
                if (op == '+') res2+=g;
                if (op == '-') res2-=g;
                if (op == '*') res2*=g;
                if (op == '/') res2/=g;
                if (op == 's') res2=(sin(g));
                if (op == 'c') res2=cos(g);
                if (op == 't') res2=tan(g);
                if (op == 'l') res2=log(g);
                if (op == '^') res2=pow(res2,g);
                op = '\0';
            }
margarin
36 / 36 / 0
Регистрация: 02.06.2012
Сообщений: 332
21.11.2012, 14:37 #11
это уже в calc2...
Ну вот смотри:
я тебе говорю посчитай (2-4)
ты считаешь и говоришь -2
а вот это "-2" я не запоминаю... А в моей "res2" остаётся (2-4)
Получается, что зря считал

Добавлено через 1 минуту
могу ошибаться (ещё не всё понял), но попробуй вместо:
C++
1
2
calc2(res2);
res=res2;
C++
1
res = calc2(res2);
ozzy_b
2 / 2 / 0
Регистрация: 02.10.2012
Сообщений: 169
21.11.2012, 14:46  [ТС] #12
margarin, и как "запомнить" ето значение? Во так?
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
#include <iostream>
#include <conio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h> 
using namespace std;
int calc2(float, float);
int main ()
{
    float g, res=0, res2=0, RES=0;
    bool EXIT = false;
    char str[100],op='\0',history[255];
    history[0]='\0';
    while (EXIT == false)
    {
        cout << "Input string: ";
        cin >> str;
        strcat(history,str);
        if (str[0] == '=') EXIT = true;
        g = atof(str);
        float G = atof(str);
        if (g==0) op = str[0];
        else
        {  
            if  (op!='\0')
            {
                if (op == '+') res+=g;
                if (op == '-') res-=g;
                if (op == '*') res*=g;
                if (op == '/') res/=g;
                if (op == 's') res=(sin(g));
                if (op == 'c') res=cos(g);
                if (op == 't') res=tan(g);
                if (op == 'l') res=log(g);
                if (op == '^') res=pow(res,g);  
                if (op == '(') 
                {
                    calc2(res2, RES);
                    res=RES;
                }
                op = '\0';
            }
            else res = g;
        }
    }
    cout << history << res; 
    getch();
    return 0;
}
int calc2(float res2, float RES)
{
    float g;
    bool EXIT = false;
    char str[100],op='\0';
    while (EXIT == false)
    {
        cout << "Input string: ";
        cin >> str;
        g = atof(str);
        float G = atof(str);
        if (g==0) op = str[0];
        else
        {  
            if  (op!='\0')
            {
                if (op == '+') res2+=g;
                if (op == '-') res2-=g;
                if (op == '*') res2*=g;
                if (op == '/') res2/=g;
                if (op == 's') res2=(sin(g));
                if (op == 'c') res2=cos(g);
                if (op == 't') res2=tan(g);
                if (op == 'l') res2=log(g);
                if (op == '^') res2=pow(res2,g);
                op = '\0';
            }
        }
        RES=res2;
        if (str[0] == ')') return RES;
    }
}
Та не считает(

Добавлено через 5 минут
И так тоже((
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
#include <iostream>
#include <conio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h> 
using namespace std;
int calc2(float);
int main ()
{
    float g, res=0, res2=0, RES=0;
    bool EXIT = false;
    char str[100],op='\0',history[255];
    history[0]='\0';
    while (EXIT == false)
    {
        cout << "Input string: ";
        cin >> str;
        strcat(history,str);
        if (str[0] == '=') EXIT = true;
        g = atof(str);
        float G = atof(str);
        if (g==0) op = str[0];
        else
        {  
            if  (op!='\0')
            {
                if (op == '+') res+=g;
                if (op == '-') res-=g;
                if (op == '*') res*=g;
                if (op == '/') res/=g;
                if (op == 's') res=(sin(g));
                if (op == 'c') res=cos(g);
                if (op == 't') res=tan(g);
                if (op == 'l') res=log(g);
                if (op == '^') res=pow(res,g);  
                if (op == '(') 
                {
                    res = calc2(res2);
                }
                op = '\0';
            }
            else res = g;
        }
    }
    cout << history << res; 
    getch();
    return 0;
}
int calc2(float res2)
{
    float g;
    bool EXIT = false;
    char str[100],op='\0';
    while (EXIT == false)
    {
        cout << "Input string: ";
        cin >> str;
        g = atof(str);
        float G = atof(str);
        if (g==0) op = str[0];
        else
        {  
            if  (op!='\0')
            {
                if (op == '+') res2+=g;
                if (op == '-') res2-=g;
                if (op == '*') res2*=g;
                if (op == '/') res2/=g;
                if (op == 's') res2=(sin(g));
                if (op == 'c') res2=cos(g);
                if (op == 't') res2=tan(g);
                if (op == 'l') res2=log(g);
                if (op == '^') res2=pow(res2,g);
                op = '\0';
            }
        }
        if (str[0] == ')') return res2;
    }
}
margarin
36 / 36 / 0
Регистрация: 02.06.2012
Сообщений: 332
21.11.2012, 14:50 #13
Цитата Сообщение от ozzy_b Посмотреть сообщение
C++
1
calc2(res2, RES); res=RES;
Совсем не то...
Я же тебе во второй строке "код C++" написал как надо)

в твоем примере "calc2(res2, RES);" ты передаешь в функцию две переменные - ошибка, нужна только одна.
ты передаешь функции res2, а она вместо себя подставит (вернет) RES.
По этому тебе нужно сделать так (это на старый пример кода, где ты ещё RES не пришпандорил):
C++
1
res = calc2(res2);
ozzy_b
2 / 2 / 0
Регистрация: 02.10.2012
Сообщений: 169
21.11.2012, 14:52  [ТС] #14
margarin, ну так в самом последнем коде сделал так как ты сказал
margarin
36 / 36 / 0
Регистрация: 02.06.2012
Сообщений: 332
21.11.2012, 15:02 #15
ну тогда подожди немного, сейчас выводы понаделаю)))
Прочитай код, ну введи число (мысленно) и так далее... Посмотри где неправильно тебя программа поведет...
жесть как она есть)
Кликните здесь для просмотра всего текста
Input string: 1
Input string: 2
Input string: 3
Input string: +
Input string: 3
Input string: (
Input string: 2
Input string: -
Input string: 2
Input string: )
Input string: =
= // это я весь массив str вывел, правда изначально я его очистил (забил нулями)
123+3(2=-2 // нужно понять, почему такой бред получился))
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.11.2012, 15:02
Привет! Вот еще темы с ответами:

Вставить между цифрами 1, 2,..., 8, 9 в данном порядке, знак одной из 4-х арифметических операций так, чтобы результат восьми послед-х операций =100 - C++
Вычисления проводятся слева-направо, ни одна операция не имеет приоритета. Добавлено через 2 минуты задача вынесла моск, прошу помочь

в калькуляторе 2+2*2=8 - C++
не получается сделать так, чтобы калькулятор считал 2+2*2=8, как это реализовать? Есть мнение что нужно что-то дописать в &quot;+&quot;, но что......

Ошибка в калькуляторе - C++
Я только учусь, захотел сделать калькулятор консольный. Что неправильно? Пишу выражение, ответ всегда 0. #include &lt;iostream&gt; #include...

Ошибка в калькуляторе C++ - C++
Здравствуйте, написал простой калькулятор для теста на языке C++ Выдает такие ошибки: &quot;метку case можно использовать только в...


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

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

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