学生学籍管理系统
课程设计
院(系): 计算机工程学院
专业: 计算机科学与技术
姓名: 王凯伟
班级: 计算083 学号:
题目: 学生学籍管理系统
起迄日期: _ 2019.1.3 ~ 2019.1.16 _
设计地点: 西安石油大学
指导教师:
目录
1、概述
1.1本系统实现的内容…………………………………3
1.2开发环境介绍………………………………………3
2、需求分析
2.1开发背景……………………………………………4
2.2开发目的……………………………………………4
2.3功能需求……………………………………………4
2.4数据需求……………………………………………4
3.1总体设计……………………………………………6
4.1概念设计……………………………………………7
4.2逻辑设计……………………………………………10
6.1总结…………………………………………………17
6.2系统不足……………………………………………17
7、参考文献……………………………………………………18
关键词:vc++ MFC acecl execl 学生学籍管理
数据表 窗体设计,数据库设计
英文关键词:vc++ MFC acecl execl Student status management;dataSheet From data
1、概述:
1.1本系统实现的内容:
本系统是开发一个基于VC++技术的学生学籍管理系统,为单机版的对所有学生从入学到毕业的全部过程中的基本信息进行管理的系统。能实现简单查询(分为按学生学号、按学生姓名,也可单独查询已毕业的学生、在校的学生、休学的学生),简单插入(分为按学生表、课程表、教师表进行),简单删除(分为按学生学号、按学生姓名删除学生表中的信息,,简单修改(分为按学生表、课程表、教师表进行)。系统增加第三方软软皮肤。但是由于时间限制,软件在调试状态皮肤显示正常,而在脱离开发环境时失效,有待后面继续完善。数据库使用ACCESS小型数据库满足设计要求。软件整个框架搭建在mainfeam基础上,便于图片显示和文档的实现。报表导出为execl表格,便于打印和整理
1.2开发环境介绍:
开发语言:VC++ (基于MFC库4,2开发)
开发工具:Microsoft Visual C++ 6.0 现已经升级为VS2008工程
数据库系统:Microsoft access9.0 数据库
表格execl:
操作系统:WindowsXP
开发技术介绍:
Visual C++提供了多种多样的数据库访问技术――ODBC API、MFC ODBC、DAO、OLE DB 和ADO 等。这些技术各有自己的特点,提供了简单、灵活、访问速度快、可扩展性好的服务特性。
ACCESS是一个小型数据库管理系统。虽然体积小,但功能强大、操作简便、日益为广大数据库用户所喜爱。越来越多的开发工具提供了,对于一个数据库开发管理人员来说非常必要。SQL语言的主要功能就是同各种数据库建立联系,进行沟通。按照ANSI(美国国家标准协会)的规定,SQL被作为关系型数据库管理系统的标准语言。SQL语句可以用来执行各种各样的操作,例如更新数据库中的数据,从数据库中提取数据等。绝大多数流行的关系型数据库管理系统都采用了SQL语言标准。虽然很多数据库都对SQL语句进行了再开发和扩展,但是包括Select, Insert, Update, Delete, Create,以及Drop在内的标准的SQL命令仍然可以被用来完成几乎所有的数据库操作。
开放数据库互连(Open Database Connectivity,ODBC)是微软公司开放服务结构(WOSA,Windows Open Services Architecture)中有关数据库的一个组成部分,它建立了一组规范,并提供了一组对数据库访问的标准API(应用程序编程接口)。这些API利用SQL来完成其大部分任务。ODBC本身也提供了对SQL语言的支持,用户可以直接将SQL语句送给ODBC。一个基于ODBC的应用程序对数据库的操作不依赖任何DBMS,不直接与DBMS打交道,所有的数据库操作由对应的DBMS的ODBC驱动程序完成。也就是说,不论是FoxPro、Access还是Oracle数据库,均可用ODBCAPI进行访问。由此可见,ODBC的最大优点是能以统一的方式处理所有的数据库。
2、需求分析:
2.1开发背景:
由于大学生类别和专业的设置的多样化,大学生的学籍管理历来是非常繁琐和复杂的的工作。面对庞大的信息量, 这时的人工管理几乎无法实现,在这种情况下用数据库进行管理变的尤为必要,这可以发挥计算机的优势。学生信息管理系统应运而生,以此来提高学生管理工作的效率。通过这样的系统,可以做到信息的规范管理、科学统计和快速查询,从而减少管理方面的工作量和人为的错误。
2.2开发目的:
为了使学生档案的管理更方便,为了减轻行政人员的工作负担,通过本系统软件的开发,能帮助管理人员利用计算机,快速方便的对学生学籍管理进行管理所需操作,使散乱的人事档案能够具体化、直观化、合理化。
2.3功能需求:
概括的说,该系统需要实现学生信息的基本查询功能,学生、课程、,学生、信息的删除功能,学生、课程、信息的修改功能。
详细讲,该系统能实现:
(1)能够游览学生学籍的所有信息。
(2)能够通过学生的一个信息找到个人学籍的相关信息。(例如:知道学生的姓名,能够找到该学生的所有有关的学籍信息)
(3) 通过一条信息找到与之匹配的信息。(例如:查询已毕业的所有人员)
(4)相关人员能对包含学生的学籍信息进行管理。(因为学生有关情况不是固定不变的(例如改名等的)所以一旦学生信息发生改变就要对原有信息进行诸如添加,删除,修改等的操作)
(5)对管理的数据库进行备份功能,以便在发生事故的时候可以能够减少损害。
2.4数据需求:
通过对系统功能需求的分析,可以初步确定该系统的基本数据需求。由各个功能模块可以进一步确定具体的数据需求。具体数据需求如下:
该模块主要查询学生的相关信息,需要表示学生信息的数据,应包括学号、姓名、性别、民族、出生日期、入学时间、身份证号、政治面貌、家庭住址、籍贯、邮政编码、院系号、专业号、备注等数据项。
该模块主要插入信息,需要表示学生、教师、课程信息的数据,应包括学号、姓名(学生)、性别(学生)、民族、出生日期、入学时间、身份证号、政治面貌、家庭住址、籍贯、邮政编码、院系号、专业号、备注、姓名(教师)、性别(教师)、教工号、职称、院系号、电话、课程号、课程名、学分等数据项。
该模块主要实现按学号、学生姓名删除学生的相关信息,或按教工号删除教师信息。需要表示学生、教师信息的数据,应包括学号、姓名(学生)、性别(学生)、民族、出生日期、入学时间、身份证号、政治面貌、家庭住址、籍贯、邮政编码、院系号、专业号、备注、姓名(教师)、性别(教师)、教工号、职称、院系号、电话、课程号等数据项。
该模块主要实现学生表、课程表、教师表的修改功能,需要表示学生、教师、课程信息的数据,应包括学号、姓名(学生)、性别(学生)、民族、出生日期、入学时间、身份证号、政治面貌、家庭住址、籍贯、邮政编码、院系号、专业号、备注、姓名(教师)、性别(教师)、教工号、职称、院系号、电话、课程号、课程名、学分等数据项。
数据表格设计:
2.1登陆表格
2.2班级表格:编号 姓名 系 专业 教师 备注
2.3
3、系统设计
3.1总体设计:
登陆界面 |
系统界面 |
简单查询 |
简单插入 |
简单删除 |
简单修改 |
数据库管理 |
在校 |
毕业 |
休学 |
学生表 |
课程表 |
教师表 |
按 学号查询 |
按学生名查询 |
按 学号删除 |
按学生名删除 |
按教工号删除 |
学生表 |
课程表 |
教师表 |
数据源 |
连接 |
备份 |
断开 |
退出 |
4、数据库设计
4.1概念设计:
课程实体属性图:
课程 |
课程号 |
课程名 |
学分 |
学号 |
教师实体属性图:
教师 |
姓名 |
性别 |
教工号 |
职称 |
院系号 |
电话 |
课程号 |
学生实体属性图:
学生 |
姓名 |
性别 |
民族 |
出生日期 |
入学日期 |
学号 |
身份证号 |
政治面貌 |
家庭住址 |
籍贯 |
邮政编码 |
院系号 |
专业号 |
备注 |
院系实体属性图:
院系 |
院系号 |
院系名称 |
院长名 |
专业号 |
专业名 |
毕业实体属性图:
毕业 |
学号 |
姓名 |
性别 |
身份证号 |
已修学分 |
毕业证号 |
院系号 |
入学时间 |
需修学分 |
学生学籍管理系统E-R图:
|
毕业 |
1 n
学习 |
1 n
选择 |
|
|
1
1
工作 |
m
课程 |
教授 |
n n
|
m
4.2逻辑设计
数据库表的简要说明:
表名 |
简要说明 |
课程 |
存放课程的信息 |
教师 |
存放教师的信息 |
学生 |
存放学生的信息 |
院系 |
存放院系信息 |
毕业 |
存放已毕业学生的信息 |
课程表:
列名 |
数据类型 |
能否为空 |
课程号 |
char(4) |
NOT NULL |
课程名 |
char(40) |
NULL |
学分 |
char(10) |
NULL |
学号 |
char(50) |
NOT NULL |
学生表:
列名 |
数据类型 |
能否为空 |
学号 |
char(50) |
NOT NULL |
姓名 |
char(10) |
NULL |
性别 |
char(2) |
NULL |
民族 |
char(4) |
NULL |
出生日期 |
datetime(8) |
NULL |
入学日期 |
datetime(8) |
NULL |
身份证号 |
char(20) |
NULL |
政治面貌 |
char(10) |
NULL |
家庭住址 |
char(50) |
NULL |
籍贯 |
char(10) |
NULL |
邮政编码 |
char(10) |
NULL |
院系号 |
char(10) |
NULL |
专业号 |
char(10) |
NULL |
备注 |
char(10) |
NULL |
成绩表原始设计
5、详细设计
登陆界面:
这部分主要实现用户名及密码的验证功能。
CLoginDlg::CLoginDlg(CWnd* pParent /*=NULL*/)
: CDialog(CLoginDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CLoginDlg)
m_strUser = _T("");
m_strPass = _T("");
//}}AFX_DATA_INIT
}
void CLoginDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CLoginDlg)
DDX_Control(pDX, IDC_EDIT1, m_ctrPass);
DDX_Control(pDX, IDC_COMBO1, m_ctrUser);
DDX_CBString(pDX, IDC_COMBO1, m_strUser);
DDX_Text(pDX, IDC_EDIT1, m_strPass);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CLoginDlg, CDialog)
//{{AFX_MSG_MAP(CLoginDlg)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CLoginDlg message handlers
void CLoginDlg::OnOK()
{
// TODO: Add extra validation here
CUserSet recordset;
CString strSQL;
UpdateData(TRUE);
CSchoolApp* ptheApp = (CSchoolApp *) AfxGetApp();
strSQL.Format("select * from user where user='%s' AND passwd='%s'",m_strUser,m_strPass);
if(!recordset.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL))
{
MessageBox("打开数据库失败!","数据库错误",MB_OK);
return ;
}
if(recordset.GetRecordCount()==0)
{
recordset.Close();
MessageBox("密码错误,请重新输入!");
m_strPass="";
m_ctrPass.SetFocus();
UpdateData(FALSE);
}
else
{
ptheApp->m_bIsAdmin = recordset.m_isadmin;
recordset.Close();
CDialog::OnOK();
}
}
BOOL CLoginDlg::OnInitDialog()
{
CDialog::OnInitDialog();
CUserSet recordset ;
CString strSQL;
UpdateData(TRUE);
//strSQL.Format("select * from password where user='%s' AND passwd='%s'",m_strUser,m_strPass);
strSQL="select * from user";
if(!recordset.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL))
{
MessageBox("打开数据库失败!","数据库错误",MB_OK);
return FALSE;
}
while(!recordset.IsEOF())
{
m_ctrUser.AddString(recordset.m_user);
recordset.MoveNext();
}
recordset.Close();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CLoginDlg::OnCancel()
{
// TODO: Add extra cleanup here
CDialog::OnCancel();
}
主界面设计:
简单查询操作:
部分界面详细设计附代码。
//学生成绩录入
#include "stdafx.h"
#include "school.h"
#include "ScoreInputDlg.h"
#include "classset.h"
#include "examtimeset.h"
#include "examsubjectset.h"
#include "examtypeset.h"
#include "StudentSet.h"
#include "scoredlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CScoreInputDlg dialog
CScoreInputDlg::CScoreInputDlg(CWnd* pParent /*=NULL*/)
: CDialog(CScoreInputDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CScoreInputDlg)
m_strClass = _T("");
m_strSubject = _T("");
m_strTime = _T("");
m_strType = _T("");
//}}AFX_DATA_INIT
}
void CScoreInputDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CScoreInputDlg)
DDX_Control(pDX, IDC_COMBO_TYPE, m_ctrType);
DDX_Control(pDX, IDC_COMBO_TIME, m_ctrTime);
DDX_Control(pDX, IDC_COMBO_SUBJECT, m_ctrSubject);
DDX_Control(pDX, IDC_COMBO_CLASS, m_ctrClass);
DDX_Control(pDX, IDC_LIST2, m_ctrList);
DDX_CBString(pDX, IDC_COMBO_CLASS, m_strClass);
DDX_CBString(pDX, IDC_COMBO_SUBJECT, m_strSubject);
DDX_CBString(pDX, IDC_COMBO_TIME, m_strTime);
DDX_CBString(pDX, IDC_COMBO_TYPE, m_strType);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CScoreInputDlg, CDialog)
//{{AFX_MSG_MAP(CScoreInputDlg)
ON_BN_CLICKED(IDC_BUTTON_INPUT, OnButtonInput)
ON_NOTIFY(NM_DBLCLK, IDC_LIST2, OnDblclkList2)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CScoreInputDlg message handlers
void CScoreInputDlg::OnButtonInput() //学生成绩录入事件
{
// TODO: Add your control notification handler code here
UpdateData();
if(m_strClass.IsEmpty())
{
AfxMessageBox("请选择班级");
return;
}
if(m_strTime.IsEmpty())
{
AfxMessageBox("请选择考试时间段");
return;
}
if(m_strType.IsEmpty())
{
AfxMessageBox("请选择考试类型");
return;
}
if(m_strSubject.IsEmpty())
{
AfxMessageBox("请选择考试科目");
return;
}
CString strSQL;
strSQL.Format("select * from score \
where class = '%s'and time = '%s'\
and type = '%s'and subject = '%s'"
,m_strClass,m_strTime,m_strType,m_strSubject);
//
//
// );
if(!m_recordset.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL))
{
MessageBox("打开数据库失败!","数据库错误",MB_OK);
return ;
}
if(m_recordset.GetRecordCount()==0)
{
m_recordset.Close();
CreateScoreTable();
}
else
{
m_recordset.Close();
}
RefreshData(strSQL);
}
void CScoreInputDlg::CreateScoreTable()
{
CString strSQL;
CStudentSet StudentSet;
strSQL.Format("select * from student where class = '%s'",m_strClass);
if(!StudentSet.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL))
{
MessageBox("打开数据库失败!","数据库错误",MB_OK);
return ;
}
if(!m_recordset.Open(AFX_DB_USE_DEFAULT_TYPE))
{
MessageBox("打开数据库失败!","数据库错误",MB_OK);
return ;
}
while(!StudentSet.IsEOF())
{
m_recordset.AddNew();
m_recordset.m_code = StudentSet.m_code;
m_recordset.m_class = m_strClass;
m_recordset.m_name = StudentSet.m_name;
m_recordset.m_subject = m_strSubject;
m_recordset.m_time = m_strTime;
m_recordset.m_type = m_strType;
m_recordset.Update();
StudentSet.MoveNext();
}
m_recordset.Close();
StudentSet.Close();
}
void CScoreInputDlg::RefreshData(CString strSQL)
{
m_ctrList.DeleteAllItems();
m_ctrList.SetRedraw(FALSE);
UpdateData(TRUE);
if(!m_recordset.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL))
{
MessageBox("打开数据库失败!","数据库错误",MB_OK);
return ;
}
int i=0;
char buffer[20];
while(!m_recordset.IsEOF())
{
_ltoa(m_recordset.m_ID,buffer,10);
m_ctrList.InsertItem(i,buffer);
m_ctrList.SetItemText(i,1,m_recordset.m_code);
m_ctrList.SetItemText(i,2,m_recordset.m_name);
m_ctrList.SetItemText(i,3,m_strSubject);
_ltoa(m_recordset.m_score,buffer,10);
m_ctrList.SetItemText(i,4,buffer);
_ltoa(m_recordset.m_makeup_score,buffer,10);
m_ctrList.SetItemText(i,5,buffer);
m_ctrList.SetItemText(i,6,m_recordset.m_absent);
i++;
m_recordset.MoveNext();
}
m_recordset.Close();
m_ctrList.SetRedraw(TRUE);
}
BOOL CScoreInputDlg::OnInitDialog()
{
CDialog::OnInitDialog();
CString strSQL;
//初始化班级
CClassSet ClassSet ;
strSQL="select * from class";
if(!ClassSet.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL))
{
AfxMessageBox("打开数据库失败!");
}
while(!ClassSet.IsEOF())
{
m_ctrClass.AddString(ClassSet.m_code);
ClassSet.MoveNext();
}
ClassSet.Close();
//初始化时间段
CExamtimeSet TimeSet ;
strSQL="select * from examtime";
if(!TimeSet.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL))
{
AfxMessageBox("打开数据库失败!");
}
while(!TimeSet.IsEOF())
{
m_ctrTime.AddString(TimeSet.m_time);
TimeSet.MoveNext();
}
TimeSet.Close();
//初始化考试类型
CExamtypeSet TypeSet ;
strSQL="select * from examtype";
if(!TypeSet.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL))
{
AfxMessageBox("打开数据库失败!");
}
while(!TypeSet.IsEOF())
{
m_ctrType.AddString(TypeSet.m_name);
TypeSet.MoveNext();
}
TypeSet.Close();
//初始化考试科目
CExamSubjectSet SubjectSet ;
strSQL="select * from examsubject";
if(!SubjectSet.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL))
{
AfxMessageBox("打开数据库失败!");
}
while(!SubjectSet.IsEOF())
{
m_ctrSubject.AddString(SubjectSet.m_name);
SubjectSet.MoveNext();
}
SubjectSet.Close();
//初始化成绩列表
m_ctrList.InsertColumn(0,"序号");
m_ctrList.InsertColumn(1,"学号");
m_ctrList.InsertColumn(2,"姓名");
m_ctrList.InsertColumn(3,"科目");
m_ctrList.InsertColumn(4,"成绩");
m_ctrList.InsertColumn(5,"补考成绩");
m_ctrList.InsertColumn(6,"缺考标志");
m_ctrList.SetColumnWidth(0,60);
m_ctrList.SetColumnWidth(1,80);
m_ctrList.SetColumnWidth(2,80);
m_ctrList.SetColumnWidth(3,100);
m_ctrList.SetColumnWidth(4,80);
m_ctrList.SetColumnWidth(5,80);
m_ctrList.SetColumnWidth(6,60);
m_ctrList.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CScoreInputDlg::OnDblclkList2(NMHDR* pNMHDR, LRESULT* pResult) //双击列表时
{
// TODO: Add your control notification handler code here
CString strSQL;
long score=0,makeup=0;
CScoreDlg Dlg;
UpdateData(TRUE);
int i = m_ctrList.GetSelectionMark();
if(i<0) return;
if(IDOK!=Dlg.DoModal())
{
return;
}
if(!Dlg.m_strScore.IsEmpty())
score = atol(Dlg.m_strScore);
if(!Dlg.m_strMakeup.IsEmpty())
makeup = atol(Dlg.m_strMakeup);
strSQL.Format("select * from score where ID=%s",m_ctrList.GetItemText(i,0));
if(!m_recordset.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL))
{
MessageBox("打开数据库失败!","数据库错误",MB_OK);
return ;
}
m_recordset.Edit();
if(Dlg.m_bAbsent)
m_recordset.m_absent = "是";
m_recordset.m_score = score;
m_recordset.m_makeup_score = makeup;
m_recordset.m_time=m_strTime;
m_recordset.m_subject=m_strSubject;
m_recordset.m_type=m_strType;
m_recordset.Update();
char buffer[20];
_ltoa(m_recordset.m_score,buffer,10);
m_ctrList.SetItemText(i,4,buffer);
_ltoa(m_recordset.m_makeup_score,buffer,10);
m_ctrList.SetItemText(i,5,buffer);
m_ctrList.SetItemText(i,6,m_recordset.m_absent);
m_recordset.Close();
*pResult = 0;
}
//班级成绩汇总
#include "stdafx.h"
#include "school.h"
#include "ScoreClassStatDlg.h"
#include "classset.h"
#include "examtimeset.h"
#include "examtypeset.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CScoreClassStatDlg dialog
CScoreClassStatDlg::CScoreClassStatDlg(CWnd* pParent /*=NULL*/)
: CDialog(CScoreClassStatDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CScoreClassStatDlg)
m_strClass = _T("");
m_strTime = _T("");
m_strType = _T("");
//}}AFX_DATA_INIT
}
void CScoreClassStatDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CScoreClassStatDlg)
DDX_Control(pDX, IDC_LIST2, m_ctrList);
DDX_Control(pDX, IDC_COMBO_TYPE, m_ctrType);
DDX_Control(pDX, IDC_COMBO_TIME, m_ctrTime);
DDX_Control(pDX, IDC_COMBO_CLASS, m_ctrClass);
DDX_CBString(pDX, IDC_COMBO_CLASS, m_strClass);
DDX_CBString(pDX, IDC_COMBO_TIME, m_strTime);
DDX_CBString(pDX, IDC_COMBO_TYPE, m_strType);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CScoreClassStatDlg, CDialog)
//{{AFX_MSG_MAP(CScoreClassStatDlg)
ON_BN_CLICKED(IDC_BUTTON_STAT, OnButtonStat)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CScoreClassStatDlg message handlers
BOOL CScoreClassStatDlg::OnInitDialog()
{
CDialog::OnInitDialog();
CString strSQL;
//初始化班级
CClassSet ClassSet ;
strSQL="select * from class";
if(!ClassSet.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL))
{
AfxMessageBox("打开数据库失败!");
}
while(!ClassSet.IsEOF())
{
m_ctrClass.AddString(ClassSet.m_code);
ClassSet.MoveNext();
}
ClassSet.Close();
//初始化时间段
CExamtimeSet TimeSet ;
strSQL="select * from examtime";
if(!TimeSet.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL))
{
AfxMessageBox("打开数据库失败!");
}
while(!TimeSet.IsEOF())
{
m_ctrTime.AddString(TimeSet.m_time);
TimeSet.MoveNext();
}
TimeSet.Close();
//初始化考试类型
CExamtypeSet TypeSet ;
strSQL="select * from examtype";
if(!TypeSet.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL))
{
AfxMessageBox("打开数据库失败!");
}
while(!TypeSet.IsEOF())
{
m_ctrType.AddString(TypeSet.m_name);
TypeSet.MoveNext();
}
TypeSet.Close();
//初始化成绩列表
m_ctrList.InsertColumn(0,"科目");
m_ctrList.InsertColumn(1,"参考人数");
m_ctrList.InsertColumn(2,"缺考人数");
m_ctrList.InsertColumn(3,"平均成绩");
m_ctrList.InsertColumn(4,"不及格人数");
m_ctrList.InsertColumn(5,"及格率");
m_ctrList.InsertColumn(6,"优秀人数");
m_ctrList.InsertColumn(7,"优秀率");
m_ctrList.SetColumnWidth(0,100);
m_ctrList.SetColumnWidth(1,60);
m_ctrList.SetColumnWidth(2,60);
m_ctrList.SetColumnWidth(3,60);
m_ctrList.SetColumnWidth(4,80);
m_ctrList.SetColumnWidth(5,60);
m_ctrList.SetColumnWidth(6,60);
m_ctrList.SetColumnWidth(7,60);
m_ctrList.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CScoreClassStatDlg::OnButtonStat()
{
UpdateData();
if(m_strClass.IsEmpty())
{
AfxMessageBox("请选择班级");
return;
}
if(m_strTime.IsEmpty())
{
AfxMessageBox("请选择考试时间段");
return;
}
if(m_strType.IsEmpty())
{
AfxMessageBox("请选择考试类型");
return;
}
m_ctrList.DeleteAllItems();
m_ctrList.SetRedraw(FALSE);
CString strSQL;
CString strValue="0";
CDatabase db;
db.Open(_T("school"));
CRecordset rs1(&db);
CRecordset rs2(&db);
CRecordset rs3(&db);
CRecordset rs4(&db);
strSQL.Format("select subject, \
count(ID) as student ,\
sum(score) as total from score \
where class = '%s' and time = '%s' \
and type = '%s' group by subject"
,m_strClass,m_strTime,m_strType);
if(!rs1.Open(CRecordset::forwardOnly,strSQL))
{
MessageBox("打开数据库失败!","数据库错误",MB_OK);
return ;
}
int i=0;
int nStudent =0,nPass=0,nTotal=0,nSuper;
CString strSubject="";
char buffer[20];
while(!rs1.IsEOF())
{
//科目
rs1.GetFieldValue("subject",strValue);
m_ctrList.InsertItem(i,strValue);
strSubject = strValue;
//参考人数
rs1.GetFieldValue("student",strValue);
nStudent=atoi(strValue);
m_ctrList.SetItemText(i,1,strValue);
//缺考人数
strSQL.Format("select count(ID) as nAbsent from score \
where class = '%s' and time = '%s' \
and type = '%s' and absent = '是' \
and subject = '%s' "
,m_strClass,m_strTime,m_strType,strSubject);
if(!rs2.Open(CRecordset::forwardOnly,strSQL))
{
rs1.Close();
MessageBox("打开数据库失败!","数据库错误",MB_OK);
return ;
}
rs2.GetFieldValue("nAbsent",strValue);
m_ctrList.SetItemText(i,2,strValue);
rs2.Close();
//平均成绩
rs1.GetFieldValue("total",strValue);
nTotal=atoi(strValue);
_itoa(nTotal/nStudent,buffer,10);
m_ctrList.SetItemText(i,3,buffer);
//不及格人数
strSQL.Format("select count(ID) as nPass from score \
where class = '%s' and time = '%s' \
and type = '%s' and score < 60 \
and subject = '%s' "
,m_strClass,m_strTime,m_strType,strSubject);
if(!rs3.Open(CRecordset::forwardOnly,strSQL))
{
rs1.Close();
MessageBox("打开数据库失败!","数据库错误",MB_OK);
return ;
}
rs3.GetFieldValue("nPass",strValue);
m_ctrList.SetItemText(i,4,strValue);
rs3.Close();
//及格率
nPass = nStudent - atoi(strValue);
itoa( (int)(nPass*100/nStudent), buffer,10 );
m_ctrList.SetItemText(i,5,buffer);
//优秀率
strSQL.Format("select count(ID) as nSuper from score \
where class = '%s' and time = '%s' \
and type = '%s' and score >= 60 \
and subject = '%s' "
,m_strClass,m_strTime,m_strType,strSubject);
if(!rs4.Open(CRecordset::forwardOnly,strSQL))
{
rs1.Close();
MessageBox("打开数据库失败!","数据库错误",MB_OK);
return ;
}
rs4.GetFieldValue("nSuper",strValue);
m_ctrList.SetItemText(i,6,strValue);
rs4.Close();
//优秀率
nSuper = atoi(strValue);
itoa( (int)(nSuper*100/nStudent), buffer,10 );
m_ctrList.SetItemText(i,7,buffer);
i++;
rs1.MoveNext();
}
rs1.Close();
m_ctrList.SetRedraw(TRUE);
}
查询和导出报表设计
// ScoreQueryDlg.cpp : implementation file
//成绩查询对话框 设计王凯伟
#include "stdafx.h"
#include "school.h"
#include "ScoreQueryDlg.h"
#include "classset.h"
#include
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CScoreQueryDlg dialog
//初始化成员变量
CScoreQueryDlg::CScoreQueryDlg(CWnd* pParent /*=NULL*/)
: CDialog(CScoreQueryDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CScoreQueryDlg)
m_strClass = _T("");
m_strName = _T("");
//}}AFX_DATA_INIT
}
void CScoreQueryDlg::DoDataExchange(CDataExchange* pDX) //控件变量关联
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CScoreQueryDlg)
DDX_Control(pDX, IDC_LIST2, m_ctrScoreList);
DDX_Control(pDX, IDC_LIST1, m_ctrStuList);
DDX_Control(pDX, IDC_COMBO_CLASS, m_ctrClass);
DDX_CBString(pDX, IDC_COMBO_CLASS, m_strClass);
DDX_Text(pDX, IDC_EDIT_NAME, m_strName);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CScoreQueryDlg, CDialog) //消息映射
//{{AFX_MSG_MAP(CScoreQueryDlg)
ON_BN_CLICKED(IDC_BUTTON_LIST, OnButtonList)
ON_BN_CLICKED(IDC_BUTTON_SEARCH, OnButtonSearch)
ON_NOTIFY(NM_CLICK, IDC_LIST1, OnClickList1)
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDC_BUTTON1, &CScoreQueryDlg::OnBnClickedButton1)
ON_BN_CLICKED(IDCANCEL, &CScoreQueryDlg::OnBnClickedCancel)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CScoreQueryDlg message handlers
BOOL CScoreQueryDlg::OnInitDialog() //窗体初始化函数
{
CDialog::OnInitDialog();
CString strSQL; //链接字符串
//初始化班级
CClassSet ClassSet ;
strSQL="select * from class"; //定义查询语句
if(!ClassSet.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL)) //判断数据库打开成功否?
{
AfxMessageBox("打开数据库失败!");
}
while(!ClassSet.IsEOF()) //查询记录集
{
m_ctrClass.AddString(ClassSet.m_code); //查询结果添加到列表控件中
ClassSet.MoveNext(); //移动指针
}
ClassSet.Close(); //关闭
//初始化成绩列表
m_ctrStuList.InsertColumn(0,"学号");
m_ctrStuList.InsertColumn(1,"姓名");
m_ctrStuList.SetColumnWidth(0,100);
m_ctrStuList.SetColumnWidth(1,80);
m_ctrStuList.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
m_ctrScoreList.InsertColumn(0,"时间段");
m_ctrScoreList.InsertColumn(1,"科目");
m_ctrScoreList.InsertColumn(2,"考试类型");
m_ctrScoreList.InsertColumn(3,"成绩");
m_ctrScoreList.InsertColumn(4,"补考成绩");
m_ctrScoreList.SetColumnWidth(0,100);
m_ctrScoreList.SetColumnWidth(1,80);
m_ctrScoreList.SetColumnWidth(2,80);
m_ctrScoreList.SetColumnWidth(3,80);
m_ctrScoreList.SetColumnWidth(4,80);
m_ctrScoreList.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
if(!AfxOleInit())///初始化COM库
{
AfxMessageBox("初始化COM失败");
return FALSE;
}
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CScoreQueryDlg::OnButtonList()
{
// TODO: Add your control notification handler code here
UpdateData();
if(m_strClass.IsEmpty())
{
AfxMessageBox("请选择班级!");
return;
}
CString strSQL;
m_ctrStuList.DeleteAllItems();
m_ctrStuList.SetRedraw(FALSE);
UpdateData(TRUE);
strSQL.Format("select * from student where class = '%s'",m_strClass);
if(!m_studentSet.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL))
{
MessageBox("打开数据库失败!","数据库错误",MB_OK);
return ;
}
int i=0;
while(!m_studentSet.IsEOF())
{
m_ctrStuList.InsertItem(i,m_studentSet.m_code);
m_ctrStuList.SetItemText(i,1,m_studentSet.m_name);
i++;
m_studentSet.MoveNext();
}
m_studentSet.Close();
m_ctrStuList.SetRedraw(TRUE);
}
void CScoreQueryDlg::OnButtonSearch()
{
UpdateData(TRUE);
if(m_strName.IsEmpty())
{
AfxMessageBox("请输入学生姓名!");
return;
}
CString strSQL;
strSQL.Format("select * from score where name like '%s'",m_strName);
RefreshData(strSQL);
}
void CScoreQueryDlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
CString strSQL;
UpdateData(TRUE);
int i = m_ctrStuList.GetSelectionMark();
strSQL.Format("select * from score where code='%s'",m_ctrStuList.GetItemText(i,0));
RefreshData(strSQL);
*pResult = 0;
}
void CScoreQueryDlg::RefreshData(CString strSQL)
{
m_ctrScoreList.DeleteAllItems();
m_ctrScoreList.SetRedraw(FALSE);
UpdateData(TRUE);
if(!m_scoreSet.Open(AFX_DB_USE_DEFAULT_TYPE,strSQL))
{
MessageBox("打开数据库失败!","数据库错误",MB_OK);
return ;
}
int i=0;
char buffer[20];
while(!m_scoreSet.IsEOF())
{
_ltoa_s(m_scoreSet.m_ID,buffer,10);
m_ctrScoreList.InsertItem(i,m_scoreSet.m_time);
m_ctrScoreList.SetItemText(i,1,m_scoreSet.m_subject);
m_ctrScoreList.SetItemText(i,2,m_scoreSet.m_type);
_ltoa_s(m_scoreSet.m_score,buffer,10);
m_ctrScoreList.SetItemText(i,3,buffer);
_ltoa_s(m_scoreSet.m_makeup_score,buffer,10);
m_ctrScoreList.SetItemText(i,4,buffer);
i++;
m_scoreSet.MoveNext();
}
m_scoreSet.Close();
m_ctrScoreList.SetRedraw(TRUE);
}
void CScoreQueryDlg::OnBnClickedButton1()
{
// TODO: Add your control notification handler code here
}
void CScoreQueryDlg::OnBnClickedCancel()
{
// TODO: Add your control notification handler code here
::CoUninitialize(); //释放COM环境
OnCancel();
}
6、系统总结
6.1总结:
一开始,面对该课题,基本上是无从下手,面对这么多的知识,哪些要用到,哪些不会用到,基本上没什么概念。从网上下了些相关教学教程及视频,一步步了解并逐渐学会了利用VC++开发数据库。有了基本认知后,开始了程序的分析、E-R图设计。对这些有了准备后,开始着手编译程序。
期间想到了很多想法以及如何实现,但现在程序编完了以后,从头来看,发现想法和它的实现是有很大距离的。很多想法实现起来有很大的困难,这些困难可能是由于自己一起基础知识的漏洞,可能是由于算法的不完善,可能是编译工具的使用不熟练……
经过两周的课设,本系统完成了设计要求的大部分功能,包括:
(1)、登录用户身份验证
(2)、能够游览学生学籍的所有信息;
(3)、 能够通过学生的一个信息(学号或姓名),找到个人学籍的相关信息;
(4)、 通过一条信息(毕业或在校或休学),找到与之匹配的所有信息;
(5)、相关人员能对信息进行管理(插入、删除、修改);
(6)、对管理的数据库进行备份、恢复功能,以便在发生事故的时候可以能够减少损。;
通过本次的课程设计,我最深的体会就是编程要有详细的计划,明确的方向和流程。在之前的工作中,由于没有完善的总体设计,在程序设计过程中步入了很多误区,编程过程中有一段时间没有什么成果。那段时间一度灰心丧气,在同学的支持帮助下、老师的耐心讲解下,挺过了最艰难的时期,有了现在的成果。虽然我编译的这个程序比起高手来显得很青涩,但毕竟是自己的一个作品,还是感到很欣慰的。
当然,问题也是显著的,比如在界面制作上有些简陋,不是很漂亮;操作上还不是很人性化,这也是很大的遗憾。
总之,经历此次课设,充分加深了我对编程语言知识的理解和掌握,极大丰富了我的知识,同时也大大锻炼了我的思维和面对困难解决困难的勇气及方法。
最后,感谢在课设期间一直帮助我的老师、同学,在你们的支持下,我度过了编程过程中最灰暗的时期,才有了现在这学生学籍管理系统程序。
6.2系统不足:
6.2.1此系统在查询上未实现模糊查询。
6.2.2此系统在信息管理功能上还不够人性化,操作还不够快捷方便。
6.2.3系统运行还有不稳定现象,在调试版和发布版都会出现不同的结果
6.2.4 查询结果导出execl表格产生异常,百度后依旧不能加载execl库。
6.2.5在应用地方库还缺少经验,出现调试和发布出现不同结果。
7、参考文献
[1]vc++典型模块设计 明日科技 清华大学出版
[2] 萨师煊,王珊. 数据库系统概论. 北京:高等教育出版社,2002
[3] 李兰,任风华.C++面向对象程序设计.西安电子科技大学出版社,2010
[4] VC++数据库开发大全.pdf
[5] VC数据库编程三步教学.pdf
[6] VC++数据库编程.pdf
[7]c++程序设计基础
[8]vc++串口设计及通讯技术
西安石油大学计算机系
设计:王凯伟
2019-01-14 最后修改