通讯录的实现

  • 前言:
  • 一、在通讯录中存放100个人的信息
    • 1.1设置保存人信息的结构体
    • 1.2设置一个通讯录,并且初始化
  • 二、增加联系人
  • 三、删除联系人
  • 四、修改联系人
  • 五、查找指定联系人
  • 六、显示所有联系人的信息
  • 七、排序功能
  • 八、清空所有联系人
  • 九、完整代码
    • 9.1cantact.h头文件
    • 9.2cantact.c源文件
    • 9.3test.c源文件

前言:

今天我们做一个简单的通讯录,同时也能加深对C语言的理解。
实现一个通讯录,我们要在通讯录中保存人的信息:
名字、年龄、性别、电话、地址。
我们也要知道编写通讯录的流程:

  1. 通讯录中存放100个人的信息
  2. 增加联系人
  3. 删除联系人
  4. 修改联系人
  5. 查找联系人
  6. 显示所有联系人的信息
  7. 排序功能.
    首先创建三个文件然后在进行编写:

test.c——测试通讯录
contact.h——函数和类型的声明
contact.c——函数的实现

一、在通讯录中存放100个人的信息

1.1设置保存人信息的结构体

//定义一个结构体typedef struct Communication{char name[20];//姓名int age;//年龄char sex[5];//性别char tele[12];//电话char addr[30];//地址}com;

以上的内容如果经常用到的话,我们就#define来定义标识符
更改后:

#define MAX 100//可以增加的人数#define NAME_MAX 20//姓名#define SEX_MAX 5//性别#define TELE_MAX 12//电话#define ADDR_MAX 20//地址//定义一个结构体typedef struct Communication{char name[NAME_MAX];//姓名int age;//年龄char sex[SEX_MAX];//性别char tele[TELE_MAX];//电话char addr[ADDR_MAX];//地址}com;

1.2设置一个通讯录,并且初始化

在构建一个结构体,定义一个通讯录

//定义一个通讯录typedef struct Comcation{com data[100];//可以存100个人的信息int sz;//记录存放人的位置}contact;

让通讯录初始化

//通讯录初始化void initCantact(contact* pc){memset(pc->data, 0, sizeof(pc->data));//开辟空间,并且赋值为0pc->sz = 0;}

做个菜单:

void menu(void){printf("————————————————————\n");printf("|***************************************|\n");printf("|*****1.增加联系人 2.删除联系人*****|\n");printf("|*****3.修改联系人 4.查找联系人*****|\n");printf("|*****5.显示所有联系人 6.排序*****|\n");printf("|*****7.清除所有联系人 0.退出程序 ****|\n");printf("|***************************************|\n");printf("————————————————————\n");}

二、增加联系人

静态存储,存储满了,就不能在增加

//增加联系人void Addcontact(contact* pc){if (pc->sz == MAX){printf("通讯录已满,无法添加\n");return;}printf("请输入名字:");scanf("%s", pc->data[pc->sz].name);printf("请输入年龄:");scanf("%d", &(pc->data[pc->sz].age));printf("请输入性别:");scanf("%s", pc->data[pc->sz].sex);printf("请输入电话号码:");scanf("%s", pc->data[pc->sz].tele);printf("请输入地址:");scanf("%s", pc->data[pc->sz].addr);pc->sz++;printf("成功增加联系人\n");}

三、删除联系人

先找到要删除的人的下标sz,然后从找到的下标开始往后遍历,把后面的值移到前移位,最后吧总数sz减1,当然还要注意下标为0时的特殊情况。

//删除联系人void Delcontact(contact* pc){if (pc->sz == 0){printf("没有联系人,无需删除\n");return;}char arr[20] = {0};assert(pc);printf("请输入要删除的人的名字:");scanf("%s",arr);//名字int n; n= Findcontact(pc,arr); if (n == -1) { printf("没找到\n"); return; } else//找到了 { int i = 0; for (i = n; i < pc->sz - 1; i++)//从当前位置开始,把后面的值都往前面挪一位 { pc->data[i] = pc->data[i + 1]; } pc->sz--; } printf("成功删除联系人\n");}

四、修改联系人

先对联系人为0进行判断,然后在输入要修改的人的姓名,找到修改人的位置,把该位置上的信息全部更改,达到修改的目的。

