【C语言进阶】通讯录不好用?进来,零基础带你写出自己的通讯录

目录

🤩前言🤩:

😎正文:编写通讯录😎:

        1.文件建立:

        ①.头文件Contact.h:

        ②.函数定义文件Contact.c:

        ③.工程测试文件test.c:

        2.通讯录整体执行思路:

        3. menu 菜单函数实现:

        4. Contact 通讯录函数逻辑:

        5. Contact 函数中各功能的实现:

        ①.头文件 Contact.h:

        ②.初始化通讯录:

        ③.“打印联系人信息”PrintContact:

        ④.“打印全部联系人信息”PrintAllContact:

        ⑤.“增加联系人信息” AddContact:

        ⑥.“删除联系人信息”DelContact:

        ⑦.“查找联系人”SearchContact:

        ⑧.“修改联系人信息”ModifyContact:

🤠全部源码🤠:

        1.头文件Contact.h:

        2.函数实现Contact.c:

        3.程序主体test.c:

🥳总结🥳:


🛰️博客主页:✈️銮同学的干货分享基地

🛰️欢迎关注:👍点赞🙌收藏✍️留言

🛰️系列专栏:💐【进阶】C语言学习

🛰️代码仓库:🎉VS2022_C语言仓库

        家人们更新不易,你们的👍点赞👍和👉关注👈真的对我真重要,各位路过的友友麻烦多多点赞关注,欢迎你们的私信提问,感谢你们的转发!

        关注我,关注我,关注我,你们将会看到更多的优质内容!!


🏡🏡本文重点 🏡🏡:

🚅  编写静态通讯录(源码在结尾) 🚏🚏

🤩前言🤩:

        在前面的三节课中,我们学习了三种类型结构体:结构、枚举和联合,以及它们的作用原理、定义方式与大小计算等等相关知识。为了更好的帮助各位小伙伴们理解和学会使用结构体,今天我们就来尝试通过使用结构体, 零基础 编写出我们自己的通讯录

😎正文:编写通讯录😎:

        今天我们的目标是,要写出我们自己满意的通讯录,我们目标期望的通讯录主要包含五个基础功能:增、删、查、改、印,即增加新联系人删除联系人查找联系人修改联系人信息对联系人信息进行打印五个功能,

        1.文件建立:

        我们还是按照标准工程格式,分别建立三个文件:

        ①.头文件Contact.h:

        该文件是用于包含其它头文件,并存放功能实现函数的函数声明。好处是可以整合整个程序中所用到的全部头文件和函数声明,一目了然。并在引用时只需引用头文件game.h,其它被包含的头文件与函数声明均生效

        ②.函数定义文件Contact.c:

        这个文件主要是用于书写所有的程序功能实现的函数定义。一来将所有定义书写在一起便于我们进行阅读、修改;二来大大提升了程序的可移植性,当他人想要使用我们定义的函数时,只需将整个game.c文件发送给对方即可;第三点最重要,我们可以将其设置为静态库从而实现对我们函数代码的隐藏

        ③.工程测试文件test.c:

        我们在这个文件里去书写我们的程序主体部分,并对程序进行执行逻辑的编辑和检查。结合前两个文件的使用,可以使得我们的程序逻辑变得清晰,极有利于我们进行程序的运行逻辑检查

        2.通讯录整体执行思路:

        与之前写过的小游戏项目整体执行思路相同,首先我们自定义两个函数,menu 为菜单函数,负责向玩家打印游戏菜单Contact 为通讯录功能函数,负责实现整个通讯录功能的逻辑实现。当程序开始编译运行后,将会按照顺序,先执行 menu 函数打印出通讯录功能选项菜单,接着执行 Contact 函数为使用者提供相关功能服务

#include<stdio.h>

void menu()
{
	...
}

void Contact()
{
    ...
}

int main()
{
	Contact();

	return 0;
}

        同时,我们在使用通讯录时,往往会出现一次性添加、删除或修改多个联系人信息的场景,于是我们就需要让我们的程序多次循环的执行

