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

Дана строка, изображающая арифметическое выражение. Найти значение выражения - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Выполнить операцию транспонирования прямоугольной матрицы http://www.cyberforum.ru/cpp-beginners/thread37416.html
Выполнить операцию транспонирования прямоугольной матрицы A (m, n), m не равно n, не выделяя дополнительный массив для хранения результата.
C++ Выполнить операцию транспонирования прямоугольной матрицы Выполнить операцию транспонирования прямоугольной матрицы A (m, n), m не равно n, не выделяя дополнительный массив для хранения результата. http://www.cyberforum.ru/cpp-beginners/thread37415.html
Удаление символов из файла C++
Как удалить символы из открытого для чтения файла при помощи только функций fgetc и fputc? Может написать кто код для, например, удаления первых пяти символов?
Ввод строки в графическом режиме С++ dos C++
Приветик,пишу курсач и возникли проблемы с вводом с клавиатуры и выводом строки в графическом режиме.Сin и cout не подходят.Помогите плиз
C++ Вывод строк по сортировке одного поля. http://www.cyberforum.ru/cpp-beginners/thread37395.html
Вот код: #include "stdafx.h" #include "dec.h" void abc_view() { char *result, *pch; char tmpline={0}; fin=fopen("asale.dat","rt"); if(fin==NULL) cout<<"ЋиЁЎЄ*! “Є*§***л© д*©« *Ґ **©¤Ґ*."<<"\n";//Сообщение об ошибке, если файл не найден
C++ Функция для определения минимального элемента вектора Здраствуйте, вот такое задание, не могу никак понять как его делать:( помогите плиз :( 7. Описать функцию min(x) для определения минимального элемента вектора х, введя вспомогательную рекурсивную функцию min(k), находящую минимум среди последних элементов вектора х, начиная с k-го. подробнее

Показать сообщение отдельно
SONNY
8 / 8 / 0
Регистрация: 30.05.2009
Сообщений: 47
02.06.2009, 03:24     Дана строка, изображающая арифметическое выражение. Найти значение выражения
Через стек реализация.Правда надо немного подкорректировать
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
#include <iostream>
#include <iomanip>
#include <cmath>
#include <list>
#include <stack>
#include <vector>
using namespace std;
 
bool isOperator( char p )
{
    char* oper[] = { "+", "-", "/", "*", "^" };
    int size = sizeof( oper )/sizeof( char* );
    for( int i = 0; i < size; i++ )
    {
        if( p == *oper[ i ] )
            return true;
    }
    return false;
}
 
double Add( double x, double y )
{
    return x + y;
}
 
double Sub( double x, double y )
{
    return y - x;
}
 
double Div( double x, double y )
{
    return y/x;
}
 
double Mult( double x, double y )
{
    return x*y;
}
 
double Exp( double x, double y )
{
    return pow( y, x );
}
 
double F( char p, double x, double y )
{
    double temp;
    char* oper[] = { "+", "-", "/", "*", "^" };
    double (*f[])( double, double ) = { Add, Sub, Div, Mult, Exp };
    int size = sizeof( oper )/sizeof( char* );
    for( int i = 0; i < size; i++ )
    {
        if( p == *oper[ i ] )
            temp = f[ i ]( x, y );
    }
    return temp;
}
 
bool Priority( const char& inf, const char& st )
{
    if( (inf == '+' || inf == '-') && (st == '*' || st == '/' || st == '^') )
        return true;
    else
        return false;
}
 
int main( int argc, char* argv[] )
{
    unsigned char temp = 0;
    list<unsigned char> infix,postfix;
    cout << "Input data:";
    while( (temp = cin.get()) != '\n' )
    infix.push_back( temp );
    temp = 0;
    infix.push_back( ')' );
    stack<char> st;
    st.push( '(' );
 
    /*пока стэк пустой читаем значения*/
    while( !st.empty() )
    {
        if( isOperator( infix.front() ) ) /*1 операция*/
        {
            if( isOperator( st.top() ) )
            {
                while( Priority( infix.front(), st.top() ) && isOperator( st.top()) )
                {
                    postfix.push_back( st.top() );
                    st.pop();
                }
            }
            st.push( infix.front() );
            infix.pop_front();
        }
        if( infix.front() == '(' ) /*2 операция*/
        {
            st.push( infix.front() );
            infix.pop_front();
        }
        else /*3 операция*/ 
        {
            if( infix.front() == ')' )
            {
                while( st.top() != '(' )
                {
                    postfix.push_back( st.top() );
                    st.pop();
                }
                st.pop();
                infix.pop_front();
            }
            else
            {
                vector<int> v;
                while( infix.front() != ')' && !isOperator( infix.front() ) )
                {
                    v.push_back( infix.front() - '0' );
                    infix.pop_front();
                }
                int rez = 0;
                for( unsigned int j = 0; j < v.size(); j++ )
                rez += *( v.begin() + j )*pow( 10, static_cast<double>( v.size() - j - 1 ) );
                postfix.push_back( rez + '0' );
            }
        }
    }
    copy( postfix.begin(), postfix.end(), ostream_iterator<unsigned char>( cout, " " ) );
    cout << endl;
    stack<double> st_int;
    double x = 0, y = 0, rez = 0;
    postfix.push_back( '\0' );
    while( postfix.front() != '\0' )
    {
        if( isOperator( postfix.front() ) )
        {
            x = st_int.top();
            st_int.pop();
            y = st_int.top();
            st_int.pop();
            rez = F( postfix.front(), x, y );
            st_int.push( rez );
            postfix.pop_front();
        }
        else
        {
            st_int.push( postfix.front() - '0' );
            postfix.pop_front();
        }
    }
    cout << setiosflags( ios::fixed | ios::showpoint ) << setprecision( 2 ) << st_int.top() << endl;
    st_int.pop();
}
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru