Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
8 / 8 / 1
Регистрация: 31.03.2010
Сообщений: 32
1

Парсер математических выражений - можно ли оптимизировать и улучшить код

04.09.2014, 19:18. Показов 994. Ответов 3
Метки нет (Все метки)

Добрый день
возник следующий вопрос, в программировании не сильно большой гуру
пошел на собеседование , дали тестовое задание парсер мат выражений, написал все работает , в фидбеке написали что код ужасный
могли бы подсказать где ужастность?

main.cpp
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
#include <iostream>
#include <string>
#include <conio.h>
#include "parser.h"
 
using namespace std;
 
 
 
void main()
{
    char str[64];
    Parser pr;
 
    while(1)
    {
        system("CLS");
        cout<<"Input math expr:\t";
        cin>>str;
        
        try
        {
            cout<<str<< " = "<<pr.calculateExp(str)<<endl;
        }
        catch (char* e)
        {
            cout<<e<<endl;
        }
 
        cout<<"Would you like to continue? (y/n)\t";
        if (getch()==(int)'Y')
            continue;
        else break;
    }
 
    cout<<endl;
}
Parser.h
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>
using namespace std;
 
const int iSize = 20;
 
 
template <class T> 
class MyStack
{
    
    T m_stackData[iSize];
    int m_iStackSize;
    friend class Parser;
 
    
    //friend class Parser;
 
    void push(T x)
    {
        if (m_iStackSize<iSize)
            m_stackData[m_iStackSize++] = x;
    }
 
    T pop ()
    {
        if (m_iStackSize>0)
            return m_stackData[--m_iStackSize];
        else return -1;
    }
 
    T top ()const
    {
        if (m_iStackSize>0)
            return m_stackData[m_iStackSize-1];
        else return -1;
    }
 
public:
    MyStack():m_iStackSize(0){}
};
 
 
class Parser
{
    int priorityOperation(char c);
    void make_poland(char * str_expr, char * Output);
    double calculateResult(const char *strPoland);
 
public:
 
    double calculateExp( char *strMathExpr);
    
        
 
};
Parser.cpp
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
#include "parser.h"
 
 
int Parser::priorityOperation(char c)
{      
    switch(c) 
    {
        case '(': return 1;
        case '+': case '-': return 2;
        case '*': case '/': return 3;
        default: return 0;
    }
}
 
void Parser::make_poland(char * strInputExpr, char * strOutput )
{
    int iOperation = 0;
    MyStack <char> stChar;
    int iCountSkobki = 0;
    char curc;
 
    if (strlen(strInputExpr)!=0)
    {
        while (isspace(*strInputExpr))
            *strInputExpr++;
 
        if (!isdigit(*strInputExpr) && *strInputExpr!='(')
            throw (char*)"Incorect input string";
        else
        {
            while(*strInputExpr!='\0')
            {
                if (isdigit(*strInputExpr) || *strInputExpr=='.')
                {
                    *strOutput++=*strInputExpr;
                    iOperation=0;
                }
                else
                {
                    *strOutput++=' ';
 
                    switch(*strInputExpr)
                    {
                    case '(':
                        stChar.push(*strInputExpr);
                        iCountSkobki++;
                        iOperation = 0;
                        break;
                    
                    case '+': case '-': case '*': case '/':
                        {
                            if (strlen(strInputExpr) == 0)
                                throw (char *)"syntaxes error";
 
                            if (!iOperation)
                            {
                                iOperation = 1;
 
                                while(priorityOperation(*strInputExpr)<=priorityOperation(stChar.top()))
                                    *strOutput++ = stChar.pop();
 
                                if (priorityOperation(*strInputExpr)>priorityOperation(stChar.top()))
                                    stChar.push(*strInputExpr);
                            }
                        }
                        break;
 
                    case ')':
                        while ((curc=stChar.pop())!='(' && iCountSkobki>0)
                            *strOutput++ = curc;
                        iCountSkobki--;
 
                        break;
                    }
                }
                *strInputExpr++;
            }
        }
    }
    else throw(char*)"input string is empty";
 
    while(stChar.top() != -1)
        *strOutput++=stChar.pop();
    
    if(iCountSkobki) 
        throw (char*)"incorrect count brackets"; 
 
    *strOutput = '\0';
 
}
 
