个人作业七:四则运算三

四则运算3

一、设计思路:

题目:可以答题并判断对错,最后显示做对几道题。

在原有的基础上,又拓展了答题模块。

在结构体中添加了answer属性,把输入的答案与正确答案比较,若相等则计数加一。

二、源代码

(1)

// 四则运算3.cpp : Defines the entry point for the console application.

// 袁佩佩 信1201-1班 20122785 2015/3/18

 

#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<<"("<<i<<")";

              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<<endl<<"该难度的题目已出完,请更改出题设置!"<<endl;

                     break;

              }

              switch(Q.sign)

              {

                     case 0:

                            if(ExistQues(C,Q))

                            {

                                   count++;

                                   goto RB;

                            }

                            cout<<Q.num1<<"+"<<Q.num2<<"="<<setw(5);

                            break;

                     case 1:

                            if((para[7]==0)&&(Q.num1<Q.num2))

                            {                                                                    //若为负数,则交换

                                          temp=Q.num1;

                                          Q.num1=Q.num2;

                                          Q.num2=temp;

                            }

                            if(ExistQues(C,Q))

                            {

                                   count++;

                                   goto RB;

                            }

                            cout<<Q.num1<<"-"<<Q.num2<<"="<<setw(5);break;

                     case 2:

                            if(ExistQues(C,Q))

                            {

                                   count++;

                                   goto RB;

                            }

                            cout<<Q.num1<<"*"<<Q.num2<<"="<<setw(5);break;

                     case 3:

                            while(Q.num2==0)

                                   Q.num2=rand()%(para[6]-para[5]+1)+para[5];

                            if(!para[8])

                            {

                                   while((Q.num1%Q.num2)!=0||Q.num2==0)

                                   {                                                                    //重新生成

                                          Q.num1=rand()%(para[6]-para[5]+1)+para[5];

                                          Q.num2=rand()%(para[6]-para[5]+1)+para[5];

                                   }

                            }

                            if(ExistQues(C,Q))

                            {

                                   count++;

                                   goto RB;

                            }

                            cout<<Q.num1<<"/"<<Q.num2<<"="<<setw(5);break;

              }

              InsertQues(C,Q);

              if(i%para[2]==0)                                                         //一行打印完规定列数,换行

                     for(int j=0;j<=para[3];j++)

                            cout<<endl;

       }

       cout<<endl<<endl;

}

//*****回答题目函数******

void Display2(LinkC C,Caculation &Q)

{

       int temp,count=0,answer=0,right=0;                                 //count记录重新生成题目的次数

       for(int i=1;i<=para[1];i++)

       {

              cout<<"("<<i<<")";

              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<<endl<<"该难度的题目已出完,请更改出题设置!"<<endl;

                     break;

              }

              switch(Q.sign)

              {

                     case 0:

                            if(ExistQues(C,Q))

                            {

                                   count++;

                                   goto RB;

                            }

                            cout<<Q.num1<<"+"<<Q.num2<<"=";

                            cin>>answer;

                            if(RightOrWrong(Q,answer))

                            {

                                   cout<<"\t√";

                                   right++;

                            }

                            else

                                   cout<<"\t×";

                            break;

                     case 1:

                            if((para[7]==0)&&(Q.num1<Q.num2))

                            {                                                                    //若为负数,则交换

                                          temp=Q.num1;

                                          Q.num1=Q.num2;

                                          Q.num2=temp;

                            }

                            if(ExistQues(C,Q))

                            {

                                   count++;

                                   goto RB;

                            }

                            cout<<Q.num1<<"-"<<Q.num2<<"=";

                            cin>>answer;

                            if(RightOrWrong(Q,answer))

                            {

                                   cout<<"\t√";

                                   right++;

                            }

                            else

                                   cout<<"\t×";

                            break;

                     case 2:

                            if(ExistQues(C,Q))

                            {

                                   count++;

                                   goto RB;

                            }

                            cout<<Q.num1<<"*"<<Q.num2<<"=";

                            cin>>answer;

                            if(RightOrWrong(Q,answer))

                            {

                                   cout<<"\t√";

                                   right++;

                            }

                                   cout<<"\t×";

                            break;

                     case 3:

                            while(Q.num2==0)

                                   Q.num2=rand()%(para[6]-para[5]+1)+para[5];

                            if(!para[8])

                            {

                                   while((Q.num1%Q.num2)!=0||Q.num2==0)

                                   {                                                                    //重新生成

                                          Q.num1=rand()%(para[6]-para[5]+1)+para[5];

                                          Q.num2=rand()%(para[6]-para[5]+1)+para[5];

                                   }

                            }

                            if(ExistQues(C,Q))

                            {

                                   count++;

                                   goto RB;

                            }

                            cout<<Q.num1<<"/"<<Q.num2<<"=";

                            cin>>answer;

                            if(RightOrWrong(Q,answer))

                            {

                                   cout<<"\t√";

                                   right++;

                            }

                                   cout<<"\t×";

                            break;

              }

              InsertQues(C,Q);

              cout<<endl;

       }

       cout<<"共回答正确"<<right<<"道题。";

       cout<<endl<<endl;

}

 

//*****判断难度*****

void YesOrNo(int para)

{

       if(para)

              cout<<"是";

       else

              cout<<"否";

}

//*****查看设置*****

void ShowSetting()

