文章预览

  • 一:通讯录功能简介
  • 二:通讯录设计思路简介
  • 三:通讯录主函数与通讯录菜单
    • 3.1通讯录菜单
    • 3.2通讯录主函数与枚举的利用
  • 四:通讯录的创建与初始化
    • 4.1.联系人所包含信息内容`
    • 4.2.通讯录所包含内容
  • 五:通讯录各部分功能实现
    • 1.新建联系人
    • 2.删除联系人
    • 3.查找联系人
    • 4.修改联系人
    • 5.按姓名对联系人排序
      • 5.1按姓名排序联系人的实现
      • 5.2简单介绍如何按照结构体中元素类型快速排序结构体
    • 6.打印全部联系人信息
  • 六:头文件与宏
  • 七:源码总览:

一:通讯录功能简介

 该通讯录通过C语言实现,能够完成新建,删除,查找,修改,排序,打印联系人信息这六项功能。再对联系人信息进行排序时,除在文章中应用的以姓名作为排序方式外,我们还可以写出不同的快速排序函数进行排序。

二:通讯录设计思路简介

首先,我们需要创建主函数与目录,创建菜单函数并利用do while语句实现多组输入,利用switch case 语句判断输入的信息并执行相应的函数模块。
其次,我们需要创建通讯录并将其初始化。我们应创建结构体1存放单个联系人的所有信息,随后创建结构体2,结构体2包含一个结构体数组用于存放多个联系人的信息,还包含一个整型变量用于记录当前已存在的联系人个数。
最终,我们依次实现六个功能函数即可完成一个建议的静态通讯录。

三:通讯录主函数与通讯录菜单

3.1通讯录菜单

设计菜单选项用于程序与用户的交互

void menu()//菜单函数
{printf("*************************\n");printf("**** 1.add    2.del    **\n");printf("**** 3.search 4.modify **\n");printf("**** 5.sort   0.exit   **\n");printf("**** 6.print  ***********\n");printf("*************************\n");
}

3.2通讯录主函数与枚举的利用

利用do while与switch case 语句设计主函数


```c
enum Option//利用枚举体优化输入方式
{EXIT,//0ADD,//1DEL,//2SEARCH,//3MODIFY,//4SORT,//5PRINT//6
};
void test()//主体实现函数
{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:SortContact(&con);break;case PRINT:PrintContact(&con);break;case EXIT:printf("退出通讯录\n");break;default:printf("选择错误\n");break;}}while(input);
}int main()
{test();return 0;
}

四:通讯录的创建与初始化

4.1.联系人所包含信息内容`

利用结构体容纳单个成员的各类信息,使用宏定义便于直接修改

#define max 1000
#define name_max 20
#define sex_max 5
#define tele_max 12
#define addr_max 30typedef struct PeoInfo//创建结构体包含每个元素的各个变量
{char name[name_max];char sex[sex_max];int age;char tele[tele_max];char addr[addr_max];
}PeoInfo;

4.2.通讯录所包含内容

#define max 1000//最多存放1000位联系人信息
typedef struct Contact//创建总通讯录结构体
{PeoInfo data[max];//可以存放1000个人的信息int sz;//记录通讯录中已经保存的信息的个数
}Contact;

五:通讯录各部分功能实现

1.新建联系人

void AddContact(Contact* pc)//功能一:增加联系人
{assert(pc);//特殊情况:通讯录如果已经放满了那么就不能再放入元素了if(pc->sz==max){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++;//联系人个数加1printf("添加成功\n");
}

实现效果:

2.删除联系人

void DelContact(Contact* pc)//功能二:删除联系人
{assert(pc);if(pc->sz==0){printf("没有联系人,无法删除\n");return;}int n;printf("请输入要删除的联系人编号:>");scanf("%d",&n);memset(((pc->data)+n-1),0,sizeof(pc->data[n-1]));for(int i=n;i<pc->sz;i++){strcpy(pc->data[i-1].name,pc->data[i].name);pc->data[i-1].age = pc->data[i].age;strcpy(pc->data[i-1].sex,pc->data[i].sex);strcpy(pc->data[i-1].tele,pc->data[i].tele);strcpy(pc->data[i-1].addr,pc->data[i].addr);}pc->sz--;//删除后联系人位数减一
}

实现效果:

3.查找联系人

查找也可以额外编写查找函数按照姓名查找,更加方便:

int find_name(struct Contact* pc,char name[name_max])
{for(int i=0;i<ps->name;i++){if(strcmp(pc->sata[i].name,name) == 0){return i;//返回元素下标}}return -1;//未找到该联系人
}
void SearchContact(const Contact* pc)
{char name[name_max]={0};printf("请输入要查找联系人的姓名:>");scanf("%s",name);int pos = find_name(pc,name);if(pos == -1){printf("不存在要查找的联系人\n");return;}printf("%20s %5s %5s %12s %30s\n","姓名","年龄","性别","电话","地址");for(int 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);}
}

按编号查找:

void SearchContact(Contact* pc )//功能三:查找联系人(按编号)
{assert(pc);int n;printf("请输入要查找的联系人编号:>");scanf("%d",&n);if(n>pc->sz){printf("不存在该联系人,找不到\n");return ;}int i=n-1;printf("找到了,这个联系人的信息是:>\n");printf("%20s %3d %5s %12s %30s\n",pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].tele,pc->data[i].addr);}

实现效果:

4.修改联系人

按编号修改联系人,也可自行编写按姓名修改联系人的函数,与3.查找联系人同理

void ModifyContact(Contact* pc)//功能四:更改联系人
{assert(pc);int n;printf("请输入需要更改的联系人编号");scanf("%d" ,&n);if(n>pc->sz){printf("不存在该联系人,无法更改\n");return ;}int i=n-1;printf("请输入更改后的名字:>");scanf("%s",pc->data[i].name);printf("请输入更改后的年龄:>");scanf("%d",&(pc->data[i].age));printf("请输入更改后的性别:>");scanf("%s",pc->data[i].sex);printf("请输入更改后的电话:>");scanf("%s",pc->data[i].tele);printf("请输入更改后的地址:>");scanf("%s",pc->data[i].addr);
}

实现效果:

5.按姓名对联系人排序

5.1按姓名排序联系人的实现

利用快速排序即可实现:

int PeoInfo_name_cmp(const void* a,const void* b)
{PeoInfo * a1=(PeoInfo *)a;PeoInfo * b1=(PeoInfo *)b;return (strcmp((a1->name),(b1->name)));//名字是两个字符串,不能使用减法进行比较
}void SortContact(Contact* pc)
{qsort(pc->data,pc->sz,sizeof(pc->data[0]),PeoInfo_name_cmp);
}

实现效果:

5.2简单介绍如何按照结构体中元素类型快速排序结构体

可使用快速排序依照结构体中元素类型完成相应排序:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct Stu
{char name[20];int age;double score;
};
int Stu_name_cmp(const void* a,const void* b)
{struct Stu* a1=(struct Stu*)a;struct Stu* b1=(struct Stu*)b;return (strcmp((b1->name),(a1->name)));//名字是两个字符串,不能使用减法进行比较
}
int Stu_age_cmp(const void* a,const void* b)
{struct Stu* a1=(struct Stu*)a;struct Stu* b1=(struct Stu*)b;return (a1->age)-(b1->age);
}
int Stu_score_cmp(const void* a,const void* b)
{struct Stu* a1=(struct Stu*)a;struct Stu* a2=(struct Stu*)b;return (a1->score)-(a2->score);
}
int main()
{struct Stu arr[3]={{"zHang San",20,55.5},{"li si",30,66.6},{"wang wu",40,77.7}};qsort(arr,sizeof(arr)/sizeof(arr[0]),sizeof(arr[0]),Stu_name_cmp);struct Stu *p=arr;printf("%s , %s , %s\n",p->name,(p+1)->name,(p+2)->name);qsort(arr,sizeof(arr)/sizeof(arr[0]),sizeof(arr[0]),Stu_age_cmp);printf("%d , %d , %d\n",p->age,(p+1)->age,(p+2)->age);qsort(arr,sizeof(arr)/sizeof(arr[0]),sizeof(arr[0]),Stu_score_cmp);printf("%.1f , %.1f , %.1f\n",p->score,(p+1)->score,(p+2)->score);return 0;
}

6.打印全部联系人信息

void PrintContact(const Contact* pc)//功能六:打印联系人
{assert(pc);if(pc->size ==0){printf("通讯录为空\n"):}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);}}

实现效果:

六:头文件与宏

#include<stdio.h>
#include<string.h>
#include<assert.h>
#define max 1000
#define name_max 20
#define sex_max 5
#define tele_max 12
#define addr_max 30
#include<stdlib.h>

七:源码总览:

注:本源码使用的为按编号查找

#include<stdio.h>
#include<string.h>
#include<assert.h>
#define max 1000
#define name_max 20
#define sex_max 5
#define tele_max 12
#define addr_max 30
#include<stdlib.h>typedef struct PeoInfo//创建结构体包含每个元素的各个变量
{char name[name_max];char sex[sex_max];int age;char tele[tele_max];char addr[addr_max];
}PeoInfo;typedef struct Contact//创建总通讯录结构体
{PeoInfo data[max];//可以存放1000个人的信息int sz;//记录通讯录中已经保存的信息的个数
}Contact;void InitContact(Contact* pc)//对通讯录进行初始化
{assert(pc);pc->sz=0;memset(pc->data,0,sizeof(pc->data));
//  for(int i=0;i<1000;i++)
//  {//      pc->data[i]=0;
//  }
}enum Option//利用枚举体优化输入方式
{EXIT,ADD,DEL,SEARCH,MODIFY,SORT,PRINT
};void AddContact(Contact* pc)//功能一:增加联系人
{assert(pc);//特殊情况:通讯录如果已经放满了那么就不能再放入元素了if(pc->sz==max){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)//功能六:打印联系人
{assert(pc);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);}}//按照姓名等其他信息找人可以封装一个查找函数,找到了返回下标
void DelContact(Contact* pc)//功能二:删除联系人
{assert(pc);if(pc->sz==0){printf("没有联系人,无法删除\n");return;}int n;printf("请输入要删除的联系人编号:>");scanf("%d",&n);memset(((pc->data)+n-1),0,sizeof(pc->data[n-1]));for(int i=n;i<pc->sz;i++){strcpy(pc->data[i-1].name,pc->data[i].name);pc->data[i-1].age = pc->data[i].age;strcpy(pc->data[i-1].sex,pc->data[i].sex);strcpy(pc->data[i-1].tele,pc->data[i].tele);strcpy(pc->data[i-1].addr,pc->data[i].addr);}pc->sz--;//删除后联系人位数减一
}void SearchContact(Contact* pc )//功能三:查找联系人
{assert(pc);int n;printf("请输入要查找的联系人编号:>");scanf("%d",&n);if(n>pc->sz){printf("不存在该联系人,找不到\n");return ;}int i=n-1;printf("找到了,这个联系人的信息是:>\n");printf("%20s %3d %5s %12s %30s\n",pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].tele,pc->data[i].addr);}void ModifyContact(Contact* pc)//功能四:更改联系人
{assert(pc);int n;printf("请输入需要更改的联系人编号");scanf("%d" ,&n);if(n>pc->sz){printf("不存在该联系人,无法更改\n");return ;}int i=n-1;printf("请输入更改后的名字:>");scanf("%s",pc->data[i].name);printf("请输入更改后的年龄:>");scanf("%d",&(pc->data[i].age));printf("请输入更改后的性别:>");scanf("%s",pc->data[i].sex);printf("请输入更改后的电话:>");scanf("%s",pc->data[i].tele);printf("请输入更改后的地址:>");scanf("%s",pc->data[i].addr);
}int PeoInfo_name_cmp(const void* a,const void* b)
{PeoInfo * a1=(PeoInfo *)a;PeoInfo * b1=(PeoInfo *)b;return (strcmp((a1->name),(b1->name)));//名字是两个字符串,不能使用减法进行比较
}void SortContact(Contact* pc)
{qsort(pc->data,pc->sz,sizeof(pc->data[0]),PeoInfo_name_cmp);
}void menu()//菜单函数
{printf("*************************\n");printf("**** 1.add    2.del    **\n");printf("**** 3.search 4.modify **\n");printf("**** 5.sort   0.exit   **\n");printf("**** 6.print  ***********\n");printf("*************************\n");
}void test()//主体实现函数
{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:SortContact(&con);break;case PRINT:PrintContact(&con);break;case EXIT:printf("退出通讯录\n");break;default:printf("选择错误\n");break;}}while(input);
}int main()
{test();return 0;
}

简易的C语言静态通讯录相关推荐

  1. 用C语言实现 静态通讯录+动态通讯录+文件实现“退出保存信息版本”(附上思路+项目展示+源代码)

    前言 : 在生活中我们经常会遇到通讯录的使用,比如存进一个新的联系人的信息,或者对其删除,修改,查找:那这些神奇的功能是如何实现的?我们不禁好奇.今天,这篇博文将教会大家实现一个静态的或者动态的通讯录 ...

  2. 从0开始学c语言 - 34 - 通讯录 -静态、动态、存到文件(三种版本)

    上一篇:从0开始学c语言-33-动态内存管理_阿秋的阿秋不是阿秋的博客-CSDN博客 我发现,理论的学习文章没几个人看,如果是这种实践类型的文章,看的人很多,偏偏我之前都是扔完代码就走了,也没认真写这 ...

  3. 【C语言】通讯录——源代码

    这里附上上一篇通讯录博客的链接 [C语言]通讯录_Brant_zero的博客-CSDN博客 目录 一.头文件 二.函数功能实现 三.主函数 一.头文件 //头文件 #include <stdio ...

  4. c语言通讯录二分查找,C语言程序设计 通讯录程序.doc

    <C语言程序设计 通讯录程序.doc>由会员分享,可在线阅读,更多相关<C语言程序设计 通讯录程序.doc(28页珍藏版)>请在人人文库网上搜索. 1.目录:课 程 设 计 任 ...

  5. 为什么php动态语言,动态语言静态化

    [TOC] ## 什么是动态语言静态化 将现有PHP等动态语言的逻辑代码生成为静态HTML文件,用户访问动态脚本重定向到静态HTML文件的过程. 对实时性要求不高的页面 ## 为什么要静态化 动态脚本 ...

  6. 教你C语言实现通讯录的详细代码

    本文详细讲解了C语言实现通讯录的方法,文中通过示例代码介绍的非常详细.对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下 (一)实现思路 1.通讯录功能 添加好友,删除好友,查找好友,修改 ...

  7. 简陋版C语言仿真通讯录之动态内存开辟版本

    简陋版C语言仿真通讯录 https://blog.csdn.net/csdn_kou/article/details/80287640 简陋版C语言仿真通讯录之动态内存开辟版本 给Contact结构体 ...

  8. 个人通讯管理程序C语言,个人通讯录管理系统C语言源程序(优秀版)[1]

    个人通讯录管理系统C语言源程序(优秀版)[1] 更新时间:2017/2/22 1:03:00  浏览量:613  手机版 C语言个人通讯录系统源程序: #include /*头文件*/ #includ ...

  9. 关于动态语言 静态语言 静态类型语言 动态类型语言的区别

    参考链接:关于"编译型""解释型""动态语言""静态语言""动态类型语言""静态类型语言& ...

最新文章

  1. Makefile中的几个调试方法
  2. R语言ggplot2可视化删除所有分面图(facet_wrap可视化的facet结果)的标签实战(Remove facet_wrap labels)
  3. 概率密度函数pdf(probability densinity function) DOC API
  4. 4种营销场景满足其中一个要不要做小程序?
  5. python解释器 pip安装_pip安装Python库时的问题及解决方法总结
  6. 战疫期,钉钉如何扛起暴增百倍的流量?
  7. 使用Mutex进行线程处理
  8. python小白从哪来开始-老男孩python课程亮点在哪里?python小白
  9. BZOJ3450 Easy
  10. Symbian手记【四】 —— Symbian的容器
  11. ABBYY最新OCR文字识别软件 ,需激活码序列号密钥安装下载
  12. CSS CSS3 pdf 电子书大全 百度云
  13. 一款简洁的税后工资计算器(2019)
  14. 如何提高仓库操作管理效率?
  15. shtml 是什么?
  16. 致刚入职场的你 - 程序员的成长笔记
  17. 物联网传感技术——电容式传感器
  18. D2 归来, 特此YC一篇
  19. python 实现三维向量之间的夹角
  20. NetSpot Pro for Mac(最好用的wifi检测软件)

热门文章

  1. 鸿蒙蕴含的哲理,蕴含哲理的感悟短语,意义深刻,耐人寻味
  2. 【转载】我的算法图书
  3. 这种盘中孔的设计方式你是否做过
  4. Unity不使用触发器,检测目标是否在圆形,矩形,扇形攻击范围内。
  5. 原来qq下载也有类似迅雷的功能了
  6. 结束极域教室StudentMain的终极方法(图文)
  7. 我和计算机技术-在迅雷
  8. ROS机器人学习——麦克纳姆轮运动学解算
  9. EntityFrameworkCore2.1的安装使用和其中遇到的那些坑
  10. pure-ftpd 搭建自己的FTP服务器