目录

一、引言

二、如何实现通讯录

1.通讯录要求

2.创建主菜单

3.初步设置主函数

4.创建通讯录

5.初始化通讯录

6.case 1(增加联系人)

7.case 5(显示通讯录中的信息)

8.case 2(删除指定联系人)

9.case 3(删除指定联系人)

10.case 4(修改指定联系人的信息)

11.case 6(排序通讯录中的信息)

12.代码源

1.test.c:

2.contact.c:

3.contact.h:


一、引言

要想实现通讯录的代码,首先我们需要创建一下文件:

tesk.c ----------------- 测试通讯录

contact.c --------------- 通讯录的实现

contact.h --------------- 通讯录的声明

二、如何实现通讯录

1.通讯录要求

我们需要用C语言模拟一个通讯录可以用来存储1000个人的信息

每个人的信息包括:

姓名、电话、性别、住址、年龄

功能包括:

1.新增联系人

2.查找联系人

3.删除联系人

4.修改联系人

5.查看所有联系人

6.以名字排序所有联系人

2.创建主菜单

代码如下:

void menu()
{printf("**************************************\n");printf("*****   1. add      2. del       *****\n");printf("*****   3. search   4. modify    *****\n");printf("*****   5. show     6. sort      *****\n");printf("*****   0. exit                  *****\n");printf("**************************************\n");
}

3.初步设置主函数

写完了通讯录菜单后,我们就要对主函数进行一个简单框架的设计(仅仅设计初始主函数)

代码如下:

int main()
{int input = 0;//创建通讯录do{menu();printf("请选择>:");scanf("%d", &input);switch (input){case 1:break;case 2:break;case 3:break;case 4:break;case 5:break;case 6:break;ase 0:printf("退出通讯录\n");break;default:printf("选择错误\n");break;}} while (input);return 0;
}

4.创建通讯录

根据设计完成初始主函数的思路,创建通讯录

主函数代码:

    //创建通讯录struct Contact con;//通讯录

此时,我们要在contact.h中声明函数

contact.h代码:

#define MAX 100
#define MAX_NAME 20
#define MAX_SEX 5
#define MAX_TELE 12
#define MAX_ADDR 30//表示一个人的信息
struct PeoInfo
{char name[MAX_NAME];char sex[MAX_SEX];char tele[MAX_TELE];int age;char addr[MAX_ADDR];
};//通讯录
struct Contact
{struct PeoInfo data[MAX];int sz;
};

具体效果:

5.初始化通讯录

创建完成通讯录,我们要对通讯录进行初始化

主函数代码:

    //初始化通讯录InitContact(&con);

同样,我们要在contact.h中声明函数

//初始化通讯录
void InitContact(struct Contact* pc);

函数的实现(contact.c):

void InitContact(struct Contact* pc)
{assert(pc);pc->sz = 0;memset(pc->data, 0, MAX *sizeof(struct PeoInfo));
}

整体效果:

6.case 1(增加联系人)

主函数test.c:

    case 1:AddContact(&con);

函数声明(contact.h):

//增加人的信息到通讯录
void AddContact(struct Contact* pc);

函数的实现(contact.c):

void AddContact(struct 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");
}

 pc->data[pc->sz].name

效果:

7.case 5(显示通讯录中的信息)

主函数:

case 5:ShowContact(&con);

函数声明(contact.h):

//显示通讯录中的信息
void ShowContact(const struct Contact* pc);

函数的实现(contact.c):

void ShowContact(const struct Contact* pc)
{int i = 0;printf("%-20s\t%-5s\t%-5s\t%-12s\t%-30s\n", "姓名", "性别", "年龄", "电话", "地址");for (i = 0; i < pc->sz; i++){printf("%-20s\t%-5s\t%-5d\t%-12s\t%-30s\n", pc->data[i].name,pc->data[i].sex,pc->data[i].age,pc->data[i].tele,pc->data[i].addr);}
}

效果:

8.case 2(删除指定联系人)

主函数:

case 2:DelContact(&con);

函数声明(contact.h):

//删除指定联系人
void DelContact(struct Contact* pc);

函数的实现(contact.c):

static int FindByName(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 DelContact(struct Contact* pc)
{char name[MAX_NAME];printf("请输入要删除人的名字:>");scanf("%s", name);//查找一下指定的人是否存在int ret = FindByName(pc, name);if (ret == -1)printf("要删除的人不存在\n");else{//删除int j = 0;for (j = ret; j < pc->sz-1; j++){pc->data[j] = pc->data[j + 1];}pc->sz--;printf("成功删除指定联系人\n");}
}

效果:

9.case 3(删除指定联系人)

主函数:

case 3:SearchContact(&con);

函数声明(contact.h):

//查找指定联系人
void SearchContact(const struct Contact* pc);

函数的实现(contact.c):

void SearchContact(const struct Contact* pc)
{char name[MAX_NAME];printf("请输入要查找的人的名字:>");scanf("%s", name);//查找一下指定的人是否存在int ret = FindByName(pc, name);if (ret == -1)printf("要查找的人不存在\n");else{printf("%-20s\t%-5s\t%-5s\t%-12s\t%-30s\n", "姓名", "性别", "年龄", "电话", "地址");printf("%-20s\t%-5s\t%-5d\t%-12s\t%-30s\n", pc->data[ret].name,pc->data[ret].sex,pc->data[ret].age,pc->data[ret].tele,pc->data[ret].addr);}
}

10.case 4(修改指定联系人的信息)

主函数:

ModifyContact(&con);

函数声明(contact.h):

//修改指定联系人的信息
void ModifyContact(struct Contact* pc);

函数的实现(contact.c):

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

效果:

11.case 6(排序通讯录中的信息)

主函数:

SortContact(&con);

函数声明(contact.h):

//排序通讯录中的信息
void SortContact(struct Contact* pc);

函数的实现(contact.c):

int CmpByName(const void* e1, const void* e2)
{return strcmp(((struct PeoInfo*)e1)->name, ((struct PeoInfo*)e2)->name);
}//按照名字来排序
void SortContact(struct Contact* pc)
{qsort(pc->data, pc->sz, sizeof(struct PeoInfo), CmpByName);
}

效果:

12.代码源

1.test.c:

#define _CRT_SECURE_NO_WARNINGS 1#include "contact.h"void menu()
{printf("**************************************\n");printf("*****   1. add      2. del       *****\n");printf("*****   3. search   4. modify    *****\n");printf("*****   5. show     6. sort      *****\n");printf("*****   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:AddContact(&con);break;case 2:DelContact(&con);break;case 3:SearchContact(&con);break;case 4:ModifyContact(&con);break;case 5:ShowContact(&con);break;case 6:SortContact(&con);break;case 0:printf("退出通讯录\n");break;default:printf("选择错误\n");break;}} while (input);return 0;
}

2.contact.c:

#define _CRT_SECURE_NO_WARNINGS 1#include "contact.h"void InitContact(struct Contact* pc)
{assert(pc);pc->sz = 0;memset(pc->data, 0, MAX * sizeof(struct PeoInfo));
}void AddContact(struct 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 ShowContact(const struct Contact* pc)
{int i = 0;printf("%-20s\t%-5s\t%-5s\t%-12s\t%-30s\n", "姓名", "性别", "年龄", "电话", "地址");for (i = 0; i < pc->sz; i++){printf("%-20s\t%-5s\t%-5d\t%-12s\t%-30s\n", pc->data[i].name,pc->data[i].sex,pc->data[i].age,pc->data[i].tele,pc->data[i].addr);}
}static int FindByName(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 DelContact(struct Contact* pc)
{char name[MAX_NAME];printf("请输入要删除人的名字:>");scanf("%s", name);//查找一下指定的人是否存在int ret = FindByName(pc, name);if (ret == -1)printf("要删除的人不存在\n");else{//删除int j = 0;for (j = ret; j < pc->sz - 1; j++){pc->data[j] = pc->data[j + 1];}pc->sz--;printf("成功删除指定联系人\n");}
}void SearchContact(const struct Contact* pc)
{char name[MAX_NAME];printf("请输入要查找的人的名字:>");scanf("%s", name);//查找一下指定的人是否存在int ret = FindByName(pc, name);if (ret == -1)printf("要查找的人不存在\n");else{printf("%-20s\t%-5s\t%-5s\t%-12s\t%-30s\n", "姓名", "性别", "年龄", "电话", "地址");printf("%-20s\t%-5s\t%-5d\t%-12s\t%-30s\n", pc->data[ret].name,pc->data[ret].sex,pc->data[ret].age,pc->data[ret].tele,pc->data[ret].addr);}
}void ModifyContact(struct Contact* pc)
{printf("请输入要修改人的名字:>");char name[MAX_NAME];scanf("%s", name);int ret = FindByName(pc, name);if (ret == -1)printf("要修改的人不存在\n");else{printf("请输入名字:>");scanf("%s", pc->data[ret].name);printf("请输入性别:>");scanf("%s", pc->data[ret].sex);printf("请输入年龄:>");scanf("%d", &(pc->data[ret].age));printf("请输入电话:>");scanf("%s", pc->data[ret].tele);printf("请输入地址:>");scanf("%s", pc->data[ret].addr);printf("修改成功\n");}
}int CmpByName(const void* e1, const void* e2)
{return strcmp(((struct PeoInfo*)e1)->name, ((struct PeoInfo*)e2)->name);
}//按照名字来排序
void SortContact(struct Contact* pc)
{qsort(pc->data, pc->sz, sizeof(struct PeoInfo), CmpByName);
}

3.contact.h:

#pragma once#include <string.h>
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>#define MAX 100
#define MAX_NAME 20
#define MAX_SEX 5
#define MAX_TELE 12
#define MAX_ADDR 30//表示一个人的信息
struct PeoInfo
{char name[MAX_NAME];char sex[MAX_SEX];char tele[MAX_TELE];int age;char addr[MAX_ADDR];
};//通讯录
struct Contact
{struct PeoInfo data[MAX];int sz;
};//初始化通讯录
void InitContact(struct Contact* pc);//增加人的信息到通讯录
void AddContact(struct Contact* pc);//显示通讯录中的信息
void ShowContact(const struct Contact* pc);//删除指定联系人
void DelContact(struct Contact* pc);//查找指定联系人
void SearchContact(const struct Contact* pc);//修改指定联系人的信息
void ModifyContact(struct Contact* pc);//排序通讯录中的信息
void SortContact(struct Contact* pc);

【C语言进阶】C语言实现通讯录相关推荐

  1. c语言进阶——c语言题目训练

    题目一: 5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果: A选手说:B第二,我第三: B选手说:我第二,E第四: C选手说:我第一,D第二: D选手说:C最后,我第三: E选手说:我第四, ...

  2. C语言 | 进阶之路第一关

    目录 前言 - 文章概述 深入剖析数据在内存中的存储 数据的类型 整型在内存中的存储 浮点型在内存中的存储 指针进阶 字符指针 指针数组 数组指针 数组传参和指针传参 函数指针 函数指针数组 指向函数 ...

  3. ggplot2箱式图两两比较_R语言进阶笔记2 | 长数据与ggplot2

    1. 长数据是什么鬼? 之前介绍了如何将多个性状的箱线图放在一个图上,比如learnasreml包中的fm数据,它有h1~h5五年的株高数据,想对它进行作图. 「数据预览:」 > library ...

  4. C语言进阶深度学习目录表

    学习交流加(可免费帮忙下载CSDN资源): 个人微信(进微信群加): LyyCoder 学习交流资源分享qq群1(已满): 962535112 学习交流资源分享qq群2(已满): 780902027 ...

  5. 【C语言进阶深度学习记录】三十八 C/C++语言中的函数声明与函数定义

    文章目录 1 函数的声明和定义 1.1 代码分析 2 总结 1 函数的声明和定义 声明的意义在于告诉编译器程序单元的存在.只是告诉编译器它存在但是不在声明这里定义,有可能在当前文件中的其他地方或者其他 ...

  6. 【C语言进阶深度学习记录】三十五 程序中的堆、栈以及静态存储区(数据区)

    学习交流加 个人qq: 1126137994 个人微信: liu1126137994 学习交流资源分享qq群: 962535112 在我之前学习底层的知识的时候,也写过相关的内容.可以对比的学习:[软 ...

  7. 【C语言进阶深度学习记录】二十六 C语言中的字符串与字符数组的详细分析

    之前有一篇文章是学习了字符和字符串的,可以与之结合学习:[C语言进阶深度学习记录]十二 C语言中的:字符和字符串 文章目录 1 字符串的概念 1.1 字符串与字符数组 1.2 字符数组与字符串代码分析 ...

  8. 【C语言进阶深度学习记录】十九 #pragma使用与分析

    文章目录 1 #pragma 概念简介 1.1 #pragma message 的用法 1.2 #pragma once 的用法 1.3 #pragma pack 的用法 1.31 struct占用的 ...

  9. 【C语言进阶深度学习记录】十六 静态库与动态库的创建与使用

    上一篇文章学习了编译的过程,点击链接查看:[C语言进阶深度学习记录]十五 编译过程简介,每一个C源文件编译后将会生成目标文件,那么这些目标文件,还需要链接起来,生成可执行文件. 文章目录 1 链接的意 ...

  10. 【C语言进阶深度学习记录】八 C语言中void的分析

    文章目录 1 void的意义 1.1 不存在void变量 1.2 C标准 1.3 void指针的意义 1.4 通过void* 实现memset函数 2 总结 1 void的意义 void修饰函数的参数 ...

最新文章

  1. 瑞丽噪声与信噪比的关系_演出扩声系统的噪声与接地
  2. C语言实现二叉树(附完整源码)
  3. timedatectl使用
  4. 带Spring Boot的GWT
  5. UML 面向对象分析与设计
  6. pytorch两种常用的学习率衰减方法
  7. ios 横向滚轮效果_iOS列表滚动视差效果
  8. 做副业(初创业),逻辑其实很简单,无非这两个方向
  9. 怎么设计接口测试用例更好——百度大佬“教你写用例”
  10. J2Cache 知识点总结
  11. Ae 入门系列之十二:形状动画
  12. LR破解版录制手机脚本
  13. Java练习题_通过2月天数来判断平年闰年
  14. 悉尼大学计算机硕士健康科技,悉尼大学健康科学学院
  15. 三种模型验证方法:holdout, K-fold, leave one out cross validation(LOOCV)
  16. BIOS实战之Super IO-Smart Fan
  17. 记录Hbuilder项目使用xcode离线打包上传苹果商店踩过的坑
  18. controller 之@...
  19. 解决Win10系统由于INF文件失效导致安卓MTP驱动安装失败的问题
  20. 第1章 计算机网络和因特网-计算机网络

热门文章

  1. JZOJ 1285. 奶酪厂
  2. VC dll 注入之钩子注入
  3. 【图像处理】 均值滤波、中值滤波和高斯滤波
  4. 创建单链表的头插法与尾插法详解
  5. C语言入门篇----system命令
  6. 机器学习中的置信区间与置信度
  7. SpaceX证实从7月起部署第四个轨道壳 将发射348颗星链卫星
  8. Linux学习日志-02
  9. linux vi 报错 E37: No write since last change (add to override)
  10. yield用法 (转载)