四则运算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
错误截图:
改正后:
【项目计划总结表】
任 务 (日 期) |
听课 | 编写程序 | 阅读课本 | 准备考试 | 日总计 |
周日 | |||||
周一 | 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 |
编写程序 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
事后总结:
这次编程的难点是括号哪里,因为参数个数不确定,括号的个数也不能确定,且括号都是成对出现的,而且要使括号有意义,所以我选择将括号这部分分成两大类,一类有乘除,一类没有乘除。有乘除,根据乘除运算符其前一个运算符是否是加减运算符,如果是,此时在随机判断是否添加括号,因为这时的括号是有意义的。没有乘除,根据减法运算符后一个运算符是否是加法运算符来判断,如果是,在随机判断是否加括号。
弊端:在乘除运算中,如果连续出现加减运算符,此时加上括号是有意义的,而我写的程序默认是不加括号;在加减运算中,如果出现连续的减法,此时在中间加上括号是有意义的,而我的程序默认是不加括号。