/*菜单:*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
#define N 1000
#define HEADER1 "-----------------------------------个人通讯录-----------------------------------\n"
#define HEADER2 "|  姓名  |  单位  |  固定电话  |  移动手机  |   分类   |  EMAIL |     QQ     |  住址  | \n"
#define HEADER3 "|--------|--------|------------|------------|----------|--------|------------|--------| \n"
#define FORMAT  "|%8s|%8s|%12d|%12d|%10s|%8s|%12d|%8s|\n"
#define DATA  p->name,p->dw,p->gddh,p->yddh,p->fl,p->em,p->qq,p->zz
#define END     "--------------------------------------------------------------------------------\n"
typedef struct Student 
{
 char name[16];
 char dw[26];
 int gddh;
 int yddh;
 char fl[12];
 char em[60];
 int qq;
 char zz[40];
} STU;  
int stud_num=0;  /*stud_num 保存中的记录数*/
void input(STU *);
void disp(STU *);
void app(STU *);
void dele(STU *);
void modify(STU *);
void qur(STU *);
void sort(STU *);
void save(STU *);
void sum(STU *);

void printHeader()
{
 printf(HEADER1);
  printf(HEADER2);
    printf(HEADER3);
}
   void showMenu()
{
 system("cls");
 printf("       个人通讯录管理系统       \n");
 printf("**************菜单**************\n");
 printf("             1 输入             \n");
 printf("             2 显示             \n");
 printf("             3 添加             \n");
 printf("             4 删除             \n");
 printf("             5 修改             \n");
 printf("             6 查询             \n");
 printf("             7 排序             \n");
 printf("             8 导出             \n");
 printf("             9 统计             \n");
 printf("             0 退出             \n");
 printf("********************************\n");
}
 void showWrong()
 {
  printf("\n***** Error:输入错误!***\n请重新输入您的操作选择[0-9]:");
 }
void main()
{
 STU stud[N];
  int sel;
 showMenu();
 printf("请输入您的操作选择[0-9]:");
 do{
  scanf("%d",&sel);
  if(sel==0)
   break;
  switch(sel)
  {case 1:input(stud);break;
  case 2:disp(stud);break;
   case 3:app(stud);break;
    case 4:dele(stud);break;
     case 5:modify(stud);break;
      case 6:qur(stud);break;
       case 7:sort(stud);break;
        case 8:save(stud);break;
         case 9:sum(stud);break;
        default:showWrong();
  }
 }while(1);
 printf("操作结束,再见!\n");
}
/*输入:*/
void input(STU*s)
{
FILE *fp;
int i,j,count;
char name[16];
STU*pstu;
system("cls");
printf("请输入要录入的联系人数:");
scanf("%d",&count);
for(i=0;i<count;i++)
{
printf("请输入第%d个联系人:\n",i+1);
printf("输入名字:");
scanf("%s",name);
pstu=s+stud_num;
for(j=0;j<16;j++)
{strcpy(pstu->name,name);}
printf("请输入固定电话:");
scanf("%d",&pstu->gddh);
printf("请输入地址:");
scanf("%s",pstu->zz);
printf("请输入单位:");
scanf("%s",pstu->dw);
printf("请输入移动手机:");
scanf("%d",&pstu->yddh);
printf("请输入E-mail:");
scanf("%s",pstu->em);
printf("请输入QQ:");
scanf("%d",&pstu->qq);
printf("请输入分类:");
scanf("%s",pstu->fl);
stud_num++;
}
/*导出:*/
if((fp=fopen("ok.txt","wb+"))==NULL)
{printf("File open error!\n");
exit(1);
}
fwrite(s,sizeof(STU),stud_num,fp);
printf("保存成功!\n");
fclose(fp);
showMenu();
printf("请输入您的操作选择[0-9]:");
}
/*显示:*/
void disp(STU*p)
{                                               
int i,flag=0;
showMenu();
if(stud_num==0)
{
printf("没有导入数据!");
printf("\n请输入您的操作选择[0-9]:"); 
return;
}
printHeader();
for(i=0;i<stud_num;i++)
{
printf(FORMAT,DATA);
printf(HEADER3);
p++;
flag++;
}
if(flag%10==0)
{printf("-------------------按任意键进入下一页------------------");
getch();
}

printf("请输入您的操作选择[0-9]:");
}
/*查找:*/
void qur(STU*p)
{
int sel,i;
char name[16];
char dw[26];
char zz[40];
printf("1--------------根据姓名查询\n");
printf("2--------------根据地址查询\n");
printf("3--------------根据单位查询\n");
printf("请输入您的操作选择:[1or2or3]?");
scanf("%d",&sel);
    getchar();
if(sel!=1&&sel!=2&&sel!=3)
{
showMenu();
printf("请输入您的操作选择[0-9]:");
return;
}
if(sel==1)
{
printf("请输入您要查询的记录的姓名:");
gets(name);
for(i=1;i<=stud_num;i++)
{
if(!strcmp(name,p->name))break;
p++;
}
if(i>stud_num)
{
printf("无此记录!\n");
return;
}
else
{
printHeader();
printf(FORMAT,DATA);
printf(END);
}
}
else if(sel==2)
{
printf("请输入您要查询的记录的地址:");
gets(zz);
for(i=1;i<=stud_num;i++)
{
if(!strcmp(zz,p->zz))break;
p++;
}
if(i>stud_num)
{
printf("无此记录!\n");
return;
}
else
{
printHeader();
printf(FORMAT,DATA);
printf(END);
}
}
else if(sel==3)
{
printf("请输入您要查询的记录的单位:");
gets(dw);
for(i=1;i<=stud_num;i++)
{
if(!strcmp(dw,p->dw))break;
p++;
}
if(i>stud_num)
{
printf("无此记录!\n");
return;
}
else
{
printHeader();
printf(FORMAT,DATA);
printf(END);
}
}
printf("请输入您的操作选择[0-9]:");
}
/*修改:*/
void modify(STU *p)
{
 int i;
int qq;
 STU *s=p;
 printf("请输入您要修改的qq:");
  scanf("%d",&qq);
  for(i=1;i<=stud_num;i++)
  {
   if(qq==p->qq)break;
   p++;
  }
  if(i>stud_num){
	  printf("无此记录!\n");}
  else
  {
   printf("请输入您要修改的记录的qq:");
    scanf("%d",&qq);
   if(qq!=0)
   {
    p->qq=qq;
	printf("请输入你要修改的姓名:");
	scanf("%s",p->name);
    printf("请输入您要修改的单位:");
    scanf("%s",p->dw);
    printf("请输入您要修改的固定电话:");
    scanf("%d",&p->gddh);
    printf("请输入您要修改的移动电话:");
    scanf("%d",&p->yddh);
    printf("请输入您要修改的分类:");
    scanf("%s",p->fl);
    printf("请输入您要修改的电子邮箱:");
    scanf("%s",p->em);
    printf("请输入您要修改的住址:");
    scanf("%s",p->zz);
   }
  }disp(s);
}
/*增加:*/
void app(STU *s)
{
int n=1,i;
long yddh;
STU *pstu;
do{
system("cls");
printf("输入手机号:");
scanf("%d",&yddh);
for(i=0;i<stud_num;i++)
while(s[i].yddh==yddh)
{printf("手机号已存在,请重新输入!\n");
 printf("输入手机号:");
 scanf("%d",&yddh);
}
pstu=s+stud_num;
pstu->yddh=yddh;
printf("请输入姓名:");
scanf("%s",pstu->name);
printf("请输入固定电话:");
scanf("%d",&pstu->gddh);
printf("请输入QQ号码:");
scanf("%d",&pstu->qq);
printf("请输入Email:");
scanf("%s",pstu->em);
printf("请输入单位:");
scanf("%s",pstu->dw);
printf("请输入分类:");
scanf("%s",pstu->fl);
printf("请输入住址:");
scanf("%s",pstu->zz);
    stud_num++;
printf("输入0退出,输入其他数字继续!");
scanf("%d",&n);
if(n==0)
{
showMenu();
printf("请输入你的操作选项[0-9]:");
break;}
}while(1);
}
/*删除:*/
void dele(STU *p)
{ int i,j,qq;
STU *s=p;
showMenu();
printf("请输入要删除的qq:\n");
scanf("%d",&qq);
for(i=1;i<=stud_num;i++)
{if(qq==p->qq)break;
p++;}
if(i>stud_num){
printf("无此记录!\n");
return;
}else if(i==stud_num){
stud_num--;
printf("删除成功!\n");
}
else{
for(j=i-1;j<stud_num-1;j++)
    s[j]=s[j+1];
stud_num--;
printf("删除成功!\n");}
printf("请输入您的操作选择[0-9]:");
}



