面向对象程序设计课程设计——MFC实现同学通讯录管理系统

先上效果图;

面向对象程序设计课程设计——MFC实现同学通讯录管理系统_第1张图片

1.设计目的

同学通讯录管理程序是为了更好地管理学生信息而开发的数据管理软件。如今,同学与同学、老师与同学联系都是通过电话联系。但是,通常这些数据与其他人的信息混合在一起,同学信息并不方便被整理。
所以,同学通讯录管理程序为用户提供充足的信息和快捷的查询手段,实现学生基本信息的录入,删除,查询,修改,存到文件等几方面的功能,这样能对同学之间的信息进行更好的管理,使老师能更好地管理学生信息,对学生信息出现的变动也能及时进行修改。
与此同时,对所学面向对象的程序设计中所学知识加以利用和巩固:
1) 学习Visual C++的MFC开发程序的步骤。 
2) 综合运用所学的类、继承和多态的知识。
3) 进一步掌握程序的调试方法。

2. 设计内容

1 利用MFC的向导,创建基于对话框的应用程序,添加按钮、编辑框等控件;
2 设计通讯录的数据结构(如:以数组或者动态链表)和相应的类;
3 完成对通讯录中记录的增加、修改、删除和显示。
4 将通讯录存入文件。能够打开并显示其中所存的同学信息,并可以进行后续的操作。
在设计同学通讯录管理程序时,我们小组采用对话框形式来进行处理,因为对话框窗口操作简单,更重要的是能更好的向使用者表达程序所要表达的信息。
在主界面进行设计时,我们小组分别设计了学号,姓名,系别,邮箱,电话等五个输入输出框,分别对学生的信息进行输入与输出。其次,设计了一个列表框使学生信息能更好的向用户展示,同时也更加方便了以后的操作。
最后,分别设计了添加记录、查询记录、删除记录、修改记录、保存信息、读取信息、清空所有数据和退出八个按钮,分别实现各自所对应的功能。

3.基本功能描述

3.1. 编辑框

**学号,姓名,系别,邮箱,电话静态文本后的输入输出框实现了对学生信息数据的输入输出。

3.2. 列表框

实现了对学生各个信息的显示,同时通过点击列表中的某一项来实现查看、修改等功能。

3.3. 按钮

1) 添加记录:用户在输入输出框中输入信息,然后通过点击添加记录按钮,添加到列表框中。
2) 查询记录:在除了系别这一信息外任意输入某一项或某几项信息后,点击查询记录按钮,程序将以姓名、电话、邮箱、学号的优先级递减顺序来查找符合条件的学生并将查询到的学生信息显示在输入输出框中。
3) 删除记录:通过选中列表框中某一项,点击删除记录按钮删除所对应的学生数据,但不影响文件中的数据。
4) 修改记录:通过选中列表框中某一项,在对话框中修改所对应的学生某项数据,然后点击修改记录按钮,修改列表框中所对应的数据信息,但不影响文件中的数据。
5) 保存信息:将列表框中的信息全部保存到,目录下的“学生信息.txt”文件中,只有生成文件按钮才会通过程序影响文件中的内容。
6) 读取信息:首先将列表中的已经显示的信息全部清空,再将储存在文件中的信息读取中列表中。
7) 清空所有数据:删除全部学生信息,清空所有记录,同时也将文件中的信息清空。
8) 退出:点击退出后弹出消息框“是否确认退出?”,若点击确认则退出程序,点击取消则返回当前程序
**

4.设计思路

4.1. 窗口的设计

新建对话框程序,在对话框程序中添加各个控件,实现各个功能。

  1. 首先创建一般Student类,其中有共有CString公有数据成员name,number,phone,email,yuanxi,分别实现对学生邮箱,姓名,学号,电话,系别的存储。
    class Student{
    public:
    CString name;
    CString number;
    CString phone;
    CString email;
    CString yuanxi;
    };
  2. 再声明自定义类型Student的向量stu(初始容量为零)和用以确定列表控件行数的全局变量n(初始值为-1)。
  3. 为对话框创建CClassAddresslistDlg类,并设置各个变量与对话框各个窗口相关联。
    通过编写点击各个按钮对应函数来完成各个按钮的功能:
    添加记录:void CClassAddresslistDlg::OnBUTTONincrease();
    查询记录:void CClassAddresslistDlg::OnBUTTONSearch();
    删除记录:void CClassAddresslistDlg::OnBUTTONdelete();
    修改记录:void CClassAddresslistDlg::OnBUTTONchange();
    保存信息:void CClassAddresslistDlg::OnBUTTONpreserve();
    读取信息:void CClassAddresslistDlg::OnBUTTONduqu();
    清空所有数据:void CClassAddresslistDlg::OnBUTTONqingkong();
    退出:void CClassAddresslistDlg::OnButtontuichu();

5.软件设计

5.1. 设计步骤

1) 打开VC++6.0,新建MFC AppWizard[EXE]工程,在对话框中添加各个控件,完成程序窗口外观设计
2) 在MFC ClassWizard中建立对话框类,并命名为CClassAddresslistDlg
3) 在MFC ClassWizard中建立一般类,并命名为Student
4) 在CStudentDlg类编写时,创建全局变量int n = -1(代表行数),通过n的值来方便为列表和按钮建立联系
5) 在MFC ClassWizard为CStudentDlg中添加各个控件,并通过函数编写,实现具体的功能
6) 调试与运行

5.2界面设计

界面由选项框区、通讯录信息区以及列表控件区三个区域组成。其中,通讯录信息区由有五个静态控件用来显示“学号”“姓名”“系别”“邮箱”“电话”字样,与各个静态控件相对应的是五个编辑框,实现了对学生信息的输入输出。列表框区用来显示当前已经存储的学生信息,选项框区有八个按钮,分别对应各自的功能。

6.关键功能的实现

*添加纪录:
首先用户需要在五个编辑框中分别输入信息。点击“添加纪录”按钮后,对应的函数首先声明将编辑框控件中的内容同步到变量中,接着声明了一个变量int flag = 1,用来选择性地执行接下来的if语句。接下来判断当前状态下用户是否输入了信息以及用户输入的信息是否已经在列表中,如果输入了合理的信息则执行接下来的if语句进行查找,反之则改变flag的值以避开用于加入新元素的if语句。随后将信息栏当中的关联变量置零,进行下一次操作时信息栏当中不再显示上次学生的信息。
保存信息:
将保存信息按钮与Dlg类相关联,用户点击保存信息后,利用IO流对数据进行输入和输入,采用ofstream新建一个对象out来打开一个文本文档,采取ios::trunc对文本文件中已有数据进行覆盖,并将变量中的信息利用out来储存到文本文件当中去,每输入一个学生的信息进行换行操作。由于CString是MFC中,而ofstream是ATL中,ofstream能写入的需要char ,因此需要进行类型的转化,来实现信息的保存。
读取信息:
将读取信息按钮与Dlg类相关联,用户点击读取信息后利用IO流对数据进行输入和输入,采用ifstream新建一个对象fin来打开一个文本文档,先利用list控件中的函数将列表清空,
同样需要进行类型的转化,再利用fin将文档中的内容输出到列表中,并与变量的数据相关联,将其同步到变量当中去,来实现信息的读取。
列表控件:
单击列表中的某一行,再左侧信息栏中对应出现相应的学生信息。将列表栏与Dlg类相关联,获得相应的学生信息后将其同步到信息栏的关联变量当中,实现列表栏与信息栏的同步。

7.核心代码实现

7.1列表控件与编辑框控件的关联:

void CClassAddresslistDlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)   //使选中哪一行的信息编辑框出现哪一行的信息
{
	POSITION pos=m_list.GetFirstSelectedItemPosition(); //获得选中元素的位置
	n=m_list.GetNextSelectedItem(pos); //获得选中元素的索引
	CString x;
	x=m_list.GetItemText(n,0);
	m_Number=x;
	x=m_list.GetItemText(n,1);
	m_Name=x;
	x=m_list.GetItemText(n,2);
	m_Xibie=x;
	x=m_list.GetItemText(n,3);
	m_Email=x;
	x=m_list.GetItemText(n,4);
	m_Phone=x;
	UpdateData(false);
	*pResult = 0;	
}

