You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

527 lines
12 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
struct record
{
char nativeplace[20];
char name[20];
char phone1[20];
char phone2[20];
char e_mail[30];
}student[500];
int num=0;//外部变量num为文件中的纪录数
FILE *fp;
void welcome(); //欢迎
void mainmenu(); //主菜单
void newrecord(); //新添纪录
void modify(); //修改联系人
void modifyname(); //姓名修改
void modifyphone1(); //电话号码1修改
void modifyphone2(); //电话号码2修改
void searchmenu(); //查询菜单
void searchbynativeplace(); //按籍贯查询
void searchbyname(); //按姓名查询
void searchbyphone1(); //按电话1查询
void searchbyphone2(); //按电话2查询
void deletemenu(); //删除菜单
void deleteall(); //删除所有
void deleteone(); //删除单个
void showall(); //显示所有
void readfromfile(); //读取文件
void writetofile(); //写入文件
void deletebynativeplace(); //按籍贯删除
void deletebyname(); //按姓名删除
void listbynativeplace(); //按籍贯排序
void listbyname(); //按姓名排序
void listmenu(); //排序菜单
int main() //主函数
{
welcome();
readfromfile();
while (1)
{
mainmenu();
}
}
void showall()//显示所有
{
int i;
system("cls");
if(num!=0)
{
printf("\n\t\t*************** 以下为通讯录所有信息************");
for (i=0;i<num;i++)
{
printf("\n\t\t籍贯: %s",student[i].nativeplace);
printf("\n\t\t姓名: %s",student[i].name);
printf("\n\t\t电话1 %s",student[i].phone1);
printf("\n\t\t电话2 %s",student[i].phone2);
printf("\n\t\te-mail%s",student[i].e_mail);
printf("\t\t");
if (i+1<num)
{
printf("\n\t\t__________________________");
system("pause");
}
}
printf("\n\t\t************************************************");
}
else
printf("\n\t\t通讯录中无任何纪录");
printf("\n\t\t按任意键返回主菜单:");
getch();
return;
}
void searchmenu()//查询菜单
{
char choic;
system("cls");
printf("\n\t\t******************* 查询菜单 **********************");
printf("\n\t\t********** 1-显示所有 2-按籍贯查询 *************");
printf("\n\t\t********** 3-按姓名查询 4-按电话1查询 ************");
printf("\n\t\t********** 5-按电话2查询 6-返回主菜单 *************");
printf("\n\t\t***************************************************");
printf("\n\t\t请选择:");
choic=getch();
switch (choic)
{
case '1':showall();break;
case '2':searchbynativeplace();break;
case '3':searchbyname();break;
case '4':searchbyphone1();break;
case '5':searchbyphone2();break;
case '6':mainmenu();break;
}
}
void searchbynativeplace()//按籍贯查询
{
int mark=0;
int i;
int a=0;
printf("\n\t\t****************** 按籍贯查找 ******************\n");
char nativeplace[20];
printf("\n\t\t请输入籍贯:");
scanf("%s",nativeplace);
for(i=0;i<num;i++)
{
if (strcmp(student[i].nativeplace,nativeplace)==0)
{
printf("\n\t\t************** 以下是您查找的联系人信息 **********");
printf("\n\t\t籍贯: %s",student[i].nativeplace);
printf("\n\t\t姓名: %s",student[i].name);
printf("\n\t\t电话1 %s",student[i].phone1);
printf("\n\t\t电话2 %s",student[i].phone2);
printf("\n\t\te-mail%s",student[i].e_mail);
printf("\n\t\t************************************************");
printf("\n\t\t按任意键返回主菜单:");
mark++;
getch();
return;
}
}
if (mark==0)
{
printf("\n\t\t没有修改联系人的信息");
printf("\n\t\t按任意键返回主菜单");
getch();
return;
}
}
void searchbyname()//按姓名查询
{
int mark=0;
int i;
int a=0;
printf("\n\t\t***************** 按姓名查找 *******************");
char name[20];
printf("\n\t\t请输入姓名:");
scanf("%s",name);
for(i=a;i<num;i++)
{
if (strcmp(student[i].name,name)==0)
{
printf("\n\t\t************* 以下是您查找的联系人信息 ***********");
printf("\n\t\t籍贯: %s",student[i].nativeplace);
printf("\n\t\t姓名: %s",student[i].name);
printf("\n\t\t电话1 %s",student[i].phone1);
printf("\n\t\t电话2 %s",student[i].phone2);
printf("\n\t\te-mail%s",student[i].e_mail);
printf("\n\t\t************************************************");
mark++;
if ((i+1)<num)
{
printf("\n\t\t是否继续查找相同名字的联系人信息:(y/n)");
if (getch()=='y')
{
a=i;
continue;
}
else
return;
}
else
{
printf("\n\t\t按任意键返回主菜单");
getch();
return;
}
}
}
if(mark!=0)
{
printf("\n\t\t没有相同姓名的联系人纪录");
printf("\n\t\t按任意键返回主菜单");
getch();
return;
}
else
{
printf("\n\t\t没有相同姓名的联系人纪录");
printf("\n\t\t按任意键返回主菜单");
getch();
return;
}
}
void searchbyphone1()//按电话1查询
{
int mark=0;
int i;
int a=0;
printf("\n\t\t****************** 按电话1查找 ******************");
char phone1[10];
printf("\n\t\t请输入电话1:");
scanf("%s",phone1);
for(i=0;i<num;i++)
{
if (strcmp(student[i].phone1,phone1)==0)
{
printf("\n\t\t************** 以下是您查找的联系人信息 **********");
printf("\n\t\t籍贯: %s",student[i].nativeplace);
printf("\n\t\t姓名: %s",student[i].name);
printf("\n\t\t电话1 %s",student[i].phone1);
printf("\n\t\t电话2 %s",student[i].phone2);
printf("\n\t\te-mail%s",student[i].e_mail);
printf("\n\t\t************************************************");
printf("\n\t\t按任意键返回主菜单:");
mark++;
getch();
return;
}
}
if (mark==0)
{
printf("\n\t\t没有修改联系人的信息");
printf("\n\t\t按任意键返回主菜单");
getch();
return;
}
}
void searchbyphone2() //按电话2查询
{
int mark=0;
int i;
int a=0;
printf("\n\t\t****************** 按电话2查找 ******************");
char phone2[10];
printf("\n\t\t请输入电话2:");
scanf("%s",phone2);
for(i=0;i<num;i++)
{
if (strcmp(student[i].phone2,phone2)==0)
{
printf("\n\t\t************** 以下是您查找的联系人信息 **********");
printf("\n\t\t籍贯: %s",student[i].nativeplace);
printf("\n\t\t姓名: %s",student[i].name);
printf("\n\t\t电话1 %s",student[i].phone1);
printf("\n\t\t电话2 %s",student[i].phone2);
printf("\n\t\te-mail%s",student[i].e_mail);
printf("\n\t\t************************************************");
printf("\n\t\t按任意键返回主菜单:");
mark++;
getch();
return;
}
}
if (mark==0)
{
printf("\n\t\t没有修改联系人的信息");
printf("\n\t\t按任意键返回主菜单");
getch();
return;
}
}
void listmenu()//排序菜单
{
char choic;
if(num==0)
{
printf("\n\t\t对不起,文件中无任何纪录");
printf("\n\t\t按任意键返回主菜单");
getch();
return;
}
system("cls");
printf("\n\t\t******************* 排序菜单 *******************");
printf("\n\t\t********** 1-按籍贯排序 2-按姓名排序 **********");
printf("\n\t\t********** 3-返回主菜单 **********");
printf("\n\t\t************************************************");
printf("\n\t\t请选择:");
choic=getch();
switch(choic)
{
case '1':listbynativeplace();break;
case '2':listbyname();break;
case '3':mainmenu();break;
default:mainmenu();break;
}
}
void listbynativeplace()//按籍贯排序
{
int i,j;
struct record tmp;
for (i=1;i<num;i++)
{
if(strcmp(student[i].nativeplace,student[i-1].nativeplace)<0)
{
tmp=student[i];
j=i-1;
do
{
student[j+1]=student[j];
j--;
}while ((strcmp(tmp.nativeplace,student[j].nativeplace)<0)&&j>=0);
student[j+1]=tmp;
}
}
printf("\n\t\t排序成功,是否显示?(y/n)");
if (getch()=='y')
showall();
return;
}
void listbyname()//按姓名排序
{
int i,j;
struct record tmp;
for (i=1;i<num;i++)
{
if(strcmp(student[i].name,student[i-1].name)<0)
{
tmp=student[i];
j=i-1;
do
{
student[j+1]=student[j];
j--;
}while ((strcmp(tmp.name,student[j].name)<0&&j>=0));
student[j+1]=tmp;
}
}
printf("\n\t\t排序成功,是否显示?(y/n)");
if (getch()=='y')
showall();
return;
}
void deletemenu()//删除菜单
{
char choic;
if(num==0)
{
printf("\n\t\t对不起,文件中无任何纪录");
printf("\n\t\t按任意键返回主菜单");
getch();
return;
}
system("cls");
printf("\n\t\t******************* 删除菜单 *******************");
printf("\n\t\t*********** 1-删除所有 2-删除单个 ***********");
printf("\n\t\t*********** 3-返回主菜单 ***********");
printf("\n\t\t************************************************");
printf("\n\t\t请选择:");
choic=getch();
switch (choic)
{
case '1':deleteall();break;
case '2':deleteone();break;
case '3':mainmenu();break;
default:mainmenu();break;
}
}
void deleteall()//删除所有
{
printf("\n\t\t确认删除?(y/n)");
if (getch()=='y')
{
fclose(fp);
if ((fp=fopen("student.bin","wb"))==NULL)
{
printf("\n\t\t不能打开文件,删除失败");
readfromfile();
}
num=0;
printf("\n\t\t记录已删除,按任意键返回主菜单");
getch();
return;
}
else
return;
}
void deletebyname()//按姓名删除
{
int a=0;
int findmark=0;
int j;
int deletemark=0;
int i;
char name[20];
printf("\n\t\t请输入要删除姓名:");
scanf("%s",name);
for (i=a;i<num;i++)
{
if (strcmp(student[i].name,name)==NULL)
{
printf("\n\t\t以下是您要删除的记录:");
findmark++;
printf("\n\t\t________________________________");
printf("\n\t\t籍贯: %s",student[i].nativeplace);
printf("\n\t\t姓名: %s",student[i].name);
printf("\n\t\t电话1 %s",student[i].phone1);
printf("\n\t\t电话2 %s",student[i].phone2);
printf("\n\t\te-mail%s",student[i].e_mail);
printf("\n\t\t________________________________");
printf("\n\t\t是否删除?(y/n)");
if (getch()=='y')
{
for (j=i;j<num-1;j++) /*记录移动从stud数组中删除之*/
student[j]=student[j+1];
num--;
deletemark++;
printf("\n\t\t删除成功");
if((i+1)<num)
{
printf("\n\t\t是否继续删除相同姓名的联系人信息?(y/n)");
if (getch()=='y')
{
a=i;
continue;
}
}
printf("\n\t\t是否继续删除?(y/n)");
if (getch()=='y')
deletebyname();
return;
}
if((i+1)<num)
{
printf("\n\t\t是否继续删除相同姓名的联系人信息?(y/n)");
if (getch()=='y')
{
a=i;
continue;
}
}
}
else
continue;
}
if ((deletemark==0)&&(findmark==0))
{
printf("\n\t\t没有该联系人的纪录");
printf("\n\t\t是否继续删除?(y/n)");
if (getch()=='y')
deletebynativeplace();
return;
}
else if (findmark!=0)
{
printf("\n\t\t没有重名信息");
printf("\n\t\t没有该联系人的纪录");
printf("\n\t\t是否继续删除?(y/n)");
if (getch()=='y')
deletebynativeplace();
return;
}
}
void deleteone()//删除单个
{
char choic;
printf("\n\t\t1-按籍贯删除 2-按姓名删除");
printf("\n\t\t请选择:");
choic=getch();
switch (choic)
{
case '1':deletebynativeplace();break;
case '2':deletebyname();break;
}
}
void deletebynativeplace()//按籍贯删除
{
int i,j;
int deletemark=0;
char nativeplace[20];
printf("\n\t\t请输入要删除联系人籍贯:");
scanf("%s",nativeplace);
if(num==0)
{
printf("\n\t\t对不起,文件中无任何纪录");
printf("\n\t\t按任意键返回主菜单");
getch();
return;
}
for (i=0;i<num;i++)
{
if (strcmp(student[i].nativeplace,nativeplace)==NULL)
{
printf("\n\t\t以下是您要删除的联系人记录:");
printf("\n\t\t籍贯: %s",student[i].nativeplace);
printf("\n\t\t姓名: %s",student[i].name);
printf("\n\t\t电话1 %s",student[i].phone1);
printf("\n\t\t电话2 %s",student[i].phone2);
printf("\n\t\te-mail%s",student[i].e_mail);
printf("\n\t\t是否删除?(y/n)");
if (getch()=='y')
{
for (j=i;j<num-1;j++) /*纪录移动从stud数组中删除之*/
student[j]=student[j+1];
num--;
deletemark++;
printf("\n\t\t删除成功");
printf("\n\t\t是否继续删除?(y/n)");
if (getch()=='y')
deletebynativeplace();
return;
}
else
return;
}
continue;
}
if (deletemark==0)
{
printf("\n\t\t没有该联系人的记录");
printf("\n\t\t是否继续删除?(y/n)");
if (getch()=='y')
deletebynativeplace();
return;
}
}
void writetofile()//写入文件
{
int i;
if ((fp=fopen("student.bin","wb"))==NULL)
{
printf("\n\t\t文件打开失败");
}
for (i=0;i<num;i++)
{
if (fwrite(&student[i],sizeof(struct record),1,fp)!=1)
{
printf("\n\t\t写入文件错误!\n");
}
}
fclose(fp);
printf("\n\t\t通讯录文件已保存");
printf("\n\t\t按任意键退出程序\n\t\t");
exit(0);
}