/*排序:*/
void sort(STU *p)
{
int i,sel;
STU temp,*s;
s=p;
printf("1--------------根据姓名首字母查询\n");
printf("1--------------根据姓名首字母查询\n");
printf("2--------------根据地址首字母查询\n");
printf("请输入您的操作选择:[1or2or3]?");
scanf("%d",&sel);
getchar();
if(sel==1){
for(i=0;i<stud_num-1;i++)
  if((p+i)->name[0]>(p+1+i)->name[0])
 {temp=*(p+i);
 *(p+i)=*(p+1+i);
 *(p+1+i)=temp;
 }


}
else if(sel==2){
for(i=0;i<stud_num-1;i++)
  if((p+i)->zz[0]>(p+1+i)->zz[0])
 {temp=*(p+i);
 *(p+i)=*(p+1+i);
 *(p+1+i)=temp;
 }
}
else if(sel==3){
for(i=0;i<stud_num-1;i++)
  if((p+i)->dw[0]>(p+1+i)->dw[0])
 {temp=*(p+i);
 *(p+i)=*(p+1+i);
 *(p+1+i)=temp;
 }
}
  disp(s);
}



/*统计:*/

void sum(STU *p)
{  int i=0,j=0,x=0,z=0,k=0;
    for(i=1;i<=stud_num;i++)
{if(p->fl[0]=='t')
j++;
else if(p->fl[0]=='j')
x++;
else if(p->fl[0]=='p')
z++;
else k++;}
printf("同事人数为%d 家人人数为%d  朋友人数为%d 同学人数为%d\n",j,x,z,k);
printf("请输入您的操作[0-9]:");
}
/*导入*/
void save(STU *p){
	FILE *fp;
if((fp=fopen("right.txt","wb+"))==NULL)
{printf("File open error!\n");
exit(1);
}
fwrite(p,sizeof(STU),stud_num,fp);
printf("导入成功!\n");
fclose(fp);
showMenu();
printf("请输入您的操作选择[0-9]:");
}