
通讯录功能主要包括以下几点:
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;isize;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;jsize-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;isize;i++)
{
fwrite(&(ps->date[i]),sizeof(struct PeopleInformation),1,pfWrite);
}
fclose(pfWrite);
pfWrite=NULL;
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)