实现的一个静态的通讯录,我这里采取的是数组的形式来存我的每一个联系人,废话不多,我来一步步的解释我的代码。

  1. 第一个给大家的是我的头文件

    Message.h

#ifndef __Message_H__
#define __Message_H__#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>  #define MAX 1000   //最大1000位联系人
#define NAME_MAX 20   //名字最长
#define GENDER_MAX 5     //性别
#define ADDR_MAX 30   //地址
#define TELE_MAX 12   //电话('\0')typedef struct Person{     //定义一个联系人的所有信息char name[NAME_MAX];char gender[GENDER_MAX];char address[ADDR_MAX];char tele[TELE_MAX];int  age;
}Person;typedef struct Message   //定义一个数组存所有联系人
{Person data[MAX];int sz;             //给联系人编号
}Message, *pMessage;   void InitMessage(pMessage mess);  //初始化通讯录
void AddMessage(pMessage mess);   //增加联系人
void ShowMessage(const pMessage mess); //展示所存的所有联系人
void DelMessage(pMessage mess);  //删除联系人
void SearchMessage(pMessage mess);  //查找联系人
void ModifyMessage(pMessage mess);  //修改联系人
void SortMessage(pMessage mess);  //对联系人分类(按名字分类)
void ClearMessage(pMessage mess);  //清除所有联系人
void ExitMessage(pMessage mess);  //退出
#endif
以上的头文件中我定义的或者声明的变量和结构体我都有详细的介绍。下面在来看看我的函数文件,那可是重点。
  • 在来看看我的主函数是怎么写的

test.c

这里我使用了枚举来将代码更加形象话,别的就没有什么说的了。

#include"Message.h"enum  {EXIT,  //0ADD,  //1DEL,   //2SEARCH,   //3MODIFY,   //4SHOW,   //5SORT,   //6CLEAR,   //7
};void meau()
{printf("        *********************************************\n");printf("        *********************************************\n");printf("        ###############My address book###############\n");printf("        * 1-add          2-del         3-search     *\n");printf("        * 4-modify       5-show        6-Sort       *\n");printf("        * 0-Exit                       7-clear      *\n");printf("        *********************************************\n");printf("        *********************************************\n");
}void test()
{int input = 0;Message my_con;InitMessage(&my_con);do{meau();printf("请选择:");scanf_s("%d", &input);switch (input){case ADD://添加  AddMessage(&my_con);break;case SHOW://显示  ShowMessage(&my_con);break;case DEL://删除  DelMessage(&my_con);break;case SEARCH://查找  SearchMessage(&my_con);break;case MODIFY://修改  ModifyMessage(&my_con);break;case SORT://排序  SortMessage(&my_con);break;case CLEAR://清除  ClearMessage(&my_con);break;case EXIT://退出  exit(0);break;default:printf("输入有误");break;}} while (input);
}void main(void)
{test();return 0;
}

功能函数的编写

咋们一个函数一个函数的进行分析吧。
  • 这是我对于我定义的结构体进行初始化的函数。memset这个函数的功能我简单的给大家介绍一下,
  • void *memset(void *s, int ch, size_t n);将s所指向的某一块内存中的后n个 字节的内容全部设置为ch指定的ASCII值, 第一个值为指定的内存地址,块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作, 其返回值为s。
  • 然后我就没有什么说的了。这时初始化我的结构体。
void InitMessage(pMessage mess)  //初始化结构体
{mess->sz = 0;memset(mess->data, 0, sizeof(mess->data));
}
  • 增加联系人
void AddMessage(pMessage mess)   //增添联系人
{char name[20] = { 0 };assert(mess);if (mess->sz == MAX){printf("通讯录满了!\n");return;}printf("请输入名字:");scanf("%s", (mess->data[mess->sz].name));printf("请输入性别:");scanf("%s", (mess->data[mess->sz].gender));printf("请输入地址:");scanf("%s", (mess->data[mess->sz].address));printf("请输入电话:");scanf("%s", (mess->data[mess->sz].tele));printf("请输入年龄:");scanf("%d", &(mess->data[mess->sz].age));//年龄 取地址  mess->sz++;printf("添加成功 !\n");
}
  • 显示所有联系人
void ShowMessage(const pMessage mess)  //显示联系人
{int i = 0;printf("%15s\t%5s\t%5s\t%15s\t%15s\n", "姓名", "年龄", "性别", "地址", "电话");for (i = 0; i < mess->sz; i++){printf("%15s\t%5d\t%5s\t%15s\t%15s\n",mess->data[i].name,mess->data[i].age,mess->data[i].gender,mess->data[i].address,mess->data[i].tele);}
}
  • 删除联系人

这里面嵌套了一个寻找联系人的函数,因为要删除某个联系人,首先要能够找到这个联系人,下一个查找某个联系人的函数也调用了这个函数。

static int FindEntry(pMessage mess, char name[])  //寻找某个联系人
{int i = 0;for (i = 0; i < mess->sz; i++){if (strcmp(mess->data[i].name, name) == 0)return i;}return -1;
}void DelMessage(pMessage mess)   //删除联系人
{int pos = 0;char name[NAME_MAX] = { 0 };printf("请输入要删除人的名字:\n");scanf("%s", name);pos = FindEntry(mess, name);if (pos == -1){printf("要删除的人不存在 !\n");return;}else{ int j = 0;for (j = pos; j < mess->sz; j++){mess->data[j] = mess->data[j + 1];}mess->sz--;printf("删除成功 !\n");}
}
  • 查找某个联系人
void SearchMessage(pMessage mess)    //查找联系人
{int pos = 0;char name[NAME_MAX] = { 0 };printf("请输入要查找人的名字:\n");scanf("%s", name);pos = FindEntry(mess, name);if (pos == -1){printf("要查找的人不存在 !\n");return;}else{printf("%15s\t%5d\t%5s\t%15s\t%15s\n",mess->data[pos].name,mess->data[pos].age,mess->data[pos].gender,mess->data[pos].address,mess->data[pos].tele);}
}
  • 修改某个联系人
void ModifyMessage(pMessage mess)   //修改联系人
{int i = 0;char flag = 'Y';int mod = -1;   char na[20] = { 0 };do{printf("请输入需要修改的人:");scanf("%s", na);for (i = 0; i < mess->sz; i++){if (strcmp(mess->data[i].name, na) == 0){mod = i;}}if (mod >= 0){printf("请输入修改后的名字:");scanf("%s", &(mess->data[mod].name));printf("请输入修改后的年龄:");scanf("%d", &(mess->data[mod].age));printf("请输入修改后的性别:");scanf("%s", &(mess->data[mod].gender));printf("请输入修改后的地址:");scanf("%s", &(mess->data[mod].address));printf("请输入修改后的电话号码:");scanf("%s", &(mess->data[mod].tele));printf("是否继续录入?(继续输入请输入Y,任意键退出):\n");getchar();scanf("%c", &flag);if (toupper(flag) != 'Y')break;}else{printf("没有你要修改的人!");printf("是否继续修改联系人?(继续则输入Y,按任意键退出):");getchar();scanf("%c", &flag);if (toupper(flag) != 'Y')break;}} while (toupper(flag) == 'Y');
}
  • 对联系人进行排序
    这里排序的时候我是根据联系人姓名的首字母的前后顺序进行排序的。
void  SortMessage(pMessage mess)    //排序
{int i = 0, j = 0;for (i = 0; i < mess->sz - 1; i++){for (j = 0; j < mess->sz - 1 - i; j++){if (strcmp(mess->data[j].name, mess->data[j + 1].name) > 0){Person  peo = mess->data[j];mess->data[j] = mess->data[j + 1];mess->data[j + 1] = peo;}}}printf("%15s\t%5s\t%5s\t%15s\t%15s\n", "姓名", "年龄", "性别", "地址", "电话");for (i = 0; i < mess->sz; i++){printf("%4s\t%2d\t%2s\t%12s\t%12s\n",mess->data[i].name,mess->data[i].age,mess->data[i].gender,mess->data[i].address,mess->data[i].tele);}
}
  • 清空通讯录中所有联系人信息
void ClearMessage(pMessage mess)  //清空
{mess->sz = 0;
}

为方便大家调试,我把功能函数所有代码放在一起吧。如下:

#define  _CRT_SECURE_NO_WARNINGS 1#include"Message.h"void InitMessage(pMessage mess)  //初始化结构体
{mess->sz = 0;memset(mess->data, 0, sizeof(mess->data));
}void AddMessage(pMessage mess)   //增添联系人
{char name[20] = { 0 };assert(mess);if (mess->sz == MAX){printf("通讯录满了!\n");return;}printf("请输入名字:");scanf("%s", (mess->data[mess->sz].name));printf("请输入性别:");scanf("%s", (mess->data[mess->sz].gender));printf("请输入地址:");scanf("%s", (mess->data[mess->sz].address));printf("请输入电话:");scanf("%s", (mess->data[mess->sz].tele));printf("请输入年龄:");scanf("%d", &(mess->data[mess->sz].age));//年龄 取地址  mess->sz++;printf("添加成功 !\n");
}void ShowMessage(const pMessage mess)  //显示联系人
{int i = 0;printf("%15s\t%5s\t%5s\t%15s\t%15s\n", "姓名", "年龄", "性别", "地址", "电话");for (i = 0; i < mess->sz; i++){printf("%15s\t%5d\t%5s\t%15s\t%15s\n",mess->data[i].name,mess->data[i].age,mess->data[i].gender,mess->data[i].address,mess->data[i].tele);}
}static int FindEntry(pMessage mess, char name[])  //寻找某个联系人
{int i = 0;for (i = 0; i < mess->sz; i++){if (strcmp(mess->data[i].name, name) == 0)return i;}return -1;
}void DelMessage(pMessage mess)   //删除联系人
{int pos = 0;char name[NAME_MAX] = { 0 };printf("请输入要删除人的名字:\n");scanf("%s", name);pos = FindEntry(mess, name);if (pos == -1){printf("要删除的人不存在 !\n");return;}else{ int j = 0;for (j = pos; j < mess->sz; j++){mess->data[j] = mess->data[j + 1];}mess->sz--;printf("删除成功 !\n");}
}void SearchMessage(pMessage mess)    //查找联系人
{int pos = 0;char name[NAME_MAX] = { 0 };printf("请输入要查找人的名字:\n");scanf("%s", name);pos = FindEntry(mess, name);if (pos == -1){printf("要查找的人不存在 !\n");return;}else{printf("%15s\t%5d\t%5s\t%15s\t%15s\n",mess->data[pos].name,mess->data[pos].age,mess->data[pos].gender,mess->data[pos].address,mess->data[pos].tele);}
}void ModifyMessage(pMessage mess)   //修改联系人
{int i = 0;char flag = 'Y';int mod = -1;   char na[20] = { 0 };do{printf("请输入需要修改的人:");scanf("%s", na);for (i = 0; i < mess->sz; i++){if (strcmp(mess->data[i].name, na) == 0){mod = i;}}if (mod >= 0){printf("请输入修改后的名字:");scanf("%s", &(mess->data[mod].name));printf("请输入修改后的年龄:");scanf("%d", &(mess->data[mod].age));printf("请输入修改后的性别:");scanf("%s", &(mess->data[mod].gender));printf("请输入修改后的地址:");scanf("%s", &(mess->data[mod].address));printf("请输入修改后的电话号码:");scanf("%s", &(mess->data[mod].tele));printf("是否继续录入?(继续输入请输入Y,任意键退出):\n");getchar();scanf("%c", &flag);if (toupper(flag) != 'Y')break;}else{printf("没有你要修改的人!");printf("是否继续修改联系人?(继续则输入Y,按任意键退出):");getchar();scanf("%c", &flag);if (toupper(flag) != 'Y')break;}} while (toupper(flag) == 'Y');
}void  SortMessage(pMessage mess)    //排序
{int i = 0, j = 0;for (i = 0; i < mess->sz - 1; i++){for (j = 0; j < mess->sz - 1 - i; j++){if (strcmp(mess->data[j].name, mess->data[j + 1].name) > 0){Person  peo = mess->data[j];mess->data[j] = mess->data[j + 1];mess->data[j + 1] = peo;}}}printf("%15s\t%5s\t%5s\t%15s\t%15s\n", "姓名", "年龄", "性别", "地址", "电话");for (i = 0; i < mess->sz; i++){printf("%4s\t%2d\t%2s\t%12s\t%12s\n",mess->data[i].name,mess->data[i].age,mess->data[i].gender,mess->data[i].address,mess->data[i].tele);}
}void ClearMessage(pMessage mess)  //清空
{mess->sz = 0;
}

一个静态的通讯录就完成了,其实代码也不多,只要思路清晰,代码很快就可以写出来了。如有错误,还请大神指点。

静态的通讯录(C语言)相关推荐

  1. 静态网页制作html语言入门

    编辑一个文本文件,代码如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...

  2. 【进阶C语言】静态版通讯录的实现(详细讲解+全部源码)

    前言

  3. @value 静态变量_C/C++语言中的变量的4种存储类型

    所有的数据都有两种类型 (1)数据类型: : 如 int,float 等. (2)存储类型: : 总共有四种存储类型的变量,分别为自动变量(auto).静态变量(static).外部变量(extern ...

  4. c语言实现通讯录_C语言实现双人猜数字游戏

    点击上方"学士科技",选择"设为星标" 资讯.技术干货第一时间送达! C语言合集(基础.进阶.高级)通通有,点我点我      C语言实例 01.C语言编写简单 ...

  5. 遗落在时光里的静态链表(线性表的静态存储)---C语言版

    目录 静态链表的定义 静态链表的操作 初始化 求表长 分配空间 回收空间 插入操作 删除操作 其他操作 完整源代码 总结一下 众所周知,指针是c语言的灵魂,指针使得链表的实现简单明了起来. 但是问题来 ...

  6. 通讯录——C语言实现

    在我们学习一门编程语言的时候,不可避免地会找一些小项目练手,一方面检验自己学习成果,另一方面可以巩固以前所学的知识.而通讯录是很多人都会尝试练习的.今天,将该项目分享出来供大家学习.查阅.其中各功能经 ...

  7. 易语言linux静态编译失败,易语言静态编译出现错误求解决

    静态编译程序的时候出现这个... 开始静态链接... LIBC.lib(crt0dat.obj) : error LNK2005: __cinit already defined in libcmt. ...

  8. java填空题 在非静态成员方法中_JAVA语言与WWW技术复习题

    2016-2017年第二学期JAVA语言与WWW技术复习题 一.填空题 1.Java的三大体系分别是___ Java EE _ __.____ Java SE__.___ Java ME __. 2. ...

  9. 静态优先权调度算法C语言实现6,静态优先权优先算法的进程调度程序文件.doc

    . . . .. . 学习好帮手 静态优先权优先算法的进程调度程序 学 院 专 业 学 生 姓 名 学 号 指导教师姓名 21014年 3 月 19 日 目 录 TOC \o "1-3&qu ...

  10. 静态版通讯录——“C”

    各位CSDN的uu你们好呀,之前小雅兰学过了一些结构体.枚举.联合的知识,现在,小雅兰把这些知识实践一下,那么,就让我们进入通讯录的世界吧 实现一个通讯录: 可以存放100个人的信息 每个人的信息:名 ...

最新文章

  1. SpreadJS 在 Angular2 中支持绑定哪些属性?
  2. mysql --max_allowed_packet=32m_mysql 设置max_allowed_packet 大小的办法
  3. SpringCloud微服务:Sentinel哨兵组件,管理服务限流和降级
  4. python中mean算函数吗_Python numpy.mean函数方法的使用
  5. [CSharp]用VSS还是TFS呢?
  6. chrome无法打开某些网页,但safari可以
  7. QuickGUI编辑器系列---从文件中读取并解析
  8. 揭秘云网络大会“网红”:阿里云自研高性能网关XGW
  9. cad细等线体不显示_cad字体cass cass如何修改字体
  10. 计算机类证书之微软厂商认证分享
  11. python 内存不足_python内存不够
  12. Centos图形界面和命令行切换快捷键 2022_11_15
  13. 服务器安全-阿里自研补丁列表整理
  14. 家用路由器配置方法(精简版)
  15. 通用汽车将向底特律郊区一家工厂投资3亿美元
  16. 关于.net的一则笑话(无奈一笑)
  17. p2197 nim游戏
  18. 记一次JAVA中字符串首字母大写转化为小写的Code
  19. 关于PCM音频和g711音频编码的转换。
  20. 干掉Facebook,干掉扎克伯格!

热门文章

  1. 左右方块消除html5,html5消除方块游戏总结-对象
  2. linux查询文件存储格式,蜗牛哥:Linux中查看文件内容,5种常用查看方式
  3. Java编程:多路查找树
  4. 正则表达式及常用大全
  5. OpenCV_mechanisms of Canny operator(Canny算子检测图像边缘)
  6. 关于Mac下python和pycharm的异常点
  7. android studio 全局变量和变量保存到xml文件的方法及应用
  8. 图像/视频超分之降质过程
  9. 在Node中基于Mongoose对MongoDB进行增删查改(CRUD)操作(一)
  10. union all关联两个不相关的表,按时间排序