/*通讯录管理*/
 #include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define M 50//记录最大值
int	Menu_select(); 
typedef struct ElemType{
	char name[20];
	char tel[15];
	char email[20];
	char ad[15];
}ElemType;
/*录入初始记录*/
int Init(ElemType t[]){
	int i,n;
	printf("\n请输入要输入的记录数:\n");
	scanf("%d",&n);
	printf("开始输入记录:\n");
	for(i=0;i<n;i++){
		printf("第%d条记录的姓名:",i+1);
		scanf("%s",t[i].name);
		printf("第%d条记录的电话:",i+1);
		scanf("%s",t[i].tel);
		printf("第%d条记录的E—mail:",i+1);
		scanf("%s",t[i].email);
		printf("第%d条记录的地址:",i+1);
		scanf("%s",t[i].ad);
	}
	return n;
}
/*显示所有记录*/
void List(ElemType t[],int n){
	int i;
	system("cls");
	printf("姓名   电话号码    E—mail      地址\n");
	printf("************\n");
	for(i=0;i<n;i++){
		printf("%-10s %-15s",t[i].name,t[i].tel);
		printf("%-20s %-15s\n",t[i].email,t[i].ad);
		if((i+1)%20==0){//每屏显示20条记录
			printf("press any key continue...");
			fflush(stdin);
			getchar();
		}
	}
	printf("***********\n");
}
/*按姓名查找记录*/
void SearchOnName(ElemType t[],int n){
	char s[20];
	int i,flag=0;
	printf("请输入要查找的姓名:\n");
	scanf("%s",s);
	for(i=0;i<n;i++){
		if(strcmp(s,t[i].name)==0){
			flag=1;
			printf("此人的信息如下:\n");
			printf("姓名    电话号码    E—mail   地址\n");
             printf("***********\n");
			 printf("%-10s %-15s",t[i].name,t[i].tel);
		      printf("%-20s %-15s\n",t[i].email,t[i].ad);
		}
	}
	if(flag==0)printf("查无此人!\n");
}
/*按电话号码查找记录*/
void SearchOnTel(ElemType t[],int n){
	char s[15];int i,flag=0;
	printf("请输入要查找的电话号码:\n");
	
scanf("%s",s);
for(i=0;i<n;i++){
	if(strcmp(s,t[i].tel)==0){
		flag=1;
		printf("与该电话号码相关的信息如下:\n");
		printf("姓名   电话号码    E—mail  地址 \n");
		printf("%-10s %-15s",t[i].name,t[i].tel);
		printf("%-20s %-15s\n",t[i].email,t[i].ad);
	}
}
if(flag==0)printf("没有此号码!\n");
}
/*删除记录*/
int DeleteRecord(ElemType t[],int n){
	char s[10];
	char ch='N';
	int i,j,flag=0;
	printf("请输入要删除的名字\n");
	scanf("%s",s);
	for(i=0;i<n;i++){
		if(strcmp(s,t[i].name)==0){
			flag=1;
			printf("姓名    电话号码    E—mail   地址\n");
			printf("***********\n");
				printf("%-10s %-15s",t[i].name,t[i].tel);
		printf("%-20s %-15s\n",t[i].email,t[i].ad);
	printf("Are you sure delete it(Y/N)\n");
	fflush(stdin);
	ch=getchar();
	if(ch=='Y'||ch=='y'){
		for(j=i;j<n-1;j++)t[j]=t[j+1];
		n--;
		i--;
	}
		}
	}
	if(flag==0)printf("查无此人!\n");
	return n;
}
/*追加记录*/
int AddRecord(ElemType t[],int n){
	int i,m;
	printf("请输入要增加的记录数:\n");
	scanf("%d",&m);
	printf("开始追加记录\n");
	for(i=n;i<n+m;i++){
		printf("第%d条记录的姓名:",i+1);
		scanf("%s",t[i].name);
		printf("第%d条记录的电话:",i+1);
		scanf("%s",t[i].tel);
		printf("第%d条记录的E-mail:",i+1);
		scanf("%s",t[i].email);
		printf("第%d条记录的地址:",i+1);
		scanf("%s",t[i].ad);
	}
	return n+m;
}
/*按姓名排序*/
/*采用起泡排序方法进行排序*/
void SortOnName(ElemType t[],int n){
	int i,j,flag;
	ElemType temp;
	for(i=n-1,flag=1;i>1&&flag;i--){
		flag=0;
		for(j=0;j<i;j++)
			if((strcmp(t[j].name,t[j+1].name))>0)/*比较大小*/
			{
				temp=t[j];
				t[j]=t[j+1];
				t[j+1]=temp;
				flag=1;
			}
	}
}
/*保存与读取数据*/
void SaveRecord(ElemType t[],int n){//将数据保存到文件中
   int i;
   FILE *fp;
   if((fp=fopen("tongxunlu.txt","w"))==NULL){
	   printf("can not open file\n");
	   exit(1);
   }
   fprintf(fp,"%d",n);
   fprintf(fp,"\r\n");
   for(i=0;i<n;i++){
	   fprintf(fp,"%-10s %-15s",t[i].name,t[i].tel);
		fprintf(fp,"%-20s %-15s\n",t[i].email,t[i].ad);
fprintf(fp,"\r\n");
   }
   fclose(fp);
}
int LoadRecord(ElemType t[]){//从文件读取数据,函数返回值为记录数
	int i,n;
	FILE*fp;
	if((fp=fopen("tongxunlu.txt","a+"))==NULL){
		printf("can not open file \n");
		exit(1);
	}
	fscanf(fp,"%d",&n);
	for(i=0;i<n;i++)fscanf(fp,"%10s%15s%20s%15s",t[i].name,t[i].tel,t[i].email,t[i].ad);
	fclose(fp);
	return n;
}
/*菜单显示与主程序*/
int Memu_select(){//菜单函数,函数返回值为整数,代表所选的菜单项
	int c;
	system("cls");
	printf("********菜单*******\n");
	printf("1.输入初始记录 5.删除记录\n");
	printf("2.显示所有记录6.追加记录\n");
	printf("3.按姓名查找记录7.按姓名排序\n");
	printf("4.按电话号码查找记录0.退出\n");
	printf("**************************\n");
	do{
		printf("Enter your choice(0-7):");
		scanf("%d",&c);
		if(c>=0&&c<=7)break;
	}while(c<0||c>7);
	return c;
}
void main(){//主函数
ElemType adr[M];
int length;
system("cls");
while(1){
	switch(Menu_select()){
	case 1:length=Init(adr);
		SaveRecord(adr,length);
		break;
	case 2:length=LoadRecord(adr);
		List(adr,length);
		break;
	case 3:length=LoadRecord(adr);
		SearchOnName(adr,length);
		break;
	case 4:length=LoadRecord(adr);
		SearchOnName (adr,length);
		break;
	case 5:length=LoadRecord(adr);
		length=DeleteRecord(adr,length);
		SaveRecord(adr,length);
		break;
	case 6:length=LoadRecord(adr);
		length=AddRecord(adr,length);
		SaveRecord(adr,length);
		break;
	case 7:length=LoadRecord(adr);
          SortOnName(adr,length);
		  SaveRecord(adr,length);
		  List(adr,length);
		  break;
		  case 0:exit(0);/*如返回值为0,则程序结束*/
		  default:break;
	}
	printf("按任意键返回!");
		fflush(stdin);
	getchar();
}
}