{

       system("cls");

       cout<<"\t/*************四则运算出题系统*************/"<<endl;

       cout<<"\t题目数量:"<<para[1]<<"个\t\t打印列数:"<<para[2]<<"列"<<endl;

       cout<<"\t每行间隔:"<<para[3]<<"行\t\t是否有乘除法:";YesOrNo(para[4]);cout<<endl;

       cout<<"\t数值范围下限:"<<para[5]<<"\t\t数值范围上限:"<<para[6]<<endl;

       cout<<"\t是否有负数:";YesOrNo(para[7]);cout<<"\t\t是否有余数:";YesOrNo(para[8]);cout<<endl;

       cout<<"\t/******************************************/"<<endl;

}

//*****设置打印方式*****

void SetPrint()

{

       system("cls");

       char move1;

       cout<<"\t/*************设置打印方式*************/"<<endl;

       cout<<"\t          0.设置打印列数("<<para[2]<<"列)"<<endl;

       cout<<"\t          1.设置每行间隔("<<para[3]<<"行)"<<endl;

       cout<<"\t              2.返回主菜单"<<endl;

       cout<<"\t/**************************************/"<<endl;

       cout<<"请选择后续操作(0~2):";

       cin>>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<<"出错!请重新输入!"<<endl;

                            goto reset2;

                     }

                     break;

              case '1':

reset3:           cout<<"新的间隔行数:";

                     cin>>para[3];

                     if(para[3]<0)

                     {

                            cout<<"出错!请重新输入!"<<endl;

                            goto reset3;

                     }

                     break;

              case '2':break;

       }

}

//*****判断输入正确*****

void Reset(int i)

{

       do

       {

              cout<<"请重新设置(是1/否0):";

              cin>>para[i];                                           //此处输入字符出错,但没解决

       }while(para[i]!=0&&para[i]!=1);

}

//*****设置题目难度*****

void SetLevel()

{

       system("cls");

       char move2;

       cout<<"\t/*************设置题目难度*************/"<<endl;

       cout<<"\t            0.是否有乘除法(";YesOrNo(para[4]);cout<<")"<<endl;

       cout<<"\t            1.数值范围("<<para[5]<<"~"<<para[6]<<")"<<endl;

       cout<<"\t            2.是否有负数(";YesOrNo(para[7]);cout<<")"<<endl;

       cout<<"\t            3.是否有余数(";YesOrNo(para[8]);cout<<")"<<endl;

       cout<<"\t              4.返回主菜单"<<endl;

       cout<<"\t/**************************************/"<<endl;

       cout<<"请选择后续操作(0~4):";

       cin>>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<<"出错!请重新输入数值范围!"<<endl;

                            goto reset1;

                     }

                     break;

              case '2':Reset(7);break;

              case '3':Reset(8);break;

              case '4':break;

       }

}

//****主页面*****

void MainMenu(LinkC &C,Caculation &Q)

{

       char move,save;

       cout<<"\t/*************四则运算出题系统*************/"<<endl;

       cout<<"\t                 0.开始出题"<<endl;

       cout<<"\t               1.设置出题数量"<<endl;

       cout<<"\t               2.设置打印方式"<<endl;

       cout<<"\t               3.设置题目难度"<<endl;

       cout<<"\t               4.查看当前设置"<<endl;

       cout<<"\t                 5.开始答题"<<endl;

       cout<<"\t                 6.退出系统"<<endl;

       cout<<"\t/******************************************/"<<endl;

       cout<<"请选择后续操作(0~6):";

       cin>>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<<"出错!请重新输入!"<<endl;

                            goto reset4;

                     }

                     break;

              case '2':SetPrint();break;

              case '3':SetLevel();break;

              case '4':ShowSetting();break;

              case '5':Display2(C,Q);break;

              case '6':

                     cout<<"是否保存出题记录(是1/否0):";

                     cin>>save;

                     while(save!='1'&&save!='0')

                     {

                            cout<<"出错!请正确输入(是1/否0):";

                            cin>>save;

                     }

                     if(save=='1')

                            WriteQues(C);

                     cout<<"感谢您的使用,再见!"<<endl;

                     para[0]=0;break;

       }

}

 

int main(int argc, char* argv[])

{

       srand((unsigned)time(NULL));      //srand()函数产生一个以当前时间开始的随机种子

       LinkC Cacu;

       Caculation ques;

       InitList(Cacu);

       ReadQues(Cacu);

       while(para[0])

       {

              system("cls");

              MainMenu(Cacu,ques);

              system("pause");

       }

       return 0;

}

(2)

#include "iostream.h"

#include "fstream.h"

 

//0退出、1出题数量、2打印列数、3每行间隔、4乘除、5数值范围下限、6数值范围上限、7负数、8余数、9出过的题目数

int para[10]={1,30,3,0,0,0,5,0,0,0};      //默认参数

 

//*****四则算术题的数据结构*****

typedef struct

{

       int num1;

       int num2;

       int sign;

       int answer;

}Caculation;

typedef struct CNode                                   //结点

{

       Caculation ques;

       struct CNode * next;

}CNode,*LinkC;

//******题目初始化******

void InitList(LinkC &C)

{

       C=new CNode;

       C->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<para[9];i++)                      //读取出过的题目

       {

              temp=new CNode;

              infile>>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<<"文件存储失败!"<<endl;

              exit(0);

       }

       for(int i=0;i<10;i++)

              outfile<<para[i]<<" ";

       for(temp=C->next;temp;temp=temp->next)

       {

              outfile<<temp->ques.num1<<" ";

              outfile<<temp->ques.num2<<" ";

              outfile<<temp->ques.sign<<" ";

       }

}

三、运行结果

                       

 

 

 

四、遇到的困难

  之所以选这一项,是因为这星期考研课开始了,周六日没有那么多的时间。而我的程序可拓展性好,添加功能比较容易,我就直接在原来的程序上进行了修改。

posted on 2016-06-23 09:57  bigbigbang  阅读(123)  评论(0编辑  收藏  举报