功能实现
实现步骤:
创建通讯录
1、创建成员信息结构体
我们用结构体来封装一个联系人的信息,信息包括:姓名、性别、年龄、电话号,而这个结构体成员也就要包含: 姓名、性别、年龄、电话号四种变量,姓名,性别,电话号 都用字符串封装,年龄,用整型封装
2、创建封装成员信息和个数的结构体
为了可以存放更多联系人,我们创建一个成员信息结构体数组,成员信息结构体数组,为了统计存入联系人的数量,我们创建一个整型变量,将结构体数组跟整型变量,封装在一个结构体中,以方便后续使用!,再创建一个结构体变量,以便后续通过变量访问通讯录
代码如下:
#define NAME_MAX 11 #define EAX_MAX 3 #define PHONE_MAX 12 #define MAX 1000 //创建通讯录内容 typedef struct SS { char name[NAME_MAX];//名字 char eax[EAX_MAX];//性别 int age;//年龄 char phone[PHONE_MAX];//电话 }SS; typedef struct contict { SS data[1000];//存放联系人信息 int sz;//存放联系人的个数 }contict; //创建结构体变量 contict con;//通过变量后续访问通讯录
初始化通讯录
创建好通讯录之后
我们对它进行初始化操作,将其信息全部初始化为0,我们用一个函数来实现
代码如下:
//参数是结构体变量con的地址 //初始化通讯录 void init_contict(contict* pc) { assert(pc); //用memset函数初始化 memset(pc->data, 0, sizeof(pc->data)); pc->sz = 0; }
打印菜单
创建一个简易菜单,供用户选择,用一个函数来封装菜单
代码如下:
//菜单 void nuem(void) { printf("********************************\n"); printf("****** 1、add 2、del ******\n"); printf("****** 3、sel 4、change *****\n"); printf("****** 5、clear 6、sort *****\n"); printf("****** 7、show 0、exit *****\n"); printf("********************************\n"); }
实现选择功能
对于功能的选择,我们用do while里面嵌套switch来实现,选择里面的函数功能我们往下慢慢一一实现,具体看代码 一目了然
代码如下:
int main() { int input = 0; do { //菜单 nuem(); printf("请选择-> "); scanf("%d", &input); switch (input) { case 1: add_contict(&con);//添加信息 break; case 2: del_contict(&con);//删除信息 break; case 3: sel_contict(&con);//查询指定联系人信息 break; case 4: change_contict(&con);//修改指定联系人信息 break; case 5: clear_contict(&con);//清空联系人信息 break; case 6: sort_contict(&con);//排序联系人信息 break; case 7: show_contict(&con);//查询所有数据 break; case 0: printf("退出成功\n"); break; default: printf("选择项不存在,重新选择\n"); break; } } while (input); return 0; }
实现添加功能
添加功能就是在通讯录里面添加联系人的信息,就是在我们所创建的结构体数组里面输入数据,每输入一个人的信息,我们都让整型变量sz +1,sz就是用来表示联系人的个数,同时sz也可以当做结构体数组的下标,我们用一个函数来实现添加功能
代码如下:
//添加一个联系人信息让sz++一次 //1、增加信息 void add_contict(contict* pc) { assert(pc); printf("请输入姓名-> "); scanf("%s", pc->data[pc->sz].name); printf("请输入性别-> "); scanf("%s", pc->data[pc->sz].eax); printf("请输入年龄-> "); scanf("%d", &(pc->data[pc->sz].age)); printf("请输入电话-> "); scanf("%s", pc->data[pc->sz].phone); pc->sz++; }
实现删除功能
删除一个联系人的信息,要删除此联系人,我们得先找到该联系人的位置,给定字符数组,输入一个名字,然后遍历结构体数组,将输入的名字跟存入的所有联系人的名字进行比较,通过其名字,找到该联系人在结构体数组中的位置找到下标,然后从这个下标位置开始,让她后面的信息往前移动,并且让其元素个数sz-1,用一个函数来实现此功能
移动方法图解:
因为后续还会判断联系人是否存在,所以我们用一个函数来封装,判断该联系人名字是否存在于结构体数组中,这一功能!
代码如下:
//判断联系人是否存在 int ment(char* name,contict* pc) { int i = 0; for (i = 0; i < pc->sz; i++) { if (strcmp(name, pc->data[i].name) == 0) { return i; } } return -1; } //2、删除信息 void del_contict(contict* pc) { char name[NAME_MAX]; printf("请输入要删除人的姓名-> "); scanf("%s", name); //判断联系人是否存在 int pos = ment(name, pc); if (pos == -1) { printf("联系人不存在\n"); return; } //删除联系人 int i = 0; for (i = pos; i < pc->sz - 1; i++) { pc->data[i] = pc->data[i + 1]; } pc->sz--; printf("删除成功\n"); }
实现查找功能
要查找指定联系人的信息,跟删除一样的原理,创建一个字符数组,输入一个名字,遍历结构体数组,判断该联系人是否存在,找到与输入名字相同名字的联系人,并将这个联系人的信息打印出来
代码如下:
//判断联系人是否存在 int ment(char* name,contict* 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 sel_contict(contict* pc) { assert(pc); char name[NAME_MAX]; printf("请输入要查询人的姓名-> "); scanf("%s", name); //判断联系人是否存在 int pos = ment(name, pc); if (pos == -1) { printf("查无此人\n"); return; } //查询联系人 printf("%-10s %-2s %-2s %-11s\n", "姓名", "性别", "年龄", "电话"); printf("%-10s %-2s %-2d %-11s\n", pc->data[pos].name, pc->data[pos].eax, pc->data[pos].age, pc->data[pos].phone); }
实现修改功能
跟查找联系人的思路一样,创建一个字符数组,输入要修改联系人的名字,并遍历结构体数组,判断该名字的联系人是否存在,若存在 对该联系人的信息重新输入值,就修改成功
代码如下:
//判断联系人是否存在 int ment(char* name,contict* pc) { int i = 0; for (i = 0; i < pc->sz; i++) { if (strcmp(name, pc->data[i].name) == 0) { return i; } } return -1; } //4、修改指定联系人信息 void change_contict(contict* pc) { assert(pc); char name[NAME_MAX]; printf("请输入要查询人的姓名-> "); scanf("%s", name); //判断联系人是否存在 int pos = ment(name, pc); if (pos == -1) { printf("此人不存在\n"); return; } //修改 printf("请输入姓名-> "); scanf("%s", pc->data[pos].name); printf("请输入性别-> "); scanf("%s", pc->data[pos].eax); printf("请输入年龄-> "); scanf("%d", &(pc->data[pos].age)); printf("请输入电话-> "); scanf("%s", pc->data[pos].phone); printf("修改成功\n"); }
实现清空功能
清空就是将所有的联系人信息都清空,其实将所有的联系人都清空,我们只要重新初始化一下封装联系人信息的数组跟记录联系人个数的整型变量就行了,我们上面已经创建了初始化函数,只要在调用一次这个函数就行,在清空函数内部调用初始化函数即可
代码如下:
//初始化通讯录 void init_contict(contict* pc) { assert(pc); //用memset函数初始化 memset(pc->data, 0, sizeof(pc->data)); pc->sz = 0; } //5、清空联系人信息 void clear_contict(contict* pc) { assert(pc); init_contict(pc); printf("清空成功\n"); }
实现排序功能
要排序联系人的信息,其实本质上就是排序结构体,结构体可以按照他的成员变量来排序,我们在这给用户提供两种排序方式,1、用姓名排序,2、用年龄排序,可以升序,也可以降序,这个是你自己选择的,用姓名排序就是比较两个名字字符串的大小,用年龄排序就是比较两个整型数的大小,这里的排序,我们使用 qsort函数来排序,(注:若是看不懂这一块,点我主页,指针进阶文章里面有目录,有详细的qsort函数的介绍),用一个函数来封装排序功能
代码如下:
//按照姓名排序 int con_name(void* e1, void* e2) { //升序排序 return strcmp(((contict*)e1)->data->name , ((contict*)e2)->data->name); //降序排序 //return strcmp(((contict*)e2)->data->name ,((contict*)e1)->data->name); } //按照年龄排序 int con_age(void* e1, void* e2) { //升序排序 return ((contict*)e1)->data->age - ((contict*)e2)->data->age; //降序排序 //return ((contict*)e2)->data->age - ((contict*)e1)->data->age; } //6、排序联系人信息 void sort_contict(contict* pc) { int n = 0; do { printf("*************************\n"); printf("***** 1、按姓名排序 ****\n"); printf("***** 2、按年龄排序 ****\n"); printf("***** 0、退出不排序 ****\n"); printf("*************************\n"); printf("请选择排序方式-> "); scanf("%d", &n); switch (n) { case 1: qsort(pc->data, pc->sz, sizeof(pc->data[0]), con_name); printf("按照姓名排序成功\n"); goto name; break; case 2: qsort(pc->data, pc->sz, sizeof(pc->data[0]), con_age); printf("按照年龄排序成功\n"); goto age; break; case 0: printf("退出成功\n"); break; default: printf("选择排序方式不存在,重新选择\n"); break; } } while (n); name: return; age: return; }
实现查询所有联系人信息功能
查询所有联系人,就是将结构体数组里面存放的所有联系人的信息打印出来,至于具体有多少位联系人信息,其实就是sz位,一开始我们就用sz来记录联系人的个数,遍历这个结构体数组将每个元素的值都打印出来即可,我们用函数封装这一功能
代码如下:
//7、查询所有信息 void show_contict(contict* pc) { if (pc->sz == 0) { printf("联系人列表为空\n"); return; } printf("%-10s %-2s %-2s %-11s\n", "姓名", "性别", "年龄", "电话"); int i = 0; for (i = 0; i < pc->sz; i++) { printf("%-10s %-2s %-2d %-11s\n", pc->data[i].name, pc->data[i].eax, pc->data[i].age, pc->data[i].phone); } }
通讯录总代码
一个简易版通讯录总代码实现:
#include <stdio.h> #include <string.h> #include <assert.h> #include <stdlib.h> #define NAME_MAX 11 #define EAX_MAX 3 #define PHONE_MAX 12 #define MAX 1000 //创建通讯录内容 typedef struct SS { char name[NAME_MAX];//名字 char eax[EAX_MAX];//性别 int age;//年龄 char phone[PHONE_MAX];//电话 }SS; typedef struct contict { SS data[1000];//存放联系人信息 int sz;//存放联系人的个数 }contict; //创建结构体变量 contict con;//通过变量后续访问通讯录 //菜单 void nuem(void) { printf("********************************\n"); printf("****** 1、add 2、del ******\n"); printf("****** 3、sel 4、change *****\n"); printf("****** 5、clear 6、sort *****\n"); printf("****** 7、show 0、exit *****\n"); printf("********************************\n"); } //初始化通讯录 void init_contict(contict* pc) { assert(pc); //用memset函数初始化 memset(pc->data, 0, sizeof(pc->data)); pc->sz = 0; } //判断联系人是否存在 int ment(char* name, contict* pc) { int i = 0; for (i = 0; i < pc->sz; i++) { if (strcmp(name, pc->data[i].name) == 0) { return i; } } return -1; } //1、增加信息 void add_contict(contict* pc) { assert(pc); printf("请输入姓名-> "); scanf("%s", pc->data[pc->sz].name); printf("请输入性别-> "); scanf("%s", pc->data[pc->sz].eax); printf("请输入年龄-> "); scanf("%d", &(pc->data[pc->sz].age)); printf("请输入电话-> "); scanf("%s", pc->data[pc->sz].phone); pc->sz++; } //2、删除信息 void del_contict(contict* pc) { char name[NAME_MAX]; printf("请输入要删除人的姓名-> "); scanf("%s", name); //判断联系人是否存在 int pos = ment(name, pc); if (pos == -1) { printf("联系人不存在\n"); return; } //删除联系人 int i = 0; for (i = pos; i < pc->sz - 1; i++) { pc->data[i] = pc->data[i + 1]; } pc->sz--; printf("删除成功\n"); } //3、查询指定联系人信息 void sel_contict(contict* pc) { assert(pc); char name[NAME_MAX]; printf("请输入要查询人的姓名-> "); scanf("%s", name); //判断联系人是否存在 int pos = ment(name, pc); if (pos == -1) { printf("查无此人\n"); return; } //查询联系人 printf("%-10s %-2s %-2s %-11s\n", "姓名", "性别", "年龄", "电话"); printf("%-10s %-2s %-2d %-11s\n", pc->data[pos].name, pc->data[pos].eax, pc->data[pos].age, pc->data[pos].phone); } //4、修改指定联系人信息 void change_contict(contict* pc) { assert(pc); char name[NAME_MAX]; printf("请输入要修改人的姓名-> "); scanf("%s", name); //判断联系人是否存在 int pos = ment(name, pc); if (pos == -1) { printf("此人不存在\n"); return; } //修改 printf("请输入姓名-> "); scanf("%s", pc->data[pos].name); printf("请输入性别-> "); scanf("%s", pc->data[pos].eax); printf("请输入年龄-> "); scanf("%d", &(pc->data[pos].age)); printf("请输入电话-> "); scanf("%s", pc->data[pos].phone); printf("修改成功\n"); } //5、清空联系人信息 void clear_contict(contict* pc) { assert(pc); init_contict(pc); printf("清空成功\n"); } //按照姓名排序 int con_name(void* e1, void* e2) { //升序排序 return strcmp(((contict*)e1)->data->name, ((contict*)e2)->data->name); //降序排序 //return strcmp(((contict*)e2)->data->name ,((contict*)e1)->data->name); } //按照年龄排序 int con_age(void* e1, void* e2) { //升序排序 return ((contict*)e1)->data->age - ((contict*)e2)->data->age; //降序排序 //return ((contict*)e2)->data->age - ((contict*)e1)->data->age; } //6、排序联系人信息 void sort_contict(contict* pc) { int n = 0; do { printf("*************************\n"); printf("***** 1、按姓名排序 ****\n"); printf("***** 2、按年龄排序 ****\n"); printf("***** 0、退出不排序 ****\n"); printf("*************************\n"); printf("请选择排序方式-> "); scanf("%d", &n); switch (n) { case 1: qsort(pc->data, pc->sz, sizeof(pc->data[0]), con_name); printf("按照姓名排序成功\n"); goto name; break; case 2: qsort(pc->data, pc->sz, sizeof(pc->data[0]), con_age); printf("按照年龄排序成功\n"); goto age; break; case 0: printf("退出成功\n"); break; default: printf("选择排序方式不存在,重新选择\n"); break; } } while (n); name: return; age: return; } //7、查询所有信息 void show_contict(contict* pc) { if (pc->sz == 0) { printf("联系人列表为空\n"); return; } printf("%-10s %-2s %-2s %-11s\n", "姓名", "性别", "年龄", "电话"); int i = 0; for (i = 0; i < pc->sz; i++) { printf("%-10s %-2s %-2d %-11s\n", pc->data[i].name, pc->data[i].eax, pc->data[i].age, pc->data[i].phone); } } void test_contict(void) { //初始化通讯录 init_contict(&con); int input = 0; do { //菜单 nuem(); printf("请选择-> "); scanf("%d", &input); switch (input) { case 1: add_contict(&con);//添加信息 break; case 2: del_contict(&con);//删除信息 break; case 3: sel_contict(&con);//查询指定联系人信息 break; case 4: change_contict(&con);//修改指定联系人信息 break; case 5: clear_contict(&con);//清空联系人信息 break; case 6: sort_contict(&con);//排序联系人信息 break; case 7: show_contict(&con);//查询所有数据 break; case 0: printf("退出成功\n"); break; default: printf("选择项不存在,重新选择\n"); break; } } while (input); } int main() { //测试通讯录 test_contict(); return 0; }