C语言编写通讯录系统

今天交了一个用C写的通讯录系统,自以为还行,但老师无视我的设计🙀🙀,只给我89(主要是90多的一大堆,代码还都比我垃圾) (大一初学C)

下面是我的代码🐵🐵🐵

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>

typedef struct person
{
    char name[20];      //姓名
    char sex[10];       //性别
    char num[20];       //手机号
    char QQ[20];        //QQ号
    char email[20];     //邮箱
    char address[50];   //地址
    char relation[20];  //分组
    char remarks[20];   //备注
} PER;


int menu();     //菜单
void add_person(PER arr[],int *nPtr);          //添加l联系人函数
void InputPerson(PER arr[],int i);           //添加一个联系人
void OutPerson(PER arr[],int i);            //输出一个联系人
int print_person(PER arr[],int n);        //输出联系人
int FindByName(PER arr[],int n,char *str);  //按姓名查找位置
int FindByNum(PER arr[],int n,char *str);   //按电话号查找位置
void delete_person(PER arr[],int *nPtr);       //删除联系人
void modify_person(PER arr[],int n);      //修改联系人
void search_person_name(PER arr[],int n); //按名字查找联系人
void search_person_num(PER arr[],int n);  //按号码查找联系人
void search_person_relation();//按分组查找联系人
void save_file(PER arr[],int n);          //将数据保存到磁盘
void load_file(PER arr[],int *nPtr);       //添加顺序文件加载到数组per
void load_file_Name(PER arr[],int *nPtr);        //姓名顺序文件加载到数组Name_per
void load_file_Num(PER arr[],int *nPtr);        //号码顺序文件加载到数组Num_per
void sort_person_name();      //按姓名显示
void sort_person_num();      //按号码显示
void show_person(PER arr[],int n);         //显示所有联系人
int main()
{
    system("color 02");
    SetConsoleTitle("择渊的通讯录");
    PER per[100];
    int choice;
    int n;
    load_file(per,&n);
    while(1)
    {
        choice = menu();
        switch(choice)
        {
        case 1:         //添加联系人
            add_person(per,&n); break;
        case 2:         //删除联系人
            delete_person(per,&n);break;
        case 3:         //修改联系人
            modify_person(per,n);break;
        case 4:         //按名字查找联系人
            search_person_name(per,n);break;
        case 5:         //按号码查找联系人
            search_person_num(per,n);break;
        case 6:         //按分组查找联系人
            search_person_relation(per,n);break;
        case 7:         //显示所有联系人
            show_person(per,n);break;
        case 0:         //退出系统
            printf("\t 谢谢使用\n");
            return 0;
        }
    }

}
int menu()//菜单
{
    int choise;
    system("cls");
    system("color 0F");
    printf("\t\t\t\t-----------------------------------\n");
    printf("\t\t\t\t|       欢迎使用通讯录管理系统    |\n");
    printf("\t\t\t\t-----------------------------------\n");
    printf("\t\t\t\t|       1.新增联系人              |\n");
    printf("\t\t\t\t-----------------------------------\n");
    printf("\t\t\t\t|       2.删除联系人              |\n");
    printf("\t\t\t\t-----------------------------------\n");
    printf("\t\t\t\t|       3.修改联系人              |\n");
    printf("\t\t\t\t-----------------------------------\n");
    printf("\t\t\t\t|       4.按名字查询联系人        |\n");
    printf("\t\t\t\t-----------------------------------\n");
    printf("\t\t\t\t|       5.按号码查询联系人        |\n");
    printf("\t\t\t\t-----------------------------------\n");
    printf("\t\t\t\t|       6.按分组查询联系人        |\n");
    printf("\t\t\t\t-----------------------------------\n");
    printf("\t\t\t\t|       7.显示所有联系人          |\n");
    printf("\t\t\t\t-----------------------------------\n");
    printf("\t\t\t\t|       0.退出系统                |\n");
    printf("\t\t\t\t-----------------------------------\n");
    printf("\t\t\t\t请选择功能: ");
    scanf("%d",&choise);
    while(choise>7||choise<0)
    {
        printf("请重新选择:");
        scanf("%d",&choise);
    }
    return choise;
}
void load_file(PER arr[],int *nPtr)      //文件加载到结构数组per
{
    FILE *fp;
    int i;

    if((fp=fopen("num.dat","r"))==NULL)
    {
        *nPtr = 0;
        return;
    }
    for(i=0;fread(&arr[i],sizeof(PER),1,fp)!=0;i++);
    *nPtr = i;  //*nPtr记录文件中当前学生数量
    fclose(fp);
}
void save_file(PER arr[],int n)          //将数据保存到磁盘
{
    FILE *fp;
    if((fp=fopen("num.dat","w"))==NULL)
    {
        printf("打开文件失败\n");
        system("pause");
        exit(0);
    }

    fwrite(arr,n * sizeof(arr[0]),1,fp);
    fclose(fp);
}
int print_person(PER arr[],int n)        //输出所有信息联系人
{
	int i;
	printf("%-15s%-15s%-15s%-15s%-15s%-15s%-15s%-15s\n","姓名","性别","备注","分组","手机号","QQ","邮箱","地址");

	for(i=0;i<n;i++)
	{
        OutPerson(arr,i);
	}
	system("pause");
	return 0;
}
void add_person(PER arr[],int *nPtr)    //添加联系人
{
    char sel = 'y';

    while(sel=='y')
    {
        InputPerson(arr,(*nPtr)++);   //添加第n+1个联系人
        printf("是否继续添加联系人?(y,n)\n");
        scanf(" %c",&sel);
    }
    save_file(arr,*nPtr);
    printf("添加结束\n");
    system("pause");
}
void InputPerson(PER arr[],int i)       //添加一个联系人
{
    printf("请输入第%d个联系人\n",i+1);

    printf("请输入联系人姓名\n");
    scanf("%s",arr[i].name);

    printf("请输入联系人性别\n");
    scanf("%s",arr[i].sex);

    printf("请输入联系人备注\n");
    scanf("%s",arr[i].remarks);

    printf("请输入联系人分组\n");
    scanf("%s",arr[i].relation);

    printf("请输入联系人手机号\n");
    scanf("%s",arr[i].num);

    printf("请输入联系人QQ\n");
    scanf("%s",arr[i].QQ);

    printf("请输入联系人邮箱\n");
    scanf("%s",arr[i].email);

    printf("请输入联系人地址\n");
    scanf("%s",arr[i].address);
}
void OutPerson(PER arr[],int i)           //输出一个联系人
{
    printf("%-15s",arr[i].name);
    printf("%-15s",arr[i].sex);
    printf("%-15s",arr[i].remarks);
    printf("%-15s",arr[i].relation);
    printf("%-15s",arr[i].num);
    printf("%-15s",arr[i].QQ);
    printf("%-15s",arr[i].email);
    printf("%-15s",arr[i].address);
    printf("\n");
}
void delete_person(PER arr[],int *nPtr)     //删除联系人
{
    int i,index;
    char str[20];

    printf("请输入删除联系人的姓名");
    scanf("%s",str);
    index = FindByName(arr,*nPtr,str);

    if(index<0)
    {
        printf("\n 该联系人不存在\n");
        system("pause");
        return ;
    }
    for(i=index;i<*nPtr-1;i++)
        arr[i]=arr[i+1];

    (*nPtr)--;

    printf("\n 删除成功\n");
    system("pause");
    save_file(arr,*nPtr);
}
int FindByName(PER arr[],int n,char *str)  //按姓名查找
{
    int i;

    for (i=0;i<n;i++)
        if(strcmp(arr[i].name,str)==0)
        return i;
    return -1;
}
void  modify_person(PER arr[],int n)         //修改联系人
{
    int index;
    char sel;
    char str[20];
    printf("请输入姓名:\n");
    scanf("%s",str);
    index = FindByName(arr,n,str);

    if(index<0)
    {
        printf("该联系人信息不存在\n");
        system("pause");
        return ;
    }
    printf("修改前的原纪录如下:\n");
    OutPerson(arr,index);

    printf("是否修改姓名?请输入 y or n:\n");
    scanf(" %c",&sel);
    if(sel =='y')
    {
        printf("请输入姓名:\n");
        scanf("%s",arr[index].name);
    }
    printf("是否修改性别?请输入 y or n:\n");
    scanf(" %c",&sel);
    if(sel =='y')
    {
        printf("请输入性别:\n");
        scanf("%s",arr[index].sex);
    }
    printf("是否修改备注?请输入 y or n:\n");
    scanf(" %c",&sel);
    if(sel =='y')
    {
        printf("请输入新的备注:\n");
        scanf("%s",arr[index].remarks);
    }
    printf("是否修改分组?请输入 y or n:\n");
    scanf(" %c",&sel);
    if(sel =='y')
    {
        printf("请输入新的分组:\n");
        scanf("%s",arr[index].relation);
    }
    printf("是否修改手机号?请输入 y or n:\n");
    scanf(" %c",&sel);
    if(sel =='y')
    {
        printf("请输入新的手机号:\n");
        scanf("%s",arr[index].num);
    }
    printf("是否修改QQ?请输入 y or n:\n");
    scanf(" %c",&sel);
    if(sel =='y')
    {
        printf("请输入新的QQ:\n");
        scanf("%s",arr[index].QQ);
    }
    printf("是否修改地址?请输入 y or n:\n");
    scanf(" %c",&sel);
    if(sel =='y')
    {
        printf("请输入新的地址:\n");
        scanf("%s",arr[index].QQ);
    }
    save_file(arr,n);
    system("pause");
}
void search_person_name(PER arr[],int n)    //按名字查找联系人
{
    int index;
    char str[20];
    printf("请输入查找的联系人姓名");
    scanf("%s", str);

    index=FindByName(arr,n,str);

    if(index<0)
    {
        printf("该联系人不存在");
        system("pause");
        return ;
    }
    printf("%-15s%-15s%-15s%-15s%-15s%-15s%-15s%-15s\n","姓名","性别","备注","分组","手机号","QQ","邮箱","地址");
    OutPerson(arr,index);
    system("pause");
}
void search_person_num(PER arr[],int n)     //按号码查找联系人
{
    int index;
    char str[20];
    printf("请输入查找的联系人电话号");
    scanf("%s", str);

    index=FindByNum(arr,n,str);

    if(index<0)
    {
        printf("该联系人不存在");
        system("pause");
        return ;
    }
    printf("%-15s%-15s%-15s%-15s%-15s%-15s%-15s%-15s\n","姓名","性别","备注","分组","手机号","QQ","邮箱","地址");
    OutPerson(arr,index);
    system("pause");
}
int FindByNum(PER arr[],int n ,char *str)   //按电话号查找位置
{
    int i;

    for (i=0;i<n;i++)
        if(strcmp(arr[i].num,str)==0)
        return i;
    return -1;
}
void search_person_relation()      //按分组查找联系人
{
 PER Rel_arr[100];
 int Rel_n;
 load_file(Rel_arr,&Rel_n);
 int i,j;
 int k=0;
 PER temp;
 char rel[100][20];
 char select;
 for(i=0;i<Rel_n-1;i++)
    {
        for(j=i+1;j<Rel_n;j++)
            if(strcmp(Rel_arr[i].relation,Rel_arr[j].relation)>0)
            {
                temp = Rel_arr[i];
                Rel_arr[i]=Rel_arr[j];
                Rel_arr[j]=temp;
            }
    }
 strcpy(rel[k],Rel_arr[0].relation);
 k++;
 for(i=1;i<Rel_n;i++)
    {
            if(strcmp(Rel_arr[i].relation,Rel_arr[i-1].relation)!=0)
            {
                strcpy(rel[k],Rel_arr[i].relation);
                k++;
            }
    }
 printf("现已有以下分组:\n");
 for(j=0;j<k;j++)
 {
  printf("%c. %s\t\t",'A'+j,rel[j]);
 }
 printf("\n");
 printf("请输入您要查询的分组:\n");
 scanf(" %c",&select);
 while(select>='A'+k||select<'A')
 {
  printf("输入错误,请重新输入\n");
  scanf(" %c",&select);
 }
 int select_num=select-'A';
 printf("%-15s%-15s%-15s%-15s%-15s%-15s%-15s%-15s\n","姓名","性别","备注","分组","手机号","QQ","邮箱","地址");
 for(i=0;i<=Rel_n;i++)
 {
  if(strcmp(Rel_arr[i].relation,rel[select_num])==0)
  OutPerson(Rel_arr,i);
 }
 system("pause");
}
void sort_person_name()      //按姓名顺序显示
{
    PER name_arr[100];
    int Name_n;
    load_file(name_arr,&Name_n);
    int i,j;
    for(i=0;i<Name_n-1;i++)
    {
        PER temp;
        for(j=i+1;j<Name_n;j++)
            if(strcmp(name_arr[i].name,name_arr[j].name)>0)
            {
                temp = name_arr[i];
                name_arr[i]=name_arr[j];
                name_arr[j]=temp;
            }
    }
    print_person(name_arr,Name_n);
    return;
}
void sort_person_num()      //按电话号码显示
{
    PER num_arr[100];
    int Num_n;
    load_file(num_arr,&Num_n);
    int i,j;
    for(i=0;i<Num_n-1;i++)
        for(j=i+1;j<Num_n;j++)
            if(strcmp(num_arr[i].num,num_arr[j].num)>0)
            {
                PER temp;
                temp = num_arr[i];
                num_arr[i]=num_arr[j];
                num_arr[j]=temp;
            }
    print_person(num_arr,Num_n);
}
void show_person(PER arr[],int n)  //显示
{
 char sel;
 printf("请输入显示的顺序\n");
 printf("A.按姓名顺序显示\t\tB.按手机号顺序显示\t\tC.按添加顺序显示\n");
 scanf(" %c",&sel);

 while(sel>'C'||sel<'A')
 {
  printf("输入错误请重新输入\n");
  scanf(" %c",&sel);
 }
 if(sel=='A')
  sort_person_name();
 else if(sel=='B')
  sort_person_num();
 else if(sel=='C')
  print_person(arr,n);
 else
    exit(0);
  return ;
}