Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
12 / 10 / 5
Регистрация: 27.08.2015
Сообщений: 236

Стековый калькулятор, как подправить код?

13.10.2015, 14:42. Показов 1833. Ответов 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
40
41
42
43
44
45
46
47
48
49
50
# include <iostream>
# include <cstdlib>
# include <cstdio>
# include <stack>
# include <string>
 
using namespace std;
 
int calculate(string str_in);
bool isNumber(string str_in);
 
int main()
{
    str_in = "2 3 + 15 7 - *" 
    int a = calculate();
    cout << a;
    return 0;
}
 
int calculate(string str_in) {
 stack <int> val_stack; //стек
 int n1, n2, res;
 for(int i = 0; i<str_in.length(); ++i) {
 if(isNumber(str_out[i])) {
 val_stack.push(str_out[i]);
 }
 else {
 n2 = val_stack.pop();
 n1 = val_stack.pop();
 switch(str_out[i]) {
 case '+': res = n1 + n2; break;
 case '-': res = n1 - n2; break;
 case '*': res = n1 * n2; break;
 case '/': res = n1 / n2; break;
 default: cout<<"Error!\n";
 }
 val_stack.push(res);
 }
 }
 return val_stack.pop();
}
 
 
bool isNumber(string str_in)
{
    if ((str[0]>=48)&&(str[0]<=57))
        return true;
    else
        return false;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.10.2015, 14:42
Ответы с готовыми решениями:

Стековый калькулятор
Нужно создать калькулятор, который сможет выполнять вычисление выражения a+b-c*d/e. Т.е. без скобок, степеней и прочего. Калькулятор...

Стековый калькулятор
Помогите пожалуйста, есть калькулятор стековый который работает со сложением вычитанием умножением и делением. Нужно сделать, чтоб он...

Постфиксный (стековый) калькулятор (Рекурсия)
Задание: Реализовать постфиксный (стековый) калькулятор, 4 действия, вещественные числа, ввод выражений в цикле. Я вообще не могу...

6
 Аватар для _Valera_
495 / 377 / 136
Регистрация: 27.01.2015
Сообщений: 1,588
13.10.2015, 15:11
Цитата Сообщение от JavJun Посмотреть сообщение
int a = calculate();
Цитата Сообщение от JavJun Посмотреть сообщение
int calculate(string str_in) {
требует параметр

Добавлено через 2 минуты
Цитата Сообщение от JavJun Посмотреть сообщение
if(isNumber(str_out[i])) {
откуда взялся str_out?

Добавлено через 5 минут
Цитата Сообщение от JavJun Посмотреть сообщение
bool isNumber(string str_in)
{
* * if ((str[0]>=48)&&(str[0]<=57))
* * * * return true;
* * else
* * * * return false;
}
параметр str_in, а используешь str.
0
12 / 10 / 5
Регистрация: 27.08.2015
Сообщений: 236
13.10.2015, 15:11  [ТС]
_Valera_, подправил и чуть упростил, но все равно что-то не так...(
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
# include <iostream>
# include <cstdlib>
# include <cstdio>
# include <stack>
# include <string>
 
using namespace std;
bool isNumber(string str);
 
int main()
{
 
   string str = "2 3 + 15 7 - *";
   int a = calc();
   cout << a;
   return 0;
}
 
 int calc(string str){
 stack <int> numbers;
 int a, b, res;
 for(int i = 0; i<numbers.length(); ++i) {
 if(isNumber(numbers[i])) {
 numbers.push(numbers[i]);
 }
 else {
 b = numbers.pop();
 a = numbers.pop();
 switch(numbers[i]) {
 case '+': res = a + b; break;
 case '-': res = a - b; break;
 case '*': res = a * b; break;
 case '/': res = a / b; break;
 default: cout<<"Error!\n";
 }
 numbers.push(res);
 }
 }
 return numbers.pop();
}
 
 
bool isNumber(string str)
{
    if ((str[0]>=48)&&(str[0]<=57))
        return true;
    else
        return false;
}
0
 Аватар для _Valera_
495 / 377 / 136
Регистрация: 27.01.2015
Сообщений: 1,588
13.10.2015, 15:22
так лучше:
C++
1
2
3
4
5
bool isNumber(const char str)
{
    return((str>=48) && (str<=57));
 
}
Добавлено через 1 минуту
Цитата Сообщение от JavJun Посмотреть сообщение
int a = calc();
не подправил...

Добавлено через 44 секунды
Цитата Сообщение от JavJun Посмотреть сообщение
int calc(string str){
еще теперь она ее не увидит

Добавлено через 2 минуты
Цитата Сообщение от JavJun Посмотреть сообщение
numbers.push(res);
ты в интовый стек толкаешь чаровские числа, нужно учитывать приведение типов.

Добавлено через 4 минуты
Цитата Сообщение от JavJun Посмотреть сообщение
str_in = "2 3 + 15 7 - *"
да, не заметил сразу где тип переменной? И точка с запятой
0
12 / 10 / 5
Регистрация: 27.08.2015
Сообщений: 236
13.10.2015, 15:25  [ТС]
_Valera_, так в main нужно оставить int a = calc(); а при вызове ф-ции написать int calculate(string str) { ?

"ты в интовый стек толкаешь чаровские числа, нужно учитывать приведение типов." - а можно тогда сделать так?
C++
1
stack <char> numbers;
0
 Аватар для _Valera_
495 / 377 / 136
Регистрация: 27.01.2015
Сообщений: 1,588
13.10.2015, 15:37
Цитата Сообщение от JavJun Посмотреть сообщение
numbers.pop();
эта функция void

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
# include <iostream>
# include <cstdlib>
# include <cstdio>
# include <stack>
# include <string>
 
using namespace std;
 
int calculate(const string & str_in);
bool isNumber(const char str);
 
int main()
{
    string str = "23+157-*" ;
    int a = calculate(str);
    cout << a;
    system("PAUSE");
    return 0;
}
 
int calculate(const string & str_in) 
{
    stack <int> val_stack; //стек
    int n1 = NULL, n2 = NULL, res = NULL;
    for(int i = 0; i<str_in.length(); ++i) 
    {
        if(isNumber(str_in[i])) 
            val_stack.push(str_in[i]-48);
        
        else
        {
            n2 = val_stack.top();
            val_stack.pop();
            n1 = val_stack.top();
            val_stack.pop();
            switch(str_in[i]) {
            case '+': res = n1 + n2; break;
            case '-': res = n1 - n2; break;
            case '*': res = n1 * n2; break;
            case '/': res = n1 / n2; break;
            default: cout<<"Error!\n";
            }
            val_stack.push(res);
        }
    }
    
    return val_stack.top();
}
 
 
bool isNumber(const char str)
{
    return (str>=48 && str<=57);
 
}
Добавлено через 2 минуты
Цитата Сообщение от JavJun Посмотреть сообщение
string str = "2 3 + 15 7 - *"
Программа должна учитывать пробелы... и вобще это серьезный удар по твое реализации, потому что число 15 например займет две ячейки, а ты проверяешь только одну.
1
12 / 10 / 5
Регистрация: 27.08.2015
Сообщений: 236
13.10.2015, 16:07  [ТС]
_Valera_, это она из-за этого вылетает если string str = "2 3 + 15 7 - *"?
А подскажите пожалуйста, возможно ли это как-то исправить?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.10.2015, 16:07
Помогаю со студенческими работами здесь

Стековый калькулятор - успешная компиляция и неуспешная работа
Пытаюсь написать стековый калькулятор работающий с введенной строкой(курсач такой). До скобок пока не доходил. Не могу написать для...

Выводит немного не то что надо ,как подправить код
Всем привет, подскажите плиз как сделать так . 1)Если я ввожу числа больше 10 ,то снова надо ввести и так до бесконечности пока не введу...

Как можно улучшить мой код? Калькулятор
Как можно улучшить мой код? Калькулятор #include &lt;iostream&gt; using namespace std; int main (void) { int a, A, B; ...

Подправить код
Ввожу строку с 30 символов. Нужно вывести целое число и упорядочить за возростанием Добавлено через 39 секунд пример кода на фортран...

Подправить код
#include &lt;iostream&gt; #include &lt;locale&gt; #include &lt;ctype.h&gt; using namespace std; int main () { const int n=20; char s; int k={...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru