通讯录实现

  • 结构体定义:

定义结构体peoinfo 包括姓名, 性别,年龄,电话号码,地址,QQ等

#define MAX_NAME 20
#define MAX_TELE 12
#define MAX_ADDR 100
#define MAX_QQ 12
#define MAX_SEX 5
#define MAX_PEOPLE 1000typedef struct peoinfo {//数据结构体 保存数据信息char name[MAX_NAME];char tele[MAX_TELE];char addr[MAX_ADDR];char qq[MAX_QQ];char sex[MAX_SEX];short age;
}peoinfo;

定义结构体contact,里面定义一个存放信息的数组data以及记录当前存放数据个数sz

typedef struct contact//通讯录结构体  方便维护通讯录
{peoinfo data[MAX_PEOPLE];int sz;//记录当前通讯录人数
}contact;
  • 头文件

功能函数的声明  包括增,删,查,改,排序,显示等

contact.h

void add_contact(contact* pc);//添加void show_contact(contact* pc);//显示void del_contact(contact* pc);//按姓名删除void search_contact(contact* pc);//按姓名查找void modify_contact(contact* pc);//按姓名修改void sort_contact(contact* pc);//按姓名排序
  • 功能实现

注意排序功能函数使用冒泡排序的思想实现,但在原有冒泡排序的基础上进行优化,定义标志位,假设在某一趟中已经按要求完成排序了,已经有序,如果不进入两两交换的程序,则认为无需继续下一趟  直接跳出即可完成排序