//修改联系人void Modfycontatc( contact* pc){assert(pc);char name[20] = { 0 };if (pc->sz == 0){printf("没有联系人,无需修改\n");return;}printf("请输入要修改人的名字;");scanf("%s", name);int n=0;n = Findcontact( pc,name);if (n == -1){printf("要修改的人不存在\n");}else{printf("请输入修改后的名字:");scanf("%s", pc->data[n].name);printf("请输入修改后的年龄:");scanf("%d", &(pc->data[n].age));printf("请输入修改后的性别:");scanf("%s", pc->data[n].sex);printf("请输入修改后的电话号码:");scanf("%s", pc->data[n].tele);printf("请输入修改后的地址:");scanf("%s", pc->data[n].addr);printf("修改成功\n");}}

五、查找指定联系人

先查找联系人,要判断下标为0时情况,返回该联系人的位置i,

//查找联系人int Findcontact( contact* pc, char arr[20]){int i = 0;for (i = 0; i < pc->sz; i++){if (strcmp(pc->data[i].name, arr)==0)//找到了{return i;}}return -1;//没找到}

查找指定联系人:根据返回的信息i,找到该联系人的位置,然后判断是否找到在打印。

//查找指定联系人void Searchcontact(contact* pc){assert(pc);char p[20] = {0};printf("请输入要查找人的姓名:");scanf("%s", p);int n = Findcontact(pc, p);if (n == -1){printf("要查找的人不存在\n");}else{printf("%-20s\t%-4s\t%-5s\t%-12s\t%-30s\n","名字","年龄","性别","电话","地址");//打印数据printf("%-20s\t%-4d\t%-5s\t%-12s\t%-30s\n",pc->data[n].name,pc->data[n].age,pc->data[n].sex,pc->data[n].tele,pc->data[n].addr);}}

六、显示所有联系人的信息

直接遍历打印已经添加的联系人

//显示联系人void Showcontact(const contact* pc){int i = 0;for (i = 0; i < pc->sz; i++){printf("%s\t%d\t%s\t%s\t%s\n", pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].tele,pc->data[i].addr);}}

七、排序功能

这里我用到了快排,然后通过回调函数comper进行比较

int comper(const void* p1, const void* p2)//字符比较{return strcmp(((com*)p1)->name, ((com*)p2)->name);}//按名字进行排序void Sortcontact(contact* pc){qsort(pc->data, pc->sz, sizeof(com), comper);}

八、清空所有联系人

直接让sz赋值0就可以了

//清空联系人void Emptycontact(contact* pc){assert(pc);if (pc->sz == 0){printf("联系人为空,无需清空\n");}else{pc->sz = 0;printf("清空成功\n");}}

九、完整代码

一个静态版本的通讯录完成了,写完后能够加深对C语言的理解,有兴趣的朋友可以去尝试尝试

9.1cantact.h头文件

函数的声明和定义:

#pragma once#define _CRT_SECURE_NO_WARNINGS 1#include #include #include #include #define MAX 100//可以增加的人数#define NAME_MAX 20//姓名#define SEX_MAX 5//性别#define TELE_MAX 12//电话#define ADDR_MAX 20//地址//定义一个结构体typedef struct Communication{char name[NAME_MAX];//姓名int age;//年龄char sex[SEX_MAX];//性别char tele[TELE_MAX];//电话char addr[ADDR_MAX];//地址}com;//定义一个通讯录typedef struct Comcation{com data[MAX];//可以存100个人的信息int sz;//记录存放人的位置}contact;//给通讯录赋初值void initCantact(contact* pc);//菜单void menu(void);//增加联系人void Addcontact(contact* pc);//显示联系人void Showcontact(const contact* pc);//删除联系人void Delcontact(contact* pc);//查找联系人int Findcontact(contact* pc, char arr[20]);//查找指定联系人void Searchcontact(contact* pc);//修改联系人void Modfycontatc(contact* pc);//联系人按名字进行排序void Sortcontact(contact* pc);//清空联系人void Emptycontact(contact* pc);

9.2cantact.c源文件

函数的实现:

