C语言——通讯录的实现

目录

创建项目环境

创建结构体

test.c文件

创建通讯录

增加联系人

打印通讯录

删除指定联系人

查找联系人

更改联系人

排列通讯录

完善通讯录

代码

结语


创建项目环境

对于这个通讯录的实现,我们可以像写三子棋一样,怎样去思考,那首先就要创建项目环境

 这次也要去分模块去写

首先我们先要思考一下,通讯录有什么什么功能,它需要保存每个人的信息,对于这些信息我们还要进行增加,删除,查找,修改的操作,当然我们使用的手机通讯录也会按照字母的大小来排序。

开始我们自己创建的头文件依旧可以把我们的库函数,自定义类型等等,都写到这里面,在其他的源文件中引用" contact.h "。


创建结构体

首先我们要存放一个人的信息,这里创建一个结构体就可以存放人的名字,性别,年龄等。

这里用tpyedef重命名,以后PeoInfo就是这个结构体


test.c文件

开始的文件就打印一个菜单,写上之后要用到switch语句

可以根据我们的菜单来写

 


创建通讯录

下面这个Contact就是我们创建的通讯录,可以存放1000个人的信息,sz记录个数。

刚才的代码也可以用define来定义一下,方便我们的之后修改这个值。

之后就可以在test.c文件中使用 

 当然我们也可以用到上一篇提到的枚举,这样就可以和菜单匹配

 下面的switch也可以改写成这样

当然也可以把枚举拿到头文件中 


增加联系人

再增加联系人之前,我们并没有把Contact结构体中的成员初始化,所以下一步要把通讯录初始化。

 使用memset就可以把整个数组初始化为0

之后就可以写增加函数了,也需要在头文件中声明一下

 


打印通讯录

上一步我们写了添加联系人的函数,之后我们写打印通讯录的函数来测试一下添加的联系人的信息有没有传进去。

 

 经测试,输入的信息都传入了通讯录中


删除指定联系人

当我们想要删除指定的联系人的时候,首先要判断通讯录中是否还有数据。然后要找到我们想要删除的人,之后的查找联系人和更改联系人也要找到联系人,所以这里可以写一个函数帮助我们查找,找到之后就可以删除。


查找联系人

当我们要实现查找时,前面的很多代码都可以套用,比如通讯录为空的时候,通讯录中找不到的时候,以及找到了打印的时候,这些代码前面也写过。


更改联系人

 这里不过多说什么,代码在前面已经写过了,灵活运用就可以


排列通讯录

        排序联系人的时候,就可以用到之前指针篇章的qsort函数,也是非常的方便,只是这里是结构体排序,参数1:传入待排序的起始位置,既然要排序就指向联系人的第一个;参数2:元素个数,也就是通讯录中有几个人;参数3:一个元素的字节,也就是整个人的字节大小;参数4:排序的函数地址。

        在写排序函数的时候和排列整型数组不同,这里把e1和e2强制类型转换成结构体指针,这里就不需要解引用了,指针就直接用->,在我们日常使用的通讯录中,一般都是联系人的首字母来比较,所以这里就直接拿name来比较了,name是一个字符串,用strcmp来比较。


完善通讯录

       到这里通讯录基本就已经完成了,最后就看看有什么可以优化的地方,比如:查找和打印的功能不需要修改,但我们也不希望目标结构体改变,所以加上const来修饰;另一点就是,结构体传参的时候,使用传址调用(上一篇也讲到为什么结构体要传址而不是传值),既然传址就要用到指针,在函数调用的时候还是断言一下的好。


代码

所有代码如下

contact.h文件

#pragma once

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

//类型的声明

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

enum Option
{
	EXIT,//0
	ADD,//1
	DEL,//2
	SEARCH,//3
	MODIFY,//4
	SORT,//5
	PRINT//6
};

typedef struct PeoInfo
{
	//存放一个人的信息
	char name[NAME_MAX];
	char sex[SEX_MAX];
	int age;
	char tele[TELE_MAX];
	char addr[ADDR_MAX];
}PeoInfo;

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

//函数的声明

//初始化通讯录
void InitContact(Contact* pc);

//增加联系人
void AddContact(Contact* pc);

//打印通讯录
void PrintContact(const Contact* pc);

//删除指定联系人
void DelContact(Contact* pc);

//查找联系人
void SearchContact(const Contact* pc);

//更改联系人
void ModifyContact(Contact* pc);

//排列联系人
void SortContact(Contact* pc);

const.c文件

#define _CRT_SECURE_NO_WARNINGS 1

#include "contact.h"

void InitContact(Contact* pc)
{
	assert(pc);
	pc->sz = 0;
	memset(pc->data, 0, sizeof(pc->data));
}

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");

}

void PrintContact(const Contact* pc)
{
	assert(pc);
	printf("%-20s %-5s %-5s %-12s %-30s\n", "姓名", "年龄", "性别", "电话", "地址");
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-20s %-5d %-5s %-12s %-30s\n", pc->data[i].name, pc->data[i].age,
			pc->data[i].sex, pc->data[i].tele, pc->data[i].addr);
	}
}

//查找函数,找到返回下标,找不到返回-1
int FindByName(const Contact* pc, char name[])
{
	assert(pc);
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		if (0 == strcmp(pc->data[i].name, name))
			return i;
	}
	return -1;

}

