Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.94/18: Рейтинг темы: голосов - 18, средняя оценка - 4.94
0 / 0 / 0
Регистрация: 09.10.2011
Сообщений: 15

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

13.04.2012, 00:25. Показов 3881. Ответов 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.04.2012, 00:25
Ответы с готовыми решениями:

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

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

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

6
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38173 / 21108 / 4307
Регистрация: 12.02.2012
Сообщений: 34,707
Записей в блоге: 14
13.04.2012, 01:01
В аналогичном случае я поступил так: все вхождения унарного минуса "(-" и унарный минус в начале строки заменял на "0-". Все будет работать.
0
0 / 0 / 0
Регистрация: 09.10.2011
Сообщений: 15
13.04.2012, 09:14  [ТС]
а как указать, что минус именно в начале строки?
C++
1
if (str[p]=='-' && p==left) return calc(0)-calc(str,p+1,right);
как-то так?
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38173 / 21108 / 4307
Регистрация: 12.02.2012
Сообщений: 34,707
Записей в блоге: 14
13.04.2012, 11:02
Я бы рекомендовал написать функцию преобразования исходной строки. Например, такую:

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
0 / 0 / 0
Регистрация: 09.10.2011
Сообщений: 15
13.04.2012, 11:42  [ТС]
Необработанное исключение в "0x011c1719" в "калькулятор.exe": 0xC00000FD: Stack overflow.
ругается на функцию с приоритетами..

Добавлено через 20 минут
хотя нет, все работает, правда показывает "результат наоборот" т.е. при вводе -1-2 ответ 1, а при вводе -1+3 ответ -4
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38173 / 21108 / 4307
Регистрация: 12.02.2012
Сообщений: 34,707
Записей в блоге: 14
13.04.2012, 16:14
А причину этого нужно искать в интерпретаторе... Согласитесь, что моя функция логически упрощает формулу. Попробуйте просто вычислить формулу без унарного минуса в виде: (0-1-2).
Что получится?
0
0 / 0 / 0
Регистрация: 09.10.2011
Сообщений: 15
13.04.2012, 19:36  [ТС]
1, неверно)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.04.2012, 19:36
Помогаю со студенческими работами здесь

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

Обратная польская запись, добавить унарный минус
Необхдимо дописать программу, что бы она работала с унарным минусом. Обратная польская запись, С++. #include &lt;iostream&gt; ...

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

Как сделать, чтобы калькулятор не закрывался после работы?
#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;...

Как сделать чтобы Webbrowser не реагировал на клики?
Как сделать чтобы Webbrowser не реагировал на клики и на нажатия клавишь? Был вообщем в типо в режиме ReadOnly =)


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru