1#include<stdio.h>// getchar, scanf, printf, puts2#include<ctype.h>// isspace34int c;56doublefactor(void)// 因数(factor)は数値7{8double val =0;9if(scanf("%lf",&val)==1)10while(isspace(c =getchar()));// 次の演算子を読み込んでおく11else12 c =EOF;// エラーのため入力打ち切り。次の演算子はない13return val;14}1516doubleterm(void)// 項(term)は因数(factor)の積商17{18double val =factor();19while(1)20if(c =='*')21 val *=factor();22elseif(c =='/')23 val /=factor();24else25break;26return val;27}2829doubleexpr(void)// 式(expression)は項(term)の和差30{31double val =term();32while(1)33if(c =='+')34 val +=term();35elseif(c =='-')36 val -=term();37else38break;39return val;40}4142intmain(void)43{44double val =expr();45if(c =='=')46printf("%.15g\n", val);47else48puts("error");49}
1#include<stdio.h>// scanf, printf, puts23intpriority(char op)4{5if(op =='+'|| op =='-')return1;6if(op =='*'|| op =='/')return2;7return0;// op == '='8}910intmain(void)11{12double val[3];13char op[3];14if(scanf("%lf %c",&val[0],&op[0])!=2)returnputs("error");15for(int i =1; op[i-1]!='='; i++){16if(scanf("%lf %c",&val[i],&op[i])!=2)returnputs("error");17while(i >0&&priority(op[i-1])>=priority(op[i])){18switch(op[--i]){19case'+': val[i]+= val[i+1];break;20case'-': val[i]-= val[i+1];break;21case'*': val[i]*= val[i+1];break;22case'/': val[i]/= val[i+1];break;23default:returnputs("error");24}25 op[i]= op[i+1];26}27}28printf("%.15g\n", val[0]);29}
理解できますか?
追記2
演算子の優先順位を比較しないほうが行数が多いのですが、
工夫すれば減らすことができます。
C
1#include<stdio.h>// scanf, printf23char c, op[]="+-*/";45doubleexpr(int i)6{7double val =0;8if(i <4)9for(val =expr(i+2); c == op[i]|| c == op[i+1];)10 c =='+'? val +=expr(i+2): c =='-'? val -=expr(i+2):11 c =='*'? val *=expr(i+2):(val /=expr(i+2));12elseif(scanf("%lf %c",&val,&c)!=2) c =0;13return val;14}1516intmain(void)17{18double val =expr(0);19printf(c =='='?"%.15g\n":"error\n", val);20}