资讯专栏INFORMATION COLUMN

C语言实现通讯录

AaronYuan / 3106人阅读

摘要:通讯录程序存放联系人信息信息名字年龄性别电话住址增加联系人删除联系人查找联系人修改联系人排序源文件代码如下创建一个枚举类型,分别对应菜单选项创建一个通讯录初始化通讯录最多可以放个联系

通讯录程序

1.存放联系人信息
2.信息:名字+年龄+性别+电话+住址
3.增加联系人
4.删除联系人
5.查找联系人
6.修改联系人
7.排序

test.c源文件代码如下:

#define _CRT_SECURE_NO_WARNINGS 1#include "contact.h"void menu(){	printf("#####################################/n");	printf("#####  1. add       2. del      #####/n");	printf("#####  3. search    4. modify   #####/n");	printf("#####  5. show      6. sort     #####/n");	printf("#####  0. exit                  #####/n");	printf("#####################################/n");}//创建一个枚举类型,分别对应菜单选项enum Option{	EXIT,	ADD,	DEL,	SEARCH,	MODIFY,	SHOW,	SORT,};int main(){	int input = 0;	//创建一个通讯录	struct Contact con;	//初始化通讯录	InitContact(&con);	//最多可以放3个联系人信息	//空间不够再增容	do	{		menu();//进入循环,先打印菜单		printf("请选择:>");		scanf("%d", &input);//用户选择操作		switch (input)		{		case ADD:			AddContact(&con);			break;		case DEL:			DelContact(&con);			break;		case SEARCH:			SearchContact(&con);			break;		case MODIFY:			ModifyContact(&con);			break;		case SHOW:			ShowContact(&con);			break;		case SORT:			SortContact(&con);			break;		case EXIT:			SaveContact(&con);			//销毁通讯录			DestroyContact(&con);			printf("退出/n");			break;		default:			printf("选择错误/n");			break;		}	} while (input);	return 0;}

contact.c源文件代码如下:

