模拟通讯录系统的简单实现



题目要求:

实现一个通讯录;通讯录可以用来存储1000个人的信息.

每个人的信息包括:姓名、性别、年龄、电话、住址 等。

实现功能:
1. 添加联系人信息
2. 删除指定联系人信息
3. 查找指定联系人信息
4. 修改指定联系人信息
5. 显示所有联系人信息
6. 清空所有联系人
7. 以名字排序所有联系人

具体实现代码如下:

<span style="font-size:14px;">#define _CRT_SECURE_NO_WARNINGS//用来消除使用scanf的警告
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#define NAME_MAX 15
#define SEX_MAX 5
#define TEL_MAX 12
#define ADDR_MAX 20
#define SIZE 1000
typedef struct contact//定义一个结构体来存放通讯录中的人员信息
{
	char name[NAME_MAX];
	int age;
	char sex[SEX_MAX];
	char tel[TEL_MAX];
	char address[ADDR_MAX];
}contact;
typedef struct people
{
	contact student[SIZE];
	int count;
}people,*pcon;
</span>
<span style="font-size:14px;">
void menu()
{
	printf("-----------------------通讯录管理--------------------\n");
	printf("----------------------0、退出------------------------\n");
	printf("-----------------1、添加联系人信息------------------\n");
	printf("-----------------2、删除联系人信息-----------------\n");
	printf("-----------------3.查找联系人信息-------------------\n");
	printf("----------------4、修改联系人信息------------------\n");
	printf("----------------5、显示联系人信息------------------\n");
	printf("----------------6、清空所有联系人------------------\n");
	printf("--------------7、按姓名对联系人排序----------------\n");
	printf("----------------------请选择------------------------\n");
}
void init(pcon p)//初始化通讯录
{
	memset(p->student, 0, SIZE*sizeof(contact));//用 0 将结构体中成员信息进行初始化
	p->count = 0;
}
//因为后边几个函数中都用姓名查找一个联系人,所以单独写一个查找函数方便使用
int search(pcon p)
{
	int i = 0;
	char name[15];
	scanf("%s", name);
	for (i = 0;i < p->count;i++)
	{
		if (strcmp(p->student[i].name, name) == 0)
		{
			return i;
		}
	}
	return -1;
}
void add_people (pcon p)//录入联系人信息
{
	if ((p->count) >= SIZE)
	{
		printf("通讯录已满!\n");
		return ;
	}
		printf("请输入姓名:\n");
		scanf("%s",p->student[p->count].name);
		printf("请输入性别:\n");
		scanf("%s",  p->student[p->count].sex);
		printf("请输入年龄:\n");
		scanf("%d", &( p->student[p->count].age));
		printf("请输入电话号码:\n");
		scanf("%s", p->student[p->count].tel);
		printf("请输入地址:\n");
		scanf("%s",  p->student[p->count].address);
		printf("添加联系人成功\n");
		p->count++;
}
void find_people(pcon p)//查找一个联系人,并输出他的所有信息
{
	printf("请输入要查找的人的姓名:\n");
	int ret = search(p);
	if (ret != -1)
	{
		printf("    name       sex     age          tel         address      \n");
		printf("%10s   %5s   %5d   %13s   %8s \n",
			p->student[ret].name,
			p->student[ret].sex,
			p->student[ret].age, 
			p->student[ret].tel,
			p->student[ret].address);
	}
		else
			printf("联系人不存在!\n ");
}

