Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
1 / 1 / 1
Регистрация: 18.03.2013
Сообщений: 72
1

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

11.04.2013, 21:20. Показов 757. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Прошу помощи,очень нужно сделать сегодня) Смысл задачи: вычисление выражения в постфиксной форме с помощью стека. Сам алгоритм действий должен быть правильным


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 Посмотреть сообщение
//здесь нужна два последних операнда вычислить,так же проблема с присваиванием значений переменным
не операнда,а два последних значения стека определенным операндом
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.04.2013, 21:20
Ответы с готовыми решениями:

нужно отредактировать код, где то ошибка
Задание Дана целочисленная квадратная матрица. Определить: 1. сумму элементов в тех столбцах,...

Нужно отредактировать код чтоб меняло первую букву на большую. С++.В коде есть ошибка
#include &lt;conio.h&gt; #include &lt;stdio.h&gt; #include &lt;string.h&gt; int main() { char a,b,firstL; int...

Нужно отредактировать код поиска в некоторых папках. Добавить функцию поиска в архивах
Нашёл одну программку, работает отлично, но вот не идёт поиск в таких местах как С:\users или...

Отредактировать код
#include &quot;stdafx.h&quot; #include &quot;iostream&quot; // для cin и cout #include &quot;conio.h&quot; // для getch...

8
449 / 415 / 124
Регистрация: 03.02.2013
Сообщений: 1,295
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/refer... stack/pop/

что это такое вообще? какой безумный компилятор это собирает?
1
1 / 1 / 1
Регистрация: 18.03.2013
Сообщений: 72
11.04.2013, 21:39  [ТС] 3
компилятор этого и не собирает. Мне выдали алгоритм,по которому нужно выполнить задачу. Но моих знаний не хватает,поэтому нужна помощь..уж извините за некоторую написанную ерунду в коде)
0
449 / 415 / 124
Регистрация: 03.02.2013
Сообщений: 1,295
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/%... 1%81%D1%8C

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

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

Добавлено через 6 минут
да и по хорошему - надо double в контейнера стека завернуть, а не int, как у меня
1
1 / 1 / 1
Регистрация: 18.03.2013
Сообщений: 72
11.04.2013, 22:34  [ТС] 5
большое вам спасибо!))
0
449 / 415 / 124
Регистрация: 03.02.2013
Сообщений: 1,295
11.04.2013, 22:53 6

Не по теме:

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



так вам доделать алгоритм для случаев с входными числами >9 и случаев вещественных чисел (сейчас пока он работает только для целых и односимвольных чисел в десятеричной системе) или сами разберётсь или так устроит, как есть (я ж не знаю вашего исходного задания)?
1
1 / 1 / 1
Регистрация: 18.03.2013
Сообщений: 72
11.04.2013, 22:58  [ТС] 7
если вам не сложно,то можно было бы сделать для чисел >9,для вещественных чисел пожалуй не стоит)))
0
449 / 415 / 124
Регистрация: 03.02.2013
Сообщений: 1,295
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
1
1 / 1 / 1
Регистрация: 18.03.2013
Сообщений: 72
11.04.2013, 23:45  [ТС] 9
благодарю)
0
11.04.2013, 23:45
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.04.2013, 23:45
Помогаю со студенческими работами здесь

Отредактировать код
Отредактируйте пожалуйста код.. Задание: Даны коэффициенты кубического уравнения. Дан промежуток на...

отредактировать готовый код
Отредактируйте пожалуйста готовый код.ТЗ:Написать программу,коротая выводит с клавиатуры массив из...

Отредактировать код, чтобы он заработал
int a;инициализирован int ...b...=a; как дописать чтобы сработало? вместо ... нужно что-то...

Как получить исходный код *.exe или отредактировать его исполняемый код?
Собственно возможно ли декомпилить его так, чтобы можно было потом обратно скомпилировать? Или...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru