C语言实现通讯录附详细代码(动态+静态)

点击蓝字

9e9735319542cb8e4d72103b2909e668.png

关注我们

一、通讯录简介

实现一个通讯录;

通讯录可以用来存储1000个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址

提供方法:

  • 添加联系人信息

  • 删除指定联系人信息

  • 查找指定联系人信息

  • 修改指定联系人信息

  • 显示所有联系人信息

  • 清空所有联系人

  • 以名字排序所有联系人

二、分模块实现

1、添加联系人信息

静态版本

//添加联系人
void Addcontact(Contact* pc)
{assert(pc);if (pc->sz == Max){printf("通讯录已满,无法添加\n");return;}printf("请输入名字:>");scanf("%s", pc->data[pc->sz].name);printf("请输入性别:>");scanf("%s", pc->data[pc->sz].sex);printf("请输入年龄:>");scanf("%d", &pc->data[pc->sz].age);printf("请输入号码:>");scanf("%s", pc->data[pc->sz].tele);printf("请输入住址:>");scanf("%s", pc->data[pc->sz].addr);pc->sz++;printf("添加成功\n");
}


动态版本

void Addcontact(Contact* pc)
{// 动态版本assert(pc);if (pc->sz == pc->Capacity){PeoInfo* tmp = realloc(pc->data, (pc->Capacity + 2) * sizeof(PeoInfo));if (tmp != NULL){pc->data = tmp;}else{perror("realloc:pc->data");return;}pc->Capacity += 2;printf("增容成功\n");printf("请输入名字:>");scanf("%s", pc->data[pc->sz].name);printf("请输入性别:>");scanf("%s", pc->data[pc->sz].sex);printf("请输入年龄:>");scanf("%d", &pc->data[pc->sz].age);printf("请输入号码:>");scanf("%s", pc->data[pc->sz].tele);printf("请输入住址:>");scanf("%s", pc->data[pc->sz].addr);pc->sz++;printf("添加成功\n");}
}


2、删除指定联系人信息

//删除联系人
void Deletecontact(Contact* pc)
{assert(pc);char name[Name_Max];if (pc->sz == 0){printf("通讯录已空,无法删除\n");}printf("请输入要删除联系人的名字:>");scanf("%s", name);int pos = FindByname(pc, name);if (pos == -1){printf("未找到指定联系人\n");return;}else{int i = pos;for (i = pos; i < pc->sz - 1; i++){pc->data[i] = pc->data[i + 1];}pc->sz--;printf("删除成功\n");}
}


3、查找指定联系人信息

//查找联系人
void Searchcontact(Contact* pc)
{assert(pc);char name[Name_Max];printf("请输入要查找的联系人名字:>");scanf("%s", name);int pos = FindByname(pc, name);if (pos == -1){printf("未找到指定联系人\n");return;}printf("%-20s %-5s %-5s %-12s  %-30s\n", "姓名", "性别", "年龄", "号码", "住址");printf("%-20s %-5s %-5d %-12s  %-30s\n", pc->data[pos].name, pc->data[pos].sex, pc->data[pos].age, pc->data[pos].tele, pc->data[pos].addr);
}

4、修改指定联系人信息

//修改菜单
void menu1()
{printf("***********************\n");printf("****1.姓名  2.性别 ****\n");printf("****3.年龄  4.号码 ****\n");printf("****5.住址  0.返回 ****\n");printf("***********************\n");
}//修改联系人
void Modifycontact(Contact* pc)
{assert(pc);char name[Name_Max];int input = 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 %-5s %-5d %-12s  %-30s\n", pc->data[pos].name, pc->data[pos].sex, pc->data[pos].age, pc->data[pos].tele, pc->data[pos].addr);do{menu1();printf("请选择要修改的内容:>");scanf("%d", &input);switch (input){case 1:printf("请输入名字:>");scanf("%s", pc->data[pos].name);printf("修改成功\n");break;case 2:printf("请输入性别:>");scanf("%s", pc->data[pos].sex);printf("修改成功\n");break;case 3:printf("请输入年龄:>");scanf("%d", &pc->data[pos].age);printf("修改成功\n");break;case 4:printf("请输入号码:>");scanf("%s", pc->data[pos].tele);printf("修改成功\n");break;case 5:printf("请输入住址:>");scanf("%s", pc->data[pos].addr);printf("修改成功\n");break;case 0:printf("退出修改\n");break;default:printf("选择错误\n");break;}} while (input);
}

5、显示所有联系人信息

//打印通讯录
void Printcontact(Contact* pc)
{assert(pc);if (pc->sz == 0){printf("通讯录为空\n");return;}int i = 0;printf("%-20s %-5s %-5s %-12s  %-30s\n", "姓名", "性别", "年龄", "号码", "住址");for (i = 0; i < pc->sz; i++){printf("%-20s %-5s %-5d %-12s  %-30s\n", pc->data[i].name, pc->data[i].sex, pc->data[i].age, pc->data[i].tele, pc->data[i].addr);}
}

6、清空所有联系人

静态版本

//通讯录初始化
void InitContact(Contact* pc)
{assert(pc);memset(pc->data, 0, sizeof(pc->data));pc->sz = 0;
}//清空联系人
void Emptycontact(Contact* pc, void(*p)(Contact*))
{InitContact(pc);printf("清空成功\n");
}


动态版本

void InitContact(Contact* pc)
{assert(pc);PeoInfo* tmp = (PeoInfo*)malloc(Default_Max * sizeof(PeoInfo));if (tmp != NULL){pc->data = tmp;}else{perror("PeoInfo*)malloc:");return;}memset(pc->data, 0, Default_Max * sizeof(PeoInfo));pc->sz = 0;pc->Capacity = Default_Max;
}
//清空联系人
void Emptycontact(Contact* pc, void(*p)(Contact*))
{InitContact(pc);printf("清空成功\n");
}

7、以名字排序所有联系人

//排序联系人int cmp_name(const void* e1, const void* e2)
{return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
}
void Sortcontact(Contact* pc)
{int sz = pc->sz;qsort(pc->data, sz, sizeof(pc->data[0]), cmp_name);printf("排序成功\n");
}

8、销毁通讯录(释放)

void Freecontact(Contact* pc)
{free(pc->data);pc->Capacity = 0;pc->sz = 0;printf("销毁成功\n");
}

三、菜单界面

#define _CRT_SECURE_NO_WARNINGS  1
#include"contact.h"void menu()
{printf("*****************************\n");printf("****  1.add     2.delete ****\n");printf("****  3.search  4.modify ****\n");printf("****  5.print   6.empty  ****\n");printf("****  7.sort    0.exit   ****\n");printf("*****************************\n");
}
void test()
{Contact Con;//通讯录InitContact(&Con); //初始化通讯录int input = 0;do {input = 0;menu();printf("请选择>:");scanf("%d", &input);switch (input){case add:Addcontact(&Con);break;case delete:Deletecontact(&Con);break;case search:Searchcontact(&Con);break;case modify:Modifycontact(&Con);break;case print:Printcontact(&Con);break;case empty:Emptycontact(&Con, InitContact);break;case sort:Sortcontact(&Con);break;case 0:Freecontact(&Con);printf("退出通讯录\n");break;default:printf("选择错误\n");break;}} while (input);
}
int main()
{test();return 0;
}

四、头文件声明

#define _CRT_SECURE_NO_WARNINGS  1
#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<stdlib.h>
//常量定义
enum Option
{//exit,add=1,delete,search,modify,print,empty,sort
};#define Max 1000
#define Name_Max 20
#define Sex_Max 5
#define Tele_Max 12
#define Addr_Max 30
#define Default_Max 3//类型声明//联系人结构体
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;int sz;int Capacity;
}Contact;//静态版本
//1000个联系人 与已存个数结构体
//typedef struct Contact
//{
//  PeoInfo data[Max];
//  int sz;
//}Contact;//函数声明//初始化通讯录
void InitContact(Contact* pc);//添加联系人
void Addcontact(Contact* pc);//打印通讯录
void Printcontact(Contact* pc);//删除联系人
void Deletecontact(Contact* pc);//查找联系人
void Searchcontact(Contact* pc);//修改联系人
void Modifycontact(Contact* pc);//清空联系人
void Emptycontact(Contact* pc,void(*p)(Contact*));//排序联系人
void Sortcontact(Contact* pc);//销毁通讯录
void Freecontact(Contact* pc);

f9d869f88232a3f1cea885abe88416ba.gif

如果你年满18周岁以上,又觉得学【C语言】太难?想尝试其他编程语言,那么我推荐你学Python,现有价值499元Python零基础课程限时免费领取,限10个名额!
▲扫描二维码-免费领取

e0c700487bc4a825da3fd177087a5489.gif

戳“阅读原文”我们一起进步

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/337400.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Lua协程Coroutine是什么

Lua协程Coroutine是什么协程和线程不同&#xff1a; 同一时刻&#xff0c;一个多线程程序可以用多个线程同时执行&#xff1b;而协程只能有一个在执行多线程是抢占式的&#xff1b;而协程是非抢占式的&#xff0c;只有协程显示被挂起&#xff0c;才会被挂起 协程和线程的相同…

C++程序的内存分区模型-栈区堆区

点击蓝字关注我们1、栈区&#xff1a;由编译器自动分配释放&#xff0c;存放函数的参数值&#xff0c;局部变量等&#xff08;由编译器管理其“生死”&#xff09;注意事项&#xff1a;不要返回局部变量的地址&#xff0c;栈区开辟的数据由编译器自动释放栈区代码演示&#xff…

CocosStudio的节点如何使用自定义shader

CocosStudio的节点如何使用自定义shader问题&#xff1a;我想对CocosStudio 的 某个UI 里的 某个图片&#xff08;如下图所示的Image类型&#xff09;使用自定义shader。但是&#xff0c;我把 对传统的cc.Sprite应用自定义shader的方式 应用于它时&#xff0c;并不生效&#xf…

excel随机抽取_简单随机抽样及其进阶分层随机抽样方法展示

一、分享简单随机抽样的几种方法1、抽样分析工具抽样2、INDIRECTRANDBETWEEN函数抽样3、RAND排序抽样4、SAS抽样二、分层抽样方法1、Python分层抽样2、SAS分层抽样3、EXCEL函数及功能分层抽样简单随机抽样的几种方法方法一抽样分析工具抽样如果你的EXCEL尚未安装数据分析&#…

为什么存在动态内存分配,动态内存函数(malloc函数,free函数,calloc函数,realloc函数)...

点击蓝字关注我们1.当前我们知道的内存的使用方法2.为什么存在动态内存分配如上我们已学的开辟空间的方式有两个特点&#xff1a;空间开辟的大小是固定的必须指定数组的长度所以就产生了空间开大了浪费开小了不够用的问题&#xff0c;所以使用动态内存分配3.动态内存函数&#…

C++ vector类的模拟实现

点击蓝字关注我们1.前言vector和string虽然底层都是通过顺序表来实现的&#xff0c;但是他们利用顺序表的方式不同&#xff0c;string是指定好了类型&#xff0c;通过使用顺序表来存储并对数据进行操作&#xff0c;而vector是利用了C中的泛型模板&#xff0c;可以存储任何类型的…

visual studio源文件的编译顺序是依据什么?

问题&#xff1a;visual studio源文件的编译顺序是依据什么&#xff1f; 结论&#xff1a;依据 .vcxproj 文件里 指定了ClCompile的ItemGroup &#xff0c;如下图所示&#xff0c;就是这么简单粗暴。

功能齐全的屏幕截图C++实现详解

点击蓝字关注我们1、概述要使用屏幕截图&#xff0c;其实很容易&#xff0c;装一款聊天软件或者办公软件就可以了&#xff0c;比如QQ、企业微信、钉钉、飞书等。但要开发出类似这些软件的屏幕截图模块&#xff0c;则没那么容易。其实实现屏幕截图的技术并不复杂&#xff0c;主要…

如何判断exe文件是debug还是release编译生成的

如何判断exe文件是debug还是release编译生成的结论&#xff1a; 用IDA工具打开exe&#xff0c;然后看Imports里面的依赖库是否有带d或D结尾的&#xff0c;如果有就说明是Debug的 实验&#xff1a;&#xff08;实验环境 vs2017&#xff0c; IDA工具&#xff09; &#xff08;0&…

大屏可视化分配率是什么意思_什么是分配率?

大屏可视化分配率是什么意思诸如“不可持续的分配率”和“您需要保持较低的分配率”之类的短语似乎仅属于Java Champions的词汇表。 复杂&#xff0c;恐怖并被魔术光环包围。 经常发生的情况是&#xff0c;当您更仔细地查看概念时&#xff0c;魔术会随着抽烟消失。 这篇文章试…

C/C++语言动态开辟的杨辉三角

点击蓝字关注我们问题引入杨辉三角相必大家并不陌生&#xff0c;第1行有1列、第二行有2列…第n行有n列&#xff0c;且每行行首和行尾的值都为1&#xff0c;其余的值为上一行两数相加我们在C语言阶段&#xff0c;第一次碰到的杨辉三角应该都是用常规的二维数组存储&#xff0c;可…

git gui 历史版本_这些Git命令都不会,还是不要去面试了

前言以下&#xff0c;项目中经常使用的Git命令&#xff0c;汇总到这里以便与你能快速的学习和掌握Git命令&#xff0c;在文章最后有惊喜哟&#xff0c;一定要看到最后啊&#xff01;使用的 Git版本&#xff1a;git version 2.24.0命令git log# 输出概要日志,这条命令等同于# gi…

java restful_Java EE中的RESTful计时器

java restful在这篇文章中...。 EJB计时器旋风之旅 通过带有示例实现的简单REST接口即时使用EJB计时器 更新&#xff08;2015年7月14日&#xff09; 该应用程序的前端现在可以在OpenShift上使用 。 由于我是前端新手&#xff0c;因此我在其他来源的帮助下组装了此HTML5 Ang…

c# 联合halcon 基于相关性 模板匹配_机器视觉之halcon入门(5)-字符识别exe生成...

2.3.2 第二个halcon程序转EXE程序&#xff1a;字符识别老规矩&#xff0c;每一段halcon代码得用C#二次开发下。根据上一节所教的&#xff0c;我们配置下C#的环境&#xff0c;顺便添加好控件&#xff0c;如下图(2-3-2-1)。图 2-3-2-1控件基本跟上一节一样&#xff0c;只是少了一…

C语言数据的存储和取出(超详细讲解)

点击蓝字关注我们整形的储存我们知道一个整形的存储是以补码的形式储存取出是原码的形式。比如&#xff1a;int a 5;的二进制是101那它的原码应该是&#xff1a;00000000 00000000 00000000 00000101正数的原反补相同那它存进去和取出来都是&#xff1a;00000000 00000000 000…

打印pdf就一页_PDF 文件转换工具

是将 PDF 文件转换为完全可编辑的 Windows 文档最好的转换软件。无论您需要您的内容是 Microsoft Word、Excel、PowerPoint、HTML 还是仅需要文本&#xff0c; 总会给您一个简单的方法&#xff0c;快捷地获取您要的内容。可转换整个文档或选择内容。亦可创建 PDF 文件。PDF 转换…

C++类的this指针,静态成员,友元函数友元类

点击蓝字关注我们1. this指针在上篇讲C中类&#xff0c;对象&#xff0c;封装&#xff0c;继承&#xff08;派生&#xff09;&#xff0c;多态的时候&#xff0c;this指针出现在成员函数中&#xff0c;并使用->成员提取符操作成员变量。在 C 中&#xff0c;每一个对象都能通…

批量提取文件创建时间_批量采集新浪微博用户内容

有时我们需要把某些用户的微博数据全部采集下来用作分析&#xff0c;每条信息复制的工作量是非常低效的&#xff0c;必须要借助工具。今天给大家介绍一款采集软件&#xff1a;微风采集器。打开软件&#xff0c;选择模板&#xff0c;下拉框选&#xff1a;批量提取指定用户微博内…

C++异常的规则

点击蓝字关注我们异常是指存在于程序运行时的异常行为&#xff0c;这些行为超出了函数正常功能的范围&#xff0c;当程序的某部分检测到一个无法处理的问题时&#xff0c;就需要用到异常处理。1. C语言中传统的处理错误方式终止程序&#xff1a;如assert&#xff0c;当发生错误…

异质性查询需要为连线设定_振奋人心!华东理工大学开发新型的荧光染料,为细胞成像奠定基础...

结合并激活荧光染料的适体荧光RNA(FR)已用于对丰富的细胞RNA种类进行成像。然而&#xff0c;诸如低亮度和具有不同光谱特性的染料/适体组合的有限可用性的局限性&#xff0c;限制了这些工具在活的哺乳动物细胞和体内的使用。最近&#xff0c;华东理工大学朱麟勇及杨弋共同通讯在…