写一个通讯录

这篇博客详细介绍了如何从基本实现到动态增长版本的通讯录系统的设计和实现,涵盖了C语言、C++和Java的相关知识。内容包括通讯录的基本功能如增删查改、排序、文件存储,并探讨了C语言在底层驱动开发的优势以及C++和Java在上层应用开发的应用。
摘要由CSDN通过智能技术生成

目录

一、前言:

二、代码实现:

1、test.c文件中:

2、contact.h文件中:

3、contact.c文件中:

三、代码详解:

1、test.c文件中:

2、contact.h文件中:

3、contact.c文件中:

四、实现效果:

四、动态增长版本的通讯录

1、test.c文件中:

2、contact.h文件中:

3、contact.c文件中:

五、文件存储版本的通讯录

1、test.c文件中:

2、contact.h文件中:

3、contact.c文件中



一、前言:


通讯录的基本实现:
1、可以存放1000个人的信息
2、人的信息:名字,年龄,电话,住址,性别
3、增加联系人
4、删除联系人
5、查找联系人
6、修改联系人
7、排序(名字/年龄)
8、显示联系人(打印)


二、代码实现:

1、test.c文件中:

#include "contact.h"
void menu()
{
	printf("************************************\n");
	printf("******    1.add      2.del    ******\n");
	printf("******    3.search   4.modify ******\n");
	printf("******    5.sort     6.show   ******\n");
	printf("**********    0.exit    ************\n");
	printf("************************************\n");
}
int main()
{
//创建通讯录:
	int input = 0;
	Contact con;

//初始化通讯录:
	InitContact(&con);

	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			AddContact(&con);
			break;
		case 2:
			DeleteContact(&con);
			break;
		case 3:
			break;
		case 4:
			break;
		case 5:
			break;
		case 6:
			ShowContact(&con);
			break;
		case 0:
			printf("退出通讯录\n");
			break;
		default:
			printf("选择错误\n");
			break;
		}
	} while (input);
	return 0;
}

2、contact.h文件中:

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

#define MAX 1000

#define NAME_MAX 20
#define SEX_MAX 5
#define ADDR_MAX 30
#define TELE_MAX 12

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

//0、创建通讯录的结构体的函数声明:
typedef struct Contact
{
	PeoInfo data[MAX];
	int sz;

}Contact;

//1、初始化通讯录的函数声明:
void InitContact(Contact* pc);

//2、增加联系人到通讯录的函数声明
void AddContact(Contact* pc);

//3、打印通讯录中的信息的函数声明
void ShowContact(const Contact* pc);

//4、删除通讯录中的信息的函数声明
void DeleteContact(Contact* pc);

3、contact.c文件中:

#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"

//1、实现通讯录的初始化函数的实现:
void InitContact(Contact* pc)
{
	assert(pc);

	pc->sz = 0;

	memset(pc->data, 0, sizeof(pc->data));
	
}

//2、增加联系人到通讯录函数的实现:
void AddContact(Contact* pc)
{
	assert(pc);
	if (pc->sz == MAX)
	{
		printf("通讯录满了,无法添加\n");
		return;
	}
	
	printf("请输入名字:>");
	scanf("%s", pc->data[pc->sz].name);

	printf("请输入年龄:>");
	scanf("%d", &(pc->data[pc->sz].age));

	printf("请输入性别:>");
	scanf("%s", pc->data[pc->sz].sex);

	printf("请输入电话:>");
	scanf("%s", pc->data[pc->sz].tele);

	printf("请输入地址:>");
	scanf("%s", pc->data[pc->sz].addr);

	pc->sz++;
	printf("增加联系人成功\n");
}


//3、打印通讯录中的信息函数的实现
void ShowContact(const Contact* pc)
{
	assert(pc);
	
	printf("%-10s\t%-5s\t%-5s\t%-13s\t%-20s\n", "名字", "年龄", "性别", "电话", "地址");
	
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-10s\t%-5d\t%-5s\t%-13s\t%-20s\n",
			pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr);
	}
}


int FindByName(const Contact* pc, char name[])
{
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		if (strcmp(pc->data[i].name, name) == 0)
		{
			return i;
		}
	}
	return -1;
}