#define _CRT_SECURE_NO_WARNINGS 1#include "contact.h"//检测通讯录容量void CheckCapacity(struct Contact* pc){	//断言	assert(pc);	if (pc->sz == pc->capacity)//如果有效联系人等于最大容纳量	{		//增加容量		struct PeoInfo* ptr = realloc(pc->data, (pc->capacity + 2) * sizeof(struct PeoInfo));		if (ptr != NULL)//如果不为空,表示增容成功		{			pc->data = ptr;			pc->capacity += 2;			printf("增容成功/n");		}		else		{			perror("AddContact::realloc");			return;		}	}}//加载有效联系人信息void LoadContact(struct Contact* pc){	assert(pc);	struct PeoInfo tmp = { 0 };//临时空间	FILE* pfRead = fopen("contact.txt", "rb");//打开文件,读取数据	if (NULL == pfRead)	{		perror("open file for reading");		return;	}	//加载数据	//每次读取一个联系人信息,直到frea返回值小于1,表示读取完毕,循环结束	while (fread(&tmp, sizeof(struct PeoInfo), 1, pfRead))	{		CheckCapacity(pc);		pc->data[pc->sz] = tmp;		pc->sz++;	}	//关闭文件	fclose(pfRead);	pfRead = NULL;//置空,防止变成野指针}//初始化通讯录void InitContact(struct Contact* pc){	assert(pc);	pc->sz = 0;	pc->capacity = DEFAULT;	pc->data = (struct PeoInfo*)malloc(DEFAULT * sizeof(struct PeoInfo));//动态申请空间	if (pc->data == NULL)	{		perror("InitContact::malloc");		return;	}		LoadContact(pc);//加载通讯录的信息}//增加联系人void AddContact(struct Contact* pc){	assert(pc);	CheckCapacity(pc);//检查容量是否为满,是则进行增容	//输入增加指定联系人的信息	printf("请输入名字:>");	scanf("%s", pc->data[pc->sz].name);	printf("请输入年龄:>");	scanf("%d", &(pc->data[pc->sz].age));	printf("请输入性别:>");	scanf("%s", pc->data[pc->sz].sex);	printf("请输入电话:>");	scanf("%s", pc->data[pc->sz].tele);	printf("请输入地址:>");	scanf("%s", pc->data[pc->sz].addr);	printf("添加成功/n");	pc->sz++;//有效联系人加1}//销毁通讯录void DestroyContact(struct Contact* pc){	assert(pc);	free(pc->data);//释放申请的动态内存空间	pc->data = NULL;//置为空指针	pc->capacity = 0;//容量置0	pc->sz = 0;//有效联系人置0}//显示通讯录信息void ShowContact(const struct Contact* pc){	assert(pc);	int i = 0;	printf("%20s/t%5s/t%10s/t%12s/t%50s/n/n", "name", "age", "sex", "tele", "addr");	for (i = 0; i < pc->sz; i++)	{		//打印每一个数据		printf("%20s/t%5d/t%10s/t%12s/t%50s/n", 			pc->data[i].name, 			pc->data[i].age, 			pc->data[i].sex, 			pc->data[i].tele, 			pc->data[i].addr);	}}//查找指定联系人int FindContactByName(const struct Contact* pc, const char* name){	assert(pc && name);	int i = 0;	for (i = 0; i < pc->sz; i++)	{		if (strcmp(pc->data[i].name, name) == 0)		{			return i;		}	}	//找不到	return -1;}//删除指定联系人void DelContact(struct Contact* pc){	assert(pc);	if (pc->sz == 0)	{		printf("通讯录为空,无法删除/n");		return;	}	char name[NAME_MAX] = { 0 };	printf("请输入要删除联系人的名字:>");	scanf("%s", name);	//查找到删除的人	int pos = FindContactByName(pc, name);	if (pos == -1)		printf("指定联系人不存在/n");	else	{		//删除		int i = 0;		for (i = pos; i < pc->sz-1; i++)		{			pc->data[i] = pc->data[i + 1];		}		pc->sz--;		printf("成功删除/n");	}	}//查找指定联系人void SearchContact(const struct Contact* pc){	assert(pc);	char name[NAME_MAX] = { 0 };	if (pc->sz == 0)	{		printf("通讯录为空,无法查找/n");		return;	}	printf("请输入要查找的联系人名字:>");	scanf("%s", name);	int pos = FindContactByName(pc, name);	if (-1 == pos)		printf("查无此人/n");	else	{		printf("%15s/t%5s/t%8s/t%15s/t%30s/n/n", "name", "age", "sex", "tele", "addr");		printf("%15s/t%5d/t%8s/t%15s/t%30s/n",			pc->data[pos].name,			pc->data[pos].age,			pc->data[pos].sex,			pc->data[pos].tele,			pc->data[pos].addr);	}}//修改指定联系人void ModifyContact(struct Contact* pc){	assert(pc);	char name[NAME_MAX] = { 0 };	if (pc->sz == 0)	{		printf("通讯录为空,无法修改/n");		return;	}	printf("请输入要修改的联系人名字:>");	scanf("%s", name);	int pos = FindContactByName(pc, name);	if (-1 == pos)		printf("要修改的人不存在/n");	else	{		printf("请输入新的名字:>");		scanf("%s", pc->data[pos].name);		printf("请输入新的年龄:>");		scanf("%d", &(pc->data[pos].age));		printf("请输入新的性别:>");		scanf("%s", pc->data[pos].sex);		printf("请输入新的电话:>");		scanf("%s", pc->data[pos].tele);		printf("请输入新的地址:>");		scanf("%s", pc->data[pos].addr);	}}//按照名字排序->升序int cmp_by_name(const void* e1, const void* e2){	return strcmp((((struct PeoInfo*)e1)->name), (((struct PeoInfo*)e2)->name));}//按照年龄排序->升序int cmp_by_age(const void* e1, const void* e2){	return ((struct PeoInfo*)e1)->age - ((struct PeoInfo*)e2)->age;}//排序通讯录void SortContact(struct Contact* pc){	assert(pc);	int input = 0;	if (pc->sz == 0)	{		printf("通讯录为空,无法排序/n");		return;	}	printf("按名字排序请输入1,年龄排序请输入2:>");	scanf("%d", &input);	if (1 == input)	{		//名字排序		qsort(pc->data, pc->sz, sizeof(struct PeoInfo), cmp_by_name);	}	else	{		//年龄排序		qsort(pc->data, pc->sz, sizeof(struct PeoInfo), cmp_by_age);	}}//保存通讯录void SaveContact(struct Contact* pc){	assert(pc);	int i = 0;	FILE* pfWrite = fopen("contact.txt", "wb");把当前程序的有效联系人写入文件	if (NULL == pfWrite)//判断是否为空指针	{		perror("open file for writting");		return;	}	//写数据	for (i = 0; i < pc->sz; i++)	{		fwrite(pc->data+i, sizeof(struct PeoInfo), 1, pfWrite);//进行写入	}	fclose(pfWrite);//关闭文件	pfWrite = NULL;//置为空指针}

