面向对象程序设计 课程设计报告
设计题目: 同学通讯录管理程序 学 院:
信息工程学院
专 业: 计算机科学与技术(交通) 学 号: [1**********]8 姓 名: 王 沛 林 指导教师:
2015 年 1 月4 日
目录
一.设计目的和内容
1.1设计目的………….………………………………………………………...………...1 1.2设计内容 ................................................................................................................................. 1
二.基本功能描述
2.1.输入输出框 ............................................................................................................................. 2 2.2.列表框 ...................................................................................................................................... 2 2.3.按钮 .......................................................................................................................................... 2
三.设计思路
3.1.窗口的设计 ............................................................................................................................. 3 3.2.数据的结构设计 .................................................................................................................... 3
四.软件设计
4.1设计步骤 ................................................................................................................................. 4 4.2.关键步骤的实现
4.2.1 PHONEST类成员函数中: .................................................................................. 5 CStudentDlg中对各控件函数实现 ................................................................................ 6
五.结论与心得体会
5.1.结论 .......................................................................................................................................... 7 5.2体会 .......................................................................................................................................... 7
六.参考文献
七.附录
7.1调试报告及运行结果 ........................................................................................................... 8 7.2.关键源代码
PHONEST类成员函数中 .............................................................................................. 9 CStudentDlg控件函数(list为PHONELIST类对象,全局变量) .............................. 11
一、设计目的和内容
1.1 设计目的
同学通讯录管理程序是为了更好的管理学生信息而开发的数据管理软件。它对于学生与学 生之间联系是不可缺少的重要部分,它的内容对于同学与同学,同学与老师之间的联系提 供了一个好的工具。
目前各个高校的基本情况是:同学与同学,老师与同学联系都是通过电话联系。但是,所以,同学通讯录管理程序为用户提供充足的信息和快捷的查询手段,实现学生基本通常 这些数据与其他人的信息混合在一起不易进行查找,修改,增加等功能。
信息 的录入,删除,查询,修改,存到文件等几方面的功能,这样能对同学之间的信息进行更 好的管理,使老师能更好的管理学生的信息,对学生信息出现的变动也能及时进行修改。
1.2 设计内容
1) 在设计同学通讯录管理程序时,我采用对话框形式来进行处理,因为对话框窗口操作简
单,更重要的是能更好的向使用者表达程序所要表达的信息。
2) 在主界面进行设计时,我分别设计了学号,姓名,职业,邮箱,电话等五个输入输出框,
分别对学生的信息进行输入与输出。其次,设计了一个列表框使学生信息能更好的向用户展示,同时也更加方便了以后的操作。
3) 最后,分别设计了添加记录,全部删除,删除记录,修改记录,生成文件,读取文件和
退出七个按钮,分别实现各自所对应的功能,最后用一个只读输出框对学生数量进行显示。
二、基本功能描述
2.1 输入输出框
学号,姓名,职业,邮箱,电话静态文本后的输入输出框实现了对学生信息数据的
输入输出,当前学生数量输入输出框后实现了对当前存储学生数量的显示。
2.2 列表框
实现了对学生各个信息的显示,同时通过点击列表中的某一项来实现查看,修改,等功能。
2.3 按钮
1) 添加记录:添加记录按钮主要通过在输入输出框中输入信息,然后通过点击添
加记录按钮,添加到列表框中。
2) 全部删除:删除全部学生信息,清空所有记录,但不影响文件中的数据。 3) 删除记录:通过选中列表框中某一项,点击删除记录按钮删除所对应的学生数
据,但不影响文件中的数据。
4) 修改记录:通过选中列表框中某一项,在对话框中修改所对应的学生某项数据,
然后点击修改记录按钮,修改列表框中所对应的数据信息,但不影 响文件中的数据。
5) 生成文件:将列表框中的信息全部保存到,目录下的“学生信息.TXT”文件中,
只有生成文件按钮才会通过程序影响文件中的内容。
6) 读取文件:通过读取文件按钮,将目录下的“学生信息.TXT”中的数据全部提
取到列表框中,随后,能继续进行后续操作。
三、设计思路
3.1 窗口的设计
新建对话框程序,在对话框程序中添加各个控件,实现各个功能。
3.1.1数据的结构设计
1) 首先创建一般StudentInfo类,其中有共有CString公有数据成员Email,Name,Number,Phone,Profe ,分别实现对学生邮箱,姓名,学号,电话,系别的存储。
class StudentInfo { public:
StudentInfo();
virtual ~StudentInfo();
public: };
CString Name; CString Profe; CString Email; CString Number; CString Phone;
//姓名 //职业 //邮箱 //学号 //电话
2) 再次创建PHONELIST类,
class PHONELIST
{ public:
bool LoadFile(); bool SaveFile();
//读取文件 //存储文件
};
bool ChangeStu(int n,StudentInfo &S1); bool DelStu(int n); PHONELIST(); int StuNum;
bool AddStu(StudentInfo &S1); virtual ~PHONELIST(); StudentInfo* Slist[100];
//修改信息 //删除信息 //增加信息
//学生数量 //数组指针
在PHONELIST类中,StudentInfo* Slist[100]为指针数组,每一个值为指向
一个学生对象的指针,int StuNum;表示当前存储多少学生对象,其他函数则完成相应于按钮所对应的功能。在对按钮操作时,调用PHONELIST相应函数完成数据的存储工作。
3) 为对话框创建创建CStudentDlg类,并设置各个变量与对话框各个窗口相关联。 关联情况如下:
m_NUMBER
m-N
m-C
m_L
m-Pm_PHONE
通过编写点击各个按钮对应函数来完成各个按钮的功能:
添加数据:void CStudentDlg::OnButton1(); 全部删除:void CStudentDlg::OnButton6(); 删除记录:void CStudentDlg::OnButton2(); 修改记录:void CStudentDlg::OnButton3(); 生成文件:void CStudentDlg::OnButton4(); 读取文件:void CStudentDlg::OnButton5();
四、软件设计
4.1设计步骤
1) 打开VC++6.0,新建MFC AppWizard[EXE]工程,在对话框中添加各个控件,完成程序窗口外观设计。
2) 在MFC ClassWizard中建立对话框类,并命名为CStudent; 3) 在MFC ClassWizard中建立一般类,并命名为PHONELIST; 4) 在MFC ClassWizard中建立对话框类,并命名为StudentInfo; 5) 为PHONELIST,StudentInfo类分别编写成员函数。
6) 在MFC ClassWizard为CStudentDlg中添加各个控件,并通过函数编写,实现具体的功能。
7) 在CStudentDlg类编写时,创建PHONELIST全局变量,并命名为LIST,通过LIST来调用PHONELIST中的各个函数。 8) 调试与运行。
4.2关键步骤的实现
4.2.1 PHONEST类成员函数中:
1) 在PHONELIST类构造函数中对StuNum赋初值为‘0’,使刚开始时的学生数量为0; 2) 在增加成员,删除成员函数中注意对StuNum值的修改
bool PHONELIST::AddStu(StudentInfo &S1){
~~~~ StuNum++; ~~}; ~~~~ StuNum--; ~~};
bool PHONELIST::DelStu(StudentInfo &S1) {
3) 在删除成员函数中,需要注意对指针数组指针的移动,并且同时需要,对所删除的对
象内存空间进行释放,防止内存泄露。
bool PHONELIST::DelStu(int n){
n++;
if(Slist[StuNum]==NULL&&n
//当删除为最后一个成员时
delete Slist[StuNum]; StuNum--; return TRUE; }
//当删除为中间成员时
delete Slist[n];
for( ; n
4) 在增加成员时,注意对指针申请内存,使其指向一个确定的对象。同时为各个成员赋
值。
bool PHONELIST::AddStu(StudentInfo &S1) { }
StuNum++;
Slist[StuNum]=new StudentInfo; Slist[StuNum]->Email = S1.Email; Slist[StuNum]->Name = S1.Name; Slist[StuNum]->Number = S1.Number; Slist[StuNum]->Phone = S1.Phone; Slist[StuNum]->Profe = S1.Profe; return TRUE;
//申请内存 //为各个成员赋值
if(Slist[StuNum]==NULL) return FALSE;
5) 读取文件时,在用提取符(>>)读取字符串时,应该同时创建Slist[i]进行接收,对所
读取的文件信息进行存储,并且判断读取停止,并且对Slist[i]进行释放。
bool PHONELIST::LoadFile(){ }
ifstream file("学生信息文件.txt"); if(file==NULL) return FALSE; string a,b,c,d,e;
for(int i = 1;i==1||a.length()!=0;i++){//当第一个字符串读取为空时停 Slist[i]= new StudentInfo(); }
file>>a; Slist[i]->Number = a.data(); file>>b; Slist[i]->Name = b.data(); file>>c; Slist[i]->Profe = c.data(); file>>d; Slist[i]->Email = d.data(); file>>e; Slist[i]->Phone = e.data();
if(a.length()!=0){ AddStu(*Slist[i]);StuNum=i;}
//对第一个读取字符串进行判断,防止为空
delete Slist[i];
return TRUE;
4.2.2 CStudentDlg中对各控件函数实现
1) 在CButton1(增加记录)中注意对错误输入判断,和对在列表框中显示,最后,在List对象中添加. 注意m_LIST的函数为列表框显示数据。
void CStudentDlg::OnButton1(){
UpdateData();
//读取数据到变量
if(m_NAME==""||m_NUMBER==""||m_CLASS==""
MessageBox("信息输入不完整,请重新输入!"); return;}
||m_EMAIL==""||m_PHONE==” ”){
}
POSITION pos=m_LIST.GetFirstSelectedItemPosition(); if( pos!=NULL){
MessageBox("不能添加此类数据!"); return;}
//错误判断
int num=m_LIST.GetItemCount(); m_LIST.InsertItem(num,m_NUMBER); m_LIST.SetItemText(num,1,m_NAME); m_LIST.SetItemText(num,2,m_CLASS); m_LIST.SetItemText(num,3,m_EMAIL); m_LIST.SetItemText(num,4,m_PHONE); ~ ~ ~ ~
~ ~
~ ~ ~ ~
~ ~
~ ~
//添加到list对象用于存储 //更新列表框显示
~ ~
list.AddStu(Stu); UpdateData(FALSE);
//显示新增加成员到列表框
2) 当函数完成功能时,需要对输入输出框进行清空,实现函数为: { m_NUMBER = "";
m_NAME = ""; m_CLASS = ""; m_EMAIL = ""; m_PHONE = ""; UpdateData(FALSE); }
3) 当点击列表框中某一项时,需要在输入输出框中显示;
void CStudentDlg::OnClickList2(NMHDR* pNMHDR, LRESULT* pResult) { }
POSITION pos=m_LIST.GetFirstSelectedItemPosition(); int n=m_LIST.GetNextSelectedItem(pos); char chTemp[20]={'\0'};
m_LIST.GetItemText(n,0,chTemp,sizeof(chTemp));
m_NUMBER=chTemp; m_NAME=chTemp; m_CLASS=chTemp; m_EMAIL=chTemp; m_PHONE=chTemp;
m_LIST.GetItemText(n,1,chTemp,sizeof(chTemp)); m_LIST.GetItemText(n,2,chTemp,sizeof(chTemp)); m_LIST.GetItemText(n,3,chTemp,sizeof(chTemp)); m_LIST.GetItemText(n,4,chTemp,sizeof(chTemp)); UpdateData(FALSE); *pResult = 0;
五、结论与心得体会
5.1结论
经过一周的编写,我选择的课题同学通讯录管理程序功能基本完成。其功能基本符合用户要求,能够对同学、的基本信息进行查询、修改、添加、删除,存储文件及读取文件功能。对运行过程中的一些特殊情况能够进行处理,对于错误也能进行简单的处理。
5.2体会
在为期一周的课程设计过程中总结起来,主要有以下几点体会:
1) 通过此课程设计,运用MFC知识,使我们学到了以前没有学过的很多知识,巩
固了C++课程的基本知识,并综合运用MFC所学知识,使用VC++ 6.0中的MFC编程,设计对话框,添加各种按钮,编辑框控件,编辑各个控件函数,让其实现具体的功能。
2) 必须牢固掌握基础知识。只有拥有扎实的C++基础,我们才能灵活运用我们所需
要的知识和技术对MFC类库进行灵活的操作。通过对MFC编程的学习,知道了如何创建对话框,单文档。知道利用MFC对程序进行操作,对我们所需要的信息进行查询,添加、修改和删除等。
3) 在程序设计过程中必须培养严谨的科学态度。在做需求分析的时候我们深深的体
会到严谨的科学态度的重要性,只有认真分析、综合考虑才能使系统尽可能完善,满足用户的需求。我想这不仅是对于程序设计,做任何事都应如此。
4) 必须积极查阅资料。在课程设计中我遇到了很多问题,在面对问题时要积极通过
网络,书本查找解决方法与同学进行讨论那样才能化难为易更早的成功编写出程序。
六、参考文献
[1] 郑莉 董渊 编著《C++语言程序设计》清华大学出版社 [2] 孙鑫 MFC编程教程视频
[3] 张荣梅 编著《Visual C++ 程序设计案例教程》 北京大学出版社
七、附录
7.1调试报告及运行结果(关键步骤截图)
7.1.1:添加数据:
7.1.2删除数据
:
7.1.3修改数据
:
7.1.4生成文件
:
7.2关键源代码(“~ ~ ~”为类似重复代码,此处不再累赘)
7.2.1 PHONEST类成员函数
bool PHONELIST::AddStu(StudentInfo &S1) //PHONELIST类添加学生函数 { }
bool PHONELIST::DelStu(int n){ }
9
n++;
StuNum++;
//学生数量+1 //为指针申请
//判断申请内存是否成功 //为各个成员变量赋予值
Slist[StuNum]=new StudentInfo; Slist[StuNum]->Email = S1.Email; ~ ~
~
~ ~
~
~ ~
Slist[StuNum]->Profe = S1.Profe; return TRUE;
if(Slist[StuNum]==NULL) return FALSE;
//PHONELIST类删除学生函数
//下标移动
//判断是否需要删除
//当删除信息号在学生中 //删除第n个学生信息
if(Slist[StuNum]==NULL&&n
delete Slist[StuNum];
delete Slist[n]; Slist[n+1]=NULL;
for( ; n
//当删除信息在最后时
StuNum--;
return TRUE;
bool PHONELIST::ChangeStu(int n,StudentInfo &S1){//PHONELIST类添修改学生函数 n++;
Slist[n]->Name = S1.Name; ~ ~
return TRUE; }
bool PHONELIST::SaveFile(){ if(file==NULL) return FALSE; string str;
for(int i=1;i
file.close(); return TRUE; }
bool PHONELIST::LoadFile(){ }
return TRUE; }
//PHONELIST类读取学生信息函数
ifstream file("学生信息文件.txt");
if(file==NULL) return FALSE;
for(int i = 1;i==1||a.length()!=0;i++){ }
Slist[i]= new StudentInfo(); file>>a;
Slist[i]->Number = a.data(); ~ ~
~
~ ~
~
~ ~
Slist[i]->Phone = e.data(); AddStu(*Slist[i]); StuNum=i;
//向流中提取字符串
string a,b,c,d,e;
str = LPCSTR(Slist[i]->Number);
file
~
~ ~
~
~ ~
//并且控制每一次插入位宽
str = LPCSTR(Slist[i]->Phone);
~
~ ~
~
~ ~
//逐个修改成员函数值
Slist[n]->Profe = S1.Profe;
//PHONELIST类存储学生函数
ofstream file("学生信息文件.txt");
file
if(a.length()!=0){
10
7.2.2 CStudentDlg控件函数(list为PHONELIST类对象,全局变量)
void CStudentDlg::OnButton1(){
UpdateData(); }
POSITION pos=m_LIST.GetFirstSelectedItemPosition(); if( pos!=NULL){ }
int num=m_LIST.GetItemCount(); m_LIST.InsertItem(num,m_NUMBER); ~ ~
~
~ ~
~
~ ~
m_LIST.SetItemText(num,4,m_PHONE);
//得到当前选定行号 //向列表框中输出
return;
//如果为列表选择数据则不能添加
MessageBox("不能添加此类数据!"); }
//添加记录按钮
//变量提取数据 //添加数据必须完整
if(m_NAME==""||m_NUMBER==""||m_CLASS==""||m_EMAIL==""||m_PHONE==""){
MessageBox("信息输入不完整,请重新输入!"); return;
}
StudentInfo Stu;
~ ~
~
~ ~
Stu.Profe = m_CLASS;
//创建临时变量,存储学生信息
list.AddStu(Stu); m_NUM=list.StuNum; m_NUMBER = ""; ~ ~
~
~ ~
//将学生信息添加到数据结构中
m_PHONE = ""; //清空输入输出框
MessageBox("添加记录成功!"); UpdateData(FALSE);
//更新显示数据
void CStudentDlg::OnButton3() {
if(m_NUM==0){ }
return;
//修改记录按钮函数
//如果学生数量为0则不能修改
MessageBox("没有数据可供修改!");
POSITION pos=m_LIST.GetFirstSelectedItemPosition(); if( pos==NULL){ }
int n=m_LIST.GetNextSelectedItem(pos);
11
return;
//如果无选择记录则不能修改
MessageBox("请选择一条记录:");
}
UpdateData(TRUE);
//提取变量值 //不能修改为空
if(m_NAME==""||m_NUMBER==""||m_CLASS==""||m_EMAIL==""||m_PHONE==""){
MessageBox("信息不能修改为空!!"); m_NUMBER = ""; ~ ~
~
~
m_PHONE = ""; UpdateData(FALSE); }
//首先在列表框中删除需要修改信息 //随后插入新信息
return;
m_LIST.DeleteItem(n); ~ ~
~
~ ~
~
m_LIST.InsertItem(n,m_NUMBER);
~ ~
m_LIST.SetItemText(n,4,m_PHONE); StudentInfo SS; SS.Email = m_EMAIL; ......... SS.Phone = m_PHONE; list.ChangeStu(n,SS); MessageBox("信息修改成功!"); m_NUMBER = ""; ~ ~
~
~
m_PHONE = ""; UpdateData(FALSE);
//存储到数据中
void CStudentDlg::OnClickList2(NMHDR* pNMHDR, LRESULT* pResult) { }
void CStudentDlg::OnButton2() {
POSITION pos=m_LIST.GetFirstSelectedItemPosition(); if(pos==NULL){
//如果没有选中则不能删除
if(m_NUM==0) {MessageBox("没有数据可供删除!");}
12
//删除记录按钮函数
POSITION pos=m_LIST.GetFirstSelectedItemPosition(); //列表框显示函数 int n=m_LIST.GetNextSelectedItem(pos); char chTemp[20]={'\0'};
m_LIST.GetItemText(n,0,chTemp,sizeof(chTemp));
m_NUMBER=chTemp; ~ ~
~
~ ~
//显示到输入输出框
m_LIST.GetItemText(n,4,chTemp,sizeof(chTemp));
m_PHONE=chTemp; UpdateData(FALSE); *pResult = 0;
else MessageBox("请选择需要删除数据!");
}
}
return;
int n=m_LIST.GetNextSelectedItem(pos); m_LIST.DeleteItem(n); list.DelStu(n); m_NUM=list.StuNum; m_NUMBER = ""; ~ ~
~
~
m_PHONE = "";
MessageBox("删除记录成功!"); UpdateData(FALSE);
//删除列表框中数据 //删除数据结构中数据
void CStudentDlg::OnButton4() { }
if(m_NUM==0){ }
list.SaveFile();
//存储文件按钮函数
MessageBox("没有数据可供存储!"); return;
//调用存储函数存数数据结构中数据
MessageBox("文件生成成功!");
void CStudentDlg::OnButton5() { }
void CStudentDlg::OnButton6() {
m_LIST.DeleteAllItems();
13
m_LIST.DeleteAllItems(); if(!list.LoadFile()){ } else }
m_NUM = list.StuNum; UpdateData(FALSE);
MessageBox("文件读取成功!"); MessageBox("没有文件可供读取!");
//读取文件按钮函数
//清空列表框
for(int num=0,i=1;num
m_LIST.InsertItem(num,list.Slist[i]->Number); ~ ~
~
~ ~
~
~ ~~ ~ ~
~ ~.
m_LIST.SetItemText(num,4,list.Slist[i]->Phone);
//删除按钮函数
//清空列表框
}
for(int i=0;i
~
~
m_PHONE = ""; UpdateData(FALSE);
//删除全部数据
14
面向对象程序设计 课程设计报告
设计题目: 同学通讯录管理程序 学 院:
信息工程学院
专 业: 计算机科学与技术(交通) 学 号: [1**********]8 姓 名: 王 沛 林 指导教师:
2015 年 1 月4 日
目录
一.设计目的和内容
1.1设计目的………….………………………………………………………...………...1 1.2设计内容 ................................................................................................................................. 1
二.基本功能描述
2.1.输入输出框 ............................................................................................................................. 2 2.2.列表框 ...................................................................................................................................... 2 2.3.按钮 .......................................................................................................................................... 2
三.设计思路
3.1.窗口的设计 ............................................................................................................................. 3 3.2.数据的结构设计 .................................................................................................................... 3
四.软件设计
4.1设计步骤 ................................................................................................................................. 4 4.2.关键步骤的实现
4.2.1 PHONEST类成员函数中: .................................................................................. 5 CStudentDlg中对各控件函数实现 ................................................................................ 6
五.结论与心得体会
5.1.结论 .......................................................................................................................................... 7 5.2体会 .......................................................................................................................................... 7
六.参考文献
七.附录
7.1调试报告及运行结果 ........................................................................................................... 8 7.2.关键源代码
PHONEST类成员函数中 .............................................................................................. 9 CStudentDlg控件函数(list为PHONELIST类对象,全局变量) .............................. 11
一、设计目的和内容
1.1 设计目的
同学通讯录管理程序是为了更好的管理学生信息而开发的数据管理软件。它对于学生与学 生之间联系是不可缺少的重要部分,它的内容对于同学与同学,同学与老师之间的联系提 供了一个好的工具。
目前各个高校的基本情况是:同学与同学,老师与同学联系都是通过电话联系。但是,所以,同学通讯录管理程序为用户提供充足的信息和快捷的查询手段,实现学生基本通常 这些数据与其他人的信息混合在一起不易进行查找,修改,增加等功能。
信息 的录入,删除,查询,修改,存到文件等几方面的功能,这样能对同学之间的信息进行更 好的管理,使老师能更好的管理学生的信息,对学生信息出现的变动也能及时进行修改。
1.2 设计内容
1) 在设计同学通讯录管理程序时,我采用对话框形式来进行处理,因为对话框窗口操作简
单,更重要的是能更好的向使用者表达程序所要表达的信息。
2) 在主界面进行设计时,我分别设计了学号,姓名,职业,邮箱,电话等五个输入输出框,
分别对学生的信息进行输入与输出。其次,设计了一个列表框使学生信息能更好的向用户展示,同时也更加方便了以后的操作。
3) 最后,分别设计了添加记录,全部删除,删除记录,修改记录,生成文件,读取文件和
退出七个按钮,分别实现各自所对应的功能,最后用一个只读输出框对学生数量进行显示。
二、基本功能描述
2.1 输入输出框
学号,姓名,职业,邮箱,电话静态文本后的输入输出框实现了对学生信息数据的
输入输出,当前学生数量输入输出框后实现了对当前存储学生数量的显示。
2.2 列表框
实现了对学生各个信息的显示,同时通过点击列表中的某一项来实现查看,修改,等功能。
2.3 按钮
1) 添加记录:添加记录按钮主要通过在输入输出框中输入信息,然后通过点击添
加记录按钮,添加到列表框中。
2) 全部删除:删除全部学生信息,清空所有记录,但不影响文件中的数据。 3) 删除记录:通过选中列表框中某一项,点击删除记录按钮删除所对应的学生数
据,但不影响文件中的数据。
4) 修改记录:通过选中列表框中某一项,在对话框中修改所对应的学生某项数据,
然后点击修改记录按钮,修改列表框中所对应的数据信息,但不影 响文件中的数据。
5) 生成文件:将列表框中的信息全部保存到,目录下的“学生信息.TXT”文件中,
只有生成文件按钮才会通过程序影响文件中的内容。
6) 读取文件:通过读取文件按钮,将目录下的“学生信息.TXT”中的数据全部提
取到列表框中,随后,能继续进行后续操作。
三、设计思路
3.1 窗口的设计
新建对话框程序,在对话框程序中添加各个控件,实现各个功能。
3.1.1数据的结构设计
1) 首先创建一般StudentInfo类,其中有共有CString公有数据成员Email,Name,Number,Phone,Profe ,分别实现对学生邮箱,姓名,学号,电话,系别的存储。
class StudentInfo { public:
StudentInfo();
virtual ~StudentInfo();
public: };
CString Name; CString Profe; CString Email; CString Number; CString Phone;
//姓名 //职业 //邮箱 //学号 //电话
2) 再次创建PHONELIST类,
class PHONELIST
{ public:
bool LoadFile(); bool SaveFile();
//读取文件 //存储文件
};
bool ChangeStu(int n,StudentInfo &S1); bool DelStu(int n); PHONELIST(); int StuNum;
bool AddStu(StudentInfo &S1); virtual ~PHONELIST(); StudentInfo* Slist[100];
//修改信息 //删除信息 //增加信息
//学生数量 //数组指针
在PHONELIST类中,StudentInfo* Slist[100]为指针数组,每一个值为指向
一个学生对象的指针,int StuNum;表示当前存储多少学生对象,其他函数则完成相应于按钮所对应的功能。在对按钮操作时,调用PHONELIST相应函数完成数据的存储工作。
3) 为对话框创建创建CStudentDlg类,并设置各个变量与对话框各个窗口相关联。 关联情况如下:
m_NUMBER
m-N
m-C
m_L
m-Pm_PHONE
通过编写点击各个按钮对应函数来完成各个按钮的功能:
添加数据:void CStudentDlg::OnButton1(); 全部删除:void CStudentDlg::OnButton6(); 删除记录:void CStudentDlg::OnButton2(); 修改记录:void CStudentDlg::OnButton3(); 生成文件:void CStudentDlg::OnButton4(); 读取文件:void CStudentDlg::OnButton5();
四、软件设计
4.1设计步骤
1) 打开VC++6.0,新建MFC AppWizard[EXE]工程,在对话框中添加各个控件,完成程序窗口外观设计。
2) 在MFC ClassWizard中建立对话框类,并命名为CStudent; 3) 在MFC ClassWizard中建立一般类,并命名为PHONELIST; 4) 在MFC ClassWizard中建立对话框类,并命名为StudentInfo; 5) 为PHONELIST,StudentInfo类分别编写成员函数。
6) 在MFC ClassWizard为CStudentDlg中添加各个控件,并通过函数编写,实现具体的功能。
7) 在CStudentDlg类编写时,创建PHONELIST全局变量,并命名为LIST,通过LIST来调用PHONELIST中的各个函数。 8) 调试与运行。
4.2关键步骤的实现
4.2.1 PHONEST类成员函数中:
1) 在PHONELIST类构造函数中对StuNum赋初值为‘0’,使刚开始时的学生数量为0; 2) 在增加成员,删除成员函数中注意对StuNum值的修改
bool PHONELIST::AddStu(StudentInfo &S1){
~~~~ StuNum++; ~~}; ~~~~ StuNum--; ~~};
bool PHONELIST::DelStu(StudentInfo &S1) {
3) 在删除成员函数中,需要注意对指针数组指针的移动,并且同时需要,对所删除的对
象内存空间进行释放,防止内存泄露。
bool PHONELIST::DelStu(int n){
n++;
if(Slist[StuNum]==NULL&&n
//当删除为最后一个成员时
delete Slist[StuNum]; StuNum--; return TRUE; }
//当删除为中间成员时
delete Slist[n];
for( ; n
4) 在增加成员时,注意对指针申请内存,使其指向一个确定的对象。同时为各个成员赋
值。
bool PHONELIST::AddStu(StudentInfo &S1) { }
StuNum++;
Slist[StuNum]=new StudentInfo; Slist[StuNum]->Email = S1.Email; Slist[StuNum]->Name = S1.Name; Slist[StuNum]->Number = S1.Number; Slist[StuNum]->Phone = S1.Phone; Slist[StuNum]->Profe = S1.Profe; return TRUE;
//申请内存 //为各个成员赋值
if(Slist[StuNum]==NULL) return FALSE;
5) 读取文件时,在用提取符(>>)读取字符串时,应该同时创建Slist[i]进行接收,对所
读取的文件信息进行存储,并且判断读取停止,并且对Slist[i]进行释放。
bool PHONELIST::LoadFile(){ }
ifstream file("学生信息文件.txt"); if(file==NULL) return FALSE; string a,b,c,d,e;
for(int i = 1;i==1||a.length()!=0;i++){//当第一个字符串读取为空时停 Slist[i]= new StudentInfo(); }
file>>a; Slist[i]->Number = a.data(); file>>b; Slist[i]->Name = b.data(); file>>c; Slist[i]->Profe = c.data(); file>>d; Slist[i]->Email = d.data(); file>>e; Slist[i]->Phone = e.data();
if(a.length()!=0){ AddStu(*Slist[i]);StuNum=i;}
//对第一个读取字符串进行判断,防止为空
delete Slist[i];
return TRUE;
4.2.2 CStudentDlg中对各控件函数实现
1) 在CButton1(增加记录)中注意对错误输入判断,和对在列表框中显示,最后,在List对象中添加. 注意m_LIST的函数为列表框显示数据。
void CStudentDlg::OnButton1(){
UpdateData();
//读取数据到变量
if(m_NAME==""||m_NUMBER==""||m_CLASS==""
MessageBox("信息输入不完整,请重新输入!"); return;}
||m_EMAIL==""||m_PHONE==” ”){
}
POSITION pos=m_LIST.GetFirstSelectedItemPosition(); if( pos!=NULL){
MessageBox("不能添加此类数据!"); return;}
//错误判断
int num=m_LIST.GetItemCount(); m_LIST.InsertItem(num,m_NUMBER); m_LIST.SetItemText(num,1,m_NAME); m_LIST.SetItemText(num,2,m_CLASS); m_LIST.SetItemText(num,3,m_EMAIL); m_LIST.SetItemText(num,4,m_PHONE); ~ ~ ~ ~
~ ~
~ ~ ~ ~
~ ~
~ ~
//添加到list对象用于存储 //更新列表框显示
~ ~
list.AddStu(Stu); UpdateData(FALSE);
//显示新增加成员到列表框
2) 当函数完成功能时,需要对输入输出框进行清空,实现函数为: { m_NUMBER = "";
m_NAME = ""; m_CLASS = ""; m_EMAIL = ""; m_PHONE = ""; UpdateData(FALSE); }
3) 当点击列表框中某一项时,需要在输入输出框中显示;
void CStudentDlg::OnClickList2(NMHDR* pNMHDR, LRESULT* pResult) { }
POSITION pos=m_LIST.GetFirstSelectedItemPosition(); int n=m_LIST.GetNextSelectedItem(pos); char chTemp[20]={'\0'};
m_LIST.GetItemText(n,0,chTemp,sizeof(chTemp));
m_NUMBER=chTemp; m_NAME=chTemp; m_CLASS=chTemp; m_EMAIL=chTemp; m_PHONE=chTemp;
m_LIST.GetItemText(n,1,chTemp,sizeof(chTemp)); m_LIST.GetItemText(n,2,chTemp,sizeof(chTemp)); m_LIST.GetItemText(n,3,chTemp,sizeof(chTemp)); m_LIST.GetItemText(n,4,chTemp,sizeof(chTemp)); UpdateData(FALSE); *pResult = 0;
五、结论与心得体会
5.1结论
经过一周的编写,我选择的课题同学通讯录管理程序功能基本完成。其功能基本符合用户要求,能够对同学、的基本信息进行查询、修改、添加、删除,存储文件及读取文件功能。对运行过程中的一些特殊情况能够进行处理,对于错误也能进行简单的处理。
5.2体会
在为期一周的课程设计过程中总结起来,主要有以下几点体会:
1) 通过此课程设计,运用MFC知识,使我们学到了以前没有学过的很多知识,巩
固了C++课程的基本知识,并综合运用MFC所学知识,使用VC++ 6.0中的MFC编程,设计对话框,添加各种按钮,编辑框控件,编辑各个控件函数,让其实现具体的功能。
2) 必须牢固掌握基础知识。只有拥有扎实的C++基础,我们才能灵活运用我们所需
要的知识和技术对MFC类库进行灵活的操作。通过对MFC编程的学习,知道了如何创建对话框,单文档。知道利用MFC对程序进行操作,对我们所需要的信息进行查询,添加、修改和删除等。
3) 在程序设计过程中必须培养严谨的科学态度。在做需求分析的时候我们深深的体
会到严谨的科学态度的重要性,只有认真分析、综合考虑才能使系统尽可能完善,满足用户的需求。我想这不仅是对于程序设计,做任何事都应如此。
4) 必须积极查阅资料。在课程设计中我遇到了很多问题,在面对问题时要积极通过
网络,书本查找解决方法与同学进行讨论那样才能化难为易更早的成功编写出程序。
六、参考文献
[1] 郑莉 董渊 编著《C++语言程序设计》清华大学出版社 [2] 孙鑫 MFC编程教程视频
[3] 张荣梅 编著《Visual C++ 程序设计案例教程》 北京大学出版社
七、附录
7.1调试报告及运行结果(关键步骤截图)
7.1.1:添加数据:
7.1.2删除数据
:
7.1.3修改数据
:
7.1.4生成文件
:
7.2关键源代码(“~ ~ ~”为类似重复代码,此处不再累赘)
7.2.1 PHONEST类成员函数
bool PHONELIST::AddStu(StudentInfo &S1) //PHONELIST类添加学生函数 { }
bool PHONELIST::DelStu(int n){ }
9
n++;
StuNum++;
//学生数量+1 //为指针申请
//判断申请内存是否成功 //为各个成员变量赋予值
Slist[StuNum]=new StudentInfo; Slist[StuNum]->Email = S1.Email; ~ ~
~
~ ~
~
~ ~
Slist[StuNum]->Profe = S1.Profe; return TRUE;
if(Slist[StuNum]==NULL) return FALSE;
//PHONELIST类删除学生函数
//下标移动
//判断是否需要删除
//当删除信息号在学生中 //删除第n个学生信息
if(Slist[StuNum]==NULL&&n
delete Slist[StuNum];
delete Slist[n]; Slist[n+1]=NULL;
for( ; n
//当删除信息在最后时
StuNum--;
return TRUE;
bool PHONELIST::ChangeStu(int n,StudentInfo &S1){//PHONELIST类添修改学生函数 n++;
Slist[n]->Name = S1.Name; ~ ~
return TRUE; }
bool PHONELIST::SaveFile(){ if(file==NULL) return FALSE; string str;
for(int i=1;i
file.close(); return TRUE; }
bool PHONELIST::LoadFile(){ }
return TRUE; }
//PHONELIST类读取学生信息函数
ifstream file("学生信息文件.txt");
if(file==NULL) return FALSE;
for(int i = 1;i==1||a.length()!=0;i++){ }
Slist[i]= new StudentInfo(); file>>a;
Slist[i]->Number = a.data(); ~ ~
~
~ ~
~
~ ~
Slist[i]->Phone = e.data(); AddStu(*Slist[i]); StuNum=i;
//向流中提取字符串
string a,b,c,d,e;
str = LPCSTR(Slist[i]->Number);
file
~
~ ~
~
~ ~
//并且控制每一次插入位宽
str = LPCSTR(Slist[i]->Phone);
~
~ ~
~
~ ~
//逐个修改成员函数值
Slist[n]->Profe = S1.Profe;
//PHONELIST类存储学生函数
ofstream file("学生信息文件.txt");
file
if(a.length()!=0){
10
7.2.2 CStudentDlg控件函数(list为PHONELIST类对象,全局变量)
void CStudentDlg::OnButton1(){
UpdateData(); }
POSITION pos=m_LIST.GetFirstSelectedItemPosition(); if( pos!=NULL){ }
int num=m_LIST.GetItemCount(); m_LIST.InsertItem(num,m_NUMBER); ~ ~
~
~ ~
~
~ ~
m_LIST.SetItemText(num,4,m_PHONE);
//得到当前选定行号 //向列表框中输出
return;
//如果为列表选择数据则不能添加
MessageBox("不能添加此类数据!"); }
//添加记录按钮
//变量提取数据 //添加数据必须完整
if(m_NAME==""||m_NUMBER==""||m_CLASS==""||m_EMAIL==""||m_PHONE==""){
MessageBox("信息输入不完整,请重新输入!"); return;
}
StudentInfo Stu;
~ ~
~
~ ~
Stu.Profe = m_CLASS;
//创建临时变量,存储学生信息
list.AddStu(Stu); m_NUM=list.StuNum; m_NUMBER = ""; ~ ~
~
~ ~
//将学生信息添加到数据结构中
m_PHONE = ""; //清空输入输出框
MessageBox("添加记录成功!"); UpdateData(FALSE);
//更新显示数据
void CStudentDlg::OnButton3() {
if(m_NUM==0){ }
return;
//修改记录按钮函数
//如果学生数量为0则不能修改
MessageBox("没有数据可供修改!");
POSITION pos=m_LIST.GetFirstSelectedItemPosition(); if( pos==NULL){ }
int n=m_LIST.GetNextSelectedItem(pos);
11
return;
//如果无选择记录则不能修改
MessageBox("请选择一条记录:");
}
UpdateData(TRUE);
//提取变量值 //不能修改为空
if(m_NAME==""||m_NUMBER==""||m_CLASS==""||m_EMAIL==""||m_PHONE==""){
MessageBox("信息不能修改为空!!"); m_NUMBER = ""; ~ ~
~
~
m_PHONE = ""; UpdateData(FALSE); }
//首先在列表框中删除需要修改信息 //随后插入新信息
return;
m_LIST.DeleteItem(n); ~ ~
~
~ ~
~
m_LIST.InsertItem(n,m_NUMBER);
~ ~
m_LIST.SetItemText(n,4,m_PHONE); StudentInfo SS; SS.Email = m_EMAIL; ......... SS.Phone = m_PHONE; list.ChangeStu(n,SS); MessageBox("信息修改成功!"); m_NUMBER = ""; ~ ~
~
~
m_PHONE = ""; UpdateData(FALSE);
//存储到数据中
void CStudentDlg::OnClickList2(NMHDR* pNMHDR, LRESULT* pResult) { }
void CStudentDlg::OnButton2() {
POSITION pos=m_LIST.GetFirstSelectedItemPosition(); if(pos==NULL){
//如果没有选中则不能删除
if(m_NUM==0) {MessageBox("没有数据可供删除!");}
12
//删除记录按钮函数
POSITION pos=m_LIST.GetFirstSelectedItemPosition(); //列表框显示函数 int n=m_LIST.GetNextSelectedItem(pos); char chTemp[20]={'\0'};
m_LIST.GetItemText(n,0,chTemp,sizeof(chTemp));
m_NUMBER=chTemp; ~ ~
~
~ ~
//显示到输入输出框
m_LIST.GetItemText(n,4,chTemp,sizeof(chTemp));
m_PHONE=chTemp; UpdateData(FALSE); *pResult = 0;
else MessageBox("请选择需要删除数据!");
}
}
return;
int n=m_LIST.GetNextSelectedItem(pos); m_LIST.DeleteItem(n); list.DelStu(n); m_NUM=list.StuNum; m_NUMBER = ""; ~ ~
~
~
m_PHONE = "";
MessageBox("删除记录成功!"); UpdateData(FALSE);
//删除列表框中数据 //删除数据结构中数据
void CStudentDlg::OnButton4() { }
if(m_NUM==0){ }
list.SaveFile();
//存储文件按钮函数
MessageBox("没有数据可供存储!"); return;
//调用存储函数存数数据结构中数据
MessageBox("文件生成成功!");
void CStudentDlg::OnButton5() { }
void CStudentDlg::OnButton6() {
m_LIST.DeleteAllItems();
13
m_LIST.DeleteAllItems(); if(!list.LoadFile()){ } else }
m_NUM = list.StuNum; UpdateData(FALSE);
MessageBox("文件读取成功!"); MessageBox("没有文件可供读取!");
//读取文件按钮函数
//清空列表框
for(int num=0,i=1;num
m_LIST.InsertItem(num,list.Slist[i]->Number); ~ ~
~
~ ~
~
~ ~~ ~ ~
~ ~.
m_LIST.SetItemText(num,4,list.Slist[i]->Phone);
//删除按钮函数
//清空列表框
}
for(int i=0;i
~
~
m_PHONE = ""; UpdateData(FALSE);
//删除全部数据
14