前言
通讯录是一个简单的程序,我们接下来用C语言来实现静态以及动态通讯录。我们先了解一下什么叫静态?
静态通讯录:通讯录能存储人员的大小是固定的,可能会浪费,可能会不够
动态通讯录:可以实现动态扩容,不够就扩容,比较节省时间和空间,更加方便
一、通讯录
首先我们应该知道,通讯录应该有那些功能
1.增删查改,都要有
2.关闭通讯录
3.排序通讯录中的人员
二、静态通讯录
动态比静态只需要修改一部分内容,我们先讲解一下静态通讯录如何制作
1.完成什么功能
图示:
2.通讯录的主干怎么写?
使用菜单的形式,在main函数外使用test函数,在test中使用do while和switch函数,实现通讯录的基本框架,具体代码如下。
代码演示:
//这边进行主要的通讯录流程操作 void menu() { printf("***********************************************\n"); printf("****** 1.add 2.del ******\n"); printf("****** 3.search 4.change ******\n"); printf("****** 5.show 6.sort ******\n"); printf("****** 0.exit ******\n"); printf("***********************************************\n"); } void test() { int input = 0; int pos = 0; Contact pc; //Contact pc={0}; //当然可以这样初始化,但是不一定后来初始化都这样,所以有InitContact() InitContact(&pc); do { menu(); //打印选择菜单 printf("请选择:>"); scanf("%d", &input); switch (input) { case 1: addContact(&pc); break; case 2: delContact(&pc); break; case 3: searchContact(&pc); break; case 4: changeContact(&pc); break; case 5: showContact(&pc); break; case 6: sortContact(&pc); break; case 0: printf("退出通讯录\n"); break; default: break; } } while (input); } int main() { test(); return 0; }
3.逐步完成各项功能
初始化、增删改查,排序等功能的实现,我们放在Contact.c文件中进行实现
1.结构体的实现
代码如下:
#define MAX 100 #define NAME_MAX 20 #define SEX_MAX 5 #define ADDR_MAX 20 #define TELE_MAX 12 //下面两个define是用于动态通讯录的 #define MAX1 3 //表示第一次容积是多少 #define MAX2 2 //表示一次扩容多少 //构建通讯录所需的结构体 typedef struct PeopleInfo { char name[NAME_MAX];//姓名 int age;//年龄 char sex[NAME_MAX];//性别 char addr[ADDR_MAX];//地址 char tele[TELE_MAX];//电话号码 }PeopleInfo; //这是静态通讯录 就是data这个数组是固定死的MAX typedef struct Contact { PeopleInfo data[MAX];//表示存储的通讯录最大人员数 int sz;//表示当前Contact通讯录人员个数 }Contact;
2.初始化通讯录
代码如下:
//这是静态初始化 void InitContact(Contact* pc) { //进行初始化的时候,我们当然可以直接 pc->sz = 0; memset(pc->data, 0, sizeof(pc->data)); //memset 函数 这样的话,从data这个数组的地址开始 sizeof(pc->data)个字节,都赋值为0 }
使用了memset内存管理函数,对pc->data数组进行初始化都为0,sz表示的是人员个数,也为0
3.添加人员
代码如下:
//静态通讯录 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].addr); printf("请输入电话:>"); scanf("%s", pc->data[pc->sz].tele); printf("添加完成,请继续操作\n"); //添加完一个就sz++,表示有一个人员加入通讯录中 pc->sz++; }
3.删除指定人员
代码如下:
void delContact(Contact* pc) { assert(pc); printf("请选择删除的目标:>"); if (pc->sz == 0) { return; } //删除的话只需要找到对应的要删除的数据,比如以名字为准,先找到,然后再讲其后面的元素覆盖前面的 int pos = searchContact(pc); //换位置 if (pos == -1) { printf("没有查找到该成员\n"); return; } for (int i = pos; i < pc->sz - 1; i++) { pc->data[i] = pc->data[i + 1]; } pc->sz--;//直接--不用管换位置之后最后一个数字的问题 printf("删除完成\n"); }
可以删除指定姓名人员,当然可以自行做出一些改善,这是比较简单易懂的通讯录。
4.查找指定人员的信息
代码如下:
int searchContact(Contact* pc) { assert(pc);//断言 char name[20]; int pos = -1; //pos等于-1是因为 如果找不到一样的姓名,就返回-1,表示没有 scanf("%s", name); //查询 for (int i = 0; i < pc->sz; i++) { if (strcmp(pc->data[i].name, name) == 0) { pos = i; //使用strcmp函数,进行比较 } } return pos; }
使用了strcmp函数,大家有不理解的可以去下面链接进行访问查看