mfc学生信息管理系统_第1页
mfc学生信息管理系统_第2页
mfc学生信息管理系统_第3页
mfc学生信息管理系统_第4页
mfc学生信息管理系统_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

重庆交通大学信息科学与工程学院 报告书 专 业:计算机科学与技术 课程 名称:信息技术实训 I 题 目:学生信息管理系统 班 级:2010 级,计科四班 设 计 者: 韩旭辉 完 成 时 间:2011 年 11 月 1 日至 2011 年 11 月 27 日 重庆交通大学信息科学与工程学院任务书 课 程 信息技术实训 班级 2010 计科专业信息技术方向 指导教 师 徐毅 896920069 题 目 自选 完成时 间 2011 年 10 月 19 日至 2011 年 11 月 2日 主要内容 要求:完成一个完整功能实现的 MFC 程序开发,报告需包括以下内容 1系统分析与设计(总体设计和模块详细设计)。 2系统编程与实现(必须有源码和注释)。 3功能测试计划内容和结果。 4存在问题与不足及对策。 设计报告要求 1封面:(格式见前页) 2课程设计任务书 3课程设计报告: 功能需求分析 系统设 计 功能模块详细设计和流程图 设计代码 心得体会和参考资料 说明:第 14 周周三下午 34 节一班提交打印设计报告及软件,回答老师提问, 周四下午 34 节二班提交打印设计报告及软件,回答老师提问。报告文字不少于 5000 字,并装订成册。 考核内容与方式 1 平时成绩: 20% 2 设计报告: 40% 3 程序与演示,回答问题:40% 星期 周次 一 二 三 四 五 六 日 18 上机时间 安排 19 版面要求 1题目用黑体三号,段后距 18 磅(或 1 行) ,居中对齐; 2标题用黑体四号,段前、段后距 6 磅(或 0.3 行) ; 3正文用小四号宋体,行距为 1.25 倍行距; 4标题按“一” 、 “” 、 “1”、 “”顺序编号。 课程设计报告 一. 功能需求分析: (一). 实现简单地使用用户名和密码来进入登陆界面,以加强 DOS 运行窗口的 可视化效果。如果输入的用户名和密码有一项为空或者是输入的用户名和密码 是错误的,则不能进入系统。 (二). 实现任意添加学生的信息,包括添加学生的个人学号,姓名,性别,专业, 年级出生日期。输入不允许为空,并且有提示功能,如果输入的时候有一项为 空则提示输入相关的信息。 (三). 实现删除学生的信息,包括删除学生的个人学号,姓名,性别,专业, 年出生日期。根据编号进行用户权限检查,在数据库中进行查找相符和的记录, 如果编号在数据库中不存在相应记录,则提示不能删除,否则可以删除该记录。 输入不允许为空,并且有提示功能,如果输入的时候为空则提示输入相关的信 息。 (四). 实现编辑学生的信息,包括编辑学生的个人学号,姓名,性别,专业, 年级,出生日期。输入不允许为空,并且有提示功能,如果输入的时候有一项 为空则提示输入相关的信息。 (五). 实现查询学生的信息,包括编辑查询学生的个学号,姓名,性别,专 业,年级,出生日期。输入不允许为空,并且有提示功能,如果输入的时候为 空则提示输入相关的信息。 (六). 实现保存学生的信息,包括保存学生的个人学号,姓名,性别,专业, 年级,出生日期。 二系统分析: (一). 该实验在 Visual C+ 的 MFC 中完成,通过可视化编程实现实验的要 求。用工程 MFC AppWizard(exe) 建一个工程文件 Stuinfor。 (二).该系统的 MFC 的实验共分为四个类: Add 实现学生信息的添加 Delete 实现学生信息的删除 Modify 实现学生信息的修改 Search 实现学生信息的查找 (三).由系统的功能分析,可把系统分成若干个对话框窗口的形式,分别实现 系统的输入,修改,删除,查询功能。每一个对话框定义一个类分别用来完成 各个功能的实现。整个系统的功能在菜单内完成,分别是在学生信息管理下的 学生信息录入,学生信息的删除,学生信息的修改,学生信息的查询。可视化 的窗口五个,分别实现用户的登录,学生信息的录入,修改,删除,查找。通 过窗口的各个按键对学生信息进行操作。 (四).由于整个系统的功能比较简单,所以实现所需的控件和代码不会太多, 各个控件的变量以及控件的点击映射函数都是比较简洁的,整体来说,该系统 是一个比较简洁的系统,他通过简明易懂的方式实现了实验的目的,对初步接 触 MFC 的学生来说是一个非常好的实验教程。 三功能模块详细设计和流程图 (一).功能模块详细设计 1首先完成系统的登录窗口的设计,按 ctrl+r 键,弹出插入资源对话框,选 择 dialog 新建,在该对话框的属性里将标题改为登录。然后在新建的窗口中分 别加入图中的各个控件,其中包括两个静态文本,两个编辑框。其中静态文本 分别定为用户和密码,其相对应的编辑框的 ID 分别按默认的 IDC_EDIT1,IDC_EDIT2 不需要更改。在窗口中的确认键的属性里将标题改为登 录,取消不变,其 ID 分别为 IDOK,IDCANCEL 不变。调整各个控件的位置,如 图。 2完成学生信息的输入窗口,将窗口标题改为输入。同理,创建一个对话框, 加入静态文本,学生信息录入,学号,姓名,性别,专业,年级,出生日期, ID 取默认的,其中与学号,姓名,性别(男,女),专业,年级,出生日期, 录入,取消相对应的编辑框或是按钮的 ID 分别是 IDC_EDIT2,IDC_EDIT3,IDC_RADIO1,IDC_RADIO2,IDC_EDIT4,IDC_EDIT5,I DC_EDIT6,IDOK,IDCANCEL 如图所示加入个控件并设置相应的 ID,调整个控件 的位置。 3同上,完成学生信息管理系统的删除窗口,将窗口属性里的标题改为删除, 加入静态文本,编辑框,按钮,组框,如下图所示,其中静态文本的 ID 取其默 认值,将确认键的标题改为删除,其余控件的 ID 也保持默认值不变。调整控件 位置如图。组框的属性里的标题改为查询结果,用于显示查寻结果的,为下面 信息的删除做好铺垫。如果没有查到要找的信息,系统也会给出提示,同时, 查询结果里没有任何信息。同时为查询按钮映射一个成员函数 OnButton1(), 用于完成查询按钮的功能的实现。 4查询窗口的设计也是一样,在窗口属性里将标题改为查询,如下图加入各个 静态文本和控件,同上,各个控件的 ID 取其默认值,删除取消键,将确认键属 性里的标题改为查询,用于执行数据的查询,同上,此对话框里也有一个查询 结果的组框用于信息的输出,按键 ctrl+w 键,在 MFC ClassWizard 里为查询键 加入函数映射 OnOK(),此函数的功能是查询记录中的数据。 5创建一个对话框如图,图中加入的控件有静态文本,编辑框,旋转按钮,单 选按钮,列表控件,删除原图中的确认,取消键,ID 取其默认值。 6在 ResourceView 的 Menu 的工具栏里添加按键如下,按钮学生信息管理属性 里的选择弹出,在学生信息管理下分别加入按键学生信息录入,学生信息的删 除,学生信息的修改,学生信息的查询,ID 分别为 ID_MAdd,ID_MDelete ,ID_MModify,ID_MModify 。 7在 MFC ClassWizard 的 Member Variables 中分别为类 Search,Delete,Modify,Password 控件添加变量如下图 8在主窗口的类 CMainFrame 为成员函数添加点击映射,如下图所示,代码在 后面。 (二) 流程图 确认 确定要修改该学生的信息 进入系统 登录,输入用户名,密码 密码输入错误 进入系统页面 学生信息管理 学生信息查询 输入学号查找 无 无 恶 有 学生信息修改学生信息录入 录入完毕 学生信息删除 有 选中 该学生信息不存在 该学生信息已删除 确定要删除该学 生的所有信息吗 学生基本信息浏览 输入要查询的学号 该学生信息不存在 查找 确认 填入修改后的数据 修改 修改完毕 输出查询结果 四设计代码 (一)录入学生信息 void Add:OnOK() UpdateData(); if(m_sNum = “ | m_sName = “ | m_sMajor = “ | m_sGrade = “ | m_sBirthday = “ | (!m_cMale.GetCheck() 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 = “男“; else temp = “女“; ofstream ou; ou.open(“record.txt“, ios:app); / 选择附加模式 ou m_strID; ou m_strName; if(m_cMale.GetCheck() temp = “男“; else temp = “女“; ou m_strMajor; ou m_strGrade; ou m_strDate; ou 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 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); else m_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); (三)修改学生信息代码 void Modify:OnOK() / TODO: Add extra validation here 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); in.seekg(-k, ios:cur); int offset = in.tellg(); string temp, str; int flag = 0; / 用来判断信息是否改动 for(int col = 0; col 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 = “男“; else str = “女“; 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 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 = “男“; else stu-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( else m_cList.SetItem( c+; if(c = 6) break; m_cList.DeleteItem(m_nRecord-1); MessageBox(“修改完毕!“, “成功“); /CDialog:OnOK(); void Modify:show(int r) clean(); if(r index) return; ifstream in(“record.txt“); int k = 0; for(int i = 1; i 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); else m_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 here index = 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 str) lvi.iSubItem = c; lvi.pszText = (LPTSTR)(str.c_str(); if(c = 0) m_cList.InsertItem( else m_cList.SetItem( 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; / return TRUE unless you set the focus to a control / EXCEPTION: OCX Property Pages should return 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) temp) str = m_sNum; if(temp = str) flag = 1;/ 说明找到了 in temp; m_sName = temp.c_str(); / 类型转换 in temp; if(temp = “男 “) m_cMale.SetCheck(1); else m_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(); (五)登录信息代码 BOOL CStuinforApp:InitInstance() AfxEnableControlContainer(); int nCount=0; while(nCount=3) MessageBox(NULL,“口令输入已超过三次,请退出!“,“错误信息 “,MB_OK|MB_ICONERROR); return FALSE; (六)写入学生基本信息 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 = “男“; else temp = “女“; ofstream ou; ou.open(“record.txt“, ios:app); / 选择附加模式 ou m_strID; ou m_strName; if(m_cMale.GetCheck() temp = “男“; else temp = “女“; ou m_strMajor; ou m_strGrade; ou m_strDate; ou endl; ou.close(); write:write() 测试结果: (五)心得体会和参考资料 通过这次实验,我充分认识到自己的不足之处,同时也让我在实验中学到 了很多知识,在这之中,我感觉自己不仅增加了实验的分析及处理能力,而且 我也懂得了课本知识的重要性,课本是我们学习的根本,同时也是我们实验的 基础,在实验中遇到的问题,大多都能在课本中找到解决的方法,并且课本都 会有或多或少的对于此类问题的讲解,对我们理解这一类问题都有很大的帮助, 另一方面,书本上还有一些实验中并没有涉及的知识,这些知识对我们认识和 理解 MFC 功能和正确的使用它都有很大的作用。由于自己平时并没有过多的看 书本上的内容,致使自己在刚开始做这个实验式处于一种很被动的情况下,在 自

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论