当前位置:网站首页>【学习笔记之菜Dog学C】通讯录
【学习笔记之菜Dog学C】通讯录
2022-08-03 09:48:00 【姜君竹】
一、通讯录需求
通讯录功能
1.通讯录中能够存放1000个人的信息(每个人的信息:名字+年龄+性别+电话+地址)
2.增加人的信息
3.删除指定人的信息
4.修改指定人的信息
5.查找指定人的信息
二、通讯录实现流程
- 首先我们需要有一个菜单,所以先编写一个菜单出来
void menu() {
printf("************************************\n");
printf("***** 1.add 2.del *****\n");
printf("***** 3.search 4.modify *****\n");
printf("***** 5.print 0.exit *****\n");
printf("************************************\n");
}
- 菜单上的功能需要实现,并且需要循环出现
//使用枚举,使得代码的可读性提高
enum Option {
EXIT,
ADD,
DEL,
SEARCH,
MODIFY,
PRINT
};
int main() {
int input = 0;
do {
menu();
printf("请选择:");
scanf("%d", &input);
switch (input) {
case ADD:
break;
case DEL:
break;
case SEARCH:
break;
case MODIFY:
break;
case PRINT:
break;
case EXIT:
break;
default:
break;
}
} while (input);
return 0;
}
- 初始化通讯录
这里新建一个contact.h的文件,专门用来存放头文件,函数声明。
#define MAX_NAME 20
#define MAX_SEX 10
#define MAX_TELE 12
#define MAX_ADDR 30
#define MAX 1000
//类型的定义
typedef struct PeoInfo {
char name[MAX_NAME];
char sex[MAX_SEX];
int age;
char tele[MAX_TELE];
char addr[MAX_ADDR];
}PeoInfo;
typedef struct Contact {
PeoInfo data[MAX];//存放添加进来人的信息
int sz;//记录当前通讯录中有效信息的个数
}Contact;
//初始化通讯录
void InitContact(Contact* pc);
再创建一个contact.c的文件用来实现功能
void InitContact(Contact* pc) {
pc->sz = 0;
//内存设置
memset(pc->data, 0, sizeof(pc->data));
}
在main.c中初始化通讯录
int main() {
int input = 0;
//创建通讯录
Contact con;
//初始化通讯录
InitContact(&con);
return 0;
}
- 实现增加联系人功能
在contact.h文件中声明
//增加联系人的信息
void AddContact(Contact* pc);
在contact.c文件中实现增加功能
代码逻辑:首先通讯录是有上限的,所以我们先判断通讯录满没有满,如果满了提示已满,然后退出。如果未满,就让他输入相关的数据,输入完成之后提示增加成功。
void AddContact(Contact* pc) {
//判断通讯录是否已满
if (MAX == pc->sz) {
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");
}
最后在main.c文件中使用
int main() {
int input = 0;
//创建通讯录
Contact con;
//初始化通讯录
InitContact(&con);
do {
menu();
printf("请选择:");
scanf("%d", &input);
switch (input) {
case ADD:
//增加联系人的信息
AddContact(&con);
break;
case DEL:
break;
case SEARCH:
break;
case MODIFY:
break;
case PRINT:
break;
case EXIT:
break;
default:
break;
}
} while (input);
return 0;
}
- 实现增加功能之后,我们要查看一下通讯录,看是否增加成功,所以接下来我们实现查看功能
首先得在contact.h文件中声明函数
//查看联系人信息
void PrintContact(const Contact* pc);
然后在contact.c文件中实现函数功能
代码逻辑:首先我们需要打印一个表头,知道每一列数据分别对应的是什么。然后就开始遍历,将所有信息打印出来。
void PrintContact(const Contact* pc) {
int i = 0;
//打印标题
printf("%10s\t%5s\t%5s\t%12s\t%20s\n", "名字", "年龄", "性别", "电话", "地址");
//打印数据
for (i = 0; i < pc->sz; i++){
printf("%10s\t%5d\t%5s\t%12s\t%20s\n",
pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr);
}
}
最后参照增加功能,在main.c函数中使用
- 实现删除功能
还是先声明
//删除联系人信息
void DelContact(Contact* pc);
然后进行功能实现
代码逻辑:要删除指定联系人的信息,首先得找到这个联系人,所以我们需要有一个查找指定联系人的功能。之后,我们要判断这个通讯内有没有联系人可删,如果没有人,就没得删,提示用户没有联系人。然后看时候能找到指定联系人,如果没有找到,则提醒用户无该联系人;找到指定联系人后进行删除,如何实现整个删除功能呢?我们可以把需要删除的联系人之后的数据依次提前。
static int FindByName(Contact* pc, char name[]) {
int i = 0;
for (i = 0; i < pc->sz; i++) {
if (0 == strcmp(pc->data[i].name, name)) {
return i;
}
}
return -1;//找不到
}
void DelContact(Contact* pc) {
char name[MAX_NAME] = {
0 };
//判断通讯录内是否有联系人
if (0 == pc->sz) {
printf("通讯录为空,无需删除!\n");
return;
}
printf("请输入要删除人的名字:");
scanf("%s", name);
//查找要删除的联系人
//是否找到
int pos = FindByName(pc, name);
if (-1 == pos) {
printf("要删除的人不存在!\n");
return;
}
//删除
int i = 0;
for (i = pos; i < pc->sz - 1; i++) {
pc->data[i] = pc->data[i + 1];
}
pc->sz--;
printf("删除成功!\n");
}
最后参照增加功能,在main.c函数中使用
- 修改指定联系人信息功能
首先得在contact.h文件中声明函数
//修改指定联系人信息
void ModifyContact(Contact* pc);
然后在contact.c文件中实现功能
代码逻辑:修改指定联系人,首先得找到指定联系人,复用之前删除中用来查找联系人的函数,然后判断通讯录里面是否有该联系人,如果没有则提示没有该联系人返回菜单,如果有则进行修改,让用户重新输入数据,将之前的数据覆盖掉。最后可以在代码一开始加上一个判断,看通讯录里面是否有联系人,如果没有就提示用户,然后返回菜单,不执行之后的查找。
void ModifyContact(Contact* pc) {
char name[MAX_NAME] = {
0 };
//判断通讯录内是否有联系人
if (0 == pc->sz) {
printf("通讯录为空!请先添加数据\n");
return;
}
printf("请输入要修改人的名字:");
scanf("%s", name);
//查找联系人
int pos = FindByName(pc, name);
if (-1 == pos) {
printf("要修改的人不存在!\n");
return;
}
else
{
//修改一个人的信息
printf("请输入名字:");
scanf("%s", pc->data[pos].name);
printf("请输入年龄:");
scanf("%d", &pc->data[pos].age);
printf("请输入性别:");
scanf("%s", pc->data[pos].sex);
printf("请输入电话:");
scanf("%s", pc->data[pos].tele);
printf("请输入地址:");
scanf("%s", pc->data[pos].addr);
printf("修改成功!\n");
}
}
最后参照增加功能,在main.c函数中使用
- 查找指定联系人功能
首先得在contact.h文件中声明函数
//查找指定联系人
void SearchContact(Contact* pc);
然后在contact.c文件中实现功能
代码逻辑:首先判断通讯录有没有联系人,没有就提示用户,然后直接返回菜单。如果有才继续往下执行。查找指定联系人,复用之前的函数,找到联系人之后进行信息打印,如果没找到,则提示用户,通讯录里没有这个联系人。然后返回主菜单。
void SearchContact(Contact* pc) {
char name[MAX_NAME] = {
0 };
//判断通讯录内是否有联系人
if (0 == pc->sz) {
printf("通讯录为空!\n");
return;
}
printf("请输入要查找人的名字:");
scanf("%s", name);
//查找联系人
int pos = FindByName(pc, name);
if (-1 == pos) {
printf("要查找的人不存在!\n");
return;
}
else
{
//打印标题
printf("%10s\t%5s\t%5s\t%12s\t%20s\n", "名字", "年龄", "性别", "电话", "地址");
//打印数据
printf("%10s\t%5d\t%5s\t%12s\t%20s\n",
pc->data[pos].name, pc->data[pos].age, pc->data[pos].sex, pc->data[pos].tele, pc->data[pos].addr);
}
}
最后参照增加功能,在main.c函数中使用。
三、通讯录全代码展示
- contact.h文件
#pragma once
#include <stdio.h>
#include <string.h>
#define MAX_NAME 20
#define MAX_SEX 10
#define MAX_TELE 12
#define MAX_ADDR 30
#define MAX 1000
//类型的定义
typedef struct PeoInfo {
char name[MAX_NAME];
char sex[MAX_SEX];
int age;
char tele[MAX_TELE];
char addr[MAX_ADDR];
}PeoInfo;
typedef struct Contact {
PeoInfo data[MAX];//存放添加进来人的信息
int sz;//记录当前通讯录中有效信息的个数
}Contact;
//初始化通讯录
void InitContact(Contact* pc);
//增加联系人的信息
void AddContact(Contact* pc);
//查看联系人信息
void PrintContact(const Contact* pc);
//删除联系人信息
void DelContact(Contact* pc);
//查找指定联系人
void SearchContact(Contact* pc);
//修改指定联系人信息
void ModifyContact(Contact* pc);
- contact.c文件
#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"
void InitContact(Contact* pc) {
pc->sz = 0;
//内存设置
memset(pc->data, 0, sizeof(pc->data));
}
void AddContact(Contact* pc) {
//判断通讯录是否已满
if (MAX == pc->sz) {
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 PrintContact(const Contact* pc) {
int i = 0;
//打印标题
printf("%10s\t%5s\t%5s\t%12s\t%20s\n", "名字", "年龄", "性别", "电话", "地址");
//打印数据
for (i = 0; i < pc->sz; i++){
printf("%10s\t%5d\t%5s\t%12s\t%20s\n",
pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr);
}
}
static int FindByName(Contact* pc, char name[]) {
int i = 0;
for (i = 0; i < pc->sz; i++) {
if (0 == strcmp(pc->data[i].name, name)) {
return i;
}
}
return -1;//找不到
}
void DelContact(Contact* pc) {
char name[MAX_NAME] = {
0 };
//判断通讯录内是否有联系人
if (0 == pc->sz) {
printf("通讯录为空,无需删除!\n");
return;
}
printf("请输入要删除人的名字:");
scanf("%s", name);
//查找要删除的联系人
//是否找到
int pos = FindByName(pc, name);
if (-1 == pos) {
printf("要删除的人不存在!\n");
return;
}
//删除
int i = 0;
for (i = pos; i < pc->sz - 1; i++) {
pc->data[i] = pc->data[i + 1];
}
pc->sz--;
printf("删除成功!\n");
}
void SearchContact(Contact* pc) {
char name[MAX_NAME] = {
0 };
//判断通讯录内是否有联系人
if (0 == pc->sz) {
printf("通讯录为空!\n");
return;
}
printf("请输入要查找人的名字:");
scanf("%s", name);
//查找联系人
int pos = FindByName(pc, name);
if (-1 == pos) {
printf("要查找的人不存在!\n");
return;
}
else
{
//打印标题
printf("%10s\t%5s\t%5s\t%12s\t%20s\n", "名字", "年龄", "性别", "电话", "地址");
//打印数据
printf("%10s\t%5d\t%5s\t%12s\t%20s\n",
pc->data[pos].name, pc->data[pos].age, pc->data[pos].sex, pc->data[pos].tele, pc->data[pos].addr);
}
}
void ModifyContact(Contact* pc) {
char name[MAX_NAME] = {
0 };
//判断通讯录内是否有联系人
if (0 == pc->sz) {
printf("通讯录为空!请先添加数据\n");
return;
}
printf("请输入要修改人的名字:");
scanf("%s", name);
//查找联系人
int pos = FindByName(pc, name);
if (-1 == pos) {
printf("要修改的人不存在!\n");
return;
}
else
{
//修改一个人的信息
printf("请输入名字:");
scanf("%s", pc->data[pos].name);
printf("请输入年龄:");
scanf("%d", &pc->data[pos].age);
printf("请输入性别:");
scanf("%s", pc->data[pos].sex);
printf("请输入电话:");
scanf("%s", pc->data[pos].tele);
printf("请输入地址:");
scanf("%s", pc->data[pos].addr);
printf("修改成功!\n");
}
}
- main.c文件
#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"
void menu() {
printf("************************************\n");
printf("***** 1.add 2.del *****\n");
printf("***** 3.search 4.modify *****\n");
printf("***** 5.sort 6.print *****\n");
printf("***** 0.exit *****\n");
printf("************************************\n");
}
enum Option {
EXIT,
ADD,
DEL,
SEARCH,
MODIFY,
SORT,
PRINT
};
int main() {
int input = 0;
//创建通讯录
Contact con;
//初始化通讯录
InitContact(&con);
do {
menu();
printf("请选择:");
scanf("%d", &input);
switch (input) {
case ADD:
//增加联系人的信息
AddContact(&con);
break;
case DEL:
DelContact(&con);
break;
case SEARCH:
SearchContact(&con);
break;
case MODIFY:
ModifyContact(&con);
break;
case SORT:
break;
case PRINT:
PrintContact(&con);
break;
case EXIT:
printf("退出通讯录!\n");
break;
default:
printf("输入错误,请重新输入!\n");
break;
}
} while (input);
return 0;
}
四、可优化方向
- 排序功能,分别按照姓名、电话、性别、年龄、住址进行排序
- 查找功能可以写个小菜单,可以分别按照姓名、电话、性别、年龄、住址进行查找
- 考虑重名等情况,如果重名应该全部找出来,而不是找到第一个就停止查找
- 电话号码应该不能重复的,可以添加一个判断是否重号的功能
边栏推荐
猜你喜欢
随机推荐
Can't get data for duplicate urls using Scrapy framework, dont_filter=True
Oracle数据库表空间整理回收与释放操作
WinCheck Script
Mysql 主从复制 作用和原理
自动化测试浏览器驱动下载版本对应关系
二叉查找树的插入
STP生成树(端口状态+端口角色+收敛机制 )|||| STP优化技术( uplinkfast技术+Portfast技术+backbonefast技术 )详解
面试突击71:GET 和 POST 有什么区别?
MySQL 如何修改SQL语句,去掉语句中的or
多媒体数据处理实验2:PCA
验证浮点数输入
cass9.1快捷键怎么设置_cass9.1格式刷快捷键命令
DOM0、DOM2、DOM3 事件
10 Convolutional Neural Networks for Deep Learning 2
2022.8.2-----leetcode.622
php中去重二维数组
Mysql OCP 27题
mysql8安装步骤教程
MySQL的存储过程
mongodb服务启动失败_mongodb启动不了