VC++课程设计
设计项目:学生成绩管理系统
设计者:
张守阳 (20102973)
班级:
计本 10 级二班
使用软件:
VC++6.0
使用数据库: ACCESS
设计流程
一、设计理念
开发一款学生成绩管理程序,实现学生基本信息的录入、查询及浏览和修改操作。以及学生成绩的
录入、查询、浏览以及统计分析等功能。以上功能以可视化界面方式进行操作,并将学生成绩信息保存。
二、数据库设计
在这个程序中,所用到的数据库是 ACCESS 数据库。在数据库中,添加了 8 个表,分别是 NO1OBJECT、
NO1STUDENT、NO1STUINFO、NO1TEACHER、NO2OBJECT、NO2STUDENT、NO2STUINFO、NO2TEACHER.
这 8 个表分别记录着两个班的:成绩概况、学生成绩、学生信息、教师信息。
三、程序设计
此成绩管理系统共有两个模块:一个是学生成绩管理模块,一个是学生信息管理模块。在登录成功
后(登录用户名和密码都是:admin)会出现主窗口。
在主窗口中可以通过单击两个模块的按钮实现来实现两个模块间的切换。
学生成绩模块所实现的功能是:根据班级选项显示学上成绩信息,并且实现成绩的添加、修改、删
除、查询功能。
学生信息模块能够实现学生信息的显示、添加、修改和删除功能。
四、此程序的介绍
此程序是基于对话框的 MFC 程序。
所有的弹出式对话框是模态对话框,由于用到的对话框较多,所以定义的类较多,看起来有点眼花
缭乱。由于我对 MFC 掌握程度有限,这个程序做的有点粗糙,既不美观,在功能上也有许多不尽人意的
地方,或许还会存在 bug。
五、程序的实现
1)、修改 APP 类
由于此程序用到数据库,所以需要先连接数据源。此程序通过采用代码来连接到所设计的数据源。
首先将设计的数据库复制到工程所在根目录下,再在 APP 中的 initInstance()函数中添加如下代
码:
///////加载数据源
if (!AfxSocketInit())
{
AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
return FALSE;
}
CString sPath;
GetModuleFileName(NULL,sPath.GetBufferSetLength(MAX_PATH+1),MAX_PATH);
sPath.ReleaseBuffer ();
int nPos;
nPos=sPath.ReverseFind ('\\');
sPath=sPath.Left (nPos);
nPos=sPath.ReverseFind('\\');
sPath=sPath.Left (nPos);
CString lpszFile = sPath + "\\mydb.mdb";
char* szDesc;
int mlen;
szDesc=new char[256];
sprintf(szDesc,"DSN=%s? DESCRIPTION=TOC support source? DBQ=%s?
FIL=MicrosoftAccess? DEFAULTDIR=%s?? ","mydb",lpszFile,sPath);
mlen = strlen(szDesc);
for (int i=0; iReportError();
pE->Delete();
return FALSE;
//////////////////////////////
其中 m_DB 是定义的一个 CDatabase 对象,用来指向数据库 mymdb。
2)、新建 CRecordset 数据集类
在项目中,共有四个数据集类,分别是 CDRecordset、 CBRecordset、 CTRecordset、
CSinfoRecordset。它们分别对应学生成绩表、成绩概况表、教师表和学生信息表。
3)、学生成绩模块的代码
BOOL CBaDialog::OnInitDialog()
{
CDialog::OnInitDialog();
CDRecordset m_Set(&theApp.m_DB);
CBRecordset m_bSet(&theApp.m_DB);
CTRecordset m_tSet(&theApp.m_DB);
//////////初始化列表控件 ListCtrlx
unsigned i=0;
CODBCFieldInfo Info;
m_Set.Open();
m_ListCtrlx.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
for( i=0;iEnable(FALSE);
m_Timer=SetTimer(1,2,NULL);
m_bIsAsc=TRUE;
m_bS=TRUE;
return TRUE;
// return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CBaDialog::OnStatr()
{
// TODO: Add your control notification handler code here
m_ListCtrlx.DeleteAllItems();
m_ListCtrlb.DeleteAllItems();
m_ListCtrll.DeleteAllItems();
if(m_Set.IsOpen())
m_Set.Close();
if(m_bSet.IsOpen())
m_bSet.Close();
m_cob.GetLBText(m_cob.GetCurSel(),m_Getstring);
this->Select();
if(m_Getstring=="计本一班")
m_tSet.Open();
if(m_Getstring=="计本二班")
m_tSet.Open(AFX_DB_USE_DEFAULT_TYPE,"[NO2TECHER]");
m_nRecordCount=this->Show();
this->display();
this->exhibit();
m_bS = GetDlgItem(IDC_STATR)->EnableWindow(true);
this->Enable(TRUE);
//初始化“各科成绩概况”
//初始化“学生成绩详单”,并返回字段数
//将 teacher 表中的记录加载到“任课教师”
}
int
{
CBaDialog::Show()
int i=0;
m_Set.MoveFirst();
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;
}
void CBaDialog::display()
{
int i=0;
m_bSet.MoveFirst();
do
{
CString s;
m_ListCtrlb.InsertItem(i,m_bSet.m_column1,0);
s.Format("%.1f",m_bSet.m_column2);
m_ListCtrlb.SetItemText(i,1,s);
s.Format("%.2f",m_bSet.m_column3);
m_ListCtrlb.SetItemText(i,2,s);
s.Format("%d",m_bSet.m_column4);
m_ListCtrlb.SetItemText(i,3,s);
s.Format("%d",m_bSet.m_column5);
m_ListCtrlb.SetItemText(i,4,s);
i++;
m_bSet.MoveNext();
} while(!m_bSet.IsEOF());
m_bSet.Close();
}
void CBaDialog::exhibit()
{
int i=0;
do
{
m_ListCtrll.InsertItem(i,m_tSet.m_column1,0);
m_ListCtrll.SetItemText(i,1,m_tSet.m_column2);
i++;
m_tSet.MoveNext();
}while(!m_tSet.IsEOF());
m_tSet.Close();
}
void CBaDialog::Enable( BOOL p)
{
BOOL HB;
HB=p;
GetDlgItem(IDC_ADD)->EnableWindow(HB);
GetDlgItem(IDC_DELECT)->EnableWindow(HB);
GetDlgItem(IDC_EDIT)->EnableWindow(HB);
GetDlgItem(IDC_FIND)->EnableWindow(HB);
GetDlgItem(IDC_ALL)->EnableWindow(HB);
}
CString CBaDialog::Select()
{
//班级的选择
if(m_Getstring=="计本一班")
{
m_Set.Open();
m_bSet.Open();
}
else
{
m_Set.Open(AFX_DB_USE_DEFAULT_TYPE,"[NO2STUDENT]");
m_bSet.Open(AFX_DB_USE_DEFAULT_TYPE,"[NO2OBJECT]");
}
return m_Getstring;
}
void CBaDialog::Equal()
{
for(int i=0;i<5;i++)
{
float p=0;
if(i==0)
p=m_Set.m_column3;
if(i==1)
p=m_Set.m_column4;
if(i==2)
p=m_Set.m_column5;
if(i==3)
p=m_Set.m_column6;
if(i==4)
p=m_Set.m_column7;
m_bSet.Edit();
if(Selec==FALSE)
{
m_bSet.m_column2-=p;
m_bSet.m_column3=(float)(m_bSet.m_column2/m_nRecordCount);
if(p>=60)
m_bSet.m_column4-=1;
if(p>=80)
m_bSet.m_column5-=1;
}
else
{
m_bSet.m_column2+=p;
m_bSet.m_column3=(float)(m_bSet.m_column2/m_nRecordCount);
if(p>=60)
m_bSet.m_column4+=1;
if(p>=80)
m_bSet.m_column5+=1;
}
m_bSet.Update();
if(!m_bSet.IsEOF())
m_bSet.MoveNext();
else
break;
}
}
void CBaDialog::Xuan()
{
m_ListCtrlb.DeleteAllItems();
this->display();
m_ListCtrlx.DeleteAllItems();
this->Show();
}
void CBaDialog::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
CString m_string;
m_cob.GetLBText(m_cob.GetCurSel(),m_string);