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

Нужно отредактировать код - C++

Восстановить пароль Регистрация
 
Ксения7
1 / 1 / 0
Регистрация: 18.03.2013
Сообщений: 72
11.04.2013, 21:20     Нужно отредактировать код #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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <vcl.h>
#pragma hdrstop
#include <string>
#include <stdio.h>
#include <stack.h>
#pragma argsused
int main()
{
std::stack <string::size_type> st;
std::string s="453+-45/+*8+";
char symb,secoper,firoper,value, str ;
for (int i=0;i<=st.size() ;i++)
{
//symb-это верхний элемент стека,не знаю как записать значение в эту переменную
    if ((symb=="+") || (symb=="-") || (symb=="/") || (symb=="*") )
    switch (str)
                {
                case '+':
//здесь нужна два последних операнда вычислить,так же проблема с присваиванием значений переменным
                        secoper=st.pop(i);
                        firoper=st.pop(i);
                        value=secoper+firoper;
                        st.pop();
                        st.pop();
                        break;
                case '-':
                        secoper=st.pop(i);
                        firoper=st.pop(i);
                        value=secoper-firoper;
                        st.pop();
                        st.pop();
                        break;
                case '/':
                        secoper=st.pop(i);
                        firoper=st.pop(i);
                        value=secoper/firoper;
                        st.pop();
                        st.pop();
                        break;
                case '*':
                        secoper=st.pop(i);
                        firoper=st.pop(i);
                        value=secoper*firoper;
                        st.pop();
                        st.pop();
                        break;
                }
 
    else
    {
//т.е. если символ запихиваем в стек
st.push();
    }
}
//здесь нужно вывести ответ,т.е. то что осталось в стеке
    return 0;
}
Добавлено через 1 минуту
Цитата Сообщение от Ксения7 Посмотреть сообщение
//здесь нужна два последних операнда вычислить,так же проблема с присваиванием значений переменным
не операнда,а два последних значения стека определенным операндом
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
abit
 Аватар для abit
260 / 259 / 33
Регистрация: 03.02.2013
Сообщений: 709
11.04.2013, 21:32     Нужно отредактировать код #2
красота, а не код...
C++
1
#include <stack.h>
lolwhat?
это С++/STL
C++
1
#include <stack>
C++
1
std::stack <string::size_type> st;
ммм, по стандарту
C++
1
std::stack <std::string::size_type> st;
C++
1
    if ((symb=="+") || (symb=="-") || (symb=="/") || (symb=="*") )
symb у вас char, а не std::string надо
C++
1
if ((symb=='+') || (symb=='-') || (symb=='/') || (symb=='*') )
C++
1
2
secoper=st.pop(i);
firoper=st.pop(i);
простите что???
C++
1
std::stack::pop
ничего не возвращает - http://www.cplusplus.com/reference/stack/stack/pop/

что это такое вообще? какой безумный компилятор это собирает?
Ксения7
1 / 1 / 0
Регистрация: 18.03.2013
Сообщений: 72
11.04.2013, 21:39  [ТС]     Нужно отредактировать код #3
компилятор этого и не собирает. Мне выдали алгоритм,по которому нужно выполнить задачу. Но моих знаний не хватает,поэтому нужна помощь..уж извините за некоторую написанную ерунду в коде)
abit
 Аватар для abit
260 / 259 / 33
Регистрация: 03.02.2013
Сообщений: 709
11.04.2013, 22:32     Нужно отредактировать код #4
ошибки в этой программе можно перечеслять долго, целую диссертацию можно написать... какой-то фантаст, видимо набросал такой код?
я так понимаю вам надо обратную польскую нотацию разобрать

вот я попытался исправить, работает, но и это ещё не окончательный вариант, т.к. по идее надо ещё пробелы ставить, чтобы числа отделять друг от друга, этот вариант рабочий только для чисел 0..9
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
56
57
58
#include <iostream>
#include <string>
#include <stack>
 
int main()
{
std::stack <int> st;
std::string s="12+4*3+";
char symb;
int secoper,firoper,value, str ;
std::size_t n_s = 0;
for (int i=0;i<=s.size() ;i++)
{
    symb = s[n_s];
    ++n_s;
    switch (symb)
                {
                case '+':
                        secoper=st.top();
                        st.pop();
                        firoper=st.top();
                        st.pop();
                        value=secoper+firoper;
                        st.push(value);
                        break;
                case '-':
                        secoper=st.top();
                        st.pop();
                        firoper=st.top();
                        st.pop();
                        value=secoper-firoper;
                        st.push(value);
                        break;
                case '/':
                        secoper=st.top();
                        st.pop();
                        firoper=st.top();
                        st.pop();
                        value=secoper/firoper;
                        st.push(value);
                        break;
                case '*':
                        secoper=st.top();
                        st.pop();
                        firoper=st.top();
                        st.pop();
                        value=secoper*firoper;
                        st.push(value);
                        break;
                case 0 : break;
                 default : st.push(int(symb)-48);
                }
 
}
    std::cout<<st.top()<<std::endl;
    system("pause");
    return 0;
}
p.s. пример 12+4*3+ взят из википедии - http://ru.wikipedia.org/wiki/%D0%9E%...B8%D1%81%D1%8C

