优化2
对于switch语句,我们不能很清晰的知道1 2 3 4 5 0分别对应的是什么操作,
所以我们就可以使用枚举
默认值从0到5
enum Option { EXIT,//0 ADD,//1 DEL,//2 SEARCH, MODIFY, SHOW,//5 };
DelContact函数
两种方法
删除指定用户数据,后面的数据向前移位
或者 :将最后一个数据放到删除数据的位置上
此处介绍第一种方法
实现步骤
1.查找该用户
使用遍历查找
2.删除数据
代码如下
void DelContact(struct Contract* ps) { char name[MAX_NAME]; printf("请输入要删除用户的名字:>"); scanf("%s", name); //1查找用户数据 int i = 0; for (i = 0; i < (ps->size); i++) { if (strcmp(ps->data[i].name, name) == 0) { break; } } //2 删除 if (i == ps->size) { printf("该用户不存在\n"); } else { int j = 0; for (j = i; j < (ps->size) - 1; j++) { ps->data[j] = ps->data[j + 1]; } ps->size--; printf("删除完成\n"); } }
SearchContract函数
优化3
在编写这个函数的时候,我们会发现,对于遍历查找用户的代码,我们又写了一遍,这就发生了代码冗余,那么我们就可以单独封装一个FindByName函数,用于查找用户
其实就是:将遍历查找的过程单独封装一个函数
static int FindByName(struct Contract* ps, char name[MAX_NAME]) { int i = 0; for (i = 0; i < (ps->size); i++) { if (strcmp(ps->data[i].name, name) == 0) { return i; } } return -1; }
在定义时,加上static,让这个函数只能在自己所在的源文件内部看到及使用,
不会被外界看到
SearchContract代码如下
void SearchContract(const struct Contract* ps) { char name[MAX_NAME]; printf("请输入要查找的用户姓名:>"); scanf("%s", name); int pos = FindByName(ps, name); //对于函数,找到用户返回下标 //没找到就返回-1 if (pos == -1) { printf("用户不存在\n"); } else { printf("%20s\t%4s\t5s\t%12s\t%20s", "名字", "年龄", "性别", "电话", "地址"); printf("%20s\t%4s\t5s\t%12s\t%20s", ps->data[pos].name, ps->data[pos].age, ps->data[pos].sex, ps->data[pos].tele, ps->data[pos].addr); } }
MODIFY函数
利用之前编写的FindByName和Addcontract函数的部分内容
void ModifyContract(struct Contract* ps) { char name[MAX_NAME]; printf("请输入要修改用户的名字:>"); scanf("%s", name); int pos = FindByName(ps, name); if (pos == -1) { printf("用户不存在\n"); } else { printf("请输入名字:>"); scanf("%s", ps->data[pos].name); printf("请输入年龄:>"); scanf("%s", &(ps->data[pos].age)); printf("请输入性别:>"); scanf("%s", ps->data[pos].sex); printf("请输入电话:>"); scanf("%s", ps->data[pos].tele); printf("请输入地址:>"); scanf("%s", ps->data[pos].addr); printf("修改成功\n"); } }
最终代码
test.c
#define _CRT_SECURE_NO_WARNINGS 1 #include"contract.h" void menu() { printf("**************************************\n"); printf("**********1.add 2.del *******\n"); printf("**********3.search 4.modify *******\n"); printf("**********5.show 6.sort *******\n"); printf("**********0.exit *******\n"); printf("**************************************\n"); printf("**************************************\n"); } int main() { int input = 0; //int size = 0;//创建一个变量来记录通讯录里面已经存储了多少个用户数据 //int max = MAX;//创建一个变量来记录通讯录最多可以存储多少个用户数据:即MAX struct Contract con;//con就是创建的通讯录,里面有一个元素个数为1000的数组和size变量 struct PeoInfo con[MAX] = { 0 };//自定义要存放的用户数量 InitContract(&con);//初始化通讯录 do { menu(); printf("请选择:>"); scanf("%d", &input); //switch(input) //{ //case 1: // //AddContract(con, size); // AddContract(&con); // break; //case 2: // DelContact(&con); // break; //case 3: // break; //case 4: // break; //case 5: // ShowContract(&con); // break; //case 6: // break; //case 0: // printf("退出通讯录\n"); // break; //default: // printf("输入错误\n"); // break; //} switch (input) { case ADD: //AddContract(con, size); AddContract(&con); break; case DEL: DelContact(&con); break; case SEARCH: SearchContact(&con); break; case MODIFY: ModifyContract(&con); break; case SHOW: ShowContract(&con); break; case EXIT: printf("退出通讯录\n"); break; default: printf("输入错误\n"); break; } } while (input); return 0; }
contract.h
#define _CRT_SECURE_NO_WARNINGS 1 #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<string.h> enum Option { EXIT,//0 ADD,//1 DEL,//2 SEARCH, MODIFY, SHOW, SORT//6 }; struct PeoInfo { char name[MAX_NAME]; int age; char sex[MAX_SEX]; char tele[MAX_TELE]; char addr[MAX_ADDR]; }; struct Contract { struct PeoInfo data[MAX]; int size; }; //声明函数 void InitContract(struct Contract* ps); //添加用户数据 void AddContract(struct Contract* ps); //打印用户信息 void ShowContract(const struct Contract* ps); //删除用户信息 void DelContact(struct Contract* ps); //查找用户信息 void SearchContract(const struct Contract* ps); //修改用户数据 void ModifyContract(struct Contract* ps);
contract.c
#define _CRT_SECURE_NO_WARNINGS 1 #include"contract.h" void InitContract(struct Contract* ps) { memset(ps->data, 0, sizeof(ps->data));//data是一块很大的空间,所以我们可以使用memset函数 ps->size = 0;//设置通讯录只有零个元素 } void AddContract(struct Contract* ps) { if ((ps->size) = MAX) { printf("通讯录已满,请停止添加\n");//判断是否填满 } else { printf("请输入名字:>"); scanf("%s", ps->data[ps->size].name); printf("请输入年龄:>"); scanf("%s", &(ps->data[ps->size].age)); //提示:因为age不是数组名,所以需要取地址 printf("请输入性别:>"); scanf("%s", ps->data[ps->size].sex); printf("请输入电话:>"); scanf("%s", ps->data[ps->size].tele); printf("请输入地址:>"); scanf("%s", ps->data[ps->size].addr); (ps->size)++; printf("添加成功\n"); } } void ShowContract(const struct Contract* ps) { if (ps->size == 0) { printf("通讯录为空\n"); } else { int i = 0; printf("%20s\t%4s\t5s\t%12s\t%20s", "名字", "年龄", "性别", "电话", "地址"); for (i = 0; i < (ps->size); i++) { printf("%20s\t%4s\t5s\t%12s\t%20s",ps->data[i].name, ps->data[i].age, ps->data[i].sex, ps->data[i].tele, ps->data[i].addr); } } } static int FindByName(struct Contract* ps, char name[MAX_NAME]) { int i = 0; for (i = 0; i < (ps->size); i++) { if (strcmp(ps->data[i].name, name) == 0) { return i; } } return -1; } void DelContact(struct Contract* ps) { char name[MAX_NAME]; printf("请输入要删除用户的名字:>"); scanf("%s", name); //1查找用户数据 /*int i = 0; for (i = 0; i < (ps->size); i++) { if (strcmp(ps->data[i].name, name) == 0) { break; } }*/ int pos = FindByName(ps, name); if (pos == -1) { printf("用户不存在\n"); } //2.删除数据 else { int j = 0; for (j = pos; j < (ps->size) - 1; j++) { ps->data[j] = ps->data[j + 1]; } ps->size--; printf("删除完成\n"); } } void SearchContract(const struct Contract* ps) { char name[MAX_NAME]; printf("请输入要查找的用户姓名:>"); scanf("%s", name); int pos = FindByName(ps, name); //对于函数,找到用户返回下标 //没找到就返回-1 if (pos == -1) { printf("用户不存在\n"); } else { printf("%20s\t%4s\t5s\t%12s\t%20s", "名字", "年龄", "性别", "电话", "地址"); printf("%20s\t%4s\t5s\t%12s\t%20s", ps->data[pos].name, ps->data[pos].age, ps->data[pos].sex, ps->data[pos].tele, ps->data[pos].addr); } } void ModifyContract(struct Contract* ps) { char name[MAX_NAME]; printf("请输入要修改用户的名字:>"); scanf("%s", name); int pos = FindByName(ps, name); if (pos == -1) { printf("用户不存在\n"); } else { printf("请输入名字:>"); scanf("%s", ps->data[pos].name); printf("请输入年龄:>"); scanf("%s", &(ps->data[pos].age)); printf("请输入性别:>"); scanf("%s", ps->data[pos].sex); printf("请输入电话:>"); scanf("%s", ps->data[pos].tele); printf("请输入地址:>"); scanf("%s", ps->data[pos].addr); printf("修改成功\n"); } }
结语
通讯录的实现到这里就结束了,希望这篇文章对你有帮助,
我们下篇文章见~