void DelContact(Contact* pc)
{
	assert(pc);
	if (pc->sz == 0)
	{
		printf("通讯录已空,无法删除\n");
		return;
	}
	//1. 找到指定联系人
	char name[NAME_MAX] = { 0 };
	printf("请输入要删除人的名字:>");
	scanf("%s", name);
	int pos = FindByName(pc, name);
	if (pos == -1)
	{
		printf("要删除的人不存在\n");
		return;
	}
	//删除
	int j = 0;
	for (j = pos; j < pc->sz - 1; j++)
	{
		pc->data[j] = pc->data[j + 1];
	}
	pc->sz--;
	printf("删除成功\n");
}

void SearchContact(const Contact* pc)
{
	assert(pc);
	if (pc->sz == 0)
	{
		printf("通讯录已空,无法查找\n");
		return;
	}
	//1. 找到指定联系人
	char name[NAME_MAX] = { 0 };
	printf("请输入要查找人的名字:>");
	scanf("%s", name);
	int pos = FindByName(pc, name);
	if (pos == -1)
	{
		printf("要查找的人不存在\n");
		return;
	}
	//找到了,打印
	printf("%-20s %-5s %-5s %-12s %-30s\n", "姓名", "年龄", "性别", "电话", "地址");
	printf("%-20s %-5d %-5s %-12s %-30s\n", pc->data[pos].name, pc->data[pos].age,
		pc->data[pos].sex, pc->data[pos].tele, pc->data[pos].addr);
}

void ModifyContact(Contact* pc)
{
	assert(pc);
	if (pc->sz == 0)
	{
		printf("通讯录已空,无法更改\n");
		return;
	}
	//1. 找到指定联系人
	char name[NAME_MAX] = { 0 };
	printf("请输入要更改人的名字:>");
	scanf("%s", name);
	int pos = FindByName(pc, name);
	if (pos == -1)
	{
		printf("要更改的人不存在\n");
		return;
	}
	//更改信息
	printf("请输入名字:>");
	scanf("%s", pc->data[pos].name);
	printf("请输入年龄:>");
	scanf("%d", &(pc->data[pos].age));
	printf("请输入性别:>");
	scanf("%s", pc->data[pos].sex);
	printf("请输入电话:>");
	scanf("%s", pc->data[pos].tele);
	printf("请输入地址:>");
	scanf("%s", pc->data[pos].addr);
	printf("更改成功\n");
}

int cmp_name(const void* e1, const void* e2)
{
	assert(e1 && e2);
	return strcmp(((PeoInfo*)e1)->name, (((PeoInfo*)e2)->name));
}
void SortContact(Contact* pc)
{
	assert(pc);
	qsort(pc->data, pc->sz, sizeof(pc->data[0]), cmp_name);
	printf("排序成功\n");
}

test.c文件

#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"

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:
			DelContact(&con);
			break;
		case SEARCH:
			SearchContact(&con);
			break;
		case MODIFY:
			ModifyContact(&con);
			break;
		case SORT:
			SortContact(&con);
			break;
		case PRINT:
			PrintContact(&con);
			break;
		case 0:
			printf("退出通讯录\n");
			break;
		default:
			printf("选择错误,请重新选择\n");
			break;
		}
	} while(input);
}
int main()
{
	test();
	return 0;
}

结语

通讯录就写完了,所谓结束也是开始,之后也会分享更多干货的,敬请期待!!!

一、题目:通讯录管理 二、目的与要求 1. 目的: (1)基本掌握面向过程程序设计的基本思路和方法; (2)达到熟练掌握C语言的基本知识和技能; (3)能够利用所学的基本知识和技能,解决简单的程序设计问题 2. 要求 基本要求: 1. 要求利用C语言面向过程的编程思想来完成系统的设计; 2. 突出C语言的函数特征,以多个函数实现每一个子功能; 3. 画出功能模块图; 4. 具有清晰的程序流程图和数据结构的详细定义; 5. 熟练掌握C语言对文件的各种操作。 创新要求: 在基本要求达到后,可进行创新设计,如系统用户功能控制,对管理员级和一般级别的用户系统功能操作不同 三、信息描述 有关该系统基本信息的描述,如:姓名、电话、城市和邮编等。 四、功能描述 1. 名单基本信息(姓名,城市,电话,邮编等)的录入,并存放在文件当中。 2. 基本信息的查询与修改。 3. 记录的添加和删除。 4. 对同一类型记录的查找:如查找同一城市的记录或同一省份的记录。 五、解决方案 1. 分析程序的功能要求,划分程序功能模块。 2. 画出系统流程图。 3. 代码的编写。定义数据结构和各个功能子函数。 4. 程序的功能调试。 5. 完成系统总结报告以及使用说明书 六、进度安排 此次课程设计时间为一周或两周,分四个阶段完成: 1. 分析设计阶段。指导教师应积极引导学生自主学习和钻研问题,明确设计要求,找出实现方法,按照需求分析、总体设计、详细设计这几个步骤进行。 2. 编码调试阶段:根据设计分析方案编写C代码,然后调试该代码,实现课题要求的功能。 3. 总结报告阶段:总结设计工作,写出课程设计说明书,要求学生写出需求分析、总体设计、详细设计、编码、测试的步骤和内容。 4. 考核阶段。 七、撰写课程设计报告或课程设计总结 课程设计报告要求: 总结报告包括需求分析、总体设计、详细设计、编码(详细写出编程步骤)、测试的步骤和内容、课程设计总结、参考资料等,不符合以上要求者,则本次设计以不及格记。
评论 30
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微yu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值