四则运算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<<"请选择输出格式:\n1.一行输出一个 \n2.一行输出两个 \n3.一行输出三个 \n4.一行输出四个 \n5.一行输出五个"<<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<<"=\t";
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<<"=\t";
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

编写程序

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

事后总结:

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

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

posted @ 2016-03-18 13:24  TmT  阅读(230)  评论(0编辑  收藏  举报