小周末学习了结构体,今天打算自己做一个通讯录,这个通讯录保存若干个用户信息,每个用户信息中包含姓名,电话。
我们想要这个通讯录可以实现增删改查的功能。
首先,首先我们要创建一个结构体,这个结构体保存了每个人的信息(姓名及电话)
typedef struct PersonInfo{
char name[NAME_MAX_SIZE];
char phone[PHONE_MAX_SIZE];
}PersonInfo;
紧接着,我们又创建一个通讯录结构体,这个结构体,包含了所有人的信息
typedef struct AddrBook{
PersonInfo persons[PERSONS_MAX_SIZE];
int size;//当前数组中有效元素的个数
}AddrBook;
我们需要与用户完成一个输入的交换过程,我们这里创建一个菜单函数
int Menu(){
printf("==================\n");
printf("欢迎使用通讯录程序\n");
printf("1.显示所有联系人信息\n");
printf("2.新增联系人信息\n");
printf("3.修改联系人信息\n");
printf("4.删除联系人信息\n");
printf("0.退出通讯录\n");
printf("==================\n");
printf("请输入您的选择:\n");
int choice = 0;
scanf("%d", &choice);
return choice;
}
其中,1,2,3,4增删改查四个功能,都是结构体传指针传参,对象都是addr_book,我们这里可以用转移表,创建一个函数指针数组来实现四个功能
typedef void(*Func)(AddrBook*)
int main(){
//主函数代码框架
Init(&addr_book);
Func func_table[] = {
//利用转移表实现四个功能
PrintAll,
Add,
Update
Remove
};
while (1){
//与用户进行交换
int choice = Menu();
if (choice < 0 || choice > 4){
printf("输入有误,请重新输入\n");
continue;
}
if (choice == 0){
printf("good bye\n");
break;
}
func_table[choice - 1](&addr_book);
}
system("pause");
return 0;
}
我们主函数中的每一个功能函数进行分析
我们需要将通讯录初始化
一开始通讯录的有效联系人是0,并且联系人的结构体中电话及姓名都是空字符串
void Init(AddrBook* addr_book){
assert(addr_book != NULL);
addr_book->size = 0;
for (int i = 0; i < PERSONS_MAX_SIZE; ++i){
memset(addr_book->persons[i].name, 0, NAME_MAX_SIZE)