通讯录最终版——动态存储+文件处理
创始人
2024-05-12 05:35:13
0

最终版通讯录即从上一个版本修改过来

先看总体代码,我们再看看差异

ps:里面涉及到很多函数的使用,后续我会出专栏来书写这些函数的使用和实例,与常见错误

大家可以通过https://cplusplus.com查找

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.alter       *****\n");printf("*****    5.show     6.empty       *****\n");printf("*****    7.sort     0.exit        *****\n");printf("***************************************\n");}enum Function
{EXIT,ADD,DEL,SEARCH,ALTER,SHOW,EMPTY,SORT
};int main()
{int input = 0;//创建结构体Contact con;//初始化IntiContact(&con);//加载通讯录LoadContact(&con);do{menu();scanf("%d", &input);switch (input){case ADD : AddContact(&con);break;case DEL : DelContact(&con);break;case SEARCH: SearchContact(&con);break;case ALTER: AlterContact(&con);break;case SHOW: ShowContact(&con);break;case EMPTY: EmptyContact(&con);break;case SORT: qsort(con.data, con.sz, sizeof(PeoInfo), Contact_sort_name);printf("排序成功\n");break;case EXIT: SaveContact(&con);DestroyContact(&con);printf("退出通讯录\n");break;default: printf("输入错误请重新输入\n");break;}} while (input);return 0;
}

Contact.c

#define _CRT_SECURE_NO_WARNINGS 1#define _CRT_SECURE_NO_WARNINGS 1#include "Contact.h"//静态版本
//void IntiContact(Contact* pc)//初始化电话簿
//{
//    pc->sz = 0;
//    memset(pc->data, 0, sizeof(pc->data));
//}//动态版本
void IntiContact(Contact* pc)//初始化电话簿
{pc->sz = 0;PeoInfo* ptr = (PeoInfo*)calloc(Capatify_Inti, sizeof(PeoInfo));if (ptr == NULL){perror("IntiContact::calloc");return;}pc->data = ptr;pc->capatify = Capatify_Inti;}//静态版本
//void AddContact(Contact* pc)//增加联系人
//{
//    if (pc->sz == num)
//    {
//        printf("通讯录已经满了\n");
//        return;
//    }
//
//    printf("请输入姓名\n");
//    scanf("%s", pc->data[pc->sz].name);
//
//    printf("请输入性别\n");
//    scanf("%s", pc->data[pc->sz].sex);
//
//    printf("请输入年龄\n");
//    scanf("%d", &(pc->data[pc->sz].age));
//
//    printf("请输入电话\n");
//    scanf("%s", pc->data[pc->sz].tel);
//
//    printf("请输入地址\n");
//    scanf("%s", pc->data[pc->sz].address);
//
//    pc->sz++;
//
//}void check_capatify(Contact* pc)
{if (pc->sz == pc->capatify){PeoInfo* ptr = (PeoInfo*)realloc(pc->data, (pc->capatify + Capatify_ADD) * sizeof(PeoInfo));if (ptr == NULL){perror("check_capatify::realloc");return;}pc->data = ptr;pc->capatify += Capatify_ADD;printf("增容成功\n");}
}void DestroyContact(Contact* pc)
{free(pc->data);pc->data = NULL;pc->capatify = 0;pc->sz = 0;pc = NULL;
}void AddContact(Contact* pc)//增加联系人
{check_capatify(pc);printf("请输入姓名\n");scanf("%s", pc->data[pc->sz].name);printf("请输入性别\n");scanf("%s", pc->data[pc->sz].sex);printf("请输入年龄\n");scanf("%d", &(pc->data[pc->sz].age));printf("请输入电话\n");scanf("%s", pc->data[pc->sz].tel);printf("请输入地址\n");scanf("%s", pc->data[pc->sz].address);pc->sz++;}void ShowContact(Contact* pc)//展示电话簿
{int i = 0;printf("%-20s\t%-5s\t%-3s\t%-12s\t%-20s\n", "姓名", "性别", "年龄", "电话", "地址");for (i = 0; i < pc->sz; i++){printf("%-20s\t%-5s\t%-3d\t%-12s\t%-20s\n",pc->data[i].name,pc->data[i].sex,pc->data[i].age,pc->data[i].tel,pc->data[i].address);}
}int FindName(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)//删除联系人
{if (pc->sz == 0){printf("通讯录没有联系人,无法删除\n");return;}char name[20];printf("请输入要删除的名字\n");scanf("%s", name);int ret = FindName(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(Contact* pc)//搜索联系人
{char name[20];printf("请输入要查找的联系人\n");scanf("%s", name);int ret = FindName(pc, name);if (ret == -1){printf("没有该联系人\n");return;}printf("%-20s\t%-5s\t%-3s\t%-12s\t%-20s\n", "姓名", "性别", "年龄", "电话", "地址");printf("%-20s\t%-5s\t%-3d\t%-12s\t%-20s\n",pc->data[ret].name,pc->data[ret].sex,pc->data[ret].age,pc->data[ret].tel,pc->data[ret].address);
}void AlterContact(Contact* pc)
{printf("请输入要修改人的名字\n");char name[20];scanf("%s", name);int ret = FindName(pc, name);if (ret == -1){printf("电话簿没有此人\n");return;}printf("请输入新姓名\n");scanf("%s", pc->data[ret].name);printf("请输入新性别\n");scanf("%s", pc->data[ret].sex);printf("请输入新年龄\n");scanf("%d", &(pc->data[ret].age));printf("请输入新电话\n");scanf("%s", pc->data[ret].tel);printf("请输入新地址\n");scanf("%s", pc->data[ret].address);printf("修改成功\n");}void EmptyContact(Contact* pc)//清空电话簿
{pc->sz = 0;memset(pc->data, 0, sizeof(pc->data));printf("清空电话簿成功\n");
}int Contact_sort_name(void* e1, void* e2)
{return strcmp((Contact*)e1, (Contact*)e2);
}void SaveContact(Contact* pc)
{FILE* pf = fopen("Contact.txt", "wb");if (NULL == pf){perror("SaveContact::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)
{FILE* pf = fopen("Contact.txt", "rb");if (NULL == pf){perror("LoadContact::fopen");}else{int i = 0;while (fread(pc->data+i, sizeof(PeoInfo), 1, pf)){check_capatify(pc);i++;pc->sz++;}fclose(pf);pf = NULL;}
}

Contact.h

#pragma once#pragma once#include 
#include 
#include #define num 1000
#define num_name 20
#define num_sex 5
#define num_tel 20
#define num_address 30
#define Capatify_Inti 3
#define Capatify_ADD 2typedef struct PeoInfo
{char name[num_name];char sex[num_sex];int age;char tel[num_tel];char address[num_address];
}PeoInfo;//静态版本
//typedef struct Contact
//{
//    PeoInfo data[num];//联系人数量
//    int sz;//存有联系人数量
//}Contact;//动态版本
typedef struct Contact
{PeoInfo* data;//联系人数量int sz;//存有联系人数量int capatify;//容量
}Contact;void IntiContact(Contact* pc);//初始化void DestroyContact(Contact* pc);//销毁通讯录void AddContact(Contact* pc);//增加联系人void ShowContact(Contact* pc);//展示电话簿void DelContact(Contact* pc);//删除联系人void SearchContact(Contact* pc);//搜索联系人void EmptyContact(Contact* pc);//清空电话簿int Contact_sort_name(void* e1, void* e2);//qsortvoid SaveContact(Contact* pc);//保存通讯录void LoadContact(Contact* pc);//加载通讯录

我们添加了,枚举

枚举我们使用的枚举的常量,使用枚举,我们可以清楚的知道,case 之后数字的功能

动态的通讯录,我们是随着通讯录联系人数量的增加,然后使用calloc函数开辟空间,这样可以减少空间的浪费

我们初始化时给定联系人限定值,然后增加联系人前,判断达到了限定值,然后重新开辟空间使用reaccol

开辟好了内存空间,下面就到了增加联系人

//静态版本
//void AddContact(Contact* pc)//增加联系人
//{
//    if (pc->sz == num)
//    {
//        printf("通讯录已经满了\n");
//        return;
//    }
//
//    printf("请输入姓名\n");
//    scanf("%s", pc->data[pc->sz].name);
//
//    printf("请输入性别\n");
//    scanf("%s", pc->data[pc->sz].sex);
//
//    printf("请输入年龄\n");
//    scanf("%d", &(pc->data[pc->sz].age));
//
//    printf("请输入电话\n");
//    scanf("%s", pc->data[pc->sz].tel);
//
//    printf("请输入地址\n");
//    scanf("%s", pc->data[pc->sz].address);
//
//    pc->sz++;
//
//}void check_capatify(Contact* pc)
{if (pc->sz == pc->capatify){PeoInfo* ptr = (PeoInfo*)realloc(pc->data, (pc->capatify + Capatify_ADD) * sizeof(PeoInfo));if (ptr == NULL){perror("check_capatify::realloc");return;}pc->data = ptr;pc->capatify += Capatify_ADD;printf("增容成功\n");}
}void AddContact(Contact* pc)//增加联系人
{check_capatify(pc);printf("请输入姓名\n");scanf("%s", pc->data[pc->sz].name);printf("请输入性别\n");scanf("%s", pc->data[pc->sz].sex);printf("请输入年龄\n");scanf("%d", &(pc->data[pc->sz].age));printf("请输入电话\n");scanf("%s", pc->data[pc->sz].tel);printf("请输入地址\n");scanf("%s", pc->data[pc->sz].address);pc->sz++;}

静态版本我们限定了数量

动态版本我们增加联系人前,需要检查我们通讯录联系人数量和通讯录容量大小,看看还能放下联系人吗,如果不能放下,联系人数量=通讯录容量,我们就使用realloc增加空间,然后改变容量,这样我们才能放下增加的联系人

void SaveContact(Contact* pc)
{FILE* pf = fopen("Contact.txt", "wb");if (NULL == pf){perror("SaveContact::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)
{FILE* pf = fopen("Contact.txt", "rb");if (NULL == pf){perror("LoadContact::fopen");}else{int i = 0;while (fread(pc->data+i, sizeof(PeoInfo), 1, pf)){check_capatify(pc);i++;pc->sz++;}fclose(pf);pf = NULL;}
}

相关内容

热门资讯

致新生的欢迎词 致新生的欢迎词亲爱的新同学:你们好!秋风送爽,丹桂飘香,又是一个流金岁月,又是一个收获季节。踏着习习...
追悼会家属答谢词 追悼会家属答谢词尊敬的各位领导,各位亲朋好友,感谢各位今天出席亡母的追悼会。在母亲生病住院期间,承蒙...
重阳节活动主持词开场白 重阳节活动主持词开场白  在这金秋送爽,硕果累累的时节,我们迎来了又一个九九重阳节。下面是小编精心为...
郭德纲相声小段子台词 郭德纲相声小段子台词  相声,一种民间说唱曲艺。它以说,学,逗,唱为形式,突出其特点。下面是小编整理...
《将夜》经典台词 《将夜》经典台词  1.这片海洋,当时这里还有日出,在阳光的照射下,这片海洋是透明的',看上去就像是...
晚会主持词 【实用】晚会主持词(精选17篇)  主持词是主持人在节目进行过程中用于串联节目的串联词。在如今这个时...
春节晚会主持词 给力春节晚会主持词(通用3篇)  主持词的写作需要将主题贯穿于所有节目之中。在现今人们越来越重视活动...
婚礼上领导致辞 婚礼上领导致辞(通用7篇)  在日复一日的学习、工作或生活中,大家都经常接触到致辞吧,致辞要求风格的...
晚会结束语 晚会结束语(通用13篇)  闭幕词是一些大型会议结束时由有关领导人或德高望重者向会议所作的讲话。具有...
介绍毕业典礼舞蹈追梦的主持词 介绍毕业典礼舞蹈追梦的主持词(精选6篇)  主持词要把握好吸引观众、导入主题、创设情境等环节以吸引观...
员工誓师大会主持词 员工誓师大会主持词  誓师大会,又名 造势大会,两者皆可以称为“誓师会”,“造势会”,不过如此公共关...
教职工运动会入场式解说词 教职工运动会入场式解说词  在快速变化和不断变革的今天,我们可以使用解说词的机会越来越多,解说词让观...
央视春晚小品的经典台词 央视春晚小品的经典台词  小品《快乐老爸》  为了狗大点事,你还要得学门外语呀?  他是用泪水洗刷自...
《遇见王沥川》的经典台词 《遇见王沥川》的经典台词  1、爱情是干渴的,除非你遇上一个像沥川那样的.男人。  2、爱情是进行时...
回门宴主持词开场白   回门宴主持词开场白  亲爱的各位来宾,各位亲朋好友,先生们,女士们大家上午好! 玉兔奔月去,祥龙...
培训会议结束语 培训会议结束语(精选5篇)  总结是对某一阶段的工作、学习或思想中的经验或情况进行分析研究的书面材料...
新年联欢晚会开场白主持词   2位主持人同时出场  谢:尊敬的各位来宾  陈:亲爱的朋友们  合:新年好!  谢:时间如流水,...
结婚拜天地主持词 结婚拜天地主持词(精选8篇)  主持词要把握好吸引观众、导入主题、创设情境等环节以吸引观众。在各种集...
主持人主持词 主持人主持词范本6篇  主持词是各种演出活动和集会中主持人串联节目的串联词。时代不断在进步,司仪等是...
春节团拜会主持词 春节团拜会主持词  主持词的写作要突出活动的主旨并贯穿始终。在一步步向前发展的社会中,主持人参与的事...