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

Разбор арифметических выражений - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ В тексте после указанного символа вставить подстроку http://www.cyberforum.ru/cpp-beginners/thread1216373.html
в тексте после указанного символа вставить подстроку
C++ Программа которая переводит дюймы в сантиметры и сантиметры в дюймы. В чем ошибка? в меню когда пишешь что то кроме 1 или 2 оно не выводит то что написано в default #include <iostream> #include <conio.h> using namespace std; int main() { double chislo; double result; char key; setlocale(LC_ALL, "Russian"); http://www.cyberforum.ru/cpp-beginners/thread1216364.html
Создать файл записей которые имеют такие поля: фамилия автора, название произведения C++
Создать файл записей которые имеют такие поля: фамилия автора, название произведения. Удалить из файла все записи, в которых фамилия автора начинается с заданной пользователем буквы. Помогите пожалуйста!!!
C++ Заданы два текстовых файла. Удалить из файлов строки, имеющие одинаковые номера
Заданы два текстовых файла. Удалить из файлов строки, имеющие одинаковые номера, но сами не являются одинаковыми. Результаты записать к новым файлам.
C++ Проверить, содержит заданный неориентированный граф хотя бы один цикл http://www.cyberforum.ru/cpp-beginners/thread1216353.html
Циклом в графе называется маршрут, начальная и конечная вершины которого совпадают. Проверить, содержит заданный неориентированный граф хотя бы один цикл.
C++ Построить произвольное бинарное дерево и создать его копию Построить произвольное бинарное дерево и создать его копию. Вывести значения узлов дерева и определить адреса их корней. Побудувати довільне бінарне дерево та створити його копію. Вивести значення вузлів дерева та визначити адреси їх коренів. подробнее

Показать сообщение отдельно
dicros
 Аватар для dicros
1 / 1 / 0
Регистрация: 24.04.2014
Сообщений: 63
25.06.2014, 00:24     Разбор арифметических выражений
Здравствуйте друзья снова я к вам за помощью конечно вопрос может покажется банальным, но то ли время уже много и голова не соображает, то ли я тугой но ни как не могу понять смысла выражения.

(ch - '0')

где ch - это число от 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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
#include <iostream>
#include <cstring>
using namespace std;
 
const int LEN = 80;
const int MAX = 40;
 
class Stack
{
private:
    char st[MAX];
    int top;
public:
    Stack(){top = 0;};     //конструктор
 
    void push(char var)
    {
        st[++top] = var;
    };
 
        char pop()
        {
            return st[top--];
        };
 
            int gettop()
            {
                return top;
            };
};
 
class express
{
private:
    Stack s;
    char* pStr;
    int len;
public:
    express(char* ptr)             //конструктор
    {
        pStr = ptr;
        len = strlen(pStr);
    };
 
    void parse()
    {
        char ch;
        char lastval;
        char lastop;
 
        for (int j = 0; j < len; j++)
        {
            ch = pStr[j];
 
            if (ch >= '0' && ch <= '9')
            {
                s.push(ch - '0');
            }
            else
            {
                if (ch == '+' || ch == '-' || ch == '*' || ch == '/')
                {
                    if (s.gettop() == 1)
                    {
                        s.push(ch);
                    }
                    else
                    {
                        lastval = s.pop();
                        lastop = s.pop();
 
                        if ((ch == '*' || ch == '/') && (lastop == '+' || lastop == '-'))
                        {
                            s.push(lastop);
                            s.push(lastval);
                        }
                        else
                        {
                            switch (lastop)
                            {
                                case '+': s.push(s.pop() + lastval); break;
                                case '-': s.push(s.pop() - lastval); break;
                                case '*': s.push(s.pop() * lastval); break;
                                case '/': s.push(s.pop() / lastval); break;
                                default: cout << "\nНеизвестный оператор"; exit(1);
                            };
                        }
 
                        s.push(ch);
                    }
                }
                else
                {
                    cout << "\nНеизвестный символ";
                    exit(1);
                }
 
            }
        }
 
    };
 
    int solve()
    {
        char lastval;
 
        while (s.gettop() > 1)
        {
            lastval = s.pop();
 
            switch (s.pop())
            {
                case '+': s.push(s.pop() + lastval); break;
                case '-': s.push(s.pop() - lastval); break;
                case '*': s.push(s.pop() * lastval); break;
                case '/': s.push(s.pop() / lastval); break;
                default:cout << "\nНеизвестный оператор"; exit(1);
            };
        }
 
        return int(s.pop());
    };
};
 
int main()
{
    setlocale(0, "Rus");
 
    char ans;
    char string[LEN];
 
    cout << "\nВведите арифметическое выражение в виде 2+3*4/3-2"
         << "\nЧисла должны быть из одной цифры"
         << "\nне используйте пробелы и скобки";
 
    do
    {
        cout << "\nВыражение: ";
        cin >> string;
        express* eptr = new express(string);
        eptr->parse();
        cout << "\nРезультат: " << eptr->solve();
        delete eptr;
        cout << "Еще одно выражение (д/н)?";
        cin >> ans;
    } while (ans=='д');
 
return 0;
};
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 05:40. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru