c语言实现通讯录(静态版)

基本功能

1.至少能够储存一千人的信息

2.每个人的信息包括:姓名、性别、年龄、电话、地址

3.能够新增联系人

4.能够查找联系人

5.能够删除联系人

6.查看所有人的信息

7.以名字来排序所有联系人

主要完成以上7点通讯录(简易版)就完成了。

目录

1.函数主体部分

2.结构体的定义

   定义一个结构体来实现联系人信息的存放

3.打印菜单

4.枚举函数的定义

5.初始化通讯录

6.实现通讯录功能

1.增加联系人:

2:删除联系人

3.修改联系人

4.查找联系人

5.排序联系人(通过名字排序)

6.查看所有联系人

7.代码总览


6.查看所有联系人:

1.函数主体部分

第一步先来完成函数的主体部分:

int main()
{
	int input = 0;
	contacts con;//创建结构体
	Initcontacts(&con);//初始化结构体
	do 
	{
		menu();
		printf("请输入>:");
		scanf("%d", &input);
		switch(input)
		{
		case add://增加
			Addcontacts(&con);
			break;
		case delete://删除
			Deletecontacts(&con);
			break;
		case revise://修改
			Revisecontacts(&con);
			break;
		case find://查找
			Findcontacts(&con);
			break;
		case sort://排序
			Sortcontacts(&con);
			break;
		case display://打印
			Dispcontacts(&con);
			break;
		case quit:
			printf("已退出程序");
			break;
		default:
			printf("输入错误,请重新输入>:");
		}

	} while (input);
	return 0;
}

2.结构体的定义

   定义一个结构体来实现联系人信息的存放

typedef struct Peoinfo
{
	char name[20];//名字
	char gender[5];//性别
	int gae;//年龄
	char arr[15];//电话
	char ress[30];//地址
}peo;
typedef struct Contacts
{
	 peo data[MAX];//最多能存放多少信息
	int size;//用来记录以录入的多少信息
}contacts;

3.打印菜单

menu()
{
	printf("**************************\n");
	printf("******1.Add  2.Delete*****\n");
	printf("******3.Rent 4.Find*******\n");
	printf("******5.Sort 6.Display****\n");
	printf("********  0.Exit  ********\n");
	printf("**************************\n");
}

菜单里包含了我们所有要实现的功能,供使用者选择.

4.枚举函数的定义

enum my_em
{
	quit,
	add,
	delete,
	revise,
	find,
	sort,
	display
};

上面主函数内部的分支循环 case 中我们输入的字符是为了便于理解,到那一处该实现哪个功能;

5.初始化通讯录

void Initcontacts(contacts* pc)
{
	assert(pc);
	pc->size = 0;
	memset(pc->data, 0, sizeof(pc->data));//将通讯录初始化为0个元素
}

6.实现通讯录功能

1.增加联系人:

增加联系人最初我们要有一个判断如果通讯录的信息已经存放满了将提示:通讯录已满

void Addcontacts(contacts* pc)
{
	assert(pc);
	if (pc->size == MAX)
	{
		printf("通讯录已满");
		return;
	}
	else
	{
		printf("请输入名字>:");
		scanf("%s", pc->data[pc->size].name);
		printf("请输入性别>:");
		scanf("%s", &(pc->data[pc->size].gender));
		printf("请输入年龄>:");
		scanf("%d", &(pc->data[pc->size].gae));
		printf("请输入电话>:");
		scanf("%s", pc->data[pc->size].arr);
		printf("请输入地址>:");
		scanf("%s", &(pc->data[pc->size].ress));
		pc->size++;
		printf("添加成功!!\n");
	}
}

2:删除联系人

要删除联系人首先我们要通过名字找到对应的联系人,我们先完成一个查找函数来帮我们找到要删除的联系人,为什么要封装成一个查找函数呢?因为我们再后续的查找联系人和修改联系人中也需要找到联系人在进行对应的操作,所以封装一个查找函数也帮我们完成后续的操作做准备.