void Contact()
{
	int input = 0;
	do
	{
		menu();
		printf("请您进行选择:> ");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			break;
		case 2:
			break;
		case 3:
			break;
		case 4:
			break;
		case 5:
			break;
		case 0:
			printf("正在退出!\n");
			break;
		default:
			printf("您的选择有误,请重新选择!\n");
		}
	} while (input);
}

        我们通过使用 do...while 循环语句,保证了我们程序的多次执行。并且我们通过将输入值 input 作为循环判断条件,既减少了变量的创建从而节省了空间,也避免了因输入错误导致直接跳出执行。同时,通过借助 switch 分支语句,我们也实现了对通讯录不同功能的调用和对输入选择的合法性检测

        通过编译运行验证主体功能实现情况:

        可以看到,整个程序的多次循环及功能选择模块已经成功实现,至此程序主体部分就已经书写完毕,接下来只需完成各个功能模块的逻辑实现即可。

        3. menu 菜单函数实现:

        在上面我们已经确定好了函数的主体实现逻辑,接下来就是实现各个功能模块。首当其冲的便是向用户反馈通讯录程序功能的 menu 菜单函数,该模块的功能仅仅是将通讯录程序的各项功能在屏幕上进行打印以向玩家进行功能说明,并没有进行实质上的代码逻辑处理,我们直接进行打印即可

void menu()
{
	printf("**********************************\n");
	printf("**********************************\n");
	printf("******** 欢迎使用本通讯录 ********\n");
	printf("**********************************\n");
	printf("***** 本通讯录现提供以下功能 *****\n");
	printf("************ 1.Add  **************\n");
	printf("************ 2.Del  **************\n");
	printf("************ 3.Search ************\n");
	printf("************ 4.Modify ************\n");
	printf("************ 5.Print *************\n");
	printf("************ 0.Exit  *************\n");
	printf("**********************************\n");
	printf("**********************************\n");
}

        我们很容易就能实现,将其编译运行起来查看反馈效果

        时至今日,这一模块的编写对各位小伙伴们来说应该已经是驾轻就熟了,我们不再作过多强调,直接进入下一部分功能模块的编写

        4. Contact 通讯录函数逻辑:

        (注:此处我们只关心实现逻辑,而具体功能的实现会在后面逐一进行讲解

        菜单成功打印,程序的主体实现逻辑也已经确定好了,接下来便是对我们通讯录的功能实现方式进行设计与编写了。

        首先我们要搞清楚我们的操作对象究竟是谁,我们可以想一想,我们平常在使用通讯录时,我们的操作对象应当是一个一个的联系人,以及每一个联系人的相关信息,于是我们可以想见,我们需要一种 “ 包 ” 来实现对每一个联系人信息的封装,于是在这里,我们使用结构体来进行实现:

typedef struct PeoInfo
{
	char name[MAX_NAME];
    //联系人信息:姓名
	char sex[MAX_SEX];
    //联系人信息:性别
	int age;
    //联系人信息:年龄
	char tele[MAX_TELE];
    //联系人信息:联系方式
	char addr[MAX_ADDR];
    //联系人信息:住址
}PeoInfo;

        我们可以在头文件中(全局的)定义一个名为 PeoInfo (译:个人信息,可自定义)的结构体类型 struct PeoInfo,并使用 typedef 关键字将该类型重命名为 PeoInfo ,接着我们在结构体内部创建了姓名、性别、年龄、联系方式与住址五个结构体成员,以用于存储结构体变量的信息。

        于是在我们想要执行功能之前,应当首先创建出一个用于储存联系人信息的结构体数组,并创建变量 sz 用于记录已存入的联系人数量

void Contact()
{
	int input = 0;
    
    //创建能够容纳1000个联系人相关信息的结构体数组:
	PeoInfo data[1000];
    //创建变量 sz 用于记录联系人数量
    int sz = 0;

	do
	{
		...
		switch (input)
		{
		    ...
		}
	} while (input);
}

        但是我认为这样的方式在进行传参时既要传递数组,又要传递变量的地址,还是有些繁琐,并且既然今天我们是针对结构体进行的实例练习,我们大可以再创建一个结构体用来封装这两个需要进行传参的数据

typedef struct contact
{
	PeoInfo data[MAX];
	int sz;
}contact;

        并且为了以后便于对通讯录大小进行修改和维护,我们使用宏定义来确定来联系人各项信息的最大值

#define MAX 1000
#define MAX_NAME 20
#define MAX_SEX 5
#define MAX_TELE 12
#define MAX_ADDR 30

        并且我们还知道,枚举类型中各成员的值为从零开始依次递增,于是我们可以再使用一个枚举类型来使我们的选项对应用户的选择

enum Option
{
	Exit,//值为0
	Add,//值为1
	Del,//值为2
	Search,//值为3
	Modify,//值为4
    Print//值为5
};

        接着按照上面我们已经确定的执行思路,根据用户的不同选择通过分支语句实现各实功能

        (注:这里不考虑增删查改功能的具体实现,后面会逐一进行讲解)

void Contact()
{
	int input = 0;
	contact con;
	do
	{
		menu();
		printf("请您进行选择:> ");
		scanf("%d", &input);
		switch (input)
		{
		case Add:
			AddContact();
			break;
		case Del:
			DelContact();
			break;
		case Search:
			SearchContact();
			break;
		case Modify:
			ModifyContact();
			break;
			break;
        case Print:
            PrintAllContact();
            break;
		case 0:
			printf("正在退出!\n");
			break;
		default:
			printf("您的选择有误,请重新选择!\n");
		}
	} while (input);
}

        这样,通讯录的大致逻辑就编辑完成了,而接下来各项功能的实现才是重头戏。

        5. Contact 函数中各功能的实现:

        ①.头文件 Contact.h:

        头文件中的内容存放的是其它头文件宏定义函数声明

        (注:这里只需要大致知道里面存放的内容即可,各内容在后面会逐一讲解)

#define MAX 1000
#define MAX_NAME 20
#define MAX_SEX 5
#define MAX_TELE 12
#define MAX_ADDR 30

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

enum Option
{
	Exit,//值为0
	Add,//值为1
	Del,//值为2
	Search,//值为3
	Modify,//值为4
	Print//值为5
};

typedef struct PeoInfo
{
	char name[MAX_NAME];
	char sex[MAX_SEX];
	int age;
	char tele[MAX_TELE];
	char addr[MAX_ADDR];
}PeoInfo;

typedef struct contact
{
	PeoInfo data[MAX];
	int sz;
}contact;

void InitContact(contact* p);
void PrintContact(const contact* p, int x);
void PrintAllContact(const contact* p);
void AddContact(contact* p);
void DelContact(contact* p);
void SearchContact(const contact* p);
void ModifyContact(const contact* p);

        ②.初始化通讯录:

        我们在创建好通讯录后,需要对创建好的初始通讯录进行初始化,否则内部的数据将为随机值而无法预测,导致程序的不合法:

//创建通讯录:
contact con;
//将其初始化:
InitContact(&con);

       我们对通讯录的初始化是通过函数调用实现的,所以在对通讯录结构体成员进行修改时是需要通过结构体指针进行访问的。

        首先我们将统计变量 sz 初始化为0,即表示最初的通讯录中的联系人信息数量为0:

void InitContact(contact* p)
{
	p->sz = 0;
}

        接着,既然没有联系人信息,为了避免随机值对程序造成影响,我们就通过使用之前讲过的 memset 函数将联系人信息 data 内数据全部初始化为0

void InitContact(contact* p)
{
	p->sz = 0;
	memset(p->data, 0, sizeof(p->data));
	//使用memeset函数将p->data所指向的空间中的数据初始化为0
	//操作的空间大小为sizeof函数所计算出的p->data所指向空间的大小,即整个无联系人数据的结构体数组data所占的空间的大小
}

        ③.“打印联系人信息”PrintContact:

        打印单个联系人信息很好处理,直接打印即可,因为这里我们不需要对传入地址内的数据进行修改,所以在数组传参时,我们可以使用 const 对其进行修饰,并实现打印:

void PrintContact(const contact* p, int x)
{
	assert(p);
	printf(" 联系人 :%04d\n", x + 1);
	printf(" 姓  名 :%s\n", p->data[x].name);
	printf(" 性  别 :%s\n", p->data[x].sex);
	printf(" 年  龄 :%d\n", p->data[x].age);
	printf("联系方式:%s\n", p->data[x].tele);
	printf("当前住址:%s\n", p->data[x].addr);
}

        ④.“打印全部联系人信息”PrintAllContact:

        首先这个函数可以作为单个功能,用于方便我们查看当前通讯录内的联系人存储信息,再者我们在删除联系人时,需要了解联系人的储存情况,进而准确的删除我们想要删除的特定联系人信息

        同时,这个函数的作用为打印全部的联系人信息,因此不需要对特定的下标进行处理,直接在函数内部定义变量 i 作为下标即可(可以自己根据情况调整打印格式):

void PrintAllContact(const contact* p)
{
	assert(p);
	printf("联系人 姓名                性别  年龄   联系方式      住址\n");
	int i = 0;
	for (i = 0; i < p->sz; i++)
	{
		printf(" %04d  %-20s %-5s %-4d %-12s %-30s\n", i + 1, p->data[i].name, p->data[i].sex, p->data[i].age, p->data[i].tele, p->data[i].addr);
	}
}

        ⑤.“增加联系人信息” AddContact:

        首先我们在函数调用时,因为我们要对内存中的数据进行实际的修改,故使用传址调用,应当向函数传入存放着结构体数组地址(数组名为首元素地址)与计数变量 sz 的 contact 类型结构体变量 con 的地址

AddContact(&con);

        接着便对 AddContact 函数功能实现进行设计。函数功能部分很简单,每次询问一项联系人信息,然后由用户输入该项信息,并向该联系人保存地址处存入该信息。但是在这个期间仍有很多的细节需要我们去注意。

        要注意的第一个要点是信息存入的地址,我们对于通讯录的访问是通过指针进行的,所以信息的存入地址一定是对应的存入地址,数组应当使用指针进行访问,变量则应当使用取地址操作符进行访问

void AddContact(contact* p)
{
	printf("请输入联系人姓名:>");
	scanf("%s", p->data[p->sz].name);
	printf("请输入联系人性别:>");
	scanf("%s", p->data[p->sz].sex);
	printf("请输入联系人年龄:>");
	scanf("%d", &(p->data[p->sz].age));
	printf("请输入联系人联系方式:>");
	scanf("%s", p->data[p->sz].tele);
	printf("请输入联系人住址:>");
	scanf("%s", p->data[p->sz].addr);
	PrintContact(p, p->sz);
	printf("联系人信息添加成功!\n");
	p->sz++;
}

        并且而我们还注意到这里有一个很巧妙的设计,那就是我们在进行访问时,数组的下标恰好与我们初始化的统计变量 sz 相同,并且在每次存储完联系人信息后,我们对会将用于统计联系人数量的统计变量sz 加上一,这时它又变成了下一次需要访问时的结构体数组的下标了

        并且我们在进行存储前还应当进行一次判断,即判断通讯簿内是否已经存满了联系人信息,如果已经存满了联系人信息,则应当提示用户没有足够的空间;若没有存满则将用户输入的联系人信息存入位置并打印反馈存入的联系人信息

void AddContact(contact* p)
{
	if (p->sz == MAX)
	{
		printf("通讯录空间不足,无法添加新成员!\n");
	}
	else
	{
		printf("请输入联系人姓名:>");
		scanf("%s", p->data[p->sz].name);
		printf("请输入联系人性别:>");
		scanf("%s", p->data[p->sz].sex);
		printf("请输入联系人年龄:>");
		scanf("%d", &(p->data[p->sz].age));
		printf("请输入联系人联系方式:>");
		scanf("%s", p->data[p->sz].tele);
		printf("请输入联系人住址:>");
		scanf("%s", p->data[p->sz].addr);
		PrintContact(p, p->sz);
		printf("联系人信息添加成功!\n");
		p->sz++;
	}
}

        ⑥.“删除联系人信息”DelContact:

        在想要删除联系人信息时,我们首先应当对通讯录中的内容进行判断,如果此时通讯录中没有存储任何联系人的信息,则应当提示用户没有联系人信息

if (p->sz == 0)
{
    printf("对不起,当前通讯录中没有联系人信息!\n");
}

        否则,即通讯录中保存有联系人信息时,则首先将当前通讯录中的所有联系人信息进行打印供用户确认,当用户希望删除某一联系人信息时,允许用户通过输入联系人的编号来删除该联系人

        删除时,我们的实现方式是,让选中联系人的后一个联系人将其覆盖,并以此类推至后面的所有联系人,并在完成后,将统计变量减一,即缩短联系人信息数组

        并在删除后将删除后的通讯录打印出来反馈给用户

void DelContact(contact* p)
{
	assert(p);
	int num = 0;
	if (p->sz == 0)
	{
		printf("对不起,当前通讯录中没有联系人信息!\n");
	}
	else
	{
		PrintAllContact(p);
		printf("请输入您想删除的联系人编号:>");
		scanf("%d", &num);
		int x = num - 1;
		if (0 < x && x < p->sz)
		{
			int j = 0;
			for (j = x; j < p->sz; j++)
			{
				p->data[j] = p->data[j + 1];
				p->sz--;
			}
			PrintAllContact(p);
		}
	}
}

        ⑦.“查找联系人”SearchContact:

        查找联系人的逻辑很简单,我们只需要定义一个字符串,然后让用户输入想要查找的联系人的姓名,接着我们就可以将通讯录中的联系人姓名与用户输入的姓名,使用遍历与 strcmp 函数进行比较,若相同,则将下标传递给 PrintContact 函数进行打印并跳出循环,若遍历结束全部找完仍没有找到相同的字符串,则提示用户联系人不存在

void SearchContact(const contact* p)
{
	assert(p);
	char name[MAX_NAME] = { 0 };
	printf("请输入您想要查询的联系人姓名:>");
	scanf("%s", &name);
	int i = 0;
	int ret = 1;
	for (i = 0; i < p->data; i++)
	{
		if (0 == strcmp(p->data[i].name, name))
		{
			PrintContact(p, i);
			ret = 0;
			break;
		}
	}
	if (ret)
	{
		printf("未找到该联系人!\n");
	}
}

        ⑧.“修改联系人信息”ModifyContact:

        修改的原理也很简单,首先我们同样对通讯录中的内容进行判断,内容为空则提示通讯录中没有联系人信息,否则提示进行修改

        在修改时,首先打印当前通讯录内全部信息供用户进行选择,用户可以通过联系人编号选择修改目标(获取下标),并选择想要修改的内容,再通过 switch 语句实现对目标内容的修改,最后将修改后的信息打印反馈给用户:

void ModifyContact(contact* p)
{
	assert(p);
	int x = 0;
	int input = 0;
	if (p->sz == 0)
	{
		printf("对不起,当前通讯录中没有联系人信息!\n");
	}
	else
	{
		PrintAllContact(p);
		printf("请输入您想要修改的联系人编号:>");
		scanf("%d", &x);
		PrintContact(p, x - 1);
		printf("当前支持修改的信息:\n");
		printf("1.Name\n");
		printf("2.Sex\n");
		printf("3.Age\n");
		printf("4.Tele\n");
		printf("5.Addr\n");
		printf("请选择您想要修改的信息:>");
		scanf("%d", &input);
		while (input)
		{
			switch (input)
			{
			case 1:
				printf("请输入联系人姓名:");
				scanf("%s", p->data[x - 1].name);
				printf("修改成功!\n");
				PrintContact(p, x - 1);
				input = 0;
				break;
			case 2:
				printf("请输入联系人性别:");
				scanf("%s", p->data[x - 1].sex);
				printf("修改成功!\n");
				PrintContact(p, x - 1);
				input = 0;
				break;
			case 3:
				printf("请输入联系人年龄:");
				scanf("%d", &(p->data[x - 1].age));
				printf("修改成功!\n");
				PrintContact(p, x - 1);
				input = 0;
				break;
			case 4:
				printf("请输入联系人联系方式:");
				scanf("%s", p->data[x - 1].tele);
				printf("修改成功!\n");
				PrintContact(p, x - 1);
				input = 0;
				break;
			case 5:
				printf("请输入联系人住址:");
				scanf("%s", p->data[x - 1].addr);
				printf("修改成功!\n");
				PrintContact(p, x - 1);
				input = 0;
				break;
			default:
				printf("您的选择有误,请重新选择!\n");
				break;
			}
		}
	}
}

🤠全部源码🤠:

        1.头文件Contact.h:

#pragma once

#define MAX 1000
#define MAX_NAME 20
#define MAX_SEX 5
#define MAX_TELE 12
#define MAX_ADDR 30

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

enum Option
{
	Exit,//值为0
	Add,//值为1
	Del,//值为2
	Search,//值为3
	Modify,//值为4
	Print//值为5
};

typedef struct PeoInfo
{
	char name[MAX_NAME];
	char sex[MAX_SEX];
	int age;
	char tele[MAX_TELE];
	char addr[MAX_ADDR];
}PeoInfo;

typedef struct contact
{
	PeoInfo data[MAX];
	int sz;
}contact;

void InitContact(contact* p);
void PrintContact(const contact* p, int x);
void PrintAllContact(const contact* p);
void AddContact(contact* p);
void DelContact(contact* p);
void SearchContact(const contact* p);
void ModifyContact(const contact* p);

        2.函数实现Contact.c:

#define _CRT_SECURE_NO_WARNINGS 1

#include"Contact.h"

void InitContact(contact* p)
{
	assert(p);
	p->sz = 0;
	memset(p->data, 0, sizeof(p->data));
	//使用memeset函数将p->data所指向的空间中的数据初始化为0
	//操作的空间大小为sizeof函数所计算出的p->data所指向空间的大小,即整个无联系人数据的结构体数组data所占的空间的大小
}

void PrintContact(const contact* p, int x)
{
	assert(p);
	printf(" 联系人 :%04d\n", x + 1);
	printf(" 姓  名 :%s\n", p->data[x].name);
	printf(" 性  别 :%s\n", p->data[x].sex);
	printf(" 年  龄 :%d\n", p->data[x].age);
	printf("联系方式:%s\n", p->data[x].tele);
	printf("当前住址:%s\n", p->data[x].addr);
}

void PrintAllContact(const contact* p)
{
	assert(p);
	printf("联系人 姓名                性别  年龄   联系方式      住址\n");
	int i = 0;
	for (i = 0; i < p->sz; i++)
	{
		printf(" %04d  %-20s %-5s %-4d %-12s %-30s\n", i + 1, p->data[i].name, p->data[i].sex, p->data[i].age, p->data[i].tele, p->data[i].addr);
	}
}

void AddContact(contact* p)
{
	assert(p);
	if (p->sz == MAX)
	{
		printf("通讯录空间不足,无法添加新成员!\n");
	}
	else
	{
		printf("请输入联系人姓名:>");
		scanf("%s", p->data[p->sz].name);
		printf("请输入联系人性别:>");
		scanf("%s", p->data[p->sz].sex);
		printf("请输入联系人年龄:>");
		scanf("%d", &(p->data[p->sz].age));
		printf("请输入联系人联系方式:>");
		scanf("%s", p->data[p->sz].tele);
		printf("请输入联系人住址:>");
		scanf("%s", p->data[p->sz].addr);
		PrintContact(p, p->sz);
		printf("联系人信息添加成功!\n");
		p->sz++;
	}
}

void DelContact(contact* p)
{
	assert(p);
	int num = 0;
	if (p->sz == 0)
	{
		printf("对不起,当前通讯录中没有联系人信息!\n");
	}
	else
	{
		PrintAllContact(p);
		printf("请输入您想删除的联系人编号:>");
		scanf("%d", &num);
		int x = num - 1;
		if (0 < x && x < p->sz)
		{
			int j = 0;
			for (j = x; j < p->sz; j++)
			{
				p->data[j] = p->data[j + 1];
				p->sz--;
			}
			PrintAllContact(p);
		}
	}
}

void SearchContact(const contact* p)
{
	assert(p);
	char name[MAX_NAME] = { 0 };
	printf("请输入您想要查询的联系人姓名:>");
	scanf("%s", &name);
	int i = 0;
	int ret = 1;
	for (i = 0; i < p->data; i++)
	{
		if (0 == strcmp(p->data[i].name, name))
		{
			PrintContact(p, i);
			ret = 0;
			break;
		}
	}
	if (ret)
	{
		printf("未找到该联系人!\n");
	}
}

void ModifyContact(contact* p)
{
	assert(p);
	int x = 0;
	int input = 0;
	if (p->sz == 0)
	{
		printf("对不起,当前通讯录中没有联系人信息!\n");
	}
	else
	{
		PrintAllContact(p);
		printf("请输入您想要修改的联系人编号:>");
		scanf("%d", &x);
		PrintContact(p, x - 1);
		printf("当前支持修改的信息:\n");
		printf("1.Name\n");
		printf("2.Sex\n");
		printf("3.Age\n");
		printf("4.Tele\n");
		printf("5.Addr\n");
		printf("请选择您想要修改的信息:>");
		scanf("%d", &input);
		while (input)
		{
			switch (input)
			{
			case 1:
				printf("请输入联系人姓名:");
				scanf("%s", p->data[x - 1].name);
				printf("修改成功!\n");
				PrintContact(p, x - 1);
				input = 0;
				break;
			case 2:
				printf("请输入联系人性别:");
				scanf("%s", p->data[x - 1].sex);
				printf("修改成功!\n");
				PrintContact(p, x - 1);
				input = 0;
				break;
			case 3:
				printf("请输入联系人年龄:");
				scanf("%d", &(p->data[x - 1].age));
				printf("修改成功!\n");
				PrintContact(p, x - 1);
				input = 0;
				break;
			case 4:
				printf("请输入联系人联系方式:");
				scanf("%s", p->data[x - 1].tele);
				printf("修改成功!\n");
				PrintContact(p, x - 1);
				input = 0;
				break;
			case 5:
				printf("请输入联系人住址:");
				scanf("%s", p->data[x - 1].addr);
				printf("修改成功!\n");
				PrintContact(p, x - 1);
				input = 0;
				break;
			default:
				printf("您的选择有误,请重新选择!\n");
				break;
			}
		}
	}
}

        3.程序主体test.c:

#define _CRT_SECURE_NO_WARNINGS 1

#include"Contact.h"

void menu()
{
	printf("**********************************\n");
	printf("**********************************\n");
	printf("******** 欢迎使用本通讯录 ********\n");
	printf("**********************************\n");
	printf("***** 本通讯录现提供以下功能 *****\n");
	printf("************ 1.Add ***************\n");
	printf("************ 2.Del ***************\n");
	printf("************ 3.Search ************\n");
	printf("************ 4.Modify ************\n");
	printf("************ 5.Print *************\n");
	printf("************ 0.Exit **************\n");
	printf("**********************************\n");
	printf("**********************************\n");
}

void Contact()
{
	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 Print:
			PrintAllContact(&con);
			break;
		case 0:
			printf("正在退出!\n");
			break;
		default:
			printf("您的选择有误,请重新选择!\n");
			break;
		}
	} while (input);
}

int main()
{
	Contact();

	return 0;
}

🥳总结🥳:

        到这里,我们的基础通讯录功能就得以实现啦,不过作为基础版本的它仍然存在着许多缺陷,例如缺少了许多的合法性检测,很多地方的输入将不能保证其正确性。同时我们也仍可以再向其中添加更多例如字典排序等等实用的功能。而关于这些内容的讲解我也将在下一篇文章中带领大家一起完成

        🔥🔥有那么多人看着你等着你倒下,所以你你拼了命也不能输!!!🔥🔥

        更新不易,辛苦各位小伙伴们动动小手,👍三连走一走💕💕 ~ ~ ~  你们真的对我很重要!最后,本文仍有许多不足之处,欢迎各位认真读完文章的小伙伴们随时私信交流、批评指正!

  • 44
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 55
    评论
评论 55
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

銮崽的干货分享基地

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

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

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

打赏作者

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

抵扣说明:

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

余额充值