C语言 与 C++ 通讯录对比实现(附源码)

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

目录

1.通讯录的基本框架

C语言版

C++版

2.增加联系人

C语言版

C++版

3.删除联系人

C语言版

C++版

4.查找与打印联系人

C语言版

C++版

5.修改联系人

C语言版

C++版

6.排序联系人

C语言版

C++版

7.其他

8.总结



本文章将对C语言、C++版本的通讯录进行对比实现。其中C++版本引入大量C语言没有的特性。旨在使广大朋友能快速适应,了解,学习C++基础语法。

下面我将把通讯录的增删查改等功能分模块进行对比。(本人为C++初学者,如果大家对文章有任何问题或意见欢迎指出)


1.通讯录的基本框架

C语言版

这里我们无非是打印菜单功能,创建联系人结构体,还有通讯录结构体。我这里就只展示结构体的实现了。这里实现的动态增容版的通讯录所以联系人结构体里放了 sz 表示人数,capacity表示容量。

typedef struct PeoInfo
{
	char name[MAX_NAME];
	char sex[MAX_SEX];
	int age;
	char tele[MAX_TELE];
	char addr[MAX_ADDR];
}PeoInfo;

typedef struct Contact
{
	PeoInfo *date;
	int sz;
	int capacity;
}Contact;

C++版

在C++版里我选择用类来代替结构体因为这里我想牵强的使用一下C++中的继承语法。相比较与C语言的手动开辟内存,这里我选择用vector来存放通讯录类类型。

class Peo
{
public:
	Peo(string n, string a, string s, string t, int age) :name(n), addr(a),
		sex(s), tele(t), age(age) {}//构造函数
	string name;
	string addr;	
	string sex;
	string tele;
	int age;
};
class Contact:public Peo
{
public:
	Contact(string n, string a, string s, string t, int age) :Peo(n,a,s,t,age){}
	//具体没想好父类还可以加些啥成员变量或函数。
};

下面是创建通讯录时代码的区别:

	//(C语言版)创建通讯录 
	Contact con;
	InitContact(&con);//初始化 
    //C++版
    vector<Contact>con;

2.增加联系人

C语言版

这里添加联系人需要判断容量是否足够,如果不够需要增容。

void AddContact(Contact* pc)
{
	if(pc->sz == pc->capacity)
	{
		PeoInfo* prev = (PeoInfo*)realloc(pc->date,sizeof(PeoInfo)*(pc->capacity)*2);
		if(prev!=NULL)
		{
			pc->date = prev;
			printf("增容成功\n");
		}
		pc->capacity = pc->capacity*2;
	}
	//增加一个人信息
	printf("请输入名字:>");
	scanf("%s",pc->date[pc->sz].name);
	printf("请输入年龄:>");
	scanf("%d",&(pc->date[pc->sz].age));
	printf("请输入性别:>");
	scanf("%s",pc->date[pc->sz].sex);
	printf("请输入电话:>");
	scanf("%s",pc->date[pc->sz].tele);
	printf("请输入地址:>");
	scanf("%s",pc->date[pc->sz].addr);	
	
	pc->sz++;
	printf("增加成功\n"); 
} 

C++版

因为C++有了 vector 所以我们就省去了手动判断容量,增容的问题了。

void AddContact(vector<Contact>&con)
{
	string name;
	string addr;
	string sex;
	string tele;
	int age;
	cout << "请输入联系人的姓名:>" ;
	cin >> name;
	cout << "请输入联系人的住址:>" ;
	cin >> addr;
	cout << "请输入联系人的性别:>" ;
	cin >> sex;
	cout << "请输入联系人的电话:>" ;
	cin >> tele;
	cout << "请输入联系人的年龄:>" ;
	cin >> age;
	Contact c(name, addr, sex, tele, age);//创建一个Contact类插入容器中
	con.push_back(c);
	cout << "添加成功" << endl;
	shownumContact(con);//显示联系人数量
	return;
}

3.删除联系人

C语言版

这里注意删除成功时需要手动把联系人 sz-- 。单独封装了一个FindByName函数

void DelContact(Contact* pc)
{
	char name[MAX_NAME] = {0}; 
	if(pc->sz==0)
	{
		printf("通讯录为空,无需删除\n");
		return;
	}
	printf("请输入要删除人的名字:>");
	scanf("%s",name);
	//查找要删除的人
	int pos = FindByName(pc,name);
	if(pos == -1)
	{
		printf("要删除的不存在\n");
	 } 
	 //删除
	 int i = 0;
	 for(i = pos; i < pc->sz-1; i++)
	 {
	 	pc->date[i] = pc->date[i + 1];
	  } 
	  pc->sz--;
	  printf("删除成功\n");
}

 FindByName函数的实现:

int FindByName(Contact* pc,char name[])
{
	int i = 0;
	for(i = 0;i < pc->sz;i++)
	{
		if(strcmp(pc->date[i].name,name) == 0)
		{
			return i;
		}
	}
	return -1;//找不到 
}

C++版

这里直接用自带的erase()来删除联系人,同样的需要封装一个搜索联系人函数。

//删除联系人
void dleContact(vector<Contact>& con)
{
	auto prev = Search(con);
	if (prev == con.end())
	{
		cout << "查无此人删除失败" << endl;
		return;
	}
	con.erase(prev);
	cout << "删除成功" << endl;
	shownumContact(con);//显示联系人数
	return;
}

搜索联系人用到了迭代器等概念:

vector<Contact>::iterator Search(vector<Contact>& con)//返回一个迭代器类型
{
	string delname;
	cout << "请输入联系人的姓名";
	cin >> delname;
	for (auto iter = con.begin(); iter != con.end(); iter++)
	{
		if (iter->name == delname)
		{
			return iter;
		}
	}
	return con.end();//返回尾后表示迭代器表示没找到
}

4.查找与打印联系人

这里查找我就不单独拿出来讲了。

C语言版

打印联系人这里循环整个数组就好了:

void PrintContact(const Contact* pc)
{
 	int i = 0;
 	//打印标题
	 printf("%-20s\t %-5s\t %-5s\t %-12s\t %-20s\n","名字","年龄","性别","电话","地址"); 
	 for(i = 0;i < pc->sz; i++)
	 {
		printf("%-20s\t%-5d\t%-5s\t%-12s\t%-20s\n",pc->date[i].name,
													   pc->date[i].age,
													   pc->date[i].sex,
													   pc->date[i].tele,
													   pc->date[i].addr); 	
	 } 	
}

C++版

这里我又引入了两个新的概念范围for循环和运算符重载,这里因为我们没法用一个左移运算符去打印整个类的成员变量所以我们可以重载左移运算符。

void PrintContact(vector<Contact>& con)
{
	shownumContact(con);//打印联系人数量
	for (auto C : con)
	{
		cout << C << endl;
	}
	return;
}
ostream& operator <<(ostream& cout, Contact c){
	cout << "姓名:" << c.name << "\t" << "住址:" << c.addr << "\t"
		<< "性别:" << c.sex << "\t" << "电话:" << c.tele << "\t"
		<< "年龄:" << c.age;
	return cout;
}

5.修改联系人

C语言版

这里我们用之前封装的函数找到要修改的联系人,修改信息即可。因为与C++版差别较小就不展示代码了。

C++版

void modifyContact(vector<Contact>& con)
{
	auto prev = Search(con);
	if (prev == con.end())
	{
		cout << "要修改的联系人不存在" << endl;
		return;
	}
	cout << "请输入修改后联系人的姓名:>";
	cin >> prev->name;
	cout << "请输入修改后联系人的住址:>";
	cin >> prev->addr;
	cout << "请输入修改后联系人的性别:>";
	cin >> prev->sex;
	cout << "请输入修改后联系人的电话:>";
	cin >> prev->tele;
	cout << "请输入修改后联系人的年龄:>";
	cin >> prev->age;
}

6.排序联系人

C语言版

这里我们按照联系人姓名进行排序,我用的是一个冒泡排序。

void sort(Contact* pc)
{
	for(int i = 0;i < pc->sz-1;i++)
	{
		for(int j = 0;j < pc->sz-1-j;j++)
		{
			if((strcmp(pc->date[j].name,pc->date[j+1].name))>0)
			{
				PeoInfo tmp = pc->date[j];
				pc->date[j] = pc->date[j+1];
				pc->date[j+1] = tmp;
			}
		}
	}
}

C++版

这里我用的是C++里的sort()来进行排序,注意C++的string类型可以直接比较大小

bool cmp(const Contact&a, const Contact&b)
{
	return (a.name < b.name);
}
void sortContact(vector<Contact>& con)
{
	sort(con.begin(), con.end(), cmp);
	cout << "排序成功" << endl;
}

7.其他

在C语言的最后我们需要手动销毁开辟出来的内存。

在C++中我封装了一个打印当前联系人个数的内联函数:

inline void shownumContact(vector<Contact>& con)
{
	cout << "当前联系人数为:" << con.size() << endl;
}

8.总结

在C++版里我们总共用的新的概念有:类,vector,运算符重载,范围for循环,迭代器,内联函数等等。

C++源码:

test.cpp

#include "contact.h"
// 菜单
void menu()
{
	cout << "*****************************" << endl;
	cout << "*****0.Exit    1.add*********" << endl;
	cout << "*****2.del     3.search******" << endl;
	cout << "*****4.modify  5.sort********" << endl;
	cout << "*****6.Print   **************" << endl;
	cout << "*****************************" << endl;
}
//枚举选项
enum option
{
	Exit,
	add,
	del,
	Search,
	modify,
	Sort,
	Print
};
int main()
{
	vector<Contact>con;
	int input;
	do {
		menu();
		cout << "请选择:>";
		cin >> input;
		switch (input)
		{
		case add:
			AddContact(con);
			break;
		case del:
			dleContact(con);
			break;
		case Search:
			searchContact(con);
			break;
		case modify:
			modifyContact(con);
			break;
		case Sort:
			sortContact(con);
			break;
		case Print:
			PrintContact(con);
			break;
		case Exit:
			break;
		default:
			cout << "输入错误" << endl;
			break;
		}
	} while (input);
	return 0;
}

contect.cpp

#include "contact.h"
//添加联系人
void AddContact(vector<Contact>&con)
{
	string name;
	string addr;
	string sex;
	string tele;
	int age;
	cout << "请输入联系人的姓名:>" ;
	cin >> name;
	cout << "请输入联系人的住址:>" ;
	cin >> addr;
	cout << "请输入联系人的性别:>" ;
	cin >> sex;
	cout << "请输入联系人的电话:>" ;
	cin >> tele;
	cout << "请输入联系人的年龄:>" ;
	cin >> age;
	Contact c(name, addr, sex, tele, age);//创建一个Contact类插入容器中
	con.push_back(c);
	cout << "添加成功" << endl;
	shownumContact(con);//显示联系人数量
	return;
}
//重载运算符
ostream& operator <<(ostream& cout, Contact c){
	cout << "姓名:" << c.name << "\t" << "住址:" << c.addr << "\t"
		<< "性别:" << c.sex << "\t" << "电话:" << c.tele << "\t"
		<< "年龄:" << c.age;
	return cout;
}
//单独封装一个搜索
vector<Contact>::iterator Search(vector<Contact>& con)//返回一个迭代器类型
{
	string delname;
	cout << "请输入联系人的姓名";
	cin >> delname;
	for (auto iter = con.begin(); iter != con.end(); iter++)
	{
		if (iter->name == delname)
		{
			return iter;
		}
	}
	return con.end();//返回尾后表示迭代器表示没找到
}
//打印联系人
void PrintContact(vector<Contact>& con)
{
	shownumContact(con);//打印联系人数量
	for (auto C : con)
	{
		cout << C << endl;
	}
	return;
}
//删除联系人
void dleContact(vector<Contact>& con)
{
	auto prev = Search(con);
	if (prev == con.end())
	{
		cout << "查无此人删除失败" << endl;
		return;
	}
	con.erase(prev);
	cout << "删除成功" << endl;
	shownumContact(con);//显示联系人数
	return;
}
void searchContact(vector<Contact>& con)
{
	auto prev = Search(con);
	if (prev == con.end())
	{
		cout << "查无此人" << endl;
		return;
	}
	cout << *prev;
	return;
}
void modifyContact(vector<Contact>& con)
{
	auto prev = Search(con);
	if (prev == con.end())
	{
		cout << "要修改的联系人不存在" << endl;
		return;
	}
	cout << "请输入修改后联系人的姓名:>";
	cin >> prev->name;
	cout << "请输入修改后联系人的住址:>";
	cin >> prev->addr;
	cout << "请输入修改后联系人的性别:>";
	cin >> prev->sex;
	cout << "请输入修改后联系人的电话:>";
	cin >> prev->tele;
	cout << "请输入修改后联系人的年龄:>";
	cin >> prev->age;
}
bool cmp(const Contact&a, const Contact&b)
{
	return (a.name < b.name);
}
void sortContact(vector<Contact>& con)
{
	sort(con.begin(), con.end(), cmp);
	cout << "排序成功" << endl;
}

contect.h

#include <string>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class Peo
{
public:
	Peo(string n, string a, string s, string t, int age) :name(n), addr(a),
		sex(s), tele(t), age(age) {}
	string name;
	string addr;	
	string sex;
	string tele;
	int age;
};
class Contact:public Peo
{
public:
	Contact(string n, string a, string s, string t, int age) :Peo(n,a,s,t,age){}
	//具体没想好父类还可以加些啥成员变量或函数。
};
//左移运算符重载
ostream& operator <<(ostream& cout, Contact c);
//添加联系人
void AddContact(vector<Contact>&con);
//打印联系人
void PrintContact(vector<Contact>& con);
//删除联系人
void dleContact(vector<Contact>& con);
//查找联系人
void searchContact(vector<Contact>& con);
//修改联系人信息
void modifyContact(vector<Contact>& con);
//按联系人名字排序
void sortContact(vector<Contact>& con);
//显示当前联系人数量(内联函数提高效率)
inline void shownumContact(vector<Contact>& con)
{
	cout << "当前联系人数为:" << con.size() << endl;
}

看到这里就点个关注吧~

