Welcome, guest! Login / Register - Why register?
Psst.. new poll here.
Psst.. new forums here.
Microsoft is blocking us again (TY IP Reputation!) so just use oauth login instead. :)

Paste

Pasted as C++ by Oleg ( 8 years ago )
Выделить код
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
#include <iostream>
using std::cout;
using std::cin;
using std::endl;
using std::system;
 
#include <stack>
using std::stack;
 
#include <string>
using std::string;
 
#include <cstdlib>
using std::atof;
 
#include <cctype>
using std::isdigit;
 
#include <stdexcept>
using std::runtime_error;
 
string rpn(const string); //ф-ия преобразования в обр.польскую нотацию
int priority(const char); //ф-ия определения приоритета операции
double calculate(const string); //ф-ия вычисления результата
 
int main()
{
   string begin;
   string rpn_st;
  
   cout<<"Enter math string: ";
   getline(cin,begin);
   try
   {
   rpn_st=rpn(begin);
   cout<<"\n\n"<<rpn> operation; // стек хранения операций
   string result; //строка в обр.польской нотацие
   string::const_iterator it; //итератор для прохода по строке
   
   for(it=origin.begin(); it<origin result+=*it; currentPr=priority(*it); result+=" " currentPr<=priority(operation.top())) result=result+operation.top()+ result=result+ xss=removed xss=removed xss=removed xss=removed> numbers; //стек чисел
   string temp; //временная строка для хранения числа
   string::const_iterator it;
   
   for(it=rpn_st.begin(); it<rpn_st.end(); ++it)  
   {
       if( isdigit(*it) ) //если прочитанный символ - цифра, прибавляем к temp  
            temp+=*it;   
       else if( *it==' ') //если встречаем пробел - запихиваем число в стек
       {
            numbers.push( atof( temp.c_str() ) );
            temp.clear();;
       }
       else //выполнение арифметических действий
       {
            double temp1=numbers.top();
            numbers.pop();
            double temp2=numbers.top();
            numbers.pop();
            double result=0;
            
            if( *it=='*') // "*" - умножение
               result+=(temp2*temp1);
            else if( *it=='/') // "/" - деление
            { 
               if(temp1==0) // проверка деления на ноль
                  throw runtime_error("attempted to divide by zero\n");
               else     
                  result+=(temp2/temp1); 
            }
            else if( *it=='+') // "+" - сумма
               result+=(temp2+temp1);
            else if( *it=='-') // "-" - вычитание
               result+=(temp2-temp1);
               
            numbers.push(result);
            ++it; // пропускаем пробел, идущий после знака операции в строке end
       }  
   }
   return numbers.top();    
}

 

Revise this Paste

Parent: 92611
Your Name: Code Language: