设计思想:
1.根据功能分成两个部分,一个是单纯运算,一个是思则混合运算;
2.单纯运算,生成题目后判断正确与否
3.四则混合运算,申请两个数组,一个数组存放数字,一个存放符号
4,判断用栈的思想,判断优先级,然后先算乘除后算加减(待修正)
5.计数
程序源代码:
#include<iostream> using namespace std; #include<string> #include<ctime> #include<stdlib.h> #include<stdio.h> #include<ctype.h> #define STACK_INIT_SIZE 100 //存储空间初始分配量 #define STACKINCREMENT 10 //存储空间分配增量 #define OK 0 #define ERROR 127 //定义一个顺序栈 typedef struct { int*base; //在栈构造之前和销毁之后,base的值为NULL int*top; //栈顶指针 int stacksize; //当前已分配的存储空间,以元素为单位 }SqStack; int InitStack(SqStack*S) { //构造一个空栈 S->base=(int*)malloc(STACK_INIT_SIZE*sizeof(SqStack)); if(NULL==S->base) { //内存分配失败 return ERROR ; } S->top=S->base ; S->stacksize=STACK_INIT_SIZE ; return OK ; } char GetTop(SqStack*S,char*element) { //若栈不空,取栈顶元素,用element返回 if(S->base==S->top) { return ERROR ; } *element=*(S->top-1); return*element ; } int Push(SqStack*S,int element) { //插入元素element为新的栈顶元素 if((S->top-S->base)>S->stacksize) { //栈满,追加空间 S->base=(int*)realloc(S->base,(STACK_INIT_SIZE+STACKINCREMENT)*sizeof(SqStack)); if(NULL==S->base) { return ERROR ; } S->top=S->base+S->stacksize ; S->stacksize+=STACKINCREMENT ; } *S->top++=element ; return OK ; } int Pop(SqStack*S,int*element) { //若栈不为空,则删除栈顶元素,用element返回其值 if(S->top==S->base) { return ERROR ; } *element=*(--S->top); return OK ; } int PopOPTR(SqStack*S,char*element) { if(S->top==S->base) { return ERROR ; } *element=*(--S->top); return OK ; } //判断字符c是否在集合OP中 int InOP(char c,char OP[7]) { for(int i=0;i<7;i++) { if(c==OP[i]) { return OK ; } } return ERROR; } //判断运算符的优先级 int Compare(int a,int b) { if('+'==a) { switch(b) { case '+' : return '>'; case '-' : return '>' ; case '*' : return '<' ; case '/' : return '<' ; case '=' : return '>' ; } } if('-'==a) { switch(b) { case '+' : return '>' ; case '-' : return '>' ; case '*' : return '<' ; case '/' : return '<' ; case '=' : return '>' ; } } if('*'==a) { switch(b) { case '+' : return '>' ; case '-' : return '>' ; case '*' : return '>' ; case '/' : return '>' ; case '=' : return '>' ; } } if('/'==a) { switch(b) { case '+' : return '>' ; case '-' : return '>' ; case '*' : return '>' ; case '/' : return '>' ; case '=' : return '>' ; } } if('='==a) { switch(b) { case '+' : return '<' ; case '-' : return '<' ; case '*' : return '<' ; case '/' : return '<' ; case '=' : return '=' ; } } return ERROR ; } //简单计算 int Calculate(int left,char oper,int right) { int result=0 ; switch(oper) { case '+' : result=left+right ; break ; case '-' : result=left-right ; break ; case '*' : result=left*right ; break ; case '/' : result=left/right; break ; } return result ; } void main() { int choose,T=0,F=0; cout<<"请选择 1 四则运算 2 四则混合运算"; cin>>choose; if(choose == 1) { for(int i=0;i<30;i++) { int fuhao=rand()%4; int a=rand()%100; int b=rand()%99+1; int result,shang,yushu; if(fuhao==0) //加法运算 { cout<<a<<"+"<<b<<"="; cin>>result; if((a+b)==result) { cout<<"正确"<<endl; T++; } else { cout<<"错误"<<endl; F++; } } if(fuhao==1)//减法运算 { cout<<a<<"-"<<b<<"="; cin>>result; if((a-b)==result) { cout<<"正确"<<endl; T++; } else { cout<<"错误"<<endl; F++; } } if(fuhao==2)//乘法运算 { cout<<a<<"*"<<b<<"="; cin>>result; if((a*b)==result) { cout<<"正确"<<endl; T++; } else { cout<<"错误"<<endl; F++; } } if(fuhao==3)//除法运算 { cout<<a<<"÷"<<b<<"="; if(a%b==0) { cin>>result; if((a+b)==result) { cout<<"正确"<<endl; T++; } else { cout<<"错误"<<endl; F++; } } else { cout<<"请输入商和余数,中间空格隔开"; cin>>shang>>yushu; if((a/b)==shang&&(a%b)==yushu) { cout<<"正确"<<endl; T++; } else { cout<<"错误"<<endl; F++; } } } } cout<<"您做对"<<T<<"道题"<<endl; cout<<"您做错"<<F<<"道题"<<endl; } else if(choose == 2) { int length,chlen; int num[20]; char chs[20]; char ch[4]={'+','-','*','/'}; for(int i=0;i<30;i++) { int result; length = rand()%6+2; chlen = length - 1; for(int i=0;i<length;i++) { num[i]=rand()%99+1; } for(int i=0;i<chlen;i++) { chs[i]=ch[rand()%4]; } chs[chlen]='='; for(int i=0;i<chlen;i++) { chs[i]=ch[rand()%4]; } for(int i=0;i<length;i++) { cout<<num[i]<<chs[i]; } cout<<endl; /* SqStack OPTR,OPND ; int element=0 ; char OPTR_element ; int leftNum,rightNum ; InitStack(&OPTR); Push(&OPTR,'='); InitStack(&OPND); int t=0; while('='!=chs[t]||'='!=GetTop(&OPTR,&OPTR_element)) { Push(&OPND,num[t]); GetTop(&OPTR,&OPTR_element); switch(Compare(OPTR_element,chs[t])) { case '<' : //栈顶元素优先级低 Push(&OPTR,chs[t]); //运算符进OPTR栈 t++; break ; case '=' : t++ break ; case '>' : //退栈,并将运算结果入栈 PopOPTR(&OPTR,&OPTR_element); Pop(&OPND,&num[t-1]); Pop(&OPND,&num[t]); Push(&OPND,Calculate(num[t],OPTR_element,num[t+1])); break ; }//switch }//if cin>>result; if(value == result) { cout<<"正确"<<endl; T++; } else { cout<<"错误"<<endl; F++; } cout<<"您做对"<<T<<"道题"<<endl; cout<<"您做错"<<F<<"道题"<<endl; */ } } }
运行结果截图:
编程总结分析:
单纯加减乘除部分完成较好,四则混合运算部分,没有完成结果校验的功能,查询了许多资料,还是没有理解怎么利用栈来保存结果,多数据结构还要认真复习。
周活动总结表
姓名:hy 日期:2016.3.26
日期/任务 | 听课 | 编写程序 | 阅读课本 | 日总计 |
星期日 | ||||
星期一 | 120 | 50 | ||
星期二 | ||||
星期三 | ||||
星期四 | ||||
星期五 | 120 | |||
星期六 | 150 | |||
周总计 | 120 | 320 | 440 |
时间记录日志
姓名:hy 日期:2016.3.26
日期 | 开始时间 | 结束时间 | 中断时间 | 静时间 | 活动 | 备注 | C | U |
3.21 | 8:00 | 9:50 | 8:50-9:00 | 100 | 上课 | |||
15:00 | 16:40 | 100 | 设计思想+编程 | |||||
3.25 | 20:00 | 23:20 | 380 | 编程 | ||||
3.26 | 10:00 | 18:00 | 11:00-13:00 | 720 | 编程 |
缺陷记录日志
学生:hy 日期:2016.3.26
教员:王建民 程序号:03
日期 | 编号 | 类型 | 引入阶段 | 排除阶段 | 修复时间 | 修复缺陷 |
3.25 | 01 | 20 | 编译 | 编译 | 1 | |
描述:符号不比配 | ||||||
02 | 20 | 编译 | 编译 | 5 | ||
描述:除法需分情况讨论,否则出现错误 | ||||||
3.26 | 03 | 20 | 编译 | 编译 | 待修复 | |
描述:加上判断结果后,题目变少,程序不运行 | ||||||
04 | 20 | 编译 | 编译 | 待修复 | ||
描述:栈清空时出现错误 |