и программа правильно находит 15, но пробелы всё же надо учитывать, чтобы брать числа > 9

ваш исходный пример не выдерживает никакой критики, как и сама реализация...

Добавлено через 6 минут
да и по хорошему - надо double в контейнера стека завернуть, а не int, как у меня
Ксения7
1 / 1 / 0
Регистрация: 18.03.2013
Сообщений: 72
11.04.2013, 22:34  [ТС]     Нужно отредактировать код #5
большое вам спасибо!))
abit
 Аватар для abit
260 / 259 / 33
Регистрация: 03.02.2013
Сообщений: 709
11.04.2013, 22:53     Нужно отредактировать код #6

Не по теме:

большое вам спасибо!))
спасибо не булькает...
есть кнопочка +1 спасибо в низу каждого поста для таких случаев



так вам доделать алгоритм для случаев с входными числами >9 и случаев вещественных чисел (сейчас пока он работает только для целых и односимвольных чисел в десятеричной системе) или сами разберётсь или так устроит, как есть (я ж не знаю вашего исходного задания)?
Ксения7
1 / 1 / 0
Регистрация: 18.03.2013
Сообщений: 72
11.04.2013, 22:58  [ТС]     Нужно отредактировать код #7
если вам не сложно,то можно было бы сделать для чисел >9,для вещественных чисел пожалуй не стоит)))
abit
 Аватар для abit
260 / 259 / 33
Регистрация: 03.02.2013
Сообщений: 709
11.04.2013, 23:38     Нужно отредактировать код #8
Цитата Сообщение от Ксения7 Посмотреть сообщение
если вам не сложно,то можно было бы сделать для чисел >9,для вещественных чисел пожалуй не стоит)))
не сложно, но учтите, что операции "/" не существует для целых чисел, есть div ( целочисленное деление - и выполнятся она так, что , остаток от деления будет откидываться...

вот набросал код, который работает с любыми числам < 2^32
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
56
57
58
59
60
61
62
63
64
65
66
#include <iostream>
#include <sstream>
#include <string>
#include <stack>
 
int main()
{
std::stack <int> st;
std::string s="1 2 +4 *3 +",str;
char symb;
int secoper,firoper,value;
std::size_t n_s = 0;
for (int i=0;i<=s.size() ;i++)
{
    symb = s[n_s];
    ++n_s;
    switch (symb)
                {
                case '+':
                        secoper=st.top();
                        st.pop();
                        firoper=st.top();
                        st.pop();
                        value=secoper+firoper;
                        st.push(value);
                        break;
                case '-':
                        secoper=st.top();
                        st.pop();
                        firoper=st.top();
                        st.pop();
                        value=secoper-firoper;
                        st.push(value);
                        break;
                case '/':
                        secoper=st.top();
                        st.pop();
                        firoper=st.top();
                        st.pop();
                        value=secoper/firoper;
                        st.push(value);
                        break;
                case '*':
                        secoper=st.top();
                        st.pop();
                        firoper=st.top();
                        st.pop();
                        value=secoper*firoper;
                        st.push(value);
                        break;
                case ' ': 
                          {
                              int num;
                              std::stringstream(str) >> num;
                              st.push(num);
                              str = "";
                          }
                case 0 : break;
                 default : str += symb;
                }
 
}
    std::cout<<st.top()<<std::endl;
    system("pause");
    return 0;
}
проверил работает как с "1 2 +4 *3 +"
так и с "11 23 +45 *32 +" = 1562
а это так (если разобрать обратную польскую натацию):
(11+23)*45+32= 1562
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.04.2013, 23:45     Нужно отредактировать код
Еще ссылки по теме:

Отредактировать код C++
C++ отредактировать готовый код
Нужно отредактировать код поиска в некоторых папках. Добавить функцию поиска в архивах C++

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

Или воспользуйтесь поиском по форуму:
Ксения7
1 / 1 / 0
Регистрация: 18.03.2013
Сообщений: 72
11.04.2013, 23:45  [ТС]     Нужно отредактировать код #9
благодарю)
Yandex
Объявления
11.04.2013, 23:45     Нужно отредактировать код
Ответ Создать тему
Опции темы

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