首页 > 范文大全 > 正文

C/C++程序设计练习系统的开发与设计

开篇:润墨网以专业的文秘视角,为您筛选了一篇C/C++程序设计练习系统的开发与设计范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

摘要:C语言是一门非常重要的专业基础课,对于后续课程的学习有着重要的影响,许多学生在学习C语言之前,有着浓厚的学习兴趣,想对照原始程序录入代码后运行,从而了解C语言。针对此问题设计开发了一个给予C/S模式的练习系统,采用MFC技术和SQL Server数据库系统实现。

关键词:C语言;MFC;C/S架构;程序练习

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2013)36-8293-04

C语言是一门非常重要的专业基础课,对于后续课程的学习有着重要的影响,许多学生在学习C语言之前,有着浓厚的学习兴趣,想对照原始程序录入代码后运行,从而了解C语言。针对此问题设计开发了一个基于C/S模式的练习系统,为初学者练习C语言程序使用。系统采用MFC技术和SQL Server数据库系统实现。

1 系统简介

如何提高C语言的编程能力,不但是老师关心的课题,也是广大学生面临的一个问题。在学习C语言时,虽然老师在课堂上讲了许多的语法,讲的也很清楚,但是一到下课,好像又全都忘记了。究其原因还是学生在课余时间对C语言编程练习的太少了。尤其是对于初学者,由于程序的概念比较抽象,一下很难掌握其中的语法,也很难适应使用非常严谨的形式化语言思考、解决问题。因此,学好C语言的最好途径就是大量的练习编写程序,通过输入源代码后运行程序,观察程序运行结果,体会程序的本质,在练习的过程中掌握程序的概念,提高程序技能。

对于一些刚开始学习写C语言的学生来说,在练习程序时往往会找一些参考书,把参考书上的例子输入进开发环境,例如VC6.0等,然后编译运行,查看运行结果。这虽然是一个比较好的练习途径,但是它存在三个问题:

第一:是学生在对照参考资料输入程序时,由于一面要看书,一面要敲键盘。由于对程序本身不熟悉,很有可能将程序中的字母敲错,例如大小写的问题,中英文的问题、字母漏写的问题等。对于初学者,他自己由于不懂其中的语法,也很难找出其中的错误,如果没有老师指导可能就不知所措了,久而久之就失去了信心和兴趣。

第二:很多学生由于不熟悉开发环境,在练习程序时由于不会操作开发环境,而不知道如何练习,有时由于操作不当而导致了一些莫名其妙的错误,而不知道如何处理。

第三:有些参考书的例子,由于这样那样的原因,可能本身就存在错误,这样例子给学生练习可能会适得其反。

因此本项目针对初学者在练习编写C语言时出现的问题,研究开发C/c++编程练习系统。在学生登陆后本系统后,从数据库服务器中下载样例程序库,供学生选择练习。练习时,可以从样例程序库中选择程序练习,并将选择的程序代码逐行显示在屏幕上,供练习者参阅。练习者根据样例程序将程序代码输入到练习框中,在输入时,系统能自动检查输入的程序是否和原始程序一致,如果输入的和原始程序不符,系统自动提示其输入错误的位置。在学生输入完毕后,系统可以记录输入程序所花费的时间和正确率,供任课教师查询。系统能将学生输入的代码,编译、连接、生成一个EXE程序,并调用该程序,供练习者运行使用。

2 系统设计与分析

2.1 系统体系结构

系统开发采用VC6.0作为开发平台,采用客户端/服务器(Client/Server)的模式。

C/S模式的优点:

1) C/S架构的界面和操作可以很丰富。

2)安全性能可以很容易保证,实现多层认证也不难。

3)由于只有一层交互,因此响应速度较快。

客户端提供用户界面,完成用户的输入操作和业务逻辑处理操作,采用VC6.0开发。客户端处理后的数据保存在数据库服务中。

图1 系统模式

2.2 系统流程设计

系统流程如图2所示。

图2 系统流程图

在练习者登陆系统时,将其用户名和密码在数据库服务器中的用户表查找,如果存在,登陆成功并确定用户的类型是学生还是管理员,从而给用户分配相应权限。

对于学生用户,系统从服务器下载管理员已经编辑好的样例程序,根据选择的程序代号,将该程序的源代码显示在屏幕上,等待学生输入。在输入时,系统实时监听键盘事件,将所输入的代码与样例程序对比,对于错误的代码,将其反色显示。在输入完毕后,将输入代码保存到临时文件中,调用C编译器,对文件进行编译、连接生成EXE程序,并调用执行。

对于管理用户,可以增加样例程序、查看学生练习纪录。

2.3 系统功能模块设计

根据系统功能要求,对系统功能模块进行划分,将系统分为3个模块:系统管理模块,学生练习模块,教师管理模块。系统功能模块图如图3所示。

图3 客户端系统结构图

系统管理模块主要是用于对登录用户的判断。

学生练习模块主要是学生练习和统计学生练习的正确率和练习时间数据。

教师管理模块主要是用于管理练习程序和查询学生练习的成绩。

2.4 数据库设计

1)数据库分析

