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

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

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

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

21.11.2012, 12:47. Просмотров 1753. Ответов 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';
            }
        }
}
}
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++
Відкрити текстовий файл та вивести його вміст на екран ЕОМ за виключенням усіх узятих у дужки фраз. Символи дужок також не друкувати

24
ozzy_b
2 / 2 / 0
Регистрация: 02.10.2012
Сообщений: 169
21.11.2012, 15:05  [ТС] #16
я вводил так
5
*
(5
-
3)
=

считало токо то что в дужках и после них(перед ними не считает)
0
margarin
36 / 36 / 0
Регистрация: 02.06.2012
Сообщений: 332
21.11.2012, 15:37 #17
что то прорисовывается)
Цитата Сообщение от ozzy_b Посмотреть сообщение
(5
-
3)
ну что сказать, добавь в начале функции calc2:
C++
1
cout << "Мы в функции calc2" << endl;
я так думаю, что этого вывода не будет... - скобки (скорее всего) нужно вводить как отдельный символ)

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

Не по теме:

что то у меня складывается мнение, что лучше сделать всё иначе и по новой)
Если это терпит до позднего вечера, то забегу и попытаюсь изложить мои мысли как можно более понятнО)



Добавлено через 10 минут
Input string: 5
Input string: *
Input string: (
Input string: 5
5
qwewqeInput string: -
qwewqeInput string: 3
qwewqeInput string: +
qwewqeInput string: 2
qwewqeInput string: )
res2 = 4
Input string: =
=
5*(5=4

получается, что нам нужно убрать из history "(5=" тогда мы получим 5*4 - то что нужно не?
ну ближе к вечеру забегу)
1
ozzy_b
2 / 2 / 0
Регистрация: 02.10.2012
Сообщений: 169
21.11.2012, 20:32  [ТС] #18
margarin, как по новой? я до етого так долго делал етот калькулятор, а теперь из за етих скобок все наново делать?

Добавлено через 2 минуты
margarin, "cout << "Мы в функции calc2" << endl;" выводиться после первой введеной цифры после скобок

Добавлено через 14 секунд
margarin, "cout << "Мы в функции calc2" << endl;" выводиться после первой введеной цифры после скобок
0
margarin
36 / 36 / 0
Регистрация: 02.06.2012
Сообщений: 332
21.11.2012, 20:57 #19
Цитата Сообщение от ozzy_b Посмотреть сообщение
как по новой? я до етого так долго делал етот калькулятор, а теперь из за етих скобок все наново делать?
не совсем, я видимо слишком писимистически написал___)))
Дело в том, что многие нюансы кода я не понимаю) например зачем переменную char превращать в массив и т.д.

мне недавно мысля пришла, сейчас проверю и отпишусь)
1
ozzy_b
2 / 2 / 0
Регистрация: 02.10.2012
Сообщений: 169
21.11.2012, 20:58  [ТС] #20
margarin, хорошо, мне одногрупник свой код кинул, вроде рабочий, я там посмотрю, может подумаю как в своем сделать ети скобки
0
margarin
21.11.2012, 22:01
  #21

Не по теме:

ахаха, не, я не способен понять этот код) У меня сейчас голова развалится)
Я лучше свой попробую написать)ххд

0
ozzy_b
2 / 2 / 0
Регистрация: 02.10.2012
Сообщений: 169
23.11.2012, 21:52  [ТС] #22
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
#include <iostream>
#include <conio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h> 
using namespace std;
float calc(bool, float, char[], char[], char, float);
int main ()
{
    float g=0;
    float res=0;
    bool EXIT = false;
    char str[100],op='\0',history[255];
    history[0]='\0';
    res=calc(EXIT, g, &history[100],&str[100], op, res);
    cout << history << res; 
    getch();
    return 0;
}
float calc(bool EXIT, float g, char history[], char str[], char op, float res)
{
    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=calc(EXIT, g, &history[100],&str[100],op, res);
                if (op == ')') return res;
                op = '\0';
            }
            else res = g;
        }
    }
    return res;
}
Добавлено через 1 час 51 минуту
так в чем проблема? По идее все правильно прописал, а работает не коректно
0
margarin
36 / 36 / 0
Регистрация: 02.06.2012
Сообщений: 332
24.11.2012, 02:21 #23
Слушай, натыкай cout, после каждой обработки или вводом...
например:
C++
1
2
3
4
cout << "Мы в функции calc" << endl;
cout << "str: " << str[0] << endl;
cout << "res: " << res << endl;
cout << "Мы уходим из calc" << endl;
Цитата Сообщение от ozzy_b Посмотреть сообщение
float res=0;
Задай не 0, а 12345 или что то подобное, дабы в случае неизменности значения было сразу заметно...

Если добавишь выводы, то скорее всего увидишь один из косяков (ну или как то так), я уже даже описать не могу (усё перемешалось).

Не по теме:

Это пока всё, что могу добавить... Вряд-ли я теперь смогу тебе в этом помочь - мне уже немного плохо становится, от просмотра кода

Цитата Сообщение от ozzy_b Посмотреть сообщение
float calc(bool EXIT, float g, char history[], char str[], char op, float res)
сурово)

1
ozzy_b
2 / 2 / 0
Регистрация: 02.10.2012
Сообщений: 169
24.11.2012, 10:52  [ТС] #24
margarin, та же сама фигня, сообщение что мы в ф-циию перейшли после первого числа после дужки((
0
margarin
36 / 36 / 0
Регистрация: 02.06.2012
Сообщений: 332
24.11.2012, 23:17 #25
так на всём пути, мы вводим знак равенства (=), а он просит ещё символ (первый знак равенства после скобок он пропускает...)

Псевдокод или что то типо того:
Кликните здесь для просмотра всего текста
Получаем пример: 5 * ( 5 - 3 ) =
мы считываем:
5
*
( переходим в calc (всё что в душках - минует историю)
5
-
3
) возвращаем 2
= считываем history, получаем: 5 * 2
считываем, обрабатываем (уже без заморочек на скобки) и получаем 10


Добавлено через 9 часов 15 минут
Цитата Сообщение от margarin Посмотреть сообщение
всё что в душках - минует историю
душки кстати тоже историю минуют...
1
24.11.2012, 23:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.11.2012, 23:17
Привет! Вот еще темы с ответами:

Вставить между цифрами 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 можно использовать только в...


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

Или воспользуйтесь поиском по форуму:
25
Ответ Создать тему
Опции темы

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