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

           }

    }

    三、运行结果

                           

    四、遇到的困难

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

  • 相关阅读:
    AWK
    正则表达式
    BASH
    C# 常用控件的一些属性及方法
    C# FTP
    C# Delegate
    DLL/EXE查看工具Dumpbin
    VBA 破解Excel工作表保护密码
    VB6 IP地址+网卡地址+网卡类型
    编程之路┊由C#风潮想起的——给初学编程者的忠告 ZT
  • 原文地址:https://www.cnblogs.com/lrhan/p/5609594.html
Copyright © 2011-2022 走看看