本博客推荐给C语言学习到结构体的新手们,供其练习。建议新手读者在阅读之后,仔细分析原码,再独立完成程序编写。

一、本通讯录要实现的功能:

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

通讯录可执行的操作如下:

  1. 添加联系人信息
  2. 删除指定联系人信息
  3. 查找指定联系人信息
  4. 修改指定联系人信息
  5. 显示所有联系人信息
  6. 清空所有联系人
  7. 以名字排序所有联系人

二、通讯录初步准备:

     1.创建一个.c文件,编写主函数main;

2.再创建一个.c文件,用于集中存放1中的.c文件所使用到的自定义函数;

3.创建一个.h头文件,用于申明1中的.c文件所使用到的函数。

如下图:

三、程序编写:

下文将介绍程序的编写思路:

步骤1、首先根据通讯录所包含的信息要求,在头文件中构造结构体PeoIfo,即通讯录要求包含的信息;再构造结构体contact用于储存多个联系人。(注:本段代码使用#define是因为整个程序中会多次用到这些数值,通过#define的方式若后期要修改值,不需要通篇去修改。)

#define MAX 100
#define nameMAX 20
#define sexMAX 10
#define telMAX 20
#define adrMAX 20struct PeoIfo
{char name[nameMAX];char sex[sexMAX];int age;char tel[telMAX];char adr[adrMAX];
};struct contact
{struct PeoIfo data[MAX];int sz;
};

步骤2、在第一个.c文件中写主函数main(),对步骤1中所构造的结构体进行初始化,初始化函数次数命名为InitContact(&con)。(注:此处段代码需要引用头文件“contact.h”)

#include"contact.h"int main() {int input = 0;struct contact con;//初始化InitContact(&con);return 0;
}

步骤3、在头文件中申明初始化函数

//初始化
void InitContact(struct contact* pc);

步骤4、再另外一个.c文件中编写该初始化函数,使其实现初始化功能。

//初始化
void InitContact(struct contact* pc)
{pc->sz = 0;memset(pc->data, 0, MAX * sizeof(struct PeoIfo));}

步骤5、回到主函数main()中。编写程序菜单menu(),再编写Switch语句,对应菜单中的选项。此处以1.add为例,1.add选项为增加联系人。

#include"contact.h"
void menu()
{printf("*****************************\n");printf("****1.add       2.del    ****\n");printf("****3.search    4.modify ****\n");printf("****5.show      6.empty  ****\n");printf("****7.sort      0.exit   ****\n");printf("*****************************\n");
}
int main() {int input = 0;struct contact con;//初始化InitContact(&con);do{menu();printf("请选择:");scanf("%d", &input);switch (input){case 1:add(&con);break;case 2:del(&con);break;case 3:search(&con);break;case 4:modify(&con);break;case 5:show(&con);break;case 6:InitContact(&con);//直接给他初始化不就清空了。break;case 7:Sort(&con);break;case 0:printf("已退出通讯录。\n");break;default:printf("输入错误,请重新输入:\n");break;}} while (input);return 0;
}

步骤6、在.h头文件中申明函数

//添加联系人
void add(struct contact* pc);

步骤7、在另外一个.c文件中,对add函数编写,使其达到添加联系人的功能。此处介绍一下

pc->data[pc->sz].name的含义,pc->data[i],对data中的第i个联系人的结构体PeoIfo进行解引用,.name便是指该联系人的姓名。该段代码末尾pc->sz++,是指联系人+1。

//添加联系人
void add(struct contact* pc)
{if (pc->sz >= MAX){printf("通讯录已满。\n");return;}printf("请输入姓名\n");scanf("%s", pc->data[pc->sz].name);printf("请输入性别\n");scanf("%s", pc->data[pc->sz].sex);printf("请输入年龄\n");scanf("%d", &(pc->data[pc->sz].age));printf("请输入电话\n");scanf("%s", pc->data[pc->sz].tel);printf("请输入住址\n");scanf("%s", pc->data[pc->sz].adr);pc->sz++;
}

步骤8、同理重复步骤6、7,实现剩余的删除、查找等功能。此处不一一赘述,读者在学会add的编写之后,建议独自进行其他功能的函数实现思考。

四、完整程序

1、主函数所在的.c文件原码

#include"contact.h"
void menu()
{printf("*****************************\n");printf("****1.add       2.del    ****\n");printf("****3.search    4.modify ****\n");printf("****5.show      6.empty  ****\n");printf("****7.sort      0.exit   ****\n");printf("*****************************\n");
}
int main() {int input = 0;struct contact con;//初始化InitContact(&con);do{menu();printf("请选择:");scanf("%d", &input);switch (input){case 1:add(&con);break;case 2:del(&con);break;case 3:search(&con);break;case 4:modify(&con);break;case 5:show(&con);break;case 6:InitContact(&con);//直接给他初始化不就清空了。break;case 7:Sort(&con);break;case 0:printf("已退出通讯录。\n");break;default:printf("输入错误,请重新输入:\n");break;}} while (input);return 0;
}

2、.h头文件原码

#define _CRT_SECURE_NO_WARNINGS 1
#pragma once
#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<stdlib.h>#define MAX 100
#define nameMAX 20
#define sexMAX 10
#define telMAX 20
#define adrMAX 20struct PeoIfo
{char name[nameMAX];char sex[sexMAX];int age;char tel[telMAX];char adr[adrMAX];
};struct contact
{struct PeoIfo data[MAX];int sz;
};//初始化
void InitContact(struct contact* pc);
//添加联系人
void add(struct contact* pc);
//删除联系人
void del(struct contact* pc);
//查找联系人
void search(struct contact* pc);
//修改联系人
void modify(struct contact* pc);
//展示通讯录
void show(struct contact* pc);
//清空通讯录
void empty(struct contact* pc);
//按姓名排序
void Sort(struct contact* pc);

3、自定义函数所在的.c文件原码

#include"contact.h"//打印项目
void pri()
{printf("%-15s\t%-10s\t%-10s\t%-10s\t%-20s\n", "姓名", "性别", "年龄", "电话", "住址");
}//查找联系人的位置
int FindPOS(const struct contact* pc,char name[])
{int i = 0;for (i = 0; i < pc->sz; i++){if (0==strcmp(pc->data[i].name, name) ){return i;}}return -1;
}
//初始化
void InitContact(struct contact* pc)
{pc->sz = 0;memset(pc->data, 0, MAX * sizeof(struct PeoIfo));}//添加联系人
void add(struct contact* pc)
{if (pc->sz >= MAX){printf("通讯录已满。\n");return;}printf("请输入姓名\n");scanf("%s", pc->data[pc->sz].name);printf("请输入性别\n");scanf("%s", pc->data[pc->sz].sex);printf("请输入年龄\n");scanf("%d", &(pc->data[pc->sz].age));printf("请输入电话\n");scanf("%s", pc->data[pc->sz].tel);printf("请输入住址\n");scanf("%s", pc->data[pc->sz].adr);pc->sz++;
}//删除联系人
void del(struct contact* pc)
{printf("请输入要删除的联系人姓名:\n");char delname[nameMAX];scanf("%s", &delname);int ret=FindPOS(pc, delname);if (-1 == ret){printf("要删除的联系人不存在\n");}else{int i = 0;for (i = ret; i < pc->sz - 1; i++){pc->data[ret] = pc->data[ret + 1];}pc->sz--;printf("删除成功\n");}
}//查找联系人
void search(struct contact* pc)
{char sechname[nameMAX];printf("请输入要找的联系人:\n");scanf("%s", &sechname);int ret = FindPOS(pc, sechname);if (-1 == ret){printf("找不到联系人\n");return;}pri();printf("%-15s\t%-10s\t%-10d\t%-10s\t%-20s\n",pc->data[ret].name,pc->data[ret].sex,pc->data[ret].age,pc->data[ret].tel,pc->data[ret].adr);
}//修改联系人
void modify(struct contact* pc)
{printf("请输入要修改的联系人姓名:\n");char moname[nameMAX];scanf("%s", &moname);int ret = FindPOS(pc, moname);if (-1 == ret){printf("没有找到联系人\n");  }else{printf("请输入姓名\n");scanf("%s", pc->data[ret].name);printf("请输入性别\n");scanf("%s", pc->data[ret].sex);printf("请输入年龄\n");scanf("%d", &(pc->data[ret].age));printf("请输入电话\n");scanf("%s", pc->data[ret].tel);printf("请输入住址\n");scanf("%s", pc->data[ret].adr);}}//展示通讯录
void show(struct contact* pc)
{pri();int i = 0;for (i = 0; i < pc->sz; i++){printf("%-15s\t%-10s\t%-10d\t%-10s\t%-20s\n",pc->data[i].name,pc->data[i].sex,pc->data[i].age,pc->data[i].tel,pc->data[i].adr);}}//按姓名排序
int compare(void* s1, void* s2)
{return strcmp(((struct PeoIfo*)s1)->name, ((struct PeoIfo*)s2)->name);
}
void Sort(struct contact* pc)
{qsort(pc->data, pc->sz, sizeof(struct PeoIfo), compare);
}

