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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.64
ozzy_b
2 / 2 / 0
Регистрация: 02.10.2012
Сообщений: 169
21.11.2012, 12:47     Функция дужки(приоритет операций) в калькуляторе #1
Надо сделать скобки в калькуляторе: сделать дополнительную ф-цию которая будет считать введеные даные после ввода "(", после ввода ")" возвращает результат в главную функцию(ну вместо ). Ну глянув на код ошибок вроде нет, но не компиируесть он.
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     Функция дужки(приоритет операций) в калькуляторе
Посмотрите здесь:

Вставить между цифрами 1, 2,..., 8, 9 в данном порядке, знак одной из 4-х арифметических операций так, чтобы результат восьми послед-х операций =100 C++
C++ Приоритет операций
C++ Факториал в калькуляторе.
Відкрити текстовий файл та вивести його вміст на екран ЕОМ за виключенням усіх узятих у дужки фраз C++
в калькуляторе 2+2*2=8 C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
margarin
21.11.2012, 22:01     Функция дужки(приоритет операций) в калькуляторе
  #21

Не по теме:

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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 минуту
так в чем проблема? По идее все правильно прописал, а работает не коректно
margarin
 Аватар для margarin
35 / 35 / 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)
сурово)

ozzy_b
2 / 2 / 0
Регистрация: 02.10.2012
Сообщений: 169
24.11.2012, 10:52  [ТС]     Функция дужки(приоритет операций) в калькуляторе #24
margarin, та же сама фигня, сообщение что мы в ф-циию перейшли после первого числа после дужки((
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.11.2012, 23:17     Функция дужки(приоритет операций) в калькуляторе
Еще ссылки по теме:

Ошибка в калькуляторе C++
C++ приоритет операций
Приоритет побитовых операций C++

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

Или воспользуйтесь поиском по форуму:
margarin
 Аватар для margarin
35 / 35 / 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 Посмотреть сообщение
всё что в душках - минует историю
душки кстати тоже историю минуют...
Yandex
Объявления
24.11.2012, 23:17     Функция дужки(приоритет операций) в калькуляторе
Ответ Создать тему
Опции темы

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