设计思想:
.在结构方面,将题目拆分开来,一共有四个部分,首先是只有加减法,其次是既有加减法也有乘除法,再其次是加减乘除都有,还有括号,最后是加减乘除没有括号。
程序代码:
#include "stdafx.h"#include "iostream.h"#include "stdlib.h"#include "time.h"#include "Caculation.h"#include "iomanip.h"//*****判断回答是否正确*****bool RightOrWrong(Caculation &Q,int answer){ if(Q.sign==0) { Q.answer=Q.num1+Q.num2; } else if(Q.sign==1) { Q.answer=Q.num1-Q.num2; } else if(Q.sign==2) { Q.answer=Q.num1*Q.num2; } else Q.answer=Q.num1/Q.num2; if(answer==Q.answer) return true; else return false;}//******重新生成算术题******void ReBuild(Caculation &Q){ if(para[4]==1) Q.sign=rand()%4; else Q.sign=rand()%2; Q.num1=rand()%(para[6]-para[5]+1)+para[5]; Q.num2=rand()%(para[6]-para[5]+1)+para[5];}//*****输出函数*****void Display1(LinkC C,Caculation &Q){ int temp,count=0; //count记录重新生成题目的次数 for(int i=1;i<=para[1];i++) { cout<<"("<<<")"; if(para[4]==1) Q.sign=rand()%4; //有乘除法 else Q.sign=rand()%2; //没有乘除法 Q.num1=rand()%(para[6]-para[5]+1)+para[5]; //随机的(下限~上限)以内的整数 Q.num2=rand()%(para[6]-para[5]+1)+para[5];RB: ReBuild(Q); //检查是否有出过的题目 if(count>((para[6]-para[5]+1)*(para[6]-para[5]+1)*100)) { cout<<<"该难度的题目已出完,请更改出题设置!"< ((para[6]-para[5]+1)*(para[6]-para[5]+1)*100)) { cout< <<"该难度的题目已出完,请更改出题设置!"< >answer; if(RightOrWrong(Q,answer)) { cout<<" \t√"; right++; else cout<<"\t×"; 1: if((para[7]="=0)&&(Q.num1 >answer; if(RightOrWrong(Q,answer)) { cout<<" 2: cout< >answer; if(RightOrWrong(Q,answer)) { cout<<" 3: while(q.num2="=0)" if(!para[8]) while((q.num1%q.num2)!="0||Q.num2==0)" 重新生成 cout< >answer; if(RightOrWrong(Q,answer)) { cout<<" insertques(c,q); cout< >move1; while(move1<'0'||move1>'2') { cout<<"错误!请正确输入操作序号(0~2):"; cin>>move1; } switch(move1) { case '0':reset2: cout<<"新的打印列数(建议7列以内):"; cin>>para[2]; if(para[2]<0) { cout<<"出错!请重新输入!"< >para[3]; if(para[3]<0) { cout<<"出错!请重新输入!"< >para[i]; //此处输入字符出错,但没解决 }while(para[i]!=0&¶[i]!=1);}//*****设置题目难度*****void SetLevel(){ system("cls"); char move2; cout<<"\t/*************设置题目难度*************/"< >move2; while(move2<'0'||move2>'4') { cout<<"错误!请正确输入操作序号(0~4):"; cin>>move2; } switch(move2) { case '0':Reset(4);break; case '1': //此处若输入字符,则出错reset1: cout<<"新的数值下限:"; //但没找到解决方法 cin>>para[5]; cout<<"新的数值上限:"; cin>>para[6]; if(para[5]>=para[6]) { cout<<"出错!请重新输入数值范围!"< >move; while(move<'0'||move>'6') { cout<<"错误!请正确输入操作序号(0~6):"; cin>>move; } switch(move) { case '0':Display1(C,Q);break; case '1':reset4: cout<<"请设置出题数量(建议100道以内):"; cin>>para[1]; if(para[1]<=0) { cout<<"出错!请重新输入!"< >save; while(save!='1'&&save!='0') { cout<<"出错!请正确输入(是1/否0):"; cin>>save; } if(save=='1') WriteQues(C); cout<<"感谢您的使用,再见!"< next=NULL;}//******添加题目信息******void InsertQues(LinkC &C,Caculation Q){ //尾插入 LinkC tail,temp; tail=C; while(tail&&tail->next!=NULL) tail=tail->next; temp=new CNode; temp->ques=Q; temp->next=NULL; tail->next=temp; tail=temp; para[9]++;}//******判断题目存在******int ExistQues(LinkC C,Caculation Q){ LinkC temp; temp=C->next; while(temp) { if((temp->ques.num1==Q.num1)&&(temp->ques.num2==Q.num2)&&(temp->ques.sign==Q.sign)) return 1; //当两个数字和算符与链表中的一样,则存在 else temp=temp->next; } return 0;}//******读取出过的问题******void ReadQues(LinkC &C){ LinkC temp; ifstream infile("question.txt"); for(int i=0;i<10;i++) //读取参数表 infile>>para[i]; for(i=0;i >temp->ques.num1; infile>>temp->ques.num2; infile>>temp->ques.sign; temp->next=NULL; }}//******写入文件******void WriteQues(LinkC C){ LinkC temp; ofstream outfile("question.txt"); if(!outfile) { cout<<"文件存储失败!"< next;temp;temp=temp->next) { outfile< ques.num1<<" "; outfile< ques.num2<<" "; outfile< ques.sign<<" "; }二、截图#include "stdafx.h"#include "iostream.h"#include "stdlib.h"#include "time.h"#include "Caculation.h"#include "iomanip.h"//*****判断回答是否正确*****bool RightOrWrong(Caculation &Q,int answer){ if(Q.sign==0) { Q.answer=Q.num1+Q.num2; } else if(Q.sign==1) { Q.answer=Q.num1-Q.num2; } else if(Q.sign==2) { Q.answer=Q.num1*Q.num2; } else Q.answer=Q.num1/Q.num2; if(answer==Q.answer) return true; else return false;}//******重新生成算术题******void ReBuild(Caculation &Q){ if(para[4]==1) Q.sign=rand()%4; else Q.sign=rand()%2; Q.num1=rand()%(para[6]-para[5]+1)+para[5]; Q.num2=rand()%(para[6]-para[5]+1)+para[5];}//*****输出函数*****void Display1(LinkC C,Caculation &Q){ int temp,count=0; //count记录重新生成题目的次数 for(int i=1;i<=para[1];i++) { cout<<"("< <<")"; if(para[4]==1) Q.sign=rand()%4; //有乘除法 else Q.sign=rand()%2; //没有乘除法 Q.num1=rand()%(para[6]-para[5]+1)+para[5]; //随机的(下限~上限)以内的整数 Q.num2=rand()%(para[6]-para[5]+1)+para[5];RB: ReBuild(Q); //检查是否有出过的题目 if(count>((para[6]-para[5]+1)*(para[6]-para[5]+1)*100)) { cout< <<"该难度的题目已出完,请更改出题设置!"< ((para[6]-para[5]+1)*(para[6]-para[5]+1)*100)) { cout< <<"该难度的题目已出完,请更改出题设置!"< >answer; if(RightOrWrong(Q,answer)) { cout<<" \t√"; right++; else cout<<"\t×"; 1: if((para[7]="=0)&&(Q.num1 >answer; if(RightOrWrong(Q,answer)) { cout<<" 2: cout< >answer; if(RightOrWrong(Q,answer)) { cout<<" 3: while(q.num2="=0)" if(!para[8]) while((q.num1%q.num2)!="0||Q.num2==0)" 重新生成 cout< >answer; if(RightOrWrong(Q,answer)) { cout<<" insertques(c,q); cout< >move1; while(move1<'0'||move1>'2') { cout<<"错误!请正确输入操作序号(0~2):"; cin>>move1; } switch(move1) { case '0':reset2: cout<<"新的打印列数(建议7列以内):"; cin>>para[2]; if(para[2]<0) { cout<<"出错!请重新输入!"< >para[3]; if(para[3]<0) { cout<<"出错!请重新输入!"< >para[i]; //此处输入字符出错,但没解决 }while(para[i]!=0&¶[i]!=1);}//*****设置题目难度*****void SetLevel(){ system("cls"); char move2; cout<<"\t/*************设置题目难度*************/"< >move2; while(move2<'0'||move2>'4') { cout<<"错误!请正确输入操作序号(0~4):"; cin>>move2; } switch(move2) { case '0':Reset(4);break; case '1': //此处若输入字符,则出错reset1: cout<<"新的数值下限:"; //但没找到解决方法 cin>>para[5]; cout<<"新的数值上限:"; cin>>para[6]; if(para[5]>=para[6]) { cout<<"出错!请重新输入数值范围!"< >move; while(move<'0'||move>'6') { cout<<"错误!请正确输入操作序号(0~6):"; cin>>move; } switch(move) { case '0':Display1(C,Q);break; case '1':reset4: cout<<"请设置出题数量(建议100道以内):"; cin>>para[1]; if(para[1]<=0) { cout<<"出错!请重新输入!"< >save; while(save!='1'&&save!='0') { cout<<"出错!请正确输入(是1/否0):"; cin>>save; } if(save=='1') WriteQues(C); cout<<"感谢您的使用,再见!"< next=NULL;}//******添加题目信息******void InsertQues(LinkC &C,Caculation Q){ //尾插入 LinkC tail,temp; tail=C; while(tail&&tail->next!=NULL) tail=tail->next; temp=new CNode; temp->ques=Q; temp->next=NULL; tail->next=temp; tail=temp; para[9]++;}//******判断题目存在******int ExistQues(LinkC C,Caculation Q){ LinkC temp; temp=C->next; while(temp) { if((temp->ques.num1==Q.num1)&&(temp->ques.num2==Q.num2)&&(temp->ques.sign==Q.sign)) return 1; //当两个数字和算符与链表中的一样,则存在 else temp=temp->next; } return 0;}//******读取出过的问题******void ReadQues(LinkC &C){ LinkC temp; ifstream infile("question.txt"); for(int i=0;i<10;i++) //读取参数表 infile>>para[i]; for(i=0;i >temp->ques.num1; infile>>temp->ques.num2; infile>>temp->ques.sign; temp->next=NULL; }}//******写入文件******void WriteQues(LinkC C){ LinkC temp; ofstream outfile("question.txt"); if(!outfile) { cout<<"文件存储失败!"< next;temp;temp=temp->next) { outfile< ques.num1<<" "; outfile< ques.num2<<" "; outfile< ques.sign<<" "; }