收藏 分销(赏)

利用栈求表达式的值-可供小学生作业-并能给出分数.doc

上传人:人****来 文档编号:4298253 上传时间:2024-09-04 格式:DOC 页数:21 大小:123KB 下载积分:10 金币
下载 相关
利用栈求表达式的值-可供小学生作业-并能给出分数.doc_第1页
第1页 / 共21页
利用栈求表达式的值-可供小学生作业-并能给出分数.doc_第2页
第2页 / 共21页


点击查看更多>>
资源描述
//1.h #include<ctime> #include<cstring> #include<fstream> #include<iomanip> #include<iostream> using namespace std; //template<class T> struct Ti //定义一个结构体,用于存储题习题库中的每一道台?题目 { char chh[30]; }; template<class T> struct Stack //定义栈,其中数据元素为字符型í { T data[50]; int top; }; template<class T> struct Stack2 //定义栈,其中数据元素为整型í { float data[50]; int top; }; template<class T> class link { public: void Push(Stack<T> &S,char x); char Pop(Stack<T> &S,char x); void Push2(Stack2<T> &S,float x); float Pop2(Stack2<T> &S,float x); void pingjia(int m) ; int In(char c); int change(char x); int Precede(int a,int b); float Operate(float a,char c,float b); void toEmpty(char s[],int n); void isStay(char s1[],int n1,char s2[],int n2); int isInt(char s[],int n); void xitiku(char a[],int n); float Expression(); Stack<T> setStack(); Stack2<T> setStack2(); }; //1.cpp #include<ctime> #include"1.h" #include<cstring> #include<fstream> #include<iomanip> #include<iostream> using namespace std; template<class T> void link<T>::Push(Stack<T> &S,char x) { if(S.top==49) { cout<<"栈已满!?"<<endl; } else S.top++; S.data[S.top]=x; } template<class T> char link<T>:: Pop(Stack<T> &S,char x) { if(S.top==-1) { cout<<"栈空!"<<endl; } x=S.data[S.top]; S.top--; return x; } template<class T> void link<T>::Push2(Stack2<T> &S,float x) { if(S.top==49) { cout<<"栈已满!"<<endl; } else S.top++; S.data[S.top]=x; } template<class T> float link<T>::Pop2(Stack2<T> &S,float x) { if(S.top==-1) { cout<<"栈空!"<<endl; } x=S.data[S.top]; S.top--; return x; } template<class T> void link<T>::pingjia(int m) { switch(m/10) { case 0: case 1: case 2: case 3: case 4: case 5: cout<<"对不起,你没能及格,要加油哦!\n"; break; case 6: case 7: cout<<"恭喜您及格了,但离高分还有距离哦!\n"; break; case 8: case 9: cout<<"哇,您居然得了这么高的分数,真棒!\n"; break; case 10: cout<<"OH MY GOD!,您竟然考了满分!!\n";break; } } template<class T> int link<T>::In(char c) //判断字符是否为运算符? { int m=0,i; char OP[7]={'+','-','*','/','(',')','#'}; for(i=0;i<7;i++){ if(c==OP[i]) m++; } if(m==0) return 0; else return 1; } template<class T> int link<T>::change(char x) //将运算符转换成为数字 { int a; switch(x) { case '+': a=0;break; case '-': a=1;break; case '*': a=2;break; case '/': a=3;break; case '(': a=4;break; case ')': a=5;break; case '#': a=6;break; } return a; } template<class T> int link<T>:: Precede(int a,int b) //比括较运算符之间的优先级 { int A; int token[7][7]={{1,1,-1,-1,-1,1,1}, {1,1,-1,-1,-1,1,1}, {1,1,1,1,-1,1,1}, {1,1,1,1,-1,1,1}, {-1,-1,-1,-1,-1,0,2}, {1,1,1,1,2,1,1}, {-1,-1,-1,-1,-1,2,0}}; switch(token[a][b]) { case -1: A=-1; break; case 0: A= 0; break; case 1: A= 1; break; }return A; } template<class T> float link<T>::Operate(float a,char c,float b) //对两个数进行四则运算 { float s; switch(c){ case'+': s=a+b; break; case'-': s=a-b; break; case'*': s=a*b; break; case'/': s=a/b; break; } return s; } template<class T> void link<T>::toEmpty(char s[],int n) //把一个数组置空 { int i; for(i=0;i<n;i++) s[i]='\0'; } template<class T> void link<T>::isStay(char s1[],int n1,char s2[],int n2) //把一个表达式分成几段 { int i=0,j=0; while(s1[i]==' ') { if(s1[i]==' ') { i++; } } if(s1[i]=='\0') exit(0); while(s1[i]!='\0') { if(In(s1[i+1])!=In(s1[i])||In(s1[i+1])*In(s1[i])==1||s1[i]=='\0') { s2[j]=s1[i]; s1[i]=' '; break; } if(In(s1[i+1])==In(s1[i])) { s2[j]=s1[i]; s1[i]=' '; i++; j++; } } } template<class T> int link<T>::isInt(char s[],int n) { int i=0,j=0,x; while(s[i]!=' '&&s[i]!='\0') { if(s[i]>='0'&&s[i]<='9'||s[0]=='-') j++; i++; } if(i==j) { x=atoi(s); return x; } else return -1; } template<class T> void link<T>::xitiku(char a[],int n) //创建习题库 { int TIME,T; Ti t[100]={'\0'}; char ch[30]={'\0'}; int i; ifstream file("TextFile1.txt",ios_base::in); if(!file) { cout<<"打洙?开a习°题琣库a文?件t失骸?败悒?!?"<<endl; exit(0); } i=0; while(!file.eof()) { file.getline(ch,50); strcpy(t[i].chh,ch); i++; } srand(time(0)); TIME=rand()%7; T=TIME; int j=0; while(t[T].chh[j]!='#') { cout<<t[T].chh[j]; j++; } cout<<'='; strcpy(a,t[T].chh); file.close(); } template<class T> float link<T>::Expression() //试题测试 { char x=0,theta=0; char s[30]={'\0'},shu[5]={'\0'}; float a=0,b=0,n; int i,j; Stack<T> R; Stack2<T> D; R=setStack(); Push(R,'#'); D=setStack2(); xitiku(s,30); isStay(s,30,shu,5); while((shu[0]!='#'||R.data[R.top]!='#')) { if(In(shu[0])==0) { float S1=atoi(shu); Push2(D,S1); toEmpty(shu,5); isStay(s,30,shu,5); } else { i=change(R.data[R.top]); j=change(shu[0]); switch(Precede(i,j)) { case -1: Push(R,shu[0]); toEmpty(shu,5); isStay(s,30,shu,5); break; case 0: Pop(R,x); toEmpty(shu,5); isStay(s,30,shu,5); break; case 1: theta=Pop(R,theta); b=Pop2(D,b); a=Pop2(D,a); n=Operate(a,theta,b); Push2(D,n); break; } } } return n; } template<class T> Stack2<T> link<T>::setStack2() { Stack2<T> s; s.top=-1; return s; } template<class T> Stack<T> link<T>::setStack() { Stack<T> s; s.top=-1; return s; } //main.cpp #include"1.cpp" #include"iostream" using namespace std; int main() { link <int> t; cout<<"---------------------------------表达式求值-------------------------------------\n"; int i=0,j,geshu=0,n,m,jieguo[100],daan[100]; char ch,c[6]={'\0'}; cout<<"***做题请输入A,查看成绩单请输入B,结束程序请输入C***\n\n"; cin>>ch; cout<<endl; while(ch) { switch(ch) { case 'A': cout<<"-------------现在开始做题--------------\n\n"; n=int(t.Expression()+0.5); cout<<"\n\n请输入你的答案?输入-1表示停止做题:"; cin>>c; m=t.isInt(c,6); while(m!=-1) { if(m==-1111) { cout<<"\n输入错误,请重新输入您的答案!"; cout<<"\n\n请输入你的答案(输入-1表示停止做题):"; cin>>c; m=t.isInt(c,6); } else { i++; jieguo[i-1]=m; daan[i-1]=n; if(m==n) geshu++; cout<<endl; n=int(t.Expression()+0.5); cout<<"\n\n请输入你的答鋏案(输入-1表示停止做题):"; cin>>c; m=t.isInt(c,6); } } cout<<"----------------------------------------\n\n"; break; case 'B': if(i==0) cout<<"成绩单为空!\n\n"; else { cout<<" *********您的成绩单******* \n\n"; cout<<"-----------------------------------\n"; cout<<"题号 你的答案 正确答案 结论\n"; for(j=0;j<i;j++) { cout<<setw(2)<<j+1; cout<<setw(11)<<jieguo[j]; cout<<setw(11)<<daan[j]; if(jieguo[j]==daan[j]) cout<<setw(11)<<"正确!"; else cout<<setw(11)<<"错误!"; cout<<endl; } cout<<"-----------------------------------\n"; cout<<"共做了"<<i<<"道题,其中\n"; cout<<"做对了"<<geshu<<"道题,做错了"<<i-geshu<<"道题.\n"; int fenshu=geshu*100/i; cout<<"最后成绩为:"<<fenshu<<"分!"<<endl; t.pingjia(fenshu); cout<<"-----------------------------------\n"; } break; case 'C': cout<<"程序结束,谢谢使用!"<<endl; exit(0); default: cout<<"输入错误,请重新输入!"<<endl; break; } cout<<"\n***做题请输入A,查看历史请输入B,结束程序请输入C***\n\n"; cin>>ch; cout<<endl; ch=toupper(ch); } system("pause"); return 0; }
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 教育专区 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服