MFC学生信息管理系统课程设计报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C++基于MFC类可视化程序设计报告
方案概述
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;
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;
}
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));
{
MessageBox("不允许修改姓名!”,"提示”);
return;
}
CString major;
this—〉cbx_major。
GetWindowTextA(major);
Student s;
= 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();
for (i = p。
begin();i != p。
end(); i++)
{
list += ”学号:”;
list += i—〉second.stuNo.c_str();
list += " 姓名: ”;
list += i—〉。
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可视化程序实现的乐趣。
通过此次课程设计,我们两人查阅各种资料,解决遇到的各种问题,都受益匪浅.。