网站项目建设方案,个人博客网站的设计与实现,哪个网站做视频有钱,百度竞价推广是什么意思魔王的介绍#xff1a;#x1f636;#x1f32b;️一名双非本科大一小白。魔王的目标#xff1a;#x1f92f;努力赶上周围卷王的脚步。魔王的主页#xff1a;#x1f525;#x1f525;#x1f525;大魔王.#x1f525;#x1f525;#x1f525; ❤️#x1… 魔王的介绍️一名双非本科大一小白。魔王的目标努力赶上周围卷王的脚步。魔王的主页大魔王. ❤️大魔王与你分享无人问津也好技不如人也罢你都要是安静下来去做自己该做的事而不是让内心烦躁、焦虑毁掉你本就不多的热情和定力。 文章目录一、前言二、介绍三、分布实现通讯录1.在test.c文件中创建基本格式2.创建结构体类型3.初始化通讯录4.实现AddContact函数5.实现ShowContact函数6.实现FindContact函数7.实现DelContact函数8.实现SearchContact函数9.实现ModifyContact函数10.实现SortContact函数四、总代码contact.hcontact.ctest.c五、总结一、前言 学习完结构体我们一定会好奇它的应用场景想要熟练掌握一个知识点就必须让其在现实生活中熟练结合本篇将通过结构体的灵活运用去实现简单通讯录可以实现增加删除搜索修改展示排序六大功能。 二、介绍
test.c测试文件 contact.h头文件只进行声明 contact.c源文件,进行函数的定义 我们会在contact.h头文件中进行声明在contact.c源文件中进行定义然后在test.c源文件中进行测试也就是直接运用这些函数。 除了头文件外另外两个文件都要包含头文件因为是头文件进行的声明可以理解为另外两个文件都要用的东西我们会在头文件进行声明之后只需要在另外两个文件中包含头文件便都可以使用了。 三、分布实现通讯录
1.在test.c文件中创建基本格式
#include contact.hvoid menu()
{printf(**** 1.add 2.del ****\n);printf(**** 3.search 4.modify ****\n);printf(**** 5.show 6.sort ****\n);printf(**** 0.exit ****\n);
}int main()
{int input 0;do{menu();printf(请选择: );scanf(%d, input);switch (input){case 1://AddContact(con);break;case 2://DelContact(con);break;case 3://SearchContact(con);break;case 4://ModifyContact(con);break;case 5://ShowContact(con);break;case 6://SortContact(con);break;case 0:printf(退出);break;default:printf(输入错误请重新输入);}} while (input);return 0;
}我们这时候就可以运行了虽然什么都没有不过程序是正确的。 2.创建结构体类型 我们会创建两个结构体类型一个是存放数据的结构体类型里面放的是一个用户的基本信息另一个是我们直接应用的结构体里面会有两个成员第一个成员为上个结构体数组因为我们的通讯录肯定不是只有一个人的信息第二个成员为结构体数组中的成员个数。 #define NameMax 10
#define SexMax 5
#define AddrMax 10
#define TeleMax 11//定义一个可以存放一个人数据的结构体类型
typedef struct PeoInfo
{char name[NameMax];int age;char sex[SexMax];char addr[AddrMax];char tele[TeleMax];
}PeoInfo;//定义一个我们可以存放多人数据并进行判断和修改的结构体类型
typedef struct Contact
{PeoInfo date[100];int sz;
}Contact;解释
我们进行define定义常量是为了以后方便修改当我们发现某个不合适时只需要在头文件中修改一下就可以了也就是方便代码的维护。两个结构体都进行重命名是为了在之后应用这个结构体时不再去写struct比较方便。因为不止一个文件要用到结构体所以创建结构体在头文件进行。
3.初始化通讯录
void InitContact(Contact* pc)
{assert(pc);pc-sz 0;memset(pc-date, 0, sizeof(pc-date));
}解释
我们首先在测试文件的主函数内部用定义过的结构体创建我们在测试时需要创建一个通讯录创建的时候我们可以直接初始化为0也可以像这样在创建完成后让通讯录中的值改为我们需要的还是0这种方法更好一些因为可以改为别的值而不是只能是0。我们这里用到了memset函数对应的头文件是string.h这个函数的作用就是让从给定地址开始前多少字节的内容都赋上一个特定的数值。
4.实现AddContact函数
void AddContact(Contact* pc)
{assert(pc);if (pc-sz 100){printf(人数已满\n);return;}printf(请输入要添加联系人姓名: );scanf(%s, pc-date[pc-sz].name);printf(请输入要添加联系人年龄: );scanf(%d, (pc-date[pc-sz].age));printf(请输入要添加联系人性别: );scanf(%s, pc-date[pc-sz].sex );printf(请输入要添加联系人地址: );scanf(%s, pc-date[pc-sz].addr);printf(请输入要添加联系人电话: );scanf(%s, pc-date[pc-sz].tele);pc-sz;printf(添加成功\n);
}解释
首先判断是否满了也就是我们规定的100人如果没满那么就执行后面的添加如果满了就退出函数。为什么只有第二个加取地址呢因为其他的都是结构体信息PeoInfo里不同类型的首元素地址因为是数组所以数组名表示首元素地址而age的类型为int表示的不是地址所以需要取地址符。每次添加一个人结构体成员sz需要加1。
5.实现ShowContact函数
void ShowContact(const Contact* pc)
{assert(pc);printf(%-10s\t%-3s\t%-5s\t%-10s\t%-11s\n, 姓名, 年龄, 性别, 地址, 电话);int i 0;for (i 0; i pc-sz; i){printf(%-10s\t%-3d\t%-5s\t%-10s\t%-11s\n, pc-date[i].name,pc-date[i].age,pc-date[i].sex,pc-date[i].addr,pc-date[i].tele);}
}解释
\t为水平制表符也就是会空出来一段距离。展示函数会从结构体数组的零下标开始逐个打印出全部人的信息。
6.实现FindContact函数
int FindContact(Contact* pc, char* arr)
{int i 0;for (i 0; i pc-sz; i){int ret strcmp(arr, pc-date[i].name);if (ret 0)return i;//找到的话返回结构体的下标}return -1;
}这个函数并不是六种功能的哪一个我们之所以要专门分装出这么一个函数是因为多个功能都需要用到这个函数所以为了方便其他函数使用我们把这个部分写成一个函数分离出来。 7.实现DelContact函数
void DelContact(Contact* pc)
{assert(pc);if (pc-sz0){printf(通讯录中没有信息\n);return;}printf(输入要删除人的姓名:);char arr[10] 0;scanf(%s, arr);int ret FindContact(pc,arr);if (ret -1){printf(该姓名不存在\n);return;}int i 0;for (i ret; i pc-sz - 1; i){pc-date[i] pc-date[i 1];}pc-sz--;printf(删除成功\n);
} 解释
首先判断是否有成员如果没有成员就直接退出函数。如果确实存在该成员该成员的结构体下标会通过FindContact函数返回给ret然后ret里存放的值就是该结构体数组中对应的下标。如果确实存在该成员我们删除的思路就是从被删除这个结构体下标开始每个后面的覆盖前面的最后个数sz再减1。
8.实现SearchContact函数
void SearchContact(const Contact* pc)
{assert(pc);if (pc-sz 0){printf(通讯录中没有信息\n);return;}printf(输入要查找人的姓名:);char arr[10] 0;scanf(%s, arr);int ret FindContact(pc, arr);if (ret -1){printf(该姓名不存在\n);return;}printf(%-10s\t%-3d\t%-5s\t%-10s\t%-11s\n, pc-date[ret].name,pc-date[ret].age,pc-date[ret].sex,pc-date[ret].addr,pc-date[ret].tele);
}首先判断是否含有信息如果没有退出函数。 然后如果有这个人的信息那个其对应的结构体下标已经通过FindContact函数返回给了ret我们把该姓名的信息打印出来。 9.实现ModifyContact函数 如果不存在就退出如果存在我们将这个人的信息打印出来。 void ModifyContact(Contact* pc)
{assert(pc);if (pc-sz0){printf(通讯录中没有信息\n);return;}char arr[10] 0;printf(请输入要修改人的名字: );scanf(%s, arr);int ret FindContact(pc,arr);if (ret -1){printf(该联系人不存在\n);return;}printf(请输入要修改成的姓名: );scanf(%s, pc-date[ret].name);printf(请输入要修改成的年龄: );scanf(%d, (pc-date[ret].age));printf(请输入要修改成的性别: );scanf(%s, pc-date[ret].sex);printf(请输入要修改成的地址: );scanf(%s, pc-date[ret].addr);printf(请输入要修改成的电话: );scanf(%s, pc-date[ret].tele);printf(修改成功\n);return;
}这个的原理就是把找到的那个人对应的结构体下标返回给ret然后让该下标的结构体成员重新赋一次值。 10.实现SortContact函数
int cmp(const void* e1, const void* e2)
{assert(e1 e2);//return strcmp(((PeoInfo*)e1)-name, ((PeoInfo*)e2)-name);return ((PeoInfo*)e1)-age - ((PeoInfo*)e2)-age;
}void SortContact(Contact* pc)
{assert(pc);qsort(pc-date, pc-sz, sizeof(pc-date[0]), cmp);}注意 qsort第二个参数不是传数组能放多少元素而是放了多少元素因为如果没使用的位置也算进去它会将它们这些没放的元素也参加排序。 四、总代码
contact.h
#define _CRT_SECURE_NO_WARNINGS 1#include stdio.h
#include string.h
#include assert.h
#include stdlib.h#define NameMax 10
#define SexMax 5
#define AddrMax 10
#define TeleMax 11//定义一个可以存放一个人数据的结构体类型
typedef struct PeoInfo
{char name[NameMax];int age;char sex[SexMax];char addr[AddrMax];char tele[TeleMax];
}PeoInfo;//定义一个我们可以存放多人数据并进行判断和修改的结构体类型
typedef struct Contact
{PeoInfo date[100];int sz;
}Contact;//初始化通讯录
void InitContact(Contact* pc);//添加联系人
void AddContact(Contact* pc);//展示添加上的联系人
void ShowContact(const Contact* pc);//删除联系人
void DeleContact(Contact* pc);//查找联系人
void SearchContact(const Contact* pc);//修改联系人
void ModifyContact(Contact* pc);//按名字大小排序
void SortContact(Contact* pc);
contact.c
#define _CRT_SECURE_NO_WARNINGS 1#include contact.hvoid InitContact(Contact* pc)
{assert(pc);pc-sz 0;memset(pc-date, 0, sizeof(pc-date));
}void AddContact(Contact* pc)
{assert(pc);if (pc-sz 100){printf(人数已满\n);return;}printf(请输入要添加联系人姓名: );scanf(%s, pc-date[pc-sz].name);printf(请输入要添加联系人年龄: );scanf(%d, (pc-date[pc-sz].age));printf(请输入要添加联系人性别: );scanf(%s, pc-date[pc-sz].sex );printf(请输入要添加联系人地址: );scanf(%s, pc-date[pc-sz].addr);printf(请输入要添加联系人电话: );scanf(%s, pc-date[pc-sz].tele);pc-sz;printf(添加成功\n);
}void ShowContact(const Contact* pc)
{assert(pc);printf(%-10s\t%-3s\t%-5s\t%-10s\t%-11s\n, 姓名, 年龄, 性别, 地址, 电话);int i 0;for (i 0; i pc-sz; i){printf(%-10s\t%-3d\t%-5s\t%-10s\t%-11s\n, pc-date[i].name,pc-date[i].age,pc-date[i].sex,pc-date[i].addr,pc-date[i].tele);}
}
int FindContact(Contact* pc, char* arr)
{int i 0;for (i 0; i pc-sz; i){int ret strcmp(arr, pc-date[i].name);if (ret 0)return i;//找到的话返回结构体的下标}return -1;}void DelContact(Contact* pc)
{assert(pc);if (pc-sz0){printf(通讯录中没有信息\n);return;}printf(输入要删除人的姓名:);char arr[10] 0;scanf(%s, arr);int ret FindContact(pc,arr);if (ret -1){printf(该姓名不存在\n);return;}int i 0;for (i ret; i pc-sz - 1; i){pc-date[i] pc-date[i 1];}pc-sz--;printf(删除成功\n);
}void SearchContact(const Contact* pc)
{assert(pc);if (pc-sz 0){printf(通讯录中没有信息\n);return;}printf(输入要查找人的姓名:);char arr[10] 0;scanf(%s, arr);int ret FindContact(pc, arr);if (ret -1){printf(该姓名不存在\n);return;}printf(%-10s\t%-3d\t%-5s\t%-10s\t%-11s\n, pc-date[ret].name,pc-date[ret].age,pc-date[ret].sex,pc-date[ret].addr,pc-date[ret].tele);
}void ModifyContact(Contact* pc)
{assert(pc);if (pc-sz0){printf(通讯录中没有信息\n);return;}char arr[10] 0;printf(请输入要修改人的名字: );scanf(%s, arr);int ret FindContact(pc,arr);if (ret -1){printf(该联系人不存在\n);return;}printf(请输入要修改成的姓名: );scanf(%s, pc-date[ret].name);printf(请输入要修改成的年龄: );scanf(%d, (pc-date[ret].age));printf(请输入要修改成的性别: );scanf(%s, pc-date[ret].sex);printf(请输入要修改成的地址: );scanf(%s, pc-date[ret].addr);printf(请输入要修改成的电话: );scanf(%s, pc-date[ret].tele);printf(修改成功\n);return;
}int cmp(const void* e1, const void* e2)
{assert(e1 e2);//return strcmp(((PeoInfo*)e1)-name, ((PeoInfo*)e2)-name);return ((PeoInfo*)e1)-age - ((PeoInfo*)e2)-age;
}void SortContact(Contact* pc)
{assert(pc);qsort(pc-date, pc-sz, sizeof(pc-date[0]), cmp);//qsort第二个参数不是传数组能放多少元素而是放了多少元素因为如果没使用的位置也算进去它会将它们这些没放的元素也参加排序
}test.c
#define _CRT_SECURE_NO_WARNINGS 1#include contact.hvoid menu()
{printf(**** 1.add 2.del ****\n);printf(**** 3.search 4.modify ****\n);printf(**** 5.show 6.sort ****\n);printf(**** 0.exit ****\n);
}int main()
{//创建通讯录Contact con;//初始化通讯录InitContact(con);int input 0;do{menu();printf(请选择: );scanf(%d, input);switch (input){case 1:AddContact(con);break;case 2:DelContact(con);break;case 3:SearchContact(con);break;case 4:ModifyContact(con);break;case 5:ShowContact(con);break;case 6:SortContact(con);break;case 0:printf(退出);break;default:printf(输入错误请重新输入);}} while (input);return 0;
}五、总结 原创不易还希望各位佬佬支持一下\textcolor{colourful}{原创不易还希望各位佬佬支持一下}原创不易还希望各位佬佬支持一下 点赞你的认可是我创作的动力\textcolor{red}{点赞你的认可是我创作的动力}点赞你的认可是我创作的动力 收藏你的青睐是我努力的方向\textcolor{orange}{收藏你的青睐是我努力的方向}收藏你的青睐是我努力的方向 评论你的意见是我进步的财富\textcolor{aqua}{评论你的意见是我进步的财富}评论你的意见是我进步的财富 ✨请点击下面进入主页关注大魔王 如果感觉对你有用的话就点我进入主页关注我吧