#define _CRT_SECURE_NO_WARNINGS 1 #include"contact.h"
void add_contact(contact* pc)
{if (pc->sz == MAX_PEOPLE){printf("添加已满");}else{printf("请输入姓名:");scanf("%s",pc->data[pc->sz].name);printf("请输入电话:");scanf("%s",pc->data[pc->sz].tele);printf("请输入地址:");scanf("%s",pc->data[pc->sz].addr);printf("请输入QQ:");scanf("%s",pc->data[pc->sz].qq);printf("请输入性别:");scanf("%s",pc->data[pc->sz].sex);printf("请输入年龄:");scanf("%hd",&(pc->data[pc->sz].age));pc->sz++;printf("添加成功");}
}void show_contact(contact* pc)
{printf("%5s %5s %5s %12s %15s %12s\n","姓名","性别","年龄","电话","地址","QQ");for (int i = 0; i < pc->sz; i++){printf("%5s %5s %5d %12s %15s %12s\n", pc->data[i].name,pc->data[i].sex,pc->data[i].age,pc->data[i].tele,pc->data[i].addr,pc->data[i].qq);}
}static int find_byname(contact* pc,char name[])//只能在自己所在的源文件(即contact.c)中使用
{/*char name[MAX_NAME] = {0};printf("输入查找人姓名>");scanf("%s",name);*/for (int i = 0; i < pc->sz; i++){if (strcmp(pc->data[i].name, name) == 0){return i;}}return -1;
}void del_contact(contact* pc)
{if (pc->sz == 0){printf("通讯录为空,当前无法删除\n");}else{char name[MAX_NAME] = { 0 };printf("输入删除人姓名>");scanf("%s", name);int pos = find_byname(pc,name);if (pos == -1){printf("当前项不存在\n");}else{for (int j = pos; j < pc->sz - 1; j++){pc->data[j] = pc->data[j + 1];}pc->sz--;printf("删除成功\n");}}
}void search_contact(contact* pc)
{char name[MAX_NAME] = { 0 };printf("输入查找人姓名>");scanf("%s", name);int pos = find_byname(pc, name);if (pos == -1){printf("当前项不存在\n");}else{printf("%5s %5s %5s %12s %15s %12s\n", "姓名", "性别", "年龄", "电话", "地址", "QQ");printf("%5s %5s %5d %12s %15s %12s\n", pc->data[pos].name, pc->data[pos].sex, pc->data[pos].age, pc->data[pos].tele, pc->data[pos].addr, pc->data[pos].qq);}
}void modify_contact(contact* pc)
{char name[MAX_NAME] = { 0 };printf("输入修改人姓名>");scanf("%s", name);int pos = find_byname(pc, name);if (pos == -1){printf("当前项不存在\n");}else{printf("请输入修改姓名:");scanf("%s", pc->data[pos].name);printf("请输入修改电话:");scanf("%s", pc->data[pos].tele);printf("请输入修改地址:");scanf("%s", pc->data[pos].addr);printf("请输入修改QQ:");scanf("%s", pc->data[pos].qq);printf("请输入修改性别:");scanf("%s", pc->data[pos].sex);printf("请输入修改年龄:");scanf("%hd", &(pc->data[pos].age));//pc->sz++;printf("修改成功");}
}void sort_contact(contact* pc)
{for (int i = 0; i < pc->sz - 1; i++){int flag = 1;//标志位  假设该趟已经有序for (int j = 0; j < pc->sz - i - 1; j++){if (strcmp(pc->data[j].name, pc->data[j + 1].name) > 0){peoinfo tmp = pc->data[j];pc->data[j] = pc->data[j + 1];pc->data[j + 1] = tmp;flag = 0;//推翻假设,其中已经发生交换了}}if (flag == 1){break;//这一趟说明已经有序了 无序下一趟  直接跳出   *****优化冒泡排序*****}}
}
  • 主函数实现 人机界面

定义枚举类型来替换switch-case语句的选项,优化操作

#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
void menu()
{printf("********************************************\n");printf("********   1.增加         2.删除    ********\n");printf("********   3.查找         4.修改    ********\n");printf("********   5.排序         6.显示    ********\n");printf("********           0.退出           ********\n");printf("********************************************\n");
}
enum option {EXIT,ADD,DEL,SEARCH,MODIFY,SORT,SHOW
};
void test()
{//peoinfo data[MAX_PEOPLE];//int sz = 0;//记录当前通讯录人数contact con = {0};//创建通讯录且初始化int input = 0;do{menu();printf("请选择>");scanf("%d",&input);switch (input){case ADD:add_contact(&con);break;case DEL:del_contact(&con);break;case SEARCH:search_contact(&con);break;case MODIFY:modify_contact(&con);break;case SORT:sort_contact(&con);break;case SHOW:show_contact(&con);break;case EXIT:printf("退出通讯录");break;default:printf("重新输入>");break;}} while (input);
}int main()
{test();return 0;
}

C语言实现通讯录【一】(未优化)相关推荐

  1. C语言 --- 动态内存管理(上)+优化版通讯录+笔试题

    文章目录 前言 一.为什么存在动态内存分配 二.动态内存函数的介绍 2.1.malloc函数+free函数 2.2.calloc函数+free函数 2.3.realloc函数 三.常见的动态内存错误 ...

  2. C语言strcpy函数模拟实现,未优化和已优化

    strcpy函数作用是把一个地址后面的字符串拷贝到另一个地址后面,因为字符串后面要加'\0',所以'\0'也要拷贝 //strcpy模拟实现①代码未优化时 #include<stdio.h> ...

  3. 【C语言】- 通讯录实现详解

    今天向大家介绍一个利用C语言实现通讯录的过程. 通讯录相信大家都听说过,存放一个人的信息,用来方便联系.下图为我们即将实现通讯录的功能: 图中已经描述的很清楚了,这个通讯录的容量为1000,所录入的信 ...

  4. C语言实现通讯录【二】(动态内存开辟,文件数据存储)

    C语言实现通讯录[二] 在C语言实现通讯录[一]的基础上进行优化,主要实现两大模块: 动态内存开辟 文件数据存储 动态内存开辟: 考虑到通讯录的大小无法固定,在C语言实现通讯录[一]版本上定义一个足够 ...

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

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

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

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

  7. R语言optim函数进行函数优化实战(和lm函数进行对比)

    R语言optim函数进行函数优化实战(和lm函数进行对比) 目录 R语言optim函数进行函数优化实战(和lm函数进行对比) #仿真数据

  8. 初始化全局变量实例说明C语言中初始化和未初始化的全局变量所在不同的段

    本文是一篇关于初始化全局变量的帖子 实例说明C语言中初始化和未初始化的全局变量地点不同的段 一个程序: Makefile: objs := bss.oall: bss bss: $(objs)gcc ...

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

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

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

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

最新文章

  1. 面向生信分析的高性 RStudio 服务器
  2. linux 线程 进程经典文章
  3. ffmpeg 配置与编译
  4. expdp导出 schema_Oracle使用数据泵在异机之间导出导入多个 schema
  5. github api常用操作
  6. 232接口针脚定义_VGA接口定义,详细图文资料
  7. JAVA加密或混淆技术总结
  8. 长虹电视刷机固件包汇总
  9. 网络操作系统属于计算机网络的资源子网吗,属于计算机网络的资源子网.pdf
  10. Java 常见异常类
  11. eclipse汉化版与背景更换更换jdk及项目jre以及环境变量的配置
  12. 软考网络工程师易错100问
  13. 苹果微信默认字体样式
  14. 安庆集团-冲刺日志(第六天)
  15. 使用Django创建一份在线简历
  16. 7.正则抓取页面内容
  17. 通过inf文件让Win XP实现自动维护 [可实现系统定时任务]
  18. 电子和空穴传输材料,t-Bu-TAZ/TAZ cas150405-69-9
  19. 关于java语言继承的说法正确的是_下列关于Java继承的说法中,正确的是( )
  20. STC15F2K60S2单片机入门:编写头文件

热门文章

  1. BZOJ 1503: [NOI2004]郁闷的出纳员 Treap
  2. Mac上超实用的6款软件,老用户都知道!
  3. 自动化运维-ELK搭建
  4. (VGG)VERY DEEP CONVOLUTIONAL NETWORKS FOR LARGE-SCALE IMAGE RECOGNITION
  5. IO-字符流-FileReader
  6. 揭秘MCN,新人做自媒体必看!
  7. 【转自知乎】音频领域的天才机制,被绝大多数烧友误解了
  8. SV学习笔记—包package的使用
  9. 最长连续不重复子序列
  10. 魅蓝note3联通卡显示无服务器,note手机出现没有信号或读不出SIM卡的处理办法