简易通讯录——C语言的一个小成果

最近一段时间在学习C语言的知识,然后就有想法,实现一个什么东西,然后就试着做了这个简易的通讯录!

通讯录可以用来存储1000个人的信息。

每个人的信息包括:

姓名、性别、年龄、电话、住址。


提供的方法:

1、添加联系人的信息

2、删除联系人的信息

3、查找指定联系人的信息

4、修改指定联系人的信息

5、显示所有联系人的信息

6、清空所有人联系人

7、以姓名排序所有联系人

我在这里实现了两个版本:

1、静态版的通讯录——(容量有限)

2、动态版的通讯录——(可以动态开辟容量,增加联系人的数量)

首先——静态通讯录

头文件 contact.h:

#define _CRT_SECURE_NO_WARNINGS 1//申明头文件
#include<stdio.h>
#include<string.h>

#define MAX_NAME 20
#define MAX_SEX 3
#define MAX_TELE 13    
#define MAX_ADDR 30
#define MAX 1000

typedef struct Peo//一个人的有效信息的内容
{
	char name[MAX_NAME];
	char sex[MAX_SEX];
	int age;
	char tele[MAX_TELE];
	char addr[MAX_ADDR];
}Peo;

typedef struct contact//创建一个电话本
{
	Peo con[MAX];
	int sz;//记录当前的有效信息个数
}Con,*pCon;
	

void init_contact(pCon _Con);//初始化    //这里采用地址传递!
void _add(pCon _Con); //添加人的信息
void _dis(const pCon _Con); //显示人的信息
void _del(pCon _Con); //删除人的信息
void _search(pCon _Con);//查找
void _mod(pCon _Con);//编辑
void _clr(pCon _Con);//清空
void _sort(pCon _Con);//分类

实现文件contact.c:

#define _CRT_SECURE_NO_WARNINGS 1//函数实现部分

#include<stdio.h>
#include<string.h>
#include"contact.h"

void init_contact(pCon _con)
{
	_con->sz = 0;
	memset(_con->con, 0, MAX*sizeof(Peo));
	//_pcon->con = (peo*)malloc(DEFAULT_SZ*sizeof());
}


void _add(pCon _con)
{
	if (_con->sz>=MAX)
	{
		printf("电话本已满\n");
		return;
	}
	printf("请输入姓名:>\n");
	scanf("%s", _con->con[_con->sz].name);
	printf("请输入性别:>\n");
	scanf("%s", _con->con[_con->sz].sex);
	printf("请输入年龄:>\n");
	scanf("%d", &_con->con[_con->sz].age);
	printf("请输入电话:>\n");
	scanf("%s", _con->con[_con->sz].tele);
	printf("请输入地址:>\n");
	scanf("%s", _con->con[_con->sz].addr);
	_con->sz++;
	printf("添加成功!\n");
}
void _dis(const pCon _con)
{
	int i = 0;
	printf("%10s\t%5s\t%3s\t%13s\t%30s\n","name","sex","age","tel","addr");//设置表头,右对齐
	for (i = 0; i < _con->sz; i++)
	{
		printf("%10s\t%5s\t%d\t%13s\t%30s\n",
			_con->con[i].name,
			_con->con[i].sex,
			_con->con[i].age,
			_con->con[i].tele,
			_con->con[i].addr);
		
	}
	
}

int find_entry(pCon _con, char *find_name)
{
	int i = 0;
	for (; i < _con->sz; i++)
	{
		if (strcmp(find_name, _con->con[i].name) == 0)
		{
			return i;
		}
	}
	return -1;
}
void _del(pCon _con)
{
	int pos = 0;
	int i = 0;
	char name[MAX_NAME];
	if (_con->sz <= 0)
	{
		printf("电话本为空");
		return;
	}
	printf("输入要删除人的名字: ");
	scanf("%s", name);

	pos = find_entry(_con, name);
	if (pos == -1)
	{				
		printf("不存在");
		return;
	}
	for (i = pos; i < _con->sz - 1; i++)
		//最后一个不需要移动
	{
		_con->con[i] = _con->con[i + 1];
	}

	_con->sz--;
	printf("删除成功\n");
}

