zoukankan      html  css  js  c++  java
  • 个人作业七:四则运算三

    四则运算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<<" √";

                                       right++;

                                }

                                else

                                       cout<<" ×";

                                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<<" √";

                                       right++;

                                }

                                else

                                       cout<<" ×";

                                break;

                         case 2:

                                if(ExistQues(C,Q))

                                {

                                       count++;

                                       goto RB;

                                }

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

                                cin>>answer;

                                if(RightOrWrong(Q,answer))

                                {

                                       cout<<" √";

                                       right++;

                                }

                                       cout<<" ×";

                                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<<" √";

                                       right++;

                                }

                                       cout<<" ×";

                                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<<" /*************四则运算出题系统*************/"<<endl;

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

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

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

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

           cout<<" /******************************************/"<<endl;

    }

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

    void SetPrint()

    {

           system("cls");

           char move1;

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

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

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

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

           cout<<" /**************************************/"<<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<<" /*************设置题目难度*************/"<<endl;

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

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

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

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

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

           cout<<" /**************************************/"<<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<<" /*************四则运算出题系统*************/"<<endl;

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

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

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

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

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

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

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

           cout<<" /******************************************/"<<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<<" ";

           }

    }

    三、运行结果

                           

    四、遇到的困难

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

  • 相关阅读:
    .NET Interop 工具集
    关于正弦波的算法
    Windows Phone 系列 本地数据存储
    Xaml cannot create an instance of “X”
    Windows Phone 系列 使用 MVVM绑定时无法获取当前值
    Windows Phone 系列 应用程序图标无法显示
    Windows Phone 系列 WPConnect无法上网的问题
    Windows Phone 系列 使用 Windows Phone 保存铃声任务
    WP7.5提交应用
    Windows Phone 系列 动态删除ObservableCollection
  • 原文地址:https://www.cnblogs.com/lrhan/p/5609594.html
Copyright © 2011-2022 走看看