当前位置:文档之家› 面向对象课程设计(濮)

面向对象课程设计(濮)

湖南师范大学工程与设计学院面向对象系统课程设计课题名称: 学生考试系统姓名:濮湘华学号: 2011180532专业:计算机科学与技术指导老师:目录1、需求分析 (3)2、系统设计 (3)3、数据库设计 (6)4、关键模块设计 (10)5、课程设计心得 (31)【课程设计名称】:学生考试系统【学习内容】:学习数据库的概念模型的设计、数据库的使用、C++的面向对象的学习,VC数据库连接。

一、需求分析根据学生考试的特点和学校的实际情况,以考试流程为基础,从专业角度出发,提供科学有效的考试模式。

考试时采用系统自动从数据表中选题的方式,评卷时通过核对考生答案与正确答案得出考生的分数。

二、系统设计2.1系统功能结构学生考试系统功能结构图如图所示。

2.2 系统预览学生考试系统主要由登陆界面、试题界面、及考试成绩管理等模块组成,学生考试管理系统主窗口用于考生选题答题操作,考试结果信息模块用于对考生的答题结果进行评分。

登陆界面:主窗口界面:考试结果窗口界面:试题管理模块用于增添考试科目,并可以添加、修改和删除试题,如图4所示;学生成绩查询模块用于查询考生的考试成绩,如下图成绩管理:2.2 学生考试系统流程二、数据库设计1、数据库概念设计根据前面介绍的需求分析和系统设计规划出本系统中使用的数据库实体对象分别为用户信息实体、科目信息实体、试题信息实体、试题答案信息实体、答案暂存信息实体和考试结果信息实体等。

(1)用户信息实体用户信息实体包括用户编号、用户名、密码、密码提示问题、答案、真实姓名、年龄、性别、联系电话、用户权限、身份证号和注册日期。

用户信息实体E-R图,如下图所示。

用户实体:(2)科目信息实体科目信息实体包括科目ID和科目名称。

科目信息实体E-R图,如下图(3)试题信息实体试题信息实体包括试题ID、试题内容、试题答案、试题分数和科目ID。

试题信息实体E-R图,如下图(4)试题答案信息实体试题答案信息实体包括试题ID、A选项答案、B选项答案、C选项答案和D选项答案。

试题答案信息实体E-R图,如下图(5)答题暂存信息实体答题暂存信息实体包括题号、试题内容、考生答案、考生得分和考生ID。

答题暂存信息实体E-R图,如下图(6)考试结果信息实体考试结果信息实体包括起始时间、截止时间、考试科目、考试成绩和学生编号。

考试结果信息实体E-R图,如下图2、数据库逻辑表用户信息表主要用于记录用户注册信息、账号信息及密码,保障只有合法用户才能登录系统。

该表的结构如图注册后信息:(2)考试科目表(subject)考试科目表主要用于记录要考试的科目信息。

该表的结构如图(3)试题信息表(test)试题信息表主要用于存放各科目考试题信息。

该表的结构如下图(4)试题答案信息表试题答案信息表主要用于存放试题的答案选项。

该表的结构如图(5)答题信息暂存表答题信息暂存表主要用于暂时存储考生在考试过程中的答题信息(6)考试结果信息表考试结果信息表主要用于存储考生考试的时间、科目、成绩等信息三、关键模块设计1、注册模块设计注册过程中要用户登记身份证信息,在用户注册的同时系统将自动对身份证信息进行验证,验证身份证信息要从身份证号位数、出身年月、用户性别等资料进行验证。

代码如下:if(m_IDcard.GetLength() != 18){AfxMessageBox("输入身份证号码无效");return;}else{int num=0;char ch;for(int i=0;i<17;i++){ch = m_IDcard.GetAt(i);if(ch>47 && ch<58)num++;}if(i==17){ch = m_IDcard.GetAt(i);if((ch>47 && ch<58) || (ch==88 || ch==120)) / num++;}if(num != 18){AfxMessageBox("输入身份证号码无效");return;}else{CString syear = m_IDcard.Mid(6,4);int year = atoi(syear);CString smonth = m_IDcard.Mid(10,2);int month = atoi(smonth);CString sday = m_IDcard.Mid(12,2);int day = atoi(sday);BOOL leap;if(month<1||month>12){AfxMessageBox("输入身份证号码无效");return;}switch(month){case 1: case 3: case 5: case 7: case 8: case 10: case 12:if(day<0 || day>31){AfxMessageBox("输入身份证号码无效");return;}break;case 4: case 6: case 9: case 11:if(day<0 || day>30){AfxMessageBox("输入身份证号码无效");return;}break;case 2:if(year % 4 == 0){if(year % 100 != 0)leap = TRUE;else if(year % 400 == 0)leap = TRUE;elseleap = FALSE;}elseleap = FALSE;if(leap)if(day<0 || day>29){AfxMessageBox("输入身份证号码无效"); //提示return;}elseif(day<0 || day>28){AfxMessageBox("输入身份证号码无效"); //提示错误信息return;}break;}}}//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////单击“注册”按钮后系统自动将用户所填入的数据一一添加进数据表中,从而达到注册的目的。

代码如下:UpdateData();if(m_UserName.IsEmpty()){AfxMessageBox("请输入用户名");return;}if(m_Passwd.IsEmpty()){AfxMessageBox("请输入密码");return;}if(m_Passwd!=m_PasswdRepeat){AfxMessageBox("两次输入密码不一致,请重新输入");return;}u if(m_QuestionCombo.GetCurSel()==-1||m_QuestionCombo.GetCurSel()==0) // {AfxMessageBox("请选择密码提示问题");return;}if(m_Answer.IsEmpty()){AfxMessageBox("请输入提示问题的答案");return;}if(m_RealName.IsEmpty()){AfxMessageBox("请输入真实姓名");return;}v m_QuestionCombo.GetLBText(m_QuestionCombo.GetCurSel(),str);CString sex;if(radio==0)sex.Format("");if(radio==1)sex.Format("男");if(radio==2)sex.Format("女");CTime time;time=CTime::GetCurrentTime();CString nowtime=time.Format("%Y-%m-%d");int id;try{m_AdoConn.OnInitADOConn();//打开数据库连接CString sql="select*from register where username='"+m_UserName+"'";m_pRs=m_AdoConn.GetRecordSet((_bstr_t)sql);if(!m_pRs->adoEOF){AfxMessageBox("用户名已存在");return;}else{sql.Format("select studentid from register");m_pRs=m_AdoConn.GetRecordSet((_bstr_t)sql); /if(m_pRs->adoEOF)id=1001;else{m_pRs->MoveLast();id=atoi((_bstr_t)m_pRs->GetCollect("studentid"));id+=1; }//向注册信息表中插入用户名、密码、提示问题、答案等信息sql.Format("insert into register(username,[password],question,answer,name,\age,sex,phone,studentid,power,login_date)values('%s','%s','%s','%s','%s',\%d,'%s',%d,%d,'学生','%s')",m_UserName,m_Passwd,str,m_Answer,m_RealName,m_Age,\sex,m_Phone,id,nowtime);m_AdoConn.ExecuteSQL((_bstr_t)sql);m_AdoConn.ExitConn();AfxMessageBox("注册成功"); //提示注册成功CDialog::OnCancel();CLOGIN dlg; //定义一个登录类实例dlg.DoModal();//打开登录窗口}}catch(...){AfxMessageBox("操作失败");return;}2、登陆窗口模块设计BOOL CLOGIN::OnInitDialog(){CDialog::OnInitDialog();m_TypeList.SetCurSel(1);CenterWindow();DWORD dwStyle = AW_CENTER;HINSTANCE hInst = LoadLibrary("User32.DLL");typedef BOOL(WINAPI MYFUNC(HWND,DWORD,DWORD));MYFUNC* AnimateWindow;AnimateWindow=(MYFUNC *)::GetProcAddress(hInst,"AnimateWindow");AnimateWindow(this->m_hWnd,1000,dwStyle);FreeLibrary(hInst);return TRUE;}void CLOGIN::OnButtonCancel(){DWORD dwStyle = AW_CENTER;HINSTANCE hInst = LoadLibrary("User32.DLL");typedef BOOL(WINAPI MYFUNC(HWND,DWORD,DWORD));MYFUNC* AnimateWindow;AnimateWindow=(MYFUNC *)::GetProcAddress(hInst,"AnimateWindow");AnimateWindow(this->GetSafeHwnd(),700,AW_HIDE|dwStyle);FreeLibrary(hInst);CDialog::OnCancel();}UpdateData();CString str;m_TypeList.GetLBText(m_TypeList.GetCurSel(),str);if(m_UserName.IsEmpty()){AfxMessageBox("用户名不能为空");return;}if(m_UserPasswd.IsEmpty()){AfxMessageBox("密码不能为空");return;}CString sql="select*from register where username='"+m_UserName+"' and [password]='"+m_UserPasswd+"' andpower='"+str+"'";try{_RecordsetPtr m_pRs;ADOConn m_AdoConn; //定义一个数据库连接类变量m_AdoConn.OnInitADOConn();//连接数据库m_pRs=m_AdoConn.GetRecordSet((_bstr_t)sql); //获if(m_pRs->adoEOF){sql="select*from register where username='"+m_UserName+"'"; //如果为空判断是否存在此用户m_pRs=m_AdoConn.GetRecordSet((_bstr_t)sql); //获if(!m_pRs->adoEOF){if(m_UserPasswd!=(char*)(_bstr_t)m_pRs->GetCollect("password")){if(MessageBox("密码错误,是否找回密码?","提示",MB_YESNO)==IDYES) //提示找回密码{CFind dlg;=m_UserName;CDialog::OnCancel();dlg.DoModal();}}else{if(str!=(char*)(_bstr_t)m_pRs->GetCollect("power")){AfxMessageBox("权限错误");return;}}}else{if(MessageBox("用户名不存在,是否注册?","提示",MB_YESNO)==IDYES) //提示注册{CDialog::OnCancel();CRegister dlg;dlg.m_UserName=m_UserName;dlg.DoModal();}elseCDialog::OnCancel();}}else{if(str=="教职工"){CDialog::OnCancel();CBack dlg;dlg.DoModal();}elseCDialog::OnOK();}m_AdoConn.ExitConn();}用于打开数据库连接,在函数中添加如下代码。

相关主题