课程设计
20##——20##学年 第2学期
课程设计任务书
学生姓名: 专业班级:
指导教师: 工作单位:
题 目: 学生成绩管理系统实现
初始条件:
理论:学习并掌握了C++程序设计语言。
实践:计算机技术系实验中心提供计算机及软件开发环境。
要求完成的主要任务:
1、系统应具备的功能:
(1)能实现学生成绩的增加与删除
(2)能实现学生成绩的查询,显示和排序
(3)统计学生单科成绩,并且绘制相应的饼图和直方图
(4)实现附加功能
(5)界面良好,功能完善
2、编程实现;
3、撰写课程设计报告,包括:
(1)统一封面;
(2)目录;
(3)系统论文部分及使用说明;
(4)参考文献;
(5)本科课程论文评分标准表。
系统论文部分要求:
(1)对所设计系统实现的各模块进行介绍。
(2)给出各模块源程序以及对源程序主要部分的相应注释说明。
(3)给出适当的运行结果界面的截图。
(4)写出系统设计过程中自己所遇到的问题及相应的解决方法和解决过程。(详细)
目录
摘要------------------------------------------------------------------------------------------------4
1 系统设计---------------------------------------------------------------------------------------5
1.1总体结构设计------------------------------------------------------------------------------5
1.2系统功能模块设计------------------------------------------------------------------------6
1.2.1班级成绩管理模块--------------------------------------------------------------------6
1.2.2年级成绩管理模块--------------------------------------------------------------------6
2 【班级成绩】各模块代码及结果---------------------------------------------------------6
2.1显示各班成绩记录------------------------------------------------------------------------6
2.1.1主要源代码-----------------------------------------------------------------------------6
2.1.2运行结果--------------------------------------------------------------------------------7
2.2添加一个学生成绩记录------------------------------------------------------------------8
2.2.1主要源代码-----------------------------------------------------------------------------8
2.2.2运行结果-------------------------------------------------------------------------------11
2.3删除一个学生成绩记录-----------------------------------------------------------------11
2.3.1主要源代码----------------------------------------------------------------------------11
2.3.2运行结果-------------------------------------------------------------------------------13
2.4修改某位学生的成绩记录--------------------------------------------------------------13
2.4.1主要源代码----------------------------------------------------------------------------13
2.4.2运行结果-------------------------------------------------------------------------------16
2.5查找某位学生的成绩记录--------------------------------------------------------------16
2.5.1主要源代码----------------------------------------------------------------------------16
2.5.2运行结果-------------------------------------------------------------------------------17
2.6显示某班全部学生的成绩记录--------------------------------------------------------18
2.6.1主要源代码----------------------------------------------------------------------------18
2.6.2运行结果-------------------------------------------------------------------------------18
2.7导出某个班的学生的成绩记录--------------------------------------------------------19
2.7.1主要源代码----------------------------------------------------------------------------19
2.7.2运行结果-------------------------------------------------------------------------------20
2.8对成绩进行排序--------------------------------------------------------------------------20
2.8.1主要源代码----------------------------------------------------------------------------20
2.8.2运行结果-------------------------------------------------------------------------------21
3【年级成绩】各模块代码及结果----------------------------------------------------------22
4运行结果总结--------------------------------------------------------------------------------22
5系统设计过程中遇到的问题及相应的解决方法和过程-----------------------------23
说明----------------------------------------------------------------------------------------------25
使用手册----------------------------------------------------------------------------------------25
设计体会----------------------------------------------------------------------------------------25
参考文献
摘要 本学生成绩管理系统能够对学生成绩进行显示、添加、修改、删除、查询以及导出到记事本上,由于该学生成绩管理系统是以ASP网页编程+Access数据库+SQL数据查询语言编写,因而系统管理员、教师、学生只需通过简单的操作,行输入一些简单的汉字、数字,或用鼠标点击即可达到自己想要的目的。
关键字 系统、简单、完善。
1 系统设计
根据前面的需求分析可以知道本系统的功能主要是完成系统管理员对学生成绩的管理,主要是对整个年级或某个班级学生成绩的管理,包括学生成绩的录入、删除、修改、查询等功能,以及班级和学科科目的管理。因此可以看出,整个学生管理系统分为三个模块:班级成绩、年级成绩、参数设置,对应于相应模块的各个功能,现列出其总体结构及其功能描述。
1.1总体结构设计
本软件项目的总体结构如下图:
1.2系统功能模块设计
根据系统的功能分析对各功能模块进行集中、分块,按照结构化程序设计的要求,系统的功能模块划分如下:
1.2.1班级成绩管理模块
a.成绩录入模块
b.成绩删除模块
c.成绩修改模块
d.成绩查询模块
e.班级成绩显示模块
f.成绩导出模块
1.2.2.年级成绩管理模块
a.全部学生成绩显示模块
b.学生成绩查询模块
2【班级成绩】各模块代码及结果
2.1显示各班级成绩记录
2.1.1主要源代码
int CBaDialog::Show()
{//显示各班级学生成绩
int i=0;
m_Set.MoveFirst();
if(m_Set.m_column1==0)
{
m_Set.Close();
return i;
}
do
{
CString s;
s.Format("%d",m_Set.m_column1);
m_ListCtrlx.InsertItem(i,s,0);
m_ListCtrlx.SetItemText(i,1,m_Set.m_column2);
s.Format("%.1f",m_Set.m_column3);
m_ListCtrlx.SetItemText(i,2,s);
s.Format("%.1f",m_Set.m_column4);
m_ListCtrlx.SetItemText(i,3,s);
s.Format("%.1f",m_Set.m_column5);
m_ListCtrlx.SetItemText(i,4,s);
s.Format("%.1f",m_Set.m_column6);
m_ListCtrlx.SetItemText(i,5,s);
s.Format("%.1f",m_Set.m_column7);
m_ListCtrlx.SetItemText(i,6,s);
s.Format("%.1f",m_Set.m_column8);
m_ListCtrlx.SetItemText(i,7,s);
s.Format("%.2f",m_Set.m_column9);
m_ListCtrlx.SetItemText(i,8,s);
i++;
m_Set.MoveNext();
} while(!m_Set.IsEOF());
m_Set.Close();
return i;
}
2.1.2运行结果
运行出现主界面后,单击“显示记录”按钮即可显示所选各班级各学生成绩,此时此按钮置灰。
2.2添加一个学生成绩记录
2.2.1主要源代码
void CBaDialog::OnAdd()
{//添加学生成绩记录
// TODO: Add your control notification handler code here
Selec=TRUE;
CAddialog dlg;
if(dlg.DoModal()==IDOK)
{
CString str=this->Select();
if(str=="一班")
{
if(dlg.m_nxue>=200||dlg.m_nxue<100)
{
AfxMessageBox("一班学号在100—200之间");
m_Set.Close();
m_bSet.Close();
return;
}
}
else if(str=="二班")
{
if(dlg.m_nxue<200||dlg.m_nxue>=300)
{
AfxMessageBox("二班学号在200—300之间");
m_Set.Close();
m_bSet.Close();
return;
}
}
else if(str=="三班")
{
if(dlg.m_nxue<300||dlg.m_nxue>=400)
{
AfxMessageBox("三班学号在300—400之间");
m_Set.Close();
m_bSet.Close();;
return;
}
}
else if(str=="四班")
{
if(dlg.m_nxue<400||dlg.m_nxue>=500)
{
AfxMessageBox("三班学号在400—500之间");
m_Set.Close();
m_bSet.Close();
return;
}
}
else if(str=="五班")
{if(dlg.m_nxue<500||dlg.m_nxue>=600)
{AfxMessageBox("三班学号在500—600之间");
m_Set.Close();
m_bSet.Close();
return;}
}
else if(str=="六班")
{if(dlg.m_nxue<600||dlg.m_nxue>=700)
{AfxMessageBox("六班学号在400—500之间");
m_Set.Close();
m_bSet.Close();
return;}
}
else if(str=="七班")
{if(dlg.m_nxue<700||dlg.m_nxue>=800)
{AfxMessageBox("七班学号在700—800之间");
m_Set.Close();
m_bSet.Close();;
return;}
}
else if(str=="八班")
{if(dlg.m_nxue<800||dlg.m_nxue>=900)
{AfxMessageBox("八班学号在800—900之间");
m_Set.Close();
m_bSet.Close();
return;}
}
m_Set.AddNew();
m_nRecordCount+=1;
m_Set.m_column1=dlg.m_nxue;
m_Set.m_column2=dlg.m_strName;
m_Set.m_column3=dlg.m_fmaths;
m_Set.m_column4=dlg.m_fphysical;
m_Set.m_column5=dlg.m_fchemistry;
m_Set.m_column6=dlg.m_fenglish;
m_Set.m_column7=dlg.m_fpolitic;
m_Set.m_column8=dlg.m_fmaths+dlg.m_fphysical+dlg.m_fchemistry+dlg.m_fenglish+dlg.m_fpolitic;
m_Set.m_column9=(float)(m_Set.m_column8/5);
this->Equal();
m_Set.Update();//Update()一定放在Equal()后
m_Set.MoveFirst();
if(m_Set.m_column1==0)
{
m_Set.Delete();
m_Set.Requery();
}
m_Set.Requery();
this->Xuan();
}
}
2.2.2运行结果
在七班添加一个学生成绩记录,学号:777,姓名:王俊,数学:87,物理:81,化学:90,英语:79,生物:80
2.3删除一个学生成绩记录
2.3.1主要源代码
void CBaDialog::OnDelect()
{//删除一个学生成绩记录
// TODO: Add your control notification handler code here
CDelectDialog dlg;
Selec=FALSE;
if(dlg.DoModal()==IDOK)
{
if(dlg.m_nPass!=1234)
AfxMessageBox("密码不正确!你没有权限删除记录");
else
{
this->Select();
m_Set.MoveFirst();
BOOL sel=FALSE;
do
{
if(m_Set.m_column1!=dlg.m_nxue)
m_Set.MoveNext();
else
{
m_nRecordCount-=1;
sel=TRUE;
m_bSet.MoveFirst();
this->Equal();
m_Set.Delete();
m_Set.Requery();
break;
}
}while(!m_Set.IsEOF());
if(sel==FALSE)
{
AfxMessageBox("没有此记录");
return;
}
else
this->Xuan();
}
}
}
2.3.2运行结果
删除七班学号为700的同学的成绩记录,输入密码为1234。
2.4修改某位学生的成绩记录
2.4.1主要源代码
void CBaDialog::OnEdit()
{//修改某位学生的成绩记录
// TODO: Add your control notification handler code here
CEditDialog dlg;
if(dlg.DoModal()==IDOK)
{
if(strcmp(dlg.m_pass,"1234")!=0)
AfxMessageBox("你没有权限更改记录!请重输入密码:");
else
{
this->Select();
m_Set.m_strFilter.Format("[学号]=%d",dlg.m_xue);
m_Set.Requery();
if(m_Set.IsEOF())
AfxMessageBox("没有此记录");
else
{
for(int i=0;i<5;i++)
{
float p=0,q=0;
if(i==0)
{
p=dlg.m_fmaths;
q=m_Set.m_column3;
}
if(i==1)
{
p=dlg.m_fphysical;
q=m_Set.m_column4;
}
if(i==2)
{
p=dlg.m_fchemistry;
q=m_Set.m_column5;
}
if(i==3)
{
p=dlg.m_fenglish;
q=m_Set.m_column6;
}
if(i==4)
{
p=dlg.m_fpolitic;
q=m_Set.m_column7;
}
m_bSet.Edit();
m_bSet.m_column2=m_bSet.m_column2+p-q;
m_bSet.m_column3=m_bSet.m_column2/m_nRecordCount;
if(p>=60 && q<60)
m_bSet.m_column4+=1;
if(p<60 && q>=60)
m_bSet.m_column4-=1;
if(p>=80 && q<80)
m_bSet.m_column5+=1;
if(p<80 && q>=80)
m_bSet.m_column5-=1;
m_bSet.Update();
if(!m_bSet.IsEOF())
m_bSet.MoveNext();
else
break;
}
m_Set.Edit();
m_Set.m_column2=dlg.m_strName;
m_Set.m_column3=dlg.m_fmaths;
m_Set.m_column4=dlg.m_fphysical;
m_Set.m_column5=dlg.m_fchemistry;
m_Set.m_column6=dlg.m_fenglish;
m_Set.m_column7=dlg.m_fpolitic;
m_Set.m_column8=dlg.m_fmaths+dlg.m_fphysical+dlg.m_fchemistry+dlg.m_fenglish+dlg.m_fpolitic;
m_Set.m_column9=(float)(m_Set.m_column8/5);
m_Set.Update();
}
m_Set.m_strFilter.Empty();
m_bSet.Close();
m_Set.Close();
m_ListCtrlx.DeleteAllItems();
m_ListCtrlb.DeleteAllItems();
this->Select();
this->Show();
this->display();
}
}
}
2.4.2运行结果
修改七班学号为777的王俊同学的信息,将数学改为85,密码亦为1234。
2.5查找某位同学的成绩记录
2.5.1主要源代码
void CBaDialog::OnFind()
{//查找某位同学的成绩记录
// TODO: Add your control notification handler code here
CFinDialog dlg;
if( dlg.DoModal()==IDOK)
{
this->Select();
m_bSet.Close();
if(dlg.m_Getstring2==">=")
m_Set.m_strFilter.Format("[%s]>=%.2f",dlg.m_Getstring1,dlg.m_find);
if(dlg.m_Getstring2=="=")
m_Set.m_strFilter.Format("[%s]=%.2f",dlg.m_Getstring1,dlg.m_find);
if(dlg.m_Getstring2=="<=")
m_Set.m_strFilter.Format("[%s]<=%.2f",dlg.m_Getstring1,dlg.m_find);
m_ListCtrlx.DeleteAllItems();
m_Set.Requery();
if(m_Set.IsEOF())
{
AfxMessageBox("没有符合条件的记录");
m_Set.Close();
return ;
}
else
this->Show();
}
}
2.5.2运行结果
找出四班数学成绩不低于90分的学生的信息
2.6显示某班全部学生的成绩记录
2.6.1主要源代码
void CBaDialog::OnAll()
{//显示全部记录
// TODO: Add your control notification handler code here
this->Select();
m_bSet.Close();
m_Set.m_strFilter.Empty();
m_Set.Requery();
m_ListCtrlx.DeleteAllItems();
this->Show();
}
2.6.2运行结果
在【2.5】中筛选出了数学成绩不低于90的学生,现在单击“全部记录”按钮恢复对全班学生成绩的查看。
2.7导出某个班的学生的成绩记录
2.7.1主要源代码
void CBaDialog::OnExport()
{
// TODO: Add your control notification handler code here
CFile aFile;
CFileFind fFind;
BOOL bSuccess;
CString str;
str.Format("\\%s.txt",m_Getstring);
CString lFile= sPath+str;
bSuccess=fFind.FindFile(lFile);
if(!bSuccess)
aFile.Open(lFile,CFile::modeCreate);
else
{
aFile.Open(lFile,CFile::modeReadWrite);
CArchive arr(&aFile,CArchive::store);
this->Select();
m_bSet.Close();
int i=0;
if(m_Set.m_column1==0)
{
m_Set.Close();
return ;
}
m_Set.MoveFirst();
do
{
CString str1,str2,str3,str4,str5,str6,str7,str8,str9;
str1.Format("%d",m_Set.m_column1);
str2=m_Set.m_column2;
str3.Format("%.1f",m_Set.m_column3);
str4.Format("%.1f",m_Set.m_column4);
str5.Format("%.1f",m_Set.m_column5);
str6.Format("%.1f",m_Set.m_column6);
str7.Format("%.1f",m_Set.m_column7);
str8.Format("%.1f",m_Set.m_column8);
str9.Format("%.2f",m_Set.m_column9);
arr<<str1<<m_Set.m_column2<<str3<<str4<<str5<<str6<<str7<<str8<<str9;
i++;
m_Set.MoveNext();
} while(!m_Set.IsEOF());
m_Set.Close();
}
aFile.Close();
}
2.7.2运行结果
选定某个班或者某些学生的信息,双击“导出记录”按钮,将会将选定的信息生成记事本文件,位于lhwy文件夹中。此处选择二班学生。
2.8对成绩进行排序
2.8.1主要源代码
void CBaDialog::Sort(BOOL isAsc,int secol)
{
if(m_Set.IsOpen())
m_Set.Close();
this->Select();
m_bSet.Close();
CODBCFieldInfo fieldInfo;
m_Set.GetODBCFieldInfo(secol,fieldInfo);
if(isAsc)
{
m_Set.m_strSort=fieldInfo.m_strName+" ASC";
m_bIsAsc=TRUE;
}
else
{
m_Set.m_strSort=fieldInfo.m_strName+" DESC";
m_bIsAsc=FALSE;
}
m_Set.Requery();
}
2.8.2运行结果
通过单击成绩显示框上的“学号”、“姓名”等按钮可以对班级成绩进行升序或降序排列,此处选择一班学生,“学号”按钮。
3【年级成绩】各模块代码及结果
年级成绩页面下有三个按钮。“显示记录”、“查询记录”、“全部记录”,代码与功能和班级页面下个按钮的功能类似,在此不再赘述,以下是年级成绩的界面:
4 运行结果总结
通过以上运行结果可以得知,各项测试与预期的结果相吻合。该学生成绩管理系统基本上实习了对学生成绩的管理功能,添加模块、修改模块、删除模块、查询模块、显示成绩模块、导出成绩模块等均可以实现各自的功能。不过系统在调度中经常出现如下的问题:
(1) 数据库的连接容易出错。
(2) 如果一旦查询某类信息不存在后,再进行之后的操作时一定要先要单击“全部记录”按钮显示所有信息后才能操作,否则会提醒“遇到不适当的参数结尾”,继续如此将可能会崩溃。
5 系统设计过程中遇到的问题及相应的解决方法和解决过程
5.1 由于需要比较多的数据,因而使用了数据库Access,但自己不会,于是去图书馆查看了相关的书,可是时间比较紧以及现在知识有限,没有得到解决,但对数据库有了一点认识。之后和某些同学讨论后,有了些雏形,但是使用依然有难度。最后上网搜相关的资料,找到了实现连接数据库的代码(此软件也是学生信息管理系统),修改后便可使用了。
5.2出现的问题
1>NaDilalog.obj : error LNK2001: 无法解析的外部符号 "protected: void __thiscall CNaDilalog::OnFind(void)" (?OnFind@CNaDilalog@@IAEXXZ)
1>NaDilalog.obj : error LNK2019: 无法解析的外部符号 "public: void __thiscall CNaDilalog::Select(void)" (?Select@CNaDilalog@@QAEXXZ),该符号在函数 "public: void __thiscall CNaDilalog::Beg(void)" (?Beg@CNaDilalog@@QAEXXZ) 中被引用
1>.\Debug\lhwy.exe : fatal error LNK1120: 2 个无法解析的外部命令
1>
1>生成失败。
1>
1>已用时间 00:00:01.46
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========
解决方案 由于系统较为复杂以及对在VS2010中使用MFC不太熟悉,在设计过程中总是会出现函数未声明、忘记定义或拼写错误。因而在慢慢熟悉之后,设计或修改过程时刻谨记在资源视图、类视图以及解决方案中同步进行,避免掉下某一步,至于拼写错误,这个就要多多注意了。
5.3 出现的问题
对于某些功能,比如点击“学号”、“姓名”等按钮就会对成绩进行排序,双击“导出记录”按钮就会以记事本方式导出学生成绩信息等,有些比较棘手,在这方面在网上找到了不少资料,和同学互相讨论,思考之后才得以实现。
5.4 出现的问题
运行后的程序界面上的图标与exe文件图标不同步。
解决方案 虽然图标导入及加载均正确,但是没有在rc文件中进行修改。以记事本方式打开rc文件,找到
///////////////////////
//
// Icon
//
// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
IDI_ICON1 ICON "res\\IDR_MAINFRAME.ico"
将自己想要显示的图标设为第一个。
5.5 出现的问题
导入一张位图想作为背景却不知道在何处添加代码以及添加什么代码。
解决方案 请教了一下同学,得知应该在主程序的OnPaint()函数的else分支上添加
CPaintDC dc(this);
CRect rect;
GetClientRect(&rect);
CDC dcMem;
dcMem.CreateCompatibleDC(&dc);
CBitmap bmpBackground;
bmpBackground.LoadBitmap(IDB_BITMAP2);//IDB_BITMAP2是图对应的ID
BITMAP bitmap;
bmpBackground.GetBitmap(&bitmap);
CBitmap *pbmpOld=dcMem.SelectObject(&bmpBackground);
dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,
bitmap.bmWidth,bitmap.bmHeight,SRCCOPY);
即可。
说明 在设计此系统过程遇到的问题着实很多,在此仅列出几个比较典型例子。
使用手册 运行程序后,通过图形界面的各个按钮可以进行各项操作来实现相应的功能。其中进行删除和修改均需要密码,设为1234。在进入界面后,先点“显示”然后才可以进行其它的操作。
设计体会 在系统地设计过程后,自己对控件使用、导入资源、添加与设计代码以及各种算法实现有了更深的理解,编程能力有了提高,特别是在解决某些问题(如数据库)后感觉能力有了明显的进步,在看到自己的作品出炉后有种自豪感。
参考文献
[1]《Visual C++面向对象与可视化程序设计》(第二版),黄维通,清华大学出版社。
[2]网上相关资料。