之前写的静态版的通讯录,只能存储固定数目大小的联系人信息,现在要升级为动态版的,这样只要容量不够的话只需自动扩容就可以啦!而且之前版本的信息每次退出程序后不会保存,每次需要重新录入,加入文件操作后可以将录入的信息保存到文件中,然后再从文件中读取就可以了。现在就让我们来完成一下之前程序的升级版。

实现一个简单的通讯录

要求:

通讯录可以用来存储1000个人的信息,每个人的信息包括:

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

该通讯录所具备的基本功能:

1. 添加联系人信息

2. 删除指定联系人信息

3. 查找指定联系人信息

4. 修改指定联系人信息

5. 显示所有联系人信息

6. 清空所有联系人

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

8.可以将信息保存到文件中,每次从文件中读取信息

9.可以实现扩容,实现动态存储

#ifndef _CONTACT_H__

#define _CONTACT_H__

#include#include#include#include#define MAX_NAME 20

#define MAX_SEX 5

#define MAX_TEL 11

#define MAX 10

#define ADD_CAPACITY 10

#define MAX_ADDR 100

#define FILE_NAME "contact.txt"

enum OPERATIONS//通讯录的所有功能选项

{

EXIT,

ADD,

DEL,

MODIFY,

SORT,

SEARCH,

SHOW,

CLEAR

};

enum MODIFYINFORMATION//修改联系人信息的选项

{

EXITMODIFY,

NAME,

AGE,

TEL,

SEX,

ADDR

};

typedef struct Person_Information

{

char name[MAX_NAME];

int age;

int tel[MAX_TEL];

char sex[MAX_SEX];

char addr[MAX_ADDR];

int flag;

}PerInfor;//存放联系人信息的一个结构体类型

typedef struct Contact

{

PerInfor* data;

int count;

int capacity;

}Contact, *pContact;//count表示联系人的个数,data是一个PerInfor类型的数组用来存放联系人信息

void InitContact(pContact p);//对count和data[]进行初始化

int findperson(pContact p);//查找指定的联系人,并返回下标

void ADDContact(pContact p);//添加联系人信息

void DELContact(pContact p);//删除指定联系人信息

void MODIFYMenu();//修改联系人信息的选择菜单

void MODIFYContact(pContact p);//修改指定联系人信息

void SORTContact(pContact p);//根据名字将联系人排序;

void SEARCHContact(pContact p);//查找指定联系人信息

void ShowContact(pContact p);//显示所有联系人信息

void CLEARContact(pContact p);//清空所有联系人

void DestoryContact(pContact p);//销毁动态开辟的空间

void SaveContact(pContact p);//保存内存信息到文件

void LoadContact(pContact p);//从文件中加载信息到内存

#endif //_CONTACT_H__

#include "Contact.h"

void check_capacity(pContact p)//增容

{

if (p->count == p->capacity)

{

PerInfor* pc = (PerInfor*)realloc(p->data, (p->capacity + ADD_CAPACITY)*sizeof(PerInfor));

if (pc == NULL)

{

printf("增容失败\n");

}

else

{

p->data = pc;

pc = NULL;

}

p->capacity += ADD_CAPACITY;

printf("增容成功\n");

}

}

void LoadContact(pContact p)//从文件中读取信息

{

PerInfor tmp = { 0 };

FILE *pf = fopen(FILE_NAME, "r");

if (pf == NULL)

{

perror("open file for read");

exit(EXIT_FAILURE);

}

while (fread(&tmp, sizeof(PerInfor), 1, pf))

{

//扩容

check_capacity(p);

p->data[p->count] = tmp;

p->count++;

}

fclose(pf);

pf = NULL;

}

void InitContact(pContact p)

{

p->count = 0;

p->capacity = MAX;

p->data = (PerInfor*)calloc(sizeof(PerInfor),p->capacity);

p->data->flag = 1;

LoadContact(p);//加载文件的信息到内存中

}

int findperson(pContact p)

{

int i = 0;

char personname[MAX_NAME];

printf("请输入要查找的联系人的姓名\n");

scanf("%s", personname);

for (i = 0; i < p->count; i++)

{

if (strcmp(personname, p->data[i].name) == 0)

{

return i;

}

}

return -1;

}

void ADDContact(pContact p)

{

check_capacity(p);

printf("请输入姓名\n");

scanf("%s", p->data[p->count].name);

printf("请输入年龄\n");

scanf("%d", &(p->data[p->count].age));

printf("请输入联系方式\n");

scanf("%s", p->data[p->count].tel);

printf("请输入性别\n");

scanf("%s", p->data[p->count].sex);

printf("请输入家庭住址\n");

scanf("%s", p->data[p->count].addr);

p->count++;

printf("添加联系人成功\n");

}

void DELContact(pContact p)

{

int i = 0;

if (p->count == 0)

{

printf("通讯录为空\n");

return;

}

else

{

int ret = findperson(p);

if (ret == -1)

{

printf("无该联系人\n");

return;

}

else

{

p->data->flag = 0;

p->count--;

}

printf("删除联系人成功\n");

}

}

void MODIFYMenu()

{

printf("*******************************\n");

printf("********1.name****2.age********\n");

printf("********3.tel ****4.sex********\n");

printf("*************5.addr************\n");

printf("**********0.exitmodify*********\n");

printf("*******************************\n");

}

void MODIFYContact(pContact p)

{

int ret = findperson(p);

if (ret == -1)

{

printf("无该联系人,请检查输入信息\n");

return;

}

else

{

int input = 0;

MODIFYMenu();

printf("请选择要修改的信息\n");

scanf("%d", &input);

switch (input)

{

case NAME:

printf("请输入修改后的名字\n");

scanf("%s", p->data[ret].name);

break;

case AGE:

printf("请输入修改后的年龄\n");

scanf("%d", &(p->data[ret].age));

break;

case TEL:

printf("请输入修改后的联系方式\n");

scanf("%S", p->data[ret].tel);

break;

case SEX:

printf("请输入修改后的性别\n");

scanf("%s", p->data[ret].sex);

break;

case ADDR:

printf("请输入修改后的住址\n");

scanf("%s", p->data[ret].addr);

break;

case EXITMODIFY:

break;

default:

printf("无该选项,请重新选择\n");

break;

}

}

printf("修改联系人信息成功\n");

}

int DATA_name_cmp(const void* e1, const void* e2)

{

assert(e1&&e2);

return (strcmp(((PerInfor*)e1)->name, ((PerInfor*)e2)->name));

}

void SWAP(char *e1, char *e2, int width)

{

assert(e1&&e2);

int i = 0;

for (i = 0; i < width; i++)

{

char tmp = *((char*)e1 + i);

*((char*)e1 + i) = *((char*)e2 + i);

*((char*)e2 + i) = tmp;

}

}

void BUBBLE_sort(void *base, int count, int width, int(*cmp)(const void *e1, const void *e2))

{

assert(base&&cmp);

int i = 0;

int j = 0;

for (i = 0; i < count - 1; i++)

{

for (j = 0; j < count - i - 1; j++)

{

if (cmp((char *)base + j*width, (char *)base + (j + 1)*width)>0)

{

SWAP((char *)base + j*width, (char *)base + (j + 1)*width, width);

}

}

}

}

void SORTContact(pContact p)

{

int i = 0;

if (p->count == 0)

{

printf("通讯录为空\n");

return;

}

else

{

BUBBLE_sort(p->data, p->count, sizeof(PerInfor), DATA_name_cmp);

}

ShowContact(p);

printf("联系人列表排序成功\n");

}

void SEARCHContact(pContact p)

{

int ret = findperson(p);

printf("%10s %10s %10s %10s %10s\n", "姓名", "年龄", "联系方式", "性别", "住址");

printf("%10s ", p->data[ret].name);

printf("%9d ", p->data[ret].age);

printf(" %10s ", p->data[ret].tel);

printf("%9s ", p->data[ret].sex);

printf(" %10s ", p->data[ret].addr);

printf("\n");

}

void CLEARContact(pContact p)

{

p->count = 0;

printf("通讯录清空成功\n");

}

void ShowContact(pContact p)

{

int i = 0;

int j = 0;

if (p->count == 0)

{

printf("通讯录为空\n");

return;

}

else

{

if (p->data->flag == 1)

{

printf("%10s %10s %10s %10s %10s\n", "姓名", "年龄", "联系方式", "性别", "住址");

for (i = 0; i < p->count; i++)

{

printf("%10s ", p->data[i].name);

printf("%9d ", p->data[i].age);

printf(" %10s ", p->data[i].tel);

printf("%9s ", p->data[i].sex);

printf(" %10s ", p->data[i].addr);

printf("\n");

}

}

}

}

void SaveContact(pContact p)//退出程序时,将所录入的信息保存到文件中

{

FILE*pf = fopen(FILE_NAME, "w");

if (pf == NULL)

{

perror("open file for write");

exit(EXIT_FAILURE);

}

//保存信息

int i = 0;

for (i = 0; i < p->count; i++)

{

fwrite(p->data+i,sizeof(PerInfor),1,pf );

fflush(pf);

}

fclose(pf);

pf = NULL;

}

void DestoryContact(pContact p)

{

//保存内存信息到文件

SaveContact(p);

printf("信息已成功保存\n");

free(p->data);

p->data = NULL;

p->count = 0;

p->capacity = 0;

}

#include "Contact.h"

void menu()

{

printf("********************************\n");

printf("*******1.add********2.del*******\n");

printf("*******3.modify****4.sort*******\n");

printf("*******5.search*****6.show******\n");

printf("*******7.clear******0.exit******\n");

printf("********************************\n");

}

int main()

{

int input = 0;

Contact my_con;

InitContact(&my_con);

do

{

menu();

printf("请选择操作功能>:");

scanf("%d", &input);

switch (input)

{

case ADD:

ADDContact(&my_con);

break;

case DEL:

DELContact(&my_con);

break;

case MODIFY:

MODIFYContact(&my_con);

break;

case SORT:

SORTContact(&my_con);

break;

case SEARCH:

SEARCHContact(&my_con);

break;

case SHOW:

ShowContact(&my_con);

break;

case CLEAR:

CLEARContact(&my_con);

break;

case EXIT:

DestoryContact(&my_con);

break;

default:

printf("选择错误,请重新选择\n");

break;

}

} while (input);

system("pause");

return 0;

}

vs2010c语言通讯录读取,用C语言实现通讯录(二、动态版+文件保存信息)相关推荐

  1. C语言实现通讯录(使用文件保存信息)

    这两天把动态内存还有文件函数这部分的课听了一下,也跟着把通讯录升级了一下 存储元素不再是固定的了,当存储的元素等于上限时内存就动态增长 每次退出信息又会销毁,可以用fwrite 和 fread让它保存 ...

  2. C语言小项目 -- 通讯录(静态版+动态版+文件版)

    文章目录 一.总体设计思路 1.设计背景 2.设计框架 3.功能概述 二.通讯录(静态版) 1.结构体设计 2.初始化通讯录 3.添加联系人信息 4.删除联系人信息 5.查找联系人(按姓名) 6.查找 ...

  3. 用c语言循环读取坐标,C语言之For循环--1(星状图)

    最近在学C的数据结构,顿感C语言for循环不够理解深刻,所以敲一些代码 1.上半部分与下半部分分别用两个循环 #include#include#include#include/* * *** **** ...

  4. 【R语言 数据读取】R语言读取sav格式文件

    rm(list=ls()) gc()options(scipen = 200)#读取数据集 # haven包读取sav格式文件 library(haven)data <- read_sav(&q ...

  5. C语言小项目——通讯录的存储系统(静态版,动态版,文件版)

    目录 前言 一.总体设计框架 二.三种通讯录的功能阐述 三.静态通讯录 1.结构体设计 2.初始化通讯录 3.增加联系人的信息 4.删除联系人的信息 5.查找指定联系人并打印 6.修改联系人的信息 7 ...

  6. 【240行拿下】基于C语言 实现通讯录管理系统 带文件保存及读取功能

    一 首言         学校布置的小作业希望对你有帮助,完整代码在文章结尾为方便阅读代码基本都有注释.代码是在满足老师要求下,尽量减少功能和代码方便同学理解的思想上完成的 (完成7个功能,功能性代码 ...

  7. python通讯录管理系统设计_数据结构课程设计-通讯录管理系统(C语言版)

    ##数据结构课程设计-通讯录管理系统 一,前言 自从上次C语言课设写完后,这次数据结构课设就写的游刃有余了,很快啊,不足三天就写完了它(年轻人不讲武德),如果你认真看过我之前写的C语言课程设计-球队管 ...

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

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

  9. c语言实践周通讯录设计报告,C语言程序的设计报告_个人通讯录.docx

    . .下载可编辑. . .下载可编辑. 航空航天大学金城学院 <C语言程序设计>课程设计报告 个人通讯录系统 学号: 学号: 日期: TOC \o "1-5" \h \ ...

最新文章

  1. 【好资源】全网第一份,OpenCV 4-Contrib扩展模块中文教程
  2. HACMP 认证学习系列,第 2 部分:计划与设计
  3. BUUCTF(pwn) ciscn_2019_s_3 [ 栈溢出SROP攻击]
  4. C语言中%c与%s的区别与划分
  5. 机器学习:贝叶斯分类器,朴素贝叶斯,拉普拉斯平滑
  6. StringBuilder与StringBuffer比较
  7. 函数的定义,语法,二维数组,几个练习题
  8. 三、关于网页布局你该知道这些!(布局总结:标准流、浮动、定位)
  9. php的优化参数有哪些,php 参数优化
  10. 年终庆典高端海报设计PSD分层模板
  11. WHY数学表达式的3D可视化
  12. 最好的python3视频教程_哪里有免费的python3教程啊?最好是有例子的视频教学
  13. 计数译码显示电路实验报告总结_译码器及其应用
  14. Flutter开发:在Flutter Plugin中引入aar——本地maven法
  15. 2000-2020年中国地面气象数据:从NOAA到分省面板
  16. excel求回归直线方程的公式_求回归直线方程的三种方法
  17. 你及格了吗?史上最难云原生冷知识大挑战真题解析
  18. 初学Mean Shift 聚类算法
  19. XDOJ1184 - 贪心的小白羊
  20. 浅析相机相关坐标系的相互转换(世界坐标系、相机坐标系、图像坐标系、像素坐标系、内参矩阵、外参矩阵、扭转因子)【相机标定计算机视觉】

热门文章

  1. 集成墙面室内装修 四海八荒美出新高度
  2. python中case的用法_如何在Python中使用TestCase实现一个断言功能
  3. 缘——为绮芸婚礼而作
  4. 自定义Switch背景带文字
  5. 自动化1123和1124学生班链接
  6. 计算机win7IP地址在哪,win7系统在哪里更改ip地址
  7. 数控雕刻机的工作原理及主要用途
  8. hdu 1176(天上掉馅饼了)
  9. 从零开始前端学习[36]:Cs3中的3D效果实现
  10. 自建Kubernetes的LoadBalancer类型服务方案-MetalLB