/*通讯录管理*/
#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();
}
}