contact.h头文件代码如下:

#pragma once#include #include #include #include #define DEFAULT 3#define NAME_MAX 20#define SEX_MAX 10#define TELE_MAX 12#define ADDR_MAX 50#define MAX 1000//描述联系人的信息struct PeoInfo{	char name[NAME_MAX];	int age;	char sex[SEX_MAX];	char tele[TELE_MAX];	char addr[ADDR_MAX];};//通讯录-动态增长版本struct Contact{	struct PeoInfo* data;	int sz;//通讯录中当前有效元素个数	int capacity;//通讯录的当前最大容量};//增容void CheckCapacity(struct Contact* pc);//初始化通讯录void InitContact(struct Contact* pc);//销毁通讯录void DestroyContact(struct Contact* pc);//增加联系人void AddContact(struct Contact* pc);//显示通讯录void ShowContact(const struct Contact* pc);//删除指定联系人void DelContact(struct Contact           
               
                                           
                       
                 

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/121283.html

相关文章

  • C语言进阶】C语言实现讯录(简易版)

    摘要:前言我们需要用语言模拟一个通讯录可以用来存储个人的信息每个人的信息包括姓名电话性别住址年龄功能包括新增联系人查找联系人删除联系人修改联系人查看所有联系人以名字排序所有联系人注此版本不包含其他内容,后续会出更加全面的升级版本通讯录语言简易版 前言: 我们需要用C语言模拟一个通讯录可以用来存...

    wums 评论0 收藏0
  • C语言进阶】C语言实现讯录 升级版 { 含动态扩容/销毁/信息保存功能 }(强烈建议收藏食用)

    摘要:之前的通讯录在程序退出后内部的数据就会消失,再次打开程序后只能重新输入数据,为此我们增加了一个保存功能来保存信息。 前言: 由于之前实现的通讯录在存储方面只能支持静态的1000人的存储量,但是如果联系人较少,则会造成较大的内存浪费。而当联系人一旦超过1000时,就不能再继续存储信息了。因...

    gxyz 评论0 收藏0
  • 讯录小程序(C语言

    摘要:通讯录主要由个功能增加联系人删除联系人修改联系人查找联系人按名称子排序。输入,退出通讯录。代码实现打印菜单创建一个通讯录初始化通讯录请选择退出通讯录。 通讯录小程...

    zorpan 评论0 收藏0
  • 动态文件版讯录C语言中的文件的读写操作

    摘要:那么我们首先来改造储存空间也就是通讯录结构体静态版本人信息存放在数组中统计存放的人数动态版本统计存放的人数有效容量我们将原本的结构体数组改为一个结构体指针,以此来维护用以储存个人信息的空间。 上一期我们编写了一个C语言版本的简易通讯录,但是我们的之前的通讯录是没有记忆功能的,也就是说,一旦关...

    h9911 评论0 收藏0
  • ❤️C语言讯录管理系统(简易版)❤️

    ❤️C语言通讯录管理系统(简易版)❤️ ?一、通讯录?二、菜单实现和用户交互?三、主函数⭐️⭐️1.enum选项⭐️⭐️2.switch判断 ?四、定义联系人和通讯录⭐️⭐️1.定义联系人结构体⭐️⭐️2.定义通讯录结构体⭐️⭐️3.定义结构体变量 ?五、通讯录初始化?六、新增联系人?七、查找联系人?八、删除联系人?九、修改联系人?十、查看所有联系人?十一、清空所有联系人?十二、以名字排序所有...

    justCoding 评论0 收藏0
  • C语言----实现动态讯录

    摘要:文章目录前言前言一建立文件二编写函数三调试运行四成果展示五代码汇总总结前言通讯录是我们日常手机中常见的功能之一,综合语言中结构体,循环,条件语句,动态内存分配等等知识点,我们对手机通讯录进行一个简单的实现,下面我们开始讲解准备工作利用语 文章目录 前言一、建立文件二、编写函数三、调试运...

    whlong 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<