心算抢答系统.docx
《心算抢答系统.docx》由会员分享,可在线阅读,更多相关《心算抢答系统.docx(49页珍藏版)》请在冰豆网上搜索。
心算抢答系统
应用技术学院
课程设计报告
课程名称《C语言课程设计》
课题名称心算抢答系统
专业电气工程及其自动化
班级
学号
姓名
指导教师
2012年6月24日
湖南工程学院
课程设计任务书
课程名称《C语言课程设计》
课题心算抢答系统
专业班级电气工程及其自动化
学生姓名李福集
学号************
指导老师王颖
审批王颖
任务书下达日期:
2012年6月18日
任务完成日期:
2012年6月24日
第一部分《C语言课程设计》任务书
前言
《C语言程序设计》课程设计是对学生的一种全面综合训练,它包括问题分析,总体结构设计,用户界面设计,程序设计基本技能和技巧,多人合作,以至一整套软件工作规范的训练和科学作风的培养。
是与课堂听讲、自学和练习相辅相成的必不可少的一个教学环节。
通常,课程设计的课题比平时的习题复杂得多,也更接近实际。
课程设计着眼于与应用的结合点,使学生学会如何把书上学到的知识用于解决实际问题,培养软件工作所需要的动手能力;另一方面,能使书上的知识变“活”,使学生更好地深化理解和灵活掌握教学内容。
为了达到上述目的,本课程设计安排了八个设计课题,训练重点在于基本的程序设计方法和分析问题的能力,而不强调面面俱到。
学生可任选其中一题进行设计,设计完毕写出课程设计报告,用A4纸打印成册;并将课程设计报告与源程序存盘。
学习委员将课程设计报告与磁盘收齐后交指导老师。
一、目的
全面熟悉、掌握C语言基本知识,掌握C程序设计中的顺序、分支、循环三种结构及数组、函数和C语言基本图形编程等方法,把编程和实际结合起来,增强对不同的问题运用和灵活选择合适的数据结构以及算法描述的本领,熟悉编制和调试程序的技巧,掌握分析结果的若干有效方法,进一步提高上机动手能力,培养使用计算机解决实际问题的能力,养成提供文档资料的习惯和规范编程的思想,为以后在专业课程中应用计算机系统解决计算、分析、实验和设计等学习环节打下较扎实的基础。
二、设计要求
掌握结构化程序设计的主体思想,以自顶向下逐步求精的方法编制程序解决一些实际的问题,为将来编写软件积累一些典型的案例处理经验。
1、设计正确,方案合理。
2、界面友好,使用方便。
3、程序精炼,结构清晰。
4、设计报告5000字以上,含程序设计说明,用户使用说明,源程序清单及程序框图。
5、上机演示。
6、按学号顺序选课题号,并在规定的时间内独自完成相关课题的C源程序编写、调整和运行。
源程序及编译生成各文件均保存在软盘中;
7、按本任务书的要求,按附录的要求编写《课程设计报告》(Word文档格式)。
并用A4的复印纸打印并装订;
8、在2012年6月25日之前,请各班学习委员收齐课程设计报告和源程序软盘交王颖老师,联系电话:
8883238。
三、进度安排
第一周星期四:
课题讲解,查阅资料
第二周 星期一:
总体设计,详细设计
星期二:
编程,上机调试、修改程序
星期三:
上机调试、完善程序
星期四:
上机调试、完善程序
星期五:
答辩
星期六-星期天:
撰写课程设计报告
四、设计可调试过程规范化要求
1.需要分析
分析系统功能需求以及用户操作流程。
2.概要设计
在需要分析的基础上,确定系统总体框架(系统功能结构图)
3.详细设计
定义数据储存结构,并设计实现系统功能的具体算法,画出各算法的工作流程图。
4.代码设计
根据所设计的算法,定义相应函数分别实现系统的各子功能模块,同时由主程序提供友好的用户界面,使用户可通过选择主菜单来调用课程设计中要求完成的各个功能模块,子程序执行完后还可以返回主菜单,继续选择其他功能执行。
源程序要求书写规范,结构清晰。
重点函数的重点变量。
重点功能部分均要求给出清晰的程序注释
五、设计报告及书写内容要求
课程设计任务完成后,每位同学必须独立书写一份课程设计报告,注意:
不得抄袭他人的报告(或给他人抄袭),一旦发现,成绩为零分。
课程设计报告的内容应包括以下五个部分:
1.需求分析:
包括设计题目、设计要求以及系统功能需求分析;
2.概要设计:
包括系统总体设计框架和系统功能模块图;
3.详细设计:
包括主要功能模块的算法设计思路以及对应的工作流程图;
4.主要源程序代码:
包括存储结构设计说明,以及完整源程序清单;
5.调试分析过程描述:
包括测试数据、测试输出结果,以及对程序调试过程中存在的问题的思考(列出主要问题的的出错想象、出错原因、解决方法及效果等);
6.总结:
包括课程设计过程中的学习体会与收获,对C语言和本次课程设计的认识以及自己的建议等内容。
7.书写格式严格按所附要求书写。
附:
课程设计报告装订顺序:
封面、任务书、目录、正文、评分、附件(A4大小的图纸及程序清单)。
正文格式:
一级标题用3号黑体,二级标题用四号宋体加粗,正文用小四号宋体,行距22。
正文内容:
一、课题的主要功能;二、课题的功能模块可划分(要求画出模块图);三、主要功能的实现(至少要有一个主要模块的流程图);四、程序调试;五、总结;六、附件(所有程序的原代码,要求对程序写出必要的注释)。
正文总字数要求在5000字以上(不含程序源代码)。
六、课程设计报告的章节内容
1.需求分析。
2.概要设计。
3.详细设计。
4.源代码。
5.总结。
6.参考资料。
第二部分C语言课程设计报告书
需求分析…………………………………….........................................................8
一、课程设计题目:
…………………………………………………………….8
二、内容摘要:
………………………………………………………………….8
三、关键字:
…………………………………………………………………….8
四、总体设计方案的选定:
…………………………………………………….8
概要设计………………………………………………………………………….9
程序的模块组成以及各个函数的功能:
……………………………………….9
1、程序的模块组成:
…………………………………………………………...9
2、各函数的主要功能:
………………………………………………………...9
详细设计………………………………………………………………………..10
相关的数据类型:
……………………………………………………………...10
⑴main函数的下属子功能函数及其调用示意图……………………………..11
⑵子功能函数及其调用示意图………………………………………………...11
流程图……………………………………………………………………...........13
源程序清单………………………………………………………………...........15
心得体会…………………………………………………………………...........32
参考资料…………………………………………………………………...........33
第一章需求分析
1.1需求分析题目:
小学生心算抢答系统
1.2为什么开发:
为提高广大小学生学习数学的兴趣和心算能力,减少老师、家长的劳动强度,充分利用计算机资源,将枯燥的数学计算变得灵活有趣,寓教于乐,通过调查研究,并查阅了大量相关资料,拟开发一个简单的心算抢答系统。
要求该系统个人日常使用可锻炼心算能力,若组织进行抢答赛,能够使实现多个选手之间抢答,选手在抢答成功后,必须在规定的时间内完成答题。
同时各选手还可及时了解自己的得分及排名情况,组织者也可即时公布比赛成绩。
其功能包括:
选手抢答、四则简单计算、四则混合计算、显示选手得分、选手排名、设置、限制答题时间等。
1.3设计要求:
1.问题描述:
适用于小学生数学心算抢答赛。
比赛题型分为两种:
“四则简单运算”和“四则混合运算”,计算机随机出题,选手抢答。
要求进入每种题型比赛时,计算机均有提示,每队的记分窗口随得分情况而更新。
2.功能描述:
1)显示如下画面:
欢迎参加小学生心算抢答赛
按任意键开始比赛
2)举办单位确定参赛的队数,每队分配一个记分窗口,底分均为100分。
3)比赛题型分为两种:
“四则简单运算”(N道题)和“四则混合运算”(M道题),N、M由举办单位确定,计算机随机出题,先出“四则简单运算”题,每出一道,选手抢答,做对一题加5分,做错一题减5分。
后出“四则混合运算”,做对一题加10分,做错一题减10分。
要求进入每种题型比赛时,计算机均有提示,每队的记分窗口随得分情况而更新。
4)根据最后总分,由高到低宣布比赛名次,按任意键退出比赛系统。
5)要求整个设计以人为本,用户界面友好。
1.4系统功能需求分析:
该系统要达到以下功能要求:
1.出题形式为随机出题,每种题型的出现概率相等。
2.答题用抢答形式,在出现[请抢答]提示后,各队按下自己编号的按钮。
如:
当A队最先按下编号按钮,屏幕上将显示编号A,并由A队答题,其他队依此类推。
3.当抢到答题权后,每道题的答题时间为10秒(默认),答题时限可由举办方设定,如没在规定的时间内输入答案,则视为回答错误,将扣去相应分数。
4.比赛题型分为简单四则运算和混合四则运算,其中简单四则运算默认为5分一道,混合四则运算默认为10分一道,答对加上相应的分数,答错扣除相应分数,每题分值可重新设置。
5.每队底分初始值为100,可以重新设置,参赛队数(默认为3)和出题数目(默认为10)均可由举办方设定。
6.比赛结束后会显示成绩及排名,主菜单中第二项也可显示排名。
1.5需求分析的工具:
第二章概要设计
2.1总体设计方案的选定:
程序的功能:
要实现对心算抢答进行统一有效的管理需要通过用函数、数据类型、C语句(控制语句、函数调用语句、表达式语句、复合语句等)来实现。
由于是计算,很自然的要建立一个题库,而这个题库里的题目是随机的。
这个系统有很多个界面,这些界面的调用,最终是通过函数之间的调用来实现的。
2.2程序的模块组成以及各个函数的功能:
1.程序的模块组成:
主菜单函数、主函数:
voidmain();
自定义子菜单函数:
voidf();voidp1();voidp2();voidshezhi();
清屏函数:
voidclrscr();
自定义第一轮测试函数:
voidtest_1();
自定义第二轮测试函数voidtest_2();
光标定位函数:
voidgotoxy(int,int);
倒计时函数:
DWORDWINAPIdaojishi();
规则函数:
voidguize();
结束界面函数:
voidjieshu();
设置功能函数:
voidrenshu();voidtimu();voiddifen();voiddefen();
voidshixian();voidmoren();
成绩排名函数:
voidmark();
2.各函数的主要功能:
主函数:
显示主菜单;
自定义子菜单函数:
显示子菜单;
清屏函数:
清屏;
自定义第一轮测试函数:
随机出题,并输入选手的选号及答案,同时输出成绩,显示名次。
自定义第二轮测试函数:
随机出题,并输入选手的选号及答案,同时输出成绩,显示名次。
光标定位函数:
进行光标定位。
倒计时函数:
进行倒计时并输出结果。
规则函数:
输出比赛规则。
结束界面函数:
输出结束画面。
设置功能函数:
实现各种设置功能。
成绩排名函数:
进行成绩排名并输出。
2.3系统功能结构图
图2-1
第三章详细设计
3.1相关的数据类型:
intalgType_1=0,algType_2;/*计算类型*/
inti,j,n,m;/*循环变量*/
intpoints_1[PN+1],points_2[PN+1];/*选手得分*/
intnum1=0,num2=0,num_1,num_2,num_3;/*操作变量*/
intresult=0,/*结果*/
intanswer_1[PN+1],answer_2[PN+1];/*选手答案*/
inttotal[11];/*总成绩数组*/
intc1,c2,c3,c4;/*单题得分变量*/
intpn;/*队伍变量*/
intM,N;/*题数变量*/
intd;/*底分变量*/
inttime1;/*时限变量*/
intchoice;/*选择变量*/
3.2函数间的调用关系图如下:
1.main函数的下属子功能函数及其调用示意图
图3-1
2.子功能函数及其调用示意图
图3-2
图3-3
图3-4
图3-5
3.3流程图:
第四章系统调试
4.1调试进行
1.系统页面
2.进入系统
在选项中选择要进行的项目
3.进入基本设置选项
进行需要的设置,再返回。
4.进入比赛规则
了解比赛规则,再返回。
5.进入比赛系统
第一轮是简单计算,第二轮是混合运算。
6.选择简单运算
7.进行运算
8.查看结果
返回主菜单
9.结束
附录:
程序测试:
#include"stdio.h"
#include"windows.h"
#include"time.h"
intN=10,M=10,d=100,pn=3,total[11],choice;
intc1=5,c2=5,c3=10,c4=10,time1=11,bb;
/*函数说明*/
voidclrscr();
voidgotoxy(int,int);
voidrenshu();
voidtimu();
voiddifen();
voiddefen();
voidshezhi();
voidguize();
voidf();
voidp1();
voidp11();
voidp2();
voidp21();
voidjieshu();
voidshixian();
voidmark();
voidmoren();
DWORDWINAPIdaojishi(inttihao);
/*自定义清屏函数*/
voidmy_clear(intfg_color,intbg_color)
{
clrscr();
}
/*第一轮测试函数*/
voidtest_1()
{
intalgType_1=0,i,j,points_1[11]={0},num1=0,num2=0;
intresult=0,answer_1[11]={0};
for(i=1;i<=pn;i++)
{
total[i]=d;
points_1[i]=d;
/*设置底分*/
answer_1[i]=0;
}
for(i=1;i<=N;i++)
{
printf("\n\n");
printf("现在开始抢答,请看题:
");
num1=rand()%100;/*产生随机数*/
num2=rand()%100;
algType_1=rand()%4+1;
switch(algType_1)
{
case1:
result=num1+num2;/*加法计算*/
printf("\n\t\t\t\t%d+%d",num1,num2);
break;
case2:
if(num1>num2)/*减法计算*/
{
printf("\n\t\t\t\t%d-%d",num1,num2);
result=num1-num2;
}
else
{
result=num2-num1;
printf("\n\t\t\t\t%d-%d",num2,num1);
}
break;
case3:
result=num1*num2;/*乘法计算*/
printf("\n\t\t\t\t%d*%d",num1,num2);
break;
case4:
while(num2==0)/*除数不为0*/
num2=rand()%100;
result=num1/num2;/*除法计算*/
printf("\n\t\t\t\t%d/%d",num1,num2);
break;
}
printf("=?
\n");
printf("\t\t\t\t请输入编号:
");
scanf("%d",&j);
printf("\t\t\t\t%d队抢到答题权\n",j);
printf("\t\t\t\t剩余时间:
");
HANDLEthread=CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)daojishi,(LPVOID)i,NULL,NULL);//创建新线程
printf("\n\t\t\t\t请输入答案:
");
scanf("%d",&answer_1[j]);
TerminateThread(thread,0);//结束线程
if(answer_1[j]==result)
{
printf("\t\t\t\t回答正确!
\n\n");
printf("\t\t\t\t%d队加%d分!
\n",j,c1);
points_1[j]+=c1;
}/*积分*/
else
{
printf("\t\t\t\t回答错误!
\n");
printf("\t\t\t\t%d队减%d分!
\n",j,c2);
printf("\t\t\t\t正确答案是:
%d\n",result);
points_1[j]-=c2;
}
printf("\t\t\t%d队现在的得分是:
",j);
printf("%d队%5d\n",j,points_1[j]);/*输出得分*/
}
for(i=1;i<=pn;i++)
{
total[i]=points_1[i];
}
mark();
}
/*第二轮测试函数*/
voidtest_2()
{
intalgType_2=0,m,n,points_2[11]={0},num_1=0,num_2=0,num_3=0,result=0,answer_2[11]={0};
for(m=1;m<=pn;m++)
{
points_2[m]=d;
answer_2[m]=0;total[m]=d;
}
for(m=1;m<=M;m++)
{
printf("\n\n");
printf("现在开始抢答,请看题:
");
num_1=rand()%100;/*产生随机数*/
num_2=rand()%100;
num_3=rand()%100;
algType_2=rand()%7+1;
switch(algType_2)/*四则混合计算*/
{
case1:
result=num_1+num_2*num_3;
printf("\n\t\t\t\t%d+%d*%d",num_1,num_2,num_3);
break;
case2:
if((num_1+num_2)>num_3)
{
result=num_1+num_2-num_3;
printf("\n\t\t\t\t%d+%d-%d",num_1,num_2,num_3);
}
else
{
result=num_3-(num_1+num_2);
printf("\n\t\t\t\t%d-(%d+%d)",num_3,num_1,num_3);
}
break;
case3:
if(num_1*num_2>num_3)
{
result=num_1*num_2-num_3;
printf("\n\t\t\t\t%d*%d-%d",num_1,num_2,num_3);
}
else
{
result=num_3-num_1*num_2;
printf("\n\t\t\t\t%d-%d*%d",num_3,num_1,num_2);
}
break;
case4:
result=num_1+num_2+num_3;
printf("\n\t\t\t\t%d+%d+%d",num_1,num_2,num_3);
break;
case5:
while(num_3==0)/*除数不为0*/
num_3=rand()%100;
result=num_1+num_2/num_3;
printf("\n\t\t\t\t%d+%d/%d",num_1,num_2,num_3);
break;
case6:
if((num_1+num_3)>num_2)
{
result=num_1-num_2+num_3;
printf("\n\t\t\t\t%d-%d+%d",num_1,num_2,num_3);
}
else
{
result=num_2-num_1+num_3;
printf("\n\t\t\t\t%d-%d+%d",num_2,num_1,num_3);
}
break;
case7:
while(num_3==0)/*除数不为0*/
num_3=rand()%100;
if(num_1>(num_2/num_3))
{
result=num_1-num_2/num_3;
printf("\n\t\t\t\t%d-%d/%d",num_1,num_2,num_3);
}
else
{
result=num_2-num_1/num_3;
printf("\n\t\t\t\t%d-%d/%d",num_2,num_1,num_3);
}
break;
}
printf("=?
\n");
printf("\t\t\t\t请输入编号:
");
scanf("%d",&n);
printf("\t\t\t\t%d队抢到答题权\n",n);
printf("\t\t\t\t剩余时间:
");
HANDLEthread=CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)daojishi,(LPVOID)m,NULL,NULL);//创建新线程
printf("\n\t\t\t\t请输入答案:
");
scanf("%d",&answer_2[n]);
TerminateThread(thread,0);//结束线程