【C语言】通讯录《静态内存版本》②

时间:2023-02-24 15:26:24

????write in front????   

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

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

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

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

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

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

 ????通讯录的定义

在这里我们要实现↓

通讯录中我们规定总共可以存放1000个人的信息。

每个人的信息分别有→名字、年龄、性别、电话、地址。

于是我们就可以创建个通讯录信息的结构体类型来进行定义。

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

typedef struct information
{
//名字、年龄、性别、电话、地址。
char name[Max_name];
int age[Max_age];
char genger[Max_genger];
int telephone[Max_telephone];
char address[Max_address];
}information;

【C语言】通讯录《静态内存版本》②

这个是每个人的信息分别有→名字、年龄、性别、电话、地址。 

#define num 1000
typedef struct Contact
{
//这里用了个结构体嵌套
information date[num];//存放添加进来的信息
int sz;//记录当前通讯录有效信息的个数
}Conta;

【C语言】通讯录《静态内存版本》②

通讯录中我们规定总共可以存放1000个人的信息。 

在上面代码当中我们使用大量 #define 宏定义在这里的好处:

  1. 方便程序的修改,不用对整个程序进行修改,只需对宏定义上进行修改。
  2. 提高程序的运行效率,更加方便模块化。
  3. 我们只需改变宏定义的值,就可以实现不同人数的效果且易于修改。

????枚举类型

这里我们可以配合使用枚举类型常量来和 switch case 语句当中进行使用。因为枚举的默认取值是为0的,可以与上面界面当中的值一一对应,放在case当中的常量表达式当中代码的可读性也会更高。

enum Number
{
Exit,
Increase,
DeLete,
Find,
Revise,
Check,
Print,
};

【C语言】通讯录《静态内存版本》②

推荐枚举常量当中的值大写。 那么此时我们的case语句当中常量表达式的值就可以放上枚举常量这些值了。就像下面这样,示例代码如下↓

switch (input)
{
case Exit:printf("退出通讯录v1.0\n");
break;
case Increase:
break;
case DeLete:
break;
case Find:
break;
case Revise:
break;
case Check:
break;
case Print:
break;
default:printf("你输入的数字找不到,请重新输入~");
}

【C语言】通讯录《静态内存版本》②

【C语言】通讯录《静态内存版本》②


 ????初始化通讯录

在增加通讯录信息之前,我们首先要把通讯录的信息给初始化下。

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

【C语言】通讯录《静态内存版本》②

如果不知道memset()这个内存函数什么意思的话,可以去查下。 

有的人可能会有疑问,这里直接就可以把我们通讯录的结构体类型给初始化0,为什么还需要这个样子。因为这样的话,可以面对较为复杂的问题,之所以能就是因为我们使用了memset()这个内存函数。


????增加通讯录的信息 

对通讯录进行初始化之后,那么就可实现我们的增加通讯录的信息了。ヽ(✿゚▽゚)ノ

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");
}

【C语言】通讯录《静态内存版本》②

在这里是有两种情况的,一个是我们通讯录当中1000人已经是存放满的情况,还有一种是没有存在满,还可以继续添加的情况。存在满了的话直接return;返回即可,没有输入即可。

示例→添加信息如下图所示↓

【C语言】通讯录《静态内存版本》②


????打印通讯录的信息 

那么假设我们增加了通讯录的信息想要打印出来看看的话,这个时候就必须要打印我们通讯录的信息才行。如下代码所示↓

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);
}
}

 - 是左对齐,%3s的数字3是打印空3格位置。

在这里的话假设我们要输入一组通讯录人员的信息,那我们来打印下看下会不会成功。

【C语言】通讯录《静态内存版本》②

成功的打印出来了(^∀^●)ノシ