当前位置: 首页 > news >正文

可存储到文件里的通讯录contact

contact.h

#pragma once#define MAX 100  //通讯录存储的人数
#define NAME_MAX 20  //联系人的名字长度
#define SEX_MAX 5  //性别的长度
#define ADDR_MAX 30  //地址的长度
#define TELE_MAX 12  //电话的长度#define DEFAULT_SZ 3
#define INC_SZ 2#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <stdlib.h>typedef struct PeoInfo
{char name[NAME_MAX];  //名字int age;  //年龄char sex[SEX_MAX];  //性别char addr[ADDR_MAX];  //地址char tele[TELE_MAX];  //电话
} PeoInfo;//typedef struct Contact
//{
//	PeoInfo data[MAX]; //通讯录  数组
//	int sz;//当前已存放的信息个数
//} Contact;
typedef struct Contact
{PeoInfo* data; //通讯录  数组int sz;//当前已存放的信息个数int catacity;//当前通讯录最大容量
} Contact;//初始化通讯录
void InitContact(Contact* pc);
//销毁通讯录
void DestroyContact(Contact* pc);
//添加联系人
void AddContact(Contact* pc);
//删除联系人
void DelContact(Contact* pc);
//查找联系人
void SearchContact(const Contact* pc);
//修改联系人
void ModifyContact(Contact* pc);
//排序通讯录
void QsortContact(Contact* pc);
//清空通讯录
void ClearContact(Contact* pc);
//展示通讯录
void ShowContact(const Contact* pc);
//保存通讯录中的信息到文件中
void SaveContact(Contact* pc);
//加载文件信息通讯录 
void LoadContact(Contact* pc);

comtact.c

#define _CRT_SECURE_NO_WARNINGS 1#include "contact.h"//void InitContact(Contact* pc)
//{
//	assert(pc);
//	pc->sz = 0;
//	memset(pc->data, 0, sizeof(pc->data));
//}
void InitContact(Contact* pc)
{assert(pc);pc->sz = 0;PeoInfo* ptr = (PeoInfo*)calloc(DEFAULT_SZ, sizeof(PeoInfo));if (ptr == NULL){perror("InitContact::calloc");return;}pc->data = ptr;pc->catacity = DEFAULT_SZ;//加载文件信息通讯录LoadContact(pc);}void DestroyContact(Contact* pc)
{assert(pc);free(pc->data);pc->data = NULL;pc->catacity = 0;pc->sz = 0;pc = NULL;}//void AddContact(Contact* pc)
//{
//	assert(pc);
//	if (pc->sz == MAX)
//	{
//		printf("通讯录已满,无法添加\n");
//		return;
//	}
//	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].addr);
//	printf("请输入电话:>");
//	scanf("%s", pc->data[pc->sz].tele);
//
//	pc->sz++;
//}
//扩容
void check_capacity(Contact* pc)
{assert(pc);if (pc->sz == pc->catacity){PeoInfo* ptr = (PeoInfo*)realloc(pc->data, (pc->catacity + INC_SZ) * sizeof(PeoInfo));if (ptr == NULL){perror("check_capacity::realloc");return;}pc->data = ptr;pc->catacity += INC_SZ;printf("扩容成功\n");}
}
void AddContact(Contact* pc)
{assert(pc);check_capacity(pc);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].addr);printf("请输入电话:>");scanf("%s", pc->data[pc->sz].tele);pc->sz++;
}//用名字来查找联系人
int FindByName(const Contact* pc, 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(Contact* pc)
{assert(pc);if (pc->sz == 0){printf("通讯录为空,无法删除\n");return;}char name[NAME_MAX];printf("请输入要删除的人的名字:>");scanf("%s", name);int ret = FindByName(pc, name);if (ret == -1){printf("要删除的人不存在\n");return;}int i = 0;for (i = ret; i < pc->sz - 1; i++){pc->data[i] = pc->data[i + 1];}pc->sz--;printf("删除成功\n");  
}void SearchContact(const Contact* pc)
{assert(pc);char name[NAME_MAX] = { 0 };printf("请输入要查找人的名字:>");scanf("%s", name);int pos = FindByName(pc, name);if (pos == -1){printf("要查找的人不存在\n");return;}printf("%-20s\t%-4s\t%-5s\t%-20s\t%-12s\n", "名字", "年龄", "性别", "地址", "电话");printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\n", pc->data[pos].name,pc->data[pos].age,pc->data[pos].sex,pc->data[pos].addr,pc->data[pos].tele);
}void ModifyContact(Contact* pc)
{assert(pc);char name[NAME_MAX] = { 0 };printf("请输入要修改人的名字:>");scanf("%s", name);int pos = FindByName(pc, name);if (pos == -1){printf("要修改的人不存在\n");return;}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].addr);printf("请输入电话:>");scanf("%s", pc->data[pos].tele);printf("修改完成\n");
}//qsort中使用的比较函数
int ComparByName(const char* p1, const char* p2)
{return strcmp(p1, p2);
}
void QsortContact(Contact* pc)
{assert(pc);qsort(pc->data, pc->sz, sizeof(PeoInfo), ComparByName);printf("排序完成\n");
}void ClearContact(Contact* pc)
{assert("pc");InitContact(pc);printf("通讯录已清空\n");
}void ShowContact(const Contact* pc)
{assert(pc);int i = 0;printf("%-20s\t%-4s\t%-5s\t%-20s\t%-12s\n", "名字", "年龄", "性别", "地址", "电话");for (i = 0; i < pc->sz; i++){printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\n", pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].addr,pc->data[i].tele);}
}void SaveContact(Contact* pc)
{assert(pc);FILE* pf = fopen("contact.txt", "wb");if (pf == NULL){perror("fopen");}else{int i = 0;for (i = 0; i < pc->sz; i++){fwrite(pc->data + i, sizeof(PeoInfo), 1, pf);}fclose(pf);pf = NULL;printf("保存成功\n");}}void LoadContact(Contact* pc)
{assert(pc);FILE* pf = fopen("contact.txt", "rb");if (pf == NULL){perror("LoadContact::fopen");}else{PeoInfo tmp = { 0 };int i = 0;while (fread(&tmp, sizeof(PeoInfo), 1, pf)){check_capacity(pc);pc->data[i] = tmp;pc->sz++;i++;}fclose(pf);pf = NULL;}
}

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("******  7. clear   0. exit    ******\n");printf("************************************\n");
}
//枚举操作,增加代码可读性
enum Option
{EXIT,ADD,DEL,SEARCH,MODIFY,SHOW,SORT,CLEAR
};
int main()
{int input = 0;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 SORT:QsortContact(&con);break;case CLEAR:ClearContact(&con);break;case EXIT:SaveContact(&con);DestroyContact(&con);printf("退出通讯录\n"); break;default:printf("选择错误,重新选择\n");break;}} while (input);return 0;
}
http://www.dtcms.com/a/570566.html

相关文章:

  • 【进阶版】基于Ollama和RAG,本地部署“懂业务”的大模型
  • SAP固定损耗数量或者固定用量,损耗率的方案
  • 建设部监理工程师网站有什么网站做微商
  • 做外贸网站要注意什么济南疾控最新发布
  • 【案例】UI 管理框架
  • 佛山网站建设外贸西安工商注册平台官网
  • 做网站编程要学什么中韩双语网站制作价格
  • 宁波专业的网站建设仕德伟做的网站
  • 商标设计网站猪八戒快速做效果图的网站叫什么
  • 推广网站哪家做的好文登区住房和城乡建设局网站
  • Oracle 数据库性能追踪与数据整合实践指南
  • 成都做网站公司一个完整的产品运营方案
  • 嘉兴做外贸网站的公司seo推广人员
  • 做网站需要知道哪些事情怎样做网络推广效果好视频
  • 建设网站程序忻州市中小企业局网站
  • 最长上升子序列(LIS)
  • 网站被禁止访问怎么打开小型的企业网站
  • Vue实现全局设置一个刷新按钮 只刷新当面路由页面 不跳转操作功能
  • 网站开发外包协议电子商务网站方案
  • 【IC】NoC设计入门 -- 验证
  • 如何在税局网站上做税种认定推广普通话手抄报简单漂亮
  • Swift 自动引用计数
  • Delta数据结构:深入剖析高效数据同步的奥秘
  • 网站制作教程视频湖北外贸网站建设价格
  • wordpress模板展示网站制作网线视频
  • 康巴什住房和城乡建设局网站网站域名建设
  • 多线程常见面试题清单
  • Java资源持续监控(依赖 jps)
  • 北海哪家公司做网站建设研发做校招的网站有哪些
  • 建设电影播放网站盐城网站建设渠道合作