




已阅读5页,还剩13页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
目录一、 任务书*1二、 总体设计*2三、 模块划分*2四、 算法说明*2五、 函数模块功能*2六、流程图*3七、源程序清单*4八、程序测试*17九、结论*17附:参考文献资料一任务书题目:小学生数学辅助学习系统功能:实现小学生100以内四则运算的学习和测试基本要求: 1. 出现欢迎界面,选择加、减、乘、除或混合运算。2. 系统随机出题,运算数及结果均在100以内,以算式显示。3. 正确打个对勾,播放一段音乐,如果错误,打个红X,播放另一个音乐。4. 能统计正确率及得分。相关知识:图形绘制、按键操作等二.总体设计本次设计需要使用音乐函数、图形函数以及四则运算函数。首先使用图形函数,创建出一个欢迎界面。其次,在100以内,乘、除法应能整除,显示算式,再编写菜单练习,测试和计分及四则运算函数。最后是打印及退出。三.模块划分1. 欢迎界面模块。2. 算式模块。3. 菜单模块。4. 四则运算模块。5. 计分模块。6. 音乐模块。四.算法说明step1: 先定义音乐函数,包括音符的音长、频率及初始化扬声器,再编写出两段音乐。Step2: 定义菜单函数,并用printf输出。Step3: 先定义compute()函数,在其中嵌套switch语句,做随机数的四则运算。Step4: 定义一个Print()函数,当使用者答对或答错时,调用linerel()函数,做出相应的图像并显示。同时放出相应的乐曲,并做正确或错误题数的累积。Step5: 在主函数中,调用图形函数,设置一个欢迎界面。Step6: 调用菜单函数。Step7: 调用compute()函数,并用switch语句选择同号运算和混合运算。Step8:用printf打印结果。五.函数模块功能1 迎界面模块在此模块中,我首先定义了显示器及模式,然后通过setbkcolor()函数定义了背景颜色,用outtextxy()和settextstyle()函数定义了字符串输出的位置以及大小和字体。2 声音模块在此模块中,首先定义了音符的长短和频率。然后通过初始化扬声器,来得到每个音符。最后,根据自己的喜好,编写两段音乐。3 菜单模块在此模块中,首先用Menu()函数定义菜单。然后输入所需要的菜单目录,最后在主函数中调用Menu()4 四则运算模块在此函数中,通过调用switch语句,分成四种情况,每种运算符分别代表一种情况,而在这四种情况中,又分别调用switch语句,又分成四种情况,从而形成了三个数的四则运算。最后在主函数中调用这些情况。5 显示对错信息模块在此函数中,通过调用相应的图像和音乐,给使用者提供对错信息,并累加错误题数和正确题数。六、流程图 初始化图形显示模式 设棕色背景 输出“welcome” 输入菜单选项 读入选项mm=1m=2m=3m=4m=5m=6else直到随机产生a;b;c直到随机产生a;b;c直到随机产生a;b;c直到随机产生a;b;c随机op op2结束输出错误提示信息a+b+c=2a+b+c=2a+b+c=2a+b+c=2Op1Op2Op3Op4读入ANSWER值OP2=1OP2=2OP2=3OP2=4OP2=1OP2=2OP2=3OP2=4OP2=1OP2=2OP2=3OP2=4OP2=1OP2=2OP2=3OP2=4result=a+b+cresult=a-bcresult=a*b*cresult=a/b/c 产生随机a,b,c 计算机应result 读入answerN RESULTYANSWER 画错号,奏哀乐 画对号,奏欢歌 *w+ *r+ Score=(float)100/all)*r printf输出对题数,错题数,总题数和分数七.源程序清单 #include #include #include #include #include #include #include #define N1 64 /*定义音长 全音符音长*/#define N2 32 /*半音符的音长*/ #define N4 16 /*4分音符的音长*/ #define N8 8 /*8分音符的音长*/#define N16 4 /*16分音符的音长*/#define END 0 /*结束标志*/enum NDTES C10=131,D10=147,E10=165,F10=175,G10=196, A10=220,B10=247,C0=262,D0=296,E0=330,F0=349,G0=392, A0=440,B0=494,C1=523,D1=587,E1=659,F1=698, G1=784,A1=880,B1=988,C2=1047,D2=1175, E2=1319,F2=1397,G2=1568,A2=1760,B2=1976; /*定义音符与频率的对应关系*/song1=C0,N8,C0,N8,G0,N8,G0,N8,A0,N8,A0,N8,G0,N4, F0,N8,F0,N8,E0,N8,E0,N8,D0,N8,D0,N8,C0,N4, G0,N8,G0,N8,F0,N4,E0,N8,E0,N8,D0,N4, G0,N8,G0,N8,F0,N8,F0,N8,E0,N8,E0,N8,D0,N4, C0,N8,E0,N8,G0,N4,A0,N8,C1,N8,G0,N4, F0,N8,F0,N8,E0,N8,E0,N8,D0,N8,D0,N8,C0,N4,END,END; /*形成乐谱*/song2=C0,N8,D0,N8,E0,N8,F0,N8,G0,N8,A0,N8,B0,N8, C1,N8,D1,N8,E1,N8,F1,N8,G1,N8,A1,N8,B1,N8,END,END;void Menu(void) printf(1.+n); printf(2.-n); printf(3.*n); printf(4./n); printf(5.Mixedn); printf(6.Exitn); printf(Please enter your choice:);SONG1() int note=0,fre,dur,control; clock_t goal; while(song1note!=0) fre=song1note; /*取出乐谱数组中的频率*/ dur=song1note+1; /*取出乐谱数组中的音长*/ if(kbhit()break; /*如果有按键,则推出音乐播放*/ if(fre) outportb(0x43,0xb6); /*初始化扬声器端口*/ fre=(unsigned)(1193180L/fre); outportb(0x42,(char)(fre8); /*往扬声器端口送出声音频率值*/ outportb(0x42,(char)(fre8); control=inportb(0x61);outportb(0x61,(control)|0x3); /*开始发音*/ goal=(clock_t)dur+clock(); /*设定延迟时间*/ while(goalclock(); /*如果时间未到,等待;时间超出则退出*/ if(fre) outportb(0x61,control); /*停止发音*/ goal=(clock_t)0; note=note+2; /*移到下一个音符*/ SONG2() int note=0,fre,dur,control; clock_t goal; while(song2note!=0) fre=song2note; dur=song2note+1; if(kbhit()break; if(fre) outportb(0x43,0xb6); fre=(unsigned)(1193180L/fre);outportb(0x42,(char)(fre8); outportb(0x42,(char)(fre8); control=inportb(0x61);outportb(0x61,(control)|0x3); goal=(clock_t)dur+clock(); while(goalclock(); if(fre) outportb(0x61,control); goal=(clock_t)0; note=note+2; int Compute2(int a,int b,int c,int op ,int op2) /*定义一个新的运算符*/ int answer,result; switch(op) case 1: switch (op2) /*当OP为加号时,OP2为四种运算符*/ case 1: printf(%d+%d+%d=,a,b,c);result=a+b+c;break;case 2:printf(%d+%d-%d=,a,b,c);result=a+b-c;break;case 3:printf(%d+%d*%d=,a,b,c);result=a+b*c; break;case 4:printf (%d+%d/%d=,a,b,c); result=a+b/c; break; break; case 2: switch (op2) /*当OP为减号时,OP2为四种运算符*/ case 1: printf(%d-%d+%d=,a,b,c); result=a-b+c; break; case 2: printf(%d-%d-%d=,a,b,c); result=a-b-c; break; case 3: printf(%d-%d*%d=,a,b,c); result=a-b*c; break; case 4: printf (%d-%d/%d=,a,b,c); result=a-b/c; break; break; case 3: /*当OP为乘号时,OP2为四种运算符*/ switch (op2) case 1: printf(%d*%d+%d=,a,b,c); result=a*b+c; break; case 2: printf(%d*%d-%d=,a,b,c); result=a*b-c; break; case 3: printf(%d*%d*%d=,a,b,c); result=a*b*c; break; case 4: printf (%d+%d/%d=,a,b,c); result=a*b/c; break; break; case 4: /*当OP为除号时,OP2为四种运算符*/switch (op2)case 1:printf(%d+%d+%d=,a,b,c); result=a+b+c;break;case 2:printf(%d+%d-%d=,a,b,c); result=a+b-c;break;case 3:printf(%d+%d*%d=,a,b,c); result=a+b*c;break;case 4: printf (%d+%d/%d=,a,b,c); result=a+b/c; break; break; scanf(%d,&answer); if(result=answer)return 1; /*如果正确,返回值为1*/ elsereturn 0; /*如果错误,返回值为0*/void Print(int flag,int *r,int *w,int *all) if(flag) setcolor(RED); /*定义颜色*/ linerel(10,20); /*从当前点到相对增量点画一条线段*/ linerel(20,-20); +(*r); /*正确题数加1*/ SONG1(); /*放第一首歌*/ else setcolor(RED); linerel(30,20); moverel(-30,0); /*光标从当前位置移动到指定位置处,移动过程中不画点*/ linerel(30,-20);+(*w); /*错误题数加1*/ SONG2(); moverel(-30,16); +(*all); /*总数加1*/main() float score; char m; int a,b,c,op,d,r=0,w=0,all=0,i; int result,answer; int gdriver=VGA; /*选择VGA显示器*/ int gmode=VGAHI; /*选择VGAHI显示模式*/ int height,width; int exit_flag=0; unsigned char *temp1= WELCOME n; initgraph(&gdriver,&gmode,); /*初始化显示适配器*/ cleardevice(); /*清屏*/ setcolor(10); setbkcolor(BROWN); /*设置背景颜色*/ settextstyle(3,0,4); width=textwidth(temp1); width=textwidth(temp2); height=textheight(temp1); height=textheight(temp2); outtextxy(639-width)/2,150-height/2,temp1); /*设置字符串输出的位置*/ settextstyle(3,0,2); /*设置输出字符的字型,输出方向和字符大小*/ outtextxy(800-width)/2,400-height/2,temp2); getch(); /*获得一个字符*/ cleardevice(); Menu(); /*调用菜单函数*/ m=getchar(); /*获得一个字符并赋值给C*/ srand(time(NULL); /*设置一个随机数*/ moveto(108,112); /*设置光标起始位置*/ switch(m) case 1: for(i=0;i100); /*当结果在100之外,再次进入循环*/ printf(%d+%d+%d=,a,b,c); scanf(%d,&answer); result=a+b+c; if(result=answer) d=1; /*如果正确,返回值为1*/ else d=0; /*如果错误,返回值为0*/ Print(d,&r,&w,&all); break; case 2: for(i=0;i100|a-b-c0); /*当结果在100之外,0以下,再次进入循环*/ printf(%d-%d-%d=,a,b,c); scanf(%d,&answer); result=a-b-c; if(result=answer) d=1; /*如果正确,返回值为1*/ else d=0; /*如果错误,返回值为0*/Print(d,&r,&w,&all); break; case 3: for(i=0;i100); printf(%d*%d*%d=,a,b,c); scanf(%d,&answer); result=a*b*c; if(result=answer) d=1; /*如果正确,返回值为1*/ else d=0; /*如果错误,返回值为0*/ Print(d,&r,&w,&all); break; case 4: for(i=0;i10;i+) a=rand()%100+1; b=rand()%100+1; c=rand()%100+1; printf(%d/%d/%d=,a,b,c); scanf(%d,&ans
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论