C语言 与 C++ 通讯录对比实现(附源码),c语言,c++,学习

 文章来源地址https://www.toymoban.com/news/detail-597199.html

 

到了这里,关于C语言 与 C++ 通讯录对比实现(附源码)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【C语言】通讯录管理系统(保姆级教程+内含源码)

    目录 C系列文章目录 前言 一,模块化编程 二,系统框架构建 1.成员信息的创建 2.菜单实现 3.系统功能声明 三、系统功能实现 1.初始化通讯录 2.增加联系人 3.显示所有联系人 4.根据姓名查找位置 5.删除指定联系人 6.查找指定联系人 7.修改指定联系人 8.清空所有联系人 9.按照名

    2024年02月08日
    浏览(42)
  • 通讯录实现【C语言】

    目录 前言 一、整体逻辑分析 二、实现步骤 1、创建菜单和多次操作问题 2、创建通讯录 3、初始化通讯录 4、添加联系人 5、显示联系人 6、删除指定联系人 ​7、查找指定联系人 8、修改联系人信息 9、排序联系人信息 三、全部源码 我们上期已经详细的介绍了自定义类型,本

    2024年02月11日
    浏览(60)
  • C语言---认识动态内存管理并实现一个动态通讯录:静态通讯录别来沾边

    👧个人主页:@小沈熬夜秃头中୧⍤⃝❅ 😚小编介绍:欢迎来到我的乱七八糟小星球🌝 📋专栏:C语言学习 🔑本章内容:动态内存管理 送给各位💌:当你的能力还驾驭不了你的目标时那你就应该沉下心来历练 记得 评论📝 +点赞👍 +收藏😽 +关注💞哦~ 提示:以下是本篇

    2024年02月08日
    浏览(92)
  • 动态通讯录实现(C语言)

    目录 前言: 一:单个节点的设计和主逻辑  结点设计 主逻辑 二:接口实现 (1)生成一个新的结点 (2)增加信息 (3)打印信息 (4)查找  (5)删除信息 (6)修改信息 (7)排序  插入排序 快速排序 (8)已有数据读取 (9)更新数据录入 三:全部代码 contact.h(声明) contact.c(接口) test.c(主逻辑) 本

    2024年02月05日
    浏览(58)
  • C语言--通讯录的实现

    人的信息:姓名+年龄+性别+住址+电话 通讯录中可以存放100个人的信息 增加联系人 删除指定联系人 查找指定联系人 修改指定联系人 显示所有联系人的信息 test.c----测试通讯录 contact.c----通讯录的实现 contact.h----函数的声明 代码如下(示例): 代码如下(示例):

    2024年02月15日
    浏览(48)
  • 通讯录(纯C语言实现)

    相信大家都有过通讯录,今天我来带大家实现以下最简单的通讯录,通过本篇文章,相信可以让大家对C语言有进一步的认识。 话不多说,我们先放函数的实现  是不是看到这里会感到很害怕??不用怕,跟着我的思路,你也可以实现它,我带着你一步一步实现每一个功能  

    2024年02月16日
    浏览(48)
  • C语言实现通讯录(文件版)

    学习完C语言的文件读写,我们又可以将通讯录增加以下功能: 1.当退出通讯录的时候,把已增加的联系人信息写到文件中。 2.当通讯录初始化的时候,加载(读取)文件里的信息到通讯录 ——(直接使用打印函数可以显示在屏幕上) 分析: 当我们退出通讯录的时候要实现通讯录

    2024年02月01日
    浏览(37)
  • 【C语言】实现通讯录(动态+文件)

    在之前三子棋和扫雷的基础上,本篇文章博主将给大家逐步分析实现通讯录,介绍通讯录的每个功能( 动态增长和文件保存 )。 —————————————————————— test.c - 测试通讯录 Contact.c - 函数的实现 Contact.h - 函数和类型的声明 以多文件的形式分模块写的

    2024年02月13日
    浏览(57)
  • C语言进阶——通讯录模拟实现

    🌇个人主页:_麦麦_ 📚今日名言:只有走在路上,才能摆脱局限,摆脱执着,让所有的选择,探寻,猜测,想象都生机勃勃。——余秋雨《文化苦旅》 目录 一、前言 二、正文 1.大体框架 2.界面显示 3. 创建通讯录 4.初始化通讯录 5.增加联系人 6.显示联系人 7. 删除联系人  

    2024年02月02日
    浏览(47)
  • 【C语言】实现动态版通讯录

    💌内容专栏:【C语言】进阶部分 💌本文概括: 结合自定义类型、动态内存管理知识,对静态版本的通讯录进行优化。 💌本文作者:花 碟 💌发布时间:2023.4.2   目录 前言: 一、静态版本代码实现: 二、动态通讯录  三、代码整理  前面我们学过了结构体、枚举等自定义

    2024年02月02日
    浏览(45)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包