前言
大家好,今天我们用C语言来实现一个通讯录,具体如何实现呢,我们来看看实现思路
通讯录实现思路
通讯录功能
打开手机,我们可以看到通讯录有以下基础功能
- 增加联系人
- 删除联系人
- 查找联系人
- 修改联系人信息
- 显示全部联系人
- 对联系人进行排序
思路
- 首先我们要创建一个容器,用于存放个人的信息,再将每个人的信息集成到一个更大的容器中,这样存着每个人信息的容器就被我们称作通讯录
- 有了这样一个通讯录后,我们通过函数对通讯录进行操作,以实现通讯录功能,为了方便使用,我们可以创建一个菜单,使操作简单,并且使用循环结构,使操作可以重复进行
具体代码实现
将代码分为3个部分,两个.c文件和一个.h文件
一个.c文件用于存放主函数另一个用于实现函数
.h文件则包含了函数的声明和头文件的包含
- 菜单设计
- 主函数设计
int main()
{
int input = 0;
AB s1;//创建通讯录
initiallize(&s1);//将通讯录初始化,不可将初始化函数放在循环结构中,放在循环结构中无法留下信息,每次循环都会清空通讯录
do
{
printf("请选择\n");
menu();
scanf("%d", &input);
switch(input)
{
case ADD:
addbook(&s1);//添加联系人
break;
case DELETE:
deletebook(&s1);//删除联系人
break;
case CHECK:
checkbook(&s1);//查找联系人
break;
case MODIFICA:
modificabook(&s1);//修改联系人
break;
case SHOW:
showbook(&s1);//显示联系人
break;
case SORT:
sortbook(&s1);//对通讯录进行排序
break;
case 0:
printf("退出通讯录");
break;
default:
printf("选择错误,请重新选择");
break;
}
} while (input);
}
这样的设计使得通讯录可以进行多次操作,并且每次操作都有打印菜单提示,提升用户的交互体验
并且使用枚举,使代码可读性增加
enum options
{
ADD=1,
DELETE,
CHECK,
MODIFICA,
SHOW,
SORT
};
- 预处理
#pragma once//防止重复引用
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define NAME 10//这里使用宏定义最大数组长度,方便后续修改
#define SEX 5
#define NUMBER 15
#define ADDRESS 20
#define MAX_count 100
在.h文件中包含这些预处理
- 个人信息
typedef struct preson
{
char name[NAME];//名字
char sex[SEX];//性别
char number[NUMBER];//号码
char address[ADDRESS];//地址
}PS;
定义一个结构体存储单个人的信息,同时用typedef重命名为PS,方便后续使用
- 将个人信息集成为通讯录
typedef struct addressbook
{
PS book[MAX_count];
int size;
}AB;
重命名为AB
- 通讯录初始化
void initiallize(AB* s1)//对通讯录进行初始化
{
s1->size = 0;
memset(s1->book, 0, sizeof(s1->book));
}
- 添加联系人
void addbook(AB* s1)//添加联系人
{
if (s1->size == MAX_count)
{
printf("通讯录已满,无法添加!");
return;
}
printf("请输入名字\n");
scanf("%s", s1->book[s1->size].name);
printf("请输入性别\n");
scanf("%s", s1->book[s1->size].sex);
printf("请输入电话号码\n");
scanf("%s", s1->book[s1->size].number);
printf("请输入地址\n");
scanf("%s", s1->book[s1->size].address);
s1->size++;
printf("添加成功!\n");
}
效果
- 删除联系人
void deletebook(AB* s1)//删除联系人
{
if (s1->size == 0)
{
printf("通讯录为空");
return;
}
char name[NAME];
printf("请输入要删除人的名字");
scanf("%s", name);
int check = check_someone(s1, name);
if (check == -1)
{
printf("要删除的人不存在");
return;
}
int i = check;
for (i; i < s1->size - 1; i++)
{
s1->book[i] = s1->book[i + 1];
}
s1->size--;
printf("删除成功");
}
这里封装了一个通过名字查找,返回下标的函数
int check_someone(AB* s1,char*name)//找某人,按姓名找
{
int i = 0;
for (i = 0; i < s1->size; i++)
{
if (strcmp(s1->book[i].name, name) == 0)
{
return i;
}
}
return -1;
}
效果
删除前
删除后
- 查找联系人
void checkbook(AB* s1)//查找联系人
{
char name[NAME];
printf("请输入要查找的联系人");
scanf("%s", name);
int check= check_someone(s1, name);
if (check == -1)
{
printf("此人不存在");
return;
}
printf("名字 性别 电话号码 地址\n");
printf("%-10s %-10s %-17s %-15s\n",
s1->book[check].name,
s1->book[check].sex,
s1->book[check].number,
s1->book[check].address);
}
效果
- 修改联系人
void modificabook(AB* s1)//修改联系人
{
char name[NAME];
printf("请输入要修改的联系人");
scanf("%s", name);
int check = check_someone(s1, name);
if (check == -1)
{
printf("此人不存在");
return;
}
printf("请输入名字\n");
scanf("%s", s1->book[check].name);
printf("请输入性别\n");
scanf("%s", s1->book[check].sex);
printf("请输入电话号码\n");
scanf("%s", s1->book[check].number);
printf("请输入地址\n");
scanf("%s", s1->book[check].address);
printf("修改成功!");
}
效果
- 显示联系人
void showbook(AB* s1)//显示联系人
{
int i = 0;
printf("%-10s %-5s %-12s %-30s\n", "姓名", "性别", "电话", "地址");
for (i = 0; i <s1->size; i++)
{
printf("%-10s %-5s %-12s %-30s\n",
s1->book[i].name,
s1->book[i].sex,
s1->book[i].number,
s1->book[i].address);
}
}
效果
- 对联系人排序
(按姓名排序)
int cmp(void* e1, void* e2)
{
return strcmp(((PS*)e1)->name, ((PS*)e2)->name);//按字典序排序
}
void sortbook(AB* s1)//对通讯录进行排序
{
qsort(s1->book, s1->size, sizeof(PS), cmp);
printf("排序成功!\n");
}
效果
完整代码
#pragma once//防止重复引用
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define NAME 10//这里使用宏定义最大数组长度,方便后续修改
#define SEX 5
#define NUMBER 15
#define ADDRESS 20
#define MAX_count 100
typedef struct preson
{
char name[NAME];
char sex[SEX];
char number[NUMBER];
char address[ADDRESS];
}PS;
typedef struct addressbook
{
PS book[MAX_count];
int size;
}AB;
void initiallize(AB* s1);//声明初始化
void addbook(AB* s1);//添加联系人
void deletebook(AB* s1);//删除联系人
void checkbook(AB* s1);//查找联系人
void modificabook(AB* s1);//修改联系人
void showbook(AB* s1);//显示联系人
void sortbook(AB* s1);//对通讯录进行排序
#include "addressbook.h"
void initiallize(AB* s1)//对通讯录进行初始化
{
s1->size = 0;
memset(s1->book, 0, sizeof(s1->book));
}
int check_someone(AB* s1,char*name)//找某人,按姓名找
{
int i = 0;
for (i = 0; i < s1->size; i++)
{
if (strcmp(s1->book[i].name, name) == 0)
{
return i;
}
}
return -1;
}
void addbook(AB* s1)//添加联系人
{
if (s1->size == MAX_count)
{
printf("通讯录已满,无法添加!");
return;
}
printf("请输入名字\n");
scanf("%s", s1->book[s1->size].name);
printf("请输入性别\n");
scanf("%s", s1->book[s1->size].sex);
printf("请输入电话号码\n");
scanf("%s", s1->book[s1->size].number);
printf("请输入地址\n");
scanf("%s", s1->book[s1->size].address);
s1->size++;
printf("添加成功!\n");
}
void deletebook(AB* s1)//删除联系人
{
if (s1->size == 0)
{
printf("通讯录为空");
return;
}
char name[NAME];
printf("请输入要删除人的名字");
scanf("%s", name);
int check = check_someone(s1, name);
if (check == -1)
{
printf("要删除的人不存在");
return;
}
int i = check;
for (i; i < s1->size - 1; i++)
{
s1->book[i] = s1->book[i + 1];
}
s1->size--;
printf("删除成功");
}
void checkbook(AB* s1)//查找联系人
{
char name[NAME];
printf("请输入要查找的联系人");
scanf("%s", name);
int check= check_someone(s1, name);
if (check == -1)
{
printf("此人不存在");
return;
}
printf("名字 性别 电话号码 地址\n");
printf("%-10s %-10s %-17s %-15s\n",
s1->book[check].name,
s1->book[check].sex,
s1->book[check].number,
s1->book[check].address);
}
void modificabook(AB* s1)//修改联系人
{
char name[NAME];
printf("请输入要修改的联系人");
scanf("%s", name);
int check = check_someone(s1, name);
if (check == -1)
{
printf("此人不存在");
return;
}
printf("请输入名字\n");
scanf("%s", s1->book[check].name);
printf("请输入性别\n");
scanf("%s", s1->book[check].sex);
printf("请输入电话号码\n");
scanf("%s", s1->book[check].number);
printf("请输入地址\n");
scanf("%s", s1->book[check].address);
printf("修改成功!");
}
void showbook(AB* s1)//显示联系人
{
int i = 0;
printf("%-10s %-5s %-12s %-30s\n", "姓名", "性别", "电话", "地址");
for (i = 0; i <s1->size; i++)
{
printf("%-10s %-5s %-12s %-30s\n",
s1->book[i].name,
s1->book[i].sex,
s1->book[i].number,
s1->book[i].address);
}
}
int cmp(void* e1, void* e2)
{
return strcmp(((PS*)e1)->name, ((PS*)e2)->name);//按字典序排序
}
void sortbook(AB* s1)//对通讯录进行排序
{
qsort(s1->book, s1->size, sizeof(PS), cmp);
printf("排序成功!\n");
}
#include"addressbook.h"
void menu()
{
printf("*********************************\n");
printf("** 1.add 2.delete **\n");
printf("** 3.check 4.modifica**\n");
printf("** 5.show 6.sort **\n");
printf("** 0.exit **\n");
}
enum options
{
ADD=1,
DELETE,
CHECK,
MODIFICA,
SHOW,
SORT
};
int main()
{
int input = 0;
AB s1;
initiallize(&s1);
printf("初始化完成");
do
{
printf("请选择\n");
menu();
scanf("%d", &input);
switch(input)
{
case ADD:
addbook(&s1);//添加联系人
break;
case DELETE:
deletebook(&s1);//删除联系人
break;
case CHECK:
checkbook(&s1);//查找联系人
break;
case MODIFICA:
modificabook(&s1);//修改联系人
break;
case SHOW:
showbook(&s1);//显示联系人
break;
case SORT:
sortbook(&s1);//对通讯录进行排序
break;
case 0:
printf("退出通讯录");
break;
default:
printf("选择错误,请重新选择");
break;
}
} while (input);
}
以上为静态通讯录的实现,创作不易,请各位多多点赞,关注
,若有错误之处,还请各位斧正!