通讯录小项目完整版【C语言基础版】

前言

※※※大家好!我是同学〖森〗,一名计算机爱好者,今天让我们进入练习模式。若有错误,请多多指教。

👍 点赞  收藏 📝留言 都是我创作的最大的动力!

通讯录

 ⭐往期真集

扫雷扫雷小游戏最详细讲解【C语言】
猜数字【C语言】猜数字小游戏详细教程

⭐思维导图⭐

⭐目录⭐

目录

⭐前言⭐

※※※大家好!我是同学〖森〗,一名计算机爱好者,今天让我们进入练习模式。若有错误,请多多指教。

 ⭐往期真集⭐

⭐思维导图⭐

⭐目录⭐

1.通讯录功能

 声明

 2.选择菜单

3.main函数 

4.Initcontact函数(初始化函数)

5.FileLoad函数 (从文件中读取联系人)

6.CheckCap函数(检查空间,若不够则开辟空间)

7.AddContact函数(添加联系人)

 8.DelContact函数(删除联系人)

 9.FindByName(姓名查找)

10. SeaContact函数(查找联系人)

11. ModContact函数(修改联系人)

12. ShowContact函数(打印联系人)

 13.EmpContact函数(清空通讯录)

 14.SortContact函数(通讯录排序)

15.HelpContact函数(使用说明)

16.DestContact函数(摧毁通讯录和讲联系人储存到文件)

 17.ExitContact函数(退出通讯录)

18. 完整代码


1.通讯录功能

1. 添加联系人

2.删除联系人

3.找查联系人

4.修改联系人

5.打印联系人

6.清空联系人

7.联系人排序

8.使用说明

9.文件储存联系人

10.动态内存开辟

 

 声明

//接口的声明

#include<stdio.h>
#include<windows.h>
#include<assert.h>
#include<stdlib.h>
#include<string.h>

//宏
#define NAME 32
#define SEX  8
#define PHONE 12
#define ADDR 64

#define INITCAP 20		//初始化长度
#define INCREMENT 10    //自增长度

#define FILE_NAME "contact.txt"	//打开文件的名字

//利用枚举来替换switch中的选项
enum Option
{
	EXIT,//0
	ADD,
	DELECT,
	SEARCH,
	EDIT,
	SHOW,
	EMPTY,
	SORT,
	HELP,

};

//确认信息
enum check
{
	NO,//0
	YES,
};

//类型的声明

//联系人结构体
typedef struct Person
{
	char name[NAME];
	char sex[SEX];
	int age;
	char phone[PHONE];
	char addr[ADDR];
}person_t,*person_p,**person_pp;

//通讯录结构体
typedef struct contact
{
	int cap;	//最大容量
	int size;	//当前容量
	person_p data;	//联系人列表
} contact_t,*contact_p,**contact_pp;

//函数的声明

//将光标移动到指定位置
void gotoxy(short x, short y);	

//初始化通讯录
void Initcontact(contact_pp pc);

//添加联系人
void AddContact(contact_p pc);

//删除联系人
void DelContact(contact_p pc);

//查找联系人
void SeaContact(contact_p pc);

//修改联系人
void ModContact(contact_p pc);

//打印联系人
void ShowContact(contact_p pc);

//通讯录排序
void SortContact(contact_p pc);

//帮助(使用手册)
void HelpContact();

//清空通讯录
void EmpContact(contact_p pc);

//退出通讯录
void ExitContact(contact_p pc);

 2.选择菜单

void menu1()
{
	printf("\n#################################################################################\n");
	printf("\n▓                             * 欢迎使用通讯录 *                              ▓\n");
	printf("\n#################################################################################\n");
	printf("\n          ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆\n");
	printf("          |◆|******|◆|       ☆ 添加联系人      请按 1        |◆|******|◆|\n");
	printf("          |◆|******|◆|       ☆ 删除联系人      请按 2        |◆|******|◆|\n");
	printf("          |◆|******|◆|       ☆ 查找联系人      请按 3        |◆|******|◆|\n");
	printf("          |◆|******|◆|       ☆ 修改联系人      请按 4        |◆|******|◆|\n");
	printf("          |◆|******|◆|       ☆ 打印联系人      请按 5        |◆|******|◆|\n");
	printf("          |◆|******|◆|       ☆ 清空联系人      请按 6        |◆|******|◆|\n");
	printf("          |◆|******|◆|       ☆ 排序联系人      请按 7        |◆|******|◆|\n");
	printf("          |◆|******|◆|       ☆ 使用说明书      请按 8        |◆|******|◆|\n");
	printf("          |◆|******|◆|       ☆ 退出通讯录      请按 0        |◆|******|◆|\n");
	printf("          |◆|******|◆|                                        |◆|******|◆|\n");
	printf("          ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆\n");
	printf("\n#################################################################################\n");
	printf("\n▓                          ***      请选择<0~7>:       ***                    ▓\n");
	printf("\n#################################################################################\n");

}

3.main函数 

int main()
{
	system("color 2");
	int input = -1;		//选择控制变量
	//创建通讯录
	contact_p mycon = NULL;	//我的通讯录
	Initcontact(&mycon);	//初始化通讯录

	while (1)
	{
		menu1();
		//printf("请选择<0~7>:");
		gotoxy(50, 22);	//移动光标到(50,22)处
		rewind(stdin);//清除缓存区多余的内容
		scanf("%d", &input);

		switch (input)	
		{
			//使用枚举变量,使单词代替数字。
		case ADD :		
			system("cls");	//清屏
			AddContact(mycon);	//添加联系人
			system("pause");	//按任意键继续
			break;
		case DELECT:
			system("cls");
			DelContact(mycon);	//删除联系人
			system("pause");
			break;
		case SEARCH:
			system("cls");
			SeaContact(mycon);	//查找联系人
			system("pause");

			break;
		case EDIT:
			system("cls");
			ModContact(mycon);	//修改联系人
			system("pause");

			break;
		case SHOW:
			system("cls");
			ShowContact(mycon);	 //打印联系人
			system("pause");
			break;
		case EMPTY:
			system("cls");
			EmpContact(mycon);//清空通讯录
			system("pause");
			break;
		case SORT:
			system("cls");
			SortContact(mycon);//通讯录排序
			system("pause");
			break;
		case HELP:
			system("cls");
			HelpContact();//使用说明
			system("pause");

			break;
		case EXIT:
			system("cls");
			ExitContact(mycon);//退出
			system("pause");
			break;

		default:
			printf("输入错误!!!");
			system("pause");
			break;
		}

		system("cls");//清屏
	}

	return 0;
}

4.Initcontact函数(初始化函数)

//初始化通讯录
void Initcontact(contact_pp pc)
{
	assert(pc);

	//申请动态通讯录空间
	*pc = (contact_p)malloc(sizeof(contact_t));
	if (NULL == (*pc))
	{
		perror("Initcontact::malloc");
		exit(1);
	}

	//申请动态通讯录成员空间
	(*pc)->data = (person_p)malloc(sizeof(person_t) * INITCAP);
	if (NULL == (*pc)->data)
	{
		perror("Initcontact::malloc");
		exit(2);
	}


	//初始化通讯录最大容量和现有容量
	(*pc)->cap = INITCAP;
	(*pc)->size = 0;

	//将开辟的空间初始化为0
	memset((*pc)->data, 0, ((*pc)->cap) * sizeof(person_t));

	//从文件中读取联系人
	FileLoad(*pc);
}

5.FileLoad函数 (从文件中读取联系人)

 注意:要有该文件。

//从文件中读取通讯录信息
void FileLoad(contact_p pc)
{
	assert(pc);

	//打开文件
	FILE* fp = fopen(FILE_NAME, "rb");
	if (NULL == fp)
	{
		perror("FileLoad::fopen");
		return;
	}

	//读取文件
	person_t tem = { 0 };
	while (fread(&tem, sizeof(person_t), 1, fp))
	{
		CheckCap(pc);
		pc->data[pc->size] = tem;
		pc->size++;
	}

	//关闭文件
	fclose(fp);
	fp = NULL;
}

6.CheckCap函数(检查空间,若不够则开辟空间)

//检查空间容量
void CheckCap(contact_p pc)
{
	//增容
	if (pc->size == pc->cap)
	{
		person_p new = (person_p)realloc(pc->data, (pc->cap + INCREMENT) * sizeof(person_t));
		if (NULL == new)
		{
			perror("CheckCap::realloc");
			return;
		}
		else
		{
			pc->data = new;
		}

		pc->cap += INCREMENT;
		printf("扩容成功!\n");
	}
}

7.AddContact函数(添加联系人)

void static Add(contact_p pc, person_p p)
{
	assert(pc && p);

	//检查是否要开辟空间
	CheckCap(pc);
	pc->data[pc->size] = *p;
	pc->size++;
	printf("添加成功!\n");

}

//添加联系人
void AddContact(contact_p pc)
{
	assert(pc);
	person_t p = { 0 };

	printf("请添加信息<姓名,性别,年龄,电话,地址>:\n");
	scanf("%s %s %d %s %s", p.name, p.sex, &p.age, p.phone, p.addr);
	Add(pc, &p);

}

 8.DelContact函数(删除联系人)

//删除联系人
void DelContact(contact_p pc)
{
	assert(pc);

	if (0 == pc->size)
	{
		printf("================\n");
		printf("|| 通讯录为空 ||\n");
		printf("================\n");

		return;
	}

	//删除
	char name[NAME] = { 0 };
	printf("请输入要删除人的名字:");
	scanf("%s", name);
	printf("\n请确定要删除%s联系人\n", name);
	int  n = 0;
	while (1)
	{
		printf("----------------\n");
		printf("| 1.YES | 2.NO |\n");
		printf("----------------\n");

		scanf("%d", &n);
		if (1 == n )
		{
			int pos = FindByName(pc, name);
			if (-1 == pos)
			{
				printf("不存在联系人:%s\n", name);
				return;
			}
			else
			{
				for (int j = pos; j < (pc->size) - 1; j++)
				{
					pc->data[j] = pc->data[j + 1];
				}
				pc->size--;
				printf("删除成功!\n");
			}
			return;
		}
		else if (2 == n)
		{
			return;
		}
		else
		{
			printf("================\n");
			printf("||  输入错误  ||\n");
			printf("================\n");

		}
	}

}

 9.FindByName(姓名查找)

//通过姓名查找联系人。找到返回下标,没找到返回-1
int  FindByName(contact_p pc, char name[])
{
	int i = 0;
	for (i = 0; i < pc->size; i++)
	{
		if (0 == strcmp((pc->data[i].name), name))
		{
			return i;
		}
	}
	return -1;
}

10. SeaContact函数(查找联系人)

//查找联系人
void SeaContact(contact_p pc)
{
	assert(pc);

	if (0 == pc->size)
	{
		printf("================\n");
		printf("|| 通讯录为空 ||\n");
		printf("================\n");
		return;
	}

	//输入要查找的姓名
	char Sea_name[NAME] = { 0 };
	printf("请输入姓名:");
	scanf("%s", Sea_name);
	int pos = FindByName(pc, Sea_name);
	if (-1 == pos)
	{
		printf("================\n");
		printf("||没有此联系人||\n");
		printf("================\n");
		return;

	}
	//打印联系人信息
	else
	{
		printf("------------------------------------------------------------------------------\n");
		printf("| name      | sex  | age | phone           | adds                            |\n");
		printf("| %-10s| %-5s| %-4d| %-16s| %-32s|\n", pc->data[pos].name, \
			pc->data[pos].sex, pc->data[pos].age, \
			pc->data[pos].phone, pc->data[pos].addr);
		printf("------------------------------------------------------------------------------\n");

	}

}

11. ModContact函数(修改联系人)

//修改联系人
void ModContact(contact_p pc)
{
	assert(pc);

	if (0 == pc->size)
	{
		printf("================\n");
		printf("|| 通讯录为空 ||\n");
		printf("================\n");
		return;
	}

	//输入联系人的姓名
	char name[NAME] = { 0 };
	printf("请输入联系人的姓名:");
	scanf("%s", name);

	//查找联系人
	int pos = FindByName(pc, name);
	if (-1 == pos)
	{
		printf("================\n");
		printf("||没有此联系人||\n");
		printf("================\n");
		return;

	}
	//打印联系人信息
	printf("------------------------------------------------------------------------------\n");
	printf("| name      | sex  | age | phone           | addr                            |\n");
	printf("| %-10s| %-5s| %-4d| %-16s| %-32s|\n", pc->data[pos].name, \
		pc->data[pos].sex, pc->data[pos].age, \
		pc->data[pos].phone, pc->data[pos].addr);
	printf("------------------------------------------------------------------------------\n");

	while (1)
	{
		//选择要修改的关键字
		char mod[6] = { 0 };
		printf("请输入想修改的部分:");
		scanf("%s", mod);

		//修改名字
		if (0 == strcmp("name", mod))
		{

			printf("请输入新名字:");
			rewind(stdin);//清空输入缓冲区
			scanf("%s", pc->data[pos].name);
			printf("================\n");
			printf("||  修改成功  ||\n");
			printf("================\n");

			return;
		}

		//修改性别
		else if (0 == strcmp("sex", mod))
		{
			printf("请输入新性别:");
			rewind(stdin);//清空输入缓冲区
			scanf("%s", pc->data[pos].sex);
			printf("================\n");
			printf("||  修改成功  ||\n");
			printf("================\n");

			return;
		}

		//修改年龄
		else if (0 == strcmp("age", mod))
		{
			printf("请输入新年龄:");
			rewind(stdin);//清空输入缓冲区
			scanf("%d", &pc->data[pos].age);
			printf("================\n");
			printf("||  修改成功  ||\n");
			printf("================\n");

			return;
		}

		//修改电话号码
		else if (0 == strcmp("phone", mod))
		{
			printf("请输入新电话:");
			rewind(stdin);//清空输入缓冲区
			scanf("%s", pc->data[pos].phone);
			printf("================\n");
			printf("||  修改成功  ||\n");
			printf("================\n");

			return;
		}

		//修改地址
		else if (0 == strcmp("addr", mod))
		{
			printf("请输入新地址:");
			rewind(stdin);//清空输入缓冲区
			scanf("%s", pc->data[pos].addr);
			printf("================\n");
			printf("||  修改成功  ||\n");
			printf("================\n");

			return;
		}

		//输入错误
		else
		{
			printf("================\n");
			printf("||  输入错误  ||\n");
			printf("================\n");
		}

	}

}

12. ShowContact函数(打印联系人)

//打印联系人
void ShowContact(contact_p pc)
{
	assert(pc);

	if (0 == pc->size)
	{
		printf("================\n");
		printf("|| 通讯录为空 ||\n");
		printf("================\n");
		return;
	}

	printf("\n------------------------------------------------------------------------------\n");

	printf("                           共%5d个联系人                                   |\n", pc->size);

	//打印联系人信息
	printf("------------------------------- contacts -------------------------------------\n");
	printf("| name      | sex  | age | phone           | addr                            |\n");
	printf("------------------------------------------------------------------------------\n");

	for (int i = 0; i < pc->size; i++)
	{
		printf("| %-10s| %-5s| %-4d| %-16s| %-32s|\n", pc->data[i].name, \
			pc->data[i].sex, pc->data[i].age, \
			pc->data[i].phone, pc->data[i].addr);

	}

	printf("------------------------------------------------------------------------------\n\n");

}

 13.EmpContact函数(清空通讯录)

//清空通讯录
void EmpContact(contact_p pc)
{
	assert(pc);

	printf("确定清空通讯录吗?\n");
	int n = 0;
	while (1)
	{
		printf("----------------\n");
		printf("| 1.YES | 2.NO |\n");
		printf("----------------\n");

		scanf("%d", &n);
		if (1 == n)
		{
			//将开辟的空间初始化为0
			memset(pc->data, 0, pc->cap * sizeof(person_t));

			pc->size = 0;

			return;
		}
		else if (2 == n)
		{
			return;
		}
		else
		{
			printf("================\n");
			printf("||  输入错误  ||\n");
			printf("================\n");
		}

	}

}

 14.SortContact函数(通讯录排序)

//通讯录排序
void SortContact(contact_p pc)
{
	assert(pc);

	if (0 == pc->size)
	{
		printf("================\n");
		printf("|| 通讯录为空 ||\n");
		printf("================\n");
		return;
	}
	//冒泡排序
	int i = 0, j = 0;
	person_t tem;
	int pos = 0;
	for (i = pc->size - 1; i > 0; i--)
	{
		for (j = 0; j < i; j++)
		{
			if (1 == strcmp(pc->data[j].name, pc->data[j + 1].name))
			{
				tem = pc->data[j];
				pc->data[j] = pc->data[j + 1];
				pc->data[j + 1] = tem;
				pos = 1;
			}
		}

		if (0 == pos)
		{
			break;
		}
	}

	printf("================\n");
	printf("||  排序成功  ||\n");
	printf("================\n");
}

15.HelpContact函数(使用说明)

//帮助(使用手册)
void HelpContact()
{
	printf("\n");
	printf("-----------------------------------  HELP  -----------------------------------\n");
	printf("| 你可以在这个通讯录里找到你朋友的一些信息。                                 |\n");
	printf("| 1、添加联系人信息,请选 ( 1 ).                                               |\n");
	printf("| 2、删除联系人信息,请选 ( 2 ).                                               |\n");
	printf("| 3、搜索联系人信息,请选 ( 3 ).                                               |\n");
	printf("| 4、修改联系人信息,请选 ( 4 ).                                               |\n");
	printf("| 5、打印联系人信息,请选 ( 5 ).                                               |\n");
	printf("| 6、清空通讯录信息,请选 ( 6 ).                                               |\n");
	printf("| 7、排序联系人信息,请选 ( 7 ).                                               |\n");
	printf("| 8、通讯录使用说明,请选 ( 8 ).                                               |\n");
	printf("| 9、退出通讯录信息,请选 ( 9 ).                                               |\n");
	printf("------------------------------------------------------------------------------\n\n");
}

16.DestContact函数(摧毁通讯录和讲联系人储存到文件)

//存储到文件
void FileStore(contact_p pc)
{
	assert(pc);

	//打开文件
	FILE* pf = fopen(FILE_NAME, "wb");
	if (NULL == pf)
	{
		perror("FileStore::fopen");
		return;
	}

	//存储信息
	int i = 0;
	for (i = 0; i < pc->size; i++)
	{
		fwrite(pc->data + i, sizeof(person_t), 1, pf);
	}

	//关闭文件
	fclose(pf);
	pf = NULL;

}

//摧毁通讯录
void DestContact(contact_p pc)
{
	assert(pc);

	FileStore(pc);
	free(pc->data);//释放联系人
	pc->data = NULL;
	free(pc);
	pc = NULL;

}

 17.ExitContact函数(退出通讯录)

//退出通讯录
void ExitContact(contact_p pc)
{
	printf("确定退出?\n");
	int n = 0;
	while (1)
	{
		printf("----------------\n");
		printf("| 1.YES | 2.NO |\n");
		printf("----------------\n");

		scanf("%d", &n);
		if (1 == n)
		{
			DestContact(pc);
			printf("================\n");
			printf("|| 退出通讯录 ||\n");
			printf("================\n");

			exit(0);
		}
		else if (2 == n)
		{
			return;
		}
		else
		{
			printf("================\n");
			printf("||  输入错误  ||\n");
			printf("================\n");

		}
	}


}

18. 完整代码

完整代码及更多有趣的代码请移步到小森的Gitee仓库 Gitee

评论 41
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

同学〖森〗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值