目录
1 引言............................................................................................................................ 1
2 设计要求.................................................................................................................... 2
3 数据库设计................................................................................................................ 3
3.1 概念设计.......................................................................................................... 3
3.2 逻辑设计与物理设计...................................................................................... 3
4 可视化界面设计........................................................................................................ 4
4.1 MFC概述 ......................................................................................................... 4
4.2使用MFC AppWizard创建MFC 项目 .......................................................... 4
4.3主页面设计....................................................................................................... 6
5 程序及操作................................................................................................................ 7
5.1查询操作........................................................................................................... 7
5.2添加操作........................................................................................................... 7
5.3 修改操作.......................................................................................................... 8
5.4 删除操作.......................................................................................................... 9
5.5 显示操作.......................................................................................................... 9
5.6排序操作......................................................................................................... 10
5.7 显示不及格学生名单操作............................................................................ 11
6 调试报告.................................................................................................................. 12
7 心得体会.................................................................................................................. 13
参考文献...................................................................................................................... 14
程序清单...................................................................................................................... 15
1 引言
近年来由于各个大学都在持续扩招,学生的数量日益庞大,传统手工的学生成绩管理,管理过程繁琐而复杂,执行效率低,并且易于出错。另外,学生的成绩要用于学校教务管理的各个方面,所以一旦学生成绩管理出现了错误,后果往往是非常严重的。通过学习成绩管理系统,我们可以做到信息的规范管理和快速查询。因此学生成绩管理系统对学校加强学生成绩管理有着极其重要的作用。
本次设计的学生成绩管理系统是典型的信息管理系统,它能够高效率地帮助教师上传学生的成绩和最终成绩记录的保存,也方便了学生查询成绩,其开发主要包括后台数据库的建立和维护以及前台应用程序的开发两个方面。对于前者要求建立起数据一致性高和完整性强、数据安全性好的库,而对于后者则要求应用程序功能完备,易使用等特点。
基于学校学生众多,为了数据的安全性,系统将学生数据保存在数据库中,以Visual C++设计前台对系统进行设计。因为成绩管理系统是一项很实用的系统,所面对的数据量很大,所以我们要求系统能够高效快速的处理这些数据,并且要保证数据的正确性、相容性和安全性。C++作为前台是将数据库中的数据读取出来,有助于用户对这些数据进行相应的操作,使操作更方便,更符合用户的要求。所以该系统应该要有一个良好的界面,使用户感觉很直观,使用快捷,这就是用C++所要实现的功能。
2 设计要求 基于C++的学生成绩管理系统设计
学生成绩管理系统有学号,姓名,成绩等组成;
开发工具有VC++6.0,ACCESS2003,SQL2005等;
主要功能:前台用VC++设计界面,后台用数据库。
(1)能完成对学生成绩的录入、修改
(2)能统计学生的成绩,求学生的总分及平均分,并能根据学生的平均成绩进行排序
(3)能查询学生成绩,不及格科目及学生名单
(4)能输出学生的成绩单
3 数据库设计
3.1 概念设计
根据设计要求,要对学生成绩进行操作,所以系统实体属性包括学号,姓名通信网络成绩,数学成绩,英语成绩,信号与系统成绩。
由以上分析可以得该系统的E-R 关系图如图1所示
图1 学生成绩E-R 图
3.2 逻辑设计与物理设计
根据概念设计中的E-R 图,可设计一个表,其关系模型如下:
学生基本信息表:学号,姓名,英语成绩,数学成绩,网络成绩,信号成绩。
图2 学生成绩表物理结构
图3 学生成绩表
4 可视化界面设计
4.1 MFC概述
MFC (Microsoft Foundation Classes)库是Microsoft 为利用VC++开发Windows 应用程序而提供的应用程序框架。在这个框架的支持下,对于不同的应用程序,编程的主要任务是填写各自特殊部分的代码。MFC 类库由130多个类组成,封装了两千多个API 函数。
4.2使用MFC AppWizard创建MFC 项目
在Microsoft Visual Studio 6.0中,我们可以利用MFC AppWizard(MFC
应用程序向导)来建立MFC 项目,它提供了一个应用程序所必需的框架文件,如源文件、头文件、资源文件、项目文件等等。启动Visual C++ 6.0,从File 菜单中选择New 选项选中Projects 分页,在Projects 面板中左侧的项目类型列表框中单击选中要创建的项目类型。这里我们选择MFC AppWizard[exe]项,表示要创建一个MFC 应用程序。在Project Name文本输入框中输入要创建的项目的名称。点击确定,然后出现如下窗口,
图4 MFC窗口创建
选择Dialog Based对话框,接着点击Finish ,出现如下界面,能够设计主页面。
图5 主页面设计窗口
4.3主页面设计
根据设计要求,能够对学生的成绩进行查询,修改,添加及删除,还要能够打印出学生成绩单对学生成绩进行排序,以及能够查询不及格成绩名单和科目,因此在主页面上进行按钮设置,如此在主页面对学生成绩操作就非常方便。
主页面如图6所示:
图6 主页面
5 程序及操作
5.1查询操作
查询操作的功能是输入学号,点击查询按钮,就可以显示出学生的基本信息。 查询中运用Cstring 类中的Format ()函数,找到你要查询的学号与数据库中相匹配的学号,然后显示到查询显示区中。如图6所示:
图7 查询操作
5.2添加操作
添加操作是在点击添加按钮后,添加记录窗口跳出,在新窗口输入要添加的记录,点击确定按钮后,如果该学生的信息已存在(以学号判断),则提醒该学生信息已存在,如果添加成功,则跳出添加成功提示。查询中运用CRecordset 类中的MoveNext()函数,实现你要添加的该界面记录,到下一个界面记录,刚好将你要添加的学生信息添加到数据库中。如8图所示:
图8 添加操作
图9 添加成功
5.3 修改操作
修改操作主要是为了防止学生成绩出现错误,从而在成绩管理系统中进新修改。点击修改按钮后,跳出修改窗口,从中输入要修改学生的信息,学号,姓名,英语成绩,数学成绩,网络成绩,信号成绩。修改操作中,也是利用m_strFilter.Format()函数,首先对已经输入的学号进行与数据库中学号的匹配,如果成功则可继续修改,如果没有成功,则修改添加的数据进入不了数据库,MessageBox 会显示请输入正确学号。如下图所示:
图9 修改操作
5.4 删除操作
删除操作是先对要删除的学生进行查询,显示在主页面上,然后点击删除按钮,则可对该学生的信息进行删除,删除成功会显示删除成功窗口。删除操作也是利用CRecordset 类中的MoveNext()函数,首先匹配到你要删除的学号与数据库中的学号相对应,再利用CRecordset::SetFieldNull函数,将删除的信息清除,实现删除功能。如下图所示:
图9 删除操作
5.5 显示操作
显示操作是在点击显示按钮后,主页面的表格会显示所有学生成绩。现实操作中利用CRecordset::MoveFirst函数,此成员函数用来使第一个行集中的第一
个记录成为当前记录,接着每行每列依次进行扫描如表,从而显示在数据表中。如下图所示:
图10 显示操作
5.6排序操作
排序操作实在点击排序按钮后,主页面的表格上会显示出升序排列的学生成绩。现实操作中利用CRecordset::m_strSort函数,按照平均成绩从低到高依次排列,从而实现排列功能。如下图所示:
图11 排序操作
5.7 显示不及格学生名单操作
显示不及格学生名单操作是在点击不及格名单按钮后,主页面会显示不及格学生学号,姓名,不及格科目及分数。不及格操作中,首先利用CRecordset::MoveFirst函数,从第一个学生开始,进行筛选,如果有科目成绩低于六十分的,则输出该学生的学号姓名及低于六十分的科目及成绩,实现对不及格学生的操作。如图12所示:
图12 显示不及格学生名单操作
6 调试报告
基本工作完成后对其进行调试,调试过程中发现自己的程序存在一定的缺陷,例如在添加操作中对于已有的学生应该不能实现添加效果,系统还有待提高。在删除完成后应用MessageBox 来告知用户删除已完成。
自己的程序在调试是经常出现功能不能执行或者执行错误的情况,此时就要不断地对程序进行修改和调试,对其中的参数变量一定要一一对应,不能存在失误,头文件的添加,程序中各语句的完整及运行功能都是很重要的细节。
在显示不及格名单的时候,因为软件的问题,导致显示的时候有时能够完全显示不及格学生的姓名学号及不及格科目的成绩,有时候只能显示一部分,可见在设计时选取相应的实用软件对结果有影响。
7 心得体会
本次课程设计锻炼了我们综合利用C++语言进行程序设计的能力,考察了观察能力和总结能力和将所学知识转化为分析和设计简单实际问题的能力。通过此次学生成绩管理系统的设计,使我对面向对象程序设计有了深一步的了解,对系统设计及开发有了比较全面的思路。例如在Visual C++中,文档类、与文档类相关联的视图类以及视图类提供的显示框架窗口都是由文档模板创建的,每一种文档类型都有一种文档模板与之相对应,文档模板负责创建和管理该文档类型的所有文档。
总之,通过这次课程设计我也发现了自身存在的不足之处,虽然感觉理论上已经掌握,但在运用到实践的过程中仍有意想不到的困惑,经过与同学们探讨和向老师请教才得以解决,这也激发了我今后努力学习的兴趣,也很感谢老师和同学对我的帮助,我想这将对我以后的学习产生积极的影响,为今后的学习和实践打下了良好的基础。
参考文献
[1] 孙鑫 余安萍.VC++深入详解. 电子工业出版社.2010
[2] 刘韬,楼兴华.SQL Server2008数据库系统开发实例导航. 北京人民邮电 出版社,2010.
[3] 李光明.VisualC++6.0编程实例大制作[M ].北京:冶金工业出
版社,2012.
[4] 李红等.管理信息系统开发与应用[M ].北京电子工业出版社,2011.
[5]徐武等.VISUALC++6.0与ORACLE 数据库编程实例. 电子工业大学出版社.2010
程序清单
#include "stdafx.h"
#include "Student8.h"
#include "Student8Set.h"
#include "Student8Doc.h"
#include "Student8View.h"
#include "DigQuery.h"
#include "DlgAdd.h"
#include "DlgDel.h"
#include "DlgModify.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CStudent8View
IMPLEMENT_DYNCREATE(CStudent8View, CRecordView)
BEGIN_MESSAGE_MAP(CStudent8View, CRecordView)
//{{AFX_MSG_MAP(CStudent8View)
ON_BN_CLICKED(IDC_BUTTON1, OnBtnQuery)
ON_BN_CLICKED(IDC_BUTTON3, OnButton3)
ON_BN_CLICKED(IDC_BUTTON4, OnButton4)
ON_BN_CLICKED(IDC_BUTTON2, OnButton2)
ON_BN_CLICKED(IDC_BUTTON5, OnButton5)
ON_BN_CLICKED(IDC_BUTTON6, OnButton6)
ON_BN_CLICKED(IDC_BUTTON7, OnButton7)
ON_BN_CLICKED(IDC_BtnQuery, OnBtnQuery)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CRecordView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CRecordView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CRecordView::OnFilePrintPreview) END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CStudent8View construction/destruction
CStudent8View::CStudent8View()
: CRecordView(CStudent8View::IDD)
{
//{{AFX_DATA_INIT(CStudent8View)
m_pSet = NULL;
//}}AFX_DATA_INIT
// TODO: add construction code here
}
CStudent8View::~CStudent8View()
{
}
void CStudent8View::DoDataExchange(CDataExchange* pDX)
{
CRecordView::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CStudent8View)
DDX_Control(pDX, IDC_LIST1, m_list);
DDX_FieldText(pDX, IDC_EDIT_SUM, m_pSet->m_Sum, m_pSet);
DDX_FieldText(pDX, IDC_EDIT_AVG , m_pSet->m_Avg, m_pSet);
DDX_FieldText(pDX, IDC_EDIT_ENGLISH, m_pSet->m_English, m_pSet);
DDX_FieldText(pDX, IDC_EDIT_MATH, m_pSet->m_Math, m_pSet);
DDX_FieldText(pDX, IDC_EDIT_NET, m_pSet->m_Net, m_pSet);
DDX_FieldText(pDX, IDC_EDIT_SIGNAL, m_pSet->m_Signal, m_pSet);
DDX_FieldText(pDX, IDC_EDIT_SNA, m_pSet->m_Sna, m_pSet);
DDX_FieldText(pDX, IDC_EDIT_SNO, m_pSet->m_Sno, m_pSet);
//}}AFX_DATA_MAP
}
BOOL CStudent8View::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CRecordView::PreCreateWindow(cs);
}
void CStudent8View::OnInitialUpdate()
{
m_pSet = &GetDocument()->m_student8Set;
CRecordView::OnInitialUpdate();
GetParentFrame()->RecalcLayout();
ResizeParentToFit();
m_list.SetExtendedStyle(LVS_EX_FLATSB|LVS_EX_FULLROWSELECT|LVS_EX_HEADERDRAGDROP|LVS_EX_ONECLICKACTIVA TE|LVS_EX_GRIDLINES);
//设置扩展样式
m_list.InsertColumn(0,"学号",LVCFMT_LEFT,80,0);//添加项
m_list.InsertColumn(1,"姓名",LVCFMT_LEFT,80,1);//
m_list.InsertColumn(2,"英语",LVCFMT_LEFT,80,2);//
m_list.InsertColumn(3,"数学",LVCFMT_LEFT,80,3);//
m_list.InsertColumn(4,"网络",LVCFMT_LEFT,80,4);//
m_list.InsertColumn(5,"信号",LVCFMT_LEFT,80,5);
m_list.InsertColumn(6,"总分",LVCFMT_LEFT,80,6);
m_list.InsertColumn(7,"平均分",LVCFMT_LEFT,80,7);
}
/////////////////////////////////////////////////////////////////////////////
// CStudent8View printing
BOOL CStudent8View::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CStudent8View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CStudent8View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CStudent8View diagnostics
#ifdef _DEBUG
void CStudent8View::AssertValid() const
{
CRecordView::AssertValid();
}
void CStudent8View::Dump(CDumpContext& dc) const
{
CRecordView::Dump(dc);
}
CStudent8Doc* CStudent8View::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CStudent8Doc)));
return (CStudent8Doc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CStudent8View database support
CRecordset* CStudent8View::OnGetRecordset()
{
return m_pSet;
}
/////////////////////////////////////////////////////////////////////////////
// CStudent8View message handlers
///****查询******************************************************************** void CStudent8View::OnBtnQuery()
{
// TODO: Add your control notification handler code here
CDigQuery dlg;
if(dlg.DoModal()==IDOK)
{
if(dlg.m_Sno.IsEmpty())
{
MessageBox("要查询的学号不能为空!");
return;
}
if(m_pSet->IsOpen()) m_pSet->Close();//如果记录及打开,则先关闭
m_pSet->m_strFilter.Format("Sno='%s'",dlg.m_Sno);
m_pSet->Open();
if(!m_pSet->IsEOF()) //如果打开记录集有记录
UpdateData(FALSE);//自动更新表单中控件显示的内容
else
MessageBox("没有查到你要找的记录");
}
}
///*****添加********************************************************************
void CStudent8View::OnButton3()
{
// TODO: Add your control notification handler code here
CDlgAdd dlg;
if(dlg.DoModal()==IDOK)
{int flag=0;
m_pSet->MoveFirst();
UpdateData(TRUE);
while(!m_pSet->IsEOF())
{
if(dlg.m_Sno==m_pSet->m_Sno) //
{ flag=1;
MessageBox("该学生信息已存在"," 管理系统",0);}
m_pSet->MoveNext();}
if(flag==0)
{ m_pSet->AddNew();
m_pSet->m_Sna=dlg.m_Sna;//
m_pSet->m_Sno=dlg.m_Sno;
m_pSet->m_English=dlg.m_English;
m_pSet->m_Math=dlg.m_Math;
m_pSet->m_Net=dlg.m_Net;//
m_pSet->m_Signal=dlg.m_Signal;
m_pSet->m_Sum=dlg.m_Signal+dlg.m_Net+dlg.m_Math+dlg.m_English; m_pSet->m_Avg=(dlg.m_Signal+dlg.m_Net+dlg.m_Math+dlg.m_English)/4; m_pSet->Update();
m_pSet->Requery();
MessageBox("添加成功"," 学生管理系统",0);
}
}
}
///***************删除********************************************************** void CStudent8View::OnButton4()
{
// TODO: Add your control notification handler code here
m_pSet->Delete();
m_pSet->MoveNext();
if(m_pSet->IsEOF()) m_pSet->MoveLast();
if(m_pSet->IsBOF()) m_pSet->SetFieldNull(NULL);
UpdateData(FALSE);
MessageBox("删除成功");
}
///*****修改********************************************************************
void CStudent8View::OnButton2()
{
// TODO: Add your control notification handler code here
CDlgModify cm;
// int flag;
if(cm.DoModal()==IDOK)
{ if(m_pSet->IsOpen()) m_pSet->Close();//如果记录及打开,则先关闭
m_pSet->m_strFilter.Format("Sno='%s'",cm.m_Sno);
m_pSet->Open();
if(!m_pSet->IsEOF()) //如果打开记录集有记录
// flag = 1
{m_pSet->Edit();
m_pSet->m_Sno=cm.m_Sno;
m_pSet->m_Sna=cm.m_Sna;
m_pSet->m_English=cm.m_English;
m_pSet->m_Math=cm.m_Math;
m_pSet->m_Net=cm.m_Net;
m_pSet->m_Signal=cm.m_Signal;
m_pSet->m_Sum=cm.m_English+cm.m_Math+cm.m_Net+cm.m_Signal;
m_pSet->m_Avg=(cm.m_English+cm.m_Math+cm.m_Net+cm.m_Signal)/4;
m_pSet->Update();//将做的修改操作更新到数据库中
m_pSet->Requery();//重新查询记录集
MessageBox("修改成功"," 学生管理系统",0);
UpdateData(FALSE);}
else
MessageBox("请输入正确的学号");
}
///*****显示********************************************************************
int CStudent8View::OnButton5()
{
// TODO: Add your control notification handler code here
m_list.DeleteAllItems();
int i=0;
m_pSet->MoveFirst();
do
{
CString s;
s.Format("%s",m_pSet->m_Sno);
m_list.InsertItem(i,s,0);
m_list.SetItemText(i,1,m_pSet->m_Sna);
s.Format("%.1f",m_pSet->m_English);
m_list.SetItemText(i,2,s);
s.Format("%.1f",m_pSet->m_Math);
m_list.SetItemText(i,3,s);
s.Format("%.1f",m_pSet->m_Net);
m_list.SetItemText(i,4,s);
s.Format("%.1f",m_pSet->m_Signal);
m_list.SetItemText(i,5,s);
s.Format("%.1f",m_pSet->m_Sum);
m_list.SetItemText(i,6,s);
s.Format("%.1f",m_pSet->m_Avg);
m_list.SetItemText(i,7,s);
i++;
m_pSet->MoveNext();
}
while(!m_pSet->IsEOF());
if(m_pSet->IsEOF())
{m_pSet->MovePrev();}
m_pSet->Close();
m_pSet->Open();
return i;
}
///*****排序********************************************************************
void CStudent8View::OnButton6()
{
// TODO: Add your control notification handler code here
UpdateData();
m_pSet->Close();
m_pSet->m_strSort="Avg";
m_pSet->Open();
UpdateData(FALSE);
}
// *******不及格成绩***********************************************************
int CStudent8View::OnButton7()
{
// TODO: Add your control notification handler code here
m_list.DeleteAllItems();
int i=0;
int a=0,b=0,c=0,d=0;
m_pSet->MoveFirst();
do
{if(m_pSet->m_English
{ a=1;}
if(m_pSet->m_Math
{ b=1;}
if(m_pSet->m_Net
{ c=1;}
if(m_pSet->m_Signal
{ d=1;}
if(a==1||b==1||c==1||d==1)
{CString s;
s.Format("%s",m_pSet->m_Sno);
m_list.InsertItem(i,s,0);
m_list.SetItemText(i,1,m_pSet->m_Sna);
if(a==1)
{s.Format("%.1f",m_pSet->m_English);
m_list.SetItemText(i,2,s);}
if(b==1)
{s.Format("%.1f",m_pSet->m_Math);
m_list.SetItemText(i,3,s);}
if(c==1)
{s.Format("%.1f",m_pSet->m_Net);
m_list.SetItemText(i,4,s);}
if(d==1)
{s.Format("%.1f",m_pSet->m_Signal);
m_list.SetItemText(i,5,s);}}
a=0,b=0,c=0,d=0; i++; m_pSet->MoveNext();} while(!m_pSet->IsEOF()); if(m_pSet->IsEOF()) {m_pSet->MovePrev();} m_pSet->Close();
m_pSet->Open();
return i;
}
目录
1 引言............................................................................................................................ 1
2 设计要求.................................................................................................................... 2
3 数据库设计................................................................................................................ 3
3.1 概念设计.......................................................................................................... 3
3.2 逻辑设计与物理设计...................................................................................... 3
4 可视化界面设计........................................................................................................ 4
4.1 MFC概述 ......................................................................................................... 4
4.2使用MFC AppWizard创建MFC 项目 .......................................................... 4
4.3主页面设计....................................................................................................... 6
5 程序及操作................................................................................................................ 7
5.1查询操作........................................................................................................... 7
5.2添加操作........................................................................................................... 7
5.3 修改操作.......................................................................................................... 8
5.4 删除操作.......................................................................................................... 9
5.5 显示操作.......................................................................................................... 9
5.6排序操作......................................................................................................... 10
5.7 显示不及格学生名单操作............................................................................ 11
6 调试报告.................................................................................................................. 12
7 心得体会.................................................................................................................. 13
参考文献...................................................................................................................... 14
程序清单...................................................................................................................... 15
1 引言
近年来由于各个大学都在持续扩招,学生的数量日益庞大,传统手工的学生成绩管理,管理过程繁琐而复杂,执行效率低,并且易于出错。另外,学生的成绩要用于学校教务管理的各个方面,所以一旦学生成绩管理出现了错误,后果往往是非常严重的。通过学习成绩管理系统,我们可以做到信息的规范管理和快速查询。因此学生成绩管理系统对学校加强学生成绩管理有着极其重要的作用。
本次设计的学生成绩管理系统是典型的信息管理系统,它能够高效率地帮助教师上传学生的成绩和最终成绩记录的保存,也方便了学生查询成绩,其开发主要包括后台数据库的建立和维护以及前台应用程序的开发两个方面。对于前者要求建立起数据一致性高和完整性强、数据安全性好的库,而对于后者则要求应用程序功能完备,易使用等特点。
基于学校学生众多,为了数据的安全性,系统将学生数据保存在数据库中,以Visual C++设计前台对系统进行设计。因为成绩管理系统是一项很实用的系统,所面对的数据量很大,所以我们要求系统能够高效快速的处理这些数据,并且要保证数据的正确性、相容性和安全性。C++作为前台是将数据库中的数据读取出来,有助于用户对这些数据进行相应的操作,使操作更方便,更符合用户的要求。所以该系统应该要有一个良好的界面,使用户感觉很直观,使用快捷,这就是用C++所要实现的功能。
2 设计要求 基于C++的学生成绩管理系统设计
学生成绩管理系统有学号,姓名,成绩等组成;
开发工具有VC++6.0,ACCESS2003,SQL2005等;
主要功能:前台用VC++设计界面,后台用数据库。
(1)能完成对学生成绩的录入、修改
(2)能统计学生的成绩,求学生的总分及平均分,并能根据学生的平均成绩进行排序
(3)能查询学生成绩,不及格科目及学生名单
(4)能输出学生的成绩单
3 数据库设计
3.1 概念设计
根据设计要求,要对学生成绩进行操作,所以系统实体属性包括学号,姓名通信网络成绩,数学成绩,英语成绩,信号与系统成绩。
由以上分析可以得该系统的E-R 关系图如图1所示
图1 学生成绩E-R 图
3.2 逻辑设计与物理设计
根据概念设计中的E-R 图,可设计一个表,其关系模型如下:
学生基本信息表:学号,姓名,英语成绩,数学成绩,网络成绩,信号成绩。
图2 学生成绩表物理结构
图3 学生成绩表
4 可视化界面设计
4.1 MFC概述
MFC (Microsoft Foundation Classes)库是Microsoft 为利用VC++开发Windows 应用程序而提供的应用程序框架。在这个框架的支持下,对于不同的应用程序,编程的主要任务是填写各自特殊部分的代码。MFC 类库由130多个类组成,封装了两千多个API 函数。
4.2使用MFC AppWizard创建MFC 项目
在Microsoft Visual Studio 6.0中,我们可以利用MFC AppWizard(MFC
应用程序向导)来建立MFC 项目,它提供了一个应用程序所必需的框架文件,如源文件、头文件、资源文件、项目文件等等。启动Visual C++ 6.0,从File 菜单中选择New 选项选中Projects 分页,在Projects 面板中左侧的项目类型列表框中单击选中要创建的项目类型。这里我们选择MFC AppWizard[exe]项,表示要创建一个MFC 应用程序。在Project Name文本输入框中输入要创建的项目的名称。点击确定,然后出现如下窗口,
图4 MFC窗口创建
选择Dialog Based对话框,接着点击Finish ,出现如下界面,能够设计主页面。
图5 主页面设计窗口
4.3主页面设计
根据设计要求,能够对学生的成绩进行查询,修改,添加及删除,还要能够打印出学生成绩单对学生成绩进行排序,以及能够查询不及格成绩名单和科目,因此在主页面上进行按钮设置,如此在主页面对学生成绩操作就非常方便。
主页面如图6所示:
图6 主页面
5 程序及操作
5.1查询操作
查询操作的功能是输入学号,点击查询按钮,就可以显示出学生的基本信息。 查询中运用Cstring 类中的Format ()函数,找到你要查询的学号与数据库中相匹配的学号,然后显示到查询显示区中。如图6所示:
图7 查询操作
5.2添加操作
添加操作是在点击添加按钮后,添加记录窗口跳出,在新窗口输入要添加的记录,点击确定按钮后,如果该学生的信息已存在(以学号判断),则提醒该学生信息已存在,如果添加成功,则跳出添加成功提示。查询中运用CRecordset 类中的MoveNext()函数,实现你要添加的该界面记录,到下一个界面记录,刚好将你要添加的学生信息添加到数据库中。如8图所示:
图8 添加操作
图9 添加成功
5.3 修改操作
修改操作主要是为了防止学生成绩出现错误,从而在成绩管理系统中进新修改。点击修改按钮后,跳出修改窗口,从中输入要修改学生的信息,学号,姓名,英语成绩,数学成绩,网络成绩,信号成绩。修改操作中,也是利用m_strFilter.Format()函数,首先对已经输入的学号进行与数据库中学号的匹配,如果成功则可继续修改,如果没有成功,则修改添加的数据进入不了数据库,MessageBox 会显示请输入正确学号。如下图所示:
图9 修改操作
5.4 删除操作
删除操作是先对要删除的学生进行查询,显示在主页面上,然后点击删除按钮,则可对该学生的信息进行删除,删除成功会显示删除成功窗口。删除操作也是利用CRecordset 类中的MoveNext()函数,首先匹配到你要删除的学号与数据库中的学号相对应,再利用CRecordset::SetFieldNull函数,将删除的信息清除,实现删除功能。如下图所示:
图9 删除操作
5.5 显示操作
显示操作是在点击显示按钮后,主页面的表格会显示所有学生成绩。现实操作中利用CRecordset::MoveFirst函数,此成员函数用来使第一个行集中的第一
个记录成为当前记录,接着每行每列依次进行扫描如表,从而显示在数据表中。如下图所示:
图10 显示操作
5.6排序操作
排序操作实在点击排序按钮后,主页面的表格上会显示出升序排列的学生成绩。现实操作中利用CRecordset::m_strSort函数,按照平均成绩从低到高依次排列,从而实现排列功能。如下图所示:
图11 排序操作
5.7 显示不及格学生名单操作
显示不及格学生名单操作是在点击不及格名单按钮后,主页面会显示不及格学生学号,姓名,不及格科目及分数。不及格操作中,首先利用CRecordset::MoveFirst函数,从第一个学生开始,进行筛选,如果有科目成绩低于六十分的,则输出该学生的学号姓名及低于六十分的科目及成绩,实现对不及格学生的操作。如图12所示:
图12 显示不及格学生名单操作
6 调试报告
基本工作完成后对其进行调试,调试过程中发现自己的程序存在一定的缺陷,例如在添加操作中对于已有的学生应该不能实现添加效果,系统还有待提高。在删除完成后应用MessageBox 来告知用户删除已完成。
自己的程序在调试是经常出现功能不能执行或者执行错误的情况,此时就要不断地对程序进行修改和调试,对其中的参数变量一定要一一对应,不能存在失误,头文件的添加,程序中各语句的完整及运行功能都是很重要的细节。
在显示不及格名单的时候,因为软件的问题,导致显示的时候有时能够完全显示不及格学生的姓名学号及不及格科目的成绩,有时候只能显示一部分,可见在设计时选取相应的实用软件对结果有影响。
7 心得体会
本次课程设计锻炼了我们综合利用C++语言进行程序设计的能力,考察了观察能力和总结能力和将所学知识转化为分析和设计简单实际问题的能力。通过此次学生成绩管理系统的设计,使我对面向对象程序设计有了深一步的了解,对系统设计及开发有了比较全面的思路。例如在Visual C++中,文档类、与文档类相关联的视图类以及视图类提供的显示框架窗口都是由文档模板创建的,每一种文档类型都有一种文档模板与之相对应,文档模板负责创建和管理该文档类型的所有文档。
总之,通过这次课程设计我也发现了自身存在的不足之处,虽然感觉理论上已经掌握,但在运用到实践的过程中仍有意想不到的困惑,经过与同学们探讨和向老师请教才得以解决,这也激发了我今后努力学习的兴趣,也很感谢老师和同学对我的帮助,我想这将对我以后的学习产生积极的影响,为今后的学习和实践打下了良好的基础。
参考文献
[1] 孙鑫 余安萍.VC++深入详解. 电子工业出版社.2010
[2] 刘韬,楼兴华.SQL Server2008数据库系统开发实例导航. 北京人民邮电 出版社,2010.
[3] 李光明.VisualC++6.0编程实例大制作[M ].北京:冶金工业出
版社,2012.
[4] 李红等.管理信息系统开发与应用[M ].北京电子工业出版社,2011.
[5]徐武等.VISUALC++6.0与ORACLE 数据库编程实例. 电子工业大学出版社.2010
程序清单
#include "stdafx.h"
#include "Student8.h"
#include "Student8Set.h"
#include "Student8Doc.h"
#include "Student8View.h"
#include "DigQuery.h"
#include "DlgAdd.h"
#include "DlgDel.h"
#include "DlgModify.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CStudent8View
IMPLEMENT_DYNCREATE(CStudent8View, CRecordView)
BEGIN_MESSAGE_MAP(CStudent8View, CRecordView)
//{{AFX_MSG_MAP(CStudent8View)
ON_BN_CLICKED(IDC_BUTTON1, OnBtnQuery)
ON_BN_CLICKED(IDC_BUTTON3, OnButton3)
ON_BN_CLICKED(IDC_BUTTON4, OnButton4)
ON_BN_CLICKED(IDC_BUTTON2, OnButton2)
ON_BN_CLICKED(IDC_BUTTON5, OnButton5)
ON_BN_CLICKED(IDC_BUTTON6, OnButton6)
ON_BN_CLICKED(IDC_BUTTON7, OnButton7)
ON_BN_CLICKED(IDC_BtnQuery, OnBtnQuery)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CRecordView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CRecordView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CRecordView::OnFilePrintPreview) END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CStudent8View construction/destruction
CStudent8View::CStudent8View()
: CRecordView(CStudent8View::IDD)
{
//{{AFX_DATA_INIT(CStudent8View)
m_pSet = NULL;
//}}AFX_DATA_INIT
// TODO: add construction code here
}
CStudent8View::~CStudent8View()
{
}
void CStudent8View::DoDataExchange(CDataExchange* pDX)
{
CRecordView::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CStudent8View)
DDX_Control(pDX, IDC_LIST1, m_list);
DDX_FieldText(pDX, IDC_EDIT_SUM, m_pSet->m_Sum, m_pSet);
DDX_FieldText(pDX, IDC_EDIT_AVG , m_pSet->m_Avg, m_pSet);
DDX_FieldText(pDX, IDC_EDIT_ENGLISH, m_pSet->m_English, m_pSet);
DDX_FieldText(pDX, IDC_EDIT_MATH, m_pSet->m_Math, m_pSet);
DDX_FieldText(pDX, IDC_EDIT_NET, m_pSet->m_Net, m_pSet);
DDX_FieldText(pDX, IDC_EDIT_SIGNAL, m_pSet->m_Signal, m_pSet);
DDX_FieldText(pDX, IDC_EDIT_SNA, m_pSet->m_Sna, m_pSet);
DDX_FieldText(pDX, IDC_EDIT_SNO, m_pSet->m_Sno, m_pSet);
//}}AFX_DATA_MAP
}
BOOL CStudent8View::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CRecordView::PreCreateWindow(cs);
}
void CStudent8View::OnInitialUpdate()
{
m_pSet = &GetDocument()->m_student8Set;
CRecordView::OnInitialUpdate();
GetParentFrame()->RecalcLayout();
ResizeParentToFit();
m_list.SetExtendedStyle(LVS_EX_FLATSB|LVS_EX_FULLROWSELECT|LVS_EX_HEADERDRAGDROP|LVS_EX_ONECLICKACTIVA TE|LVS_EX_GRIDLINES);
//设置扩展样式
m_list.InsertColumn(0,"学号",LVCFMT_LEFT,80,0);//添加项
m_list.InsertColumn(1,"姓名",LVCFMT_LEFT,80,1);//
m_list.InsertColumn(2,"英语",LVCFMT_LEFT,80,2);//
m_list.InsertColumn(3,"数学",LVCFMT_LEFT,80,3);//
m_list.InsertColumn(4,"网络",LVCFMT_LEFT,80,4);//
m_list.InsertColumn(5,"信号",LVCFMT_LEFT,80,5);
m_list.InsertColumn(6,"总分",LVCFMT_LEFT,80,6);
m_list.InsertColumn(7,"平均分",LVCFMT_LEFT,80,7);
}
/////////////////////////////////////////////////////////////////////////////
// CStudent8View printing
BOOL CStudent8View::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CStudent8View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CStudent8View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CStudent8View diagnostics
#ifdef _DEBUG
void CStudent8View::AssertValid() const
{
CRecordView::AssertValid();
}
void CStudent8View::Dump(CDumpContext& dc) const
{
CRecordView::Dump(dc);
}
CStudent8Doc* CStudent8View::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CStudent8Doc)));
return (CStudent8Doc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CStudent8View database support
CRecordset* CStudent8View::OnGetRecordset()
{
return m_pSet;
}
/////////////////////////////////////////////////////////////////////////////
// CStudent8View message handlers
///****查询******************************************************************** void CStudent8View::OnBtnQuery()
{
// TODO: Add your control notification handler code here
CDigQuery dlg;
if(dlg.DoModal()==IDOK)
{
if(dlg.m_Sno.IsEmpty())
{
MessageBox("要查询的学号不能为空!");
return;
}
if(m_pSet->IsOpen()) m_pSet->Close();//如果记录及打开,则先关闭
m_pSet->m_strFilter.Format("Sno='%s'",dlg.m_Sno);
m_pSet->Open();
if(!m_pSet->IsEOF()) //如果打开记录集有记录
UpdateData(FALSE);//自动更新表单中控件显示的内容
else
MessageBox("没有查到你要找的记录");
}
}
///*****添加********************************************************************
void CStudent8View::OnButton3()
{
// TODO: Add your control notification handler code here
CDlgAdd dlg;
if(dlg.DoModal()==IDOK)
{int flag=0;
m_pSet->MoveFirst();
UpdateData(TRUE);
while(!m_pSet->IsEOF())
{
if(dlg.m_Sno==m_pSet->m_Sno) //
{ flag=1;
MessageBox("该学生信息已存在"," 管理系统",0);}
m_pSet->MoveNext();}
if(flag==0)
{ m_pSet->AddNew();
m_pSet->m_Sna=dlg.m_Sna;//
m_pSet->m_Sno=dlg.m_Sno;
m_pSet->m_English=dlg.m_English;
m_pSet->m_Math=dlg.m_Math;
m_pSet->m_Net=dlg.m_Net;//
m_pSet->m_Signal=dlg.m_Signal;
m_pSet->m_Sum=dlg.m_Signal+dlg.m_Net+dlg.m_Math+dlg.m_English; m_pSet->m_Avg=(dlg.m_Signal+dlg.m_Net+dlg.m_Math+dlg.m_English)/4; m_pSet->Update();
m_pSet->Requery();
MessageBox("添加成功"," 学生管理系统",0);
}
}
}
///***************删除********************************************************** void CStudent8View::OnButton4()
{
// TODO: Add your control notification handler code here
m_pSet->Delete();
m_pSet->MoveNext();
if(m_pSet->IsEOF()) m_pSet->MoveLast();
if(m_pSet->IsBOF()) m_pSet->SetFieldNull(NULL);
UpdateData(FALSE);
MessageBox("删除成功");
}
///*****修改********************************************************************
void CStudent8View::OnButton2()
{
// TODO: Add your control notification handler code here
CDlgModify cm;
// int flag;
if(cm.DoModal()==IDOK)
{ if(m_pSet->IsOpen()) m_pSet->Close();//如果记录及打开,则先关闭
m_pSet->m_strFilter.Format("Sno='%s'",cm.m_Sno);
m_pSet->Open();
if(!m_pSet->IsEOF()) //如果打开记录集有记录
// flag = 1
{m_pSet->Edit();
m_pSet->m_Sno=cm.m_Sno;
m_pSet->m_Sna=cm.m_Sna;
m_pSet->m_English=cm.m_English;
m_pSet->m_Math=cm.m_Math;
m_pSet->m_Net=cm.m_Net;
m_pSet->m_Signal=cm.m_Signal;
m_pSet->m_Sum=cm.m_English+cm.m_Math+cm.m_Net+cm.m_Signal;
m_pSet->m_Avg=(cm.m_English+cm.m_Math+cm.m_Net+cm.m_Signal)/4;
m_pSet->Update();//将做的修改操作更新到数据库中
m_pSet->Requery();//重新查询记录集
MessageBox("修改成功"," 学生管理系统",0);
UpdateData(FALSE);}
else
MessageBox("请输入正确的学号");
}
///*****显示********************************************************************
int CStudent8View::OnButton5()
{
// TODO: Add your control notification handler code here
m_list.DeleteAllItems();
int i=0;
m_pSet->MoveFirst();
do
{
CString s;
s.Format("%s",m_pSet->m_Sno);
m_list.InsertItem(i,s,0);
m_list.SetItemText(i,1,m_pSet->m_Sna);
s.Format("%.1f",m_pSet->m_English);
m_list.SetItemText(i,2,s);
s.Format("%.1f",m_pSet->m_Math);
m_list.SetItemText(i,3,s);
s.Format("%.1f",m_pSet->m_Net);
m_list.SetItemText(i,4,s);
s.Format("%.1f",m_pSet->m_Signal);
m_list.SetItemText(i,5,s);
s.Format("%.1f",m_pSet->m_Sum);
m_list.SetItemText(i,6,s);
s.Format("%.1f",m_pSet->m_Avg);
m_list.SetItemText(i,7,s);
i++;
m_pSet->MoveNext();
}
while(!m_pSet->IsEOF());
if(m_pSet->IsEOF())
{m_pSet->MovePrev();}
m_pSet->Close();
m_pSet->Open();
return i;
}
///*****排序********************************************************************
void CStudent8View::OnButton6()
{
// TODO: Add your control notification handler code here
UpdateData();
m_pSet->Close();
m_pSet->m_strSort="Avg";
m_pSet->Open();
UpdateData(FALSE);
}
// *******不及格成绩***********************************************************
int CStudent8View::OnButton7()
{
// TODO: Add your control notification handler code here
m_list.DeleteAllItems();
int i=0;
int a=0,b=0,c=0,d=0;
m_pSet->MoveFirst();
do
{if(m_pSet->m_English
{ a=1;}
if(m_pSet->m_Math
{ b=1;}
if(m_pSet->m_Net
{ c=1;}
if(m_pSet->m_Signal
{ d=1;}
if(a==1||b==1||c==1||d==1)
{CString s;
s.Format("%s",m_pSet->m_Sno);
m_list.InsertItem(i,s,0);
m_list.SetItemText(i,1,m_pSet->m_Sna);
if(a==1)
{s.Format("%.1f",m_pSet->m_English);
m_list.SetItemText(i,2,s);}
if(b==1)
{s.Format("%.1f",m_pSet->m_Math);
m_list.SetItemText(i,3,s);}
if(c==1)
{s.Format("%.1f",m_pSet->m_Net);
m_list.SetItemText(i,4,s);}
if(d==1)
{s.Format("%.1f",m_pSet->m_Signal);
m_list.SetItemText(i,5,s);}}
a=0,b=0,c=0,d=0; i++; m_pSet->MoveNext();} while(!m_pSet->IsEOF()); if(m_pSet->IsEOF()) {m_pSet->MovePrev();} m_pSet->Close();
m_pSet->Open();
return i;
}