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

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

13.04.2012, 00:25. Показов 3914. Ответов 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
38180 / 21115 / 4307
Регистрация: 12.02.2012
Сообщений: 34,722
Записей в блоге: 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
38180 / 21115 / 4307
Регистрация: 12.02.2012
Сообщений: 34,722
Записей в блоге: 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
38180 / 21115 / 4307
Регистрация: 12.02.2012
Сообщений: 34,722
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru