当前位置:网站首页>C语言实现静态版本的通讯录
C语言实现静态版本的通讯录
2022-07-24 17:29:00 【eat_sleep_play( )】
这一次实现的是静态版本的,若是通讯录满了就不能添加了。下一次将会实现动态版本的通讯录,即使是满了,也可以添加容量。当把程序退出的时候,之前添加的信息都消失了,下下次会实现文件版本的通讯录,即使是退出程序,信息也会保留。
目录
1.功能分析
要实现的功能有:增加联系人信息、删除联系人信息、查找联系人信息、修改联系人信息、显示联系人信息、对联系人的信息进行排序。
2.程序框架
程序分为test.c、contact.c两个源文件和contact.h一个头文件。
test.c:主函数接口引入。
contact.c:函数主要实现
contact.h:头文件引入、函数声明、结构体声明。
3.思维导图

4.代码模块
4.1 main函数代码呈现
int main()
{
int input = 0;
contact con;//通讯录
//初始化通讯录
in_it_contact(&con);
do
{
menu();//打印菜单函数
printf("请选择:");
scanf("%d", &input);
switch (input)
{
case EXIT:
printf("退出通讯录\n");
break;
case ADD:
add_contact(&con);//添加联系人信息函数
break;
case DEL:
del_contact(&con);//删除联系人信息函数
break;
case SERCH:
search_contact(&con);//搜索指定联系人信息函数
break;
case MODIFY:
modify_contact(&con);//修改指定联系人信息函数
break;
case SHOW:
show_contact(&con);//展示联系人信息函数
break;
case SORT:
sort_contact(&con);//排序联系人信息函数
break;
default:
printf("选择错误,请重新选择\n");
break;
}
} while (input);
return 0;
}分析:主要是引入函数的接口,此处用了常见的do while循环,并且将input变量作为while()后面括号中的条件,此处是一个极其巧妙的运用,当input变量为0时循环结束,程序终止,此时也与前面的switch和case进行了一一对应。
4.2 菜单函数
void menu()
{
printf("*********>>>>>>> 通讯录选择菜单 <<<<<<*********\n");
printf("*************************************************\n");
printf("************ 1.add 2.del ***************\n");
printf("************ 3.search 4.modify ************\n");
printf("************ 5.show 6.sort **************\n");
printf("************ 0.exit *********************\n");
printf("*************************************************\n");
}使用printf来输出提示玩家的信息,* 可以是打印内容看起来简洁美观
4.3 初始化功能
void in_it_contact(contact* pc)//初始化
{
assert(pc);
pc->count = 0;//将pc指向的count
memset(pc->date, 0, sizeof(pc->date));
}分析:通过memset()内存函数初始化通讯录中的信息,同时将count记录联系人数目的变量设置为0。
4.4 添加联系人
void add_contact(contact* pc)//添加
{
assert(pc);
if (pc->date == MAX)
{
printf("通讯录已满,无法添加\n");
return;
}
printf("请输入姓名:");
scanf("%s", pc->date[pc->count].name);
printf("请输入年龄:");
scanf("%d", &pc->date[pc->count].age);
printf("请输入性别:");
scanf("%s", pc->date[pc->count].sex);
printf("请输入电话:");
scanf("%s", pc->date[pc->count].tele);
printf("请输入地址:");
scanf("%s", pc->date[pc->count].addr);
pc->count++;
printf("添加成功\n");
}分析:在进行添加时要注意进行分情况讨论,首先就是当联系人数目满了的时候就无法继续添加,只有当联系人数目未满的时候才能继续添加,添加后,要将记录联系人数目的变量count进行加1。
4.5 删除联系人的信息
void del_contact(contact* pc)//删除
{
char name[MAX_Name] = { 0 };
assert(pc);
if (pc->count == 0)
{
printf("通讯录为空,没有信息可以删除\n");
return;
}
printf("请输入要删除的姓名:");
scanf("%s", name);
//1.查找
int ret = find_by_name(pc, name);//查找联系人姓名的函数
if (-1 == ret)
{
printf("要删除的人不存在\n");
return;
}
//2.删除
int i = 0;
for (i = ret; i < pc->count - 1; i++)
{
pc->date[i] = pc->date[i + 1];
}
pc->count--;
printf("删除成功\n");
}分析:删除操作并不复杂,就是先查找到我们想要删除的那个联系人,然后将这个联系人后面的信息逐个向前进行覆盖,同时将记录联系人数目的变量count的值进行减1。
4.6 搜索联系人的信息
void search_contact(contact* pc)//搜索
{
assert(pc);
char name[MAX_Name] = { 0 };
if (pc->count == 0)
{
printf("通讯录为空,没有信息可以搜索\n");
return;
}
printf("请输入要搜索的姓名:");
scanf("%s", name);
//1.查找
int ret = find_by_name(pc, name);
if (-1 == ret)
{
printf("要搜索的人不存在\n");
return;
}
//2.展示
printf("%-20s\t%-5s\t%-5s\t%-12s\t%-30s\n", "姓名", "年龄", "性别", "电话", "地址");
printf("%-20s\t%-5d\t%-5s\t%-12s\t%-30s\n", pc->date[ret].name,
pc->date[ret].age,
pc->date[ret].sex,
pc->date[ret].tele,
pc->date[ret].addr);
}分析:如果找到了就打印出联系人的信息,找不到就提示找不到。
4.7 查找函数的实现
int find_by_name(contact* pc, char name[])//查找
{
assert(pc);
int i = 0;
for (i = 0; i < pc->count; i++)
{
if (0 == strcmp(pc->date[i].name, name))
{
return i;
}
}
return -1;
}分析:此处查找函数是通过遍历联系人中的信息进行实现的,当我们想查找的联系人的信息与某个联系人的信息一致时就停止下来,如果能够找到就返回其对应的下标,如果找不到就返回-1。
4.8 修改联系人的信息
void modify_contact(contact* pc)//修改
{
assert(pc);
char name[MAX_Name] = { 0 };
if (pc->count == 0)
{
printf("通讯录为空,没有信息可以修改\n");
return;
}
printf("请输入要修改的姓名:");
scanf("%s", name);
//1.查找
int ret = find_by_name(pc, name);
if (-1 == ret)
{
printf("要修改的人不存在\n");
return;
}
//2.修改
printf("要修改的人的信息已经查找到,接下来开始修改\n");
printf("请输入修改后的姓名:");
scanf("%s", pc->date[ret].name);
printf("请输入修改后的年龄:");
scanf("%d", &pc->date[ret].age);
printf("请输入修改后的性别:");
scanf("%s", pc->date[ret].sex);
printf("请输入修改后的电话:");
scanf("%s", pc->date[ret].tele);
printf("请输入修改后的地址:");
scanf("%s", pc->date[ret].addr);
printf("修改成功\n");
}分析:先找到要修改的人,然后修改;若找不到,就提示不存在。修改其实就是重新输入一遍信息
4.9 打印联系人的信息
void show_contact(const contact* pc)//展示
{
assert(pc);
int i = 0;
printf("%-20s\t%-5s\t%-5s\t%-12s\t%-30s\n", "姓名", "年龄", "性别", "电话", "地址");
for (i = 0; i < pc->count; i++)
{
printf("%-20s\t%-5d\t%-5s\t%-12s\t%-30s\n", pc->date[i].name,
pc->date[i].age,
pc->date[i].sex,
pc->date[i].tele,
pc->date[i].addr);
}
}分析:利用一个循环,将通讯录中的信息打印出来
4.9.1 对联系人的信息进行排序
int cmp_peo_by_age(const void* e1, const void* e2)//按照年龄排序
{
return ((people*)e1)->age - ((people*)e2)->age;
}
void sort_contact(contact* pc)//排序
{
//按照年龄排序
qsort(pc->date, pc->count, sizeof(people), cmp_peo_by_age);
printf("排序成功\n");
}
分析:这里是利用qsort快速排序的函数,按照年龄升序排的。
5.代码运行结果

6.完整代码展示
6.1 contact.h
#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<stdlib.h>
#define MAX 1000
#define MAX_Name 20
#define MAX_Sex 10
#define MAX_Tele 12
#define MAX_Addr 20
//使用typedef对类型重命名
typedef struct people//人的信息
{
char name[MAX_Name];//名字
int age;//年龄
char sex[MAX_Sex];//性别
char tele[MAX_Tele];//电话
char addr[MAX_Addr];//地址
} people;
//通讯录的信息
typedef struct contact
{
people date[MAX];//存放1000个人的信息
//count - 随着信息的存入或删除而增加或减少
int count;//记录当天通讯录中的实际人数
} contact;
void in_it_contact(contact* pc);//初始化通讯录函数的声明
void add_contact(contact* pc);//添加联系人信息函数的声明
void show_contact(const contact* pc);//展示联系人信息函数
void del_contact(contact* pc);//删除联系人信息的函数
void search_contact(contact* pc);//搜索指定联系人的函数
void modify_contact(contact* pc);//修改指定联系人信息的函数
void sort_contact(contact* pc);//排序联系人的函数
6.2 contact.c
#include"contact.h"
void in_it_contact(contact* pc)//初始化
{
assert(pc);
pc->count = 0;//将pc指向的count
memset(pc->date, 0, sizeof(pc->date));
}
void add_contact(contact* pc)//添加
{
assert(pc);
if (pc->date == MAX)
{
printf("通讯录已满,无法添加\n");
return;
}
printf("请输入姓名:");
scanf("%s", pc->date[pc->count].name);
printf("请输入年龄:");
scanf("%d", &pc->date[pc->count].age);
printf("请输入性别:");
scanf("%s", pc->date[pc->count].sex);
printf("请输入电话:");
scanf("%s", pc->date[pc->count].tele);
printf("请输入地址:");
scanf("%s", pc->date[pc->count].addr);
pc->count++;
printf("添加成功\n");
}
void show_contact(const contact* pc)//展示
{
assert(pc);
int i = 0;
printf("%-20s\t%-5s\t%-5s\t%-12s\t%-30s\n", "姓名", "年龄", "性别", "电话", "地址");
for (i = 0; i < pc->count; i++)
{
printf("%-20s\t%-5d\t%-5s\t%-12s\t%-30s\n", pc->date[i].name,
pc->date[i].age,
pc->date[i].sex,
pc->date[i].tele,
pc->date[i].addr);
}
}
int find_by_name(contact* pc, char name[])//查找
{
assert(pc);
int i = 0;
for (i = 0; i < pc->count; i++)
{
if (0 == strcmp(pc->date[i].name, name))
{
return i;
}
}
return -1;
}
void del_contact(contact* pc)//删除
{
char name[MAX_Name] = { 0 };
assert(pc);
if (pc->count == 0)
{
printf("通讯录为空,没有信息可以删除\n");
return;
}
printf("请输入要删除的姓名:");
scanf("%s", name);
//1.查找
int ret = find_by_name(pc, name);//查找联系人姓名的函数
if (-1 == ret)
{
printf("要删除的人不存在\n");
return;
}
//2.删除
int i = 0;
for (i = ret; i < pc->count - 1; i++)
{
pc->date[i] = pc->date[i + 1];
}
pc->count--;
printf("删除成功\n");
}
void search_contact(contact* pc)//搜索
{
assert(pc);
char name[MAX_Name] = { 0 };
if (pc->count == 0)
{
printf("通讯录为空,没有信息可以搜索\n");
return;
}
printf("请输入要搜索的姓名:");
scanf("%s", name);
//1.查找
int ret = find_by_name(pc, name);
if (-1 == ret)
{
printf("要搜索的人不存在\n");
return;
}
//2.展示
printf("%-20s\t%-5s\t%-5s\t%-12s\t%-30s\n", "姓名", "年龄", "性别", "电话", "地址");
printf("%-20s\t%-5d\t%-5s\t%-12s\t%-30s\n", pc->date[ret].name,
pc->date[ret].age,
pc->date[ret].sex,
pc->date[ret].tele,
pc->date[ret].addr);
}
void modify_contact(contact* pc)//修改
{
assert(pc);
char name[MAX_Name] = { 0 };
if (pc->count == 0)
{
printf("通讯录为空,没有信息可以修改\n");
return;
}
printf("请输入要修改的姓名:");
scanf("%s", name);
//1.查找
int ret = find_by_name(pc, name);
if (-1 == ret)
{
printf("要修改的人不存在\n");
return;
}
//2.修改
printf("要修改的人的信息已经查找到,接下来开始修改\n");
printf("请输入修改后的姓名:");
scanf("%s", pc->date[ret].name);
printf("请输入修改后的年龄:");
scanf("%d", &pc->date[ret].age);
printf("请输入修改后的性别:");
scanf("%s", pc->date[ret].sex);
printf("请输入修改后的电话:");
scanf("%s", pc->date[ret].tele);
printf("请输入修改后的地址:");
scanf("%s", pc->date[ret].addr);
printf("修改成功\n");
}
int cmp_peo_by_age(const void* e1, const void* e2)//按照年龄排序
{
return ((people*)e1)->age - ((people*)e2)->age;
}
void sort_contact(contact* pc)//排序
{
//按照年龄排序
qsort(pc->date, pc->count, sizeof(people), cmp_peo_by_age);
printf("排序成功\n");
}6.3 test.c
#include"contact.h"
void menu()
{
printf("*********>>>>>>> 通讯录选择菜单 <<<<<<*********\n");
printf("*************************************************\n");
printf("************ 1.add 2.del ***************\n");
printf("************ 3.search 4.modify ************\n");
printf("************ 5.show 6.sort **************\n");
printf("************ 0.exit *********************\n");
printf("*************************************************\n");
}
enum option
{
EXIT,
ADD,
DEL,
SERCH,
MODIFY,
SHOW,
SORT
};
int main()
{
int input = 0;
contact con;//通讯录
//初始化通讯录
in_it_contact(&con);
do
{
menu();//打印菜单函数
printf("请选择:");
scanf("%d", &input);
switch (input)
{
case EXIT:
printf("退出通讯录\n");
break;
case ADD:
add_contact(&con);//添加联系人信息函数
break;
case DEL:
del_contact(&con);//删除联系人信息函数
break;
case SERCH:
search_contact(&con);//搜索指定联系人信息函数
break;
case MODIFY:
modify_contact(&con);//修改指定联系人信息函数
break;
case SHOW:
show_contact(&con);//展示联系人信息函数
break;
case SORT:
sort_contact(&con);//排序联系人信息函数
break;
default:
printf("选择错误,请重新选择\n");
break;
}
} while (input);
return 0;
}
边栏推荐
- CDN(Content Delivery Network)内容分发网络从入门到与实战
- 2022 Yangtze River Delta industrial automation exhibition will be held in Nanjing International Exhibition Center in October
- Is Shenwan Hongyuan securities' low commission account reliable, reliable and safe
- Open source Invoicing system, 10 minutes to complete, it is recommended to collect!
- Fast power writing
- 还在用Xshell?你out了,推荐一个更现代的终端连接工具!
- 详解 Apache Hudi Schema Evolution(模式演进)
- Getaverse, a distant bridge to Web3
- What is fuzzy theory, foundation and process
- 什么是模糊理论,基础,流程
猜你喜欢

一个实际使用SwiftUI 4.0中ViewThatFits自适应视图的例子
![[matlab]: basic knowledge learning](/img/8c/d13597e402c55df6cbd5e008aef0a5.png)
[matlab]: basic knowledge learning

电脑监控是真的吗?4个实验一探究竟

UFW port forwarding

量化框架backtrader之一文读懂Indicator指标

mysql 查询某字段中以逗号分隔的字符串的方法

滚动条调整亮度和对比度

Yolopose practice: one-stage human posture estimation with hands + code interpretation

Internship report 1 - face 3D reconstruction method

List of stringutils and string methods
随机推荐
ShardingSphere数据库读写分离
ufw 端口转发
Js实现继承的六种方式
Step by step introduction to the development framework based on sqlsugar (12) -- split the content of the page module into components to realize the division and rule processing
Introduction and use of Pinia
图像像素的逻辑操作
还在用Xshell?你out了,推荐一个更现代的终端连接工具!
Ipaylinks, a cross-border payment integration service, won the 3A Asia Award of treasury
Still using xshell? You are out, recommend a more modern terminal connection tool!
CDN (content delivery network) content distribution network from entry to practice
AI opportunities for operators: expand new tracks with large models
Work with growingio engineers this time | startdt Hackathon
Getaverse, a distant bridge to Web3
数论整除分块讲解 例题:2021陕西省赛C
Three.js (7): local texture refresh
Shardingsphere database read / write separation
什么是模糊理论,基础,流程
JS image conversion Base64 Base64 conversion to file object
TCP protocol debugging tool tcpengine v1.3.0 tutorial
Explain Apache Hudi schema evolution in detail