实验4

表达式求值是进行数据处理的最基本操作。请编写程序完成一个简单算术表达式的求值。要求如下: 

(1) 运算符包括:+、-、*、-、^(乘方)、括号

(2)运算量为数值常量,根据自己的能力可以对运算量做不同的约束,例如1位整数、多位整数、实数等(会有不同的测试用例);

 

输入:一行,即表达式,以“=”结束。例如:

           5*(8-3)+6/5=

输出:一行,即表达式的值。结果值为整数时输出为整数,如果有小数时保留5位小数。

           26.20000

AC代码:

  1 #include <bits/stdc++.h>
  2 #include <stdio.h>
  3 #include <stdlib.h>
  4 #include <string.h>
  5 using namespace std;
  6 const int maxn=1e3+50;
  7 const double eps=1e-8;
  8 char str[maxn],OP[10]={'+','-','*','/','^','(',')','#'};
  9 bool flag;
 10 bool judge_d()
 11 {
 12     for(int i=1;str[i]!='\0';i++)
 13     {
 14         if(str[i]<='9'&&str[i]>='0'&&str[i+1]<='9'&&str[i+1]>='0') return true;
 15     }
 16     return false;
 17 }
 18 
 19 bool judge_lf()
 20 {
 21     for(int i=1;str[i]!='\0';i++)
 22     {
 23         if(str[i]<='9'&&str[i]>='0'&&str[i+1]=='.'&&str[i+2]<='9'&&str[i+2]>='0')
 24         {
 25             return true;
 26         }
 27     }
 28     return false;
 29 }
 30 
 31 double scan_lf(string cnt)
 32 {
 33         int in;double Dec=0.1,num;
 34         bool IsN=false,IsD=false;
 35         in=0;
 36         if(cnt[in]=='\0') return 0;
 37         while(cnt[in]!='-'&&cnt[in]!='.'&&(cnt[in]<'0'||cnt[in]>'9'))
 38                 in++;
 39         if(cnt[in]=='-'){IsN=true;num=0;}
 40         else if(cnt[in]=='.'){IsD=true;num=0;}
 41         else num=cnt[in]-'0';
 42         if(!IsD){
 43                 while(in++,cnt[in]>='0'&&cnt[in]<='9'){
 44                         num*=10;num+=cnt[in]-'0';}
 45         }
 46         if(cnt[in]!='.'){
 47                 if(IsN) num=-num;
 48                 return num;
 49         }else{
 50                 while(in++,cnt[in]>='0'&&cnt[in]<='9'){
 51                         num+=Dec*(cnt[in]-'0');Dec*=0.1;
 52                 }
 53         }
 54         if(IsN) num=-num;
 55         return num;
 56 }
 57 
 58 double scan_d(string cnt)
 59 {
 60         int in=0,num;bool IsN=false;
 61         if(cnt[in]=='\0') return 0;
 62         while(cnt[in]!='-'&&(cnt[in]<'0'||cnt[in]>'9')) in++;
 63         if(cnt[in]=='-'){ IsN=true;num=0;}
 64         else num=cnt[in]-'0';
 65         while(in++,cnt[in]>='0'&&cnt[in]<='9'){
 66                 num*=10,num+=cnt[in]-'0';
 67         }
 68         if(IsN) num=-num;
 69         return num;
 70 }
 71 
 72 bool In(char ch)
 73 {
 74     for(int i=0;i<=7;i++) if(OP[i]==ch) return true;
 75     return false;
 76 }
 77 double Operate_single(double x,char op,double y)
 78 {
 79     if(op=='+') return x+y;
 80     else if(op=='-') return x-y;
 81     else if(op=='*') return x*y;
 82     else if(op=='/')
 83     {
 84         if(abs(x-y*int(x/y))>eps) flag=true;
 85         return x/y;
 86     }
 87     else if(op=='^')
 88     {
 89         int tmp=x;
 90         while(--y) tmp*=x;
 91         return tmp;
 92     }
 93 }
 94 
 95 char Precede(char ch1,char ch2)
 96 {
 97     if(ch1=='+' || ch1=='-')
 98     {
 99         if(ch2=='*' || ch2=='/' || ch2=='(' || ch2=='^') return '<';
100         else return '>';
101     }
102     else if(ch1=='*' || ch1=='/')
103     {
104         if(ch2=='(' || ch2=='^') return '<';
105         else return '>';
106     }
107     else if(ch1=='(')
108     {
109         if(ch2==')') return '=';
110         else return '<';
111     }
112     else if(ch1==')') return '>';
113     else if(ch1=='^')
114     {
115         if(ch2=='(') return '<';
116         else return '>';
117     }
118     else
119     {
120         if(ch2=='#') return '=';
121         else return '<';
122     }
123 }
124 
125 void work_single()
126 {
127     char OPTR[100],theta;
128     double OPND[100],a,b;
129     int topTR=0,topND=0,c=1;
130     OPTR[++topTR]='#';
131     while(str[c]!='#' || OPTR[topTR]!='#')
132     {
133         if(!In(str[c])) {OPND[++topND]=str[c]-'0'+0.0;c++;}
134         else
135         {
136             switch (Precede(OPTR[topTR],str[c])){
137                 case '<': OPTR[++topTR]=str[c];c++; break;
138                 case '=': topTR--; c++; break;
139                 case '>': theta=OPTR[topTR--]; b=OPND[topND--]; a=OPND[topND--];
140                 OPND[++topND]=Operate_single(a,theta,b);break;
141             }
142         }
143     }
144     if(flag) printf("%.5f\n",OPND[topND]);
145     else printf("%.0f\n",OPND[topND]);
146 }
147 void work_d()
148 {
149     char OPTR[100],theta;
150     double OPND[100],a,b;
151     int topTR=0,topND=0,c=1;
152     OPTR[++topTR]='#';
153     while(str[c]!='#' || OPTR[topTR]!='#')
154     {
155         if(!In(str[c])) {
156             string cnt="";
157             while(!In(str[c]))
158             {
159                 cnt+=str[c];
160                 c++;
161             }
162             OPND[++topND]=(double)scan_d(cnt);
163         }
164         else
165         {
166             switch (Precede(OPTR[topTR],str[c])){
167                 case '<': OPTR[++topTR]=str[c];c++; break;
168                 case '=': topTR--; c++; break;
169                 case '>': theta=OPTR[topTR--]; b=OPND[topND--]; a=OPND[topND--];
170                 OPND[++topND]=Operate_single(a,theta,b);break;
171             }
172         }
173     }
174     if(flag) printf("%.5f\n",OPND[topND]);
175     else printf("%.0f\n",OPND[topND]);
176 }
177 void work_lf()
178 {
179     char OPTR[100],theta;
180     double OPND[100],a,b;
181     int topTR=0,topND=0,c=1;
182     OPTR[++topTR]='#';
183     while(str[c]!='#' || OPTR[topTR]!='#')
184     {
185         if(!In(str[c])) {
186             string cnt="";
187             while(!In(str[c]))
188             {
189                 cnt+=str[c];
190                 c++;
191             }
192             OPND[++topND]=(double)scan_lf(cnt);
193         }
194         else
195         {
196             switch (Precede(OPTR[topTR],str[c])){
197                 case '<': OPTR[++topTR]=str[c];c++; break;
198                 case '=': topTR--; c++; break;
199                 case '>': theta=OPTR[topTR--]; b=OPND[topND--]; a=OPND[topND--];
200                 OPND[++topND]=Operate_single(a,theta,b);break;
201             }
202         }
203     }
204     if(flag) printf("%.5f\n",OPND[topND]);
205     else printf("%.0f\n",OPND[topND]);
206 }
207 int main()
208 {
209     scanf("%s",str+1);
210     int len=strlen(str+1);
211     str[len]='#';
212     if(judge_lf()) work_lf();
213     else if(judge_d()) work_d();
214     else work_single();
215     return 0;
216 }
217 //5*(8-3)+60.2/5=
View Code

 

posted @ 2019-04-30 20:49  Gang_Li  阅读(363)  评论(0编辑  收藏  举报