7.2 添加纪录:

void CClassAddresslistDlg::OnBUTTONincrease() 
{
	int flag = 0;//以便于选择性执行if语句
	UpdateData(true);
	if(m_Name==""||m_Number==""||m_Xibie==""||
		m_Phone==""||m_Email=="")
	{
		flag = 1;
		MessageBox("输入信息不完善,请重新输入!");
	}
    if (flag==0)
	    for (int i = 0;i < stu.size();i++)
	{
		if ( stu[i].name == m_Name&&stu[i].phone == m_Phone&&stu[i].email == m_Email&&stu[i].number == m_Number&&stu[i].yuanxi == m_Xibie)		
		{   
			flag = 1;
			MessageBox("该学生信息已经添加!");
			break;
		}
	}
		if (flag==0)
	{
		int n=m_list.GetItemCount();
			m_list.InsertItem(n,"");
			m_list.SetItemText(n,0,m_Number);
			m_list.SetItemText(n,1,m_Name);
			m_list.SetItemText(n,2,m_Xibie);
			m_list.SetItemText(n,3,m_Email);
			m_list.SetItemText(n,4,m_Phone);
        stu.reserve(stu.size()+1);//增加容量以防止溢出
		Student s1;
		s1.name = m_Name;
		s1.number = m_Number;
		s1.yuanxi = m_Xibie;
		s1.email = m_Email;
		s1.phone = m_Phone;
        stu.push_back(s1);//往向量末尾加新信息
			MessageBox("添加成功!");
	m_Name="";
	m_Number="";
	m_Xibie="";
	m_Phone="";
	m_Email="";  //清空编辑框
	UpdateData(false);
	}	
}


7.3 保存信息:

void CClassAddresslistDlg::OnBUTTONpreserve() 
{
	ofstream fout("ZHM.txt",ios::trunc);

	int n=m_list.GetItemCount();
	for(int i=0;i<n;++i){
		string str = CString(stu[i].number);   //由于CString是MFC中,而ofstream是ATL中,ofstream能写入的需要char *
		string str1 = CString(stu[i].name); 
		string str2 = CString(stu[i].yuanxi); 
		string str3 = CString(stu[i].email); 
		string str4 = CString(stu[i].phone); 
		
		fout<<str.c_str()<<" "
			<<str1.c_str()<<" "
			<<str2.c_str()<<" "
			<<str3.c_str()<<" "
			<<str4.c_str()<<endl;
		if (fout.fail())  
			break;
	}
	fout.close();
	MessageBox("保存成功!");
}

7.4 读取信息:

void CClassAddresslistDlg::OnBUTTONduqu() 
{
	m_list.DeleteAllItems(); // 全部清空 
	ifstream fin("ZHM.txt",ios_base::in); 
	string a,b,c,d,e;
	fin>>a>>b>>c>>d>>e;
	for(int i=0;!fin.fail();++i){
		int n=m_list.GetItemCount();
		m_list.InsertItem(n,a.data());
		m_list.SetItemText(n,1,b.data());
		m_list.SetItemText(n,2,c.data());
		m_list.SetItemText(n,3,d.data());
		m_list.SetItemText(n,4,e.data());
		 MessageBox("读取成功!");
		Student s1;
		s1.number=a.data();
		s1.name=b.data();
		s1.yuanxi=c.data();
		s1.email=d.data();
		s1.phone=e.data(); 
		stu.reserve(stu.size()+1);//增加容量以防止溢出
	stu.push_back(s1);
	fin>>a>>b>>c>>d>>e;
	}
	fin.close();
}

完整代码可添加QQ获取

1173953942 备注通讯录即可

有chang

你可能感兴趣的:(mfc,c++,数据结构)