文章目录

  • 前言
  • 一、系统设计功能:
  • 二、对应板块
    • 1.登陆板块
    • 2.系统主页面相应功能
  • 总结

前言

随笔之作,希望通过写文章的方式加深自己对于C++知识架构和设计过程中出现的一些Bug的印象,如有错误,多谢指正。


一、系统设计功能:

  1. 实现账号登陆界面。(例如:使用用户名和密码来进入界面。如果输入的用户名和密码有一项为空或者是输入的用户名和密码是错误的,则不能进入系统)
    用户名:可以是学生名字也可以是学生个人学号。



  2. 实现任意添加学生的信息。(例如:添加学生的个人学号,姓名,性别,出生日期。专业,年级。添加记录时,要求学号要唯一。输入不允许为空,并且有提示功能;如果输入的时候有一项为空,则提示输入相关的信息。如果添加了重复的学号,这提示学号添加重复并且取消添加)。

  3. 实现删除学生的信息。(例如:实现对已添加的学生信息进行删除。如果当前系统中没有相应的记录,则提示“记录为空!”并返回操作。)
    其中删除有两种方式:
    第一种删除方式是直接在系统主页面选定单选框,直接“删除”
    第二种删除方式是按“删除”,在查询窗口查询学生信息进行删除
    (系统实现自动判断删除方式)

  4. 实现查询学生的信息。(例如:可根据学号或姓名等信息对已添加的学生信息进行查询,如果未找到,给出相应的提示信息,如果找到,则显示相应的记录信息)。
    可以实现学号查询和姓名查询(至少要输入一个,否则将提示“请输入所需要查询的学生信息”)

  5. 实现编辑学生的信息。可根据查询结果对相应的记录进行修改。(例如:修改时注意学号的唯一性,包括编辑学生的个人学号,姓名,性别,专业,年级,出生日期。输入不允许为空,并且有提示功能,如果输入的时候有一项为空则提示输入相关的信息)。
    编辑功能可以在系统主界面通过系统交互(双击学生信息,自动弹出修改窗口)进行修改,同时也可以通过选定单选框按“修改”进行修改(可以选中多个进行同时修改)

  6. 实现学生的信息保存功能。(例如:可将学生的信息存入文件中,存入方式任意(建立文件筛选格式)。保存学生信息包括学生个人学号,姓名,性别,专业,年级,出生日期)。

  7. 实现学生的信息导入功能。

  8. 实现注销功能。(例如:注销当前用户后,返回登陆界面)

在最后我添加了一个事件处理程序(NM-DNLCLK)来实现系统的用户交互,以至于可以在系统主界面直接双击学生信息既可以实现修改

二、对应板块

1.登陆板块

代码如下:

void CStudentControlManageDlg::OnBnClickedButton1Lgn() //登陆按钮{// TODO: 在此添加控件通知处理程序代码CString sun;CString spwd; // 创造两个字符串变量来接受用户输入的信息(用户名和密码等)GetDlgItemText(IDC_EDIT2_UNAME, sun); // 返回用户名GetDlgItemText(IDC_EDIT3_PWD, spwd); // 返回密码/* 判断输入的用户名与密码是否正确使用用户名(可以是学号,也可以是名字)和密码(唯一)相匹配实现登陆如果其中一项为空或者错误都不可加入系统主页面,并且返回提示信息*/if (sun.IsEmpty()){MessageBox("用户名不能为空!");return;}if (spwd.IsEmpty()){MessageBox("密码不能为空!");return;}BOOL isSuccess = (!sun.CompareNoCase(_T("莫世冰")) && !spwd.CompareNoCase(_T("123456"))) || (!sun.CompareNoCase(_T("201934410316")) &&!spwd.CompareNoCase(_T("123456"))); // 注意取反语句// isSuccess = TRUE; //开发过程使用此语句,实现直接登陆if (isSuccess){ShowWindow(SW_HIDE); // 隐藏登陆窗口,但是需要在关闭系统主窗口的时候同时把子窗口也关闭,进入SystemDlg进行编译,增加WM-CLOSE信息和OnInitDialogc()函数// 创造一个对话框,以至于能够弹出系统主页面(注意要引入主页面“SystemDlg”的头文件)SystemDlg Dlg;Dlg.DoModal(); // 弹出主系统界面,利用DoModal()函数}else{MessageBox(_T("用户名或者密码错误"), _T("登陆失败")); // 返回提示信息}
}

2.系统主页面相应功能

代码如下:

void SystemDlg::OnClose()
{// TODO: 在此添加消息处理程序代码和/或调用默认值CDialog* dplg = (CDialog*)AfxGetMainWnd(); // 获得子窗口的指针dplg->DestroyWindow(); // 利用指针是操作子窗口(自我销毁)CDialogEx::OnClose();
}// 在程序初始化的时候自动执行的函数
BOOL SystemDlg::OnInitDialog()
{CDialogEx::OnInitDialog();// TODO:  在此添加额外的初始化Student_list.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT|LVS_EX_CHECKBOXES|LVS_EX_FLATSB); // 扩展样式,整行选中加复选框// 数据进行 “行列” 排序 和 表头设置// 1. 表头设置(InsertColumn(下标,表头,向右对齐0,宽度))Student_list.InsertColumn(0, _T("年级"), 0, 200);Student_list.InsertColumn(1, _T("专业班级"), 0, 200);Student_list.InsertColumn(2, _T("姓名"), 0, 200);Student_list.InsertColumn(3, _T("个人学号"), 0, 200);Student_list.InsertColumn(4, _T("性别"), 0, 200);Student_list.InsertColumn(5, _T("出生日期"), 0, 200);CString g, z, n, num, m, year;for (int i = 0; i < 8; i++){g.Format(_T("学生%d"), i);z.Format(_T("专业班级%d"), i);n.Format(_T("姓名%d"),i);num.Format(_T("学号%d"),i);m.Format(_T("男"));year.Format(_T("2000.02.%d"), i);Student_list.InsertItem(i, g);Student_list.SetItemText(i, 1, z);Student_list.SetItemText(i, 2, n);Student_list.SetItemText(i, 3, num);Student_list.SetItemText(i, 4, m);Student_list.SetItemText(i, 5, year); }Student_list.InsertItem(8, "目前页面为");Student_list.SetItemText(8, 1, "示范数据");Student_list.SetItemText(8, 2, "请选择全选键");Student_list.SetItemText(8, 3, "进行“删除”");Student_list.SetItemText(8, 4, "然后打开你所需要的");Student_list.SetItemText(8, 5, "班级信息");return TRUE;  // return TRUE unless you set the focus to a control// 异常: OCX 属性页应返回 FALSE
}// 全部选中功能
void SystemDlg::OnBnClickedButton1()
{// TODO: 在此添加控件通知处理程序代码for (int i = 0; i < Student_list.GetItemCount(); i++){Student_list.SetCheck(i, TRUE);}
}// 实现反选功能
void SystemDlg::OnBnClickedButtonReverse()
{// TODO: 在此添加控件通知处理程序代码for (int i = 0; i < Student_list.GetItemCount(); i++){Student_list.SetCheck(i, !Student_list.GetCheck(i));}
}// 增加功能的窗口
void SystemDlg::OnBnClickedButtonAdd()
{// TODO: 在此添加控件通知处理程序代码AddDlg dlg; // 创建对话框if (IDCANCEL == dlg.DoModal()) // 弹出对话框{return;}/* TODO:可以在这个位置进行信息的判断,1.学号要唯一2.输入不允许为空(并且要有提示功能,提示1.xxx不允许为空 2. 添加数据重复并取消添加)*//*增加窗口的功能要增加新的学生信息,然后返回到系统主页面(主窗口)当中因此应该要创建窗口之间的传递对象*/int nCount = Student_list.GetItemCount();if (dlg.sClass.IsEmpty()){AfxMessageBox("年级不能为空!!!");return;}if (dlg.sMajor.IsEmpty()){AfxMessageBox("专业班级不能为空");return;}if (dlg.sName.IsEmpty()){AfxMessageBox("名字不能为空");return;}if (dlg.sID.IsEmpty()){AfxMessageBox("学号不能为空");return;}if (dlg.sSex.IsEmpty()){AfxMessageBox("性别不能为空");return;}if (dlg.sBirth.IsEmpty()){AfxMessageBox("出生日期不能为空");return;}// 判断学号是否唯一for (int i = 0; i < nCount; i++){if (dlg.sID == Student_list.GetItemText(i, 3)){AfxMessageBox("学号重复,请输入正确的学号");return;}}// 编辑信息Student_list.InsertItem(nCount, dlg.sClass);Student_list.SetItemText(nCount, 1, dlg.sMajor);Student_list.SetItemText(nCount, 2, dlg.sName);Student_list.SetItemText(nCount, 3, dlg.sID);Student_list.SetItemText(nCount, 4, dlg.sSex);Student_list.SetItemText(nCount, 5, dlg.sBirth);}// 删除功能
void SystemDlg::OnBnClickedButtonDelete()
{// TODO: 在此添加控件通知处理程序代码 /* 删除功能1. 实现对已添加的学生信息进行删除。如果当前系统中没有相应的记录,则提示为空,并且返回操作即可在查询的基础上查询是否有相应信息2. 同时也可以通过在界面直接选择单选框,然后点击删除*/int nCount = Student_list.GetItemCount();int flag = 1;for (int i = 0; i < nCount; i++) // 判断是否与单选框得选中,然后再进行删除方式的切换{if (Student_list.GetCheck(i) == 1){flag = 0;}}if (flag){SystemDlg::OnBnClickedButtonFind();for (int i = 0; i < Student_list.GetItemCount(); i++) // 遍历每一项,判断是否被选中{BOOL state = Student_list.GetCheck(i);if (state){Student_list.DeleteItem(i); // 删除选定的项目i--;  // 因为for循环的原因,会导致程序从1.3.5.7.9这样子去判断每一项的状态,因此让程序返回一项判断,实现每一个项目的一个一个判断}}}if (!flag){for (int i = 0; i < Student_list.GetItemCount(); i++) // 遍历每一项,判断是否被选中{BOOL state = Student_list.GetCheck(i);if (state){Student_list.DeleteItem(i); // 删除选定的项目i--;  // 因为for循环的原因,会导致程序从1.3.5.7.9这样子去判断每一项的状态,因此让程序返回一项判断,实现每一个项目的一个一个判断}}}
}// 查询功能
void SystemDlg::OnBnClickedButtonFind()
{// TODO: 在此添加控件通知处理程序代码int nCount = Student_list.GetItemCount(); for (int i = 0; i < nCount; i++) // 清空上次所选项{// ((CButton*)GetDlgItem(IDC_RADIO))->SetCheck(0);if (Student_list.GetCheck(i) == 1){Student_list.SetCheck(i, 0);}}FindDlg dlg;if (IDCANCEL == dlg.DoModal()) // 弹出对话框{return;}if (dlg.fID == "" && dlg.fName == ""){AfxMessageBox("请输入所需要查询的学生信息!!!");}else{int uNum = 1;for (int i = 0; i < nCount; i++) // 通过和文本比较,选定寻找信息{if ((Student_list.GetItemText(i, 3) == dlg.fID || Student_list.GetItemText(i, 2) == dlg.fName)){Student_list.SetCheck(i);  // 避免了在用姓名查找时因为名字重复而导致漏选的情况uNum = 0;}if (i == nCount-1){if(uNum){AfxMessageBox("未找到相应记录!!!");}}}}
}// 修改功能
void SystemDlg::OnBnClickedButtonAlter()
{// TODO: 在此添加控件通知处理程序代码/*修改时注意学号的唯一性,而且输入的内容不能为空,如果重复或者为空这给予相关体现*/for (int i = 0; i < Student_list.GetItemCount(); i++) // 遍历每一项,判断是否被选中{BOOL state = Student_list.GetCheck(i);if (state){AddDlg dlg;if (IDCANCEL == dlg.DoModal()) // 弹出对话框{return;}if (dlg.sClass.IsEmpty()){AfxMessageBox("学号不能为空!!!");return;}if (dlg.sMajor.IsEmpty()){AfxMessageBox("专业班级不能为空");return;}if (dlg.sName.IsEmpty()){AfxMessageBox("名字不能为空");return;}if (dlg.sID.IsEmpty()){AfxMessageBox("学号不能为空");return;}if (dlg.sSex.IsEmpty()){AfxMessageBox("性别不能为空");return;}if (dlg.sBirth.IsEmpty()){AfxMessageBox("出生日期不能为空");return;}// 判断学号是否唯一int nCount = Student_list.GetItemCount();for (int i = 0; i < nCount; i++){if (dlg.sID == Student_list.GetItemText(i, 3)){AfxMessageBox("学号重复,请输入正确的学号");return;}}// 对已有信息进行修改(编辑),即在选定的项上,因此不用用InestItem(),直接用SetItemText() 即可Student_list.SetItemText(i, 0, dlg.sClass);Student_list.SetItemText(i, 1, dlg.sMajor);Student_list.SetItemText(i, 2, dlg.sName);Student_list.SetItemText(i, 3, dlg.sID);Student_list.SetItemText(i, 4, dlg.sSex);Student_list.SetItemText(i, 5, dlg.sBirth);}}
}// 保存文件按钮
void SystemDlg::OnBnClickedButtonSave()
{// TODO: 在此添加控件通知处理程序代码// 建立一个CFileDialog文件对象(对话框),再进行文件的读取,再做出相应的操作。但应该注意的是,“.txt”会报错,因为字符分字符集和多字节储存// (对象状态,文件类型,文件名字,覆盖功能,文件格式过滤,文件指针(这里不需要,用(空)NULL代表))CFileDialog fDlg(FALSE, ".txt", "saveData", OFN_OVERWRITEPROMPT, "文本文档(*.txt)|*.txt|保存的数据(*.dat)|*.dat|所有文件(*.*)|*.*||", NULL);if (fDlg.DoModal() == IDOK) // 判断文件是否打开成功{CStdioFile file(fDlg.GetPathName(), CFile::modeWrite | CFile::modeCreate); // 创建一个操作文件的对象(所获取的文件路径,文件的读取方式,写与新建并写入)for (int i = 0; i < Student_list.GetItemCount(); i++)  // 实现每一行数据的保持,写入文件,并且以逗号隔开{CString cs=""; // 创建一个接受字符的空变量for (int j = 0; j < 6; j++){cs += Student_list.GetItemText(i, j) + "#";if (j == 4){cs += Student_list.GetItemText(i, 5) + "
";j = 6;}}file.WriteString(cs); // 每一行写入一次}file.Close(); // 关闭文件流}
}// 打开文件按钮
void SystemDlg::OnBnClickedButtonOpen()
{// TODO: 在此添加控件通知处理程序代码// (对象状态,文件格式,文件名,因为打开操作没有覆盖操作,即用0代替,文件格式过滤,文件指针(无))CFileDialog fDlg(TRUE, ".txt", "saveData", 0, "文本文档(*.txt)|*.txt|保存的数据(*.dat)|*.dat|所有文件(*.*)|*.*||", NULL);if (fDlg.DoModal() == IDOK) // 判断文件是否打开成功{CStdioFile file(fDlg.GetPathName(), CFile::modeRead); // 创建文件对象,进行读取的操作CString cs; // 创建一个从文件取字符串的变量int i = 0;while (file.ReadString(cs)) // 利用C++中的Find() Left() Right() Mid()函数进行截取{int x = cs.Find("#");int x1 = x;Student_list.InsertItem(i, cs.Left(x));for (int j = 1; j < 5; j++){int x2 = cs.Find("#", x1 + 1);Student_list.SetItemText(i, j, cs.Mid(x1 + 1, x2 - x1 - 1));x1 = x2;if (j == 4){Student_list.SetItemText(i, j + 1, cs.Right(cs.GetLength() - x1 - 1));j++;}}i++;}}}// 实现用户交互功能的函数
void SystemDlg::OnNMDblclkList1(NMHDR *pNMHDR, LRESULT *pResult)
{LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);// TODO: 在此添加控件通知处理程序代码*pResult = 0;int i = pNMItemActivate->iItem;AddDlg dlg;if (IDCANCEL == dlg.DoModal()) // 弹出对话框{return;}if (dlg.sClass.IsEmpty()){AfxMessageBox("学号不能为空!!!");return;}if (dlg.sMajor.IsEmpty()){AfxMessageBox("专业班级不能为空");return;}if (dlg.sName.IsEmpty()){AfxMessageBox("名字不能为空");return;}if (dlg.sID.IsEmpty()){AfxMessageBox("学号不能为空");return;}if (dlg.sSex.IsEmpty()){AfxMessageBox("性别不能为空");return;}if (dlg.sBirth.IsEmpty()){AfxMessageBox("出生日期不能为空");return;}// 判断学号是否唯一int nCount = Student_list.GetItemCount();for (int i = 0; i < nCount; i++){if (dlg.sID == Student_list.GetItemText(i, 3)){AfxMessageBox("学号重复,请输入正确的学号");return;}}Student_list.SetItemText(i, 0, dlg.sClass);Student_list.SetItemText(i, 1, dlg.sMajor);Student_list.SetItemText(i, 2, dlg.sName);Student_list.SetItemText(i, 3, dlg.sID);Student_list.SetItemText(i, 4, dlg.sSex);Student_list.SetItemText(i, 5, dlg.sBirth);
}// 注销按钮
void SystemDlg::OnBnClickedButtonEnd()
{   // TODO: 在此添加控件通知处理程序代码CDialog::OnOK(); // 消掉子窗口CStudentControlManageDlg dlg; // 弹出登陆页面if (dlg.DoModal() != IDOK){SystemDlg::OnClose(); // 实现关闭程序的功能}
}

其中需要注意的几点有:
1.在从登陆窗口弹出系统主页面时,只是单纯地隐藏登陆窗口是不行的,因为程序在任务管理器仍然在运行,因此要利用指针指向登陆窗口,实现DestroyWindow()窗口的自己摧毁
2.在查询功能板块,再次选择查询功能时要实现数据单项框的全部取消(即取消选定)
3.在保存和打开文件利用CFileDialog fDlg()函数时,第一个“TURE”或者“FALSE”参数可能会报错,因为程序实现字符串保存时,默认为Unicode字符集,这时候我们只需改成多字节字符集即可(具体步骤:“文件属性”->“常规”->“字符集”->“多字节字符集”);
4.各种控件、窗口等的正确使用、相互引用等问题


总结

虽然是老掉牙的学生管理系统,但是在第一次的学习过程中,可谓是获益匪浅,同时也希望以此为记录,相信以后有机会回来写这个系统,我可以写的更好看,功能更加齐全。

基于MFC——C++课程设计《学生信息管理系统》相关推荐

  1. ASP.NET程序设计课程设计——学生信息管理系统

    点击查看详细信息 ASP.NET程序设计课程设计--学生信息管理系统 一.实验目的 综合运用们所学的ASP.NET知识,开发学生信息管理系统,完成相关功能: (1)教师管理 (2)学生信息 (3)课程 ...

  2. oracle学生信息管理系统课程设计,数据库课程设计-学生信息管理系统的设计与实现.doc...

    数据库课程设计-学生信息管理系统的设计与实现 2011-2012课程设计II 学生信息管理系统的设计与实现 一 设计内容 建立一个简单的在校学生信息查询系统,可以让使用者查询到学生的一些简单的个人信息 ...

  3. C语言课程信息管理系统课程设计,c语言课程设计学生信息管理系统.doc

    c语言课程设计学生信息管理系统 课程设计报告 课程名称: 高级语言程序设计课程设计 姓 名: 汤璞君 班级学号: BX1209 121003410937 指导教师: 吉顺如 完成日期: 2013.6. ...

  4. java查询学生信息_分别显示女生_女生学生基本信息的代码_java课程设计学生信息管理系统_毕业论文.doc...

    java课程设计学生信息管理系统_毕业论文 学 号: 课 程 设 计 题 目学生信息管理系统学 院计算机科学与信息工程学院专 业金融信息化服务外包班 级学生姓名指导教师 2015年12月28日 课程设 ...

  5. 课程设计————学生信息管理系统(包含历代思路和代码)

    课程设计----学生管理系统(包含历代思路和代码) 一.前言 学生信息管理系统是我第一个独立完成的比较长的代码,也算是花费了一些心血,这个系统是我一点点把它从几百行的代码逐渐优化到上千行,功能从简单到 ...

  6. c语言程序设计课程设计学生信息管理系统,C语言程序设计课程设计报告----学生信息管理系统.doc...

    河南理工大学计算机学院 <C语言程序设计>课程设计报告 题目: 学生信息管理系统 专业: 计算机科学与技术 班级: 计算机XX班 学号: 311009033232 姓名: ***** 日期 ...

  7. Java课程设计——学生信息管理系统

    一.项目简介 二.项目构架图 三.团队成员任务简介 四.代码 五.项目运行图片 一.项目简介: 实现一个功能简单的学生信息管理系统,该系统具有按照账户名密码登录功能,登录后,可以添加,删除,修改.查询 ...

  8. 【记录贴】数据库课程设计——学生信息管理系统

    前言 记录下学习的点点滴滴,留下属于我的足迹. 以此篇记录我的第一次课程设计. 课设实现 一.课程设计题目 题目一 学生信息管理系统 二.总体设计 原理及工具 JAVA的前端搭建:JAVA GUI M ...

  9. c语言编制学生课程信息管理系统,C语言课程设计-学生信息管理系统.doc

    - III -- III - 中国海洋大学 青岛学院 C语言课程设计报告书 题 目 学生信息管理系统 学生姓名 指导教师 学 院 专业班级 组内分工 姓名 主要任务 占系统比例 学生信息的查看,主函数 ...

  10. 数据库课程设计——学生信息管理系统

    学生信息管理系统 0 前言 0.1效果演示 0.2 开发工具 0.3 创新点 1.系统需求分析 1.1 系统功能分析 1.2 系统功能模块设计(划分) 1.3 与其它系统的关系 1.4 数据流程图 2 ...

最新文章

  1. 用fgets()函数以字符串形式读取磁盘文件并输出到屏幕
  2. R语言中if else、which、%in%的用法
  3. c# socket接收字符串_socket通信很难?这一文让你轻松搞定!
  4. 洛谷 【P1252】马拉松接力赛
  5. oracle rac实例切换,RAC+单实例DG的切换
  6. linux conda创建虚拟环境
  7. mac mysql打不开闪一下_mac系统上 MySQL Workbench意外退出,再也打不开
  8. 速修复!21个漏洞影响60%的互联网邮箱服务器
  9. 剑指offer--面试题10
  10. 如何批量将 Excel 文档转为 Txt 文本格式
  11. OCJP认证有什么用
  12. 《麦肯锡方法》读书笔记4
  13. ubuntu16.04 运行ROVIO
  14. mysql lpad 列_mysql的lpad函数
  15. 随笔--初到青岛,爱意油然而生
  16. 一般人不会的电脑小绝技(ZT)
  17. Setup Factory打包注册dll
  18. 网络类型之BMA与NBMA的区别
  19. kali下载速度慢_Linux系统软件安装更新下载太慢解决方法(转载)
  20. 从业10多年,我总结了这几款程序员必备实用工具

热门文章

  1. 所有行业都适合推行6s管理吗?
  2. 编程打印以下图案。 ****** ****** ****** ******
  3. LIMS系统类型可以分为哪几种?
  4. [论文阅读] 颜色迁移-Automated Colour Grading
  5. 香港house of hello品牌包包是怎样被模仿呢?
  6. 最新阿里云国际注册教程-不用绑定paypal注册-Darkvm
  7. 脉歌蓝牙耳机线评测_Macaw脉歌 TX-80 蓝牙运动耳机 个人小评测
  8. vue显示地区的组件以及使用方法
  9. 土木工程--钢筋下料软件(开始)
  10. 科技巨头交出三季度答卷,几家欢喜几家愁?