void delete_people(pcon p)//删除某联系人信息
{
	int i = 0;
	printf("请输入要删除的人的姓名:\n");
	int ret = search(p);
	if (ret != -1)
	{
			for (i = ret;i < p->count;i++)
			{
				p->student[i] = p->student[i + 1];
			}
			printf("删除成功!\n");
	}
	else
		printf("联系人不存在!\n");
}
void change_people(pcon p)//修改联系人信息
{
	printf("请输入要修改的人的姓名:\n");
	int ret = search(p);
	if (ret != -1)
	{
			printf("请把姓名修改为:\n");
			scanf("%s", &(p->student[ret].name));
			printf("请把性别修改为:\n");
			scanf("%s", &(p->student[ret].sex));
			printf("请把年龄修改为:\n");
			scanf("%d", &(p->student[ret].age));
			printf("请把电话修改为:\n");
			scanf("%s", &(p->student[ret].tel));
			printf("请把地址修改为:\n");
			scanf("%s", &(p->student[ret].address));
	}
	else
	{
		printf("联系人不存在!\n");
	}
}
void show_people(pcon p)//显示所有联系人信息
{
	int i = 0;
	printf("    name       sex     age          tel         address      \n");
	for (i = 0;i < p->count;i++)
	{
		printf("%10s   %5s   %5d   %13s   %8s \n",
			p->student[i].name, 
			p->student[i].sex,
			p->student[i].age,
			p->student[i].tel, 
			p->student[i].address);
	}
}
void empty_people(pcon p)//清空通讯录
{
	p->count= 0;
}
void sort_people(pcon p)//按姓名对联系人排序,并输出
{
	int i = 0,j=0;
	contact tmp = { 0 };
	for (i = 0;i < p->count-1;i++)
	{
		for (j = 0;j < (p->count)-1-i;j++)
		{
			if (strcmp(p->student[j].name, p->student[j + 1].name)>0)//按姓名降序排列
			{
				tmp = p->student[j];
				p->student[j] = p->student[j + 1];
				p->student[j+ 1] = tmp;
			}
		}
	}
	show_people( p);
}</span>
<span style="font-size:14px;">
int main()
{
	int input = 1;
	people  count;
	init(&count);
	while ( input )
	{
		menu();
		scanf("%d", &input);
		switch (input)
		{
		case 1: add_people(&count);
			break;
		case 2:delete_people(&count);
			break;
		case 3: find_people(&count);
			break;
		case 4: change_people(&count);
			break;
		case 5: show_people(&count);
			break;
		case 6: empty_people(&count);
			break;
		case 7: sort_people(&count);
			break;
		case 0: exit(0);
			break;
		default: printf("输入错误!");
			break;
		}
	}
	system("pause");
	return 0;
}</span>


好的程序都是经过反复推敲和优化的,再来看看上面这个程序,其实还有很多地方需要完善的。

上面的程序我们实现的是一个静态版本,对于联系人信息的存储是一次性开辟好内存的,但是,既然是模拟实现通讯录,我们就应该考虑实际情况。比如有些人联系人较少,可能只有几百个,这样就会有好大一块空间的浪费;而有些人的联系人较多,可能大于一千个,这样又会出现空间不足的情况。所以为了改善这些情况我们可以把通讯录改为动态版本,即可以动态存储联系人信息。代码如下:

头文件 contact.h

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include<string.h>

#define NAME_MAX 15
#define SEX_MAX 5
#define TEL_MAX 12
#define ADDR_MAX 20
#define SIZE 2

typedef struct contact
{
	char name[NAME_MAX];
	int age;
	char sex[SEX_MAX];
	char tel[TEL_MAX];
	char address[ADDR_MAX];
}contact;

typedef struct people
{
	contact *student;
	int count;//通讯录中当前存储的人数
	int capacity;//通讯录当前容量
}people, *pcon;
enum
{
	EXIT,
	ADD,
	DELETE,
	FIND,
	CHANGE,
	SHOW,
	EMPTY,
	SORT,
};
void menu();//菜单函数
void init(pcon p);//初始化通讯录
void check_memory(pcon p);//扩充通讯录存储空间
int search(pcon p);//用姓名查找一个联系人
void add_people(pcon p);//录入联系人信息
void find_people(pcon p);//查找一个联系人,并输出他的所有信息
void delete_people(pcon p);//删除某联系人信息
void change_people(pcon p);//修改联系人信息
void show_people(pcon p);//显示所有联系人信息
void empty_people(pcon p);//清空通讯录
void sort_people(pcon p);//按姓名对联系人排序,并输出

具体函数实现部分:contact.h

#include"contact.h"

void init(pcon p)//初始化通讯录
{
	p->student = (contact *)calloc(SIZE, sizeof(contact));//开辟一块大小为SIZE*sizeof(contact)的空间并赋初值为0;
	if (p->student == NULL)
	{
		printf("out of memory");
		exit(EXIT_FAILURE);
	}
	p->count = 0;
	p->capacity = SIZE;
	
}

void check_memory(pcon p)//扩充通讯录存储空间
{
	if ((p->count) == (p->capacity))
	{
		contact*  tmp = NULL;
		tmp  = (contact*)realloc(p->student, ((p->capacity) + 2)*sizeof(contact));
		//扩充当前通讯录容量大小为(p->capacity) + 2)*sizeof(contact)
		if (tmp == NULL)
		{ 
			printf("out of memory");
			exit(EXIT_FAILURE);
		}
		else
		{
			p ->student= tmp;
			p->capacity += 2;
		}
	}
}
//因为后边几个函数中都用姓名查找一个联系人,所以单独写一个查找函数方便使用
int search(pcon p)
{
	int i = 0;
	char name[15];
	scanf("%s", name);
	for (i = 0;i < p->count;i++)
	{
		if (strcmp(p->student[i].name, name) == 0)
		{
			return i;
		}
	}
	return -1;
}

