用C语言简单实现通讯录

发布于:2022-10-26 ⋅ 阅读:(346) ⋅ 点赞:(0)

实现一个通讯录;

通讯录可以用来存储1000个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址

 一个人的信息有名字、性别、年龄、电话和住址,这些信息如果要单独设一个变量而且这些变量有许多不同的类型,用起来比较麻烦。学过自定义类型之后就可以将这些成员放到一个结构体中。

首先自定义一个结构体类型:

#define MAX 1000
#define NAME_MAX 20
#define SEX_MAX 5
#define TELE_MAX 12
#define ADD_MAX 30

enum Option
{
	EXIT,
	ADD,
	DEL,
	SEARCH,
	MODIFY,
	SORT,
	print
};


typedef struct PeoInfo
{
	char name[NAME_MAX];
	char sex[SEX_MAX];
	int age;
	char tele[TELE_MAX];
	char addr[ADD_MAX];
} PeoInfo;

typedef struct Contact
{
	PeoInfo data[MAX];//可以放1000个人的信息
	int sz;  //记通讯录中已经保存的信息个数

}Contact;

在解决基本的类型定义后,考虑到要实现通讯录的功能,所以要建立一个函数,考虑到是选择功能,所以用switch语句,又因为要实现连续选择,所以要把switch语句放在do...while循环中,用户可以连续选择和随时退出。 

void menu()
{
	printf("*****************************\n");
	printf("******1.add      2.del     *****\n");
	printf("******3.search  4.modify****\n");
	printf("******5.sort       6.print   ****\n");
	printf("******0.exit *****************\n");
	printf("*****************************\n");

}

void test()
{
	//增删查找修改
	int input = 0;
	//创建通讯录
	Contact con;   // 通讯录
	//初始化通讯录
	InitContact(&con);

	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		
		case ADD:
			AddContact(&con);
			break;
		case DEL:
			Delecontact(&con);
			break;
		case SEARCH:
			Searchcontact(&con);
			break;
		case MODIFY:
			break;
		case SORT:
			break;
		case print:
			PrintContact(&con);
			break;
		case EXIT:
			printf("退出\n");
			break;
		default:
		{
			printf("输入错误,请重新输入\n");
		}

		}
	} while (input);
}

int main()
{
	test();
	return 0;
}

ADD、EXIT等成员属于枚举类型,对应的值默认为0-6,如此设计可以增加代码的观赏性和稳定性。一个模块对应一个函数,简单明了。

结构体初始化:在使用结构体前,需要将结构体里面的内容初始化,如果不初始化结构体,则会使结构体里面的成员存在乱码的情况。

 

所以要将成员全部初始化为0。

void Con_Init(Contact* Con)
{
	assert(Con);
	Con->sz = 0;
	memset(Con->date, 0, sizeof(Con->date));  //这里的Con->date是数组名,不是指针,大小是date数组的大小。
}

在初始化之后,开始写功能实现。

1、添加成员信息。

void Add_Contact(Contact* Con)
{
	assert(Con);
	if (Con->sz == MAX)
	{
		printf("通讯录已满,无法添加\n");
		return;
	}
	printf("请输入姓名:>\n");
	scanf("%s", Con->date[Con->sz].Name);
	printf("请输入年龄:>\n");
	scanf("%d", &Con->date[Con->sz].Age);
	printf("请输入性别:>\n");
	scanf("%s", Con->date[Con->sz].Sex);
	printf("请输入电话:>\n");
	scanf("%s", Con->date[Con->sz].Tele);
	printf("请输入地址:>\n");
	scanf("%s", Con->date[Con->sz].Addr);
	printf("输入完毕\n");
	Con->sz++;
}

2、打印

在添加完成员信息后,需要验证自己的代码,所以需要打印出通讯录的信息。

void Print_Contact(Contact* Con)
{
	assert(Con);
	int i = 0;
	printf("%-20s %-5s %-5s %-15s %-15s\n", "姓名", "性别", "年龄", "电话", "地址");
	for (i = 0; i < Con->sz; i++)
	{
		printf("%-20s %-5s %-5d %-15s %-15s\n", Con->date[i].Name, Con->date[i].Sex, Con->date[i].Age, Con->date[i].Tele, Con->date[i].Addr);
	}
}

3、删除成员信息

删除成员信息需要用到字符串比较函数,如果函数的返回值为0,则就返回数组的下标,找到数组的下标之后,只需要这个下标以后的元素,往前挪一个单位即可,同时成员的个数也得减一。

static int  Find_Name(Contact* Con, char* name)
{
	assert(Con && name);
	int i = 0;
	for (i = 0; i < Con->sz; i++)
	{
		if ( strcmp(Con->date[i].Name, name) ==0)
		{
			return i;
		}
	}
	return -1;
	
}
void Del_Contact(Contact* Con)
{
	if (Con->sz == 0)
	{
		printf("成员不足,无法删除\n");
		return;
	}
	char name[20] = { 0 };
	printf("请输入删除成员的名字:>\n");
	scanf("%s", name);
	int ret = Find_Name(Con, name);
	if (ret == -1)
	{
		printf("要删除的人不存在\n");
		return;
	}
	
		int j = 0;
		for (j = ret; j < Con->sz - 1; j++)
		{
			Con->date[j] = Con->date[j + 1];
		}
		Con->sz--;
		printf("删除成功\n");
}

4、搜索成员信息

跟删除成员信息是一样的,只是不需要删除。

void Search_Contact(Contact* Con)
{
	if (Con->sz == 0)
	{
		printf("暂无成员信息,无法搜索\n");
		return;
	}
	char name[20] = { 0 };
	printf("请输入成员名字:>\n");
	scanf("%s", name);
	int ret = Find_Name(Con, name);
	if (ret == -1)
	{
		printf("要查找的人不存在\n");
		return;
	}
	printf("%-20s %-5s %-5s %-15s %-15s\n", "姓名", "性别", "年龄", "电话", "地址");
	printf("%-20s %-5s %-5d %-15s %-15s\n", Con->date[ret].Name, Con->date[ret].Sex, Con->date[ret].Age, Con->date[ret].Tele, Con->date[ret].Addr);
}

以上只是实现了通讯录的部分功能,其它功能还在学习中,如有错误,欢迎批评指正。

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到