4.心得体会
5.1在我们设计程序时候,将一个大的问题分成几个模块,运用不同的函数将这些模块分别设计出来,然后运用函数调用,我们就可以将这些功能不同的模块联系在一起。
5.2在设计程序过程中,我原先定义的变量 flag 为字符型,当输入y时继续做下题,输入n时退出系统,我发现无论按哪个字母,在看结果时候发现有两条继续测试请按1,退出测试请按0 :语句输出,后来经过老师的讲解我明白了,在连续的2个scanf函数中,以字符形式输入第一个scanf函数时候,回车键会以字符形式存储在第二个scanf函数中。
5.3要使计算机自动为学生出题,使用了函数srand((unsigned)time(NULL));这个函数调用中使用time(NULL)函数返回值(当前时间)作实参,初始化随机数发生器。rand()函数调用返回一个随机数,理论上说,rand()返回一个随机数,但是每次调用时,随机数发生器返回的随机数序列都是一样的,所以,用当前时间(time(NULL)返回值)作种子对随机数发生器进行初始化,由于每次当前时间不一样,所以随机数发生器产生的随机数序列不一样,即rand()函数调用的返回值不一样,就达到了得到真随机数而不是伪随机数的目的。
5.4深知自己技术水平还不高,编这样的程序遇到了很多困难,但我相信经过今后的不断学习,我的变成能力会有很大的提高。
srand((unsigned)time(NULL));/*srand((unsigned)time(NULL));这个函数调用中使用time(NULL)函数返回值(当前时间)作实参,初始化随机数发生器。*/
/* rand()函数调用返回一个随机数,理论上说,rand()返回一个随机数,但是每次调用时,随机数发生器返回的随机数序列都是一样的,所以,
用当前时间(time(NULL)返回值)作种子对随机数发生器进行初始化,由于每次当前时间不一样,所以随机数发生器产生的随机数序列不一样,
即rand()函数调用的返回值不一样,就达到了得到真随机数而不是伪随机数的目的。*/
printf(\小学生算术四则运算测试系统\\n\ while(1) {
printf(\请你选择测试题目的种类,只需输入数字代号:\\n\ printf(\加法 2.减法 3.乘法 4.除法\\n\ scanf(\
while(type!=1&&type!=2&&type!=3&&type!=4)/* 如果你不是输入的1 2 3 4中的一个,则需要重新输入 */ {
printf(\输入代号错误,请重新输入数字代号:\\n\ printf(\加法 2.减法 3.乘法 4.除法\\n\ scanf(\ }
answer=question_get();/* 通过函数调用返回计算机算出的正确答案 */
printf(\请输入你的答案:\\n\
scanf(\学生输入自己的答案
while(temp!=answer)/*判断学生的答案是否与正确的答案相同,若不同则需要输入正确答案,直到答案正确*/ {
printf(\答案错误,重做\\n\ printf(\请输入正确的答案:\\n\ scanf(\ }
printf(\答案正确,很好\\n\
printf(\继续测试请按1,退出测试请按0 : \\n\ scanf(\
while(flag!=1&&flag!=0) {
printf(\继续测试请按1,退出测试请按0 : \\n\ scanf(\ }
if(flag==0) break; } }
int question_get()/* 此函数作用为为小学生出题,并返回计算机算出的正确答案 */ {
int a,b,c; if(type==1) {
a=rand()?9;// a=rand()?9 则a一定小于999 b=999-a;//等效于数学中a+b=999
b=rand()%b;/* b=rand()%b 将b=999-a带入,得b=rand()%(999-a),b等于一个随机数对999-a取余,则b一定小于999-a,即b<999-a,也即保证了a+b<999 */
printf(\ return(a+b); }
/* 问题分析:
如果将if(type==1)整体改为: if(type==1) {
a=rand()?9; b=rand()?9;
printf(\ return(a+b);
} 会发现有时候做加法运算时,a+b的和会超过999,原因在于a和b均为小于999的数,但a+b可以超过999,如:998+998=?
b=999-a; b=rand()%b; 这两条语句成功解决了a+b可能大于999的问题 */
else if(type==2) {
b=rand()?9;//b小于999
c=999-b;//等效于数学中c+b=999
c=rand()%c;//将c=999-b代入其,得c=rand()%(999-b),从而保证c小于999-b,即c<999-b,也就保证b+c<999
printf(\已经保证小于999了 return(c); }
/* 问题分析:
如果此程序段改为: else if(type==2) {
b=rand()?9; c=rand()?9;
printf(\ return(b-c); }
则在做减法运算的时候可能会出现一个小的数减一个较大的数而造成结果为负数,例如:400-800=?
原程序段中c=999-b;和c=rand()%c; 成功将c定为了比b小的数,从而不会出现负数 */
else if(type==3) {
a=rand()P0;/* a小于500 由于a有可能等于0,如果a=0,那么后面的 语句b=1000/a不能执行 */
while(a==0)//此循环保证a不等于0且a小于500 {
a=rand()P0; }
b=1000/a;//等效于数学中b*a=1000
b=rand()%b;/* 将b=1000/a代入b=rand()%b,得b=rand()%(1000/a),则b一定小于1000/a,即b<1000/a,也就保证了a*b<1000 */ printf(\前面保证了a*b<1000 return(a*b); }
/* 问题分析:
如果此程序段改为:
else if(type==3) {
a=rand()P0; b=rand()P0;
printf(\ return(a*b); }
则在做乘法时候可能会出现乘积大于999的情况 例如:499*499=? 原程序段很好解决了这个问题,还可以将a=rand()P0;和