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

Как сделать, чтобы калькулятор реагировал на унарный минус - C++

Восстановить пароль Регистрация
 
Amy_lee
0 / 0 / 0
Регистрация: 09.10.2011
Сообщений: 15
13.04.2012, 00:25     Как сделать, чтобы калькулятор реагировал на унарный минус #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
int prior(char c)
{
    int a;
    if (c=='+' || c=='-') return a=0;
    if (c=='*' || c=='/') return a=1;
    if (c=='^') return a=2;
    else return a=3;
}
double calc(char *str, int left, int right)
{
    int pmin=left;
    int depth=0;
    int a;
    for (int i=left; i<right; i++)
    {
        if (str[i]=='(') {depth++;continue;}
        if (str[i]==')') 
        {
            if (depth==0) throw "Error";
            else depth--;
            continue;
        }
        if (prior(str[i])<prior(str[pmin]) && depth==0) pmin=i;
    }
    int p=pmin;
    if (prior(str[p])<3)// если p найдено: 
    {
    if (str[p]=='+') return calc(str,left,p)+ calc(str,p+1,right);
    if (str[p]=='-') return calc(str,left,p) - calc(str, p+1, right);
    if (str[p]=='*') return calc(str,left,p)* calc(str, p+1, right);
    if (str[p]== '^') return pow (calc(str,left,p), calc(str, p+1, right));
    if (str[p]=='/') return calc(str,left,p)/calc(str,p+1,right);
    }
    else // если р не найдено:
    {
        if (str[left]=='(') calc (str, left+1, right-1);
        else return atof(str+left);
    }
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Catstail
Модератор
 Аватар для Catstail
21449 / 10234 / 1667
Регистрация: 12.02.2012
Сообщений: 17,108
13.04.2012, 01:01     Как сделать, чтобы калькулятор реагировал на унарный минус #2
В аналогичном случае я поступил так: все вхождения унарного минуса "(-" и унарный минус в начале строки заменял на "0-". Все будет работать.
Amy_lee
0 / 0 / 0
Регистрация: 09.10.2011
Сообщений: 15
13.04.2012, 09:14  [ТС]     Как сделать, чтобы калькулятор реагировал на унарный минус #3
а как указать, что минус именно в начале строки?
C++
1
if (str[p]=='-' && p==left) return calc(0)-calc(str,p+1,right);
как-то так?
Catstail
Модератор
 Аватар для Catstail
21449 / 10234 / 1667
Регистрация: 12.02.2012
Сообщений: 17,108
13.04.2012, 11:02     Как сделать, чтобы калькулятор реагировал на унарный минус #4
Я бы рекомендовал написать функцию преобразования исходной строки. Например, такую:

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
#include "string.h"
#include "iostream.h"
 
void un_min(char *si, char *so)
{
    int i,j;
    char c,p;
 
    for (i=0; i < 200; i++) so[i]=0;
 
    i=0;
    j=0;
 
    p='(';
 
    while (1)
    {
        c=si[i++];
 
        if (c == 0) break;
 
        if ((c == '-') & (p == '(')) so[j++]='0';
 
        so[j++]=c;
 
        p=c;
 
    }
 
}
 
int main(int argc, char* argv[])
{
 
    char S[200];
    char O[200];
 
    strcpy(S,"-5+7/8+(-4*11)");
 
    un_min(S,O);
 
    cout << S << endl;
    cout << O << endl;
 
    return 0;
}
Функция un_min вставляет в нужные места нули. Убедитесь.
Amy_lee
0 / 0 / 0
Регистрация: 09.10.2011
Сообщений: 15
13.04.2012, 11:42  [ТС]     Как сделать, чтобы калькулятор реагировал на унарный минус #5
Необработанное исключение в "0x011c1719" в "калькулятор.exe": 0xC00000FD: Stack overflow.
ругается на функцию с приоритетами..

Добавлено через 20 минут
хотя нет, все работает, правда показывает "результат наоборот" т.е. при вводе -1-2 ответ 1, а при вводе -1+3 ответ -4
Catstail
Модератор
 Аватар для Catstail
21449 / 10234 / 1667
Регистрация: 12.02.2012
Сообщений: 17,108
13.04.2012, 16:14     Как сделать, чтобы калькулятор реагировал на унарный минус #6
А причину этого нужно искать в интерпретаторе... Согласитесь, что моя функция логически упрощает формулу. Попробуйте просто вычислить формулу без унарного минуса в виде: (0-1-2).
Что получится?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.04.2012, 19:36     Как сделать, чтобы калькулятор реагировал на унарный минус
Еще ссылки по теме:

Нужно чтобы принимал минус перед нулем C++
C++ Как сделать, чтобы калькулятор не закрывался после работы?
C++ Определить унарный оператор ++ как дружественную функцию

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

Или воспользуйтесь поиском по форуму:
Amy_lee
0 / 0 / 0
Регистрация: 09.10.2011
Сообщений: 15
13.04.2012, 19:36  [ТС]     Как сделать, чтобы калькулятор реагировал на унарный минус #7
1, неверно)
Yandex
Объявления
13.04.2012, 19:36     Как сделать, чтобы калькулятор реагировал на унарный минус
Ответ Создать тему
Опции темы

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