软件工程结对作业02,软件工程结对02
1.设计思想:
本次任务我用php实现的主要功能,默认必须有加减法。
首先,创建index.php文件,在HTML语句里创建表单,表单内容包括,出题数目,最大最小值,及其他的一些选项。
然后,创建rubric.php文件,将表单信息提交到此文件下,四则运算方法实现时调用传递过来的值。实现四则运算的方法和前几次用Java时的方法差不多,将代码做了修改和优化。将题目和答案分别放入question.txt和answer.txt文件里,以备后用。
第三,创建submitAnswer.php、acceptAnswer.php、deleteAnswer.php和judgeAnswer.php文件,分别用于在线提交答案,接收答案,删除答案和判断答案。提交的答案放在answer1.txt文件里,判断答案时通过比较answer.txt和answer1.txt文件里的内容即可。
2.源程序代码
1 index.
php
2
3
9
10
11
12 四则运算出题系统
13 <script>
<span> 14 <span>function<span> check() {
<span> 15 <span>var tt=/^(0|[1-9]\d*)$/<span>;
<span> 16 <span>if(!tt.test(form1.<span>min.<span>value))
<span> 17 <span> {
<span> 18 alert('最小值输入不合法'<span>);
<span> 19 form1.<span>min.<span>focus();
<span> 20 <span>return <span>false<span>;
<span> 21 <span> }
<span> 22 <span>if(!tt.test(form1.<span>max.value) || (form1.<span>max.value<form1.<span>min.<span>value))
<span> 23 <span> {
<span> 24 alert('最大值输入不合法'<span>);
<span> 25 form1.<span>min.<span>focus();
<span> 26 <span>return <span>false<span>;
<span> 27 <span> }
<span> 28 <span>if(!tt.test(form1.num.value) || (form1.num.value==0<span>))
<span> 29 <span> {
<span> 30 alert('出题数目输入不合法'<span>);
<span> 31 form1.num.<span>focus();
<span> 32 <span>return <span>false<span>;
<span> 33 <span> }
<span> 34 <span>return <span>true<span>;
<span> 35 <span> }
<span> 36 </script>
37
38
39
40
41
42 欢迎来到小学四则运算出题系统
43
44
72
73
74
75
76 rubric.
php
77
78
79
80
81 出题界面
82
83
84
85 php
86 if(
is_numeric(
$_POST["max"
]))
87 {
88 $max=
$_POST["max"];
//最大值
89 }
90 if(
is_numeric(
$_POST["min"
]))
91 {
92 $min=
$_POST["min"];
//最小值
93 }
94 if(
is_numeric(
$_POST["num"
]))
95 {
96 $num=
$_POST["num"];
//出题数目
97 }
98 if(
is_numeric(
$_POST["num1"
]))
99 {
100 $num1=
$_POST["num1"];
//参与运算的个数
101 }
102 if(
is_string(
$_POST["mul"
]))
103 {
104 $mul=
$_POST["mul"];
//选择是否加入乘法 是t否f
105 }
106 if(
is_string(
$_POST["div"
]))
107 {
108 $div=
$_POST["div"];
//选择是否加入除法 是t否f
109 }
110
111 /* 定义数组 */
112 $a=
array();
//方法中使用,存储随机数字和运算符
113 $amd=
array();
//方法中使用,将算好乘/除法后的算式存入此数组
114 $b=
array();
//调用方法时使用
115 $d=
array();
//存储题目
116 $e=
array();
//存储答案
117
118 /* Result 类用于封装结果 */
119 class Result
120 {
121 public $r1;
//$r1存储计算结果
122 }
123
124 /* 运算符只有加减的方法 */
125 function addSub(
$min,
$max,
$num1,
$result)
126 {
127 $str=
mt_rand(
$min,
$max);
128 $re=
$str;
129 for(
$i=1;
$i$num1;
$i++
)
130 {
131 $a[
$i]=
mt_rand(
$min,
$max);
132 $c=
mt_rand(0,1
);
133 if(
$c==0
)
134 {
135 $str=
$str." + ".
$a[
$i];
136 $re=
$re+
$a[
$i];
137 }
138 if(
$c==1
)
139 {
140 $str=
$str." - ".
$a[
$i];
141 $re=
$re-
$a[
$i];
142 }
143 }
144 $result->r1=
$re;
145 $str=
$str." = "
;
146 return $str;
147 }
148
149 /* 运算符为加减乘的方法 */
150 function addSubMul(
$min,
$max,
$num1,
$result)
151 {
152 $a[0]=
mt_rand(
$min,
$max);
153 /* 将算式中的数和运算符存入数组$a */
154 /*如果此循环中在运算符左右两侧加入空格,则在后面while循环中的if条件语句中的运算符也应加空格,否则会出错*/
155 for(
$i=1;
$i$num1-1);
$i=
$i+2)
//(2*$num1-1) 为算式中参与运算的数和运算符个数之和
156 {
157 $c=
mt_rand(0, 2
);
158 if(
$c==0
)
159 {
160 $a[
$i]=' + '
;
161 $a[
$i+1]=
mt_rand(
$min,
$max);
162 }
163 if(
$c==1
)
164 {
165 $a[
$i]=' - '
;
166 $a[
$i+1]=
mt_rand(
$min,
$max);
167 }
168 if(
$c==2
)
169 {
170 $a[
$i]=' x '
;
171 $a[
$i+1]=
mt_rand(
$min,
$max);
172 }
173 }
174 /* 将算式中的乘法算完后的算式存入数组$amd */
175 $i=0
;
176 $j=0
;
177 while(
$i$num1-1))
//运算符左右是否有空格应和上面的for循环保持一致
178 {
179 if(
$a[
$i]==' x '
)
180 {
181 $amd[
$j-1]=
$amd[
$j-1]*
$a[
$i+1
];
182 $i=
$i+2
;
183 }
184 else
185 {
186 $amd[
$j]=
$a[
$i];
187 $j++
;
188 $i++
;
189 }
190 }
191 /* 算出算式的答案$re */
192 $re=
$amd[0
];
193 $k=1
;
194 while(
$k$j)
//运算符左右是否有空格应和上面的for循环保持一致
195 {
196 if(
$amd[
$k]==' + '
)
197 {
198 $re=
$re+
$amd[
$k+1
];
199 $k=
$k+2
;
200 continue;
201 }
202 if(
$amd[
$k]==' - '
)
203 {
204 $re=
$re-
$amd[
$k+1
];
205 $k=
$k+2
;
206 }
207 }
208 /* 将数组中的值连接为字符串算式$str */
209 $str=
$a[0
];
210 for(
$i=1;
$i$num1-1);
$i++
)
211 {
212 $str.=
$a[
$i];
213 }
214 $result->r1=
$re;
215 $str=
$str." = "
;
216 return $str;
217 }
218
219 /* 运算符为加减除的方法 */
220 function addSubDiv(
$min,
$max,
$num1,
$result)
221 {
222 $a[0]=
mt_rand(
$min,
$max);
223 /* 将算式中的数和运算符存入数组$a */
224 for(
$i=1;
$i$num1-1);
$i=
$i+2
)
225 {
226 $c=
mt_rand(0, 2
);
227 if(
$c==0
)
228 {
229 $a[
$i]=' + '
;
230 $a[
$i+1]=
mt_rand(
$min,
$max);
231 }
232 if(
$c==1
)
233 {
234 $a[
$i]=' - '
;
235 $a[
$i+1]=
mt_rand(
$min,
$max);
236 }
237 if(
$c==2
)
238 {
239 $a[
$i]=' ÷ '
;
240 $a[
$i+1]=
mt_rand(
$min,
$max);
241 }
242 }
243 /* 将算式中的除法算完后的算式存入数组$amd */
244 $i=0
;
245 $j=0
;
246 while(
$i$num1-1
))
247 {
248 if(
$a[
$i]==' ÷ '
)
249 {
250 while((
$amd[
$j-1] %
$a[
$i+1]!=0) ||
$a[
$i+1]==0 )
//避免除法有余数
251 {
252 $a[
$i+1]=
mt_rand(
$min,
$max);
253 }
254 $amd[
$j-1]=
$amd[
$j-1]/
$a[
$i+1
];
255 $i=
$i+2
;
256 }
257 else
258 {
259 $amd[
$j]=
$a[
$i];
260 $j++
;
261 $i++
;
262 }
263 }
264 /* 算出算式的答案$re */
265 $re=
$amd[0
];
266 $k=1
;
267 while(
$k$j
)
268 {
269 if(
$amd[
$k]==' + '
)
270 {
271 $re=
$re+
$amd[
$k+1
];
272 $k=
$k+2
;
273 continue;
274 }
275 if(
$amd[
$k]==' - '
)
276 {
277 $re=
$re-
$amd[
$k+1
];
278 $k=
$k+2
;
279 }
280 }
281
282 /* 将算式放入字符串$str */
283 $str=
$a[0
];
284 for(
$i=1;
$i$num1-1);
$i++
)
285 {
286 $str.=
$a[
$i];
287 }
288 $result->r1=
$re;
289 $str=
$str." = "
;
290 return $str;
291 }
292
293 /* 运算符为加减乘除的方法 */
294 function addSubMulDiv(
$min,
$max,
$num1,
$result)
295 {
296 $a[0]=
mt_rand(
$min,
$max);
297 /* 将算式中的数和运算符存入数组$a */
298 for(
$i=1;
$i$num1-1);
$i=
$i+2
)
299 {
300 $c=
mt_rand(0, 3
);
301 if(
$c==0
)
302 {
303 $a[
$i]=' + '
;
304 $a[
$i+1]=
mt_rand(
$min,
$max);
305 }
306 if(
$c==1
)
307 {
308 $a[
$i]=' - '
;
309 $a[
$i+1]=
mt_rand(
$min,
$max);
310 }
311 if(
$c==2
)
312 {
313 $a[
$i]=' x '
;
314 $a[
$i+1]=
mt_rand(
$min,
$max);
315 }
316 if(
$c==3
)
317 {
318 $a[
$i]=' ÷ '
;
319 $a[
$i+1]=
mt_rand(
$min,
$max);
320 }
321 }
322 /* 将算式中的除法算完后的算式存入数组$amd */
323 $i=0
;
324 $j=0
;
325 while(
$i$num1-1
))
326 {
327 if(
$a[
$i]==' x '
)
328 {
329 $amd[
$j-1]=
$amd[
$j-1]*
$a[
$i+1
];
330 $i=
$i+2
;
331 }
332 else if(
$a[
$i]==' ÷ '
)
333 {
334 while((
$amd[
$j-1] %
$a[
$i+1]!=0) ||
$a[
$i+1]==0 )
//避免除法有余数
335 {
336 $a[
$i+1]=
mt_rand(
$min,
$max);
337 }
338 $amd[
$j-1]=
$amd[
$j-1]/
$a[
$i+1
];
339 $i=
$i+2
;
340 }
341 else
342 {
343 $amd[
$j]=
$a[
$i];
344 $j++
;
345 $i++
;
346 }
347 }
348 /* 算出算式的答案$re */
349 $re=
$amd[0
];
350 $k=1
;
351 while(
$k$j
)
352 {
353 if(
$amd[
$k]==' + '
)
354 {
355 $re=
$re+
$amd[
$k+1
];
356 $k=
$k+2
;
357 continue;
358 }
359 if(
$amd[
$k]==' - '
)
360 {
361 $re=
$re-
$amd[
$k+1
];
362 $k=
$k+2
;
363 }
364 }
365 /* 将算式放入字符串$str */
366 $str=
$a[0
];
367 for(
$i=1;
$i$num1-1);
$i++
)
368 {
369 $str.=
$a[
$i];
370 }
371 $result->r1=
$re;
372 $str=
$str." = "
;
373 return $str;
374 }
375
376 $r=
new Result();
377
378 /* 两个数的加减法 */
379 if((
$num1==2) && (
$mul=='f') && (
$div=='f'
))
380 {
381 $question =
fopen("question.txt", "w"
);
382 $answer=
fopen("answer.txt", "w"
);
383 for(
$i=0;
$i$num;
$i++
)
384 {
385 $j=0
;
386 $bool=
true;
387 $b[
$i]= addSub(
$min,
$max,
$num1,
$r);
388 while((
$r->r1)//
当结果为负时,重新随机
389 {
390 $b[
$i]= addSub(
$min,
$max,
$num1,
$r);
391 }
392 while((
$bool) && (
$i!=0))
//避免重复
393 {
394 while(
$b[
$i]==
$b[
$j])
395 {
396 $b[
$i]= addSub(
$min,
$max,
$num1,
$r);
397 while((
$r->r1)//
结果为负,重新出题
398 {
399 $b[
$i]= addSub(
$min,
$max,
$num1,
$r);
400 }
401 $j=0
;
402 }
403 $j++
;
404 if(
$j==
$i)
405 {
406 $bool=
false;
407 }
408 }
409 echo "( ".(
$i+1)." ) ".
$b[
$i]."
"
;
410 $d[
$i]=
$b[
$i]."\n"
;
411 $e[
$i]=
$r->r1."\n"
;
412 fwrite(
$question,
$d[
$i]);
413 fwrite(
$answer,
$e[
$i]);
414 }
415 fclose(
$question);
416 fclose(
$answer);
417 }
418
419 /* 两个数的加减乘法 */
420 if((
$num1==2) && (
$mul=='t') && (
$div=='f'
))
421 {
422 $question =
fopen("question.txt", "w"
);
423 $answer=
fopen("answer.txt", "w"
);
424 for(
$i=0;
$i$num;
$i++
)
425 {
426 $j=0
;
427 $bool=
true;
428 $b[
$i]= addSubMul(
$min,
$max,
$num1,
$r);
429 while((
$r->r1)//
当结果为负时,重新随机
430 {
431 $b[
$i]= addSubMul(
$min,
$max,
$num1,
$r);
432 }
433 while((
$bool) && (
$i!=0))
//避免重复
434 {
435 while(
$b[
$i]==
$b[
$j])
436 {
437 $b[
$i]= addSubMul(
$min,
$max,
$num1,
$r);
438 while((
$r->r1)//
结果为负,重新出题
439 {
440 $b[
$i]= addSubMul(
$min,
$max,
$num1,
$r);
441 }
442 $j=0
;
443 }
444 $j++
;
445 if(
$j==
$i)
446 {
447 $bool=
false;
448 }
449 }
450 echo "( ".(
$i+1)." ) ".
$b[
$i]."
"
;
451 $d[
$i]=
$b[
$i]."\n"
;
452 $e[
$i]=
$r->r1."\n"
;
453 fwrite(
$question,
$d[
$i]);
454 fwrite(
$answer,
$e[
$i]);
455 }
456 fclose(
$question);
457 fclose(
$answer);
458 }
459
460 /* 两个数的加减除法 */
461 if((
$num1==2) && (
$mul=='f') && (
$div=='t'
))
462 {
463 $question =
fopen("question.txt", "w"
);
464 $answer=
fopen("answer.txt", "w"
);
465 for(
$i=0;
$i$num;
$i++
)
466 {
467 $j=0
;
468 $bool=
true;
469 $b[
$i]= addSubDiv(
$min,
$max,
$num1,
$r);
470 while((
$r->r1)//
当结果为负时,重新随机
471 {
472 $b[
$i]= addSubDiv(
$min,
$max,
$num1,
$r);
473 }
474 while((
$bool) && (
$i!=0))
//避免重复
475 {
476 while(
$b[
$i]==
$b[
$j])
477 {
478 $b[
$i]= addSubDiv(
$min,
$max,
$num1,
$r);
479 while((
$r->r1)//
结果为负,重新出题
480 {
481 $b[
$i]= addSubDiv(
$min,
$max,
$num1,
$r);
482 }
483 $j=0
;
484 }
485 $j++
;
486 if(
$j==
$i)
487 {
488 $bool=
false;
489 }
490 }
491 echo "( ".(
$i+1)." ) ".
$b[
$i]."
"
;
492 $d[
$i]=
$b[
$i]."\n"
;
493 $e[
$i]=
$r->r1."\n"
;
494 fwrite(
$question,
$d[
$i]);
495 fwrite(
$answer,
$e[
$i]);
496 }
497 fclose(
$question);
498 fclose(
$answer);
499 }
500
501 /* 两个数的加减乘除法 */
502 if((
$num1==2) && (
$mul=='t') && (
$div=='t'
))
503 {
504 $question =
fopen("question.txt", "w"
);
505 $answer=
fopen("answer.txt", "w"
);
506 for(
$i=0;
$i$num;
$i++
)
507 {
508 $j=0
;
509 $bool=
true;
510 $b[
$i]= addSubMulDiv(
$min,
$max,
$num1,
$r);
511 while((
$r->r1)//
结果为负,重新出题
512 {
513 $b[
$i]= addSubMulDiv(
$min,
$max,
$num1,
$r);
514 }
515 while((
$bool) && (
$i!=0))
//判断重复
516 {
517 while(
$b[
$i]==
$b[
$j])
518 {
519 $b[
$i]= addSubMulDiv(
$min,
$max,
$num1,
$r);
520 while((
$r->r1)//
结果为负,重新出题
521 {
522 $b[
$i]= addSubMulDiv(
$min,
$max,
$num1,
$r);
523 }
524 $j=0
;
525 }
526 $j++
;
527 if(
$j==
$i)
528 {
529 $bool=
false;
530 }
531 }
532 echo "( ".(
$i+1)." ) ".
$b[
$i]."
"
;
533 $d[
$i]=
$b[
$i]."\n"
;
534 $e[
$i]=
$r->r1."\n"
;
535 fwrite(
$question,
$d[
$i]);
536 fwrite(
$answer,
$e[
$i]);
537 }
538 fclose(
$question);
539 fclose(
$answer);
540 }
541
542 /* 三个数的加减法 */
543 if((
$num1==3) && (
$mul=='f') && (
$div=='f'
))
544 {
545 $question =
fopen("question.txt", "w"
);
546 $answer=
fopen("answer.txt", "w"
);
547 for(
$i=0;
$i$num;
$i++
)
548 {
549 $j=0
;
550 $bool=
true;
551 $b[
$i]= addSub(
$min,
$max,
$num1,
$r);
552 while((
$r->r1)//
结果为负,重新出题
553 {
554 $b[
$i]= addSub(
$min,
$max,
$num1,
$r);
555 }
556 while((
$bool) && (
$i!=0))
//判断重复
557 {
558 while(
$b[
$i]==
$b[
$j])
559 {
560 $b[
$i]= addSub(
$min,
$max,
$num1,
$r);
561 while((
$r->r1)//
结果为负,重新出题
562 {
563 $b[
$i]= addSub(
$min,
$max,
$num1,
$r);
564 }
565 $j=0
;
566 }
567 $j++
;
568 if(
$j==
$i)
569 {
570 $bool=
false;
571 }
572 }
573 echo "( ".(
$i+1)." ) ".
$b[
$i]."
"
;
574 $d[
$i]=
$b[
$i]."\n"
;
575 $e[
$i]=
$r->r1."\n"
;
576 fwrite(
$question,
$d[
$i]);
577 fwrite(
$answer,
$e[
$i]);
578 }
579 fclose(
$question);
580 fclose(
$answer);
581 }
582
583 /* 三个数的加减乘法 */
584 if((
$num1==3) && (
$mul=='t') && (
$div=='f'
))
585 {
586 $question =
fopen("question.txt", "w"
);
587 $answer=
fopen("answer.txt", "w"
);
588 for(
$i=0;
$i$num;
$i++
)
589 {
590 $j=0
;
591 $bool=
true;
592 $b[
$i]= addSubMul(
$min,
$max,
$num1,
$r);
593 while((
$r->r1)//
结果为负,重新出题
594 {
595 $b[
$i]= addSubMul(
$min,
$max,
$num1,
$r);
596 }
597 while((
$bool) && (
$i!=0))
//判断重复
598 {
599 while(
$b[
$i]==
$b[
$j])
600 {
601 $b[
$i]= addSubMul(
$min,
$max,
$num1,
$r);
602 while((
$r->r1)//
结果为负,重新出题
603 {
604 $b[
$i]= addSubMul(
$min,
$max,
$num1,
$r);
605 }
606 $j=0
;
607 }
608 $j++
;
609 if(
$j==
$i)
610 {
611 $bool=
false;
612 }
613 }
614 echo "( ".(
$i+1)." ) ".
$b[
$i]."
"
;
615 $d[
$i]=
$b[
$i]."\n"
;
616 $e[
$i]=
$r->r1."\n"
;
617 fwrite(
$question,
$d[
$i]);
618 fwrite(
$answer,
$e[
$i]);
619 }
620 fclose(
$question);
621 fclose(
$answer);
622 }
623
624 /* 三个数的加减除法 */
625 if((
$num1==3) && (
$mul=='f') && (
$div=='t'
))
626 {
627 $question =
fopen("question.txt", "w"
);
628 $answer=
fopen("answer.txt", "w"
);
629 for(
$i=0;
$i$num;
$i++
)
630 {
631 $j=0
;
632 $bool=
true;
633 $b[
$i]= addSubDiv(
$min,
$max,
$num1,
$r);
634 while((
$r->r1)//
结果为负,重新出题
635 {
636 $b[
$i]= addSubDiv(
$min,
$max,
$num1,
$r);
637 }
638 while((
$bool) && (
$i!=0))
//判断重复
639 {
640 while(
$b[
$i]==
$b[
$j])
641 {
642 $b[
$i]= addSubDiv(
$min,
$max,
$num1,
$r);
643 while((
$r->r1)//
结果为负,重新出题
644 {
645 $b[
$i]= addSubDiv(
$min,
$max,
$num1,
$r);
646 }
647 $j=0
;
648 }
649 $j++
;
650 if(
$j==
$i)
651 {
652 $bool=
false;
653 }
654 }
655 echo "( ".(
$i+1)." ) ".
$b[
$i]."
"
;
656 $d[
$i]=
$b[
$i]."\n"
;
657 $e[
$i]=
$r->r1."\n"
;
658 fwrite(
$question,
$d[
$i]);
659 fwrite(
$answer,
$e[
$i]);
660 }
661 fclose(
$question);
662 fclose(
$answer);
663 }
664
665 /* 三个数的加减乘除法 */
666 if((
$num1==3) && (
$mul=='t') && (
$div=='t'
))
667 {
668 $question =
fopen("question.txt", "w"
);
669 $answer=
fopen("answer.txt", "w"
);
670 for(
$i=0;
$i$num;
$i++
)
671 {
672 $j=0
;
673 $bool=
true;
674 $b[
$i]= addSubMulDiv(
$min,
$max,
$num1,
$r);
675 while((
$r->r1)//
结果为负,重新出题
676 {
677 $b[
$i]= addSubMulDiv(
$min,
$max,
$num1,
$r);
678 }
679 while((
$bool) && (
$i!=0))
//判断重复
680 {
681 while(
$b[
$i]==
$b[
$j])
682 {
683 $b[
$i]= addSubMulDiv(
$min,
$max,
$num1,
$r);
684 while((
$r->r1)//
结果为负,重新出题
685 {
686 $b[
$i]= addSubMulDiv(
$min,
$max,
$num1,
$r);
687 }
688 $j=0
;
689 }
690 $j++
;
691 if(
$j==
$i)
692 {
693 $bool=
false;
694 }
695 }
696 echo "( ".(
$i+1)." ) ".
$b[
$i]."
"
;
697 $d[
$i]=
$b[
$i]."\n"
;
698 $e[
$i]=
$r->r1."\n"
;
699 fwrite(
$question,
$d[
$i]);
700 fwrite(
$answer,
$e[
$i]);
701 }
702 fclose(
$question);
703 fclose(
$answer);
704 }
705
706 /* 四个数的加减法 */
707 if((
$num1==4) && (
$mul=='f') && (
$div=='f'
))
708 {
709 $question =
fopen("question.txt", "w"
);
710 $answer=
fopen("answer.txt", "w"
);
711 for(
$i=0;
$i$num;
$i++
)
712 {
713 $j=0
;
714 $bool=
true;
715 $b[
$i]= addSub(
$min,
$max,
$num1,
$r);
716 while((
$r->r