概述
软件实习项目四——简单学生管理系统的实现
文章目录
- 软件实习项目四——简单学生管理系统的实现
- 前言
- 一、基于MFC来开发。
- 二、具体实现的功能内容以及相关知识。
- 1.登录界面的设置
- 2.基本信息界面的显示
- 3.基本功能的实现。
- 4.关于保存和读取功能
- 5.活用保存和读取功能到计算器之中。
- 总结
前言
学生管理系统就是最后一个软件实习的项目了。这个项目的要求很高的:
1.实现一个简单的学生信息管理的程序StudentInfo。要求系统能为客户提供下列各项服务:
2.教学管理人员能够使用StudentInfo程序对学生基本信息、课程信息进行管理,包括数据的添加、修改、删除和浏览;
3.能够对学生选课进行管理,包括添加学生选课信息、录入成绩;
4.能够使用查询功能,快速查看到指定学生或指定课程的基本信息以及所指定学生的选课信息;
5.能够对学生选课情况进行简单的统计,包括所选的总的课程数、总学分数及平均成绩。
6.要注意添加学生基本信息、课程信息相关数据时,学号和课程号不能重复;还有在添加学生选课信息时,要求该学生和课程必须是存在的,而且不能添加重复的选课信息。
7.提供友好的交互界面,可以方便用户进行功能选择,实现信息的管理和查询,并可清晰地显示相关信息。
最后我就只实现了最基本的增删改的功能,查找功能忘了。。。。。。
一、基于MFC来开发。
真的是MFC太难了,网络上还没有资源,所以我就只能学到最为简单的MFC操作。
不过真的学到了很多吧。通过这一个小小的项目,我们可以完成登陆,查询,修改部分信息。但是有一点美中不足的是,我们这个实验并没有链接数据库,所有的数据都必须保存在本地,然后在那个界面上实现基本的操作。
二、具体实现的功能内容以及相关知识。
1.登录界面的设置
登录界面所需要实现的功能其实是比较简单的。我们只需要实现普普通通输入用户名和密码,然后登录进去就可以了。如果输入不正确的话会显示提示的窗口。
所需要的MFC组件有Button按钮组件,Static Text固定文本组件 ,Edit control编辑窗口组件。按钮的可以设定名字为登录,然后文本组件显示的是用户名和密码。编辑控制窗口的话,就是用户输入账号和密码的地方。
void CStudentSystemDlg::OnBnClickedButtonLogn()
{
// TODO: 在此添加控件通知处理程序代码
CString suser, spwd;
GetDlgItemText(IDC_USERNAME, suser);
GetDlgItemText(IDC_PASSWORD, spwd);
BOOL IsSuccess = !suser.CompareNoCase(_T("ZHY")) && !spwd.CompareNoCase(_T("1508106423"));
if (IsSuccess)
{
ShowWindow(SW_HIDE);
SystemDLG dlg;
dlg.DoModal();
MessageBox(_T("454"));
}
else
{
MessageBox(_T("用户名或者密码不正确"), _T("登陆失败"));
}
}
2.基本信息界面的显示
界面显示的话我们所需要用到的是主要都是与数据有关的。使用相关的MFC工具是LIst control。在登录界面假定我们登录成功的话是会弹出那个数据库的窗口的,这时候需要的就是那个弹窗函数,我们首先要双击页面框的最顶部,然后添加一个类函数,然后增加相关的类,然后系统默认设置这个类为全局变量,我们可以用作两个窗口之间的传值。弹出窗口需要的是,在最顶部的项目之中选择类向导,然后添加DoDataExchange函数和onInitDialog函数,这个其实为了点击窗口可以初始化的函数,也就是读入数据。其中的m_List就是我们所需要的比较重要的全局变量。
3.基本功能的实现。
想要实现增加删除和修改功能的话,还是需要弹出窗口,然后继续两个窗口赋值的。
下面的代码就是实现基本功能的相关代码。
void SystemDLG::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
for (int i = 0; i < m_List.GetItemCount(); i++)
{
m_List.SetCheck(i, TRUE);
}
}
void SystemDLG::OnBnClickedButton2()
{
// TODO: 在此添加控件通知处理程序代码
for (int i = 0; i < m_List.GetItemCount(); i++)
{
m_List.SetCheck(i, !m_List.GetCheck(i));
}
}
void SystemDLG::OnBnClickedButton4()
{
// TODO: 在此添加控件通知处理程序代码
PropertyDLG dlg;
dlg.DoModal();
int nCount = m_List.GetItemCount();
m_List.InsertItem(nCount,dlg.sNUMBER);
m_List.SetItemText(nCount, 1, dlg.sNAME);
m_List.SetItemText(nCount, 2, dlg.sCLASS);
m_List.SetItemText(nCount, 3, dlg.sZZMM);
}
void SystemDLG::OnBnClickedButton3()
{
// TODO: 在此添加控件通知处理程序代码
for (int i = 0; i < m_List.GetItemCount(); i++)
{
BOOL state = m_List.GetCheck(i);
if (state)
{
m_List.DeleteItem(i);
i--;
}
}
}
void SystemDLG::OnBnClickedButton5()
{
// TODO: 在此添加控件通知处理程序代码
for (int i = 0; i < m_List.GetItemCount(); i++)
{
BOOL state = m_List.GetCheck(i);
if (state)
{
PropertyDLG dlg;
dlg.DoModal();
m_List.SetItemText(i, 0, dlg.sNUMBER);
m_List.SetItemText(i, 1, dlg.sNAME);
m_List.SetItemText(i, 2, dlg.sCLASS);
m_List.SetItemText(i, 3, dlg.sZZMM);
}
}
}
具体原理就是m_List.InsertItem就是往那个我们之前所创建的list control项目里插入数据的函数。然后已经确定了需要插入的位置,其他的话就根据我们插入数据所在的位置,来判断我们需要显示的位置,就直接用SetItemText这个函数来设置,参数的意思,i表示第几行,后面的数字表示第几列,最后跟的就是我们所要插入的数据了。相对的除了插入数据,删除数据的话就直接m_List.DeleteItem(i);,i的话就是第几个数据,可以很简单的根据循环来判断,循环的条件主要看的是我们数据的个数,主要是用到了GetItemCount()这个函数。
补充一下查找功能吧!和增加或者删除一样,主要也是弹出一个新的窗口,然后读取那个数据的值,并且通过循环与我们所含数据相对应的行数和列数进行匹配,然后最后用setitemtext()函数显示出来。
4.关于保存和读取功能
因为我当时学的相关教程并没有包括数据库,但是数据的保存和读取也是必须要有的,所以的话就设置了一个保存和读取的功能。我们保存和读取需要设置文件类型,这两个是必须相同的,要不会出现数据无法读取的尴尬处境。具体保存用到的函数是CFileDialog fDlg这个函数。FALSE代表的是保存,TRUE相对应的就是读取。.dat是文件的类型,后面都是相关保存的参数,NULL表示设置为空。为什么要将所有的数据之间加入#号键呢?除了区分每条数据的功能之外,最关键的原因还是为了方便读取,不一定必须是#号键还可以是其他特殊符号之类的,主要是当作分隔符。我们可以看一下它在记事本里到底是什么样子的。
void SystemDLG::OnBnClickedButtonSave()
{
// TODO: 在此添加控件通知处理程序代码
CFileDialog fDlg(FALSE, ".dat", "saveData", OFN_OVERWRITEPROMPT, "数据文件(*.dat)|*.dat|所有文件(*.*)|*.*||", NULL);
if (fDlg.DoModal() == IDOK)
{
CStdioFile file(fDlg.GetPathName(), CFile::modeWrite | CFile::modeCreate);
CString cs;
for (int i = 0; i < m_List.GetItemCount(); i++)
{
cs = m_List.GetItemText(i, 0) + "#";
cs += m_List.GetItemText(i, 1) + "#";
cs += m_List.GetItemText(i, 2) + "#";
cs += m_List.GetItemText(i, 3) + "n";
file.WriteString(cs);
}
file.Close();
}
}
这样的话读取的话就较为简单了,只需要判断#分隔符在一条数据中的位置,然后就可以较为快速的判断其他关键数据的相对位置了,在读取的操作里面就可以正确读取相关数据,并且省力。显示数据的操作和我们之前用到的添加数据还是一样的函数,就不多做赘述了。
void SystemDLG::OnBnClickedButtonOpen()
{
// TODO: 在此添加控件通知处理程序代码
CFileDialog fDlg(TRUE, ".dat", "saveData", OFN_OVERWRITEPROMPT, "数据文件(*.dat)|*.dat|所有文件(*.*)|*.*||", NULL);
if (fDlg.DoModal() == IDOK)
{
CStdioFile file(fDlg.GetPathName(), CFile::modeRead);
CString cs;
int index = 0;
while (file.ReadString(cs))
{
int x = cs.Find("#");
int x1 = cs.Find("#", x + 1);
int x2 = cs.Find("#", x1 +2);
int m = x + 1;
int n = x1 - x-1;
int o = x2 - x1;
int y = cs.GetLength() - x2 - 1;
m_List.InsertItem(index, cs.Left(x));
m_List.SetItemText(index, 1, cs.Mid(m, n));
m_List.SetItemText(index, 2, cs.Mid(o+x+3, y+2));
m_List.SetItemText(index, 3, cs.Right(y));
}
}
}
5.活用保存和读取功能到计算器之中。
经过了最后一个实验的学习,我想到了自己第一个项目之中的计算器,当时没有实现存储历史记录的功能,反正都是存储数据,我们这个系统的存取还是可以用于计算器的存储历史数据的。同样是按键弹窗的操作,接着双击弹出的那个窗口顶部增加一个全局的函数变量,然后在按钮那个函数里进行全局函数类定义一个相关函数HistoryDlg dlg;dlg.DoModal();这样的话就可以弹窗了。我们还需要增加一个全局变量的头文件,然后在头文件的函数里对其定义,用来读取我们计算的结果。然后设置一个数组用来保存每一次计算的数值。然后当我们点击那个历史记录的按钮之后,运用数据库的初始化函数,就直接可以把我们存储数据的那个数组经过循环直接存储到我们的历史记录窗口之中。终于解决了一个之前遗留下来的历史问题,我还是挺高兴的。
总结
通过这四个软件实习的项目,我的收获还是挺多的,学习了很多基础操作以及一些算法。虽然这几个项目我做的都比较简陋吧,不如那些大佬们那么华丽,丰富。但至少每一处,每一个细节都是自己手打的,不会的话也只是学习了相关的知识,然后自己又重新写了一遍相关代码。你可以做的别人差,但你一定要比过去的你做的好。希望每一位程序员都可以加油,与大家共勉!
最后
以上就是谨慎龙猫为你收集整理的软件实习项目四——简单学生管理系统的实现(基于MFC)软件实习项目四——简单学生管理系统的实现前言一、基于MFC来开发。二、具体实现的功能内容以及相关知识。总结的全部内容,希望文章能够帮你解决软件实习项目四——简单学生管理系统的实现(基于MFC)软件实习项目四——简单学生管理系统的实现前言一、基于MFC来开发。二、具体实现的功能内容以及相关知识。总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复