C语言的学习中,对于知识运用非常灵活,今天我们来使用C语言实现一个简易通信录。
首先对于一个通讯录,我们需要认识到它的功能,通信录能够实现的功能最基础的应该有:增加联系人,删除联系人,查找联系人,修改联系人信息等等。
所以接下来我们就来实现通信录的这些功能。
目录
一、功能
1.增加联系人
2.删除联系人
3.查找联系人
4.修改联系人信息
5.显示联系人信息
6.排序
二、实现功能
文件操作
这里我们采用的环境是Visual Studio 2019,为了方便我们的代码管理,我们可以创建2个源文件和一个头文件。

将通信录的主要文件放在contact.c中。
三、代码实现
1.菜单

菜单主要可以显示我们的功能,可以方便我们进行选择。

这里我们定义了一个名为 Option 的枚举类型,其枚举成员包括 EXIT、ADD、DEL、SEARCH、MODIFY、SHOW、SORT,后面选择时使用可以在程序中的不同操作选项。
2.主函数代码实现
主函数中放置我们的菜单,输入选择我们的需要的功能进入,这里使用到我们Switch case语句;Switch 用于多分支选择,根据表达式的值匹配 case。使用时注意break的使用。
int main()
{
int input;
Contact con;
InitContact(&con);
do
{
menu();
printf("请输入要功能:>\n");
scanf("%d", &input);
switch (input)
{
case ADD:
printf("请添加:>\n");
break;
case DEL:
printf("请删除:>\n");
break;
case SEARCH:
printf("请查找:>\n");
break;
case MODIFY:
printf("请修改:>\n");
break;
case SHOW:
printf("请打印\n");
break;
case SORT:
printf("请排序\n");
break;
case EXIT:
printf("结束\n");
break;
default:
break;
}
} while (input);
}
3.通信录的初始化
首先我们需要一个来存放通讯人信息的结构,在这里使用我们的结构体来存放。
#define MAX 100
#define MAX_NAME 20
#define MAX_SEX 5
#define MAX_TELE 15
#define MAX_ADDR 30
typedef struct PeoIno
{
char name[MAX_NAME];
int age;
char sex[MAX_SEX];
char tele[MAX_TELE];
char addr[MAX_ADDR];
}PeoIno;
这里有我们使用多个 #define 宏定义,定义了各种常量,用来规定数组长度。定义了 PeoIno 结构体,包含姓名、年龄、性别、电话、地址这些信息。注意:我们还使用了typedef对名字进行了重命名。
typedef struct Contact
{
PeoIno data[MAX];
int sz;
}Contact;
这个结构体用来存放我们通信录的信息已经通信录的大小。
对于我们通信录的初始化:
void InitContact(Contact* p)
{
p->sz = 0;
memset(p->data, 0, sizeof(p->data));
}
p->sz = 0:将通讯录当前存储的联系人数量初始化为0;memset(p->data, 0, sizeof(p->data)):对通讯录存储联系人数据的数组data进行内存初始化,填充为0。
4.添加功能
首先我们需要对通信录进行判断,,如果通信录满了,那我们就没办法进行添加,只能退出,通信录没满,则可进行添加。
未达上限时,依次提示输入联系人的姓名、年龄、性别、电话、地址,通过 scanf 读取输入数据,存入 Contact 结构体指针 p 指向的 data 数组(当前下标为 p->sz);
void AddContact(Contact* p)
{
if (p->sz == MAX)
{
printf("通讯录已满\n");
return;
}
printf("请输入要添加人的姓名:>\n");
scanf("%s", p->data[p->sz].name);
printf("请输入要添加人的年龄:>\n");
scanf("%d", &(p->data[p->sz].age));
printf("请输入要添加人的性别:>\n");
scanf("%s", p->data[p->sz].sex);
printf("请输入要添加人的电话:>\n");
scanf("%s", p->data[p->sz].tele);
printf("请输入要添加人的地址:>\n");
scanf("%s", p->data[p->sz].addr);
p->sz++;
printf("添加成功\n");
}
5.查找功能
由于我们删除功能,修改功能等都需要先对通信录进行搜索查找,所以我们在这里先实现查找功能。
static int Find(Contact* p,char name[])
{
int i;
for (i = 0; i<p->sz; i++)
{
if (strcmp(p->data[i].name, name)==0)
{
return i;
}
}
return -1;
}
这里我们把查找功能独立成一个函数,方便后续我们的使用调用。
- 实现逻辑:
- 遍历
p->data数组(通过p->sz确定数据量);- 用
strcmp比较当前联系人姓名p->data[i].name与目标name,若匹配成功,返回该联系人在数组中的下标i;- 遍历结束未找到匹配项,返回
-1。
将我们的返回值传给我们的查找函数,pos里面存放我们查找函数返回的值,如果pos==-1,则说明通信录无该人信息,反之即找到了。这里也主要我们需要对通信录进行判断,如果为空,则说明通信录无信息。
void SearchContact(Contact* p)
{
char name[MAX_NAME];
printf("请输入要查找人的姓名:>\n");
scanf("%s", name);
if (p->sz == 0)
{
printf("通信录无信息\n");
return;
}
int pos = Find(p,name);
if (pos == -1)
{
printf("找不到\n");
}
else
{
printf("找到了\n");
}
}
6.删除功能
- 输入待删除联系人姓名:提示用户输入要删除的联系人姓名,并将其存储在
name数组中。- 查找联系人:调用
Find函数查找该联系人在通讯录中的位置。- 检查通讯录是否为空:如果通讯录为空,提示用户并返回。
- 检查是否找到联系人:如果
Find函数返回-1,表示未找到该联系人,提示用户。- 删除联系人:如果找到联系人,从该位置开始,将后面的元素依次前移,覆盖掉要删除的元素。最后将通讯录的有效元素数量减 1。
- 提示删除成功:删除操作完成后,提示用户删除成功。
void DelContact(Contact* p)
{
char name[MAX_NAME];
printf("请输入要删除人的姓名:>\n");;
scanf("%s", name);
int pos = Find(p, name);
if (p->sz == 0)
{
printf("通信录无信息\n");
return;
}
if (pos==-1)
{
printf("找不到\n");
}
else
{
for (int i = pos; i < p->sz; i++)
{
p->data[i] = p->data[i + 1];
}
p->sz--;
printf("删除成功\n");
}
}
7.修改功能
修改功能和我们的删除功能其实很像,都需要先找到目标通信人,在进行操作,这里我们进行的就是修改工作。
- 输入想修稿联系人姓名
- 查找联系人:调用
Find函数查找- 检查通讯录是否为空:如果通讯录为空,提示用户并返回。
- 检查是否找到联系人:如果
Find函数返回-1,表示未找到该联系人。- 修改联系人:如果找到联系人,对其进行修改,而修改其实对于我们值需要重新录入信息,所以这里和我们的添加功能的代码是一样的。
void ModifyContact(Contact* p)
{
char name[MAX_NAME];
printf("请输入要修改人的姓名:>\n");
scanf("%s", name);
int pos = Find(p, name);
if (p->sz == 0)
{
printf("通信录无信息\n");
return;
}
if (pos == -1)
{
printf("找不到\n");
}
else
{
printf("请输入要修改人的姓名:>\n");
scanf("%s", p->data[pos].name);
printf("请输入要修改人的年龄:>\n");
scanf("%d", &(p->data[pos].age));
printf("请输入要修改人的性别:>\n");
scanf("%s", p->data[pos].sex);
printf("请输入要修改人的电话:>\n");
scanf("%s", p->data[pos].tele);
printf("请输入要修改人的地址:>\n");
scanf("%s", p->data[pos].addr);
printf("修改成功\n");
}
8.显示功能
显示功能这里只需要将我们的内容进行打印,调用我们的for循环函数。
- 先打印表头(姓名、年龄、性别、电话、地址),通过
printf格式化输出固定列宽(%-5是向左对齐,不加负号会向右对齐);- 遍历
Contact结构体指针p指向的通讯录数据(通过p->sz确定数据量)打印。
注意:我们的整型打印的符号是“%d”,这一块容易忽略!
9.排序功能
排序我们这里可以采用qsort 进行快排,重点主要快排的参数。cmp 函数问题对我们的通信录进行比较,这里我们比较名字大小。
int cmp(const void* p1, const void*p2)
{
return strcmp((PeoIno*)p1, (PeoIno*)p2);
}
void SortContact(Contact* p)
{
qsort(p->data,p->sz, sizeof(PeoIno), cmp);
printf("排序成功\n");
}
三、总代码
1.contact.h(头文件)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
#include<errno.h>
#define MAX 100
#define MAX_NAME 20
#define MAX_SEX 5
#define MAX_TELE 15
#define MAX_ADDR 30
typedef struct PeoIno
{
char name[MAX_NAME];
int age;
char sex[MAX_SEX];
char tele[MAX_TELE];
char addr[MAX_ADDR];
}PeoIno;
typedef struct Contact
{
PeoIno data[MAX];
int sz;
}Contact;
void InitContact(Contact* p);
void AddContact(Contact* p);
void ShowContact(Contact* p);
void DelContact(Contact* p);
void SearchContact(Contact* p);
void ModifyContact(Contact* p);
void SortContact(Contact* p);
2.contac.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
void InitContact(Contact* p)
{
p->sz = 0;
memset(p->data, 0, sizeof(p->data));
}
void AddContact(Contact* p)
{
if (p->sz == MAX)
{
printf("通讯录已满\n");
return;
}
printf("请输入要添加人的姓名:>\n");
scanf("%s", p->data[p->sz].name);
printf("请输入要添加人的年龄:>\n");
scanf("%d", &(p->data[p->sz].age));
printf("请输入要添加人的性别:>\n");
scanf("%s", p->data[p->sz].sex);
printf("请输入要添加人的电话:>\n");
scanf("%s", p->data[p->sz].tele);
printf("请输入要添加人的地址:>\n");
scanf("%s", p->data[p->sz].addr);
p->sz++;
printf("添加成功\n");
}
void ShowContact(Contact* p)
{
int i;
printf("%-5s %-5s %-5s %-15s %-15s\n", "姓名", "年龄", "性别", "电话", "地址");
for (i = 0; i < p->sz; i++)
{
printf("%-5s %-5d %-5s %-15s %-15s\n", p->data[i].name, p->data[i].age, p->data[i].sex, p->data[i].tele, p->data[i].addr);
}
}
static int Find(Contact* p,char name[])
{
int i;
for (i = 0; i<p->sz; i++)
{
if (strcmp(p->data[i].name, name)==0)
{
return i;
}
}
return -1;
}
void SearchContact(Contact* p)
{
char name[MAX_NAME];
printf("请输入要查找人的姓名:>\n");
scanf("%s", name);
if (p->sz == 0)
{
printf("通信录无信息\n");
return;
}
int pos = Find(p,name);
if (pos == -1)
{
printf("找不到\n");
}
else
{
printf("找到了\n");
printf("%-5s %-5s %-5s %-15s %-15s\n", "姓名", "年龄", "性别", "电话", "地址");
printf("%-5s %-5d %-5s %-15s %-15s\n", p->data[pos].name, p->data[pos].age, p->data[pos].sex, p->data[pos].tele, p->data[pos].addr);
}
}
void DelContact(Contact* p)
{
char name[MAX_NAME];
printf("请输入要删除人的姓名:>\n");;
scanf("%s", name);
int pos = Find(p, name);
if (p->sz == 0)
{
printf("通信录无信息\n");
return;
}
if (pos==-1)
{
printf("找不到\n");
}
else
{
for (int i = pos; i < p->sz; i++)
{
p->data[i] = p->data[i + 1];
}
p->sz--;
printf("删除成功\n");
}
}
void ModifyContact(Contact* p)
{
char name[MAX_NAME];
printf("请输入要修改人的姓名:>\n");
scanf("%s", name);
int pos = Find(p, name);
if (p->sz == 0)
{
printf("通信录无信息\n");
return;
}
if (pos == -1)
{
printf("找不到\n");
}
else
{
printf("请输入要修改人的姓名:>\n");
scanf("%s", p->data[pos].name);
printf("请输入要修改人的年龄:>\n");
scanf("%d", &(p->data[pos].age));
printf("请输入要修改人的性别:>\n");
scanf("%s", p->data[pos].sex);
printf("请输入要修改人的电话:>\n");
scanf("%s", p->data[pos].tele);
printf("请输入要修改人的地址:>\n");
scanf("%s", p->data[pos].addr);
printf("修改成功\n");
}
}
int cmp(const void* p1, const void*p2)
{
return strcmp((PeoIno*)p1, (PeoIno*)p2);
}
void SortContact(Contact* p)
{
qsort(p->data,p->sz, sizeof(PeoIno), cmp);
printf("排序成功\n");
}
3.test.c
#include"contact.h"
void menu()
{
printf("***********************\n");
printf("***0.exit 1.add ****\n");
printf("***2.del 3.search****\n");
printf("***4.modify5.show ****\n");
printf("***6.sort ***\n");
}
enum Option
{
EXIT,
ADD,
DEL,
SEARCH,
MODIFY,
SHOW,
SORT
};
int main()
{
int input;
Contact con;
InitContact(&con);
do
{
menu();
printf("请输入要功能:>\n");
scanf("%d", &input);
switch (input)
{
case ADD:
printf("请添加:>\n");
AddContact(&con);
break;
case DEL:
printf("请删除:>\n");
DelContact(&con);
break;
case SEARCH:
printf("请查找:>\n");
SearchContact(&con);
break;
case MODIFY:
printf("请修改:>\n");
ModifyContact(&con);
break;
case SHOW:
printf("请打印\n");
ShowContact(&con);
break;
case SORT:
printf("请排序\n");
SortContact(&con);
break;
case EXIT:
DestroyContact(&con);
printf("结束\n");
break;
default:
printf("选择错误\n");
break;
}
} while (input);
}
最后相信你已经有所收获,快动手试试看吧!喜欢可以点赞收藏呀!
7158

被折叠的 条评论
为什么被折叠?



