学生信息管理系统实验报告班级:10网工三班学生姓名:谢昊天学号:1215134046实验目的和要求:实验目的:1、加深理解Windows程序设计的基本概念;2、基于单文档的应用程序的创建;3、学会对话框及相关控件的创建;4、熟悉基本的Windows消息映射机制和消息相应过程。
实验内容:1.创建一个基于对话框的应用程序,用于处理学生成绩,并能够处理相关数据。
2.进一步完善实验二中的系统;3.在学生信息管理系统中添加一个信息查询对话框,并做好相应的界面设计;4.根据功能要求完成相应的界面设计;实验内容与分析设计:1.使用单文档或基于对话框应用程序框架;2.设计信息查询对话框,增加信息检索功能;3.信息存储可以借助于数据库,也可以借助于文件,检索记录可以直接在记录文件中进行;4.通过界面的设计,增加成绩处理的功能;实验步骤与调试过程:1.打开Visual c++ 6.0编程环境;2.点击文件->新建、选择建立新的工程;选择Win32 Console Application选项建立工程名为“学生信息管理系统”的一个空工程;3.继续点击文件->新建、选择建立新的文件;选择C++ Source File选项建立在“学生信息管理系统”工程下的名为“学生信息管理系统”的文件;(或者使用试验一中的文件);整个系统的功能在菜单内完成,分别是在学生信息管理下的学生信息录入4.创建学生信息的录入。
void Add::OnOK(){UpdateData();if(m_sNum == "" || m_sName == "" || m_sMajor == "" || m_sGrade== "" ||m_sBirthday == "" || (!m_cMale.GetCheck() && !m_cFemale.GetCheck())) {MessageBox("学生信息不完整,无法录入!", "错误");return;}5.创建学生信息的删除。
6.创建学生信息的修改。
void Modify::OnOK(){ UpdateData();ifstream in("record.txt");int r = 0, k;string a;while(r != m_nRecord) {in >> a;k = a.size();r++;if(r == m_nRecord)break;in.ignore(1024, '\n');}7.创建学生信息的查询。
void Search::OnOK(){ UpdateData();m_sName = "";m_sMajor = "";m_sGrade = "";m_sBirthday = "";m_cMale.SetCheck(0);m_cFemale.SetCheck(0);UpdateData(false);if(m_sNum == "") {MessageBox("学号为空,无法查询!", "错误");return;}8.可视化的窗口五个,分别实现用户的登录,学生信息的录入,修改,删除,查找。
9.通过窗口的各个按键对学生信息进行操作。
10.在组建选项中点击执行【学生信息管理系统.exe】(或者Ctrl+F5)执行程序.11.程序没有错误,正常执行学生信息管理系统.exe,显示学生信息管理系统。
实验结果:调试无误,正常运行学生信息管理系统.exe,显示学生信息管理系统操作页面。
可以实现一下操作:1. 实现简单地使用用户名和密码来进入登陆界面。
2.实现任意添加学生的信息,包括添加学生的个人学号,姓名,性别,专业,年级出生日期。
输入不允许为空,并且有提示功能,如果输入的时候有一项为空则提示输入相关的信息。
3.实现删除学生的信息,包括删除学生的个人学号,姓名,性别,专业,年出生日期。
根据编号进行用户权限检查,在数据库中进行查找相符和的记录,如果编号在数据库中不存在相应记录,则提示不能删除,否则可以删除该记录。
输入不允许为空,并且有提示功能,如果输入的时候为空则提示输入相关的信息。
4.实现编辑学生的信息,包括编辑学生的个人学号,姓名,性别,专业,年级,出生日期。
输入不允许为空,并且有提示功能,如果输入的时候有一项为空则提示输入相关的信息。
5. 实现查询学生的信息,包括编辑查询学生的个学号,姓名,性别,专业,年级,出生日期。
输入不允许为空,并且有提示功能,如果输入的时候为空则提示输入相关的信息。
6. 实现保存学生的信息,包括保存学生的个人学号,姓名,性别,专业,年级,出生日期。
疑难小结:通过本次综合试验,了解了C语言、C++,Windows网络编程的一些基础知识,学习到了用C 语言、C++,Windows网络编程的特点。
学习到了如何如何建立一个学生类实现基本地操作;如何定义所需的学生类及实现基本地操作。
如何定义指向结构体的指针设置服务器CSocket 地址,实现了数据的存储,以及了实现查询学生的信息同,在实验过程中,回顾书本上的理论知识,巩固了Windows网络编程的知识。
主要算法和程序清单:1.录入学生信息void Add::OnOK(){UpdateData();if(m_sNum == "" || m_sName == "" || m_sMajor == "" || m_sGrade == "" || m_sBirthday == "" || (!m_cMale.GetCheck() && !m_cFemale.GetCheck())) {MessageBox("学生信息不完整,无法录入!", "错误");return;}int flag = 0;CStudent *stu = new CStudent;stu->m_strID = m_sNum;string temp;ifstream in("record.txt");while(in >> temp) {if(temp == stu->m_strID) {flag = 1;MessageBox("该学号已存在!", "注意");in.close();m_sNum = "";UpdateData(false); // 只将学号清空,其余信息保留return;}}in.close();write(stu);delete stu;MessageBox("录入完毕!", "成功");clean(); // 清空表格// TODO: Add extra validation here// CDialog::OnOK();}void Add::clean(){m_sNum = "";m_sName = "";m_sMajor = "";m_sGrade = "";m_sBirthday = "";m_cMale.SetCheck(0);m_cFemale.SetCheck(0);UpdateData(false);}void Add::write(CStudent* stu){stu->m_strName = m_sName;stu->m_strMajor = m_sMajor;stu->m_strGrade = m_sGrade;stu->m_strDate = m_sBirthday;string temp;if(m_cMale.GetCheck())temp = "男";elsetemp = "女";ofstream ou;ou.open("record.txt", ios::app); // 选择附加模式ou << left;ou << setw(20) << stu->m_strID;ou << setw(20) << stu->m_strName;if(m_cMale.GetCheck())temp = "男";elsetemp = "女";ou << setw(20) << temp;ou << setw(20) << stu->m_strMajor;ou << setw(20) << stu->m_strGrade;ou << setw(20) << stu->m_strDate;ou << endl;ou.close();}2.查询信息代码void Delete::OnOK(){if(!searched) {MessageBox("请先查询!", "注意");return;}if(!find) {MessageBox("该学生信息不存在,无法删除!", "错误");return;}int mbr = MessageBox("确定要删除该学生的所有信息吗?", "注意", MB_YESNO|MB_ICONQUESTION);if(mbr == IDNO)return;int k;ifstream in("record.txt");for(int i = 1; i <= index; i++) {string a;in >> a;k = a.size(); //为了得到文件指针的偏移量if(i == index) // 说明文件指针到达要删除那行了,但偏移了k字节break;in.ignore(1024, '\n');}in.seekg(-k, ios::cur); // 让指针跳到要删除那行的行首int offset = in.tellg(); // 记下指针位置,便于写新的记录fstream ou; // 这是文件流,不是输出流!ou.open("record.txt");ou.seekp(offset, ios::beg); //跳到删除行string str;getline(in, str);int size = str.size(); // 得到删除行的大小for(i = 0; i < size; i++)ou << " "; // 用空格代替删除行MessageBox("该学生信息已删除!", "成功");m_sNum = "";clean();searched = false; // 在表格是空的情况下要求先查询// TODO: Add extra validation here// CDialog::OnOK();}void Delete::OnButton1(){find = false; // 该变量表示是否找到searched = true; // 该变量表示是否进行过查询UpdateData();clean(); // 清空上次查询结果,仅保留现在输入的学号if(m_sNum == "") {MessageBox("学号为空,无法查询!", "错误");searched = false;return;}index = 0; // 表示要查找的学生信息在哪一行,作为删除的索引ifstream in("record.txt");string temp, str;while(in >> temp) {index++;str = m_sNum;if(str == temp) {find = true; // 找到了in >> temp;m_sName = temp.c_str();in >> temp;if(temp == "男")m_cMale.SetCheck(1);elsem_cFemale.SetCheck(1);in >> temp;m_sMajor = temp.c_str();in >> temp;m_sGrade = temp.c_str();in >> temp;m_sBirthday = temp.c_str();UpdateData(false);in.close();break;}in.ignore(1024, '\n');}in.close();if(!find) {MessageBox("该学生信息不存在!", "注意");m_sNum = "";UpdateData(false);searched = false;}// TODO: Add your control notification handler code here }void Delete::clean(){m_sMajor = "";m_sGrade = "";m_sBirthday = "";m_cMale.SetCheck(0);m_cFemale.SetCheck(0);UpdateData(false);}3.修改学生信息代码void Modify::OnOK(){// TODO: Add extra validation hereUpdateData();ifstream in("record.txt");int r = 0, k;string a;while(r != m_nRecord) {in >> a;k = a.size();r++;if(r == m_nRecord)break;in.ignore(1024, '\n');}in.seekg(-k, ios::cur);int offset = in.tellg();string temp, str;int flag = 0; // 用来判断信息是否改动for(int col = 0; col < 6; col++) {in >> temp;switch(col) {case 0:if(m_sNum != temp.c_str())flag = 1;break;case 1:if(m_sName != temp.c_str())flag = 1;break;case 2:if(m_cMale.GetCheck())str = "男";elsestr = "女";if(temp != str)flag = 1;break;case 3:if(m_sMajor != temp.c_str())flag = 1;break;case 4:if(m_sGrade != temp.c_str())flag = 1;break;case 5:if(m_sBirthday != temp.c_str())flag = 1;break;}if(flag)break;}if(flag == 0) {MessageBox("该学生信息没有改动!", "注意");return;}if(m_nRecord == 0 || index == 0) {MessageBox("没有学生信息!", "错误");return;}// 查看新改的学号是否已存在ifstream infile("record.txt");int rd = 0; // 因为要排除原来那行,是与其它行比较看是否重号while(infile >> temp) {rd++;if(temp.c_str() == m_sNum && rd != m_nRecord) {MessageBox("该学号已存在, 请重新输入!", "注意",MB_ICONWARNING);show(m_nRecord);return;}infile.ignore(1024, '\n');}infile.close();int mbr = MessageBox("确定要修改该学生的信息吗", "注意",MB_YESNO|MB_ICONQUESTION);if(mbr == IDNO) {show(m_nRecord); // 显示原来信息return;}CStudent *stu = new CStudent;stu->m_strID = m_sNum;stu->m_strName = m_sName;if(m_cMale.GetCheck())stu->m_strSex = "男";elsestu->m_strSex = "女";stu->m_strMajor = m_sMajor;stu->m_strGrade = m_sGrade;stu->m_strDate = m_sBirthday; // 将信息存入变量,便于比较stu->savetofile(offset);delete stu;LVITEM lvi;lvi.mask = LVIF_IMAGE | LVIF_TEXT;lvi.iItem = m_nRecord;in.seekg(offset, ios::beg);int c = 0;while(in >> str) {lvi.iSubItem = c;lvi.pszText = (LPTSTR)(str.c_str());if(c == 0)m_cList.InsertItem(&lvi);elsem_cList.SetItem(&lvi);c++;if(c == 6)break;}m_cList.DeleteItem(m_nRecord-1);MessageBox("修改完毕!", "成功");//CDialog::OnOK();}void Modify::show(int r){clean();if(r <= 0)return;if(r > index)return;ifstream in("record.txt");int k = 0;for(int i = 1; i <= r; i++) {string a;in >> a;k = a.size();if(i == r)break;in.ignore(1024, '\n');} //同样,也是为了得到要显示那行in.seekg(-k, ios::cur); //退回到行头m_nRecord = r;string temp;for(int col = 0; col != 6; col++) {in >> temp;switch(col) {case 0:m_sNum = temp.c_str();break;case 1:m_sName = temp.c_str();break;case 2:if(temp == "男")m_cMale.SetCheck(1);elsem_cFemale.SetCheck(1);break;case 3:m_sMajor = temp.c_str();break;case 4:m_sGrade = temp.c_str();break;case 5:m_sBirthday = temp.c_str();break;}}UpdateData(false);in.close();}void Modify::clean(){m_nRecord = 0;m_sNum = "";m_sName = "";m_sGrade = "";m_sMajor = "";m_sBirthday = "";m_cMale.SetCheck(0);m_cFemale.SetCheck(0);UpdateData(false);}BOOL Modify::OnInitDialog(){CDialog::OnInitDialog();// TODO: Add extra initialization hereindex = 0; // 行数ifstream infile("record.txt");string str;while(infile >> str) { // 为了得到总共的记录数(行数)index++;infile.ignore(1024, '\n');}infile.close();m_cList.InsertColumn(0, "学号", LVCFMT_LEFT, 130);m_cList.InsertColumn(1, "姓名", LVCFMT_LEFT, 100);m_cList.InsertColumn(2, "性别", LVCFMT_LEFT, 70);m_cList.InsertColumn(3, "专业", LVCFMT_LEFT, 120);m_cList.InsertColumn(4, "年级", LVCFMT_LEFT, 80);m_cList.InsertColumn(5, "出生日期", LVCFMT_LEFT, 100);ifstream in("record.txt");LVITEM lvi;for(int r = 0; r < index; r++) {lvi.mask = LVIF_TEXT;lvi.iItem = r;int c = 0;while(in >> str) {lvi.iSubItem = c;lvi.pszText = (LPTSTR)(str.c_str());if(c == 0)m_cList.InsertItem(&lvi);elsem_cList.SetItem(&lvi);c++;if(c == 6)break;}}in.close();DWORD dwStyleEx; // 网格风格dwStyleEx = LVS_EX_FULLROWSELECT | LVS_REPORT |LVS_EX_ONECLICKACTIVATE;m_cList.SetExtendedStyle(dwStyleEx);m_cSpin.SetRange(0, index);return TRUE;FALSE}void Modify::OnDeltaposSpin2(NMHDR* pNMHDR, LRESULT* pResult){NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;// TODO: Add your control notification handler code here int r = m_cSpin.GetPos();if(pNMUpDown->iDelta == 1) // 说明点击了Spin的往上箭头show(r+1);else if(pNMUpDown->iDelta == -1) // 说明点击了Spin的往下箭头show(r-1);*pResult = 0;}void Modify::OnClickList3(NMHDR* pNMHDR, LRESULT* pResult){// TODO: Add your control notification handler code here POSITION pos = m_cList.GetFirstSelectedItemPosition();int r = m_cList.GetNextSelectedItem(pos);show(r+1);*pResult = 0;}void Modify::OnKeydownList3(NMHDR* pNMHDR, LRESULT* pResult){LV_KEYDOWN* pLVKeyDow = (LV_KEYDOWN*)pNMHDR;// TODO: Add your control notification handler code here POSITION pos = m_cList.GetFirstSelectedItemPosition();int r = m_cList.GetNextSelectedItem(pos);if(GetKeyState(38) < 0) // upshow(r);if(GetKeyState(40) < 0) // downshow(r+2);*pResult = 0;}4.查询信息代码void Search::OnOK(){// TODO: Add extra validation hereUpdateData();m_sName = "";m_sMajor = "";m_sGrade = "";m_sBirthday = "";m_cMale.SetCheck(0);m_cFemale.SetCheck(0);UpdateData(false); // 清空上次查找记录,只保留现在输入的学号if(m_sNum == "") {MessageBox("学号为空,无法查询!", "错误");return;}ifstream in("record.txt");string temp, str;int flag = 0;while(in >> temp) {str = m_sNum;if(temp == str) {flag = 1; // 说明找到了in >> temp;m_sName = temp.c_str(); // 类型转换in >> temp;if(temp == "男")m_cMale.SetCheck(1);elsem_cFemale.SetCheck(1);in >> temp;m_sMajor = temp.c_str();in >> temp;m_sGrade = temp.c_str();in >> temp;m_sBirthday = temp.c_str();UpdateData(false);in.close();break;}in.ignore(1024, '\n');}in.close();if(!flag) {MessageBox("该学生信息不存在!", "注意");m_sNum = "";UpdateData(false);}//CDialog::OnOK();}5.登录信息代码BOOL CStuinforApp::InitInstance(){AfxEnableControlContainer();int nCount=0;while(nCount<3){Password passdlg;if(passdlg.DoModal()==IDOK)if((strcmp(passdlg.m_strusername,"hanxvhui")!=0)||(strcmp(passdlg.m_strpass word,"0524")!=0)){MessageBox(NULL,"用户名或口令错误,请重试","错误信息",MB_OK|MB_ICONERROR);nCount++;}elsebreak;else{return FALSE;}}if(nCount>=3){MessageBox(NULL,"口令输入已超过三次,请退出!","错误信息",MB_OK|MB_ICONERROR);return FALSE;}6.写入学生基本信息write::write(){CStudent *stu;stu->m_strName = m_sName;stu->m_strMajor = m_sMajor;stu->m_strGrade = m_sGrade;stu->m_strDate = m_sBirthday;string temp;if(m_cMale.GetCheck())temp = "男";elsetemp = "女";ofstream ou;ou.open("record.txt", ios::app); // 选择附加模式ou << left;ou << setw(20) << stu->m_strID;ou << setw(20) << stu->m_strName;if(m_cMale.GetCheck())temp = "男";elsetemp = "女";ou << setw(20) << temp;ou << setw(20) << stu->m_strMajor;ou << setw(20) << stu->m_strGrade;ou << setw(20) << stu->m_strDate;ou << endl;ou.close();}write::~write(){}。