设计要求:

可以存放1000个人的信息,每个人的信息包括姓名、年龄、性别、电话、住址

通讯录功能包括:

1.增加联系人

2.删除指定联系人

3.查找指定联系人

4.修改指定联系人

5.显示所有联系人

6.退出通讯录

思路分析:

首先我们需要创建3个文件,分别是源文件(test.c)、通讯录文件(contact.c)、通讯录头文件(contact.h),其中头文件用来包含头文件、声名信息、结构体、创建全局变量以及宏。

我们一步一步完成这个程序:

1.在源程序中写一个菜单函数menu()以及联合体Option,当然这个时候还没有引头文件,不可以运行。菜单函数menu()中清楚的标明每个数字对应的功能,分别是 1.增加联系人  2.删除指定联系人  3.查找指定联系人  4.修改指定联系人  5.显示所有联系人  0.退出通讯录。在联合体中相应的成员对应数字0~5。

void menu()
{printf("\n");printf("**************************************\n");printf("******   1. add      2. del     ******\n");printf("******   3. search   4.modify   ******\n");printf("******   5. show     0. exit    ******\n");printf("**************************************\n");
}enum Option
{EXIT,   //0ADD,    //1DEL,    //2SEARCH, //3MODIFY, //4SHOW    //5
};

2.写主函数main(),定义input代表要输入的数,在do while循环中首先调用菜单函数menu(),然后请你输入一个数字,再用switch语句对应相应的功能,在之前我们说过联合体的成员就代表数字0~5,所以case ADD == case case 1,以此类推。相应的选择对应相应功能的函数,如果你选了1,则进入case ADD,然后调用AddContact(),传参&con,当然这个函数要在后面进行创建。con是什么也在后面解释。

int main()
{int input = 0;struct 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 SHOW:ShowContact(&con);break;case EXIT:printf("退出通讯录\n");break;default:printf("选择错误\n");break;}} while (input);return 0;
}

3.创建头文件contact.h,定义结构体类型struct PeoInfo和struct Contact。前者是一个人的信息,创建了他的结构体类型变量代表创建了一个人的信息;后者是一个通讯录的数据,创建一个struct Contact类型的变量包括一个存放1000个数据的struct PeoInfo类型数组data[],再定义一个sz用来计算存放人数。当然我们看到数组中的符号是#define定义的宏,用来替换那些数字。之前看到的con是创建的一个struct Contact类型变量,并且将他初始化。

#define NAME_MAX 30
#define SEX_MAX 5
#define TELE_MAX 12
#define ADDR_MAX 30
#define MAX 1000struct PeoInfo
{char name[NAME_MAX];  //姓名int age;              //年龄char sex[SEX_MAX];    //性别char tele[TELE_MAX];  //电话char addr[ADDR_MAX];  //住址
};struct Contact
{struct PeoInfo data[MAX];//1000个人的数据存放在data数组中int sz;//通讯录中当前有效元素个数
};

4.引用头文件,并声明函数。至此,contact.h就写完了,因为这个头文件已经引用了接下来需要用到的#include <stdio.h>和#include <string.h>,所以直接在test.c中引用#include "contact.h"就可以。

#define NAME_MAX 30
#define SEX_MAX 5
#define TELE_MAX 12
#define ADDR_MAX 30
#define MAX 1000#include <stdio.h>
#include <string.h>struct PeoInfo
{char name[NAME_MAX];int age;char sex[SEX_MAX];char tele[TELE_MAX];char addr[ADDR_MAX];
};struct Contact
{struct PeoInfo data[MAX];//1000个人的数据存放在data数组中int sz;//通讯录中当前有效元素个数
};void AddContact(struct Contact* pc);//增加联系人void DelContact(struct Contact* pc);//删除指定联系人void SearchContact(struct Contact* pc);//查找指定联系人void ModifyContact(struct Contact* pc);//修改指定联系人void ShowContact(struct Contact* pc);//显示所有联系人

5.写contact.c也就是通讯录的具体实现。首先引头文件#include "contact.h",然后写初始化函数InitContact()。用一个结构体指针接受(1000个容量)。将sz赋值为0,数组全部成员赋值为0,用到memset函数,头文件#include <string>我们之前已经引过了。

#include "contact.h"void InitContact(struct Contact* pc)
{pc->sz = 0;//默认没有信息memset(pc->data, 0, sizeof(pc->data));
}

6.接下来写各个功能的函数:

AddContact()增加联系人,输入信息至指针指向的数组的第sz位的相应成员。sz初始为0,刚好对应数组第0位。

void AddContact(struct Contact* pc)
{if (pc->sz == MAX){printf("通讯录已满,无法添加信息\n");}else{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);printf("添加成功\n");pc->sz++;}
}

DelContact()删除指定联系人,如果sz不为0,说明通讯录中有信息,可以进行删除。输入名字后需进行查找,这里通过写一个遍历查找姓名函数FindContactByName()进行查找,其中使用库函数strcmp(字符串比较函数),如果相等则返回数组下标pos,然后在DelContact()从第pos位开始循环,将后一位的值赋给前一位,代表删除成功,然后sz--。

int FindContactByName(const struct Contact* pc, const char* name)
{int i = 0;for (i = 0; i < pc->sz; i++){if (strcmp(pc->data[i].name, name) == 0){return i;}}return -1;
}void DelContact(struct Contact* pc)
{if (pc->sz == 0){printf("通讯录为空,无法删除\n");return;}char name[NAME_MAX] = { 0 };printf("请输入要删除人的名字:");scanf("%s", name);//查找int pos = FindContactByName(pc, name);if (pos == -1){printf("指定的联系人不存在\n");}else{//删除int j = 0;for (j = pos; j < pc->sz-1; j++){pc->data[j] = pc->data[j + 1];}pc->sz--;printf("删除成功\n");}
}

SearchContact()查找指定联系人,直接调用FindContactByName(),找到后打印信息。

void SearchContact(const struct Contact* pc)
{char name[NAME_MAX] = { 0 };printf("请输入要查找人名字:");scanf("%s", name);int pos = FindContactByName(pc, name);if (pos == -1){printf("查无此人\n");}else{printf("%15s\t%5s\t%8s\t%15s\t%30s\n", "name", "age", "sex", "tele", "addr");printf("%15s\t%5d\t%8s\t%15s\t%30s\n",pc->data[pos].name,pc->data[pos].age,pc->data[pos].sex,pc->data[pos].tele,pc->data[pos].addr);}
}

ModifyContac()修改指定联系人,使用FindContactByName()查找,如果存在的话返回数组下标pos,然后输入新的信息覆盖到指针指向下标为pos的数组data的相应成员。

void ModifyContact(struct Contact* pc)
{char name[NAME_MAX] = { 0 };printf("请输入要修改人的名字:");scanf("%s", name);int pos = FindContactByName(pc, name);if (pos == -1){printf("要修改的人不存在\n");}else{printf("请输入新的名字:");scanf("%s", pc->data[pos].name);printf("请输入新的年龄:");scanf("%d", &(pc->data[pos].age));printf("请输入新的性别:");scanf("%s", pc->data[pos].sex);printf("请输入新的电话:");scanf("%s", pc->data[pos].tele);printf("请输入新的住址:");scanf("%s", pc->data[pos].addr);printf("修改成功");}
}

ShowContact()显示所有联系人,进入函数先打印一行表头,用“\t”分隔开,然后用for循环打印每一个人的数据,直到第sz个人停下来。

void ShowContact(struct Contact* pc)
{int i = 0;printf("%15s\t%5s\t%8s\t%15s\t%30s\n","name","age","sex","tele","addr");for (i = 0; i < pc->sz; i++){printf("%15s\t%5d\t%8s\t%15s\t%30s\n",pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].tele,pc->data[i].addr);}
}

写到这里就已经全部完成了通讯录程序的制作,下面展示所有的代码:


test.c

#include "contact.h"void menu()
{printf("\n");printf("**************************************\n");printf("******   1. add      2. del     ******\n");printf("******   3. search   4.modify   ******\n");printf("******   5. show     0. exit    ******\n");printf("**************************************\n");
}enum Option
{EXIT,ADD,DEL,SEARCH,MODIFY,SHOW
};int main()
{int input = 0;struct 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 SHOW:ShowContact(&con);break;case EXIT:printf("退出通讯录\n");break;default:printf("选择错误\n");break;}} while (input);return 0;
}

contact.c

#include "contact.h"void InitContact(struct Contact* pc)
{pc->sz = 0;//默认没有信息memset(pc->data, 0, sizeof(pc->data));
}void AddContact(struct Contact* pc)
{if (pc->sz == MAX){printf("通讯录已满,无法添加信息\n");}else{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);printf("添加成功\n");pc->sz++;}
}int FindContactByName(const struct Contact* pc, const char* name)
{int i = 0;for (i = 0; i < pc->sz; i++){if (strcmp(pc->data[i].name, name) == 0){return i;}}return -1;
}void DelContact(struct Contact* pc)
{if (pc->sz == 0){printf("通讯录为空,无法删除\n");return;}char name[NAME_MAX] = { 0 };printf("请输入要删除人的名字:");scanf("%s", name);//查找int pos = FindContactByName(pc, name);if (pos == -1){printf("指定的联系人不存在\n");}else{//删除int j = 0;for (j = pos; j < pc->sz-1; j++){pc->data[j] = pc->data[j + 1];}pc->sz--;printf("删除成功\n");}
}void SearchContact(const struct Contact* pc)
{char name[NAME_MAX] = { 0 };printf("请输入要查找人名字:");scanf("%s", name);int pos = FindContactByName(pc, name);if (pos == -1){printf("查无此人\n");}else{printf("%15s\t%5s\t%8s\t%15s\t%30s\n", "name", "age", "sex", "tele", "addr");printf("%15s\t%5d\t%8s\t%15s\t%30s\n",pc->data[pos].name,pc->data[pos].age,pc->data[pos].sex,pc->data[pos].tele,pc->data[pos].addr);}
}void ModifyContact(struct Contact* pc)
{char name[NAME_MAX] = { 0 };printf("请输入要修改人的名字:");scanf("%s", name);int pos = FindContactByName(pc, name);if (pos == -1){printf("要修改的人不存在\n");}else{printf("请输入新的名字:");scanf("%s", pc->data[pos].name);printf("请输入新的年龄:");scanf("%d", &(pc->data[pos].age));printf("请输入新的性别:");scanf("%s", pc->data[pos].sex);printf("请输入新的电话:");scanf("%s", pc->data[pos].tele);printf("请输入新的住址:");scanf("%s", pc->data[pos].addr);printf("修改成功");}
}void ShowContact(struct Contact* pc)
{int i = 0;printf("%15s\t%5s\t%8s\t%15s\t%30s\n","name","age","sex","tele","addr");for (i = 0; i < pc->sz; i++){printf("%15s\t%5d\t%8s\t%15s\t%30s\n",pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].tele,pc->data[i].addr);}
}

contact.h

#define NAME_MAX 30
#define SEX_MAX 5
#define TELE_MAX 12
#define ADDR_MAX 30
#define MAX 1000#include <stdio.h>
#include <string.h>struct PeoInfo
{char name[NAME_MAX];int age;char sex[SEX_MAX];char tele[TELE_MAX];char addr[ADDR_MAX];
};struct Contact
{struct PeoInfo data[MAX];//1000个人的数据存放在data数组中int sz;//通讯录中当前有效元素个数
};void AddContact(struct Contact* pc);//增加联系人void DelContact(struct Contact* pc);//删除指定联系人void SearchContact(struct Contact* pc);//查找指定联系人void ModifyContact(struct Contact* pc);//修改指定联系人void ShowContact(struct Contact* pc);//显示所有联系人