void add_people(pcon p)//录入联系人信息
{
	check_memory(p);
	printf("请输入姓名:\n");
	scanf("%s", p->student[p->count].name);
	printf("请输入性别:\n");
	scanf("%s", p->student[p->count].sex);
	printf("请输入年龄:\n");
	scanf("%d", &(p->student[p->count].age));
	printf("请输入电话号码:\n");
	scanf("%s", p->student[p->count].tel);
	printf("请输入地址:\n");
	scanf("%s", p->student[p->count].address);
	printf("添加联系人成功\n");
	p->count++;
}

void find_people(pcon p)//查找一个联系人,并输出他的所有信息
{
	printf("请输入要查找的人的姓名:\n");
	int ret = search(p);
	if (ret != -1)
	{
		printf("    name       sex     age          tel         address      \n");
		printf("%10s   %5s   %5d   %13s   %8s \n",
			p->student[ret].name,
			p->student[ret].sex,
			p->student[ret].age,
			p->student[ret].tel,
			p->student[ret].address);
	}
	else
		printf("联系人不存在!\n ");
}

void delete_people(pcon p)//删除某联系人信息
{
	int i = 0;
	printf("请输入要删除的人的姓名:\n");
	int ret = search(p);
	if (ret != -1)
	{
		for (i = ret;i < p->count;i++)
		{
			p->student[i] = p->student[i + 1];
		}
		printf("删除成功!\n");
	}
	else
		printf("联系人不存在!\n");
}

void change_people(pcon p)//修改联系人信息
{
	printf("请输入要修改的人的姓名:\n");
	int ret = search(p);
	if (ret != -1)
	{
		printf("请把姓名修改为:\n");
		scanf("%s", &(p->student[ret].name));
		printf("请把性别修改为:\n");
		scanf("%s", &(p->student[ret].sex));
		printf("请把年龄修改为:\n");
		scanf("%d", &(p->student[ret].age));
		printf("请把电话修改为:\n");
		scanf("%s", &(p->student[ret].tel));
		printf("请把地址修改为:\n");
		scanf("%s", &(p->student[ret].address));
	}
	else
	{
		printf("联系人不存在!\n");
	}
}

void show_people(pcon p)//显示所有联系人信息
{
	int i = 0;
	printf("    name       sex     age          tel         address      \n");
	for (i = 0;i < p->count;i++)
	{
		printf("%10s   %5s   %5d   %13s   %8s \n",
			p->student[i].name,
			p->student[i].sex,
			p->student[i].age,
			p->student[i].tel,
			p->student[i].address);
	}
}

void empty_people(pcon p)//清空通讯录
{
	free(p->student);
	p->student = NULL;
	p->count = 0;
	
}

void sort_people(pcon p)//按姓名对联系人排序,并输出
{
	int i = 0, j = 0;
	contact tmp = { 0 };
	for (i = 0;i < p->count - 1;i++)
	{
		for (j = 0;j < (p->count) - 1 - i;j++)
		{
			if (strcmp(p->student[j].name, p->student[j + 1].name)>0)//按姓名降序排列
			{
				tmp = p->student[j];
				p->student[j] = p->student[j + 1];
				p->student[j + 1] = tmp;
			}
		}
	}
	show_people(p);
}

测试部分:main.c

#include"contact.h"

void menu()
{
	printf("-----------------------通讯录管理--------------------\n");
	printf("----------------------0、退出------------------------\n");
	printf("-----------------1、添加联系人信息------------------\n");
	printf("-----------------2、删除联系人信息-----------------\n");
	printf("-----------------3.查找联系人信息-------------------\n");
	printf("----------------4、修改联系人信息------------------\n");
	printf("----------------5、显示联系人信息------------------\n");
	printf("----------------6、清空所有联系人------------------\n");
	printf("--------------7、按姓名对联系人排序----------------\n");
	printf("----------------------请选择--------------------------\n");
}
int main()
{
	
	int input = 1;
	people  info;
	init(&info);
	while (input)
	{
		menu();
		scanf("%d", &input);
		switch (input)
		{
		case ADD: 
			add_people(&info);
			break;
		case DELETE:
			delete_people(&info);
			break;
		case FIND: 
			find_people(&info);
			break;
		case CHANGE: 
			change_people(&info);
			break;
		case SHOW: 
			show_people(&info);
			break;
		case EMPTY: 
			empty_people(&info);
			break;
		case SORT: 
			sort_people(&info);
			break;
		case EXIT:
			break;
		default: 
			printf("输入错误!\n");
			break;
		}
	}
	system("pause");
	return 0;
}


