• 四则运算2


    题目:

    可怜的二柱子同学,老师又对他的自动出题系统提出了新的要求:

    1、题目避免重复;

    2、可定制(数量/打印方式);

    3、可以控制下列参数:

      是否有乘除法;

      是否有括号(最多可以支持十个数参与计算);

      数值范围;

      加减有无负数;

      除法有无余数!

    设计思路:

    设计几个参数,再利用 if 判断语句来,用于实现条件三中的种种要求。用结构体来存放有括号的运算,再用数组来存放运算符。(简单写)

    设计代码:

      1 //chenchang 2016.3.16
      2 //sizeyunsuan gai 
      3 #include<iostream>
      4 using namespace std;
      5 int suiJiShu(int fan_wei)//生成随机数函数
      6 {
      7     int shu=rand()%fan_wei;
      8     return shu;
      9 }
     10 char yunSuanFu1()//有乘除
     11 {
     12     int sui=rand()%4;
     13     if(sui==0) return '+';
     14     else if(sui==1) return '-';
     15     else if(sui==2) return '*';
     16     else return '/';
     17 }
     18 char yunSuanFu2()//只有加减
     19 {
     20     int sui=rand()%2;
     21     if(sui==0)    return'+';
     22     else return '-';
     23 }
     24 
     25 struct kuo_hao_yun_suan//此结构体用于支持最多十个数参与运算
     26 {
     27     int zhi;
     28     int pan_duan_kuo_hao;//判断是否有括号,括号是左括号还是右括号
     29     //0表示没有,1表示左括号,2表示右括号
     30 }shu[10];
     31 void main()
     32 {
     33     int ti_mu_shu_liang=10;
     34     cout<<"请输入题目的数量:"<<endl;
     35     cin>>ti_mu_shu_liang;
     36     ///////////////////////
     37     int shu_zhi_fan_wei=100;
     38     cout<<"请输入数值范围:"<<endl;
     39     cin>>shu_zhi_fan_wei;
     40     //////////////////
     41     int yun_suan_fa_ze=2;
     42     cout<<"请确定是否需要乘除运算符,要:1,否:2"<<endl;
     43     cin>>yun_suan_fa_ze;
     44     ////////////////
     45     int kuo_hao_yes;
     46     cout<<"请确定是否需要括号,要:1,否:2"<<endl;
     47     cin>>kuo_hao_yes;
     48     /////////////////////
     49     int you_yu_shu=2;
     50     if(kuo_hao_yes==2)
     51     {
     52         if(yun_suan_fa_ze==1)
     53         {
     54             cout<<"除法运算是否能有余数,是:1,否:2"<<endl;
     55             cin>>you_yu_shu;
     56         }
     57     }
     58     ///////////////////
     59     int fu_shu=2;
     60     if(kuo_hao_yes==2)
     61     {
     62         cout<<"减法结果是否能出现负数,是:1,否:2"<<endl;
     63         cin>>fu_shu;
     64     }
     65     ////////
     66     int shu_chu_ge_shi=1;
     67     if(kuo_hao_yes==2)
     68     {
     69         cout<<"请选择输出格式:
    1.一行输出一个 
    2.一行输出两个 
    3.一行输出三个 
    4.一行输出四个 
    5.一行输出五个"<<endl;
     70         cin>>shu_chu_ge_shi;
     71     }
     72     else 
     73         cout<<"输出格式:一行输出一个 "<<endl;
     74     ///////////////////////////////////
     75     for(int g=1;g<=ti_mu_shu_liang;g++)
     76     {
     77         if(kuo_hao_yes==1)//此部分写出的带括号
     78         {
     79             int chang_ji_shu=1;
     80             int can_shu_ge_shu=rand()%9+2;
     81             for(int i=0;i<can_shu_ge_shu;i++)//解决运算数
     82             {
     83                 shu[i].zhi=suiJiShu(shu_zhi_fan_wei);
     84                 shu[i].pan_duan_kuo_hao=0;
     85             }
     86             char fu_hao[10];
     87             if(yun_suan_fa_ze==1)//有乘除
     88             {
     89                 for(int i=0;i<can_shu_ge_shu-1;i++)//解决运算符
     90                 {
     91                     fu_hao[i]=yunSuanFu1();
     92                     if(i>0)//从第二个运算符开始,判断当该运算符为‘*’或‘/‘时,是否前一个运算符为’+‘或’-‘,如果是,
     93                         //在随机判断是否将前面用括号括起来
     94                     {
     95                         if((fu_hao[i]=='*'||fu_hao[i]=='/')&&(fu_hao[i-1]=='+'||fu_hao[i-1]=='-'))
     96                         {
     97                             int kuo=rand()%2;//随机判断是否需要添加括号,0表示不需要,1表示需要
     98                             if(kuo==1)
     99                             {
    100                                 shu[i-1].pan_duan_kuo_hao=1;
    101                                 shu[i].pan_duan_kuo_hao=2;
    102                             }
    103                         }
    104                     }
    105                 }
    106             }
    107             else //此部分没有使用乘除法则
    108             {
    109                 for(int i=0;i<can_shu_ge_shu-1;i++)
    110                 {
    111                     fu_hao[i]=yunSuanFu2();
    112                     if(i>0)
    113                     {
    114                         if(fu_hao[i-1]=='-'&&fu_hao[i]=='+')
    115                         {
    116                             int kuo=rand()%2;//随机判断是否需要添加括号,0表示不需要,1表示需要
    117                             if(kuo==1)
    118                             {
    119                                 shu[i].pan_duan_kuo_hao=1;
    120                                 shu[i+1].pan_duan_kuo_hao=2;
    121                             }
    122                         }
    123                     }
    124                 }
    125             }
    126             for(int i=0;i<can_shu_ge_shu;i++)
    127             {
    128                 if(shu[i].pan_duan_kuo_hao==1)
    129                     cout<<"(";
    130                 cout<<shu[i].zhi;
    131                 if(shu[i].pan_duan_kuo_hao==2)
    132                     cout<<")";
    133                 if(i!=can_shu_ge_shu-1)
    134                     cout<<fu_hao[i];
    135             }
    136             cout<<"=	";
    137         }
    138         ///////////////////////////////////////////////
    139         else //此部分没有括号
    140         {
    141             int shu1=suiJiShu(shu_zhi_fan_wei);
    142             int shu2=suiJiShu(shu_zhi_fan_wei);
    143             char yun_suan_fu;
    144             if(yun_suan_fa_ze==1)//出现乘除法
    145             {
    146                 yun_suan_fu=yunSuanFu1();
    147                 if(yun_suan_fu=='-'&&fu_shu==2)//如果是减法且不能有负数
    148                     while(shu1<shu2)//如果是减数大于被减数
    149                         shu1=suiJiShu(shu_zhi_fan_wei);//被减数重新随机选取
    150                 else if(yun_suan_fu=='/'&&you_yu_shu==2)//如果是除法且不能有余数
    151                 {
    152                     while(shu2==0)//除数不能为0
    153                         shu1=suiJiShu(shu_zhi_fan_wei);
    154                     while(shu1<shu2)//当除数大于被除数时
    155                         shu1=suiJiShu(shu_zhi_fan_wei);
    156                     while(shu1%shu2!=0)
    157                         shu2++;
    158                 }
    159             }
    160             else//不出现乘除
    161             {
    162                 yun_suan_fu=yunSuanFu2();
    163                 if(yun_suan_fu=='-'&&fu_shu==2)//如果是减法且不能有负数
    164                     while(shu1<shu2)//如果是减数大于被减数
    165                         shu1=suiJiShu(shu_zhi_fan_wei);//被减数重新随机选取
    166             }
    167             cout<<shu1<<yun_suan_fu<<shu2<<"=	";
    168         }
    169         if(g%shu_chu_ge_shi==0)
    170             cout<<endl;
    171     }
    172 }

    缺陷(举一个):

    代码中没有注意到运算符数组长度应该比参数短1

    错误截图:

    改正后:

    【项目计划总结表】

    项目计划总结表(2016/3/19)

      任 务

    (日 期)

    听课 编写程序 阅读课本 准备考试 日总计
    周日          
    周一 100min 120min     220min
    周二     90min   90min
    周三   60min     60min
    周四     30min   30min
    周五          
    周六   240min     240min
    周总计 100min 420min 120min   640min

    时间记录日志:

    日期

    开始

    结束

    中断时间

    净时

    事件

    备注

    C

    U

    2016.3.16

    15.56

    17.11

    4

    75

    编写程序

    找人商量

    2016.3.17

    18.50

    20.20

    90

    编写程序

     

    事后总结:

    这次编程的难点是括号哪里,因为参数个数不确定,括号的个数也不能确定,且括号都是成对出现的,而且要使括号有意义,所以我选择将括号这部分分成两大类,一类有乘除,一类没有乘除。有乘除,根据乘除运算符其前一个运算符是否是加减运算符,如果是,此时在随机判断是否添加括号,因为这时的括号是有意义的。没有乘除,根据减法运算符后一个运算符是否是加法运算符来判断,如果是,在随机判断是否加括号。

    弊端:在乘除运算中,如果连续出现加减运算符,此时加上括号是有意义的,而我写的程序默认是不加括号;在加减运算中,如果出现连续的减法,此时在中间加上括号是有意义的,而我的程序默认是不加括号。

  • 相关阅读:
    实现 HTML页面 Table 标签分页打印
    windows定时休眠设置
    python画树
    anaconda历史版本
    枚举
    is 与 as 运算符举例
    Microsoft.ACE.OLEDB.12.0报错解决方法
    winform一个带自动完成功能的TextBox
    DWZ中整合第三方jQuery(kit日历控件)插件
    asp.net 使用NPOI,泛型反射,XML导入导出excel
  • 原文地址:https://www.cnblogs.com/cchjl/p/5291680.html
Copyright © 2020-2023  润新知