在C/C++程序设计练习系统中涉及到用户信息,代码库信息、学生成绩信息。建立三个表保存对应的信息。

2)数据库概念设计

用户信息实体

用户信息实体包括用户名,用户密码,用户权限。

图4 用户信息属性图

程序信息实体

程序信息实体包括程序名,用户ID,程序代码,程序简介。

图5 练习程序实体属性图

3 系统实现

3.1 学生编程练习功能

该功能主要使学生可以选择相应的程序样例程序,将其源代码显示在屏幕上。供学生对照练习使用。在练习输入样例程序中某一行代码时,系统可以将当前行反色,便于学生对照。学生练习完成后还可以编译运行他们的练习程序。

当学生开始练习时,可以从数据库中下载样例程序,也可以从本地导入已经编辑好的样例程序。

学生编程练习功能如图6所示。

图6 学生练习界面

学生输入区域是利用系统控件RichEidt实现的。当前行的反色显示则是给样例程序的当前行加上了背景色。字体背景色的改变是设置了RichEdit的字体的样式,用到了字体结构(CHARFORMAT)和设置RichEdit指定区域的文字背景色(SendMessage(EM_SETCHARFORMAT,SCF_SELECTION,(LPARAM)&cf);)。

函数原型:

typedef struct _charformat {

UINT cbSize; //特殊结构字节大小

DWORD dwMask; //设置文字属性的有效信息

DWORD dwEffects; //文字效果

LONG yHeight; //文字高度

LONG yOffset; //文字的偏移

COLORREF crTextColor; //文字颜色

BYTE bCharSet; //字符集

BYTE bPitchAndFamily; //字体家族和间距

TCHAR szFaceName[LF_FACESIZE];

//以字符数组指定字体名称

} CHARFORMAT;

设置RichEdit控件中指定区域的文字的背景色代码示例:

cf.cbSize = sizeof(CHARFORMAT2);

cf.dwMask = CFM_BACKCOLOR;

cf.crBackColor=RGB(0, 255, 0); //背景颜色为绿色

m_richedit.SetSel(0, 2); //设置处理区域

m_richedit.SendMessage(EM_SETCHARFORMAT,SCF_SELECTION,(LPARAM)&cf);

3.2 正确率统计

学生在编辑框中进行输入的同时,编辑框内容改变,触发响应事件,在响应事件回调函数中读取学生输入的部分程序,与模板程序进行逐个比对,正确录入的字母数与模板程序的总长度的比率即为学生录入的正确率。

正确率统计代码如下:

int Maxindex;

Maxindex=Code.GetLength();

index=InputCode.GetLength();

int returncount=0;

if(index>=0)

{

if (index

{

int j=0;

rightcount=0;

for(j;j

{

if(InputCode[j]==Code[j])

rightcount++;

}}

else

{

int j=0;

rightcount=0;

for(j;j

{

if(InputCode[j]==Code[j])

rightcount++;

}}}

else if(index==0)

rightcount=0;

itoa((int)(1.0*rightcount/Maxindex*100), strNumber, 10);

strcat(strNumber,"%");

//strNumber即为最后的表示正确率字符串

3.3 练习计时

学生在练习时,会对学生练习的时间有一个记录,实现思想是当学生的鼠标的焦点落在学生练习的输入区域时开始计时,当学生练习输入完成时计时结束。这时就采集到了学生练习当前程序所用的时间。实现是采用定时器完成的,利用WM_TIMER来设置定时器,SetTimer函数原型:

UINT_PTR SetTimer(

HWND hWnd, //窗口句柄

UINT_PTR nIDEvent, // 定时器ID,多个定时器时,可以通过该ID判断是哪个定时器UINT nElapse, // 时间间隔,单位为毫秒 TIMERPROC lpTimerFunc // 回调函数

);

在MFC程序中SetTimer被封装在CWnd类中,调用就不用指定窗口句柄了,于是SetTimer函数的原型变为: (下转第8307页)

(上接第8296页)

UINT SetTimer(

UINT nIDEvent,

UINT nElapse,

void(CALLBACK EXPORT *lpfnTimer)(HWND,UINT ,YINT ,DWORD)

);

当使用SetTimer函数的时候,就会生成一个定时器,函数中nIDEvent指的是定时器的标识。nElapse指的是时间间隔,也就是每隔多长时间触发一次事件。第三个参数是一个回调函数,可以将它设定为NULL,即使用系统默认的回调函数(OnTimer函数)。

4 结束语

本系统为广大的学生学习C语言编程的基本知识提供了一个学习平台,方便学生练习与掌握C语言编程的基本语法知识,通过使用本系统,增强了学生学习C语言的兴趣,为后续计算机相关课程的学习打下良好的基础。

参考文献:

[1] 侯俊杰.深入浅出MFC[M].武汉:华中科技大学出版社,2001.

[2] 孙鑫,余安萍.VC++深入详解[M].北京:电子工业出版社, 2006.

[3] 杨喜林.可视化程序设计Visual C++[M].北京:北京理工大学出版社,2010.

[4] 崔莹,王华军,姚雪峰.Visual C++数据库实用编程100例[M].北京:中国铁道出版社,2007.