通过上面的修改,有没有发现我们设计的这个通讯录更加的通用了呢?但是即便这样修改了以后还是不太完美,因为我们又发现这个通讯录里的内容并没有保存下来,本次程序运行时添加的联系人,在下一次打开程序后就不存在了,而我们正常使用的通讯录保存一位联系人后不删除的情况下下次使用通讯录时联系人肯定还是会存在的吧!所以我们在以上实现的功能的基础上又加了一些功能,把添加的联系人保存到文件中,这样联系人信息就会永久的保存下来了。具体实现如下:

头文件部分:contact.h

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include<string.h>

#define NAME_MAX 15
#define SEX_MAX 5
#define TEL_MAX 12
#define ADDR_MAX 20
#define SIZE 2

typedef struct contact
{
	char name[NAME_MAX];
	int age;
	char sex[SEX_MAX];
	char tel[TEL_MAX];
	char address[ADDR_MAX];
}contact;

typedef struct people
{
	contact *student;
	int count;//通讯录中当前存储的人数
	int capacity;//通讯录当前容量
}people, *pcon;
enum
{
	EXIT,
	ADD,
	DELETE,
	FIND,
	CHANGE,
	SHOW,
	EMPTY,
	SORT,
};
void menu();//菜单函数
void init(pcon p);//初始化通讯录
void check_memory(pcon p);//扩充通讯录存储空间
int search(pcon p);//用姓名查找一个联系人
void add_people(pcon p);//录入联系人信息
void find_people(pcon p);//查找一个联系人,并输出他的所有信息
void delete_people(pcon p);//删除某联系人信息
void change_people(pcon p);//修改联系人信息
void show_people(pcon p);//显示所有联系人信息
void empty_people(pcon p);//清空通讯录
void sort_people(pcon p);//按姓名对联系人排序,并输出
void  save_people(pcon p);//把联系人信息保存到文件中
void load_people(pcon p);//加载联系人信息

函数实现部分:contact.c

#include"contact.h"

void init(pcon p)//初始化通讯录
{
	p->student = (contact *)calloc(SIZE, sizeof(contact));//开辟一块大小为SIZE*sizeof(contact)的空间并赋初值为0;
	if (p->student == NULL)
	{
		printf("out of memory");
		exit(EXIT_FAILURE);
	}
	p->count = 0;
	p->capacity = SIZE;
	
}

void check_memory(pcon p)//扩充通讯录存储空间
{
	if ((p->count) == (p->capacity))
	{
		contact*  tmp = NULL;
		tmp  = (contact*)realloc(p->student, ((p->capacity) + 2)*sizeof(contact));
		//扩充当前通讯录容量大小为(p->capacity) + 2)*sizeof(contact)
		if (tmp == NULL)
		{ 
			printf("out of memory");
			exit(EXIT_FAILURE);
		}
		else
		{
			p ->student= tmp;
			p->capacity += 2;
		}
	}
}
//因为后边几个函数中都用姓名查找一个联系人,所以单独写一个查找函数方便使用
int search(pcon p)
{
	int i = 0;
	char name[15];
	scanf("%s", name);
	for (i = 0;i < p->count;i++)
	{
		if (strcmp(p->student[i].name, name) == 0)
		{
			return i;
		}
	}
	return -1;
}

void add_people(pcon p)//录入联系人信息
{
	check_memory(p);
	printf("请输入姓名:\n");
	scanf("%s", p->student[p->count].name);
	printf("请输入性别:\n");
	scanf("%s", p->student[p->count].sex);
	printf("请输入年龄:\n");
	scanf("%d", &(p->student[p->count].age));
	printf("请输入电话号码:\n");
	scanf("%s", p->student[p->count].tel);
	printf("请输入地址:\n");
	scanf("%s", p->student[p->count].address);
	printf("添加联系人成功\n");
	p->count++;
}

void find_people(pcon p)//查找一个联系人,并输出他的所有信息
{
	printf("请输入要查找的人的姓名:\n");
	int ret = search(p);
	if (ret != -1)
	{
		printf("    name       sex     age          tel         address      \n");
		printf("%10s   %5s   %5d   %13s   %8s \n",
			p->student[ret].name,
			p->student[ret].sex,
			p->student[ret].age,
			p->student[ret].tel,
			p->student[ret].address);
	}
	else
		printf("联系人不存在!\n ");
}

