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

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

Войти
Регистрация
Восстановить пароль
 
Amy_lee
0 / 0 / 0
Регистрация: 09.10.2011
Сообщений: 15
#1

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

13.04.2012, 00:25. Просмотров 979. Ответов 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
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);
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.04.2012, 00:25
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как сделать, чтобы калькулятор реагировал на унарный минус (C++):

Как правильно перегружать унарный минус? - C++
Дайте правильный прототип перегрузки унарного минуса.

Как вызвать в главной программе оператор унарный минус - C++
Paint operator-(const Paint&amp; p) { return Paint(-p.x,-p.y); }

Унарный минус на С# - C++
Всем доброго времени суток,помогите пожалуйста с задачкой. (i-мнимая единица) Условие: а=3+4i c=-a a=-3-4i Заранее спасибо:)

Оператор (-) Унарный минус. классы. - C++
Доброе время суток . помогите . составить operator- (унарный минус) ( что бы координаты x и y были отрицательными .( немогу понять как...

Объясните значение операций: дополнение ~lvalue, унарный плюс и минус, операция создания с размещением - C++
Что такое дополнение ~lvalue, унарный плюс и минус и операция создания с размещением, или создания с размещением и инициализацией new...

Как сделать, чтобы калькулятор не закрывался после работы? - C++
#include &lt;iostream&gt; using namespace std; int main() { setlocale(LC_ALL,&quot;rus&quot;); cout &lt;&lt; &quot;Êàëüêóëÿòîð \n\n&quot;; cout &lt;&lt;...

6
Catstail
Модератор
22642 / 11011 / 1785
Регистрация: 12.02.2012
Сообщений: 18,174
13.04.2012, 01:01 #2
В аналогичном случае я поступил так: все вхождения унарного минуса "(-" и унарный минус в начале строки заменял на "0-". Все будет работать.
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);
как-то так?
0
Catstail
Модератор
22642 / 11011 / 1785
Регистрация: 12.02.2012
Сообщений: 18,174
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 вставляет в нужные места нули. Убедитесь.
0
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
0
Catstail
Модератор
22642 / 11011 / 1785
Регистрация: 12.02.2012
Сообщений: 18,174
13.04.2012, 16:14 #6
А причину этого нужно искать в интерпретаторе... Согласитесь, что моя функция логически упрощает формулу. Попробуйте просто вычислить формулу без унарного минуса в виде: (0-1-2).
Что получится?
0
Amy_lee
0 / 0 / 0
Регистрация: 09.10.2011
Сообщений: 15
13.04.2012, 19:36  [ТС] #7
1, неверно)
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.04.2012, 19:36
Привет! Вот еще темы с ответами:

Какое значение присвоить индексу в компоненте TreeView, чтобы он реагировал по клику именно на выбранный узел? - C++
Какое значение присвоить индексу в компоненте TreeView, чтобы он реагировал по клику именно на выбранный узел? void __fastcall...

Нужно чтобы принимал минус перед нулем - C++
Если ввести -00043 то работает, а вот если -000000000000000000000000000005353 то нет, потому что берет минус и первые 16 нолей и пишет что...

Определить унарный оператор ++ как дружественную функцию - C++
Есть программа: #include &quot;stdafx.h&quot; #include&lt;iostream&gt; #include&lt;conio.h&gt; using namespace std; class Coord ...

Как сделать с кода настоящий калькулятор? - C++
Вопрос: есть код,откомпилированный. Как сделать с него .exeшник? Можно сказать что моя первая программа, так что не судите строго)) ...


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

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

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