一、通讯录变量的创建
【思路1】
通讯录是一个复杂的对象,包含了用户的名字、性别、年龄、电话号码和家庭住址等信息,所以需要用结构体来定义
#define NAME_MAX 20 #define SEX_MAX 6 #define TELE_MAX 20 #define ADDR_MAX 20 typedef struct PeoInfo { char name[NAME_MAX];//姓名 char sex[SEX_MAX];//性别 int age;//年龄 char tele[TELE_MAX];//电话 char addr[ADDR_MAX];//地址 }PeoInfo;
为了方便后续修改结构体中每个成员的大小范围,使用了宏定义的常量,来表示每个数组的大小。
【思路2】
(1)这是一个结构体类型,用来创造变量,一次只能创建一个,不合适,所以需要数组。
(2)因为通讯录是数组,所以需要一个变量来实时记录通讯录的个数。
(3)为了可以使用,他们需要同类型,所以还需要再创造一个结构体
#define MAX 100 typedef struct contact { PeoInfo data[MAX];//通讯录 int sz;//记录通讯录的个数 }contact;
接下来再用contact创造变量就好
contact con;//通讯录变量的创建
二、通讯录的初始化
(1)需要修改通讯录中的内容,需要传结构体的地址
InitContact(&con);//传参
2)初始化函数
void InitContact(contact* pc) { assert(pc); memset(pc->data,0,sizeof(pc->data)); pc->sz = 0;//通讯录开始的容量为0 }
(1)用assert函数判断指针是否为空,为空则会退出程序。需要包含头文件:#include<assert.h>
(2)用memset函数将通讯录中的内容设置成0即可。需要包含头文件:#include<string.h>
三、通讯录信息的添加(add)
(1)信息添加的条件
在信息添加前我们需要查看通讯录是否已满,满了则不能再继续添加信息。
传参:
AddContact(&con);
通讯录判满:
void AddContact(contact* pc) { assert(pc);//指针判空操作 if (pc->sz == MAX) { printf("通讯录已满,存入信息失败\n"); return; } }
(2)信息添加的过程
void AddContact(contact* pc) { assert(pc); if (pc->sz == MAX) { printf("通讯录已满,存入信息失败\n"); return; } printf("请输入姓名>:"); scanf("%s", pc->data[pc->sz].name); printf("请输入性别>:"); scanf("%s", pc->data[pc->sz].sex); printf("请输入年龄>:"); scanf("%d", &(pc->data[pc->sz].age)); printf("请输入电话>:"); scanf("%s", pc->data[pc->sz].tele); printf("请输入住址>:"); scanf("%s", pc->data[pc->sz].addr); pc->sz++; printf("信息添加成功\n"); }
(1)逐一对通讯录进行信息添加即可,需要注意结构体的访问方式
(2)data数组的第一个联系人的下标是0,等于sz的值
(3)信息添加的完善
以上的操作每次只能添加一个人的信息,很不方便。所以我们使用go语句循环以上的代码
void AddContact(contact* pc) { assert(pc); int adds; back://go语句标记2 if (pc->sz == MAX) { printf("通讯录已满,存入信息失败\n"); return; } printf("请输入姓名>:"); scanf("%s", pc->data[pc->sz].name); printf("请输入性别>:"); scanf("%s", pc->data[pc->sz].sex); printf("请输入年龄>:"); scanf("%d", &(pc->data[pc->sz].age)); printf("请输入电话>:"); scanf("%s", pc->data[pc->sz].tele); printf("请输入住址>:"); scanf("%s", pc->data[pc->sz].addr); pc->sz++; printf("信息添加成功\n"); //循环是否继续的判断 printf("是否继续添加联系人信息1/0:"); scanf("%d",&adds); if (adds == 1) goto back;//go语句标记1 else { return; } }
四、通讯录的打印(show)
当已经可以想通讯录中添加了联系人信息之后,就可以将他们的信息打印在屏幕上进行验证:
(1)可以打印通讯录的条件
传参:
ShowContact(&con);
通讯录判空:
void ShowContact(contact* pc) { assert(pc); if (pc->sz == 0) { printf("通讯录为空\n"); return; } }
如果通讯录一个信息都没有,将不会打印
(2)通讯录的打印
void ShowContact(contact* pc) { assert(pc); if (pc->sz == 0) { printf("通讯录为空\n"); return; } printf("%-10s %-5s %-10s %-15s %-10s\n","名字","性别","年龄","电话","住址"); int i = 0; for (i=0;i<pc->sz;i++) { printf("%-10s %-5s %-10d %-15s %-10s\n", pc->data[i].name, pc->data[i].sex, pc->data[i].age, pc->data[i].tele, pc->data[i].addr); } printf("\n"); }
(1)通讯录打印的时候,注意打印的格式
(2)%-10s:实现的是左对齐
五、删除联系人(del)
(1)通讯录的判空
传参:
DelContact(&con);
判空:
void DelContact(contact* pc) { assert(pc); if (pc->sz == 0) { printf("通讯录为空,删除失败\n"); return; } }
(2)删除联系人的条件
如果需要删除的联系人不存在,那么也将会删除失败。所以需要查找联系人是否存在
查找函数:(联系人存在,返回联系人的下标;不存在返回-1)
传参:
printf("请输入你要删除的联系人:"); char name[NAME_MAX]; scanf("%s",name); int ret = FindContact(pc,name);
static int FindContact(contact* pc,char name[]) { assert(pc); int i = 0; for (i=0;i<pc->sz;i++) { if (strcmp(name, pc->data[i].name) == 0) return i; } return -1; }
(3)删除操作
void DelContact(contact* pc) { assert(pc); if (pc->sz == 0) { printf("通讯录为空,删除失败\n"); return; } printf("请输入你要删除的联系人:"); char name[NAME_MAX]; scanf("%s",name); int ret = FindContact(pc,name); if (ret == -1) { printf("联系人不存在,删除失败\n"); return; } int i = 0; for (i=ret;i<pc->sz-1;i++) { pc->data[i] = pc->data[i + 1]; } pc->sz--; printf("删除联系人成功\n"); }