void _search(pCon _con)//找到指定的人
{
	int pos = 0;
	
	char name[MAX_NAME];
	printf("输入名字:");
	scanf("%s", name);
    pos = find_entry(_con, name);
	if (pos == -1)
	{
		printf("没有这个联系人!\n");
		return;
	}
	else
	{
		printf("%10s\t%5s\t%d\t%13s\t%30s\n",
			_con->con[pos].name,
			_con->con[pos].sex,
			_con->con[pos].age,
			_con->con[pos].tele,
			_con->con[pos].addr);
	}
	
}

void _mod(pCon _con)//修改指定人的信息
{
	int pos = 0;
	char name[MAX_NAME];
	printf("请输入修改人的姓名:");
	scanf("%s",name);
	pos = find_entry(_con, name);
	
	if (pos == -1)
	{
		printf("没有这个联系人!\n");
		return;
	}
	
	else
	{
		printf("编辑联系人\n");
		printf("输入名字:");
		scanf("%s", _con->con[pos].name);
		printf("输入性别:");
		scanf("%s", _con->con[pos].sex);
		printf("输入年龄:");
		scanf("%d", &_con->con[pos].age);
		printf("输入电话:");
		scanf("%s", _con->con[pos].tele);
		printf("输入地址: ");
		scanf("%s", _con->con[pos].addr);
		printf("编辑成功!\n");
	}

		
}
//清空所有联系人
void _clr(pCon _con)
{
	_con->sz = 0;
	//memset(_con->con, NULL, MAX*sizeof(Peo));
}
//排序联系人
void _sort(pCon _con)//冒泡排序法
{
	int i = 0;
	int j = 0;
	//冒泡排序
	if (_con->sz == 0)
	{
		printf("通讯录为空!\n");
		return;
	}
	else
	{
		for (i = 0; i < _con->sz-1; i++)//排序次数
		{
			for (j = 0; j < _con->sz - 1 - i; j++)//一趟冒泡排序
			{//按名字排序

				if (strcmp(_con->con[j].name, _con->con[j + 1].name)>0)
				{
					Peo tmp = _con->con[j];
					_con->con[j]=_con->con[j + 1];
					_con->con[j + 1]= tmp;

				}
	
			}
		}
	}
	
}



测试文件 test.c:

#define _CRT_SECURE_NO_WARNINGS 1//测试部分,放主函数,检测电话本能不能用
#include<stdio.h>
#include"contact.h"//引用头文件
enum op
{
	EXIT,
	ADD,
	DEL,
	SEARCH,
	MODIFY,
	DISPLAY,
	CLEAR,
	SORT,
};
void menu(input)
{
	printf("**************************************\n");
	printf("********1.adder   2.delete*************\n");
	printf("********3.search 4.modify*************\n");
	printf("********5.display 6.clear*************\n");
	printf("********7.sort  0.exit*************\n");
	printf("**************************************\n");
	printf("**************************************\n");
}
int main()
{
	Con my_con;//我的电话本
	int input = 1;
	init_contact(&my_con);//初始化我的电话本
	while (input)
	{
		menu();
		printf("请选择:>");
		scanf("%d",&input);
		switch (input)
		{
		    case ADD:
			    _add(&my_con);
				break;
		    case DEL:
				_del(&my_con);
			    break;
		    case SEARCH:
				_search(&my_con);
			    break;
		    case MODIFY:
				_mod(&my_con);
			    break;
			case DISPLAY:
				_dis(&my_con);
				break;
		    case SORT:
				_sort(&my_con);
			    break;
		    case CLEAR:
				_clr(&my_con);
			    break;
		    case EXIT:
				break;
		    default:
			    printf("选择错误!\n");
			    break;
		}
	}
	return 0;
}

然后——动态通讯录

头文件 contact.h:

#pragma once
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

#define MAX_NAME 20
#define MAX_SEX 3
#define MAX_TELE 13    
#define MAX_ADDR 3
typedef unsigned int size_t;


#define   FILENAME "contact.dat" 
#define   DEFAULT_SZ 2//内存默认值
#define   DEFAULT_INC 1 //默认每次自增量

typedef struct Peo//一个人的有效信息的内容
{
	char name[MAX_NAME];
	char sex[MAX_SEX];
	int age;
	char tele[MAX_TELE];
	char addr[MAX_ADDR];
}Peo;

typedef struct contact//创建一个电话本
{
	Peo* con;
	int sz;//记录当前的有效信息个数
	int capacity;
}Con, *pCon;//结构体类型,指向结构体的指针 

void check_capacity(pCon _con);//类型名(指针类型),变量名
void init_contact(pCon _con);//初始化    //这里采用地址传递!
void _add(pCon _con); //添加人的信息
void _dis(const pCon _con); //显示人的信息
void _del(pCon _con); //删除人的信息
void _search(pCon _con);//查找
void _mod(pCon _con);//编辑
void _clr(pCon _con);//清空
void _sort(pCon _con);//分类
void load_contact(pCon _con);//加载文件
void save_contact(pCon _con);//保存文件
void _add_contact(pCon _con, Peo* p);

实现文件contact.c:

#define _CRT_SECURE_NO_WARNINGS 1//函数实现部分
#include"contact.h"

static void _add_contact(pCon _con, Peo* p)//只能访问当前文本
{
	check_capacity(_con);
	_con->con[_con->sz] = *p;
	_con->sz++;
}

void load_contact(pCon _con)
{
	
	FILE*Read = fopen(FILENAME, "r");//只读
	size_t ret = 1;
	if (Read == NULL)
	{
		perror("open file contact.dat file for read");
		exit(EXIT_FAILURE);
	}
    while (ret)
	{
		check_capacity(_con);
		ret = fread(&(_con->con[_con->sz]), sizeof(Peo), 1, Read);
		if (ret == 1)
		{
           _con->sz++;
		}
	
	}
	fclose(Read);
}   

void save_contact(pCon _con)
{
	int i = 0;
	FILE* Write = fopen(FILENAME, "w");//只写
	if (Write== NULL)
	{
		perror("open file contact.dat file for write");
		exit(EXIT_FAILURE);
	}

	for (i = 0; i < _con->sz; i++)
	{
		fwrite(&(_con->con[i]), sizeof(Peo), 1, Write);
	}
	fclose(Write);
	free(_con->con);
}

void init_contact(pCon _con)
{
	_con->sz = 0;
	_con->con = (Peo*)malloc(sizeof(Peo)*DEFAULT_SZ);//动态开辟内存
	if (_con->con == NULL)
	{
		printf("out of memory\n");
		exit(EXIT_FAILURE);
	}
	_con->capacity = DEFAULT_SZ;
	memset(_con->con, 0, _con->capacity*sizeof(Peo));//把数组内容全部设置为零

	load_contact(_con);
}


void check_capacity(pCon _con)
{
	Peo* tmp =NULL;
	if (_con->sz == _con->capacity)//需要扩容
	{
		tmp = (Peo*)realloc(_con->con, (_con->capacity + DEFAULT_INC)*sizeof(Peo));//扩容后的新的大小
		if (tmp != NULL)
		{
			_con->con = tmp;
			_con->capacity += DEFAULT_INC;
			//_con->capacity = _con->con + DEFAULT_INC;
		}
	}

}


void _add(pCon _con)
{
	check_capacity(_con);
	if (_con->sz >= _con->capacity)
	{
		printf("电话本已满\n");
		return;
	}
	printf("请输入姓名:>\n");
	scanf("%s", _con->con[_con->sz].name);
	printf("请输入性别:>\n");
	scanf("%s", _con->con[_con->sz].sex);
	printf("请输入年龄:>\n");
	scanf("%d", &_con->con[_con->sz].age);
	printf("请输入电话:>\n");
	scanf("%s", _con->con[_con->sz].tele);
	printf("请输入地址:>\n");
	scanf("%s", _con->con[_con->sz].addr);
	_con->sz++;
	printf("添加成功!\n");
}
void _dis(const pCon _con)
{
	int i = 0;
	printf("%10s\t%5s\t%3s\t%13s\t%30s\n", "name", "sex", "age", "tel", "addr");//设置表头,右对齐
	for (i = 0; i < _con->sz; i++)
	{
		printf("%10s\t%5s\t%d\t%13s\t%30s\n",
			_con->con[i].name,
			_con->con[i].sex,
			_con->con[i].age,
			_con->con[i].tele,
			_con->con[i].addr);

	}

}

int find_entry(pCon _con, char *find_name)
{
	int i = 0;
	for (; i < _con->sz; i++)
	{
		if (strcmp(find_name, _con->con[i].name) == 0)
		{
			return i;
		}
	}
	return -1;
}
void _del(pCon _con)
{
	int pos = 0;
	int i = 0;
	char name[MAX_NAME];
	if (_con->sz <= 0)
	{
		printf("电话本为空");
		return;
	}
	printf("输入要删除人的名字: ");
	scanf("%s", name);

	pos = find_entry(_con, name);
	if (pos == -1)
	{
		printf("不存在");
		return;
	}
	for (i = pos; i < _con->sz - 1; i++)
		//最后一个不需要移动
	{
		_con->con[i] = _con->con[i + 1];
	}

	_con->sz--;
	printf("删除成功\n");
}

void _search(pCon _con)//找到指定的人
{
	int pos = 0;

	char name[MAX_NAME];
	printf("输入名字:");
	scanf("%s", name);
	pos = find_entry(_con, name);
	if (pos == -1)
	{
		printf("没有这个联系人!\n");
		return;
	}
	else
	{
		printf("%10s\t%5s\t%d\t%13s\t%30s\n",
			_con->con[pos].name,
			_con->con[pos].sex,
			_con->con[pos].age,
			_con->con[pos].tele,
			_con->con[pos].addr);
	}

}

void _mod(pCon _con)//修改指定人的信息
{
	int pos = 0;
	char name[MAX_NAME];
	printf("请输入修改人的姓名:");
	scanf("%s", name);
	pos = find_entry(_con, name);

	if (pos == -1)
	{
		printf("没有这个联系人!\n");
		return;
	}

	else
	{
		printf("编辑联系人\n");
		printf("输入名字:");
		scanf("%s", _con->con[pos].name);
		printf("输入性别:");
		scanf("%s", _con->con[pos].sex);
		printf("输入年龄:");
		scanf("%d", &_con->con[pos].age);
		printf("输入电话:");
		scanf("%s", _con->con[pos].tele);
		printf("输入地址: ");
		scanf("%s", _con->con[pos].addr);
		printf("编辑成功!\n");
	}


}
//清空所有联系人
void _clr(pCon _con)
{
	_con->sz = 0;
	//memset(_con->con, NULL, MAX*sizeof(Peo));
}
//排序联系人
void _sort(pCon _con)//冒泡排序法
{
	int i = 0;
	int j = 0;
	//冒泡排序
	if (_con->sz == 0)
	{
		printf("通讯录为空!\n");
		return;
	}
	else
	{
		for (i = 0; i < _con->sz - 1; i++)//排序次数
		{
			for (j = 0; j < _con->sz - 1 - i; j++)//一趟冒泡排序
			{//按名字排序

				if (strcmp(_con->con[j].name, _con->con[j + 1].name)>0)
				{
					Peo tmp = _con->con[j];
					_con->con[j] = _con->con[j + 1];
					_con->con[j + 1] = tmp;

				}

			}
		}
	}

}



测试文件 test.c:

#define _CRT_SECURE_NO_WARNINGS 1//测试部分,放主函数,检测电话本能不能用

#include"contact.h"//引用头文件
enum op
{
	EXIT,
	ADD,
	DEL,
	SEARCH,
	MODIFY,
	DISPLAY,
	CLEAR,
	SORT
};
void menu(input)
{
	printf("**************************************\n");
	printf("********1.adder   2.delete*************\n");
	printf("********3.search 4.modify*************\n");
	printf("********5.display 6.clear*************\n");
	printf("********7.sort  0.exit*************\n");
	printf("**************************************\n");
	printf("**************************************\n");
}
int main()
{
	Con my_con;//我的电话本
	int input = 1;
	init_contact(&my_con);//初始化我的电话本
	while (input)
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case ADD:
			_add(&my_con);
			break;
		case DEL:
			_del(&my_con);
			break;
		case SEARCH:
			_search(&my_con);
			break;
		case MODIFY:
			_mod(&my_con);
			break;
		case DISPLAY:
			_dis(&my_con);
			break;
		case SORT:
			_sort(&my_con);
			break;
		case CLEAR:
			_clr(&my_con);
			break;
		case EXIT:
			save_contact(&my_con);
			break;
		default:
			printf("选择错误!\n");
			break;
		}
	}
	return 0;
}
这就完成了简易通讯录的程序实现,以后要多学习要思考,争取能把自己手边所用的东西,都能模拟实现出来,感觉有趣不少呢!

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值