Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.53/30: Рейтинг темы: голосов - 30, средняя оценка - 4.53
2 / 2 / 1
Регистрация: 02.10.2012
Сообщений: 169

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

21.11.2012, 12:47. Показов 6981. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.11.2012, 12:47
Ответы с готовыми решениями:

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

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

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

24
21.11.2012, 22:01
Студворк — интернет-сервис помощи студентам

Не по теме:

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

0
2 / 2 / 1
Регистрация: 02.10.2012
Сообщений: 169
23.11.2012, 21:52  [ТС]
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
41 / 41 / 3
Регистрация: 02.06.2012
Сообщений: 351
24.11.2012, 02:21
Слушай, натыкай 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
2 / 2 / 1
Регистрация: 02.10.2012
Сообщений: 169
24.11.2012, 10:52  [ТС]
margarin, та же сама фигня, сообщение что мы в ф-циию перейшли после первого числа после дужки((
0
 Аватар для margarin
41 / 41 / 3
Регистрация: 02.06.2012
Сообщений: 351
24.11.2012, 23:17
так на всём пути, мы вводим знак равенства (=), а он просит ещё символ (первый знак равенства после скобок он пропускает...)

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


Добавлено через 9 часов 15 минут
Цитата Сообщение от margarin Посмотреть сообщение
всё что в душках - минует историю
душки кстати тоже историю минуют...
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.11.2012, 23:17

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

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

Приоритет операций в калькуляторе
Пытаюсь сделать калькулятор, на подобии гугл-калькулятора, не могу понять, каким образом там реализована приоритетность операций ,в придачу...

Приоритет логических операций и операций над множествами.
солидняк Я просто устал переписывать)) поэтому решил уже расписать, разжевать так сказать)). Эту информацию и не надо искать, если бы...

Приоритет операций
Привет всем! Есть ли возможность изменить приоритет операций(умножения, деления)?


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

Или воспользуйтесь поиском по форуму:
25
Ответ Создать тему
Новые блоги и статьи
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru