版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、武汉理工大学华夏学院课程设计课程名称C语言程序设计目口利用C语言开发一个“小学生算术四则运算测试系统”专业电子商务班级1091学号20510809105姓名张宇成绩指导教师杨沙、王绪梅2010年6月28日至2010年7月2日课程设计任务书设计题目:利用C语言开发一个“小学生算术四则运算测试系统”设计目的加深对C语言程序设计课程所学知识的理解;掌握结构化程序设计的基本方法;学会编制结构清晰、风格良好、数据结构选择恰当的C语言程序;掌握多模块的C语言程序的调试方法。设计任务(在规定的时间内完成下列任务)任务描述:利用C语言开发一个“小学生算术四则运算测试系统”该系统是让计算机充当一位给小学生布置作
2、业的算术老师,为学生出题、阅卷该系统应具备以下功能:为小学生出题(分别进行+、一、*、三等不同运算)学生做题后,进行评阅;学生每做一题后,评阅时给出“答题正确,很好”或“答题错误,重做”等字样;力口、减、乘、除运算功能可以自由选择实现;运算数值可以控制在两位(或三位)数的四则运算范围内。具体要完成的任务是:1完成整个规定任务的设计及调试,得出正确结果,并经教师检查及答辩;写出规范的课程设计说明书;课程设计结束后交设计说明书等文档和设计内容。设计说明书的主要内容是详细写出在设计过程中所用到的主要技术或方法;4从6月28日起,学生每天至少要到设计教室半天以上;课程设计报告按国际通用格式书写,具体格
3、式要求请在网络上查阅时间安排6月28日上午1-103教室动员全体学生,给学生下任务书;下午查阅相关资料;6月29日7月1日完成选题的设计及报告的书写;7月2日上午提交课程设计报告并答辩。指导教师签名:教研室主任(或责任教师)签名:2010年6月27日2010年6月27日1、问题描述1.1在最开始设计此程序过程中,我定义的变量flag为字符型,当把原程序段中对应于下面的程序段的程序段改为:scanf(%d,&temp);while(temp!=answer)printf(n答案错误,重做n);printf(n请输入正确的答案:n);scanf(%d,&temp);printf(n继续请按y,退出
4、测试请按nn);scanf(%c,&flag);while(flag!=y&flag!=n)printf(n继续请按1,退出测试请按0n);scanf(%d,&flag);我将会发现当我做完一题且做对了的时候,无论我输入的是y还是n或者是其他的字符,printf(n继续请按1,退出测试请按0n)这个提示在屏幕上出现两次,说明了在第一个scanf(%c,&flag)语句中无论什么,flag!二y&flag!二n都是成立的,这说明了在第一个scanf(%c,&flag)中输入的字符并没有赋给flag。为了修改正确,我询问了指导老师,后来才知道执行语句scanf(%d,&temp)时候,小学生会输入
5、一个数字,然后在按回车键,在执行语句scanf(%c,&flag)时这个是回车键被赋给了变量flag,而不是输入的字符给了变量flag,此时语句flag!二y&flag!二n不成立,就会造成循环语句while(flag!=y&flag!二n)一定会执行一次,也就造成了上述结果。后来我将定义的字符型变量flag改成了整形,并且当输入1时继续做题,当输入0时退出系统,当输入的其他的数字时候,就会被提示输入错误,且要求重新输入。这样修改后就达到了上述目的。1.2最开始我没有调用函数srand(unsigned)time(NULL)结果发现连续做两道相同算法的题目时,两次的题目完全一样,也就说明了此程
6、序并不能随机的出题,后来使用了函数srand(unsigned)time(NULL)。srand(unsigned)time(NULL)这个函数调用中使用time(NULL)函数返回值(当前时间)作实参,初始化随机数发生器。rand()函数调用返回一个随机数,理论上说,rand()返回一个随机数,但是每次调用时,随机数发生器返回的随机数序列都是一样的,所以,用当前时间(time(NULL)返回值)作种子对随机数发生器进行初始化,由于每次当前时间不一样,所以随机数发生器产生的随机数序列不一样,即rand()函数调用的返回值不一样,就达到了得到真随机数而不是伪随机数的目的,也就成功解决了这个问题。
7、1.3其他的问题描述见附件1中的question_get()函数中注释中的问题分析部分。2、详细设计4.1设计一个函数intquestion_get();,此函数的主要功能是为小学生出题(分别进行+,*,/等不同运算),并且保证给出的算式中的数字和结果均不超过三位数。系统自动计算出正确的答案,然后此正确的答案赋给变量answer。4.2通过调用函数srand(unsigned)time(NULL);初始化随机数发生器,使rand()函数调用的返回值不一样,这样就使连续做同一种算法时,系统两次给出的算式不相同。4.3程序中有一个while(1)和其循环体中的if(flag=O)break;语句,
8、学生可以选择退出程序或者继续做题。4.4在main()函数外定义一个外部变量type,此变量表示小学生选择题目的类型,当选择1时候需要做加法运算,选择2时候做减法运算,选择3做乘法运算,选择4做除法运算,当选择的不是1234中的一个数时,通过使用while语句要求小学生输入正确的题目类型代号。4.5提示要求小学生输入自己的答案,并将小学生输入的答案赋给变量temp,然后用while(temp!二answer)语句判断小学生输入的答案是否与正确答案相同,如果不同则通过此while的循环体提示答案错误,要求重新输入正确答案,直到输入的答案正确后提示答案正确;如果小学生一开始输入的答案是正确的则直接
9、提示答案正确。4.6定义了一个变量flag,当给flag赋值1时可以继续做题,赋值为0时通过break语句退出整个循环while(1),此时也就退出了测试系统。4.7设计函数question_get(),首先在main()函数作函数声明,然后开始设计此函数,考虑到当小学生输入数字1需要做加法运算,输入2时候做减法运算,输入时3做乘法运算,输入4时做除法运算,所以通过条件ifelse语句分情况设计算法。实验环境Microsoftvisualc+程序调试源程序:#include#include#includetime.h/用到了time()函数,所以要包含time.h头文件/srand(time(
10、NULL)中的time(NULL)就是time函数调用inttype;main()intquestion_get();/函数声明intanswer;inttemp;intflag;退出0type=l非0type=20type=3非0b=0a=0非000)c!=00printf(n%d+%d=?”,a,b);return(a+breturn(c);question_get()函数”,b+c,b);printf(n%d-%d=?/printf(n%d*%d=?,a,b);c=rand()%500printf(”n%d/%d=?,b*return(c);a=rand()%999;b=999-a;函数
11、调用处inta,b,c;a=rand()%500;b=rand()%999;c=999-b;c=rand()%c;b=rand()%500;b=1000/a;b=rand()%500;b=rand()%bc=1000/b;a=rand()%50函数调用处函数调用处函数调用处return(a*b)break;X:ProgramFiPesWC*1学生算术四则运算测试系统请祢选择测试題目的种红只需输入数字代号匸:L加法茲撼法汉乘法锂除法1G4*-730?朋输人惋的答菸77-1答棊正晩很好继续測试请按退出洌试请按回=1也你选澤测试題目的种無只需输入数宇代号三丄加法址磁法3泰铉锐除法RC:Program
12、FllesVCXMyProjecrtsXxcXDebugxc.e?e继缰测试请按:L亠退出测试请按0=1请饰选扌睪测试题目的种类,只需输人数字代号占1-ioii诚法3乘法4除法232X2=?请输入饰的答案二8答秦正磺,很好継绩测试请按:L亠退出测试请按0=1请你选痒测试题目的种粪,只需输入裁字代号*:L加法2减法3乘法4除法H1_4425=?请输入你的答案=CiXPnogramFilesVCFv1yProjecs3ccDebngXc-exe”青你选择测试题目的种类,只需输入數字代号:加法诚法3乘法4除法S酎入代号错误,请童新输人数字代号二L加法送-诚法3乘法4降法r?0035=?E青输人你的答
13、乗=Q0忖累正确,很好継綾扌则试请按:L亠退出测试请按日=0Press日n_yke_ytocont:nue4.心得体会5.1在我们设计程序时候,将一个大的问题分成几个模块,运用不同的函数将这些模块分别设计出来,然后运用函数调用,我们就可以将这些功能不同的模块联系在一起。5.2在设计程序过程中,我原先定义的变量flag为字符型,当输入y时继续做下题,输入n时退出系统,我发现无论按哪个字母,在看结果时候发现有两条继续测试请按1,退出测试请按0:语句输出,后来经过老师的讲解我明白了,在连续的2个scanf函数中,以字符形式输入第一个scanf函数时候,回车键会以字符形式存储在第二个scanf函数中。
14、5.3要使计算机自动为学生出题,使用了函数srand(unsigned)time(NULL);这个函数调用中使用time(NULL)函数返回值(当前时间)作实参,初始化随机数发生器。rand()函数调用返回一个随机数,理论上说,rand()返回一个随机数,但是每次调用时,随机数发生器返回的随机数序列都是一样的,所以,用当前时间(time(NULL)返回值)作种子对随机数发生器进行初始化,由于每次当前时间不一样,所以随机数发生器产生的随机数序列不一样,即rand()函数调用的返回值不一样,就达到了得到真随机数而不是伪随机数的目的。5.4深知自己技术水平还不高,编这样的程序遇到了很多困难,但我相信
15、经过今后的不断学习,我的变成能力会有很大的提高。srand(unsigned)time(NULL);/*srand(unsigned)time(NULL);这个函数调用中使用time(NULL)函数返回值(当前时间)作实参,初始化随机数发生器。*/*rand()函数调用返回一个随机数,理论上说,rand()返回一个随机数,但是每次调用时,随机数发生器返回的随机数序列都是一样的,所以,用当前时间(time(NULL)返回值)作种子对随机数发生器进行初始化,由于每次当前时间不一样,所以随机数发生器产生的随机数序列不一样,即rand()函数调用的返回值不一样,就达到了得到真随机数而不是伪随机数的目的
16、。*/printf(ttt小学生算术四则运算测试系统n);while(1)printf(n请你选择测试题目的种类,只需输入数字代号:n);printf(nl.加法2.减法3.乘法4.除法n);scanf(%d,&type);while(type!=1&type!=2&type!=3&type!=4)/*如果你不是输入的1234中的一个,则需要重新输入*/printf(n输入代号错误,请重新输入数字代号:n);printf(nl.加法2.减法3.乘法4.除法n);scanf(%d,&type);answer=question_get();/*通过函数调用返回计算机算出的正确答案*/printf(
17、n请输入你的答案:n);scanf(%d,&temp);/学生输入自己的答案while(temp!二answer)/*判断学生的答案是否与正确的答案相同,若不同则需要输入正确答案,直到答案正确*/printf(n答案错误,重做n);printf(n请输入正确的答案:n);scanf(%d,&temp);printf(n答案正确,很好n);printf(n继续测试请按1,退出测试请按0:n);scanf(%d,&flag);while(flag!=1&flag!=0)printf(n继续测试请按1,退出测试请按0:n);scanf(%d,&flag);if(flag=0)break;intque
18、stion_get()/*此函数作用为为小学生出题,并返回计算机算出的正确答案*/inta,b,c;if(type=1)a二rand()%999;/a二rand()%999则a定小于999b=999-a;/等效于数学中a+b=999b=rand()%b;/*b=rand()%b将b=999-a带入,得b=rand()%(999-a),b等于一个随机数对999-a取余,则b定小于999-a,即b999-a,也即保证了a+b999*/printf(n%d+%d=?,a,b);return(a+b);/*问题分析:如果将if(type=l)整体改为:if(type=1)a=rand()%999;b=
19、rand()%999;printf(n%d+%d=?,a,b);return(a+b);会发现有时候做加法运算时,a+b的和会超过999,原因在于a和b均为小于999的数,但a+b可以超过999,如:998+998二?b=999-a;b=rand()%b;这两条语句成功解决了a+b可能大于999的问题*/elseif(type=2)b=rand()%999;/b小于999c=999-b;/等效于数学中c+b=999c=rand()%c;/将c=999-b代入其,得c=rand()%(999-b),从而保证c小于999-b,即c999-b,也就保证b+c999printf(n%d-%d二?,b+
20、c,b);/b+c已经保证小于999了return(c);/*问题分析:如果此程序段改为:elseif(type=2)b=rand()%999;c=rand()%999;printf(n%d-%d=?,c,b);return(b-c);则在做减法运算的时候可能会出现一个小的数减一个较大的数而造成结果为负数,例如:400-800=?原程序段中c=999-b;和c二rand()%c;成功将c定为了比b小的数,从而不会出现负数*/elseif(type=3)a二rand()%500;/*a小于500由于a有可能等于0,如果a=0,那么后面的语句b=1000/a不能执行*/while(a=0)/此循环
21、保证a不等于0且a小于500a=rand()%500;b=1000/a;/等效于数学中b*a=1000b=rand()%b;/*将b=1000/a代入b=rand()%b,得b=rand()%(1000/a),则b一定小于1000/a,即b1000/a,也就保证了a*b1000*/printf(n%d*%d二?,a,b);/前面保证了a*b1000return(a*b);/*问题分析:如果此程序段改为:elseif(type=3)a=rand()%500;b=rand()%500;printf(n%d*%d=?,a,b);return(a*b);则在做乘法时候可能会出现乘积大于999的情况例如
22、:499*499=?原程序段很好解决了这个问题,还可以将a=rand()%500;和b=rand()%500;语句改为a=rand()%30和b=rand()%33;不过这样改不会出现乘数和被乘数至少有一个大于33的情况,例如:45*458=?*/elseb=rand()%500;/b小于500由于b有可能等于0,如果b=0,那么后面的语句c=1000/b不能执行while(b=0)/此循环保证b不等于0且b小于500b=rand()%500;c=1000/b;/等效于数学中b*c=1000while(1)/保证执行循环体后c不等于0c=rand()%c;/将c=1000/b代入,得c=ran
23、d()%(1000/b),则c一定小于1000/b,保证了b*c1000if(c!=0)/保证c不等于0break;printf(n%d/%d二?,b*c,b);/前面已近保证b*c1000且c已近保证不等于0,若没有保证c不等于0,则会return(c);/*问题分析:如果将此程序段改为:elseb=rand()%500;while(1)c=rand()%500;if(c!=0)break;printf(n%d/%d=?,b*c,b);return(c);因为b=rand()%500;所以b有可能为0,所以b*c为0,所以在做除法的时候会出现0除以0的情况,例如0/0=?这样的计算在数学中没
24、有意义,而计算机返回的答案是0*/设计过程中现场提问(或答辩)记载:除法运算中是如何保证算法除尽的?答:除法程序段为:elseb=rand()%500;while(b=O)此循环保证b不等于0且b小于500b=rand()%500;c=1000/b;while(l)c=rand()%c;if(c!=0)break;printf(%d/%d=?,b*c,b);return(c);rand()返回一个随机正整数,利用随机数对500求余数,所得的余数赋给b,则b是小于500的正整数,通过循环保证b不等于0,将语句c=1000/b;代入语句c=rand()%c;中,则可以认为c=rand()%(100
25、0/b),那么c一定是小于1000/b的正整数,且b*c一定小于999。通过循又环保证了c不等于0,printf(%d/%d=?,b*c,b);语句中b*c为一整数,用它除以整数b,则答案为整数c,所以除法运算可以除尽。如果要求系统规定小学生做完多少道题目后(例如20道题后)自动退出系统且需要统计小学生做对以及做错的个数,如何实现?答:只需要将main()函数修改为:main()intquestion_get();intanswer;inttemp;intn=1;intright;intwrong;intflag;srand(unsigned)time(NULL);printf(ttt小学生算术四则运算测试系统n);right=0;wrong=0;while(nv=20)printf(n请你选择测试题目的种
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《龙湖葵花宝典培训》课件
- 经济效益的年度跟踪计划
- 《数据图示饼》课件
- 沿海工程防护设备采购合同三篇
- 内部激励措施的年度优化计划
- 《通信技术原理》课件
- 冷拔钢相关行业投资方案
- 合结钢行业相关投资计划提议
- 食品加工合同三篇
- 《液压与气动》课件 1气动系统概述
- 2024年大学计算机基础考试题库附参考答案(完整版)
- 《旅游财务管理》课件-3货币的时间价值
- “奔跑吧·少年”重庆市第三届幼儿体育大会幼儿体适能活动规程
- 2024版国开电大专科《中国古代文学(下)》在线形考(形考任务1至5)试题及答案 (二)
- Q GDW 11445-2015 国家电网公司管理信息系统安全基线要求
- 自我效能感研究综述
- 简洁合伙协议书模板(标准版)
- 人教版四年级上下册英语单词默写表(汉译英)
- 政府会计-课后习题参考答案 童光辉
- 音乐节演出合作协议书
- 《学写文学短评》统编版高一语文必修上册
评论
0/150
提交评论