![]() |
#2
文思旋风2012-06-17 14:08
#include<iostream>
#include"conio.h" #define maxsize 100 #include "ctype.h" typedef char datatype; typedef struct { datatype stack[maxsize]; int top; } seqstack; #define STACK_INIT_SIZE 100 template <class T> class stack { private: T*base; T *top; int stacksize; public: stack() { InitStack(seqstack *); } ~stack() { if() { delete[]base; } } void InitStack(seqstack *s); // 创建栈 int noempty(seqstack s) void Push(seqstack *s); // 向栈中放入数据[压栈] void Pop(seqstack *s,datatype *d); // 从栈中取数据[弹栈] int GetTop(seqstack s,datatype *d); // 查看栈顶数据 }; template <class T> void stack<T>:: InitStack(seqstack *s) // 创建栈 { s->top=0; } template <class T> int stack<T>:: noempty(seqstack s) { if(s.top<=0) return 0; else return 1; } template <class T> void stack<T>:: Push(seqstack *s, datatype x) // 向栈中放入数据[压栈] { if(s->top>=maxsize) { cout<<"堆栈已满无法插入!"<<endl; return 0; } else { s->stack[s->top]=x; s->top++; return 1; } } template <class T> void stack<T>:: Pop(seqstack *s,datatype *d) // 从栈中取数据[弹栈] { if(s->top<=0) { cout<<"堆栈已空无数据元素出栈!"<<endl; return 0; } else { s->top--; *d=s->stack[s->top]; return 1; } } template <class T> T stack<T>::GetTop(seqstack s,datatype *d) // 查看栈顶数据 { if(s.top<=0) { cout<<"堆栈已空!"<<endl; return 0; } else { *d=s.stack[s.top-1]; return 1; } } void expiscorrect(char exp[], int n) { seqstack mystack; int i; char c; InitStack(&mystack); for(i=0;i<n;i++) { if(exp[i]=='(') Push(&mystack, exp[i]); else if((exp[i]==')') && notempty(mystack) && GetTop(mystack,&c) && c=='(') Pop(&mystack,&c); else if((exp[i]==')') && !notempty(mystack)) { cout<<"右括号多余左括号!"<<endl; return ; } } if(notempty(mystack)) cout<<"左括号多余右括号!"<<endl; else cout<<"左右括号匹配正确!"<<endl; } static float ans[50]; static int count=0; static int right=0; static float yourresult[50]; int postexp(char exp[]) { seqstack mystack; datatype x1,x2; int i; int j=0,ls; int top=0; int isFalse=0; int isRead=0; char oprator = ' '; InitStack(&mystack); for(i=0;exp[i]!='#';i++) { if(isdigit(exp[i])) { top=(int)(exp[i]-48); top*=10; } else { if (isRead == 0) { isRead++; top/=10; Push(&mystack,top); oprator = exp[i]; top=0; } else if (isRead == 1) { Push(&mystack,top); if (isRead == 1) { isRead++; Pop(&mystack,&x2); } stackpop(&mystack,&x1); ls=x1;x1=x2;x2=ls; x1/=10; switch(oprator) { case '+': {x1+=x2;break;} case '-': {x1-=x2;break;} case '*': {x1*=x2;break;} case '/': { if(x2==0.0) { cout<<"除数为0错!"<<endl; isFalse=1; } else { x1/=x2; } };break; } oprator = exp[i]; x2=x1; top=0; } } } if (isRead == 0) { isRead++; top/=10; Push(&mystack,top); oprator = exp[i]; top=0; } else if (isRead == 1) { Push(&mystack,top); if (isRead == 1) { isRead++; Pop(&mystack,&x2); } Pop(&mystack,&x1); ls=x1;x1=x2;x2=ls; x1/=10; switch(oprator) { case '+': {x1+=x2;break;} case '-': {x1-=x2;break;} case '*': {x1*=x2;break;} case '/': { if(x2==0.0) { cout<<"除数为0错!"<<; isFalse=1; } else { x1/=x2; } };break; } oprator = exp[i]; x2=x1; top=0; } if (isFalse == 1) return -1; ans[count] = x1; cout<<"请输入您计算的结果:"<<endl; cin>>"%f">>&yourresult[count]; if(ans[count]==yourresult[count]) right++; count++; } int main() { int i=0; char exp[100]; cout<<" ------计算表达式------\n使用说明:"<<endl; cout<<" 1.请输入要计算的表达式,以#结尾,例如1+2#"<<endl; cout<<" 2.结束计算请输入符号$"<<endl; cout<<" 3.在表达式中可以运算括号,中括号[]和大括号{}统一使用小括号代替()!"<<endl; cout<<" 4.程序输入格式错误时,将会自动结束程序,请注意格式正确!"<<endl; cout<<"请输入要计算的表达式,以#结尾。结束程序输入$。"<<endl; cin>>"%s">>exp[i]; while(exp[i]!='$') { expiscorrect(&exp[i],i); postexp(&exp[i]); cout<<"-------------------------------------------\n"<<endl; cout<<"请输入下一个表达式,以#结尾。结束程序输入$。\n"<<endl; cin>>"%s">>exp[i]; } cout<<"\n\n ******您的成绩单*******\n"<<endl; cout<<"----------------------------------------\n"<<endl; cout<<" 序 号 正确答案 您的答案 结 论\n"<<endl; for(i=0;i<count;i++) { cout<<"表达式%d %.2f %.2f %s\n"<< i+1<<ans[i],yourresult[i],ans[i]==yourresult[i]?"正确!":"错误!"); } cout<<"----------------------------------------\n"<<endl; cout<<"解答题目总共为%d道,其中\n"<<count<<endl; cout<<"正确解答%d道题,错误解答%d道题。\n *****最后得分为%d分!*****\n"<< right<<count-right<<right*100/count<<endl; cout<<"----------------------------------------\n"<<endl; return 0; } |
要求:建立试题库文件,随机产生n个题目;题目涉及加减乘除,带括弧的混合运算;随时可以退出;保留历史分数,能回顾历史,给出与历史分数比较后的评价