软件工程个人作业2
题目:
可怜的二柱子同学,老师又对他的自动出题系统提出了新的要求: 1、题目避免重复;2、可定制(数量/打印方式);3、可以控制下列参数: 是否有乘除法; 是否有括号(最多可以支持十个数参与计算); 数值范围; 加减有无负数; 除法有无余数!
需求分析:二年级100以内加减乘除,无负数,无余数,无括号
三年级,无负数,无余数
四年级,无负数
五年级,无负数
六年级,有负数
设计思路
1、输入:输入选择;
2、选择内容:选择出2位数的题还是多位数的题还是退出程序
选择1是否有乘除法(运算符0-1或0-3);
选择5加减有无负数;
选择6除法有无余数;
选择7是选择数量或打印方式。
3是数值范围的前域
4是数值范围的后域
3、加工:2位数的题设置循环,令其长度为一个足够大的数,满足程序一次运行可多次使用
是否有乘除法:在前面做出选择后,在下面只需设置运算符随机出数的范围在0-1之间还是0-3之间
数值范围:即四则运算随机出数的范围在前域~后域
加减有无负数:对随机生成的数字进行运算,如果进行加/减运算之后,有负数,则根据选择进行保留或舍弃
控制题目不能重复:将之前的题目存放在数组中,然后依次进行比较
打印方式:根据用户输入要求一行输出几列后,利用取余的方法判断是否要换行输出
多位数的题:
设置循环,令其长度为一个足够大的数,满足程序一次运行可多次使用
是否有乘除法:在前面做出选择后,在下面只需设置运算符随机出数的范围在0-1之间还是0-3之间
数值范围:即四则运算随机出数的范围在前域~后域
加减有无负数:对随机生成的数字进行运算,如果进行加/减运算之后,有负数,则根据选择进行保留或舍弃
有无括号:用随机数来进行选择在原来式子之前还是之后进行添加
控制题目不能重复:将之前的题目存放在数组中,然后依次进行比较
打印方式:根据用户输入要求一行输出几列后,利用取余的方法判断是否要换行输出
4、输出:运算式
程序源码:
1 import javax.swing.JOptionPane; 2 import java.util.Random; 3 public class Arithmetic { 4 5 public static void main(String[] args) { 6 // TODO 自动生成的方法存根 7 int x=0,x1=0,x2=0,x3=0,x4=0,x5=0,x6=0,x7=0,x8=0; 8 int a=0,b=0,c=0,d=0,e=0; 9 int flag=0; 10 int y1,y2,y3; 11 int y;//有括号的四则运算中所参与的数字个数 12 String out=""; 13 Random rand = new Random(); 14 for(int i=0;i<1000000000;i++) 15 { 16 /*选择*/ 17 String input=JOptionPane.showInputDialog("请输入选择:1、出2位数运算 2、多位数运算 3、退出"); 18 x=Integer.parseInt(input); 19 if(x==1) 20 { 21 String input1=JOptionPane.showInputDialog("请输入选择:1 、有乘除法 2、无乘除法"); 22 // String input2=JOptionPane.showInputDialog("请输入选择:1、有括号 2、无括号"); 23 String input3=JOptionPane.showInputDialog("请输入数值范围的前域 "); 24 String input4=JOptionPane.showInputDialog("请输入数值范围的后域"); 25 String input5=JOptionPane.showInputDialog("请输入选择:1、加减有负数 2、加减无负数"); 26 String input6=JOptionPane.showInputDialog("请输入选择:1、除法有余数 2、除法无余数"); 27 String input7=JOptionPane.showInputDialog("请输入出题数量"); 28 String input8=JOptionPane.showInputDialog("请输入在一行中输出几列运算式?"); 29 x1=Integer.parseInt(input1); 30 // x2=Integer.parseInt(input2); 31 x3=Integer.parseInt(input3); 32 x4=Integer.parseInt(input4); 33 x5=Integer.parseInt(input5); 34 x6=Integer.parseInt(input6); 35 x7=Integer.parseInt(input7); 36 x8=Integer.parseInt(input8); 37 //定义数组 38 String []s=new String[2*x7]; 39 /*设置出题多少的循环*/ 40 for(int w=0;w<x7;w++) 41 { 42 int w1; 43 w1=w; 44 // w4++;//用于换行的变量 45 46 //有无乘除法 47 if(x1==1) 48 { 49 e=rand.nextInt(4); 50 } 51 else if(x1==2) 52 { 53 e=rand.nextInt(2); 54 } 55 //数值范围 56 a=rand.nextInt(x4)%(x4-x3+1)+x3; 57 b=rand.nextInt(x4)%(x4-x3+1)+x3; 58 59 //加减有无负数 60 if(x5==1)//有负数 61 { 62 flag=0; 63 } 64 if(x5==2)//无负数 65 { 66 y1=a+b; 67 y2=a-b; 68 if(e==0) 69 { 70 if(y1<0) 71 { 72 flag=1; 73 } 74 } 75 else if(e==1) 76 { 77 if(y2<0) 78 { 79 flag=1; 80 } 81 } 82 } 83 84 //符号 85 if(e==0) 86 { 87 out="+"; 88 } 89 if(e==1) 90 { 91 out="-"; 92 } 93 if(e==2) 94 { 95 out="*"; 96 } 97 if(e==3) 98 { 99 100 if(b==0) 101 {flag=1;} 102 if(b!=0) 103 { 104 //除法有无余数 105 if(x6==1) 106 { 107 flag=0; 108 out="/"; 109 } 110 if(x6==2) 111 { 112 y3=a%b; 113 if(y3!=0) 114 { 115 flag=1; 116 } 117 118 } 119 120 } 121 } 122 123 s[w]=a+out+b; 124 //判断重复 125 for(int w2=0;w2<w1;w2++) 126 { 127 if(s[w].equals(s[w2])) 128 { 129 flag =1; 130 } 131 else 132 {flag =0;} 133 } 134 if(flag==0) 135 { 136 if((w+1)%x8==0) 137 { 138 System.out.println(s[w]+"="); 139 } 140 else 141 { 142 System.out.print(s[w]+"= "); 143 } 144 } 145 else if(flag==1) 146 {x7++;} 147 }//for 148 }//if 149 if(x==2) 150 { 151 String input1=JOptionPane.showInputDialog("请输入选择:1 、有乘除法 2、无乘除法"); 152 String input2=JOptionPane.showInputDialog("请输入选择:1、有括号 2、无括号"); 153 String input3=JOptionPane.showInputDialog("请输入数值范围的前域 "); 154 String input4=JOptionPane.showInputDialog("请输入数值范围的后域"); 155 String input5=JOptionPane.showInputDialog("请输入选择:1、加减有负数 2、加减无负数"); 156 String input6=JOptionPane.showInputDialog("请输入选择:1、除法有余数 2、除法无余数"); 157 String input7=JOptionPane.showInputDialog("请输入出题数量"); 158 String input8=JOptionPane.showInputDialog("请输入在一行中输出几列 运算式?"); 159 x1=Integer.parseInt(input1); 160 x2=Integer.parseInt(input2); 161 x3=Integer.parseInt(input3); 162 x4=Integer.parseInt(input4); 163 x5=Integer.parseInt(input5); 164 x6=Integer.parseInt(input6); 165 x7=Integer.parseInt(input7); 166 x8=Integer.parseInt(input8); 167 //定义数组 168 String []s=new String[2*x7]; 169 /*设置出题多少的循环*/ 170 for(int w=0;w<x7;w++) 171 { 172 int w1; 173 w1=w; 174 // w4++;//用于换行的变量 175 176 //有无乘除法 177 if(x1==1) 178 { 179 e=rand.nextInt(4); 180 } 181 else if(x1==2) 182 { 183 e=rand.nextInt(2); 184 } 185 //数值范围 186 a=rand.nextInt(x4)%(x4-x3+1)+x3; 187 b=rand.nextInt(x4)%(x4-x3+1)+x3; 188 189 //加减有无负数 190 if(x5==1)//有负数 191 { 192 flag=0; 193 } 194 if(x5==2)//无负数 195 { 196 y1=a+b; 197 y2=a-b; 198 if(e==0) 199 { 200 if(y1<0) 201 { 202 flag=1; 203 } 204 } 205 else if(e==1) 206 { 207 if(y2<0) 208 { 209 flag=1; 210 } 211 } 212 } 213 //除法有无余数 214 if(x6==1) 215 { 216 flag=0; 217 } 218 if(x6==2) 219 { 220 y3=a%b; 221 if(y3!=0) 222 { 223 flag=1; 224 } 225 } 226 227 //符号 228 if(e==0) 229 { 230 out="+"; 231 } 232 if(e==1) 233 { 234 out="-"; 235 } 236 if(e==2) 237 { 238 out="*"; 239 } 240 if(e==3) 241 { 242 243 if(d==0) 244 {flag=1;} 245 if(d!=0) 246 { 247 out="/"; 248 } 249 } 250 251 252 s[w]=a+out+b; 253 254 //有无括号 255 y=rand.nextInt(10)%(9)+2; 256 int p;//随机出数,选择在原来的式子之前加数还是之后 257 258 if(x2==1) 259 { 260 261 for(int r=0;r<(y-2);r++) 262 { 263 c=rand.nextInt(x4)%(x4-x3+1)+x3; 264 d=rand.nextInt(x4)%(x4-x3+1)+x3; 265 266 if(x1==1) 267 { 268 e=rand.nextInt(4); 269 } 270 else if(x1==2) 271 { 272 e=rand.nextInt(2); 273 } 274 275 //符号 276 if(e==0) 277 { 278 out="+"; 279 } 280 if(e==1) 281 { 282 out="-"; 283 } 284 if(e==2) 285 { 286 out="*"; 287 } 288 if(e==3) 289 { 290 291 if(d==0) 292 {flag=1;} 293 if(d!=0) 294 { 295 out="/"; 296 } 297 } 298 299 p=rand.nextInt(2); 300 if(p==0) 301 { 302 s[w]=c+out+"("+s[w]+")"; 303 } 304 if(p==1) 305 { 306 s[w]="("+s[w]+")"+out+d; 307 } 308 } 309 } 310 if(x2==2) 311 { 312 for(int r=0;r<(y-2);r++) 313 { 314 c=rand.nextInt(x4)%(x4-x3+1)+x3; 315 d=rand.nextInt(x4)%(x4-x3+1)+x3; 316 317 if(x1==1) 318 { 319 e=rand.nextInt(4); 320 } 321 else if(x1==2) 322 { 323 e=rand.nextInt(2); 324 } 325 326 //符号 327 if(e==0) 328 { 329 out="+"; 330 } 331 if(e==1) 332 { 333 out="-"; 334 } 335 if(e==2) 336 { 337 out="*"; 338 } 339 if(e==3) 340 { 341 342 if(d==0) 343 {flag=1;} 344 if(d!=0) 345 { 346 out="/"; 347 } 348 } 349 350 p=rand.nextInt(1); 351 if(p==0) 352 { 353 s[w]=c+out+s[w]; 354 } 355 if(p==1) 356 { 357 s[w]=s[w]+out+d; 358 } 359 } 360 } 361 362 363 364 //判断重复 365 for(int w2=0;w2<w1;w2++) 366 { 367 if(s[w].equals(s[w2])) 368 { 369 flag =1; 370 } 371 else 372 {flag =0;} 373 } 374 if(flag==0) 375 { 376 if((w+1)%x8==0) 377 { 378 System.out.println(s[w]+"="); 379 } 380 else 381 { 382 System.out.print(s[w]+"= "); 383 } 384 } 385 else if(flag==1) 386 {x7++;} 387 }//for 388 } 389 if(x==3) 390 {break;} 391 } 392 } 393 394 }
测试结果:
有括号
‘
无括号
日期 | 编号 | 引入阶段 | 排除阶段 | 修复时间 | 修复缺陷 | 缺陷类型 |
3/16 | 1 | 编码 | 编译 | 1min | 程序可以输出除法运算 | 20 |
描述 | 程序不能正常输出"/" | |||||
3/18 | 2 | 编码 | 编译 | 1min | 20 | |
描述 | 用于判断是否重复的数组溢出 | |||||
3/18 | 3 | 编码 | 编译 | 5min | 程序可正常换行 | 20 |
描述 | 打印方式不正确,换行出错 | |||||
3/18 | 4 | 编码 | 编译 | 5min | 70 | |
描述 | a%b出现b为0错误 | |||||
3/19 | 5 | 编码 | 设计 | 7min | 80 | |
描述 | n位数运算随机加括号加数字,一个数字出现n-1次 | |||||
3/19 | 6 | 编码 | 编译 | 1min | 20 | |
描述 | 与1错误相同类型,均是随机数生成错误 |
结果分析:1、随机数的生成如x=random.nextInt(2)生成的是0和1
2、多位数运算不能根据结果进行判断,
3、为数组申请空间时应考虑在程序运行过程中是否会出现越界
问题:在程序编写之前,写好设计思路,但是在编写程序编写过程中还是不能严格按照设计思路进行,会再根据程序修改设计思路。