C++基于MFC的通讯录系统(链表)

这篇具有很好参考价值的文章主要介绍了C++基于MFC的通讯录系统(链表)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

实验目的

  1. 深入理解面向对象技术的封装性、继承性和多态性,掌握面向对象程序设计方法。
  2. 综合应用C++基础知识实现小型应用程序开发。
  3. 掌握使用C++流类库实现数据文件访问的操作方法。
  4. 熟悉基于对话框的MFC应用程序创建过程,掌握ClassWizard工具和常

实验环境

windows 11, visual studio 2022

实验内容与要求

设计一个小型通讯录管理程序,实现通讯录文件的新建、保存、以及通讯录的增、删、改、查功能。要求系统用户界面良好,功能完善,性能稳定。

通讯录功能分析

用户界面分为右半部分的用户输入区和左半部分的通讯录打印区。
1.添加联系人信息:用户在左边输入联系人的详细信息并点击添加,如果右边的所有信息输入框有空的话会出现联系人信息不能为空的警告。用户成功输入信息后点击添加按钮该联系人的信息就会被添加到链表内,并出现联系人信息添加成功的弹窗。功能执行完毕后系统会自动清空用户输入的信息方便继续使用。
2.删除联系人信息:用户输入联系人的索引值后,会出现联系人信息删除成功。若当前链表内没有结点的索引值与用户的输入相同就会出现未找到该信息的警告。功能执行完毕后系统会自动清空用户输入的信息方便继续使用。
3.修改联系人信息:将该联系人的正确信息输入在对应的框内点击修改按钮,系统会根据联系人的索引值从链表的头结点开始挨个匹配如果有链表内有该联系人的信息系统会进行修改并出现联系人信息修改成功的弹窗。如果直到链表的结尾依然没有就会弹出未找到该信息的警告。功能执行完毕后系统会自动清空用户输入的信息方便继续使用。
4.查找联系人信息:用户输入该联系人的索引值后点击查找,系统会在链表内根据索引值进行查找。如果找到该联系人她的详细信息会出现在对应的框内,如果需要进行下一步的操作用户需要点击清空按钮以清空框内的信息。如果没有该联系人信息会有未找到该信息的警告。
5.保存信息:将链表的信息保存进入文件
6.打印信息:将文件内的信息读入链表后打印在左侧的通讯录内。

代码实现

结点类

class StuNode			//结点类
{
	friend class AddressBook;
private:
	int index;             //人员索引值
	CString name;			//人员姓名
	CString num;			//人员学号/工号
	CString phone;			//人员电话号码
	CString qq;				//人员QQ号
public:
	StuNode* next;			//指向下一个结点
	StuNode(int i, CString na, CString nu, CString p, CString q);
	StuNode(StuNode& x);
	StuNode();
	int GetIndex();
	CString GetName();
	CString GetNum();
	CString GetPhone();
	CString GetQQ();
};
int StuNode::GetIndex()
{
	return index;
}
CString StuNode::GetName()
{
	return name;
}
CString StuNode::GetNum()
{
	return num;
}
CString StuNode::GetPhone()
{
	return phone;
}
CString StuNode::GetQQ()
{
	return qq;
}
StuNode::StuNode(int i, CString na, CString nu, CString p, CString q)
{
	index = i;
	name = na;
	num = nu;
	phone = p;
	qq = q;
	next = NULL;
}
StuNode::StuNode(StuNode& x) :index(x.index)
{
	name = x.name;
	num = x.num;
	phone = x.phone;
	qq = x.qq;
	next = x.next;
}
StuNode::StuNode()
{
	memset((LPSTR)(LPCTSTR)name, 0, sizeof(name));
	memset((LPSTR)(LPCTSTR)num, 0, sizeof(num));
	memset((LPSTR)(LPCTSTR)phone, 0, sizeof(phone));
	memset((LPSTR)(LPCTSTR)qq, 0, sizeof(qq));
	index = 0;
	next = NULL;
}

链表类

class AddressBook         //链表类
{
public:
	StuNode* head;       //链表的头结点
	AddressBook()
	{
		head = new StuNode;
	}
	~AddressBook();       //链表的销毁
	void AddStu(StuNode& x);
	void CutStu(int x);
	void ChangeStu(int x, CString na, CString nu, CString p, CString q);
	StuNode* FindStu(int x);
	void ReadStu();
	void SaveStu();
	void Show();
};
AddressBook::~AddressBook()
{
	StuNode* ptr = head->next;
	if (ptr != NULL)
	{
		StuNode* tmp = ptr->next;
		delete ptr;
		ptr = tmp;
	}
}
void AddressBook::AddStu(StuNode& x)
{
	StuNode* cur = new StuNode(x);
	if (head == NULL)
		head->next = cur;
	else
	{
		StuNode* pre = head;
		while (pre->next != NULL)
			pre = pre->next;
		pre->next = cur;
	}
}
void AddressBook::CutStu(int x)
{
	int j = 0;
	StuNode* pre = NULL;
	StuNode* cur = head;
	for (j = 0; cur != NULL; j++)
	{
		if (j == x)
		{
			StuNode* tmp = cur->next;
			delete cur;
			pre->next = tmp;
			break;
		}
		pre = cur;
		cur = cur->next;
	}
	if (j != x)  MessageBox(NULL, _T("未找到该信息!"),_T("警告"), MB_ICONERROR);
}
void AddressBook::ChangeStu(int x, CString na, CString nu, CString p, CString q)
{
	int i;
	StuNode* ptr = head;
	for (i = 0; ptr != NULL; i++)
	{
		if (i == x) {
			ptr->name = na;
			ptr->num = nu;
			ptr->phone = p;
			ptr->qq = q;
			ptr->index = x;
			break;
		}
		ptr = ptr->next;
	}
	if (i != x) MessageBox(NULL, _T("未找到该信息!"),_T("警告"), MB_ICONERROR);
}
StuNode* AddressBook::FindStu(int x)
{
	int i;
	StuNode* ptr = head;
	for (i = 0; ptr != NULL; i++)
	{
		if (i == x)
		{
			return ptr;
		}
		ptr = ptr->next;
	}
	if (i != x) MessageBox(NULL, _T("未找到该信息!"),_T("警告"), MB_ICONERROR);
}
void AddressBook::ReadStu()
{
	StuNode* p = head->next;
	while (p != NULL)
	{
		StuNode* tmp = p->next;
		delete p;
		p = tmp;
	}
	ifstream ifs("Data.txt", ios::in);
	if (!ifs.is_open()) MessageBox(NULL, _T("文件打开失败!"), _T("警告"), MB_ICONERROR);
	while (!ifs.eof())
	{
		StuNode* ptr = new StuNode;
		ifs >> ptr->index >> (LPSTR)(LPCTSTR)ptr->name >> (LPSTR)(LPCTSTR)ptr->num >> (LPSTR)(LPCTSTR)ptr->phone >> 
			(LPSTR)(LPCTSTR)ptr->qq;
		if (head == NULL) MessageBox(NULL, _T("文件为空!"), _T("警告"), MB_ICONERROR);
		AddStu(*ptr);
	}

	ifs.close();
}
void AddressBook::SaveStu()
{
	int size;
	if (head->next == NULL) exit(0);
	StuNode* ptr = head->next;
	ofstream ofs;
	ofs.open("Data.txt", ios::app);
	if (!ofs.is_open()) MessageBox(NULL, _T("文件打开失败!"), _T("警告"), MB_ICONERROR);
	ofs << " 索引值 " << " 姓名 " << " 学号/职工号 " << " 电话 " << " QQ " << std::endl;
	while (ptr != NULL)
	{
		ofs << ptr->index;
		CString str = ptr->name + " " + ptr->num + " " + ptr->phone + " " + ptr->qq + '\n';
		char* p = (LPSTR)(LPCTSTR)str;
		ofs.write(p, strlen(p));
		ptr = ptr->next;
		ofs << std::endl;
	}
	ofs.close();
	MessageBox(NULL, _T("保存成功!"),_T("提示"), MB_OK);
}
void AddressBook::Show()
{
	StuNode* ptr = head->next;
	while (ptr->next != NULL)
	{
		cout << ptr->index << " " << (LPSTR)(LPCTSTR)ptr->name << " " << (LPSTR)(LPCTSTR)ptr->num << " "
			<< (LPSTR)(LPCTSTR)ptr->phone << " " << (LPSTR)(LPCTSTR)ptr->qq << endl;
		ptr = ptr->next;
	}
}

示例编辑框变量及函数

    CString StuIndex;
	CString StuName;
	CString StuNum;
	CString StuTel;
	CString StuQQ;
	afx_msg void OnBnClickedButton1();
	afx_msg void OnBnClickedButton2();
	afx_msg void OnBnClickedButton4();
	afx_msg void OnBnClickedButton3();
	afx_msg void OnBnClickedButton5();
	afx_msg void OnBnClickedButton6();
	afx_msg void OnBnClickedButton7();

StuIndex,StuName,StuNum,StuTel, StuQQ是为示例编辑框创建的变量方便与对话框建立联系。用户在示例编辑框中输入信息然后通过UpdataData(TRUE)将信息分别读入创建的变量中。在函数中对信息进行处理然后通过UpdateData(FALSE)将各变量的信息分别显示在各示例编辑框内。

基于MFC的功能实现

清空示例编辑框

void CMFCAddressSystemBookDlg::OnBnClickedButton1()
{
	// TODO: 在此添加控件通知处理程序代码
	//清空示例编辑框
	UpdateData(TRUE);      //(LPSTR)(LPCTSTR)强制类型转换,将CString类转化为char*
	memset((LPSTR)(LPCTSTR)StuIndex, 0, sizeof((LPSTR)(LPCTSTR)StuIndex));
	memset((LPSTR)(LPCTSTR)StuName, 0, sizeof((LPSTR)(LPCTSTR)StuIndex));
	memset((LPSTR)(LPCTSTR)StuNum, 0, sizeof((LPSTR)(LPCTSTR)StuIndex));
	memset((LPSTR)(LPCTSTR)StuTel, 0, sizeof((LPSTR)(LPCTSTR)StuIndex));
	memset((LPSTR)(LPCTSTR)StuQQ, 0, sizeof((LPSTR)(LPCTSTR)StuIndex));
	UpdateData(FALSE);
}

删除联系人信息

void CMFCAddressSystemBookDlg::OnBnClickedButton2()
{
	// TODO: 在此添加控件通知处理程序代码
	//删除结点
	UpdateData(TRUE);
	int  index = _ttoi(StuIndex);
	book.CutStu(index);
	MessageBox(TEXT("联系人信息删除成功!"));
	memset((LPSTR)(LPCTSTR)StuIndex, 0, sizeof((LPSTR)(LPCTSTR)StuIndex));
}

修改联系人信息

void CMFCAddressSystemBookDlg::OnBnClickedButton4()
{
	// TODO: 在此添加控件通知处理程序代码
	//修改信息
	UpdateData(TRUE);
	int  index = _ttoi(StuIndex);
	book.ChangeStu(index, StuName, StuNum, StuTel, StuQQ);
	MessageBox(TEXT("联系人信息修改成功!"));
	//将输入在示例编辑框的信息清空
	memset((LPSTR)(LPCTSTR)StuIndex, 0, sizeof((LPSTR)(LPCTSTR)StuIndex));
	memset((LPSTR)(LPCTSTR)StuName, 0, sizeof((LPSTR)(LPCTSTR)StuIndex));
	memset((LPSTR)(LPCTSTR)StuNum, 0, sizeof((LPSTR)(LPCTSTR)StuIndex));
	memset((LPSTR)(LPCTSTR)StuTel, 0, sizeof((LPSTR)(LPCTSTR)StuIndex));
	memset((LPSTR)(LPCTSTR)StuQQ, 0, sizeof((LPSTR)(LPCTSTR)StuIndex));
	UpdateData(FALSE);     
}

查找联系人信息

void CMFCAddressSystemBookDlg::OnBnClickedButton3()
{
	// TODO: 在此添加控件通知处理程序代码
	//查找联系人信息
	UpdateData(TRUE);
	int  index = _ttoi(StuIndex);
	StuNode* stu;
	stu = book.FindStu(index);
	StuName = (LPCTSTR)stu->GetName();
	StuNum = (LPCTSTR)stu->GetNum();
	StuTel = (LPCTSTR)stu->GetPhone();
	StuQQ = (LPCTSTR)stu->GetQQ();
	UpdateData(FALSE);
}

保存信息

void CMFCAddressSystemBookDlg::OnBnClickedButton5()
{
	// TODO: 在此添加控件通知处理程序代码
	//将链表的信息存入文件
	book.SaveStu();
}

打印信息

void CMFCAddressSystemBookDlg::OnBnClickedButton6()
{
	// TODO: 在此添加控件通知处理程序代码
	//从文件中读入信息到链表并打印在左侧通讯录
	char Stu[50];
	StuNode* ptr = book.head->next;
	for (int i = 0; ptr != NULL; i++)
	{
		int j;
		switch (i)
		{
		case(0):
			j = IDC_EDIT2;   //示例编辑框的句柄(ID)
			break;
		case(1):
			j = IDC_EDIT1;
			break;
		case(2):
			j = IDC_EDIT3;
			break;
		case(3):
			j = IDC_EDIT4;
			break;
		case(4):
			j = IDC_EDIT5;
			break;
		case(5):
			j = IDC_EDIT6;
			break;
		case(6):
			j = IDC_EDIT7;
			break;
		case(7):
			j = IDC_EDIT8;
			break;
		case(8):
			j = IDC_EDIT9;
			break;
		case(9):
			j = IDC_EDIT10;
			break;
		}
		CString str;
		str.Format(_T("%d %s %s %s %s"), ptr->GetIndex(), ptr->GetName(), ptr->GetNum(), ptr->GetPhone(), ptr->GetQQ()); 
		// 获取编辑框控件指针
		CEdit* pEdit = (CEdit*)GetDlgItem(j);
		// 将文本写入编辑框
		pEdit->SetWindowText(str);
		ptr = ptr->next;
	}
}

添加信息

void CMFCAddressSystemBookDlg::OnBnClickedButton7()
{
	// TODO: 在此添加控件通知处理程序代码
	//增添新的结点
	UpdateData(TRUE);
	int  index = _ttoi(StuIndex);
	if (StuIndex.IsEmpty() || StuName.IsEmpty() || StuNum.IsEmpty() || StuTel.IsEmpty() || StuQQ.IsEmpty())
	{
		MessageBox(TEXT("联系人的信息不能为空!"));
		return;
	}
	else
	{
		StuNode stu(index, StuName, StuNum, StuTel, StuQQ);
		book.AddStu(stu);
		MessageBox(TEXT("联系人信息添加成功!"));
	}
	UpdateData(TRUE);
	//将用户输入
	memset((LPSTR)(LPCTSTR)StuIndex, 0, sizeof((LPSTR)(LPCTSTR)StuIndex));
	memset((LPSTR)(LPCTSTR)StuName, 0, sizeof((LPSTR)(LPCTSTR)StuName));
	memset((LPSTR)(LPCTSTR)StuNum, 0, sizeof((LPSTR)(LPCTSTR)StuNum));
	memset((LPSTR)(LPCTSTR)StuTel, 0, sizeof((LPSTR)(LPCTSTR)StuTel));
	memset((LPSTR)(LPCTSTR)StuQQ, 0, sizeof((LPSTR)(LPCTSTR)StuQQ));
	UpdateData(FALSE);
}

mfc存储链表,面向对象程序设计与C++语言(朱战立版)学习笔记,mfc,c++,链表文章来源地址https://www.toymoban.com/news/detail-824186.html

