简易的C语言静态通讯录
文章预览
- 一:通讯录功能简介
- 二:通讯录设计思路简介
- 三:通讯录主函数与通讯录菜单
- 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语言静态通讯录相关推荐
- 用C语言实现 静态通讯录+动态通讯录+文件实现“退出保存信息版本”(附上思路+项目展示+源代码)
前言 : 在生活中我们经常会遇到通讯录的使用,比如存进一个新的联系人的信息,或者对其删除,修改,查找:那这些神奇的功能是如何实现的?我们不禁好奇.今天,这篇博文将教会大家实现一个静态的或者动态的通讯录 ...
- 从0开始学c语言 - 34 - 通讯录 -静态、动态、存到文件(三种版本)
上一篇:从0开始学c语言-33-动态内存管理_阿秋的阿秋不是阿秋的博客-CSDN博客 我发现,理论的学习文章没几个人看,如果是这种实践类型的文章,看的人很多,偏偏我之前都是扔完代码就走了,也没认真写这 ...
- 【C语言】通讯录——源代码
这里附上上一篇通讯录博客的链接 [C语言]通讯录_Brant_zero的博客-CSDN博客 目录 一.头文件 二.函数功能实现 三.主函数 一.头文件 //头文件 #include <stdio ...
- c语言通讯录二分查找,C语言程序设计 通讯录程序.doc
<C语言程序设计 通讯录程序.doc>由会员分享,可在线阅读,更多相关<C语言程序设计 通讯录程序.doc(28页珍藏版)>请在人人文库网上搜索. 1.目录:课 程 设 计 任 ...
- 为什么php动态语言,动态语言静态化
[TOC] ## 什么是动态语言静态化 将现有PHP等动态语言的逻辑代码生成为静态HTML文件,用户访问动态脚本重定向到静态HTML文件的过程. 对实时性要求不高的页面 ## 为什么要静态化 动态脚本 ...
- 教你C语言实现通讯录的详细代码
本文详细讲解了C语言实现通讯录的方法,文中通过示例代码介绍的非常详细.对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下 (一)实现思路 1.通讯录功能 添加好友,删除好友,查找好友,修改 ...
- 简陋版C语言仿真通讯录之动态内存开辟版本
简陋版C语言仿真通讯录 https://blog.csdn.net/csdn_kou/article/details/80287640 简陋版C语言仿真通讯录之动态内存开辟版本 给Contact结构体 ...
- 个人通讯管理程序C语言,个人通讯录管理系统C语言源程序(优秀版)[1]
个人通讯录管理系统C语言源程序(优秀版)[1] 更新时间:2017/2/22 1:03:00 浏览量:613 手机版 C语言个人通讯录系统源程序: #include /*头文件*/ #includ ...
- 关于动态语言 静态语言 静态类型语言 动态类型语言的区别
参考链接:关于"编译型""解释型""动态语言""静态语言""动态类型语言""静态类型语言& ...
最新文章
- Makefile中的几个调试方法
- R语言ggplot2可视化删除所有分面图(facet_wrap可视化的facet结果)的标签实战(Remove facet_wrap labels)
- 概率密度函数pdf(probability densinity function) DOC API
- 4种营销场景满足其中一个要不要做小程序?
- python解释器 pip安装_pip安装Python库时的问题及解决方法总结
- 战疫期,钉钉如何扛起暴增百倍的流量?
- 使用Mutex进行线程处理
- python小白从哪来开始-老男孩python课程亮点在哪里?python小白
- BZOJ3450 Easy
- Symbian手记【四】 —— Symbian的容器
- ABBYY最新OCR文字识别软件 ,需激活码序列号密钥安装下载
- CSS CSS3 pdf 电子书大全 百度云
- 一款简洁的税后工资计算器(2019)
- 如何提高仓库操作管理效率?
- shtml 是什么?
- 致刚入职场的你 - 程序员的成长笔记
- 物联网传感技术——电容式传感器
- D2 归来, 特此YC一篇
- python 实现三维向量之间的夹角
- NetSpot Pro for Mac(最好用的wifi检测软件)