double Parser::calculateResult(const char *strPoland)
{
    string str;
    MyStack<double> val_stack;
    char* err;
    double n1, n, res = 0;
 
 
    for (size_t i=0;i<strlen(strPoland);i++)
    {
        if(strPoland[i] == ' ')continue;
        
        while(i<strlen(strPoland) && (isdigit(strPoland[i]) || strPoland[i]=='.'))
        {
            str += strPoland[i++];
        }
 
        if(str.length()!=0) 
        {
            val_stack.push(strtod(str.c_str(), &err));
            str.clear();
            if(i >= strlen(strPoland))
                break;                 //end of the input string
 
            if(strPoland[i] == ' ') continue;
 
        }
 
        n = val_stack.pop();         //the first current number
        n1 = val_stack.pop();        //the second current number
 
        switch(strPoland[i])
        {
        case '+': res = n + n1; break;
        case '-': res = n1 - n; break;
        case '*': res = n * n1; break;
        case '/': res = n1 / n; break;
        default: throw (char*)"error";
        }
        val_stack.push(res);
 
    }
 
    return val_stack.pop();
}
 
double Parser::calculateExp( char *strMathExpr)
{
    char strPoland[64];
    make_poland(strMathExpr,strPoland);
 
    return calculateResult(strPoland);
}
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.09.2014, 19:18
Ответы с готовыми решениями:

Написать парсер математических выражений с функцией упрощения этих выражений
Люди, здравствуйте. Есть такая задача: написать упроститель выражений. На вход подается строка...

Парсер математических выражений
Есть код для парсера математических выражений (калькулятора) для операций: +, -, *, /. Помогите...

Парсер математических выражений
Доброго времени суток! Собственно имеется кусок кода распознавания формулы в строке, по требованию...

Парсер математических выражений
Здравствуйте. Пишу понемногу для тренировки парсер обычных математических выражений, содержащим...

3
50 / 31 / 4
Регистрация: 25.04.2013
Сообщений: 366
04.09.2014, 20:20 2
Калькулятор

Кликните здесь для просмотра всего текста
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
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
#include "iostream"
#include "string"
#include "map"
#include "cctype"
 
 
using std::cout; using std::cin; using std::string;
using std::endl; using std::map;
 
enum Token_value
{
    NAME, NUMBER, END, PLUS = '+', MINUS = '-', MUL = '*', DIV = '/',
    PRINT = ';', ASSIGN = '=', LP = '(', RP = ')'
};
 
Token_value curr_tok = PRINT;
double number_value;
string string_value;
map<string, double> table;
string f;
int no_of_errors;
 
double expr(bool);
double term(bool);
double prim(bool);
double error(const string &);
Token_value get_token();
 
 
int main()
{
    table["pi"] = 3.1415926535897932385;
    table["e"] = 2.7182818284590452354;
    while (cin)
    {
        get_token();
        if (curr_tok == END)break;
        if (curr_tok ==PRINT)continue;
        cout<<expr(false)<<"\n";
    }
    system("pause");
    return no_of_errors;
}
 
double prim(bool get)
{
    if (get) get_token();
    switch (curr_tok)
    {
    case NUMBER:
    {
                   double v = number_value;
                   get_token();
                   return v;
    }
    case FUNC:
        {
                 get_token();
        double a = expr(true);
        cout << a;
    }
 
    case NAME:
    {
                 double &v = table[string_value];
                     if (get_token() == ASSIGN)v = expr(true);
                     else v = table[string_value];
                     return v;
 
    }
    case MINUS:
        return -prim(true);
    case LP:
    {
               double e = expr(true);
               if (curr_tok != RP) return error("')'expected");
               get_token();
               return e;
    }
    case ',':
        return get_token();
    default:
        cout << "tracert " << char(curr_tok) << "\n";
        return error("primary expected");
    }
}
 
double expr(bool get)
{
    double left = term(get);
    for (;;)
        switch (curr_tok)
    {
        case PLUS:
            left += term(true);
            break;
        case MINUS:
            left -= term(true);
            break;
        default:
            return left;
    }
}
 
double term(bool get)
{
    double left = prim(get);
    for (;;)
        switch (curr_tok)
    {
        case MUL:
            left *= prim(true);
            break;
        case DIV:
            if (double d = prim(true))
            {
                left /= d;
                break;
            }
            return error("divide by 0" );
        default:
            return left;
    }
}
 
Token_value get_token()
{
    char ch = 0;
    do{
        if (!cin.get(ch))return curr_tok = END;
    } while (ch != '\n' && isspace(ch));
    switch (ch)
    {
    case 0:
        return curr_tok = END;
    case ';':
    case'\n':
        return curr_tok = PRINT;
    case '*':
    case '/':
    case '+':
    case '-':
    case '(':
    case ')':
    case '=':
    case ',':
        return curr_tok = Token_value(ch);
    case '0': case '1':case '2': case '3': case '4':case '5': case '6':case '7': case '8':case '9': case '.':
        cin.putback(ch);
        cin >> number_value;
        return curr_tok = NUMBER;
    default:
    {
               if (isalpha(ch))
               {
                   string_value = ch;
                   while (cin.get(ch) && isalnum(ch))string_value += ch;
                   cin.putback(ch);
                   return curr_tok = NAME;
               }
               cout << "tracert " << ch << endl;
               error("bad token");
               return curr_tok = NUMBER;
    }
 
 
    }
}
double error(const string &s)
{
    no_of_errors++;
    std::cerr << "error: " << s << "\n";
    return 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
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
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
#include <std_lib_facilities.h>
 
double sqrt();
struct Token {
    char kind;
    double value;
    string name;
    Token(char s, string val) :kind(s), name(val){}
    Token(char ch) :kind(ch), value(0) { }
    Token(char ch, double val) :kind(ch), value(val) { }
};
 
class Token_stream {
    bool full;
    Token buffer;
public:
    Token_stream() :full(0), buffer(0) { }
 
    Token get();
    void unget(Token t) { buffer=t; full=true; }
 
    void ignore(char);
};
 
const char let = 'L';
const char quit = 'q';
const char print = ';';
const char number = '8';
const char name = 'a';
const char sq = 's';
 
Token Token_stream::get()
{
    if (full) { full=false; return buffer; }
    char ch;
    cin >> ch;
    switch (ch) {
    case '(':
    case ')':
    case '+':
    case '-':
    case '*':
    case '/':
    case '%':
    case ';':
    case '=':
        return Token(ch);
    case '.':
    case '0':
    case '1':
    case '2':
    case '3':
    case '4':
    case '5':
    case '6':
    case '7':
    case '8':
    case '9':{
         cin.unget();
        double val;
        cin >> val;
        return Token(number, val);
 
    }
    case '#':
        return Token(let);
 
    default:
        if (isalpha(ch)) {
            string s;
            s += ch;
            while(cin.get(ch) && (isalpha(ch) || isdigit(ch))) s+=ch;
            cin.unget();
            if (s == "quit" || s=="q") return Token(quit);
            if (s == "sqrt") return Token(sq);
 
            return Token(name,s);
        }
        error("Bad token");
    }
}
 
void Token_stream::ignore(char c)
{
    if (full && c==buffer.kind) {
        full = false;
        return;
    }
    full = false;
 
    char ch;
    while (cin>>ch)
        if (ch==c) return;
}
 
 
vector<Variable> names; 
 
double get_value(string s)
{
    for (int i = 0; i<names.size(); ++i)
        if (names[i].name == s) return names[i].value;
    error("get: undefined name ",s);
}
 
void set_value(string s, double d)
{
    for (int i = 0; i<=names.size(); ++i)
        if (names[i].name == s) {
            names[i].value = d;
            return;
        }
    error("set: undefined name ",s);
}
 
bool is_declared(string s)
{
    for (int i = 0; i<names.size(); ++i)
    if (names[i].name == s)
    {
        if (!names[i].is_const) return true;
        error(names[i].name+ " is const");
    }
    return false;
}
 
Token_stream ts;
 
double expression();
 
double primary()
{
    Token t = ts.get();
    switch (t.kind) {
    case '(':
    {   
        double d = expression();
        t = ts.get();
        if (t.kind != ')') error("'(' expected");
        return d;
    }
    case 's':
    {
                double d = primary();
                if (d < 0)error("argument sqrt <0");
                return sqrt(d);
    }
    case '-':
        return - primary();
    case number:
        return t.value;
    case name:
        return get_value(t.name);
 
    default:
        error("primary expected");
    }
}
 
double term()
{
    double left = primary();
    while(true) {
        Token t = ts.get();
        switch(t.kind) {
    
        case '*':
            left *= primary();
            break;
        case '/':
        {   double d = primary();
            if (d == 0) error("divide by zero");
            left /= d;
            break;
        }
        default:
            ts.unget(t);
            return left;
        }
    }
}
 
double expression()
{
    double left = term();
    while(true) {
        Token t = ts.get();
        switch(t.kind) {
        case '+':
            left += term();
            break;
        case '-':
            left -= term();
            break;
    
 
        default:
            ts.unget(t);
            return left;
        }
    }
}
 
double declaration()
{
    Token t = ts.get();
    if (t.kind != 'a') error ("name expected in declaration");
    string name = t.name;
    Token t2 = ts.get();
    if (t2.kind != '=') error("= missing in declaration of " ,name);
    if (is_declared(name))
    {
        double d = expression();
        set_value(name, d);
        cout << "declaration is " << name << "\n";
        return d;
    }
 
    double d = expression();
    names.push_back(Variable(name,d,false));
    return d;
}
 
double statement()
{
    Token t = ts.get();
    switch(t.kind) {
    case let:
        return declaration();
    default:
    {
               ts.unget(t);
               return expression();
    }
    }
}
 
void clean_up_mess()
{
    ts.ignore(print);
}
 
const string prompt = "> ";
const string result = "= ";
 
void calculate()
{
    while(true) try {
        cout << prompt;
        Token t = ts.get();
        while (t.kind == print) t=ts.get();
        if (t.kind == quit) return;
        ts.unget(t);
        cout << result << statement() << endl;
    }
    catch(runtime_error& e) {
        cerr << e.what() << endl;
        clean_up_mess();
    }
}
 
int main()
{
    names.push_back(Variable("pi",3.14,true));
    try {
        calculate();
        system("pause");
        return 0;
    }
    catch (exception& e) {
        cerr << "exception: " << e.what() << endl;
        char c;
        while (cin >> c&& c != ';');
        return 1;
    }
    catch (...) {
        cerr << "exception\n";
        char c;
        while (cin >> c && c != ';');
        return 2;
    }
}


Добавлено через 12 минут
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
struct Variable {
    string name;
    double value;
    bool is_const;
    Variable(string n, double v, bool a) :name(n), value(v), is_const(a) { }
};
0
50 / 31 / 4
Регистрация: 25.04.2013
Сообщений: 366
04.09.2014, 20:28 3
и еще 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
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
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
#
struct Variable {
    string name;
    double value;
    bool is_const;
    Variable(string n, double v, bool a) :name(n), value(v), is_const(a) { }
 
double sqrt();
struct Token {
    char kind;
    double value;
    string name;
    Token(char s, string val) :kind(s), name(val){}
    Token(char ch) :kind(ch), value(0) { }
    Token(char ch, double val) :kind(ch), value(val) { }
};
 
class Token_stream {
    bool full;
    Token buffer;
public:
    Token_stream() :full(0), buffer(0) { }
 
    Token get();
    void unget(Token t) { buffer=t; full=true; }
 
    void ignore(char);
};
 
const char let = 'L';
const char quit = 'q';
const char print = ';';
const char number = '8';
const char name = 'a';
const char sq = 's';
 
Token Token_stream::get()
{
    if (full) { full=false; return buffer; }
    char ch;
    cin >> ch;
    switch (ch) {
    case '(':
    case ')':
    case '+':
    case '-':
    case '*':
    case '/':
    case '%':
    case ';':
    case '=':
        case '!':
        return Token(ch);
    case '.':
    case '0':
    case '1':
    case '2':
    case '3':
    case '4':
    case '5':
    case '6':
    case '7':
    case '8':
    case '9':{
         cin.unget();
        double val;
        cin >> val;
        return Token(number, val);
 
    }
    case '#':
        return Token(let);
 
    default:
        if (isalpha(ch)) {
            string s;
            s += ch;
            while(cin.get(ch) && (isalpha(ch) || isdigit(ch))) s+=ch;
            cin.unget();
            if (s == "quit" || s=="q") return Token(quit);
            if (s == "sqrt") return Token(sq);
 
            return Token(name,s);
        }
        error("Bad token");
    }
}
 
void Token_stream::ignore(char c)
{
    if (full && c==buffer.kind) {
        full = false;
        return;
    }
    full = false;
 
    char ch;
    while (cin>>ch)
        if (ch==c) return;
}
 
 
vector<Variable> names; 
 
double get_value(string s)
{
    for (int i = 0; i<names.size(); ++i)
        if (names[i].name == s) return names[i].value;
    error("get: undefined name ",s);
}
 
void set_value(string s, double d)
{
    for (int i = 0; i<=names.size(); ++i)
        if (names[i].name == s) {
            names[i].value = d;
            return;
        }
    error("set: undefined name ",s);
}
 
bool is_declared(string s)
{
    for (int i = 0; i<names.size(); ++i)
    if (names[i].name == s)
    {
        if (!names[i].is_const) return true;
        error(names[i].name+ " is const");
    }
    return false;
}
 
Token_stream ts;
 
double expression();
 
double primary()
{
    Token t = ts.get();
    switch (t.kind) {
    case '(':
    {   
        double d = expression();
        t = ts.get();
        if (t.kind != ')') error("'(' expected");
        return d;
    }
    case 's':
    {
                double d = primary();
                if (d < 0)error("argument sqrt <0");
                return sqrt(d);
    }
    case '-':
        return - primary();
    case number:
        return t.value;
    case name:
        return get_value(t.name);
 
    default:
        error("primary expected");
    }
}
 
double term()
{
    double left = primary();
    while(true) {
        Token t = ts.get();
        switch(t.kind) {
            case '!':
        {
            left = fact(left);
            t = ts.get();
            break;
        }
        case '*':
            left *= primary();
            break;
        case '/':
        {   double d = primary();
            if (d == 0) error("divide by zero");
            left /= d;
            break;
        }
        default:
            ts.unget(t);
            return left;
        }
    }
}
 
double expression()
{
    double left = term();
    while(true) {
        Token t = ts.get();
        switch(t.kind) {
        case '+':
            left += term();
            break;
        case '-':
            left -= term();
            break;
    
 
        default:
            ts.unget(t);
            return left;
        }
    }
}
 
double declaration()
{
    Token t = ts.get();
    if (t.kind != 'a') error ("name expected in declaration");
    string name = t.name;
    Token t2 = ts.get();
    if (t2.kind != '=') error("= missing in declaration of " ,name);
    if (is_declared(name))
    {
        double d = expression();
        set_value(name, d);
        cout << "declaration is " << name << "\n";
        return d;
    }
 
    double d = expression();
    names.push_back(Variable(name,d,false));
    return d;
}
 
double statement()
{
    Token t = ts.get();
    switch(t.kind) {
    case let:
        return declaration();
    default:
    {
               ts.unget(t);
               return expression();
    }
    }
}
 
void clean_up_mess()
{
    ts.ignore(print);
}
 
const string prompt = "> ";
const string result = "= ";
 
void calculate()
{
    while(true) try {
        cout << prompt;
        Token t = ts.get();
        while (t.kind == print) t=ts.get();
        if (t.kind == quit) return;
        ts.unget(t);
        cout << result << statement() << endl;
    }
    catch(runtime_error& e) {
        cerr << e.what() << endl;
        clean_up_mess();
    }
}
 
int main()
{
    names.push_back(Variable("pi",3.14,true));
    try {
        calculate();
        system("pause");
        return 0;
    }
    catch (exception& e) {
        cerr << "exception: " << e.what() << endl;
        char c;
        while (cin >> c&& c != ';');
        return 1;
    }
    catch (...) {
        cerr << "exception\n";
        char c;
        while (cin >> c && c != ';');
        return 2;
    }
}
double fact(double x)
{
    if (x == 1)
        return 1;
    return x* fact(x - 1);
}
0
И целого heap'а мало
95 / 56 / 17
Регистрация: 31.07.2014
Сообщений: 291
04.09.2014, 22:59 4
flax,
1. Не надо закакивать глобалку через using namespace std; за такое надо пальцы отрубать. Если жмёт, декларируйте локально.
2. Определитесь с чем работаете: стримы или сяшные строки. Вопрос для самопроверки: "Мне ололо-скушно, хочу дебажить?" Если ответ положительный, добро пожаловать сяшные строки.
3. make_poland - конечно хорошо, но make_sandwitch лучше. Луркайте coding standarts, naming conventions. Гугловые сойдут.
4. кидать указатели на ся-строчные литералы просто хорошо.
5. дальше ленька.
Всегда рады обкакать, обращайтесь
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.09.2014, 22:59

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

Парсер математических выражений
знаю изъезженная тема, надо написать парсер мат выражений с поддержкой скобок и некоторых несложных...

Парсер математических выражений
Например человек вводит вот этот в текстовую перемену char или string: 1+2+3*(4/2)-1 Как...

Парсер простых математических выражений
Доброго времени суток, люди помогите перелопатил весь нет не могу решить одну задачку. Вот...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.