通讯录
项目要求:
1,实现一个通讯录,可以存储一个人的名字,性别,年龄,电话,地址。
2,可以实现对现有通讯录已有联系人的增删查改。
3,可以定义已有联系人按照年龄排序,可以实现联系人的清空。
4,可以动态开辟内存,储存来联系人的信息。
5,可以实现联系人信息的动态加载。
contact.h
#ifndef _CONTACT_H_
#define _CONTACT_H_
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define name_max 20
#define sex_max 5
#define tele_max 12
#define addr_max 30
#define default_sz 3
typedef struct peo_info
{
char name[name_max];
int age;
char sex[sex_max];
char tele[tele_max];
char addr[addr_max];
}peo_info;
typedef struct contact
{
peo_info* data;//存放数据
int sz;//当前已有信息个数
int capacity;//当前最大容量
}contact,*pcontact;
void init_contact(pcontact pc);//初始化通讯录
void add_contact(pcontact pc);//增加通讯录成员
void show_contact(pcontact pc);//显示当前通讯录已有成员
void del_contact(pcontact pc);//删除通讯录指定成员
void search_contact(pcontact pc);//查找通讯录指定成员
void modify_contact(pcontact pc);//修改通讯录指定成员
void sort_contact(pcontact pc);//按照年龄对当前通讯录成员分类
void empty_contact(pcontact pc);//清空通讯录所有成员
void destroy_contact(pcontact pc);//销毁通讯录
void save_contact(pcontact pc);//保存通讯录
void load_contact(pcontact pc);//加载信息
#endif //_CONTACT_H_
test.c
#include "contact.h"
void menu()
{
printf("***** contact *********\n");
printf("****1.add 2.del******\n");
printf("****3.search 4.modify***\n");
printf("****5.show 6.sort*****\n");
printf("****7.empty 0.exit*****\n");
printf("*************************\n");
}
enum option
{
EXIT,
add,
del,
search,
modify,
show,
sort,
empty
};
void test()
{
int input = 0;
contact con;
init_contact(&con);
do
{
menu();
printf("请选择:>");
scanf("%d",&input);
switch(input)
{
case add:
add_contact(&con);
break;
case del:
del_contact(&con);
break;
case search:
search_contact(&con);
break;
case modify:
modify_contact(&con);
break;
case show:
show_contact(&con);
break;
case sort:
sort_contact(&con);
break;
case empty:
empty_contact(&con);
break;
case EXIT:
printf("推出通讯录\n");
save_contact(&con);
destroy_contact(&con);
break;
default:
printf("选择错误\n");
break;
}
}while(input);
}
int main()
{
test();
return 0;
}
contact.c
#include "contact.h"
void load_contact(pcontact pc)
{
peo_info tmp = {0};
FILE* pf = fopen("contact.dat","rb");
{
if(pf == NULL)
{
perror("open file for read");
exit(EXIT_FAILURE);
}
//读信息,加载内存
while(fread(&tmp, sizeof(peo_info), 1, pf))
{
//动态开辟内存,加载联系人信息
if(pc->sz == pc->capacity)
{
peo_info *tmp = realloc(pc->data, (pc->capacity+2)*sizeof(peo_info));
if(tmp != NULL)
{
pc->data = tmp;
pc->capacity += 2;
}
else
{
return;
}
}
pc->data[pc->sz] = tmp;
pc->sz++;
}
fclose(pf);
pf = NULL;
}
}
void init_contact(pcontact pc)
{
pc->sz = 0;
pc->data = (peo_info*)malloc(default_sz*sizeof(peo_info));
pc->capacity = default_sz;
load_contact(pc);//加载文件信息
}
void add_contact(pcontact pc)
{
if(pc->sz == pc->capacity)
{
peo_info *tmp = realloc(pc->data, (pc->capacity+2)*sizeof(peo_info));
if(tmp != NULL)
{
pc->data = tmp;
pc->capacity += 2;
}
else
{
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].tele);
printf("请输入地址:>");
scanf("%s",pc->data[pc->sz].addr);
pc->sz++;
}
void show_contact(pcontact pc)
{
int i = 0;
printf("%10s\t%4s\t%5s\t%12s\t%20s\n","name","age","sex","tele","addr");
for(i=0; i<pc->sz; i++)
{
printf("%10s\t%4d\t%5s\t%12s\t%20s\n",
pc->data[i].name,
pc->data[i].age,
pc->data[i].sex,
pc->data[i].tele,
pc->data[i].addr);
}
}
static int find_entry(pcontact 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 del_contact(pcontact pc)
{
int j = 0;
int pos = 0;
char name[name_max] = {0};
if(pc->sz == 0)
{
printf("通讯录已空,无法删除\n");
return;
}
//查找
printf("请输入要删除人的名字\n");
scanf("%s",name);
pos = find_entry(pc,name);
//删除
if(pos != -1)
{
for(j=pos;j<pc->sz-1;j++)
{
pc->data[j] = pc->data[j+1];
}
pc->sz--;
printf("删除成功\n");
}
else
{
printf("要删除的人没找到\n");
}
}
void search_contact(pcontact pc)
{
int pos = 0;
char name[name_max] = {0};
printf("请输入要查找人的名字:>");
scanf("%s",name);
pos = find_entry(pc,name);
if(pos == -1)
{
printf("要查找的人不存在\n");
}
else
{
printf("%10s\t%4s\t%5s\t%12s\t%20s\n","name","age","sex","tele","addr");
printf("%10s\t%4d\t%5s\t%12s\t%20s\n",
pc->data[pos].name,
pc->data[pos].age,
pc->data[pos].sex,
pc->data[pos].tele,
pc->data[pos].addr);
}
}
void modify_contact(pcontact pc)
{
int pos = 0;
char name[name_max] = {0};
printf("请输入要修改人的名字:>");
scanf("%s",name);
pos = find_entry(pc,name);
if(pos == -1)
{
printf("要修改的人不存在\n");
}
else
{
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].tele);
printf("请输入地址:>");
scanf("%s",pc->data[pos].addr);
}
}
void sort_contact(pcontact pc)
{
int i = 0;
int j = 0;
printf("该通讯录是按照年龄排序的\n");
for(i=0; i<pc->sz-1; i++)
{
int flag = 0;
for(j=0; j<pc->sz-1-i; j++)
{
if(pc->data[j].age > pc->data[j+1].age)
{
peo_info tmp = pc->data[j];
pc->data[j] = pc->data[j+1];
pc->data[j+1] = tmp;
flag = 1;
}
}
if(flag == 0)
break;
}
}
void empty_contact(pcontact pc)
{
pc->sz = 0;
printf("通讯录已清空\n");
}
void destroy_contact(pcontact pc)
{
free(pc->data);
pc->data = NULL;
pc->capacity = 0;
pc->sz = 0;
}
void save_contact(pcontact pc)
{
int i = 0;
FILE* pf = fopen("contact.dat", "wb");
if(pf ==NULL)
{
perror("open file for write");
exit(EXIT_FAILURE);
}
//写文件
for(i=0; i<pc->sz; i++)
{
fwrite(pc->data+i, sizeof(peo_info), 1, pf);
}
fclose(pf);
pf = NULL;
}