我是照抄书上的程序,但在显示记录那个环节出了问题,为阅读简便我除去了无关的函数功能
#define M 100#include"stdio.h"
#include"stdlib.h"
#include"string.h"
struct record
{
char name[20];
int age;
char tele[15];
char city[20];
char units[30];
char note[20];
};
void creat();
void append();
void display();
void locate();
void modify();
void dele();
void disp_arr(struct record *,int);
void disp_row(struct record);
void disp_table();
void modi_seq(struct record [],int);
void disp_str(char,int);
void sort(struct record [],int);
void sort_name(struct record [],int);
void sort_city(struct record [],int);
void dele_name(struct record [],int *);
void dele_sequ(struct record [],int *);
void main() //主函数,实现菜单控制
{
char choice;
while(1)
{ //以下代码显示功能菜单
printf("\n\n");
disp_str(' ',18);
printf("通讯录管理程序\n");
disp_str('*',50);
putchar('\n');
disp_str(' ',16);
printf("1.通讯录信息输入 \n");
disp_str(' ',16);
printf("2.显示通讯录信息 \n");
disp_str(' ',16);
printf("3.通讯录记录查询 \n");
disp_str(' ',16);
printf("4.修改通讯录信息 \n");
disp_str(' ',16);
printf("5.通讯录记录删除 \n");
disp_str(' ',16);
printf("6.建立通讯录文件 \n");
disp_str(' ',16);
printf("7.退出通讯录程序 \n");
disp_str('*',50);
putchar('\n'); //以上代码显示功能菜单
disp_str(' ',14);
printf("请输入代码选择(1~7)");
choice=getchar();
getchar();
switch(choice)
{
case'1':
append();
break;
case'2':
display(); //调用这个函数用不了,会出现错误
break;
case'3':
printf("locate()");
break;
case'4':
printf("modify()");
break;
case'5':
printf("dele()");
break;
case'6':
creat();
break;
case'7':
return;
default:
continue;
}
}
}
void disp_str(char ch,int n)//以下代码时输出一串字符串
{
int i;
for(i=1;i<=n;i++)
printf("%c",ch);
return;
}
void creat()//以下代码是创建文件功能
{
FILE *fp;
if((fp=fopen("address","wb"))==NULL)
{
printf("can't open file!\n");
return;
}
fclose(fp);
printf("\n文件成功建立,请使用“通讯录信息输入”功能输入信息!");
getchar();
return;
}
void append() //以下代码是输入数据功能
{
struct record info;
FILE *fp;
char ask;
if((fp=fopen("address","ab"))==NULL)
{
printf("can't open file!\n");
return;
}
while(1)
{
printf("\n\n");
fflush(stdin);
printf("输入通讯录记录\n");
printf("姓名: ");
gets(info.name);
printf("年龄: ");
scanf("%d",&info.age);
getchar();
printf("电话: ");
gets(info.tele);
printf("所在城市: ");
gets(info.city);
printf("所在单位: ");
gets(info.units);
printf("备注: ");
gets(info.note);
fwrite(&info,sizeof(struct record),1,fp);
printf("继续输入记录吗?(Y/N)");
ask=getchar();
getchar();
if(ask!='y'&&ask!='Y')
break;
}
fclose(fp);
return;
}
void display() //以下全部代码就是调用case‘2’的代码,我觉得是文件的读入问题,但不懂怎么改,有劳哪位前辈帮解答,不胜感激
{
struct record info[M];
FILE *fp;
char ask;
int i=0;
if((fp=fopen("address","rb"))==NULL)
{
printf("can't open file!\n");
return;
}
while(!feof(fp))
fread(&info[i++],sizeof(struct record),1,fp);
while(1)
{
printf("\n\n");
disp_str(' ',10);
printf("显示通讯录信息(共有%d条记录)\n",i);
disp_str('*',50);
putchar('\n');
disp_str(' ',17);
printf("1.按自然顺序显示 \n");
disp_str(' ',17);
printf("2.按排序顺序显示 \n");
disp_str(' ',17);
printf("3.退出显示程序 \n");
disp_str('*',50);
putchar('\n');
disp_str(' ',16);
printf("请输入代码选择(1~3)");
ask=getchar();
if(ask=='3')
{
fclose(fp);
return;
}
else if(ask=='1')
disp_arr(info,i);
else if(ask=='2')
sort(info,i);
}
}
void disp_arr(struct record info[],int n)
{
char press;
int i;
for(i=0;i<n;i++)
{
if(i%20==0)
{
printf("\n\n");
disp_str(' ',25);
printf("我 的 通 讯 录 \n");
disp_str('*',78);
printf("\n");
printf("序号 ");
disp_table();
}
printf("%3d",i+1);
disp_row(info[i]);
if((i+1)%20==0)
{
disp_str('*',78);
printf("\n");
printf("按回车键继续显示下一屏,按其他键结束显示!\n");
printf("请按键...");
press=getchar();
getchar();
if(press!='\n')
break;
}
}
disp_str('*',78);
printf("\n");
printf("按任意键继续...");
getchar();
return;
}
void disp_row(struct record row)
{
printf("%-12s%-12s%-15s%-15s%-16s%-4d%-s\n",row.name,row.tele,row.city,row.units,row.age,row.note);
return;
}
void sort(struct record info[],int n)
{
char ask;
while(1)
{
printf("\n\n");
disp_str(' ',16);
printf("通 讯 录 排 序\n");
disp_str('*',50);
putchar('\n');
disp_str(' ',17);
printf("1.按姓名排序 \n");
disp_str(' ',17);
printf("2.按城市排序 \n");
disp_str(' ',17);
printf("3.返回上一层 \n");
disp_str('*',50);
putchar('\n');
disp_str(' ',16);
printf(" 请输入号码选择(1~3)");
ask=getchar();
getchar();
if(ask=='3')
break;
else if(ask=='1')
sort_name(info,n);
else if(ask=='2')
sort_city(info,n);
}
return;
}
void sort_name(struct record info[],int n)
{
int i,j;
struct record info_t[M],temp;
for(i=0;i<n;i++)
info_t[i]=info[i];
for(i=1;i<n;i++)
for(j=0;j<n-i;j++)
{
if(strcmp(info_t[j].name,info_t[j+1].name)>0)
{
temp=info_t[j];
info_t[j]=info_t[j+1];
info_t[j+1]=temp;
}
}
disp_arr(info_t,n);
return;
}
void sort_city(struct record info[],int n)
{
int i,j;
struct record info_t[M],temp;
for(i=0;i<n;i++)
info_t[i]=info[i];
for(i=1;i<n;i++)
for(j=0;j<n-i;j++)
{
if(strcmp(info_t[j].city,info_t[j+1].city)>0)
{
temp=info_t[j];
info_t[j]=info_t[j+1];
info_t[j+1]=temp;
}
}
disp_arr(info_t,n);
return;
}
void disp_table()
{
printf("姓 名");
disp_str(' ',6);
printf("电 话");
disp_str(' ',6);
printf("城 市");
disp_str(' ',9);
printf("单 位");
disp_str(' ',8);
printf("年 龄");
disp_str(' ',2);
printf("备 注\n");
return;
}