资源描述
程序设计实践训练课程设计报告
姓 名: 李爽爽
华南农业大学工程学院
1
摘 要
本系统采用MFC编程,开发了一个应用于教学管理的学生信息管理系统。使用的控件主要有列表控件、编辑控件、按钮控件等。功能包括学籍管理、信息查询、教务信息维护和学生学分登记情况。其中,学生信息包括学生的姓名、性别、学号、所在班级、所修的总学分等。学生信息的查询,可以采用两种方式查询,学号查询和姓名查询,查询结果显示在编辑框中。学生信息的删除也可以采用学号和姓名查询,查询到后点击删除即可。输入完成后,可以将学生信息保存在txt文件中。同时可以点击导出学生信息查看保存的信息。另外,采用选择排序法对学生学分进行排序,排序后结果显示在列表框中,点击保存则可将修改保存到文件中。其特点在于VC编程实现了可视化,直观易操作,可适用于日常教学信息管理。创新编程方法在于使用了控件与变量相关联,调用更新函数实现变量与控件之间的传递,简化了编程步骤。
目 录
1.需求分析 4
2.概要设计 4
2.1 数据类型定义 4
2.2 主程序流程 5
3.程序实现 8
4.运行结果 14
5.讨论及进一步研究建议 18
6.课程设计心得 19
Abstract 20
参考文献 21
1.需求分析
1.1设计学生信息管理系统的目的
随着学校的规模不断过大,学生数量急剧增加,有关学生的各种
信息量也成倍增加。面对庞大的信息量需要有学生信息管理系统来提高学生管理工作的效率。通过这样的系统可以做到信息的规范化管理、科学性统计和快速查询、修改、增加、删除、排序等,从而减少学校对学生管理方面的工作量。
本系统主要应用于学校学生信息管理,总体任务是实现学生信息关系的系统化、规范化和自动化,其主要任务是计算学生各种信息进行日常管理,如查询、修改、增加、删除、排序,针对这些要求设计了学生信息管理系统。
1.2课程设计的要求
学生信息管理系统课题只要的要求包括以下五方面:系统以菜单的方式工作、学生信息录入(学生信息用文件保存)、学生信息浏览功能、查询排序功能、学生的信息删除与修改功能
2.概要设计
本程序是一个基于MFC对话框的C++应用程序,程序功能主要在CTestDlg类下编辑,数据类型包括控件与变量相联系、结构体、指针等基本数据类型。采用的控件主要有列表控件、编辑控件、按钮控件。程序的基本流程就是:按下菜单键的进入系统,打开程序的对话框,在对话框中先点击初始化表格按钮,进入编辑模式,根据需要选择录入、查询、删除、保存、导出学生信息和成绩排序功能,下方的编辑菜单用于录入时的输入框和查询时的显示框。
2.1 数据类型定义
本程序是单文档应用程序,所以运行后,先出现的是菜单栏,故在菜单栏中编写进入系统菜单,类归属为CMagView类中。执行是在对话框中进行,先定义了一个对话框类CTestDlg,对话框中的控件都设置为对话框类,使各个按键相应程序能统一写在CTestDlg类中。通过设置编辑控件与变量联系,使输入控件和显示控件实现数据传递。控件变量类型统一采用CString类。输出到文件中的文件采用ofstream类型,从文件中读取的文件采用CFile类型。其他数据类型主要是一些基本的结构体、指针、布尔、整型等常用数据类型。程序中的全局变量为编辑框变量,定义方法如图一所示。其他变量的定义均在相应的按钮响应函数中。
图1 全局变量定义方式
2.2 主程序流程
2.2.1程序流程图
图2 程序主框图
2.2.2主要功能模块流程图及算法
2.2.2.1查询学生信息算法
先获取列表中的单元数目,将要查询的学生信息输入到编辑框中。通过判断编辑框中的变量是否和列表中的某个单元相等,确定是否找到学生信息。如果找到,则输出学生信息,否则,输出查找不到该学生。流程图如下:
图3 查询学生信息流程图
2.2.2.2删除学生信息算法
将要删除的学生学号和姓名输入到编辑框中,遍历列表,通过判断编辑框对应的变量是否和列表中的某个单元相等,相等则删除该行,否则,输出查找不到该学生信息。
图4 删除学生信息流程图
2.2.2.3学生信息排序
定义一个结构体数组,将列表中的数据输入到结构体数组中,每一行就是一个结构体。对每个结构体中的学分项进行选择排序法,如果前一个单元的学分比后一个大,则两个结构体交换,从而实现了数据在结构体中按学分从小到大排序。最后,再将交换后的结构体数据输入到列表中,更新显示。
图5 学分排序流程图
3.程序实现
3.1进入系统菜单
对话框显示模式有两种,一种是模态对话框,另外一种是非模态对话框,其区别在于,模式对话框运行时,代码会停止,直到对话框关闭,而非模式则在对话框出现时,代码仍然可以向下运行。由于我们需要在对话框上点击按钮启动响应代码,所以选用非模态对话框。本对话框的创建主要采用CDialog类下的Create函数,显示采用ShowWindow函数。为了保证对话框对象的生命周期和程序一致,采用动态分配内存的方法进行定义。进入系统菜单ID号定义为IDM_ENTER,即入口程序名为ONENTER。具体实现代码如下所示。
void CMagView::OnEnter()
{
// TODO: Add your command handler code here
CTestDlg *pDlg=new CTestDlg;//动态分配内存
pDlg->Create(IDD_DIALOG1,this);//产生对话框
pDlg->ShowWindow(SW_SHOW);//显示
}
3.2初始化列表程序
采用列表控件List Ctrol进行数据输入的显示,以便进一步把数据输入文件中保存。
初始化列表按钮的ID号为IDC_INIT,故响应的程序名称为OnInit()。初始化设置采用m_list3.SetExtendedStyle()设置表格的分割,采用m_list.InsertColumn()函数设置表头和每个表格的长度、宽度。这里要注意的一点就是要将List Ctrol控件的属性设置为REPORT,否则无法进行列表功能。具体实现代码如下。
void CTestDlg::OnInit()
{
// TODO: Add your control notification handler code here
m_list3.SetExtendedStyle(LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT);
//设置表头
m_list3.InsertColumn(0,"姓名",LVCFMT_LEFT,80,-1);
m_list3.InsertColumn(1,"性别",LVCFMT_LEFT,80,-1);
m_list3.InsertColumn(2,"班级",LVCFMT_LEFT,80,-1);
m_list3.InsertColumn(3,"学号",LVCFMT_LEFT,120,-1);
m_list3.InsertColumn(4,"出生年月",LVCFMT_LEFT,100,-1);
m_list3.InsertColumn(5,"手机号码",LVCFMT_LEFT,120,-1);
m_list3.InsertColumn(6,"已获学分",LVCFMT_LEFT,80,-1);
MessageBox("系统提示:请先输入学生信息"); //设置完毕后弹出提醒输入信息
}
3.3录入学生信息程序
采用按钮控件作为进入程序的命令控件,ID号码为IDC_INPUT,即执行的程序名称为OnInput()。控件与变量关联后,调用UpdateData(TRUE)实现控件的值传递给变量,从而能将我们输入到编辑框中的数值传递给相应变量。接着,调用m_list.InsertItem()开始一行的输入,使用m_list3.SetItemText()实现对同一行不同列内容的输入。最后要调用UpdateData(FALSE)实现数据从控件的数据显示。由于UpdateData()的默认参数是TRUE,所以要实现控件到变量的传递数据,可以不填写参数。具体的程序如下所示。
void CTestDlg::OnInput()
{
// TODO: Add your control notification handler code here
UpdateData();//数据由编辑框到变量
//填写列表的数据
m_list3.InsertItem(0,m_Name);
m_list3.SetItemText(0,1,m_Sex);
m_list3.SetItemText(0,2,m_Class);
m_list3.SetItemText(0,3,m_StudentNum);
m_list3.SetItemText(0,4,m_BornDate);
m_list3.SetItemText(0,5,m_PhoneNum);
m_list3.SetItemText(0,6,m_Score);
UpdateData(FALSE);//列表数据更新显示
}
3.3查询学生信息
采用按钮控件作为进入程序的命令控件,ID号码为IDC_SERACH,即执行的程序名称为OnSearch()。调用m_list3.GetItemCount()获取列表中的项数,循环遍历整个表格,当查找到学号或者姓名相同的时候,则改变编辑框对应变量的值,并且改变标志位temp的值。通过判断标志位来确定是否清空编辑框。最后调用UpdateData(FALSE)更新列表框的显示。具体实现代码如下所示。
void CTestDlg::OnSearch()
{
// TODO: Add your control notification handler code here
int i;
BOOL temp=FALSE;//标志位,判断是否找了
UpdateData(TRUE);
for(i=0;i<m_list3.GetItemCount();i++)
{ if(m_SearchName==m_list3.GetItemText(i,0)|m_SearchNum==m_list3.GetItemText(i,3))
{ m_Name=m_list3.GetItemText(i,0);
m_Sex=m_list3.GetItemText(i,1);
m_Class=m_list3.GetItemText(i,2);
m_StudentNum=m_list3.GetItemText(i,3);
m_BornDate=m_list3.GetItemText(i,4);
m_PhoneNum=m_list3.GetItemText(i,5);
m_Score=m_list3.GetItemText(i,6);
temp=TRUE;
}
}
if(temp==FALSE)
{MessageBox("没有该学生记录");
m_Name=' ';
m_Sex=' ';
m_Class=' ';
m_StudentNum=' ';
m_BornDate=' ';
m_PhoneNum=' ';
m_Score=' ';}
UpdateData(FALSE);
}
3.4删除学生信息
采用按钮控件作为进入程序的命令控件,ID号码为IDC_DELETE,即执行的程序名称为OnDelete()。和查询学生信息一样,先获取列表中的项目数,遍历整个项目,当查询到学号或者姓名相同时,改变标志位findok的值,调用m_list.DeleteItem()删除该行。通过判断标志位的值是否被改变,确定是否弹出没有找到记录窗口。具体实现代码如下
void CTestDlg::OnDelete()
{
// TODO: Add your control notification handler code here
int i;
BOOL findok=FALSE;//判断标志位
UpdateData(TRUE);
for(i=0;i<m_list3.GetItemCount();i++)//遍历列表
{ if(m_DeleteName==m_list3.GetItemText(i,0)|m_DeleteNum==m_list3.GetItemText(i,3))
{ m_list3.DeleteItem(i);//删除
findok=TRUE;
}}
if(findok==FALSE)//判断标志位有没有被改变,确定是否找到该变量
MessageBox("没有该学生记录");
else
UpdateData(FALSE);//更新显示
}
3.5学生成绩排序
采用按钮控件作为进入程序的命令控件,ID号码为IDC_SORT,即执行的程序名称为OnSort()。定义一个学生信息结构体数组变量,先通过变量整个列表,将各个项目的值按一行赋给一个结构体的形式存放。之后,采用选择排序法,通过判断前一个结构体中的分数是否比后一个的大,来决定要不要交换两个结构体的值。从而实现了在结构体数组中,数据按分数从小到大存放。最后,通过遍历整个列表,把交换后的结构体数组中的值存储于列表中,调用UpdateData(FALSE)实现更新显示。具体代码如下。
void CTestDlg::OnSort()
{
// TODO: Add your control notification handler code here
struct student//结构体数组
{ CString name;
CString sex;
CString clas;
CString num;
CString birthday;
CString phone;
CString score;
};
int number,i,j;
struct student stu;
number=m_list3.GetItemCount();
struct student *stud=new struct student[number];//动态申请内存
for(i=0;i<number;i++)//将数据存储到结构体中
{
stud[i].name=m_list3.GetItemText(i,0);
stud[i].sex=m_list3.GetItemText(i,1);
stud[i].clas=m_list3.GetItemText(i,2);
stud[i].num=m_list3.GetItemText(i,3);
stud[i].birthday=m_list3.GetItemText(i,4);
stud[i].phone=m_list3.GetItemText(i,5);
stud[i].score=m_list3.GetItemText(i,6);
}
for(i=0;i<number;i++)//选择排序法
{for(j=i+1;j<number;j++)
{if(stud[i].score>stud[j].score)
{stu=stud[j];
stud[j]=stud[i];
stud[i]=stu;}
}
}
m_list3.DeleteAllItems();
for(i=0;i<number;i++)//将数据重新存储到列表中
{
m_list3.InsertItem(0,stud[i].name);
m_list3.SetItemText(0,1,stud[i].sex);
m_list3.SetItemText(0,2,stud[i].clas);
m_list3.SetItemText(0,3,stud[i].num);
m_list3.SetItemText(0,4,stud[i].birthday);
m_list3.SetItemText(0,5,stud[i].phone);
m_list3.SetItemText(0,6,stud[i].score);
UpdateData(FALSE);//更新显示
}
}
3.6导出学生信息
采用按钮控件作为进入程序的命令控件,ID号码为IDC_OUTPUT,即执行的程序名称为OnOutput()。初始化设置为Cfile类型,模式为读取。通过file.GetLength()获取文件的长度,同时申请对应的文件存放数组单元。最后调用MessageBox()将文件中的内容显示出来。具体代码如下。
void CTestDlg::OnOutput()
{
// TODO: Add your control notification handler code here
CFile file("d:\\student.txt",CFile::modeRead);
char *pBuf;
DWORD dwFileLen;
// int i;
dwFileLen=file.GetLength();
pBuf=new char[dwFileLen+1];
pBuf[dwFileLen]=0;
file.Read(pBuf,dwFileLen);
file.Close();
MessageBox(pBuf);
}
3.7保存学生信息
采用按钮控件作为进入程序的命令控件,ID号码为IDC_SAVE,即执行的程序名称为OnSave()。定义一个ofstream类型的file变量,通过遍历列表获取列表中的值,并存放在str中,通过file<<str将数据输出到文件中,从而实现数据的保存。
void CTestDlg::OnSave()
{
// TODO: Add your control notification handler code here
CString str;
int i,j;
ofstream file("d:\\student.txt");
int count=m_list3.GetItemCount();
if(!file)
{MessageBox("文件不能打开");
}
else
{
for(i=0;i<count;i++)
{ for(j=0;j<7;j++)
{ str=m_list3.GetItemText(i,j);
str+=' ';
file<<str;
}
file<<endl;
}
file.close();
MessageBox("文件保存成功");
}
}
4.运行结果
4.1初始界面
点击菜单栏中的进入系统,则会出现如图6所示界面。点击列表初始化,则会出现列表表头和提升输入学生信息窗口,如图7所示。
图6 初始化界面
图7 表格初始化后界面
4.2 录入学生信息
在下面的编辑框中输入学生信息,点击录入学生信息,即可把学生信息输入到列表中。点击保存学生信息,即可把输入的信息保存到存储的文件中。
图8 录入学生信息
4.3 查询学生信息
(1)查询学生号:输入学生学号,按下查询按钮。查询姓名:输入姓名,按下查询按钮。查询到的信息显示在编辑控件中,查询不到,则输出没有该学生记录。
图9 查询学生号界面
图10 查询姓名界面
图11 查询不到学生界面
4.4导出文件信息
按下导出学生信息按钮,系统会打开之前保存的文件。如果文件为空或者不存在,则提示否则将文件信息显示出来。
图12 导出学生信息
4.5删除学生信息
分为按学号删除和按姓名删除两种。先输入姓名或学号,点击删除学生信息按钮,列表上该学生信息就会被删除。此时要点击保存学生信息,使存储文件中也同样删除了该学生信息。
图13 按学生号删除
图14 按姓名删除
5、保存文件
点击保存按钮,列表中的数值会自动保存到“student.txt”文件中,并弹出文件保存成功提示框。
图15 保存学生信息
5.讨论及进一步研究建议
本作品采用MFC编程,特点在于实现了可视化,可以直观地进行操作,相对于用C开发的程序,有比较明显的优势。采用变量与控件相关联的方法,使程序的实现上更为简洁。文件的输入保存方面,采用了ofstream和CFile两种不同的方式,实现了实时保存的查看功能。对学生信息进行排序,使用了结构体数组作为数据交换的桥梁,通过用结构体数组获取列表的值,对结构体数组进行排序,再讲结构体数组存储在列表中实现。排序算法采用选择排序法,清晰易懂。查询、和删除采用遍历列表,可以实现对学生信息的所有变量的查询,易于应用于用户需求。
6.课程设计心得
在本设计中,我们从不会MFC编程到可以做出一个正常工作的程序,确实有很大收获。基本每一个部分都有遇到问题。一开始,不知道怎么建立编程框架、建立新的类、怎么写菜单、按钮入口程序,就只能对着教程不停的看书,琢磨。等到基本理论学完后,开始编程。最初遇到的问题就是录入数据后无法显示,后来发现是没有调用更新显示函数。接着就是不知道怎么将数据显示到列表中,明明有按照规定的函数格式写,但却一直没法显示。经过查找大量资料后发现,是列表的属性没有设置成REPORT。本程序有一个不完善的地方就是没有调用子对话框进行,这个问题我尝试了挺长时间,由于对MFC整个消息响应机制不是很了解,所以一直没办法解决。在这次编程设计中,给我们最大的收获就是,边学边做是可以完成的,而且是最锻炼人的。虽然程序有不完美的地方,但也是我们用了5天精心雕琢出来的。对自己在本次设计中的学习态度,我感到非常满意。路漫漫其修远兮,吾将上下而求索!学以致用之路,我们会坚持着更好地走下去。
Student Information Management System
Abstract
The system uses the MFC programming, developed a teaching management applied to student information management system. The main control uses a list of controls, edit controls, buttons and other controls. Features include school management, information inquiry, academic credit information maintenance and student registration. Among them, the student information including the student's name, sex, school, where classes, such as the repair of the total credits. Student information query, the query can be used in two ways, student number and the name of the query, the query results are displayed in the edit box. Delete student information can also be used to learn numbers and names, the query to click delete. When you're finished, you can save the student information in txt file. Click Export student information and can view saved messages. In addition, the use of credits for students choose sort sort sorted results are displayed in the list box, you can click Save to save the changes to a file. Characterized by VC programming visualization, intuitive and easy to operate, can be applied to daily teaching information management. Innovative programming method is the use of the controls associated with a variable, call the update function to achieve and pass variables between controls simplify the programming steps.
参考文献
1.傅德荣、章慧敏编著,《教育信息处理》,北京师范大学出版社,2001年
2.祝智庭主编,《现代教育技术》,高等教育出版社,2001年
3.BobReselmna,形ehdarPeasley,WaynePucr俪ka,《VISua1Basie6.0使用
指南》,电子工业出版社
.4Mcioros几《VisualBasci.6o中文版控件大全》,电子工业出版社
5.刘晓华编著,((sQLSverer2000数据库应用开发》,电子工业出版社,
2001年
6.闪四清编著,《SQLSverer2000实用教程》,人民邮电出版社,2000年
7.陈伟编,《中文版VisualBasci.60开发指南》,人民邮电出版社,
2000年
8.张海藩主编,《软件工程导论》,清华大学出版社,1998年
9.邵瑞珍主编,《教育心理学》,上海教育出版社,1997年
10.DvadiME淦oekne著施伯乐,顾宁,雍信阳,范志新,王轶彤校译,《数
据库处理(基础设计与实现)》,电子工业出版社,2000年
11.张龙祥著,《数据库原理与设计》,人民邮电出版社,2001年
12.李存珠李宣东编著,《软件工程概论》,南京大学计算机系出版社,
2001年
展开阅读全文