C语言设计方案小学生数学辅助学习系统.docx
《C语言设计方案小学生数学辅助学习系统.docx》由会员分享,可在线阅读,更多相关《C语言设计方案小学生数学辅助学习系统.docx(18页珍藏版)》请在冰豆网上搜索。
C语言设计方案小学生数学辅助学习系统
一、任务书*************************************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”
输入菜单选项
读入选项m
m=1
m=2
m=3
m=4
m=5
m=6
else
直到
随机产生a。
b。
c
直到
随机产生a。
b。
c
直到
随机产生a。
b。
c
直到
随机产生a。
b。
c
随机opop2
结束
输出错误提示信息
a+b+c<=2
a+b+c<=2
a+b+c<=2
a+b+c<=2
Op1
Op2
Op3
Op4
读入ANSWER值
OP2=1
OP2=2
OP2=3
OP2=4
OP2=1
OP2=2
OP2=3
OP2=4
OP2=1
OP2=2
OP2=3
OP2=4
OP2=1
OP2=2
OP2=3
OP2=4
result<=a+b+c
result<=a-bc
result<=a*b*c
result<=a/b/c
产生随机a,b,c
计算机应result
读入answer
N
RESULT
Y
ANSWER
画错号,奏哀乐
画对号,奏欢歌
*w++
*r++
Score<=((float)100/all)*r
printf输出对题数,错题数,总题数和分数
七.源程序清单
#include
#include
#include
#include
#include
#include
#include
#defineN164/*定义音长全音符音长*/
#defineN232/*半音符的音长*/
#defineN416/*4分音符的音长*/
#defineN88/*8分音符的音长*/
#defineN164/*16分音符的音长*/
#defineEND0/*结束标志*/
enumNDTES
{
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}。
voidMenu(void)
{
printf("1.+\n")。
printf("2.-\n")。
printf("3.*\n")。
printf("4./\n")。
printf("5.Mixed\n")。
printf("6.Exit\n")。
printf("Pleaseenteryourchoice:
")。
}
SONG1()
{
intnote=0,fre,dur,control。
clock_tgoal。
while(song1[note]!
=0)
{
fre=song1[note]。
/*取出乐谱数组中的频率*/
dur=song1[note+1]。
/*取出乐谱数组中的音长*/
if(kbhit())break。
/*如果有按键,则推出音乐播放*/
if(fre)
{
outportb(0x43,0xb6)。
/*初始化扬声器端口*/
fre=(unsigned)(1193180L/fre)。
outportb(0x42,(char)(fre>>8))。
/*往扬声器端口送出声音频率值*/
outportb(0x42,(char)(fre>>8))。
control=inportb(0x61)。
outportb(0x61,(control)|0x3)。
/*开始发音*/
}
goal=(clock_t)dur+clock()。
/*设定延迟时间*/
while(goal>clock())。
/*如果时间未到,等待;时间超出则退出*/
if(fre)
outportb(0x61,control)。
/*停止发音*/
goal=(clock_t)0。
note=note+2。
/*移到下一个音符*/
}
}
SONG2()
{
intnote=0,fre,dur,control。
clock_tgoal。
while(song2[note]!
=0)
{
fre=song2[note]。
dur=song2[note+1]。
if(kbhit())break。
if(fre)
{
outportb(0x43,0xb6)。
fre=(unsigned)(1193180L/fre)。
outportb(0x42,(char)(fre>>8))。
outportb(0x42,(char)(fre>>8))。
control=inportb(0x61)。
outportb(0x61,(control)|0x3)。
}
goal=(clock_t)dur+clock()。
while(goal>clock())。
if(fre)
outportb(0x61,control)。
goal=(clock_t)0。
note=note+2。
}
}
intCompute2(inta,intb,intc,intop,intop2)/*定义一个新的运算符*/
{
intanswer,result。
switch(op)
{
case1:
switch(op2)/*当OP为加号时,OP2为四种运算符*/
{
case1:
printf("%d+%d+%d=",a,b,c)。
result=a+b+c。
break。
case2:
printf("%d+%d-%d=",a,b,c)。
result=a+b-c。
break。
case3:
printf("%d+%d*%d=",a,b,c)。
result=a+b*c。
break。
case4:
printf("%d+%d/%d=",a,b,c)。
result=a+b/c。
break。
}
break。
case2:
switch(op2)/*当OP为减号时,OP2为四种运算符*/
{
case1:
printf("%d-%d+%d=",a,b,c)。
result=a-b+c。
break。
case2:
printf("%d-%d-%d=",a,b,c)。
result=a-b-c。
break。
case3:
printf("%d-%d*%d=",a,b,c)。
result=a-b*c。
break。
case4:
printf("%d-%d/%d=",a,b,c)。
result=a-b/c。
break。
}
break。
case3:
/*当OP为乘号时,OP2为四种运算符*/
switch(op2)
{
case1:
printf("%d*%d+%d=",a,b,c)。
result=a*b+c。
break。
case2:
printf("%d*%d-%d=",a,b,c)。
result=a*b-c。
break。
case3:
printf("%d*%d*%d=",a,b,c)。
result=a*b*c。
break。
case4:
printf("%d+%d/%d=",a,b,c)。
result=a*b/c。
break。
}
break。
case4:
/*当OP为除号时,OP2为四种运算符*/
switch(op2)
{
case1:
printf("%d+%d+%d=",a,b,c)。
result=a+b+c。
break。
case2:
printf("%d+%d-%d=",a,b,c)。
result=a+b-c。
break。
case3:
printf("%d+%d*%d=",a,b,c)。
result=a+b*c。
break。
case4:
printf("%d+%d/%d=",a,b,c)。
result=a+b/c。
break。
}
break。
}
scanf("%d",&answer)。
if(result==answer)
return1。
/*如果正确,返回值为1*/
else
return0。
/*如果错误,返回值为0*/
}
voidPrint(intflag,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()
{
floatscore。
charm。
inta,b,c,op,d,r=0,w=0,all=0,i。
intresult,answer。
intgdriver=VGA。
/*选择VGA显示器*/
intgmode=VGAHI。
/*选择VGAHI显示模式*/
intheight,width。
intexit_flag=0。
unsignedchar*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。
i<10。
i++)/*设置问题数小于等于10*/
{
do
{
a=rand()%100+1。
/*随机产生一个小于100的数*/
b=rand()%100+1。
c=rand()%100+1。
}while(a+b+c>100)。
/*当结果在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。
i<10。
i++)
{do
{
a=rand()%100+1。
/*系统随机产生一个小于100的数*/
b=rand()%100+1。
c=rand()%100+1。
}while(a-b-c>100||a-b-c<0)。
/*当结果在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。
i<10。
i++)
{do
{
a=rand()%30+1。
/*系统随机产生一个小于30的数*/
b=rand()%30+1。
c=rand()%30+1。
}while(a*b*c>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'4':
for(i=0。
i<10。
i++)
{
a=rand()%100+1。
b=rand()%100+1。
c=rand()%100+1。
printf("%d/%d/%d=",a,b,c)。
scanf("%d",&answer)。
result=a/b/c。
if(result==answer)
d=1。
/*如果正确,返回值为1*/
else
d=0。
Print(d,&r,&w,&all)。
}
break。
case'5':
for(i=0。
i<10。
i++)
{
charop2。
/*进入混合运算*/
a=rand()%100+1。
b=rand()%100+1。
c=rand()%100+1。
op=rand()%4+1。
/*产生第一个随机运算符*/
op2=rand()%4+1。
/*产生第二个随机运算符*/
d=Compute2(a,b,c,op,op2)。
Print(d,&r,&w,&all)。
}
break。
case'6':
exit_flag=1。
break。
default:
printf("Inputerror!
\n")。
break。
}
if(exit_flag==0)
{
score=((float)100/all)*r。
/*计算所的所得分数*/
printf("Therightnumber:
%d\n",r)。
printf("Thewrongnumbre:
%d\n",w)。
printf("Theallnumber:
%d\n",all)。
printf("Thescoreis:
%f\n",score)。
}
getch()。
}_
八.程序测试
1.已完成出现欢迎界面,可以选择加、减、乘、除或混合运算
2.系统可以随机出题,以算式显示。
但满足不了运算数及结果均在100以内。
3.已完成正确打个对勾,播放一段音乐,错误,打个红X,播放另一个音乐。
4.已完成能统计正确率及得分
参考文献
苏小红等.C语言大学实用教程习题与实验指导.电子工业出版社.2004