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

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

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

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


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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
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 i,k,c; for(i=0;i&lt;10;i++) ...

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

8
 Аватар для abit
870 / 529 / 149
Регистрация: 03.02.2013
Сообщений: 1,852
11.04.2013, 21:32
красота, а не код...
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  [ТС]
компилятор этого и не собирает. Мне выдали алгоритм,по которому нужно выполнить задачу. Но моих знаний не хватает,поэтому нужна помощь..уж извините за некоторую написанную ерунду в коде)
0
 Аватар для abit
870 / 529 / 149
Регистрация: 03.02.2013
Сообщений: 1,852
11.04.2013, 22:32
ошибки в этой программе можно перечеслять долго, целую диссертацию можно написать... какой-то фантаст, видимо набросал такой код?
я так понимаю вам надо обратную польскую нотацию разобрать

вот я попытался исправить, работает, но и это ещё не окончательный вариант, т.к. по идее надо ещё пробелы ставить, чтобы числа отделять друг от друга, этот вариант рабочий только для чисел 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  [ТС]
большое вам спасибо!))
0
 Аватар для abit
870 / 529 / 149
Регистрация: 03.02.2013
Сообщений: 1,852
11.04.2013, 22:53

Не по теме:

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



так вам доделать алгоритм для случаев с входными числами >9 и случаев вещественных чисел (сейчас пока он работает только для целых и односимвольных чисел в десятеричной системе) или сами разберётсь или так устроит, как есть (я ж не знаю вашего исходного задания)?
1
1 / 1 / 1
Регистрация: 18.03.2013
Сообщений: 72
11.04.2013, 22:58  [ТС]
если вам не сложно,то можно было бы сделать для чисел >9,для вещественных чисел пожалуй не стоит)))
0
 Аватар для abit
870 / 529 / 149
Регистрация: 03.02.2013
Сообщений: 1,852
11.04.2013, 23:38
Цитата Сообщение от Ксения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  [ТС]
благодарю)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.04.2013, 23:45
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера 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. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru