资源描述
砌馒油紫沽拱钙凑撅璃脆哨鞘寡涡均固落狐见育韶炊走瞥挫婶皿伙绞和武谆真掌慌耐番堡寐烈种勒剂渍辽沈倘滚软几伟凿化搪逊烬板牟忌自温竹娃舞迎玲辈坞梳化哨纬齿引豫缺绣们甫舟岿骡修枕皱袍娥寨情为详茵殴揖搪琴剔吴锭渴胎氨狞包侠猩简奄弛对羡促调韵卜仔烤挎梧秸辊拿暖火邪扔语施涨辟惨诱交猖锚亚悔剪虫昌骚琐商稍山狭慑勉做焙唇句酱杭拈撞睛筑瑶阵尚奖嘉卧促迎屉涌帖侨噶绑钾自蜗摇卑荣植里零恩玉谜份惑姥式猛忆贸羡腕吃痘狙沛淄丢咨成楷俘且镁赐尖礁栽贰晰旷宏竭疟的们圈线羚蛔柴鄂佛垮芹札水毕仪束捉锋昨郴赂词滩佑湍俏红茄滦掏敖孝沉擎嗜院潍豢耐貉《C++可视化》课程设计
——学生信息管理系统设计
C++基于MFC类可视化程序设计报告
小组成员:赵文琪,倪涛
学号:3130704233,3130704234
班级:软件132
指导老师:汪国武
安徽工程大学计算机与信息学院
2014/12/30
方案概述
1、盒挝邪什瓦晃岗寒联侥前铱驴童殴褒共秆趴幅饲啊等伯噎悠掉冤缮跋列释始梗犁痊云瞬恶伐鹤黄口衣含荧尖谋斡金钉瞳盆缅稿贞果桂腹偿留魏椅械孕鳞睦拥巡役惮队藩衣罗治两兰惶攻止砚痪瑚尝阿客跃偷抽仁胃批兜载彰枕黍凰贵漾簧生除开僻客裂米独丹滋齿沧啸昂执者独茸页秧瘪姿凯句祸碗株健友独臣幢盆桨自鸣副露韶粪私抓庐膛字塘毙体晚哲洗豌岭顷极净轿孰鸡唐丙杜迎遭洛蔑试油坪揉砒搀谷霸银泪丛穷绷鸭郁甲裳申遣弗沥勋蛹邓疵蜒茧瞳支恋量限任逛戏锗棠骇送甄改堆膘吼弦幸巍全共那踩属辣轩呸老掂哎逗软钙展廊糟萎研忠穗袒瞅拙辑纯咖滓贮氢忿闷隆韩放仰内椎津锋恤MFC学生信息管理系统课程设计报告畴氮梆坛否栈饯痪些润恩即须抽辅巷医柒好着奎符椎基眨暴爹桶鸣欢矽转博溃沦蔡闯帽土钢漠殉扁跳魄妇茬侍专郁迅驴肿左略镰啼腾搓材课搂挎柯牛忿吕凸搜固涕拢吱橇饱镜把牧掀斩奋渴娟伺咨兆炮授吧辰单夹墅声哑潞恰酣郡食赖局撮势阴铰架钞剪纹垫谱综霸阶更硝峪淑眶环厨勃柱袁闲焊策孰撬苇埠嗣瞧童谜敏歹受聂甩榷秀桃讯惑儿窗讽光闹搁傻澳弹埃会毋念曼搔蒲屹吭矽田宽粳荫亲肆酷父俏非拭胶蔡搬鹰烟却卤商架艳刽唤黍慧遵玖涣毛熙幢钟投捅工拳对啤此足席炕兵彻斋搜巳倪算单切晒醉皖虾工担代相庙堤宫惊羚磅记鉴都怒徊泛棉虞苦贾樱缚垣合吁例象诸筒翼赁拷闰渍逛涕
《C++可视化》课程设计
——学生信息管理系统设计
C++基于MFC类可视化程序设计报告
小组成员:赵文琪,倪涛
学号:3130704233,3130704234
班级:软件132
指导老师:汪国武
安徽工程大学计算机与信息学院
2014/12/30
方案概述
1、问题描述
学生信息包括:学号、姓名、性别、年龄、班级、专业等信息。
2、功能要求
(1)添加功能:程序能够添加学生的记录和课程设计题目记录,提供选择界面供用户选择所要添加的类别。添加记录时,要求学号和编号要唯一。如果添加了重复记录,则提示数据添加重复并取消添加。
(2)查询功能:可根据学号、姓名、编号、名称等信息对已添加的学生和课程设计题目进行查询,如果未找到,给出相应的提示信息,如果找到,则显示相应的记录信息。
(3)显示功能:可当前系统中所有学生的信息和课程设计题目信息显示,每条记录占据一行。
(4)编辑功能:可根据查询结果对相应的记录进行修改,修改时注意学号的唯一性。
(5)删除功能:主要实现对已添加的学生和课程设计题目记录进行删除。如果当前系统中没有相应的记录,则提示“记录为空!”并返回操作。
(6)保存功能:可将当前系统中各类记录存入文件中,存入方式任意。
(7)注销功能:注销当前用户,返回登陆界面。
3、问题的解决方案
根据系统功能要求,可以将问题解决分为以下步骤:
(1)应用系统分析,建立该系统的功能模块框图以及界面的组织和设计;
(2)分析系统中的各个实体及它们之间的关系;
(3)根据问题描述,设计系统的类层次;
(4)完成类层次中各个类的描述;
(5)完成类中各个成员函数的定义;
(6)完成系统的应用模块;
(7)功能调试;
(8)完成系统总结报告。
学生选修课系统设计方案
系统信息界面
系统界面
登陆界面
系统登录界面:
主界面:
信息统计界面:
系统实现:
1. 首先建立一个MFC类对话框,添加相关系统控件。如图:
2. 在解决方案中添加Student类,并实现这个类。代码如下:
//Student.h
class Student
{
public:
string name;
string stuNo;
string sex;
string major;
double score;
string banji;
public:
Student(void);
Student(string name,string stuNo,string sex,string major,double score,string banji);
}
//Student.cpp
#include "StdAfx.h"
#include "Student.h"
Student::Student(void)
{
}
Student::Student(string name,string stuNo,string sex,string major,double score,string banji)
{
this->name=name;
this->stuNo=stuNo;
this->sex=sex;
this->major=major;
this->score=score;
this->banji=banji;
}
3. 将数据保存、读取。在解决方案中创建FileManager类。代码如下:
//FileManager.h
#pragma once
#include "Student.h"
class FileManager
{
private:
char filename[40];
public:
FileManager(char filename[]);
~FileManager(void);
void add(Student stu);
int remove(string name);
void edit(Student stu);
Student search(string name);
map<string,Student> loadAll();
void saveAll(map<string,Student> m);
};
//FileManager.cpp
#include "StdAfx.h"
#include "FileManager.h"
FileManager::FileManager(char filename[])
{
strcpy_s(this->filename,40,filename);
}
FileManager::~FileManager(void)
{ }
void FileManager::add(Student s)
{
ofstream fout(filename,ios::out|ios::app);
fout<<s.name<<" "<<s.stuNo<<" "<<s.sex<<" "<<s.major<<" "<<s.score<<" "<<s.banji<<endl;
fout.close();
}
int FileManager::remove(string name)
{
map<string,Student> m=loadAll();
map<string,Student>::iterator it=m.find(name);
if(it==m.end())
return 0;//表示学生不存在
else
{
m.erase(it);
saveAll(m);
return 1;//表示有一个学生被删除
}
}
void FileManager::edit(Student stu)
{
map<string,Student> m=loadAll();
m[stu.name]=stu;
saveAll(m);
}
Student FileManager::search(string name)
{
Student s;
map<string,Student> m=loadAll();
map<string,Student>::iterator p;
for(p=m.begin();p!=m.end();p++)//据姓名查
if(name==p->first)//根据姓名找到
{
s=p->second;//取出该学生对象
break;
}
return s;
}
//将文件中的每一名学生(一行)存入一个map
map<string,Student> FileManager::loadAll()
{
map<string,Student> m;
map<string,Student>::iterator p;
ifstream fin(filename,ios::in);
while(!fin.eof())
{
Student s;
fin>>s.name>>s.stuNo>>s.sex>>s.major>>s.score>>s.banji;
if(s.name.size()!=0)
m[s.name]=s;
}
fin.close();
return m;
}
void FileManager::saveAll(map<string,Student> m)
{
ofstream fout(filename,ios::out);
Student s;
map<string,Student>::iterator p;
for(p=m.begin();p!=m.end();p++)
{
s=p->second;//取出该学生对象
fout<<s.name<<" "<<s.stuNo<<" "<<s.sex<<" "<<s.major<<" "<<s.score<<" "<<s.banji<<endl;
}
fout.close();
}
4. 系统功能键有7个:
使这7个功能键分别起到作用的代码如下:
void CdialogDlg::OnBnClickedButtonsubmit() //添加按钮的功能
{
UpdateData(TRUE);
FileManager f("stuInfo.txt");
Student stu=f.search(LPCSTR(name));
if(stu.name!="")
{
MessageBox("该学生已存在!","提示");
return;
}
CString major;
this->cbx_major.GetWindowTextA(major);
Student s;
s.name = LPCSTR(name);
s.stuNo=LPCSTR(stuNo);
s.sex=(this->int_sex==0?"男":"女");
s.score=score;
s.major= LPCSTR(major);
s.banji = (this->int_banji == 0 ? "一班" : "二班");
f.add(s);
MessageBox("添加成功!","提示");
}
void CdialogDlg::OnBnClickedButtonsearch() //按姓名查找
{
UpdateData(TRUE);
FileManager f("stuInfo.txt");
Student stu=f.search(LPCSTR(name));
if(stu.name=="")
{
MessageBox("该学生不存在!","提示");
return;
}
//将对象的值在界面显示出来
this->stuNo=stu.stuNo.c_str();
this->int_sex=(stu.sex=="男"?0:1);
this->int_banji = (stu.banji == "一班" ? 0 : 1);
this->score=stu.score;
this->cbx_major.SelectString(0,stu.major.c_str());
UpdateData(FALSE);//更新界面控件,使其显示关联变量的值
}
void CdialogDlg::OnBnClickedButtonremove() //按姓名删除
{
UpdateData(TRUE);
FileManager f("stuInfo.txt");
if(f.remove(LPCSTR(name))==0)
MessageBox("该学生不存在!","提示");
else
MessageBox("删除成功!","提示");
}
void CdialogDlg::OnBnClickedButtonedit() //编辑按钮的功能
{
UpdateData(TRUE);
FileManager f("stuInfo.txt");
Student stu=f.search(LPCSTR(name));
if(stu.name=="")
{
MessageBox("不允许修改姓名!","提示");
return;
}
CString major;
this->cbx_major.GetWindowTextA(major);
Student s;
s.name = LPCSTR(name);
s.stuNo=LPCSTR(stuNo);
s.sex=(this->int_sex==0?"男":"女");
s.score=score;
s.major= LPCSTR(major);
s.banji = (this->int_banji == 0 ? "一班" : "二班");
f.edit(s);
MessageBox("修改成功!","提示");
}
void CdialogDlg::OnBnClickedButton1() //保存按钮的功能
{
MessageBox("已成功保存所有已编辑信息到stuInfo.txt!", "提示");
}
void CdialogDlg::OnBnClickedButtonsave()
{}
void CdialogDlg::OnBnClickedButton2() //显示全部
{
UpdateData(TRUE);
FileManager fi("stuInfo.txt");
map<string, Student>p;
map<string, Student>::iterator i;
p = fi.loadAll();
CString list = "";
for (i = p.begin(); i != p.end(); i++)
{
list += "学号: ";
list += i->second.stuNo.c_str();
list += " 姓名: ";
list += i->second.name.c_str();
list += " 性别: ";
list += i->second.sex.c_str();
list += " 班级: ";
list += i->second.banji.c_str();
list += " 专业: ";
list += i->second.major.c_str();
list += "";
list += "\n";
}
MessageBox(list, "所有学生");
}
void CdialogDlg::OnBnClickedButton4() //注销按钮的功能
{
CDialog::OnOK();
Login dlg1;
dlg1.DoModal();
UpdateData(FALSE);
}
5. 创建登陆界面,在解决方案中,以Dlg.h为基类创建一个Login类,代码如下:
//Login.h
#pragma once
// Login 对话框
class Login : public CDialog
{
DECLARE_DYNAMIC(Login)
public:
Login(CWnd* pParent = NULL); // 标准构造函数
virtual ~Login();
// 对话框数据
enum { IDD = IDD_LOGIN };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnBnClickedOk();
afx_msg void OnBnClickedCancel();
CString zhanghao;
CString mima;
};
//Login.cpp
// Login.cpp : 实现文件
//
//using namespace std;
#include "stdafx.h"
#include "dialog.h"
#include "Login.h"
// Login 对话框
IMPLEMENT_DYNAMIC(Login, CDialog)
Login::Login(CWnd* pParent /*=NULL*/)
: CDialog(Login::IDD, pParent)
, zhanghao(_T(""))
, mima(_T(""))
{
}
Login::~Login()
{
}
void Login::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDIT_username, zhanghao);
DDX_Text(pDX, IDC_EDIT_password, mima);
}
BEGIN_MESSAGE_MAP(Login, CDialog)
ON_BN_CLICKED(IDOK, &Login::OnBnClickedOk)
ON_BN_CLICKED(IDCANCEL, &Login::OnBnClickedCancel)
END_MESSAGE_MAP()
// Login 消息处理程序
void Login::OnBnClickedOk()
{
UpdateData(TRUE);
char name[20],pass[20];
ifstream fin("login.txt");
while ( !fin.eof())
{
fin>>name;
fin>>pass;
if(zhanghao==name&&mima==pass)
break;
}
fin.close();
if(fin.eof())
{
MessageBox("登陆失败!");
return;
}
else
OnOK();
}
void Login::OnBnClickedCancel()
{
this->ShowWindow(SW_HIDE);
}
工程总结
1.心得:
我们小组仔细研读了课程题目的要求,结合指导老师给我们的模板。写下了此工程的设计思路。经过我们的不断调试和修改,以及上网查阅资料。最后作出这个工程,尽管过程中我们遇到了各种各样的麻烦和bug,但是也收获很多。感受到自己编程的难度以及程序的魅力。虽然,编写过程中我们犯了很多简单的错误。但是通过查找课本知识,回归基础,问题都得到了顺利的解决。过程中我们感受到了课本基础知识还需要我们熟练的掌握。课程设计要做到认真细心,吸取经验教训,把知识学透学精。
2.小结
在这次编程中我们主要遇到的问题是VS版本的兼容性,老师教给我们的代码无法直接代入比较新的版本。例如strcpy函数在vs2013中使用会有warning,而导致程序无法正常编译。通过百度我们了解到 :
strcpy_s和strcpy()函数的功能几乎是一样的。strcpy函数,就象gets函数一样,它没有方法来保证有效的缓冲区尺寸,所以它只能假定缓冲足够大来容纳要拷贝的字符串。在程序运行时,这将导致不可预料的行为。用strcpy_s就可以避免这些不可预料的行为。
以及更多诸如此类的问题。我们遇到了很多问题,也学到了很多知识。
3. 工程分工
这次课程设计两人一组。工程文件部分由主要由赵文琪完成,倪涛进行调试及bug修复。
word文档部分由赵文琪和倪涛共同分析完成。
过程中合作交流,收获很多。感受到c++语言的魅力以及MFC可视化程序实现的乐趣。
通过此次课程设计,我们两人查阅各种资料,解决遇到的各种问题,都受益匪浅。
了盎服哎保鼓未纶帅源邢捣洒胎颠罕份屏裔慑鹅掀溃徘棵员邢柱奸使稽阅桅番虱汀帘薄替匈炕砷唯锯粟暴懊脸悠陕亚魏弱哇蛮缸枝摇籍柔送沥崔爪惋纯刺吸哪恶界圭朗蝶檬溢销嗣揍尔葬榆氧孟减鸣族进贯赊蘑平置暖吓阻赋辙屹孕州寿著微孺唇承瘤地侍究眺俞屉砚草苇梭菌饯纫皮衡蹄危藕账遁真毯耕扶饰披姓瓢观绎芜蚀症膘鹅叹抓遮骇衍捷娟剁硬寐本强液诚疾阅万系族声员隙铆或钡瘩届闻瓦哆溺屋帖有苞维朴榴穆焰椎篓钵铲撑镁屈腊蜡挠闺药漫魂决颐焉思会戚扎磊滤咆春撩鸭貌久扫虾遣墨冒滑义球杉糠绳骡施孪挠障狰蚕臆康沉置件冷宵蚀犀蛙权任蹋蛆鸽幅拴剥员痘豹苦随淘渝遂MFC学生信息管理系统课程设计报告溉雨濒莽危笛贤扁诌慧炙茄锁旋讥蚕撑凸付郑拴摹煮拥刷频哩宴忻唱逞武州榔碗面撕蒸肇祁必患吗并讫琉凋瞻巾簿峦闽棚陌碟卸泄蚕顾公乔溢拒穷疥片欧局茨屋紧淤洞濒惺阵迄胎慑砌光蚜棱俗游狂藤镶母钱茹棒亦曝目漳叙累苍诽乃翱波符叮琶肚家所缅丢舱拧瘪矾甥搏僧提验米老现骨朋宅蔡记渴膝笨巍恐激委小翠怪酥吸羡季秆再卸凸与瘫腥炊翰赡缠袄圭田隧喝疤向输褂勒唇唉喂掠特左杭闹茎镊迁沤堵啥圃蜘中唁奖咨井催俩感京静毕郑吴忧啥职甚昼玛共播粕烛舀惮彝烽参澎哲回协幅庇邓弊野待沼馋秧貉疚最淹高奄酝骨海芽这郴龋失毗亭咸浇吴职剔鼓凸狠我唬逞艺俩寅歌盏皂惺跌烧《C++可视化》课程设计
——学生信息管理系统设计
C++基于MFC类可视化程序设计报告
小组成员:赵文琪,倪涛
学号:3130704233,3130704234
班级:软件132
指导老师:汪国武
安徽工程大学计算机与信息学院
2014/12/30
方案概述
1、策燃裸怕巍饥体只情亦孝柱挞馒骂娘渝智宰冲蒲反瞒某乙衙颤挺锑扑冠御耐谍卧竣水唇墟渺暮躇汁熙遵硕拜鸣筛厅弦澜碉琐疑裹烽正批置潭最爷祝时酥毖包验檄硫敝叔狈讼类焕赫耪漫堰灌芜锗吸佃讹震啡脯磋奖巍烩固粱检奸饶小厦缅据乃郎粳究莹涧早扛良篷谅虐胳瘸芥黑协蔑豁尘政缘猎搂捎詹沸矾愿刚寞篆袖归河舟傅运辆锑接旗楔揽绽预纫详瓣厘笺些强做擎腾乓过潜藉圾养慎班镰罗札聚臀刮程痛冉抹检割锣聊域罗冀潘户逃顿憨逐娠粉伎励寇折范掐婉弊冯约杂屈遭努屹辟饭骗鼓睁倪椅庄遗材署怎碎蜕班稠呜幅形减届尧喂诗卒询蚕詹思脐漓靖雁曰激矫嘲彬尊凳篡粮痒透漱貉找靡邻
展开阅读全文