VC++课程设计小学生算术练习软件.docx
《VC++课程设计小学生算术练习软件.docx》由会员分享,可在线阅读,更多相关《VC++课程设计小学生算术练习软件.docx(22页珍藏版)》请在冰豆网上搜索。
VC++课程设计小学生算术练习软件
小学生算术练习软件
《VisualC++程序设计》是计算机科学与技术专业的必修专业基础课程,其实践性、应用性很强。
实践教学环节是必不可少的一个重要环节。
VC++程序设计的设计目的是加深对理论教学内容的理解和掌握,使学生较系统地掌握程序设计及其在网络开发中的广泛应用,基本方法及技巧,为学生综合运用所学知识,利用软件工程为基础进行软件开发、并在实践应用方面打下一定基础。
要求学生在设计指导教师的帮助下自行完成各个操作环节,并能实现且达到举一反三的目的,完成一个项目解决一类问题。
要求学生能够全面、深入理解和熟练掌握所学内容,并能够用其分析、设计和解答类似问题对此能够较好地理解和掌握,能够进行简单分析和判断,能编写出具有良好风格的程序,掌握VC++程序设计的基本技能和面向对象的概念和方法,了解菜单、视图/文档、数据库等编程技术。
同时培养学生进行分析问题、解决问题的能力,培养学生进行设计分析、设计方法、设计操作与测试、设计过程的观察、理解和归纳能力的提高。
提高和加强自己的计算机应用与软件开发能力,使自己由初学者向专业的程序员过渡。
培养自己独立分析问题、解决问题、查阅资料以及自学能力,以适应计算机产业日新月异发展的形势。
学习和掌握VisualC++程序设计方法以及上机调试技巧,为今后学习其它专业课程打好坚实的基础。
检测自己在这一学期对MFC的学习及掌握情况。
知道自己的不足,及时的弥补,也为自己以后如何制定学习计划做一铺垫。
VC++程序设计课程设计是计算机科学与技术专业的《VC++程序设计》课程的综合性实践环节。
VC++程序设计是一门实用性很强的学科,是进行软件开发的主要工具,只有进行实际操作,才能将理论知识和实际应用有机的结合起来,锻炼学生分析解决实际问题的能力,提高学生实际运用的能力,为学生毕业设计,日后工作中的软件开发打下良好的基础。
2.设计方案论证
需求分析
基于MFC设计一个小学生进行四则运算的算术练习软件,要求用户界面方便、友好。
软件需要完成如下功能:
小学生上机练习时,可以根据自身情况选择不同的难度题目进行练习;每次计算机为小学生出多道题目让学生作答,根据完成答案的正确率与完成时间给出不同的分数;设立一个计时器,记录完成题目所用时间;计算完题目后,给出做题的分析结果,包括对错题数,每道题做对所使用的计算机会,完成题目所用时间以及总成绩等详细信息。
设计思路
小学生上机练习时,可以选择三个练习等级A,B,C中的一种,其中A级为一位数加减乘除运算,B级为两位数加减乘除运算,C级为三位数加减乘除运算。
每次练习计算机为小学生出10个加减乘除运算题目(10道题中分布有加减乘除题目),每个题目有三次计算机会,第一次算对加10分,接着出第二题目;第一次不对,第二次出同样的题目,若算对加8分,接着出第二个题目,若不对再给第三次机会,作对加5分,做不对不加分。
每题只有三次计算机会,依此类推。
设立一个计时器,记录10道题目所用时间。
计算完10个题目后,给出做题分析结果,包括对错题数,每道题做对所使用的计算机会,10道题目所用时间,总成绩。
设计方法
根据需求,设计该软件的主要功能如下:
(1)能用于小学生的四则运算练习,提高小学生的计算能力;
(2)小学生上机练习时,可以选择三个练习等级A,B,C中的一种,其中A级为一位数加减乘除运算,B级为两位数加减乘除运算,C级为三位数加减乘除运算;
(3)每次练习计算机为小学生出10个加减乘除运算题目(10道题中分布有加减乘除题目),每个题目有三次计算机会(第一次算对加10分,接着出第二题目;第一次不对,第二次出同样的题目,若算对加8分,接着出第二个题目;第二次若不对再给第三次机会,作对加5分,做不对不加分。
每题只有三次计算机会,依此类推);
(4)该软件设有计时器,能查看小学生做完10道题目所花的总时间,用于综合评分;
(5)学生做完题后可以点击“评分说明”菜单里的“查看成绩”,查看该次的成绩,成绩单里包括每题的表达式,三次的答案,对错题数,答题时间,以及评分标准等;
(6)该软件利用了文件存储,能将每个等级的最佳成绩存在文件中,以便和其他用户进行对比,提高成绩;
(7)在答题的过程中,如果想回到主菜单重新进行选择,则只需点击“操作”菜单里的“回到主菜单”即可。
如果想退出程序,则只需点击“退出软件”即可。
功能模块设计
主对话框的设计
主对话框包含菜单栏和主窗口。
其中菜单栏包含三个菜单:
软件说明、评分说明、意见反馈。
“软件说明”菜单包含“软件简介”、“退出软件”两个子菜单。
其中“软件简介”用以调用软件简介对话框,使新用户对该软件熟悉,减少用户使用的熟悉期;“退出软件”用以从界面正常退出该软件,退出前用文件保存最佳成绩。
“评分说明”菜单包含“题型设置”、“查看成绩”、“最佳成绩”三个子菜单。
其中“题型设置”向用户介绍该软件的题型、题量、等级、出题方式、方法等,方便用户正确做出选择,能更好的利用该软件;“查看成绩”用于在用户做完10道题后查看所得分数。
如果没有答题或答题中途返回主对话框,则用于存储信息的链表为空,不能显示成绩;“最佳成绩”向现用户展示以往用户的最佳成绩,用于比较,可以起到激励的作用,同时,使软件更加实用和友好。
“意见反馈”菜单提供了软件制作者的联系方式,可以让用户和编程者进行交流,方便编程者不断对软件进行改进。
主窗口中的单选按钮用于向用户展示本软件的题型,方便用户选用。
该对话框的测试按钮(即“开始”),调用了GetTickCount()函数,用于实现计时器的功能。
答题对话框的设计
答题窗口由主对话框进行调用,连续调用十次。
每次调用所得的题目都是由计算机随机出的,利用了rand()函数。
该对话框的最核心函数即为提交按钮的响应函数,当用户完成运算,将答案输入到光标所在的文本框即可进入下一次调用,同时,在答完题后按回车也可调用。
该函数实现了让用户有三次答题机会的功能,但每次的给分不同。
在答对的情况或者三次都答错的情况下,利用链表将数据存在内存中,方便显示成绩单。
该链表采用的是头插法。
当用户未向答题框输入答案单击“下一题”按钮或回车时,系统弹出“请输入答案!
”的提示框提醒用户输入答案,避免因点击过快造成的错误而影响最终成绩的情况发生。
该对话框上附有操作按钮,方便用户在答题过程中临时变换所选题目等级,以及随时正确退出该软件,使用户用得方便自如。
在答完十道题后自动调用成绩单对话框,便于用户查看成绩。
成绩单对话框的设计
该对话框将用户所做的十道题的做题细则完全的显示出来。
用户做每道题的时候都有三次答题机会,成绩单会将每道题的三次答案以及最终得分都显示在列表中,一目了然,方便用户进行总结和纠错。
列表的右侧附有该软件的评分标准,供用户参考,帮助用户提高成绩。
下方列有对错题数、所用总时间、总成绩以及以往用户在所选等级段的最佳成绩,方便用户进行比较。
浏览完成绩单后点击“确定”按钮或直接关闭成绩单返回主对话框界面。
主要数据结构
由于该软件运行完毕后还要在成绩单中显示每次做题的细节,因此,必须用数据结构将每道题目的所有数据都存起来。
该软件采用了类链表这一数据结构来存数据。
用类CExpression来存每道题目的所有数据,包括:
表达式,三次做题答案,正确答案、该题得分等信息。
文件存储
文件的存储格式主要有文本格式和二进制格式。
文本格式的一个显著优点是可以用文本编辑软件(如记事本)打开文件进行观察和读取。
与文本格式不同,二进制格式不能简单的将文件打开编辑。
但二进制文件读取速度快,并且能够利用MFC库进行序列化,是主流的文件输出格式。
本软件采用的是文本格式。
用于存取各个用户的最佳成绩,方便不同用户之间进行比较,交流。
类与函数的设计与实现
(1)主对话框类
classCDXDDlg:
publicCDialog
{
//Construction
public:
CDXDDlg(CWnd*pParent=NULL);//standardconstructor
…
afx_msgvoidOnExitMain();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
(2)答题对话框类(用于用户的练习)
classCCalculateDlg:
publicCDialog
{
//Construction
public:
CCalculateDlg(CWnd*pParent=NULL);//standardconstructor
…
afx_msgvoidOnReturn();
afx_msgvoidOnExit();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
其中,OnButtonHand()(提交函数,用于处理答案)为核心函数。
使用户能有三次答题机会。
在该函数里还运用了链表的头插法来存数据。
在初始化函数内运用了生成随机表达式的算法。
具体如下:
第一个数、第二个数以及运算符都有rand()函数随机生成,再将这三个元素组合起来,加以判断,如果是一个小学生范围内的算术题,则将它作为一道题目,否则,再出一道。
该类里还编写了对话框的刷新函数RefreshDlg(),在用户答错的情况下刷新对话框。
(3)成绩单对话框类(用于将数据显示出来)
classCRecordDlg:
publicCDialog
{//Construction
public:
CRecordDlg(CWnd*pParent=NULL);//standardconstructor
…
afx_msgHBRUSHOnCtlColor(CDC*pDC,CWnd*pWnd,UINTnCtlColor);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
2.5.2表达式类(用于存题目信息)
classCExpression
{
public:
intm_k1;
intm_k2;
charm_operator;
intm_end;
intm_end1;
intm_end2;
intm_end3;
intm_count;
CExpression*m_next;
};
2.6系统总体结构
系统对话框之间的调用关系,如图1所示。
图1系统对话框调用图
答题过程主要运算流程图,如图2所示。
图2答题过程流程图
3.设计结果与分析
利用微软公司的C++开发工具MicrosoftVisualC++6.0创建MFC应用程序,添加各种对话框资源、菜单项,编写代码完成软件的各种功能,软件经过检查修改无误后运行通过操作各个菜单项以及对话框按钮,各部分的功能与菜单提示一致。
(1)运行软件,主对话框及各功能菜单如图3、4、5、6所示。
图3主对话框
图4“软件说明”子菜单
图5“评分说明”子菜单
图6“意见反馈”子菜单
(2)选择主对话框界面的题型分级,点击“开始”按钮,开始答题,满足用户需求,实现随机出题,答题完成,单击“下一题”或回车调用下一道题目,如图7所示。
图7答题对话框
当答案框中输入为空时,弹出对话框提示输入答案,如图8所示。
图8无答案提示框
当答题答案回答错误时,弹出对话框提示回答错误并显示错误次数,每道题有3次答题的机会,3次答错后进入下一题,错误次数不同获得的分数不同。
如图9所示。
图9答题错误提示框
答题对话框上附有操作菜单,方便用户在答题过程中临时变换所选题目等级,以及随时正确退出该软件,使用户用得方便自如。
如图10所示。
图10答题对话框菜单
(3)10道题目回答完毕之后系统自动调用成绩单对话框,成绩单会将每道题的三次答案以及最终得分都显示在列表中,一目了然,方便用户进行总结和纠错。
列表的右侧附有该软件的评分标准,供用户参考,帮助用户提高成绩。
下方列有对错题数、所用总时间、总成绩以及以往用户在所选等级段的最佳成绩,方便用户进行比较。
浏览完成绩单后点击“确定”按钮或直接关闭成绩单返回主对话框界面。
如图11所示。
图11成绩单对话框
同时“查看成绩”菜单项用于在用户做完10道题后查看所得分数,也可调出成绩单对话框,如果没有答题或答题中途返回主对话框,则用于存储信息的链表为空,不能显示成绩,此时弹出对话框提示无成绩,如图12所示。
图12无成绩对话框
(4)在主对话框的菜单栏包含三个菜单:
软件说明、评分说明、意见反馈。
“软件说明”菜单包含“软件简介”、“退出软件”两个子菜单。
其中“软件简介”用以调用软件简介对话框,使新用户对该软件熟悉,减少用户使用的熟悉期。
软件简介对话框如图13所示。
图13软件简介对话框
“评分说明”菜单包含“题型设置”、“查看成绩”、“最佳成绩”三个子菜单。
其中“题型设置”向用户介绍该软件的题型、题量、等级、出题方式、方法等,方便用户正确做出选择,能更好的利用该软件。
题型设置对话框如图14所示。
图14题型设置对话框
“最佳成绩”向现用户展示以往用户的最佳成绩,用于比较,可以起到激励的作用,同时,使软件更加实用和友好。
最佳成绩对话框如图15所示。
图15最佳成绩对话框
“意见反馈”菜单提供了软件制作者的联系方式,可以让用户和编程者进行交流,方便编程者不断对软件进行改进。
联系方式对话框如图16所示。
图16联系方式对话框
(5)进行非正常操作的模拟:
未作题的用户想查看成绩,则弹出“无成绩”的消息。
因为链表为空,不能读取数据;主对话框、答题对话框、成绩单里的数据都是只读类型的,防止用户直接进行篡改;未做完十道题的用户直接返回主界面后,由于无法给分,且链表已重新置空,不弹出成绩单。
VisualC++是Microsofe公司开发的基于C和C++语言的集成开发工具,同其他的可视化编程工具一样VisualC++6.0集代码编辑、编译、链接、调试等功能于一体,并提供多种有用的辅助开发工具。
学习好VC++是广大计算机专业学生的迫切要求。
经过两个星期的VC++课程设计,我在老师和同学的共同帮助下,顺利完成该课程设计,收获很大。
在《VisualC++程序设计》中MFC部分很重要,是需要实践内容。
所以在本学期程设计是很及时、很必要的。
而且还及时、真正的做到了学以致用。
主要是以下几点。
基本功要过硬,不能马虎经常犯犯小错误,提高自己找错纠错能力,通常错误总是那几种,多练习就熟练了。
要善于查找资料提高自己的资料查询能力,要善于利用网络来获得知识,获得帮助。
开始着手程序设计时,有些功能感觉无从下手,都不知道要干什么。
这些问题只要找到相关的资料就会得到提示从而理解所要解决问题的大致方向。
有了明确的目的,就可以发挥自己的头脑来完成它了。
要善于思考。
程序中有些实现难点和最初完成程序时免不了的许多不足就需要自己根据代码认真思考来解决。
只有这样才能纠正程序的不足并使其更加人性化。
这次课程设计让我学到了很多,不仅是巩固了先前学的MFC程序设计知识,而且也培养了我的动手能力,更令我的创造性思维得到拓展。
希望今后类似这样课程设计、类似这样的锻炼机会能更多些!
通过这次课程设计,可以明显地感觉到它弥补了课堂教学和实验中知识的深度和广度方面的不足,也让我进一步掌握了面向过程和面向对象程序设计的基本方法和编程技巧,同时也巩固所学理论知识,虽然花费了不止一点点的时间和精力,不过那确实挺值得的。
既让我认识到自己知识方面的缺陷,又培养了我独立分析问题、解决问题的能力。
希望在今后的学习中我能够长久的保持这股学习热情,将理论知识化为实际编程能力。
努力学好VC++,将所学知识与实践充分结合起来,学好计算机专业课。
[1]刘新民,蔡琼,白康生.VisualBasic6.0程序设计[M].北京:
清华大学出版社,2004
[2]张海荣.VisualC++实用教程(第2版)[M].北京:
电子工业出版社.2004
[3]刘於勋等.C++程序设计[M].北京:
科学出版社,2007:
24-125
[4]荣钦科技.VisualC++游戏编程基础[M].北京:
电子工业出版社,2004:
42-115
[5]揣锦华.面向对象程序设计与VC++实践[M].西安:
电子科技大学出版社,2005:
40-101
[6]罗伟坚.VisualC++经典游戏程序设计[M].北京:
人民邮电出版社,2006:
20-85
[7]郑莉.C++语言程序设计案例教程[M].北京:
清华大学出版社,2005.7:
30-111
附录
(1)主对话框类
classCDXDDlg:
publicCDialog
{
//Construction
public:
CDXDDlg(CWnd*pParent=NULL);//standardconstructor
CBrushm_brush;//自己加的
staticDWORDtime1,time2;//自己加的
staticdoubletime;
staticCExpression*m_exp;
staticintflag;
staticintGrade;//用于记录做题等级
staticintFlag;//用于从计算对话框返回主菜单
staticintBESTA,BESTB,BESTC;//分别用来存A、B、C级的最高分
public:
voidSaveAllData();//用来存最高分
voidLoadAllData();//用来读取最高分
//DialogData
//{{AFX_DATA(CDXDDlg)
enum{IDD=IDD_DXD_DIALOG};
intm_grade;
//}}AFX_DATA
//ClassWizardgeneratedvirtualfunctionoverrides
//{{AFX_VIRTUAL(CDXDDlg)
protected:
virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDVsupport
//}}AFX_VIRTUAL
//Implementation
protected:
HICONm_hIcon;
//Generatedmessagemapfunctions
//{{AFX_MSG(CDXDDlg)
virtualBOOLOnInitDialog();//初始化对话框
afx_msgvoidOnSysCommand(UINTnID,LPARAMlParam);
afx_msgvoidOnPaint();
afx_msgHCURSOROnQueryDragIcon();
afx_msgHBRUSHOnCtlColor(CDC*pDC,CWnd*pWnd,UINTnCtlColor);
afx_msgvoidOnButtonTest();//进入测试,调用测试对话框
afx_msgvoidOnButtonSee();//查看成绩
afx_msgvoidOnIntroduction();//调用软件简介对话框
afx_msgvoidOnLink();//调用联系方式对话框
afx_msgvoidOnSetQuestions();//调用题型设置对话框
afx_msgvoidOnSee();//调用成绩对话框
afx_msgvoidOnDestroy();
afx_msgvoidOnBest();
afx_msgvoidOnExitMain();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
(2)答题对话框类(用于用户的练习)
classCCalculateDlg:
publicCDialog
{
//Construction
public:
CCalculateDlg(CWnd*pParent=NULL);//standardconstructor
voidRefreshDlg(CStringexp);//自己加的
//DialogData
//{{AFX_DATA(CCalculateDlg)
enum{IDD=IDD_DIALOG_CALCULATE};
CStringm_answer;
CStringm_expression;
CStringm_order;
//}}AFX_DATA
protected:
intm_flag;
public:
intm_k,m_m,m_n;
intm_k1,m_k2;
voidSet_Grade(intflag){
m_flag=flag;
}
CFontm_editFont,m_editFont2,m_editFont3;
//staticCExpression*m_pExp;
staticintm_score;
staticintnIndex;//nIndex表示回答的次数
staticintwrong1,wrong2,wrong3,answer;
//Overrides
//ClassWizardgeneratedvirtualfunctionoverrides
//{{AFX_VIRTUAL(CCalculateDlg)
protected:
virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDVsupport
//}}AFX_VIRTUAL
//Implementation
protected:
//Generatedmessagemapfunctions
//{{AFX_MSG(CCalculateDlg)
afx_msgvoidOnButtonHand();
virtualBOOLOnInitDialog();
afx_msgHBRUSHOnCtlColor(CDC*pDC,CWnd*pWnd,UINTnCtlColor);
afx_msgvoidOnClose();
afx_msgvoidOnReturn();
afx_msgvoidOnExit();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
(3)成绩单对话框类(用于将数据显示出来)
classCRecordDlg:
publicCDialog
{//Construction
public:
CRecordDlg(CWnd*pParent=NULL);//standardconstructor
//DialogData
//{{AFX_DATA(CRecordDlg)
enum{IDD=IDD_DIALOG_RECORD};
CListCtrlm_list;
CStringm_right;
CStringm_wrong;
CStringm_time;
CStringm_total;
CStringm_best;