该代码能实现一个通讯录基本的功能,并不是标准的代码,请读者自知!
该通讯录代码的书写要分三个部分进行:
1,tect.c -->相关函数的调用
2,contact.c -->相关函数的定义
3,contact.h -->存放通讯录相关函数的声明
第一部分
头文件——"contact.h"内包含的内容有:
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <assert.h>
#include <stdlib.h >
#define NAME_MAX 20
#define SEX_MAX 5
#define NUMBER_MAX 12
#define ADDER_MAX 30
#define N 3
#define SH 4
typedef struct Peo
{
char name [NAME_MAX];//名字
int age ; //年龄
char sex[SEX_MAX]; //性别
char number[NUMBER_MAX]; //号码
char adder[ADDER_MAX]; //住址
}Peo;
typedef struct Contact
{
Peo * date;
int count;
int catacipy;
}Con;
//初始化通讯录
void Contact_INIT(Con *con);
//通讯录信息增加
void Contact_add (Con*con);
//通讯录信息删除
void Contact_del (Con *con);
//查找信息函数
int C_Z(Con*con);
//通讯录信息查找
void Contact_serh(Con* con);
//通讯录信息修改
void Contact_mof(Con* con);
//通讯录信息展示
void Contact_show(Con*con);
//通讯录信息分类
void Contact_sort(Con*con);
//销毁通讯录空间
void Desty_Con(Con* con);
//以二进制的形式存入数据
void Fwrite(con*con);
//以二进制的形式读入数据
void Fread(Con *con);
第二部分
contact.c 中包含的代码内容有:
#include "contact.h"
static int Pan_Man(Con* con)
{
assert(con);
if(con—>count == con—>catacipy)
{
Peo* ptr =( Peo*)realloc(con—>date, ( N+SH)*sizeof(Peo))
if(ptr == NULL)
{
printf("%s\n",strerror(errno));
return -1 ;
}
else
{
con—>date = ptr ;
ptr = NULL ;
con—>catacipy +=SH ;
printf("增容成功\n");
}
}
return 1 ;
}
int C_Z(Con*con)
{
assert(con);
char name1[NAME_MAX] ={0} ;
int i = 0 ;
for(i=0;i<(con—>count);i++)
{
if( strcmp(con—>date[i].name1,name)
== 0)
{
return i ;
}
}
return -1 ;
}
void Contact_INIT(Con*con)
{
assert(con);
con—>count = 0 ;
con—>date =(Peo*)malloc(N*sizeof(Peo));
if(con—>date == NULL)
{
printf("%s\n",strerror(errno));
return ;
}
con—>catacipy = N ;
Fread(con);
}
void Contact_add(Con*con)
{
assert(con);
int b = Pan_Man(con);
if(b == 1)
{
//输入人的信息
printf("请输入姓名:>");
scanf("%s",
con—>date[con—>count].name);
printf("请输入年龄:>");
scanf("%d",
&(con—>date[con—>count].age));
printf("请输入性别:>");
scanf("%s",
con—>date[con—>conut].sex);
printf("请输入号码:>");
scanf("%s",
con—>date[con—>count].number);
printf("请输入地址:>");
scanf("%s",
con—>date[con—>count].adder);
con—>count++;
printf("增加成功\n");
}
else
{
printf("增加失败!\n");
}
}
void Contact_del (Con *con)
{
assert(con);
if(con—>count == 0)
{
printf("通讯录为空,无数据删除\n");
return ;
}
printf("请输入要删除人的姓名:>");
int i = C_Z(con);
if(i == 1)
{
int j =0 ;
for(j=i;j<(con—>count)-1;j++)
{
con—>date[j] = con—>date[j+1];
}
printf("删除成功\n");
}
else
{
printf("删除失败,通讯录中无此人信
息\n");
}
}
void Contact_serh(Con * con)
{
assert(con);
printf("请输入查找人名字信息:>");
int i =C_Z(con);
if(i==0)
{
printf("通讯录中无此人信息\n");
}
else
{
printf("查找成功,信息如下:>\n");
printf("%-20s %-5s %-6s %-12s
%-30s","姓名","年龄","性别",
"电话","住址");
printf("%-20s %-5d %-6s %-12s
%-30s\n",con—>date[i].name,
con—>date[i].age,
con—>date[i].sex,
con—>date[i].number,
con—>date[i].adder);
}
}
void Contact_mof(Con* con)
{
assert(con);
int i = C_Z(con);
if(i != -1)
{
printf("请输入要修改姓名:>");
scanf("%s", con—>date[i].name);
printf("请输入要修改年龄:>");
scanf("%d", &(con—>date[i].age));
printf("请输入要修改性别:>");
scanf("%s", con—>date[i].sex);
printf("请输入要修改号码:>");
scanf("%s", con—>date[i].number);
printf("请输入要修改地址:>");
scanf("%s", con—>date[i].adder);
printf("信息修改完成\n");
}
else
{
printf("无相应的信息供修改\n");
}
}
void Contact_show(Con*con)
{
assert(con);
printf("%-20s %-5s %-6s %-12s
%-30s","姓名","年龄","性别",
"电话","住址");
int i = 0 ;
for (i= 0;i<con—>count;i++)
{
printf("%-20s %-5d %-6s %-12s
%-30s\n",con—>date[i].name,
con—>date[i].age,
con—>date[i].sex,
con—>date[i].number,
con—>date[i].adder);
}
}
int camp(const void *st1,const void * st2)
{
assert(st1&&st2);
return strcmp ( ((Peo*)st1—>name),
((Peo*)st2—>name) ) ;
}
void Contact_sort(Con*con)
{
assert(con);
//按名字大小来分类
qsort(con—>date, con—>count,
sizeof(Peo),camp);
printf("分类成功\n");
}
void Desty_Con(Con* con)
{
assert(con);
free(con—>date);
con—>date = NULL;
}
void Fread(Con *con)
{
assert(con);
FILE*ptr=fopen("test.xy","rb");
if(ptr==NULL)
{
perror("fopen");
return ;
}
int i = 0 ;
Peo tmp={0};
while((i=fread(&tmp,sizeof(Peo),1,ptr))
==1)
{
int j =0 ;
if( (j=Pan_Man(con)) == 1)
{
con—>date[con—>count]= tmp;
con—>count++;
}
}
fclose(ptr);
ptr=NULL;
}
void Fwrite(con*con)
{
assert(con);
FILE*ptr=fopen("test.xy","wb");
if(ptr==NULL)
{
perror("fopen");
return ;
}
int i= 0 ;
for(i= 0;i<con—>count,i++)
{
fwrite(con—>date+i,sizeof(Peo),1,
ptr);
}
fclose(ptr);
ptr=NULL;
}
第三部分
tect.c 中包含的代码内容有:
#include "contact.h"
void menu()
{
//增、删、查、改、显示、分类、离开//
printf("XXXXXXXXXXXXXXXXXXX\n"); printf("XXXXX 1, add XXXXXXXX\n"); printf("XXXXX 2, del XXXXXXXX\n"); printf("XXXXX 3, serh XXXXXXXX\n");
printf("XXXXX 4, mof XXXXXXXX\n"); printf("XXXXX 5, show XXXXXXXX\n");
printf("XXXXX 6, sort XXXXXXXX\n"); printf("XXXXX 0, exit XXXXXXXX\n");
printf("XXXXXXXXXXXXXXXXXXX\n");
}
int main()
{
int input = 0 ;
Con con;
Contact_INIT(&con);
do
{
menu();
printf("请输入数字:>");
scanf("%d",&input);
switch(input)
{
case 1:
Contact_add(&con);
break;
case 2 :
Contact_del(&con);
break;
case 3:
Contact_serh(&con);
break;
case 4 :
Contact_mof(&con);
break;
case 5:
Contact_show(&con);
break;
case 6 :
Contact_sort(&con);
break;
case 0 :
Fwrite(&con);
Desty_Con(&con);
printf("离开通讯录\n");
break;
default :
printf("请重新输入数字\n");
break;
}
}while(input);
return 0 ;
}
注:所有字母都是小写;
调用函数时,要提前进行函数声明;
在运用该程序时,"tect.xy"文件要有并且在"contact.c"文件目录下,否则输入的信息无法进行保存,这样就达不到通讯录具有的保存性。
本代码难免会有些小瑕疵,
望各位博友批评指正!!