C语言制作通讯录程序相关推荐

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

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

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

    本博客推荐给C语言学习到结构体的新手们,供其练习.建议新手读者在阅读之后,仔细分析原码,再独立完成程序编写. 一.本通讯录要实现的功能: 通讯录可以用来存储1000个人的信息,每个人的信息包括:姓名. ...

  3. 用c语言编写通讯录程序,学C三个月了,学了文件,用C语言写了个通讯录程序

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #include #include #include struct QQ //结构体,有6个成员 { char name[20]; ch ...

  4. 微信小程序用vant组件制作通讯录

    微信小程序用vant组件制作通讯录 效果图: 代码如下: .wxml: 在这里插入<van-index-bar index-list="{{ indexList }}"> ...

  5. C语言制作电子时钟程序(内附代码)

    今天来用C语言制作一款电子时钟程序,相信你们一定能用的上. 效果展示 1.窗口创建   2.基本绘图 3.时间获取 4.代码展示 绘制表盘部分代码: #include <stdio.h> ...

  6. 用c语言做一个五子棋程序,C语言制作简单五子棋游戏

    原标题:C语言制作简单五子棋游戏 C语言制作简单的五子棋游戏 学习C语言的人很多,但是用C语言很少,而用来为自己所用,来做游戏的人就更少了,很多人都是跟着学校学习,学校讲到哪就坐到哪,但是以后却还是不 ...

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

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

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

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

  9. 共阳极数码时钟c语言程序,基于51单片机C语言数字钟程序.doc

    基于51单片机C语言数字钟程序 基于51单片机C语言数字钟程序 数字电子钟的设计 一. 绪论 (一)引言 20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地 ...

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

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

最新文章

  1. 星星模型 维度_用模型“想象”出来的target来训练,可以提高分类的效果!
  2. mysql右下角托盘中的图标_MFC下托盘图标的实现和托盘菜单。
  3. 快开宝PDA开单器出入库扫码:让批发零售变得更简单
  4. Linux小细节-1
  5. OLTP v.s. OLAP
  6. 实现深拷贝的常用方法
  7. PMP常考知识点整理
  8. 求车牌号问题(C语言程序设计)
  9. CISP 考试教材《第 8 章 知识域:物理与网络通信安全》知识整理
  10. 19级HPU算法协会公开课第一期:【基础算法1】 题解
  11. 我市“一卡通”被授予国家金卡工程优秀应用成果奖
  12. No module named ‘_ssl‘
  13. mysql distribute by_hive与mysql的数据分区的异同
  14. UIview 添加触摸.手势
  15. python 全文检索 whoosh flask_基于whoosh的flask全文搜索插件flask-msearch
  16. BeanUtils之populate的用法
  17. 【bat】验证是否安装某个软件
  18. NXP MPC574x LinFlexd配置和DMA配置
  19. Android TV与机顶盒
  20. 怎样对平面中的点进行顺时针或者逆时针排序

热门文章

  1. Java 基础实验 银行转账
  2. 知乎高赞回答!财务小白快速上手报表分析(内含公式+模板)
  3. Project 3 :Python爬虫源码实现抓取1000条西刺免费代理IP-HTTPS并保存读取
  4. 获取稳定的西刺代理IP
  5. 怎么让plsqldev恢复界面视图复位
  6. Linux镜像模式,Linux实现HiTool的合并镜像功能
  7. 基本文件上传漏洞攻击实验
  8. 【软件开发规范五】《用户需求及规格说明书》
  9. 浅谈JAVA项目开发
  10. vs2015安装python3.6.8,windows下安装caffe (cuda10.0,anaconda3,python3.6→python2.7,vs2015→vs2013)...