#include "cantact.h"//通讯录初始化void initCantact(contact* pc){assert(pc);memset(pc->data, 0, sizeof(pc->data));//开辟空间,并且赋值为0pc->sz = 0;}//增加联系人void Addcontact(contact* pc){assert(pc);if (pc->sz == MAX){printf("通讯录已满,无法添加\n");return;}printf("请输入名字:");scanf("%s", pc->data[pc->sz].name);printf("请输入年龄:");scanf("%d", &(pc->data[pc->sz].age));printf("请输入性别:");scanf("%s", pc->data[pc->sz].sex);printf("请输入电话号码:");scanf("%s", pc->data[pc->sz].tele);printf("请输入地址:");scanf("%s", pc->data[pc->sz].addr);pc->sz++;printf("成功增加联系人\n");}//显示联系人void Showcontact(const contact* pc){assert(pc);printf("%-20s\t%-4s\t%-5s\t%-12s\t%-30s\n\n", "名字", "年龄", "性别", "电话", "地址");int i = 0;for (i = 0; i < pc->sz; i++){printf("%-20s\t%-4d\t%-5s\t%-12s\t%-30s\n",pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].tele,pc->data[i].addr);}}//查找联系人int Findcontact( contact* pc, char arr[20]){int i = 0;for (i = 0; i < pc->sz; i++){if (strcmp(pc->data[i].name, arr)==0)//找到了{return i;}}return -1;//没找到}//删除联系人void Delcontact(contact* pc){if (pc->sz == 0){printf("没有联系人,无需删除\n");return;}char arr[20] = {0};assert(pc);printf("请输入要删除的人的名字:");scanf("%s",arr);//名字int n; n= Findcontact(pc,arr); if (n == -1) { printf("没找到\n"); return; } else//找到了 { int i = 0; for (i = n; i < pc->sz - 1; i++)//从当前位置开始,把后面的值都往前面挪一位 { pc->data[i] = pc->data[i + 1]; } pc->sz--; } printf("成功删除联系人\n");}//查找指定联系人void Searchcontact(contact* pc){assert(pc);char p[20] = {0};printf("请输入要查找人的姓名:");scanf("%s", p);int n = Findcontact(pc, p);if (n == -1){printf("要查找的人不存在\n");}else{printf("%-20s\t%-4s\t%-5s\t%-12s\t%-30s\n","名字","年龄","性别","电话","地址");//打印数据printf("%-20s\t%-4d\t%-5s\t%-12s\t%-30s\n",pc->data[n].name,pc->data[n].age,pc->data[n].sex,pc->data[n].tele,pc->data[n].addr);}}//修改联系人void Modfycontatc( contact* pc){assert(pc);char name[20] = { 0 };if (pc->sz == 0){printf("没有联系人,无需修改\n");return;}printf("请输入要修改人的名字;");scanf("%s", name);int n=0;n = Findcontact( pc,name);if (n == -1){printf("要修改的人不存在\n");}else{printf("请输入修改后的名字:");scanf("%s", pc->data[n].name);printf("请输入修改后的年龄:");scanf("%d", &(pc->data[n].age));printf("请输入修改后的性别:");scanf("%s", pc->data[n].sex);printf("请输入修改后的电话号码:");scanf("%s", pc->data[n].tele);printf("请输入修改后的地址:");scanf("%s", pc->data[n].addr);printf("修改成功\n");}}int comper(const void* p1, const void* p2)//字符比较{return strcmp(((com*)((contact*)p1)->data)->name, ((com*)((contact*)p2)->data)->name);}//按名字进行排序void Sortcontact(contact* pc){qsort(pc, pc->sz, sizeof(pc->data[0]), comper);//快排}//清空联系人void Emptycontact(contact* pc){assert(pc);if (pc->sz == 0){printf("联系人为空,无需清空\n");}else{pc->sz = 0;printf("清空成功\n");}}

9.3test.c源文件

测试通讯录:

#include "cantact.h"//菜单void menu(void){printf("————————————————————\n");printf("|***************************************|\n");printf("|*****1.增加联系人 2.删除联系人*****|\n");printf("|*****3.修改联系人 4.查找联系人*****|\n");printf("|*****5.显示所有联系人 6.排序*****|\n");printf("|*****7.清除所有联系人 0.退出程序 ****|\n");printf("|***************************************|\n");printf("————————————————————\n");}int main(){int input = 0;//通讯录初始化contact pc;initCantact( &pc);do{menu();printf("请选择:\n");scanf("%d", &input);//switch (input){case 1:Addcontact(&pc);//增加联系人break;case 2:Delcontact(& pc);//删除联系人break;case 3:Modfycontatc(&pc);//修改联系人break;case 4:Searchcontact(&pc);//查找指定联系人break;case 5:Showcontact(&pc);//显示联系人break;case 6:Sortcontact(&pc);//按名字进行排序break;case 7://清空所以联系人Emptycontact(&pc);break;case 0:printf("退出程序\n");break;default:printf("输入错误,重新输入\n"); }} while (input);return 0;}