五、感谢阅读,能力有限,如有错误之处,欢迎指正。

C语言制作通讯录(新手练习推荐)相关推荐

  1. r语言 html gif,推荐 :6步教你用R语言制作动图

    原标题:推荐 :6步教你用R语言制作动图 引言 数据可视化可能是数据科学领域最重要却通常最少被提及的部分. 我这么说是因为创造数据故事和可视化对你的顾客最终怎么看待你的工作有巨大的影响.数据科学不仅仅 ...

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

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

  3. c语言个人通讯录管理系统实验报告_C语言实现个人通讯录管理系统

    如何用c语言制作简易的个人通讯录管理系统?想必这是每一位初步学习c语言的同学需要解决的一个大问题.如何将这些数据类型不完全相同的数据元素存储并访问呢?采用结构体便能轻松解决这个问题! #include ...

  4. unity塔防游戏怪物转向_Unity官方新手游戏项目推荐合集

    Unity官方新手游戏项目推荐合集 今天给同学们介绍一些Unity官方发布过的一些游戏项目,这些项目都简化了游戏开发的入门学习过程,可以快速地制作出游戏,适合新手入门体验,下面就带同学们看一看: Un ...

  5. 电脑报2022年第24期Scratch制作通讯录管理系统存在的小瑕疵

    简介:本文介绍电脑报2022年第24期"编程  创客"专栏介绍的编程文章<Scratch制作通讯录管理系统>在Scratch3.0环境下遇到的问题以及解决方法.同时对S ...

  6. 游戏逆向学习——易语言制作游戏输入性脚本之异星工厂

    今天没有来得及更新相关学习内容,下午抽空做了波及时更新,今天使用易语言制作了最新的异星工厂游戏输入性脚本,根据官方wiki的相关内容制作,如有侵权请联系我! 主要是用的是一个简单的dll指令:send ...

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

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

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

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

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

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

最新文章

  1. try-catch语句讲解
  2. 普罗米修斯使用es数据库_用普罗米修斯和格拉法纳仪法来豪猪
  3. shell判断字符串是否为数字
  4. 在存储过程中编写正确的事务处理代码
  5. 蓝桥杯 ADV-69 算法提高 质因数
  6. 玩转html5(三)---智能表单(form),使排版更加方便
  7. 凸优化第八章几何问题 8.4 极值体积椭圆
  8. Fuzzy analytic hierarchy process(模糊层次分析法)论文学习
  9. 华为路由器后台登录协议实现
  10. 《柴静:穹顶之下》中用到的数据可视化
  11. qemu启动openEuler Embedded镜像
  12. day015异常捕获和正则
  13. 在“芯片庭院”培育一颗多核异构 RISC-V SOC种子
  14. WIN10键盘无法使用,什么按键都不管用
  15. ubuntu各种方法卸载软件
  16. (2020.12.7)初次web前端性能优化记录
  17. 2018 蓝桥杯省赛 B 组模拟赛(一)-U型数字
  18. 人脸检测:史上最详细人脸检测libfacedetection讲解-网络详解--第二节
  19. 模电摸索日记之《整流与滤波电路》
  20. 深度学习炼丹-超参数设定和模型训练

热门文章

  1. int i2c_probe()
  2. Echarts的折线图堆叠示例,去掉线上小圆圈;多条折现可重叠。
  3. 时间都去哪了。。。。
  4. IBM x3690 x5服务器安装Debian Linux
  5. python学习之地址簿程序
  6. 用Python做命令行地址簿
  7. 数据结构考点之n阶矩阵
  8. cherry Tree的严重漏洞
  9. 不经一番寒彻骨,怎得梅花扑鼻香,android开发艺术探索电子
  10. User’s Guide