通讯录功能主要包括以下几点:
1.能够实现增、添、查、改
2.实现通讯录满的时候能够自动扩大通讯录容量
3.每次进入通讯录人员信息还存在
主要分为三个部分test.c来进行测试 contact.c进行功能实现 contact.h进行函数声明
代码如下:
test.c
#include "contact.h" void menu() { printf ("**********************************n"); printf ("****1.增加联系人 2.删除联系人****n"); printf ("****3.查找联系人 4.修改联系人****n"); printf ("****5.展示联系人 6.保存联系人****n"); printf ("*********0.退出通讯录*************n"); printf ("**********************************n"); } int main () { int input=0; struct Contact con; //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 MOD: ModifyContact(&con); break; case SHOW: ShowContact(&con); break; case SAVE: SaveContact(&con); break; case EXIT: SaveContact(&con); Free(&con); printf ("退出通信录n"); break; default: printf("选择错误n"); } } while(input); return 0; }
contact.h
#define _CRT_SECURE_NO_WARNINGS #include#include #include #include #define CAPACITY 3 //暂定容量为3 加人自动扩大容量 #define MAX_NAME 20 #define MAX_SEX 5 #define MAX_TALA 12 #define MAX_ADDR 30 enum Option //枚举常量默认从0开始 { EXIT, ADD, DEL, SEARCH, MOD, SHOW, SAVE }; struct PeopleInformation //通讯录信息 { char name [MAX_NAME]; int age; char sex[MAX_SEX]; char tale[MAX_TALA]; char addr[MAX_ADDR]; }; struct Contact //通讯录包括基本信息 元素大小 容量 { struct PeopleInformation *date; int size; int capacity; }; void InitContact(struct Contact* ps); //初始化通讯录 void AddContact(struct Contact* ps); //增添联系人 void ShowContact(const struct Contact* ps);//展示通讯录 void DelContact(struct Contact* ps);//删除联系人 void SearchContact(const struct Contact* ps);//查找联系人 void ModifyContact(struct Contact* ps);//修改联系人 void Free(struct Contact* ps);//释放动态开辟空间 void SaveContact(struct Contact* ps);//保存联系人 void LocadFile(struct Contact* ps);//加载联系人
contact.c
#include "contact.h" //实现加载信息到通讯录 void CheckCapacity(struct Contact* ps); //这里声明检查容量并扩容的函数 因为加载信息到通讯录需要用到 void LocadFile(struct Contact* ps) { struct PeopleInformation tmp={0}; FILE* pfRead=fopen("contact.date","rb"); if (pfRead==NULL) { printf("%sn",strerror(errno)); return ; } //将文件存在通讯录中 while(fread(&tmp,sizeof(struct PeopleInformation),1,pfRead)) //一次录入一个人员 { CheckCapacity(ps); ps->date[ps->size]=tmp; ps->size++; } fclose(pfRead); pfRead=NULL; } //实现初始化通讯录 void InitContact(struct Contact* ps) { ps->date=(struct PeopleInformation*)malloc(CAPACITY*sizeof (struct PeopleInformation)); //为通讯录date开辟空间 if (ps->date==NULL) //判断date是否为空指针 { return ; } ps->size=0; //刚开始没有联系人 置0 ps->capacity=CAPACITY; //将原始容量设置为CAPACITY=3 宏定义便于修改 LocadFile(ps); //避免每次退出后再进通讯录人员消失 } //检查容量 不够则增 void CheckCapacity(struct Contact* ps) { if (ps->size==ps->capacity) //元素个数等于容量则说明通讯录已满 需扩容 { //防扩容失败 将date这块空间先交给ptr这个指针 struct PeopleInformation* ptr=realloc(ps->date,(ps->capacity+2)*sizeof(struct PeopleInformation)); if (ptr!=NULL) { ps->date=ptr; ps->capacity+=2; //一次扩两个人 printf("扩容成功n"); } else { printf("扩容失败n"); } } } //实现增加联系人 void AddContact(struct Contact* ps) { CheckCapacity(ps); printf("请输入名字:》"); scanf("%s",ps->date[ps->size].name); printf("请输入性别:》"); scanf("%s",ps->date[ps->size].sex); printf("请输入年龄:》"); scanf("%d",&(ps->date[ps->size].age)); printf("请输入地址:》"); scanf("%s",ps->date[ps->size].addr); printf("请输入电话:》"); scanf("%s",ps->date[ps->size].tale); ps->size++; //录入一个size++ 表明元素多一个人 printf("录入成功n"); } //实现展示通讯录 void ShowContact(const struct Contact* ps) { if (ps->size==0) //元素为0 说明通讯录无人 { printf("通讯录为空n"); } else { int i=0; printf("%-2st%-5st%-4st%-20st%-12sn","名字","性别","年龄","地址","电话"); //-代表左对齐 for (i=0;isize;i++) { printf("%-2st%-5st%-4dt%-20st%-12sn",ps->date[i].name, //访问成员 ps->date[i].sex, ps->date[i].age, ps->date[i].addr, ps->date[i].tale); } } } //实现查找联系人 此接口不对外开放 用static静态变量修饰 static int FindPeople(const struct Contact* ps,char name[MAX_NAME]) { int i=0; for (i=0;i size;i++) { if(0==strcmp(ps->date[i].name,name)) //比较两个名字是否一样 一样strcmp函数自动返回0 { return i; //查找到返回下标 } } return -1; //找不到 } //实现删除联系人 void DelContact(struct Contact* ps) { int pos=0; //将被删除人的下标位置初始化 char name[MAX_NAME]; printf("请输入被删除者的名字n"); scanf("%s",name); pos=FindPeople(ps,name); //删除人之前 先查找人员是否存在 调用查找函数 if (pos==-1) //break跳出有两种情况:1.元素找完了还没找到即i=size;2.找到跳出来了 应执行删除 { printf("找不到要删除的人n"); } else { int j=0; for (j=pos;j size-1;j++) { ps->date[j]=ps->date[j+1]; //若扎到则实现删除 删除方法为将要被删除元素后边元素往前移动覆盖 } ps->size--; //删除一个size要自减 printf("删除成功n"); } } //实现查找联系人 void SearchContact(const struct Contact* ps) { int pos=0; char name[MAX_NAME]; printf("请输入要查找的人名:》"); scanf("%s",name); pos=FindPeople(ps,name); //直接调用上述查找函数 if (pos==-1) { printf("找不到n"); } else { printf("%-2st%-5st%-4st%-20st%-12sn","名字","性别","年龄","地址","电话"); printf("%-2st%-5st%-4dt%-20st%-12sn",ps->date[pos].name, ps->date[pos].sex, ps->date[pos].age, ps->date[pos].addr, ps->date[pos].tale); } } //实现修改联系人 void ModifyContact(struct Contact* ps) { int pos=0; char name[MAX_NAME]; printf("请输入要修改的人名:》"); scanf("%s",name); pos=FindPeople(ps,name); if (pos==-1) { printf("找不到n"); } else { printf("请输入名字:》"); scanf("%s",ps->date[pos].name); printf("请输入性别:》"); scanf("%s",ps->date[pos].sex); printf("请输入年龄:》"); scanf("%d",&(ps->date[pos].age)); printf("请输入地址:》"); scanf("%s",ps->date[pos].addr); printf("请输入电话:》"); scanf("%s",ps->date[pos].tale); printf("修改完成n"); } } //释放动态开辟内存函数开辟的空间 void Free(struct Contact* ps) { free(ps->date); ps->date=NULL; } //保存通讯录成为一个文件 void SaveContact(struct Contact* ps) { int i=0; FILE* pfWrite=fopen("contact.date","wb"); if (pfWrite==NULL) { printf("%sn",strerror(errno)); return ; } //写通讯录数据到文件中 for (i=0;i size;i++) { fwrite(&(ps->date[i]),sizeof(struct PeopleInformation),1,pfWrite); } fclose(pfWrite); pfWrite=NULL; }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)