//4、删除通讯录中的信息函数的实现
void DeleteContact(Contact* pc)
{

	char name[NAME_MAX] = { 0 };//用NAME_MAX指定大小

	if (pc->sz == 0)
	{
		printf("通讯录为空,无法删除\n");
		return;
	}
	
	printf("请输入要删除人的名字:>");
	scanf("%s", name);

	int pos = FindByName(pc, name);

	if (pos == -1)
	{
		printf("要删除的人不存在\n");
		return;
	}
	else
	{
		int j = 0;
		for (j = pos; j < pc->sz - 1; j++)
		{
			pc->data[j] = pc->data[j + 1];
		}
		pc->sz--;
		printf("删除指定联系人成功\n");
	}
}

三、代码详解:

1、test.c文件中:

#define _CRT_SECURE_NO_WARNINGS 1

//通讯录的基本实现:
//1、可以存放1000个人的信息
//2、人的信息:名字,年龄,电话,住址,性别
//3、增加联系人
//4、删除联系人
//5、查找联系人
//6、修改联系人
//7、排序(名字/年龄)
//8、显示联系人(打印)


#include "contact.h"
void menu()
{
	printf("************************************\n");
	printf("******    1.add      2.del    ******\n");
	printf("******    3.search   4.modify ******\n");
	printf("******    5.sort     6.show   ******\n");
	printf("**********    0.exit    ************\n");
	printf("************************************\n");
}
int main()
{
	int input = 0;
//创建通讯录:
	Contact con;//con是通讯录,是用Contact这个结构体类型创建了con这个结构体变量,这个结构体变量con就包含了data数组和sz,即data和sz合起来才是con这个通讯录
	
//初始化通讯录:
	InitContact(&con);//初始化通讯录可以改掉con中的data和sz,所以传的是con的地址,而且结构体传参尽量传地址
	//如果不单独实现初始化通讯录这一模块,就是InitContact(&con) = { 0 };是把通讯录里的所有元素都初始化为0,这也可以


	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			//实现增加元素的功能:即增加一个人的信息,增加后还需要把这个信息放到通讯录con中——会改通讯录,所以是&con
			AddContact(&con);
			break;
		case 2:
			//实现删除元素的功能,修改通讯录的信息,则传地址
			DeleteContact(&con);
			break;
		case 3:
			//实现查找——调用FindByName()函数:根据名字查找指定联系人——打印查找结果
			break;
		case 4:
			//实现修改——查找——修改
			break;
		case 5:
			break;
		case 6:
			ShowContact(&con);//只是打印不改也要传地址,使效率更高
			break;
		case 0:
			printf("退出通讯录\n");
			break;
		default:
			printf("选择错误\n");
			break;
		}
	} while (input);
	return 0;
}

2、contact.h文件中:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <assert.h>

#define MAX 1000

#define NAME_MAX 20
#define SEX_MAX 5
#define ADDR_MAX 30
#define TELE_MAX 12

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

//0、创建通讯录的结构体的函数声明:
typedef struct Contact
{
	//存放数据的空间:
	PeoInfo data[MAX];//创建通讯录:定义1000元素的数组用于存放1000个人的信息
	//1000个元素,每个元素是PeoInfo类型
	//1、2、3、4、5功能的实现都是针对这个数组的,即需要把这个数组传给函数
	//记录数据大小:
	//int sz = 0;//注意这里不能对其初始化
	int sz;//记录通讯录中有效信息的个数,即记录当前通讯录有多少人,放入一个人的信息,sz就增加1——便于打印时知道打印元素的个数

}Contact;//这里创建了Contact这个结构体类型

//1、初始化通讯录的函数声明:
void InitContact(Contact* pc);//用指向通讯录的指针pc来接收传过来的con的地址

//2、增加联系人到通讯录的函数声明
void AddContact(Contact* pc);

//3、打印通讯录中的信息的函数声明
void ShowContact(const Contact* pc);//只是打印,不改变,可以加const保护

//4、删除通讯录中的信息的函数声明
void DeleteContact(Contact* pc);//会修改信息则不加const修饰

3、contact.c文件中:

#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"

/
  • 28
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 32
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值