void delete_people(pcon p)//删除某联系人信息
{
	int i = 0;
	printf("请输入要删除的人的姓名:\n");
	int ret = search(p);
	if (ret != -1)
	{
		for (i = ret;i < p->count;i++)
		{
			p->student[i] = p->student[i + 1];
		}
		printf("删除成功!\n");
	}
	else
		printf("联系人不存在!\n");
}

void change_people(pcon p)//修改联系人信息
{
	printf("请输入要修改的人的姓名:\n");
	int ret = search(p);
	if (ret != -1)
	{
		printf("请把姓名修改为:\n");
		scanf("%s", &(p->student[ret].name));
		printf("请把性别修改为:\n");
		scanf("%s", &(p->student[ret].sex));
		printf("请把年龄修改为:\n");
		scanf("%d", &(p->student[ret].age));
		printf("请把电话修改为:\n");
		scanf("%s", &(p->student[ret].tel));
		printf("请把地址修改为:\n");
		scanf("%s", &(p->student[ret].address));
	}
	else
	{
		printf("联系人不存在!\n");
	}
}

void show_people(pcon p)//显示所有联系人信息
{
	int i = 0;
	printf("    name       sex     age          tel         address      \n");
	for (i = 0;i < p->count;i++)
	{
		printf("%10s   %5s   %5d   %13s   %8s \n",
			p->student[i].name,
			p->student[i].sex,
			p->student[i].age,
			p->student[i].tel,
			p->student[i].address);
	}
}

void empty_people(pcon p)//清空通讯录
{
	free(p->student);
	p->student = NULL;
	p->count = 0;
	
}

void sort_people(pcon p)//按姓名对联系人排序,并输出
{
	int i = 0, j = 0;
	contact tmp = { 0 };
	for (i = 0;i < p->count - 1;i++)
	{
		for (j = 0;j < (p->count) - 1 - i;j++)
		{
			if (strcmp(p->student[j].name, p->student[j + 1].name)>0)//按姓名降序排列
			{
				tmp = p->student[j];
				p->student[j] = p->student[j + 1];
				p->student[j + 1] = tmp;
			}
		}
	}
	show_people(p);
}

void  save_people(pcon p)//把联系人信息存到文件中
{
	int i = 0;
	FILE * pfwrite = fopen("contact.dat", "w");
	if (pfwrite == NULL)
	{
		perror("open file for write");
		exit(EXIT_FAILURE);
	}
	for (i = 0;i < p->count;i++)
	{
		fwrite(&(p->student[i]), sizeof(contact), 1, pfwrite);
	}
	fclose(pfwrite);
}

void load_people(pcon p)//把文件中存储的信息加载出来
{
	int i = 0;
	p->count = 0;
	contact tmp;
	FILE * pfread =fopen("contact.dat", "r");
	if (pfread == NULL)
	{
		perror("open file for read");
		exit(EXIT_FAILURE);
	}
	else
	{
		while (fread(&tmp, sizeof(contact), 1, pfread))
		{
			check_memory(p);
			p->student[i] = tmp;
			i++;
			p->count++;
		}
	}
	fclose(pfread);
}

测试部分:main.c

#include"contact.h"

void menu()
{
	printf("-----------------------通讯录管理--------------------\n");
	printf("----------------------0、退出------------------------\n");
	printf("-----------------1、添加联系人信息------------------\n");
	printf("-----------------2、删除联系人信息-----------------\n");
	printf("-----------------3.查找联系人信息-------------------\n");
	printf("----------------4、修改联系人信息------------------\n");
	printf("----------------5、显示联系人信息------------------\n");
	printf("----------------6、清空所有联系人------------------\n");
	printf("--------------7、按姓名对联系人排序----------------\n");
	printf("----------------------请选择--------------------------\n");
}
int main()
{
	
	int input = 1;
	people  info;
	init(&info);
	load_people(&info);
	while (input)
	{
		menu();
		scanf("%d", &input);
		switch (input)
		{
		case ADD: 
			add_people(&info);
			break;
		case DELETE:
			delete_people(&info);
			break;
		case FIND: 
			find_people(&info);
			break;
		case CHANGE: 
			change_people(&info);
			break;
		case SHOW: 
			show_people(&info);
			break;
		case EMPTY: 
			empty_people(&info);
			break;
		case SORT: 
			sort_people(&info);
			break;
		case EXIT:
			save_people(&info);
			break;
		default: 
			printf("输入错误!\n");
			break;
		}
	}
	system("pause");
	return 0;
}

这样一个简单的通讯录就模拟出来啦~

上文中如果大家对那个函数的功能不太熟悉可以去MSDN查找函数的具体功能和参数哦!^_^








评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值