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
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
86if(is_numeric($_POST["max"]))
87 {
88$max=$_POST["max"]; //最大值 89 }
90if(is_numeric($_POST["min"]))
91 {
92$min=$_POST["min"]; //最小值 93 }
94if(is_numeric($_POST["num"]))
95 {
96$num=$_POST["num"]; //出题数目 97 }
98if(is_numeric($_POST["num1"]))
99 {
100$num1=$_POST["num1"]; //参与运算的个数101 }
102if(is_string($_POST["mul"]))
103 {
104$mul=$_POST["mul"]; //选择是否加入乘法 是t否f105 }
106if(is_string($_POST["div"]))
107 {
108$div=$_POST["div"]; //选择是否加入除法 是t否f109 }
110111/* 定义数组 */112$a=array(); //方法中使用,存储随机数字和运算符113$amd=array(); //方法中使用,将算好乘/除法后的算式存入此数组114$b=array(); //调用方法时使用115$d=array(); //存储题目116$e=array(); //存储答案117118/* Result 类用于封装结果 */119class Result
120 {
121public$r1; //$r1存储计算结果122 }
123124/* 运算符只有加减的方法 */125function addSub($min,$max,$num1,$result)
126 {
127$str=mt_rand($min,$max);
128$re=$str;
129for($i=1;$i<$num1;$i++)
130 {
131$a[$i]= mt_rand($min,$max);
132$c=mt_rand(0,1);
133if($c==0)
134 {
135$str=$str." + ".$a[$i];
136$re=$re+$a[$i];
137 }
138if($c==1)
139 {
140$str=$str." - ".$a[$i];
141$re=$re-$a[$i];
142 }
143 }
144$result->r1=$re;
145$str=$str." = ";
146return$str;
147 }
148149/* 运算符为加减乘的方法 */150function addSubMul($min,$max,$num1,$result)
151 {
152$a[0]= mt_rand($min, $max);
153/* 将算式中的数和运算符存入数组$a */154/*如果此循环中在运算符左右两侧加入空格,则在后面while循环中的if条件语句中的运算符也应加空格,否则会出错*/155for($i=1;$i<(2*$num1-1);$i=$i+2) //(2*$num1-1) 为算式中参与运算的数和运算符个数之和156 {
157$c= mt_rand(0, 2);
158if($c==0)
159 {
160$a[$i]=' + ';
161$a[$i+1]= mt_rand($min, $max);
162 }
163if($c==1)
164 {
165$a[$i]=' - ';
166$a[$i+1]= mt_rand($min, $max);
167 }
168if($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;
177while($i<(2*$num1-1)) //运算符左右是否有空格应和上面的for循环保持一致178 {
179if($a[$i]==' x ')
180 {
181$amd[$j-1]=$amd[$j-1]*$a[$i+1];
182$i=$i+2;
183 }
184else185 {
186$amd[$j]=$a[$i];
187$j++;
188$i++;
189 }
190 }
191/* 算出算式的答案$re */192$re=$amd[0];
193$k=1;
194while($k<$j) //运算符左右是否有空格应和上面的for循环保持一致195 {
196if($amd[$k]==' + ')
197 {
198$re=$re+$amd[$k+1];
199$k=$k+2;
200continue;
201 }
202if($amd[$k]==' - ')
203 {
204$re=$re-$amd[$k+1];
205$k=$k+2;
206 }
207 }
208/* 将数组中的值连接为字符串算式$str */209$str=$a[0];
210for($i=1;$i<(2*$num1-1);$i++)
211 {
212$str.=$a[$i];
213 }
214$result->r1=$re;
215$str=$str." = ";
216return$str;
217 }
218219/* 运算符为加减除的方法 */220function addSubDiv($min,$max,$num1,$result)
221 {
222$a[0]= mt_rand($min, $max);
223/* 将算式中的数和运算符存入数组$a */224for($i=1;$i<(2*$num1-1);$i=$i+2)
225 {
226$c= mt_rand(0, 2);
227if($c==0)
228 {
229$a[$i]=' + ';
230$a[$i+1]= mt_rand($min, $max);
231 }
232if($c==1)
233 {
234$a[$i]=' - ';
235$a[$i+1]= mt_rand($min, $max);
236 }
237if($c==2)
238 {
239$a[$i]=' ÷ ';
240$a[$i+1]= mt_rand($min, $max);
241 }
242 }
243/* 将算式中的除法算完后的算式存入数组$amd */244$i=0;
245$j=0;
246while($i<(2*$num1-1))
247 {
248if($a[$i]==' ÷ ')
249 {
250while(($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 }
257else258 {
259$amd[$j]=$a[$i];
260$j++;
261$i++;
262 }
263 }
264/* 算出算式的答案$re */265$re=$amd[0];
266$k=1;
267while($k<$j)
268 {
269if($amd[$k]==' + ')
270 {
271$re=$re+$amd[$k+1];
272$k=$k+2;
273continue;
274 }
275if($amd[$k]==' - ')
276 {
277$re=$re-$amd[$k+1];
278$k=$k+2;
279 }
280 }
281282/* 将算式放入字符串$str */283$str=$a[0];
284for($i=1;$i<(2*$num1-1);$i++)
285 {
286$str.=$a[$i];
287 }
288$result->r1=$re;
289$str=$str." = ";
290return$str;
291 }
292293/* 运算符为加减乘除的方法 */294function addSubMulDiv($min,$max,$num1,$result)
295 {
296$a[0]= mt_rand($min, $max);
297/* 将算式中的数和运算符存入数组$a */298for($i=1;$i<(2*$num1-1);$i=$i+2)
299 {
300$c= mt_rand(0, 3);
301if($c==0)
302 {
303$a[$i]=' + ';
304$a[$i+1]= mt_rand($min, $max);
305 }
306if($c==1)
307 {
308$a[$i]=' - ';
309$a[$i+1]= mt_rand($min, $max);
310 }
311if($c==2)
312 {
313$a[$i]=' x ';
314$a[$i+1]= mt_rand($min, $max);
315 }
316if($c==3)
317 {
318$a[$i]=' ÷ ';
319$a[$i+1]= mt_rand($min, $max);
320 }
321 }
322/* 将算式中的除法算完后的算式存入数组$amd */323$i=0;
324$j=0;
325while($i<(2*$num1-1))
326 {
327if($a[$i]==' x ')
328 {
329$amd[$j-1]=$amd[$j-1]*$a[$i+1];
330$i=$i+2;
331 }
332elseif($a[$i]==' ÷ ')
333 {
334while(($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 }
341else342 {
343$amd[$j]=$a[$i];
344$j++;
345$i++;
346 }
347 }
348/* 算出算式的答案$re */349$re=$amd[0];
350$k=1;
351while($k<$j)
352 {
353if($amd[$k]==' + ')
354 {
355$re=$re+$amd[$k+1];
356$k=$k+2;
357continue;
358 }
359if($amd[$k]==' - ')
360 {
361$re=$re-$amd[$k+1];
362$k=$k+2;
363 }
364 }
365/* 将算式放入字符串$str */366$str=$a[0];
367for($i=1;$i<(2*$num1-1);$i++)
368 {
369$str.=$a[$i];
370 }
371$result->r1=$re;
372$str=$str." = ";
373return$str;
374 }
375376$r= new Result();
377378/* 两个数的加减法 */379if(($num1==2) && ($mul=='f') && ($div=='f'))
380 {
381$question = fopen("question.txt", "w");
382$answer= fopen("answer.txt", "w");
383for($i=0;$i<$num;$i++)
384 {
385$j=0;
386$bool=true;
387$b[$i]= addSub($min, $max, $num1, $r);
388while(($r->r1)<0) //当
结果为负时,重新随机
389 {
390$b[
$i]= addSub(
$min,
$max,
$num1,
$r);
391 }
392while((
$bool) && (
$i!=0))
//避免重复393 {
394while(
$b[
$i]==
$b[
$j])
395 {
396$b[
$i]= addSub(
$min,
$max,
$num1,
$r);
397while((
$r->r1)<0)
//结果为负,重新出题398 {
399$b[
$i]= addSub(
$min,
$max,
$num1,
$r);
400 }
401$j=0
;
402 }
403$j++
;
404if(
$j==
$i)
405 {
406$bool=
false;
407 }
408 }
409echo "( ".(
$i+1)." ) ".
$b[
$i]."
"
;
410$d[
$i]=
$b[
$i]."\n"
;
411$e[
$i]=
$r->r1."\n"
;
412fwrite(
$question,
$d[
$i]);
413fwrite(
$answer,
$e[
$i]);
414 }
415fclose(
$question);
416fclose(
$answer);
417 }
418419/* 两个数的加减乘法 */420if((
$num1==2) && (
$mul=='t') && (
$div=='f'
))
421 {
422$question =
fopen("question.txt", "w"
);
423$answer=
fopen("answer.txt", "w"
);
424for(
$i=0;
$i<
$num;
$i++
)
425 {
426$j=0
;
427$bool=
true;
428$b[
$i]= addSubMul(
$min,
$max,
$num1,
$r);
429while((
$r->r1)<0)
//当结果为负时,重新随机430 {
431$b[
$i]= addSubMul(
$min,
$max,
$num1,
$r);
432 }
433while((
$bool) && (
$i!=0))
//避免重复434 {
435while(
$b[
$i]==
$b[
$j])
436 {
437$b[
$i]= addSubMul(
$min,
$max,
$num1,
$r);
438while((
$r->r1)<0)
//结果为负,重新出题439 {
440$b[
$i]= addSubMul(
$min,
$max,
$num1,
$r);
441 }
442$j=0
;
443 }
444$j++
;
445if(
$j==
$i)
446 {
447$bool=
false;
448 }
449 }
450echo "( ".(
$i+1)." ) ".
$b[
$i]."
"
;
451$d[
$i]=
$b[
$i]."\n"
;
452$e[
$i]=
$r->r1."\n"
;
453fwrite(
$question,
$d[
$i]);
454fwrite(
$answer,
$e[
$i]);
455 }
456fclose(
$question);
457fclose(
$answer);
458 }
459460/* 两个数的加减除法 */461if((
$num1==2) && (
$mul=='f') && (
$div=='t'
))
462 {
463$question =
fopen("question.txt", "w"
);
464$answer=
fopen("answer.txt", "w"
);
465for(
$i=0;
$i<
$num;
$i++
)
466 {
467$j=0
;
468$bool=
true;
469$b[
$i]= addSubDiv(
$min,
$max,
$num1,
$r);
470while((
$r->r1)<0)
//当结果为负时,重新随机471 {
472$b[
$i]= addSubDiv(
$min,
$max,
$num1,
$r);
473 }
474while((
$bool) && (
$i!=0))
//避免重复475 {
476while(
$b[
$i]==
$b[
$j])
477 {
478$b[
$i]= addSubDiv(
$min,
$max,
$num1,
$r);
479while((
$r->r1)<0)
//结果为负,重新出题480 {
481$b[
$i]= addSubDiv(
$min,
$max,
$num1,
$r);
482 }
483$j=0
;
484 }
485$j++
;
486if(
$j==
$i)
487 {
488$bool=
false;
489 }
490 }
491echo "( ".(
$i+1)." ) ".
$b[
$i]."
"
;
492$d[
$i]=
$b[
$i]."\n"
;
493$e[
$i]=
$r->r1."\n"
;
494fwrite(
$question,
$d[
$i]);
495fwrite(
$answer,
$e[
$i]);
496 }
497fclose(
$question);
498fclose(
$answer);
499 }
500501/* 两个数的加减乘除法 */502if((
$num1==2) && (
$mul=='t') && (
$div=='t'
))
503 {
504$question =
fopen("question.txt", "w"
);
505$answer=
fopen("answer.txt", "w"
);
506for(
$i=0;
$i<
$num;
$i++
)
507 {
508$j=0
;
509$bool=
true;
510$b[
$i]= addSubMulDiv(
$min,
$max,
$num1,
$r);
511while((
$r->r1)<0)
//结果为负,重新出题512 {
513$b[
$i]= addSubMulDiv(
$min,
$max,
$num1,
$r);
514 }
515while((
$bool) && (
$i!=0))
//判断重复516 {
517while(
$b[
$i]==
$b[
$j])
518 {
519$b[
$i]= addSubMulDiv(
$min,
$max,
$num1,
$r);
520while((
$r->r1)<0)
//结果为负,重新出题521 {
522$b[
$i]= addSubMulDiv(
$min,
$max,
$num1,
$r);
523 }
524$j=0
;
525 }
526$j++
;
527if(
$j==
$i)
528 {
529$bool=
false;
530 }
531 }
532echo "( ".(
$i+1)." ) ".
$b[
$i]."
"
;
533$d[
$i]=
$b[
$i]."\n"
;
534$e[
$i]=
$r->r1."\n"
;
535fwrite(
$question,
$d[
$i]);
536fwrite(
$answer,
$e[
$i]);
537 }
538fclose(
$question);
539fclose(
$answer);
540 }
541542/* 三个数的加减法 */543if((
$num1==3) && (
$mul=='f') && (
$div=='f'
))
544 {
545$question =
fopen("question.txt", "w"
);
546$answer=
fopen("answer.txt", "w"
);
547for(
$i=0;
$i<
$num;
$i++
)
548 {
549$j=0
;
550$bool=
true;
551$b[
$i]= addSub(
$min,
$max,
$num1,
$r);
552while((
$r->r1)<0)
//结果为负,重新出题553 {
554$b[
$i]= addSub(
$min,
$max,
$num1,
$r);
555 }
556while((
$bool) && (
$i!=0))
//判断重复557 {
558while(
$b[
$i]==
$b[
$j])
559 {
560$b[
$i]= addSub(
$min,
$max,
$num1,
$r);
561while((
$r->r1)<0)
//结果为负,重新出题562 {
563$b[
$i]= addSub(
$min,
$max,
$num1,
$r);
564 }
565$j=0
;
566 }
567$j++
;
568if(
$j==
$i)
569 {
570$bool=
false;
571 }
572 }
573echo "( ".(
$i+1)." ) ".
$b[
$i]."
"
;
574$d[
$i]=
$b[
$i]."\n"
;
575$e[
$i]=
$r->r1."\n"
;
576fwrite(
$question,
$d[
$i]);
577fwrite(
$answer,
$e[
$i]);
578 }
579fclose(
$question);
580fclose(
$answer);
581 }
582583/* 三个数的加减乘法 */584if((
$num1==3) && (
$mul=='t') && (
$div=='f'
))
585 {
586$question =
fopen("question.txt", "w"
);
587$answer=
fopen("answer.txt", "w"
);
588for(
$i=0;
$i<
$num;
$i++
)
589 {
590$j=0
;
591$bool=
true;
592$b[
$i]= addSubMul(
$min,
$max,
$num1,
$r);
593while((
$r->r1)<0)
//结果为负,重新出题594 {
595$b[
$i]= addSubMul(
$min,
$max,
$num1,
$r);
596 }
597while((
$bool) && (
$i!=0))
//判断重复598 {
599while(
$b[
$i]==
$b[
$j])
600 {
601$b[
$i]= addSubMul(
$min,
$max,
$num1,
$r);
602while((
$r->r1)<0)
//结果为负,重新出题603 {
604$b[
$i]= addSubMul(
$min,
$max,
$num1,
$r);
605 }
606$j=0
;
607 }
608$j++
;
609if(
$j==
$i)
610 {
611$bool=
false;
612 }
613 }
614echo "( ".(
$i+1)." ) ".
$b[
$i]."
"
;
615$d[
$i]=
$b[
$i]."\n"
;
616$e[
$i]=
$r->r1."\n"
;
617fwrite(
$question,
$d[
$i]);
618fwrite(
$answer,
$e[
$i]);
619 }
620fclose(
$question);
621fclose(
$answer);
622 }
623624/* 三个数的加减除法 */625if((
$num1==3) && (
$mul=='f') && (
$div=='t'
))
626 {
627$question =
fopen("question.txt", "w"
);
628$answer=
fopen("answer.txt", "w"
);
629for(
$i=0;
$i<
$num;
$i++
)
630 {
631$j=0
;
632$bool=
true;
633$b[
$i]= addSubDiv(
$min,
$max,
$num1,
$r);
634while((
$r->r1)<0)
//结果为负,重新出题635 {
636$b[
$i]= addSubDiv(
$min,
$max,
$num1,
$r);
637 }
638while((
$bool) && (
$i!=0))
//判断重复639 {
640while(
$b[
$i]==
$b[
$j])
641 {
642$b[
$i]= addSubDiv(
$min,
$max,
$num1,
$r);
643while((
$r->r1)<0)
//结果为负,重新出题644 {
645$b[
$i]= addSubDiv(
$min,
$max,
$num1,
$r);
646 }
647$j=0
;
648 }
649$j++
;
650if(
$j==
$i)
651 {
652$bool=
false;
653 }
654 }
655echo "( ".(
$i+1)." ) ".
$b[
$i]."
"
;
656$d[
$i]=
$b[
$i]."\n"
;
657$e[
$i]=
$r->r1."\n"
;
658fwrite(
$question,
$d[
$i]);
659fwrite(
$answer,
$e[
$i]);
660 }
661fclose(
$question);
662fclose(
$answer);
663 }
664665/* 三个数的加减乘除法 */666if((
$num1==3) && (
$mul=='t') && (
$div=='t'
))
667 {
668$question =
fopen("question.txt", "w"
);
669$answer=
fopen("answer.txt", "w"
);
670for(
$i=0;
$i<
$num;
$i++
)
671 {
672$j=0
;
673$bool=
true;
674$b[
$i]= addSubMulDiv(
$min,
$max,
$num1,
$r);
675while((
$r->r1)<0)
//结果为负,重新出题676 {
677$b[
$i]= addSubMulDiv(
$min,
$max,
$num1,
$r);
678 }
679while((
$bool) && (
$i!=0))
//判断重复680 {
681while(
$b[
$i]==
$b[
$j])
682 {
683$b[
$i]= addSubMulDiv(
$min,
$max,
$num1,
$r);
684while((
$r->r1)<0)
//结果为负,重新出题685 {
686$b[
$i]= addSubMulDiv(
$min,
$max,
$num1,
$r);
687 }
688$j=0
;
689 }
690$j++
;
691if(
$j==
$i)
692 {
693$bool=
false;
694 }
695 }
696echo "( ".(
$i+1)." ) ".
$b[
$i]."
"
;
697$d[
$i]=
$b[
$i]."\n"
;
698$e[
$i]=
$r->r1."\n"
;
699fwrite(
$question,
$d[
$i]);
700fwrite(
$answer,
$e[
$i]);
701 }
702fclose(
$question);
703fclose(
$answer);
704 }
705706/* 四个数的加减法 */707if((
$num1==4) && (
$mul=='f') && (
$div=='f'
))
708 {
709$question =
fopen("question.txt", "w"
);
710$answer=
fopen("answer.txt", "w"
);
711for(
$i=0;
$i<
$num;
$i++
)
712 {
713$j=0
;
714$bool=
true;
715$b[
$i]= addSub(
$min,
$max,
$num1,
$r);
716while((
$r->r1)<0)
//结果为负,重新出题717 {
718$b[
$i]= addSub(
$min,
$max,
$num1,
$r);
719 }
720while((
$bool) && (
$i!=0))
//判断重复721 {
722while(
$b[
$i]==
$b[
$j])
723 {
724$b[
$i]= addSub(
$min,
$max,
$num1,
$r);
725while((
$r->r1)<0)
//结果为负,重新出题726 {
727$b[
$i]= addSub(
$min,
$max,
$num1,
$r);
728 }
729$j=0
;
730 }
731$j++
;
732if(
$j==
$i)
733 {
734$bool=
false;
735 }
736 }
737echo "( ".(
$i+1)." ) ".
$b[
$i]."
"
;
738$d[
$i]=
$b[
$i]."\n"
;
739$e[
$i]=
$r->r1."\n"
;
740fwrite(
$question,
$d[
$i]);
741fwrite(
$answer,
$e[
$i]);
742 }
743fclose(
$question);
744fclose(
$answer);
745 }
746747/* 四个数的加减乘法 */748if((
$num1==4) && (
$mul=='t') && (
$div=='f'
))
749 {
750$question =
fopen("question.txt", "w"
);
751$answer=
fopen("answer.txt", "w"
);
752for(
$i=0;
$i<
$num;
$i++
)
753 {
754$j=0
;
755$bool=
true;
756$b[
$i]= addSubMul(
$min,
$max,
$num1,
$r);
757while((
$r->r1)<0)
//结果为负,重新出题758 {
759$b[
$i]= addSubMul(
$min,
$max,
$num1,
$r);
760 }
761while((
$bool) && (
$i!=0))
//判断重复762 {
763while(
$b[
$i]==
$b[
$j])
764 {
765$b[
$i]= addSubMul(
$min,
$max,
$num1,
$r);
766while((
$r->r1)<0)
//结果为负,重新出题767 {
768$b[
$i]= addSubMul(
$min,
$max,
$num1,
$r);
769 }
770$j=0
;
771 }
772$j++
;
773if(
$j==
$i)
774 {
775$bool=
false;
776 }
777 }
778echo "( ".(
$i+1)." ) ".
$b[
$i]."
"
;
779$d[
$i]=
$b[
$i]."\n"
;
780$e[
$i]=
$r->r1."\n"
;
781fwrite(
$question,
$d[
$i]);
782fwrite(
$answer,
$e[
$i]);
783 }
784fclose(
$question);
785fclose(
$answer);
786 }
787788/* 四个数的加减除法 */789if((
$num1==4) && (
$mul=='f') && (
$div=='t'
))
790 {
791$question =
fopen("question.txt", "w"
);
792$answer=
fopen("answer.txt", "w"
);
793for(
$i=0;
$i<
$num;
$i++
)
794 {
795$j=0
;
796$bool=
true;
797$b[
$i]= addSubDiv(
$min,
$max,
$num1,
$r);
798while((
$r->r1)<0)
//结果为负,重新出题799 {
800$b[
$i]= addSubDiv(
$min,
$max,
$num1,
$r);
801 }
802while((
$bool) && (
$i!=0))
//判断重复803 {
804while(
$b[
$i]==
$b[
$j])
805 {
806$b[
$i]= addSubDiv(
$min,
$max,
$num1,
$r);
807while((
$r->r1)<0)
//结果为负,重新出题808 {
809$b[
$i]= addSubDiv(
$min,
$max,
$num1,
$r);
810 }
811$j=0
;
812 }
813$j++
;
814if(
$j==
$i)
815 {
816$bool=
false;
817