到了这里,关于C++基于MFC的通讯录系统(链表)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 通讯录管理系统 C++

    目录 一、前言 二、设计要求  三、概要设计 3.1 主界面设计 3.1.1 设计图 3.1.2设计代码 3.2 存储结构设计 3.3 系统功能设计 3.3.1 系统流程图​编辑 3.3.2 系统子程序及功能介绍  四、详细设计 4.1 头文件 4.2 数据定义 4.3 系统主要子程序详细设计 4.3.1 主函数 4.3.2 添加联系人 4.3

    2024年02月09日
    浏览(47)
  • 通讯录管理系统C++代码

    目录 通讯录管理系统(课程设计) 一、系统中需要实现的功能 二、创建项目 三、实现功能 1、菜单功能  2.添加联系人功能  3.显示联系人功能 4.删除联系人  5 .查找联系人功能  6.修改联系人功能  7.清空联系人功能  8.退出功能 对于通讯录管理系统而言,不需要太复杂的

    2024年02月09日
    浏览(27)
  • c++手机通讯录管理系统280

    定制魏:QTWZPW,获取更多源码等 目录 软件达到的目的 功能分析说明图  各项功能说明  主要数据结构类型  各个模块之间的调用关系和数据储存格式说明  各软件模块之间的调用方式  软件中实现各项功能的函数与程序主要代码  软件使用结果  添加联系人 显示联系人 拨

    2024年04月12日
    浏览(46)
  • C++课程设计,题目:通讯录管理系统

              1、题目。            2、设计分析。            3、分模块分析。            4、代码实现。 一、题目。 通讯录管理系统 手机通讯录中的联系人的信息既可以存储在手机中,也可以存储在手机卡中,也可以同时存储在两个位置上(每个位置上的存储容量为10

    2024年02月11日
    浏览(24)
  • 【C语言课设计划】个人通讯录管理系统(C语言大作业 链表 结构体 运行截图 完整代码)

    hello 大家好呀 这里是布丁学姐~ 今天给大家带来的是《C语言课设计划》的第一篇,个人通讯录管理系统 通讯录是当前社会每个人不可缺少的信息系统,利用C语言和Dve c++制作个人通讯录管理系统,从根本上改变纸质通讯录难以长久保存、容易丢失的弊端,从而提高信息管理和

    2024年02月02日
    浏览(31)
  • 基于php的校园通讯录电话号码查询系统

    本设计针对我校师生提供了一个管理、查询各部门联系方式的方法,本系统设计通过用php建立一个WEB平台,使学校管理员可以随时随地管理各部门联系方式,师生可以随时查询到想要的电话号码,这个系统改变了我校部门电话号码查询困难,管理不规范的问题,使学生及老师

    2024年02月03日
    浏览(22)
  • Python 基于列表实现的通讯录管理系统(有完整源码)

    目录 通讯录管理系统 PersonInformation类 ContactList类 menu函数 main函数 程序的运行流程 完整代码 运行示例 这是一个基于文本的界面程序,用户可以通过命令行与之交互,它使用了CSV文件来存储和读取联系人信息,这使得数据可以持久化保存。此外,程序还提供了一些基本的输入

    2024年04月15日
    浏览(36)
  • 手把手教你写代码——基于控制台的通讯录管理系统(单表)

    本栏目专为入门java学习者设计的一些简单的入门项目 本项目为简单的基于控制台的通讯录管理系统,所需要的环境仅仅为jdk以及mysql(版本不限)!只有一个简单的eclipse软件以及我们的mysql可视化工具(视频使用navicat) 本项目数据库表仅有一个,单表操作,方便学习! 本项

    2024年02月15日
    浏览(29)
  • C++ 通讯录案例

    代码如下:

    2024年02月13日
    浏览(41)
  • 通讯录管理系统

    作者:狮子也疯狂 专栏:《项目集锦》 坚持做好每一步,幸运之神自然会驾凌在你的身上 该项目是用于日常生活中记录联系人信息的一款智能小工具。实现了对联系人的姓名、年龄、性别、电话号码、住址的添加及修改、查找、删除、排序等功能。该项目是以 Windows 控制台

    2024年02月05日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包