【C语言】通讯录《静态内存版本》完整代码

时间:2023-02-25 22:58:52

????write in front????   

????大家好,我是謓泽,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流????

????2021|2022年度博客之星物联网与嵌入式开发TOP5|TOP4~2021博客之星TOP100~2022博客之星TOP63~作者周榜84﹣作者总榜704~阿里云专家博主 & 阿里云星级博主~掘金优秀创作者⇿InfoQ创作者⇿51CTO红人⇿全网访问量50w+????

????本文由 謓泽 原创 如需转载还请通知⚠

????个人主页-​謓泽51Ctop的博客​????

????欢迎各位→点赞???? + 收藏⭐️ + 留言????

????系列专栏-​謓泽51Ctop的博客_【C语言】从0~1_51CTO博客​????
✉️我们并非登上我们所选择的舞台,演出并非我们所选择的剧本????

 ✨模块化代码实现


【C语言】通讯录《静态内存版本》完整代码

【C语言】通讯录《静态内存版本》完整代码

编辑

????test.c

示例代码如下↓

#include"address_book.h"
//颜色函数
void color(short x)
{
if (x >= 0 && x <= 15)
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), x);
else
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);
}
//创建菜单函数
void menu()
{
color(0);//黑色
system("cls");//清屏
color(12);//白色
printf("¤--------------------------------------------¤\n");
printf("|■■■■■■■■→通讯录v1.0←■■■■■■■■|\n");
printf("|———————————————————————|\n");
printf("|★★★★★→1.increase ■ 2.deLete←★★★★★|\n");
printf("|★★★★★→3.find ■ 4.Revise←★★★★★|\n");
printf("|★★★★★→5.Check ■ 6.Print ←★★★★★|\n");
printf("|★★★★★→0.Exit ■ ←★★★★★|\n");
printf("|———————————————————————|\n");
printf("|■■■■■■■■→通讯录v1.0←■■■■■■■■|\n");
printf("¤--------------------------------------------¤\n");
}
enum Number
{
Exit,
Increase,
DeLete,
Find,
Revise,
Check,
Print,
};
int main(void)
{
menu();
int input = 0;
//当然初始化全0:Contact con = {0};也是可以的,当然我们这里的初始化不是这样的原因是可以应对比较复杂的问题。
Contact con;//通讯录
//初始化通讯录
InitContact(&con);
do
{
color(5);
printf("¤----------------¤\n");
printf("|请输入界面上的数字|:");
scanf("%d", &input);
printf("¤----------------¤\n");
color(1);
switch (input)
{
case Exit:
printf("══════════════@\n");
printf("退出通讯录v1.0@\n");
printf("══════════════@\n");
break;
case Increase:
//增加人的信息,放在通讯录当中去。
Add_Contact(&con);
break;
case DeLete:
//删除通讯人的信息
DeLete_Contact(&con);
break;
case Find:
//查找指定通讯录人的信息
Find_Contact(&con);
break;
case Revise:
//修改指定通讯录人的信息
Revise_Contact(&con);
break;
case Check:
//排查通讯录当中人员的信息
Check_Contact(&con);
break;
case Print:
//打印通讯录当中人员的信息。
Print_Contact(&con);
break;
default:printf("你输入的数字找不到,请重新输入~\n");
}
} while (input);
return 0;
}

【C语言】通讯录《静态内存版本》完整代码

????address_book.c 

示例代码如下↓

#define _CRT_SECURE_NO_WARNINGS 1
#include"address_book.h"

void InitContact(Contact* pc)
{
pc->sz = 0;
//memest() - 内存设置
memset(pc->date, 0, sizeof(pc->date));
}

void Add_Contact(Contact* pc)
{
if (pc->sz == num)
{
printf("通讯录成员已满\n");
return;
}
//增加一个人的信息
printf("\n");
printf("请输入增加人的名字->:");
scanf("%s", pc->date[pc->sz].name);//注意→数组名是首元素地址,所以不用进行取地址.

printf("请输入增加人的年龄->:");
scanf("%s", pc->date[pc->sz].age);

printf("请输入增加人的性别->:");
scanf("%s", pc->date[pc->sz].genger);

printf("请输入增加人的电话->:");
scanf("%s", pc->date[pc->sz].telephone);

printf("请输入增加人的地址->:");
scanf("%s", pc->date[pc->sz].address);
//成功~
pc->sz++;
printf("★恭喜你~添加信息成功★\n");
printf("\n");
}

void Print_Contact(const Contact* pc)
{
int i = 0;
//打印标题栏的信息
printf("|-------------------------------------------------------|\n");
printf("|%-3s\t%-3s\t%-3s\t%-11s\t%-10s\t|\n", "名字", "年龄", "性别", "电话", "地址");

for (i = 0; i < pc->sz; i++)
{
printf("|%-3s\t%-3s\t%-3s\t%-11s\t%-10s\t|\n", pc->date[i].name,
pc->date[i].age,
pc->date[i].genger,
pc->date[i].telephone,
pc->date[i].address);
}
}

static int FindByname(Contact* pc, char name[])
{
int i = 0;
//用for循环进行遍历
for (i = 0; i < pc->sz; i++)
{
//strcmp()比较字符串
if (strcmp(pc->date[i].name, name) == 0)
{
return i;//返回下标
}
}
return -1;
}

void DeLete_Contact(Contact* pc)
{
char name[Max_name] = { 0 };
//通讯录为空的时候
if (pc->sz == 0)
{
printf("通讯录当中没有任何信息\n");
return;
}
printf("请输入你要删除的名字->:");
scanf("%s", name);
//查找要删除的人:有/没有
int ret = FindByname(pc, name);
if (ret == -1)
{
printf("没有查找到当前人的信息\n");
return;
}
//删除
int i = 0;
for (i = ret; i < pc->sz - 1; i++)
{
pc->date[i] = pc->date[i + 1];
}
pc->sz--;//因为我们删除成功下标要减1
printf("★恭喜你~删除信息成功★\n");
printf("\n");
}

void Find_Contact(Contact* pc)
{
char name[Max_name] = { 0 };
printf("请输入你要查找的名字->:");
scanf("%s", name);
int ret = FindByname(pc, name);
if (ret == -1)
{
printf("没有查找到当前人的名字\n");
return;
}
else
{
printf("|-------------------------------------------------------|\n");
printf("|%-3s\t%-3s\t%-3s\t%-11s\t%-10s\t|\n", "名字", "年龄", "性别", "电话", "地址");

printf("|%-3s\t%-3s\t%-3s\t%-11s\t%-10s\t|\n",
pc->date[ret].name,
pc->date[ret].age,
pc->date[ret].genger,
pc->date[ret].telephone,
pc->date[ret].address);
printf("查找%sの信息成功~\n", pc->date[ret].name);
}
}

void Revise_Contact(Contact* pc)
{
char name[Max_name] = { 0 };
printf("请输入你要修改通讯录人的名字->:");
scanf("%s", name);
int ret = FindByname(pc, name);
if (ret == -1)
{
printf("当前修改人的信息不存在\n");
return;
}
else
{
printf("请输入修改人的名字->:");
scanf("%s", pc->date[ret].name);//注意→数组名是首元素地址,所以不用进行取地址.

printf("请输入修改人的年龄->:");
scanf("%s", pc->date[ret].age);

printf("请输入修改人的性别->:");
scanf("%s", pc->date[ret].genger);

printf("请输入修改人的电话->:");
scanf("%s", pc->date[ret].telephone);

printf("请输入修改人的地址->:");
scanf("%s", pc->date[ret].address);
printf("恭喜你,修改成功~\n");
}
}

int sort_name_max(const void* e1, const void* e2)
{
return (strcmp(((struct Contact*)e1)->date->name, ((struct Contact*)e2)->date->name));
}

void Check_Contact(Contact* pc)
{
//qosrt()函数首字母进行排序
qsort(pc->date, pc->sz, sizeof(pc->date[0]), sort_name_max);
printf("|%-3s\t%-3s\t%-3s\t%-11s\t%-10s\t|\n", "名字", "年龄", "性别", "电话", "地址");
int i;
for (i = 0; i < pc->sz; i++)
{
printf("|%-3s\t%-3s\t%-3s\t%-11s\t%-10s\t|\n", pc->date[i].name,
pc->date[i].age,
pc->date[i].genger,
pc->date[i].telephone,
pc->date[i].address);
}
}

????address_book.h 

示例代码如下↓

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>
#include<string.h>

#define Max_name 5
#define Max_age 100
#define Max_genger 3
#define Max_address 20
#define Max_telephone 20

#define num 1000

//类型的定义
typedef struct information
{
//名字、年龄、性别、电话、地址。
char name[Max_name];
char age[Max_age];
char genger[Max_genger];
char telephone[Max_telephone];
char address[Max_address];
}information;
//通讯录
typedef struct Contact
{
//这里用了个结构体嵌套
information date[num];//存放添加进来的信息
int sz;//记录当前通讯录有效信息的个数
}Contact;
//初始化通讯录
void InitContact(Contact* pc);
//增加通讯录信息
void Add_Contact(Contact* pc);
//打印通讯录的信息
void Print_Contact(const Contact* pc);
//删除通讯人的信息
void DeLete_Contact(Contact* pc);
//查找指定通讯录人的信息
void Find_Contact(Contact* pc);
//修改指定通讯录人的信息
void Revise_Contact(Contact* pc);
//排查通讯录当中人员的信息
void Check_Contact(Contact* pc);

✨最后✨

当然后续还是会用动态内存开辟的方法来实现这个通讯录的一个程序,因为上述程序实际上我们使用的是一个固定开辟内存空间的方式,是不太合适的。

【C语言】通讯录《静态内存版本》完整代码