int Findby(const contacts* pc,char name[20])//查找函数
{
	assert(pc);
	int i = 0;
	for (i = 0; i < pc->size; i++)
	{
		if (0 == strcmp(pc->data[i].name,name))
			return i;//返回查找人对应的下标
	}
	return -1;//找不到返回-1
}

接下来我们完成删除联系人就会简单很多了:

删除联系人也有一个必要的条件就是你的通讯录里得有联系人,如果通讯录为空就不用继续执行了.

void Deletecontacts(contacts* pc)
{
	assert(pc);
	char name[20] = { 0 };
	int i = 0;
	if (pc->size == 0)//判断当前通讯录是否为空
	{
		printf("当前通讯录为空,无法删除\n");
		return;
	}
	//查找
	printf("请输入要删除人的名字>:");
	scanf("%s", &name);
	int pos = Findby(pc,name);//通过查找函数返回我们想得到的数据
	if (pos == -1)//如果为-1则找不到
	{
		printf("要删除的人不存在\n");
		return;
	}
	//删除
	for (i = pos; i < pc->size; i++)//如果找到了我们通过pos返回的联系人的下标
                                    //从后向前覆盖达到了删除的效果
	{
		pc->data[i] = pc->data[i + 1];
	}
	pc->size--;
	printf("删除成功\n");
}

我们通过覆盖达到了删除的效果,那如果通讯录为满我们要删除他最后一个联系人时又该怎么办呢?其实要删除最后一个联系人的话的确后面没有数据可以覆盖到要删除的目标,其实这里可以不用管他,其实通过size-1后我们就已经访问不到最后一个联系人了,当我们添加新的联系人时也就可以把他覆盖.

3.修改联系人

完成了增加和删除后后面的思路都大同小异,就不一一介绍了。

void Revisecontacts(contacts* pc)
{
	char name[20] = { 0 };
	assert(pc);
	if (pc->size == 0)
	{
		printf("当前通讯录为空\n");
		return;
	}
	printf("请输入被修改人的名字>:");
	scanf("%s", &name);
	int pos = Findby(pc, name);
	if (pos == -1)
	{
		printf("要修改的人不存在>:");
		return;
	}
	printf("请输入名字>:");
	scanf("%s", pc->data[pos].name);
	printf("请输入性别>:");
	scanf("%s", &(pc->data[pos].gender));
	printf("请输入年龄>:");
	scanf("%d", &(pc->data[pos].gae));
	printf("请输入电话>:");
	scanf("%s", pc->data[pos].arr);
	printf("请输入地址>:");
	scanf("%s", &(pc->data[pos].ress));
	printf("修改成功!!\n");
}

4.查找联系人

oid Findcontacts(const contacts* pc)
{
	assert(pc);
	char name[20] = { 0 };
	if (pc->size == 0)
	{
		printf("当前通讯录为空\n");
		return;
	}
	printf("请输入要查找的名字>:");
	scanf("%s", &name);
	int pos = Findby(pc, name);
	if (pos == -1)
	{
		printf("要查找的人不存在\n");
		return;
	}
	printf("查找成功\n");
	printf("%-20s\t%-5s\t%-4s\t%-12s\t%-30s\n", "名字", "性别", "年龄", "电话", "地址");

		printf("%-20s\t%-5s\t%-4d\t%-12s\t%-30s\n",
			pc->data[pos].name,
			pc->data[pos].gender,
			pc->data[pos].gae,
			pc->data[pos].arr,
			pc->data[pos].ress);	
}

5.排序联系人(通过名字排序)

int compare(const void* e1,const void* e2)
{
	return(strcmp(((peo*)e1)->name, ((peo*)e2)->name));
}
void Sortcontacts(contacts* pc)
{
	assert(pc);
	if (pc->size == 0)
	{
		printf("当前通讯录为空\n");
		return;
	}
	else if (pc->size == 1) {
		printf("当前通讯录只有一个联系人,不用排序\n");
	}
	qsort(pc->data,pc->size,sizeof(pc->data[0]),compare);
	printf("排序成功\n");
}

排序联系人我们通过qsort来实现排序,qsort所需要的四个参数为:                                              (数组地址(首元素地址),

要排序元素的个数,

数组单个元素的大小(单位为字节),

排序函数(具体可以看qsort的实现));

6.查看所有联系人

void Dispcontacts(const contacts* pc)
{
	assert(pc);
	if (pc->size == 0)
	{
		printf("当前通讯录为空\n");
		return;
	}
	int i = 0;
	printf("%-20s\t%-5s\t%-4s\t%-12s\t%-30s\n", "名字", "性别", "年龄", "电话", "地址");
	for (i = 0; i < pc->size; i++)
	{
		printf("%-20s\t%-5s\t%-4d\t%-12s\t%-30s\n",
			pc->data[i].name,
			pc->data[i].gender,
			pc->data[i].gae,
			pc->data[i].arr,
			pc->data[i].ress);
	}
}

7.代码总览

整个代码封装为三个部分:

1.test.c(函数主体部分)


#define _CRT_SECURE_NO_WARNINGS
#include"test.h"

menu()
{
	printf("**************************\n");
	printf("******1.Add  2.Delete*****\n");
	printf("******3.Rent 4.Find*******\n");
	printf("******5.Sort 6.Display****\n");
	printf("********  0.Exit  ********\n");
	printf("**************************\n");
}


int main()
{
	int input = 0;
	contacts con;
	Initcontacts(&con);
	do 
	{
		menu();
		printf("请输入>:");
		scanf("%d", &input);
		switch(input)
		{
		case add://增加
			Addcontacts(&con);
			break;
		case delete://删除
			Deletecontacts(&con);
			break;
		case revise://修改
			Revisecontacts(&con);
			break;
		case find://查找
			Findcontacts(&con);
			break;
		case sort://排序
			Sortcontacts(&con);
			break;
		case display://打印
			Dispcontacts(&con);
			break;
		case quit:
			printf("已退出程序");
			break;
		default:
			printf("输入错误,请重新输入>:");
		}

	} while (input);
	return 0;
}

2.test.h(函数的头文件以及声明)

#pragma once
#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<stdlib.h>
#define MAX 1000

typedef struct Peoinfo
{
	char name[20];//名字
	char gender[5];//性别
	int gae;//年龄
	char arr[15];//电话
	char ress[30];//地址
}peo;
typedef struct Contacts
{
	 peo data[MAX];//最多能存放多少信息
	int size;//用来记录以录入的多少信息
}contacts;
enum my_em
{
	quit,
	add,
	delete,
	revise,
	find,
	sort,
	display
};
//初始化通讯录
void Initcontacts(contacts* pc);
//添加联系人
void Addcontacts(contacts* pc);
//查找联系人
void Findcontacts(const contacts* pc);
//删除联系人
void Deletecontacts(contacts* pc);
//打印通讯录
void Dispcontacts(contacts* pc);
//修改联系人
void Revisecontacts(contacts* pc);
//通讯录排序
void Sortcontacts(contacts* pc);

3.game.c(自定义函数的实现部分)

#define _CRT_SECURE_NO_WARNINGS
#include"test.h"
void Initcontacts(contacts* pc)
{
	assert(pc);
	pc->size = 0;
	memset(pc->data, 0, sizeof(pc->data));
}
void Addcontacts(contacts* pc)
{
	assert(pc);
	if (pc->size == MAX)
	{
		printf("通讯录已满");
		return;
	}
	else
	{
		printf("请输入名字>:");
		scanf("%s", pc->data[pc->size].name);
		printf("请输入性别>:");
		scanf("%s", &(pc->data[pc->size].gender));
		printf("请输入年龄>:");
		scanf("%d", &(pc->data[pc->size].gae));
		printf("请输入电话>:");
		scanf("%s", pc->data[pc->size].arr);
		printf("请输入地址>:");
		scanf("%s", &(pc->data[pc->size].ress));
		pc->size++;
		printf("添加成功!!\n");
	}
}

void Dispcontacts(const contacts* pc)
{
	assert(pc);
	if (pc->size == 0)
	{
		printf("当前通讯录为空\n");
		return;
	}
	int i = 0;
	printf("%-20s\t%-5s\t%-4s\t%-12s\t%-30s\n", "名字", "性别", "年龄", "电话", "地址");
	for (i = 0; i < pc->size; i++)
	{
		printf("%-20s\t%-5s\t%-4d\t%-12s\t%-30s\n",
			pc->data[i].name,
			pc->data[i].gender,
			pc->data[i].gae,
			pc->data[i].arr,
			pc->data[i].ress);
	}
}
int Findby(const contacts* pc,char name[20])//查找函数
{
	assert(pc);
	int i = 0;
	for (i = 0; i < pc->size; i++)
	{
		if (0 == strcmp(pc->data[i].name,name))
			return i;
	}
	return -1;
}
void Deletecontacts(contacts* pc)
{
	assert(pc);
	char name[20] = { 0 };
	int i = 0;
	if (pc->size == 0)//判断当前通讯录是否为空
	{
		printf("当前通讯录为空,无法删除\n");
		return;
	}
	//查找
	printf("请输入要删除人的名字>:");
	scanf("%s", &name);
	int pos = Findby(pc,name);
	if (pos == -1)
	{
		printf("要删除的人不存在\n");
		return;
	}
	//删除
	for (i = pos; i < pc->size; i++)
	{
		pc->data[i] = pc->data[i + 1];
	}
	pc->size--;
	printf("删除成功\n");
}
void Findcontacts(const contacts* pc)
{
	assert(pc);
	char name[20] = { 0 };
	if (pc->size == 0)
	{
		printf("当前通讯录为空\n");
		return;
	}
	printf("请输入要查找的名字>:");
	scanf("%s", &name);
	int pos = Findby(pc, name);
	if (pos == -1)
	{
		printf("要查找的人不存在\n");
		return;
	}
	printf("查找成功\n");
	printf("%-20s\t%-5s\t%-4s\t%-12s\t%-30s\n", "名字", "性别", "年龄", "电话", "地址");

		printf("%-20s\t%-5s\t%-4d\t%-12s\t%-30s\n",
			pc->data[pos].name,
			pc->data[pos].gender,
			pc->data[pos].gae,
			pc->data[pos].arr,
			pc->data[pos].ress);	
}
void Revisecontacts(contacts* pc)
{
	char name[20] = { 0 };
	assert(pc);
	if (pc->size == 0)
	{
		printf("当前通讯录为空\n");
		return;
	}
	printf("请输入被修改人的名字>:");
	scanf("%s", &name);
	int pos = Findby(pc, name);
	if (pos == -1)
	{
		printf("要修改的人不存在>:");
		return;
	}
	printf("请输入名字>:");
	scanf("%s", pc->data[pos].name);
	printf("请输入性别>:");
	scanf("%s", &(pc->data[pos].gender));
	printf("请输入年龄>:");
	scanf("%d", &(pc->data[pos].gae));
	printf("请输入电话>:");
	scanf("%s", pc->data[pos].arr);
	printf("请输入地址>:");
	scanf("%s", &(pc->data[pos].ress));
	printf("修改成功!!\n");
}
int compare(const void* e1,const void* e2)
{
	return(strcmp(((peo*)e1)->name, ((peo*)e2)->name));
}
void Sortcontacts(contacts* pc)
{
	assert(pc);
	if (pc->size == 0)
	{
		printf("当前通讯录为空\n");
		return;
	}
	else if (pc->size == 1) {
		printf("当前通讯录只有一个联系人,不用排序\n");
	}
	qsort(pc->data,pc->size,sizeof(pc->data[0]),compare);
	printf("排序成功\n");
}

这一期的内容到这里就结束了,感谢大家的浏览,也希望自己今后继续进步早日拿到offer!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值