C语言实现通讯录

news/2024/11/8 23:43:33/

目录

前言

通讯录实现的思路与逻辑

通讯录具体实现步骤

完整代码展现

contact.h文件

contact.c文件

test.c文件


前言

通讯录采用模块化编程思路,test.c文件专门测试通讯录的功能,contact.h文件存放函数声明 contact.c存放通讯录对应功能的具体实现;

通讯录的功能能够保存联系人的信息,而联系人的信息包括 姓名 性别 年龄 电话号码 地址
通讯录的功能应该包含如下选项:   
1.增加联系人 2.删除指定联系人 3.查找指定联系人
4.修改指定联系人信息 5.显示通讯录中联系人的信息 0.退出通讯录

通讯录实现的思路与逻辑

  1. 创建通讯录菜单函数以供用户选择其想实现的功能
  2. 使用结构体描述联系人信息并创建通讯录,通讯录实现得有空间保存联系人的信息并且记录当前联系人的个数;
  3. 初始化通讯录;
  4. 增加联系人的信息;
  5. 显示通讯录中的信息;
  6. 删除指定联系人的信息;
  7. 查找指定联系人的信息;
  8. 修改指定联系人的相关信息;

通讯录具体实现步骤

  • 菜单界面
void menu()
{   printf("********************************\n");printf("******1.Add     2.Del   ********\n");printf("******3.Search  4.Modify********\n");printf("******5.Show    0.Exit**********\n");printf("********************************\n");
}void test()
{int input = 0;do{menu();printf("请输入选择:> ");scanf("%d", &input);switch (input){case 1:break;case 2:break;case 3: break;case 4:break;case 5:break;case Exit:printf("退出通讯录\n");break;default:printf("输入错误,请重新输入!\n");break;}} while (input);
}
int main()
{test();return 0;
}
  • 创建通讯录

通讯录里面存放联系人的相关信息,而联系人的信息由姓名 性别 年龄 电话号码 地址组成

typedef struct PeoInfo
{char name[20];int age;char sex[5];char tele[12];char addr[30];
}PeoInfo;

通讯录实现得有空间保存联系人的信息并且记录当前联系人的个数,为了方便函数传参,封装成一个结构体;

typedef struct Contact
{PeoInfo data[1000];//可以存放1000个人的信息int sz;//记录通讯录中已经保存的联系人的个数
}Contact;

为了方便代码可以修改指定大小,使用#define定义的标识符常量代替,同时对上述数字用标识符常量代替

#define Data_Max 1000
#define Name_Max 20
#define Sex_Max 5
#define Tele_Max 12
#define Addr_Max 30

建立菜单功能和选项具有一定的关联性使用枚举;

enum Option
{Exit,// 0Add,//  1Del,//  2Search,//3Modify,//4Show  //5
};

菜单界面修改如下:

void menu()
{   printf("********************************\n");printf("******1.Add     2.Del   ********\n");printf("******3.Search  4.Modify********\n");printf("******5.Show    0.Exit**********\n");printf("********************************\n");
}void test()
{//创建通讯录Contact con;int input = 0;do{menu();printf("请输入选择:> ");scanf("%d", &input);switch (input){case Add:break;case Del:break;case Search: break;case Modify:break;case Show:break;case Exit:printf("退出通讯录\n");break;default:printf("输入错误,请重新输入!\n");break;}} while (input);
}
int main()
{test();return 0;
}

结构体个人信息修改如下:

typedef struct PeoInfo
{char name[Name_Max];int age;char sex[Sex_Max];char tele[Tele_Max];char addr[Addr_Max];
}PeoInfo;

通讯录信息修改如下:

typedef struct Contact
{PeoInfo data[Data_Max];//可以存放1000个人的信息int sz;//记录通讯录中已经保存的联系人的个数
}Contact;
  • 初始化通讯录

使用memset()函数将数组初始化为0,并且将记录通讯录联系人个数的sz置为0;

//初始化通讯录
void InitContact(Contact * pc)
{assert(pc != NULL);memset(pc->data, 0, sizeof(pc->data));//pc->data相当于data数组的数组名,即data数组起始位置的地址;pc->sz = 0;
}
  • 增加联系人的信息

//通讯录初始化后,里面数据为0;
//当我们增加一个人的信息,置于data数组下标为sz的位置;
void AddContact(Contact * pc)
{assert(pc != NULL);//考虑异常情况 当通讯录数据存放满,直接返回if (pc->sz == Data_Max){printf("通讯录已满,无法添加\n");return;}//1.录入信息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);//2.sz++;pc->sz++;printf("添加成功\n");
}
  • 显示通讯录中的信息
void ShowContact(const Contact * pc)
{assert(pc != NULL);int i = 0;printf("%-20s %-5s %-5s %-12s %-30s\n", "姓名", "年龄", "性别", "电话", "地址");for (i = 0; i < pc->sz; i++){printf("%-20s %-5d %-5s %-12s %-30s\n", pc->data[i].name, pc->data[i].age,pc->data[i].sex,pc->data[i].tele, pc->data[i].addr);}}
  • 删除指定联系人的信息

先根据姓名找到要删除的元素(不考虑重名),然后删除,删除方法-要删除指定位置的元素,只需从指定位置开始,后一个元素覆盖掉前一个元素即可,依次进行;

int FindByName(const Contact* pc,char name[])
{assert(pc != NULL);int i = 0;for (i = 0; i < pc->sz; i++){//比较姓名—实际比较字符串—strcmp()函数if (strcmp(pc->data[i].name, name) == 0){return i;}}//遍历完整个数组,仍然没有返回,说明找不到;return -1;
}//删除指定联系人的信息
void DelContact(Contact *pc)
{assert(pc != NULL);//如果通讯录里面元素为0,直接返回;if (pc->sz == 0){printf("通讯录已空,无法删除\n");return;}//根据姓名查找char name[Name_Max] = { 0 };printf("请输入姓名:");scanf("%s", name);//根据名字找到所对应的元素,找到了返回data数组的下标,找不到返回-1;int pos=FindByName(pc,name);if (pos == -1){printf("联系人不存在,无法删除\n");return;}//删除  int j = 0;for (j = pos; j <pc->sz-1; j++){pc->data[j] = pc->data[j + 1];}pc->sz--;printf("删除成功\n");
}
  • 查找指定联系人的信息;
void SearchContact(const Contact* pc)
{assert(pc != NULL);char name[Name_Max] = { 0 };printf("请输入查找人的姓名:");scanf("%s", name);int pos = FindByName(pc, name);if (pos == -1){printf("联系人不存在\n");return;}//找到联系人,显示联系人相关信息;printf("%-20s %-5s %-5s %-12s %-30s\n", "姓名", "年龄", "性别", "电话", "地址");printf("%-20s %-5d %-5s %-12s %-30s\n", pc->data[pos].name, pc->data[pos].age,pc->data[pos].sex, pc->data[pos].tele, pc->data[pos].addr);}
  • 修改联系人的相关信息
void ModContact(Contact* pc)
{assert(pc != NULL);//先根据姓名查找要修改的元素char name[Name_Max] = { 0 };printf("请输入修改人的姓名:");scanf("%s", name);int pos = FindByName(pc, name);if (pos == -1){printf("联系人不存在\n");return;}//重新输入该位置的信息;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");
}

完整代码展现

contact.h文件

# include <stdio.h>
# include <string.h>
# include <assert.h>#define Data_Max 1000
#define Name_Max 20
#define Sex_Max 5
#define Tele_Max 12
#define Addr_Max 30typedef struct PeoInfo
{char name[Name_Max];int age;char sex[Sex_Max];char tele[Tele_Max];char addr[Addr_Max];
}PeoInfo;
//通讯录实现得有空间保存联系人的信息并且记录当前联系人的个数;
//为了方便传参,封装成一个结构体;
typedef struct Contact
{PeoInfo data[Data_Max];//可以存放1000个人的信息int sz;//记录通讯录中已经保存的联系人的个数
}Contact;//建立菜单功能和选项的关联使用枚举;
enum Option
{Exit,// 0Add,//  1Del,//  2Search,//3Modify,//4Show  //5
};//函数的声明//初始化通讯录
void InitContact(Contact * pc);//增加联系人的信息
void AddContact(Contact * pc);//显示通讯录中的信息
void ShowContact(const Contact * pc);//删除指定联系人的信息
void DelContact(Contact *pc);//查找指定联系人的信息
void SearchContact(const Contact* pc);//修改联系人的相关信息
void ModContact(Contact* pc);

contact.c文件

# include "contact.h"
//初始化通讯录
void InitContact(Contact * pc)
{assert(pc != NULL);memset(pc->data, 0, sizeof(pc->data));//pc->data相当于data数组的数组名,即data数组起始位置的地址;pc->sz = 0;
}
//增加联系人的信息
//通讯录初始化后,里面数据为0;
//当我们增加一个人的信息,置于data数组下标为sz的位置;
void AddContact(Contact * pc)
{assert(pc != NULL);//考虑异常情况 当通讯录数据存放满,直接返回if (pc->sz == Data_Max){printf("通讯录已满,无法添加\n");return;}//1.录入信息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);//2.sz++;pc->sz++;printf("添加成功\n");
}
//显示通讯录中的信息
void ShowContact(const Contact * pc)
{assert(pc != NULL);int i = 0;printf("%-20s %-5s %-5s %-12s %-30s\n", "姓名", "年龄", "性别", "电话", "地址");for (i = 0; i < pc->sz; i++){printf("%-20s %-5d %-5s %-12s %-30s\n", pc->data[i].name, pc->data[i].age,pc->data[i].sex,pc->data[i].tele, pc->data[i].addr);}
}int FindByName(const Contact* pc,char name[])
{assert(pc != NULL);int i = 0;for (i = 0; i < pc->sz; i++){//比较姓名—实际比较字符串—strcmp()函数if (strcmp(pc->data[i].name, name) == 0){return i;}}//遍历完整个数组,仍然没有返回,说明找不到;return -1;
}//删除指定联系人的信息
void DelContact(Contact *pc)
{assert(pc != NULL);//如果通讯录里面元素为0,直接返回;if (pc->sz == 0){printf("通讯录已空,无法删除\n");return;}//先根据姓名找到要删除的元素(不考虑重名)char name[Name_Max] = { 0 };printf("请输入姓名:");scanf("%s", name);//根据名字找到所对应的元素,找到了返回data数组的下标,找不到返回-1;int pos=FindByName(pc,name);if (pos == -1){printf("联系人不存在,无法删除\n");return;}//删除  //删除方法-要删除指定位置的元素,只需从指定位置开始,后一个元素覆盖掉前一个元素即可,依次进行;int j = 0;for (j = pos; j <pc->sz-1; j++){pc->data[j] = pc->data[j + 1];}pc->sz--;printf("删除成功\n");
}//查找指定联系人的信息
void SearchContact(const Contact* pc)
{assert(pc != NULL);char name[Name_Max] = { 0 };printf("请输入查找人的姓名:");scanf("%s", name);int pos = FindByName(pc, name);if (pos == -1){printf("联系人不存在\n");return;}//找到联系人,显示联系人相关信息;printf("%-20s %-5s %-5s %-12s %-30s\n", "姓名", "年龄", "性别", "电话", "地址");printf("%-20s %-5d %-5s %-12s %-30s\n", pc->data[pos].name, pc->data[pos].age,pc->data[pos].sex, pc->data[pos].tele, pc->data[pos].addr);}//修改联系人的信息
void ModContact(Contact* pc)
{assert(pc != NULL);//先根据姓名查找要修改的元素char name[Name_Max] = { 0 };printf("请输入修改人的姓名:");scanf("%s", name);int pos = FindByName(pc, name);if (pos == -1){printf("联系人不存在\n");return;}//重新输入该位置的信息;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");
}

test.c文件

# include "contact.h"
void menu()
{   printf("********************************\n");printf("******1.Add     2.Del   ********\n");printf("******3.Search  4.Modify********\n");printf("******5.Show    0.Exit**********\n");printf("********************************\n");
}void test()
{//创建通讯录Contact con;//初始化通讯录InitContact(&con);int input = 0;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:ModContact(&con);break;case Show:ShowContact(&con);break;case Exit:printf("退出通讯录\n");break;default:printf("输入错误,请重新输入!\n");break;}} while (input);
}
int main()
{test();return 0;
}


http://www.ppmy.cn/news/427976.html

相关文章

web存储(Storage)

目录 1、基本概念 2、功能监测 2.1 测试可用性 2、W3C标准 3、基本方法或属性 4、 Local Storage 4.1 描述 4.2 示例 5、sessionStorage 5.1 描述 5.2 示例 6、StorageEvent&#xff08;存储事件&#xff09; 6.1 构造函数 6.2 实例属性 6.3 实例方法 6.4 响应…

mac如何在docker中安装elk

在 macOS 上安装 ELK&#xff08;Elasticsearch、Logstash 和 Kibana&#xff09;可以通过 Docker 进行简化。下面是在 Docker 中安装 ELK 的步骤&#xff1a; 安装 Docker&#xff1a;首先&#xff0c;确保你已经在 macOS 上安装了 Docker。你可以从 Docker 官方网站下载和安装…

10G光通信 64B66B编解码 配置方法及其工作原理

目录 1 配置IP核1.1 Page1&#xff1a;GT Selection:1.2 Page2&#xff1a;Line Rate,RefClk Selections: 1.3 Page3&#xff1a;Encoding and Clocking&#xff1a;输入/输出缓冲器工作原理两种序列计数器工作原理 1.4 page4: Comma Alignment and Equalization均衡模式 1.5 p…

GPU学习总结

GPU简介 处理器&#xff08;cpu&#xff09;功耗按照下式计算&#xff1a;P CV 2 ^2 2f 其中C为电容&#xff0c;V为电压&#xff0c;f为处理器主频。P值越高说明cpu性能越好&#xff0c;频率越大P越大&#xff0c;但是对散热的要求越高。 CPU的局限性 “摩尔定律”&#xff…

高通WLAN框架学习(13)-- GreenTx

介绍GreenTx (GTx)特性特有的QTI输出功率和控制算法。 GTx特性降低了传输功率,在保持吞吐量的同时降低了芯片功耗。 GTx调整发送的功率,以确保使用最低的输出功率,同时保持最高的可能的数据速率。 GTx特性可以在给定速率下降低发送功率——前提是目标接收机的信噪比有足够…

GTX高速收发器Transceiver概述与收发共同特征(UG476)

目录 本文主要对xilinx的GTX核的使用手册进行阅读&#xff0c;UG476&#xff0c;可以对照着原文再看我的博文。 Ch1.Transceiver and Tool Overview Ch2.Shared Features 2.1Reference Clock Input Structure 2.2Reference Clock Selection and Distribution 2.3Reset and Init…

Xilinx GT学习

一、GT的概念 Xilinx FPGA的GT意思是Gigabyte Transceiver。通常称呼为Serdes、高速收发器。GT在xilinx不同系列有着不同的产品&#xff0c;从7系列到UltraScale系列分别有GTP、GTX、GTZ、GTH、GTY和GTM。不同GT整体结构上类似&#xff0c;为了支持越来越高的line rate&#x…

计算机硬件知识学习

计算机硬件知识学习&#xff01; 新安装系统下的显卡驱动问题导致屏幕亮度不可调节&#xff0c;需要一直顶着最高强度学习&#xff0c;白天还好&#xff0c;晚上难受&#xff0c;于是折腾驱动&#xff0c;一个晚上加半个上午时间搭进去了&#xff0c;还是不尽如人意&#xff0…