😊前言:😊
在前面的学习中,我们学习了结构体的相关知识常见结构体知识大全。为了更好的帮助各位小伙伴们理解和学会使用结构体,今天我们就来尝试通过使用结构体, 零基础 编写出我们自己的通讯录。我们知道,普通的通讯录功能就这几个:增加新联系人、删除联系人、查找联系人、修改联系人信息、对联系人信息进行打印,对联系人进行排序这六个功能,下面我们就来一一实现他们。
😉1.文件的建立:😉
我们还是按照标准工程格式,分别建立三个文件:
①.头文件Contact.h:
该文件是用于包含其它头文件,并存放功能实现函数的函数声明。
②.函数定义文件Contact.c:
这个文件主要是用于书写所有的程序功能实现的函数定义。一来将所有定义书写在一起便于我们进行阅读、修改;二来大大提升了程序的可移植性。第三点最重要,我们可以将其设置为静态库从而实现对我们函数代码的隐藏。
③.工程测试文件test.c:
我们在这个文件里去书写我们的程序主体部分,并对程序进行执行逻辑的编辑和检查。结合前两个文件的使用,可以使得我们的程序逻辑变得清晰,极有利于我们进行程序的运行逻辑检查。
😃2.头文件contact.h的声明:😃
首先我们要搞清楚我们的操作对象究竟是谁,我们可以想一想,我们平常在使用通讯录时,我们的操作对象应当是一个一个的联系人,以及每一个联系人的相关信息,于是在这里,我们使用结构体来进行实现:
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 **,接着我们在结构体内部创建了姓名、性别、年龄、联系方式与住址五个结构体成员,以用于存储结构体变量的信息。
然而我们要知道一个通讯录里到底存了多少人,必须有一个变量来记录这个个数,所以我们可以再创建一个结构体用来封装这两个需要进行传参的数据:
typedef struct contact { PeoInfo data[MAX]; int sz; }contact;
并且为了以后便于对通讯录大小进行修改和维护,我们使用宏定义来确定来联系人各项信息的最大值:
#defin
#define MAX 1000 #define MAX_NAME 20 #define MAX_SEX 5 #define MAX_TELE 12 #define MAX_ADDR 30
最后,我们要对test.c在contact.c里引用的函数进行声明:(这里只是先声明函数,后面都会一一讲解)
//初始化通讯录 void InitContact(Contact* pc); //增加联系人 void AddContact(Contact* pc); //删除指定联系人 void DelContact(Contact* pc); //显示通讯录中的信息 void ShowContact(const Contact* pc); //查找指定联系人 void SearchContact(const Contact* pc); //修改指定联系人 void ModifyContact(Contact* pc); //排序联系人 void sortContact(contact* con);
🤐3.测试文件test.c的实现:🤐
首先我们自定义两个函数,menu 为菜单函数,负责向玩家打印游戏菜单;Contact 为通讯录功能函数,负责实现整个通讯录功能的逻辑实现:
#include<stdio.h> void menu() { ... } void Contact() { ... } int main() { Contact(); return 0; }
3.1菜单menu的打印:
这个函数很容易实现,我们就不再多说:😘
#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("************ 6.sort **************\n"); printf("************ 0.exit**************\n"); printf("**********************************\n"); }
3.2通讯录contact函数:
3.2.1通讯录的初始化:
首先我们要对通讯录初始化(* 初始化函数Initcontact会在contact.c文件中介绍 *)对创建好的初始通讯录进行初始化,否则内部的数据将为随机值而无法预测,导致程序的不合法:
void Contact() { int input = 0; contact con; Initcontact(&con);
3.2.2 do while循环和switch语句实现用户选择
那么,我们如何将菜单,使用者的选择结合在一起,并循环使用呢?
我们通过使用 do…while 循环语句,保证了我们程序的多次执行。并且我们通过将 输入值 input 作为循环判断条件,既减少了变量的创建从而节省了空间,也避免了因输入错误导致直接跳出执行。同时,通过借助 switch 分支语句 ,我们也实现了对通讯录不同功能的调用和对输入选择的合法性检测:
do { menu(); printf("请选择>"); scanf("%d", &input); switch (input) { case 1: AddContact(&con); break; case 2: DelContact(&con); break; case 3: SeachContact(&con); break; case 4: ModifyContact(&con); break; case 5: PrintContact(&con); break; case 6: sortContact(&con); break; case 0: printf("已成功退出"); break; default: printf("输入错误,请重新输入\n"); break; } } while (input); }
3.3主函数:
主函数也很简单,没有什么说的😊
int main() { Contact(); return 0; }