addbook() //增加新书
{
FILE *fp;
int i,j;
if((fp=fopen("book.txt","ab"))==NULL)
{printf("文件打开错误");exit(0);}
for(j=0;j<80;j++)printf("*");
printf("\t 欢迎进入添加书籍系统\n");
printf("请输入新书的书号(1-1000)\n");
scanf("%d",&i);
if (i>1000||i<0)
{
do
{
printf("输入错误,请重新输入\n");
scanf("%d",&i);
}while(i>1000||i<0);
}
fread(&book[i],sizeof(struct book),1,fp);
if(book[i].number==i) //判断书是否已存在
{ printf("当前书已存在,请使用书籍修改系统\n");
getch();
return FALSE;
}
else
book[i].number=i;
printf("请你输入书名\n");
scanf("%s",book[i].name);
printf("请你输入书的作者\n");
scanf("%s",book[i].writer);
printf("请输入新书的类型(只能为玄幻,历史,武侠,言情,诗歌,散文,技术应用之一)\n");
scanf("%s",book[i].sort);
printf("请设为1或0,1代表书还没人借,0表示书已经借出,请勿输入其他数字\n");
printf("请你设定书的状态\n");
scanf("%d",&book[i].turefalse);
fwrite(&book[i],sizeof(struct book),1,fp);
fclose(fp);
return FALSE;
}
void bookcount() //书籍统计函数
{
FILE *fp;
int n=0,m=0,i;
if((fp=fopen("book.txt","rb"))==NULL)
{ printf("文件无法打开");exit(0);}
else
{
for(i=0;i<80;i++)printf("*");
for(i=0;fread(&book[i],sizeof(struct book),1,fp)!=0;i++)
{
if(book[i].number!=i&&strlen(book[i].name)!=0&&strlen(book[i].writer)!=0)
{ n=n+1;
if(book[i].turefalse==0)
{m++;
printf("%-5d%-30s%-8s %-16s无人借阅\n",book[i].number,book[i].name,book[i].writer,book[i].sort);
}
else printf("%-5d%-30s%-8s %-16s已经借阅\n",book[i].number,book[i].name,book[i].writer,book[i].sort);
}
}
}
fclose(fp);
printf("统计情况如下:\n");
printf("目前共有%d本书,其中%d本书已经借出,未借出%d本书\n",n,m,n-m);
}
其中book为结构体数组,小弟发现,统计时候的顺序是杂乱的,是按照输入顺序排列的,如果想按照书号排序,应该怎么办?
是在addbook上抑或bookcount上修改?麻烦大虾指教
添加一个排序函数也行,麻烦帮忙写一下了
按书号排序,book[i],按i排序,随便冒泡,顺序什么方法都无所谓。
最好在输入的时候就
输入一个插一个比较好
输入一个元素->
根据学号找到该元素应该在的位置->
将该元素插入该位置;
这样就可以直接生成一个按学号排好序的链表;本回答被提问者采纳