C pirmer Plus(第五版) 第十四章 课后习题 3



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

#define MAXITL 40
#define MAXAUTL 40
#define MAXBKS 10

struct book{
 char title[MAXITL];
 char author[MAXAUTL];
 float value;
};
int cmp1(const void * a,const void *b)
{

 struct book *c=(struct book*)a;
 struct book *d=(struct book*)b;
 return strcmp(c->title,d->title);
}
int cmp2(const void *a,const void *b)
{
 return (*(struct book *)a).value>(*(struct book *)b).value;
 }
int main(int argc, char **argv)
{
 //printf("hello world\n");
 //
 struct book library[MAXBKS];
 int count=0;
 int index,filecount;
 FILE * pbooks;
 int size=sizeof(struct book);
 
 if((pbooks=fopen("book.dat","a+b"))==NULL)
 {
  fputs("Can't open book.dat file\n",stderr);
  exit(1);
  }
  
 rewind(pbooks);
 while(count<MAXBKS&&fread(&library[count],size,1,pbooks)==1)
 {
  if(count==0)
   puts("Current contents of book.dat:");
  printf("%s by %s:$%.2f\n",library[count].title,library[count].author,library[count].value);
  count++;
 }
 printf("\n");
 filecount=count;
 count=0;
 
 while(count<MAXBKS&&count<filecount)
 {
  qsort(library,filecount,sizeof(struct book),cmp1);
  if(count==0)
   puts("Current contents of book.dat:");
  printf("%s by %s:$%.2f\n",library[count].title,library[count].author,library[count].value);
  count++;
 }
 printf("\n");
 filecount=count;
 count=0;
 while(count<MAXBKS&&count<filecount)
 {
  qsort(library,filecount,sizeof(struct book),cmp2);
  if(count==0)
   puts("Current contents of book.dat:");
  printf("%s by %s:$%.2f\n",library[count].title,library[count].author,library[count].value);
  count++;
 }
 
 if(count==MAXBKS)
 {
  fputs("The book.dat file is full.",stderr);
  exit(2);
  }
 puts("Please add new book titles.");
 puts("Press [enter] at the start of a line to stop.");
 while(count<MAXBKS&&gets(library[count].title)!=NULL&&library[count].title[0]!='\0')
 {
  puts("Now enter the author.");
  gets(library[count].author);
  puts("Now enter the value.");
  scanf("%f",&library[count++].value);
  while(getchar()!='\n')
   continue;
  if(count<MAXBKS)
   puts("Enter the next title.");
  }
 if(count>0)
 {
  puts("Here is the list of your books:");
  for(index=0;index<count;index++)
   printf("%s by %s: $%.2f\n",library[index].title,library[index].author,library[index].value);
  fwrite(&library[filecount],size,count-filecount,pbooks);
 }
 else
  puts("No books?Too bad.\n");
 puts("Bye.\n");
 fclose(pbooks);
 
 return 0;
 
 //printf("Please enter the book title.\n");
 /*gets(library.title);
 printf("Now enter the author.\n");
 gets(library.author);
 printf("Now enter the value.\n");
 scanf("%f",&library.value);
 printf("%s by %s:$%.2f\n",library.title,library.author,library.value);
 printf("%s:\"%s\"($%.2f)\n",library.author,library.title,library.value);*/
 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值