/* manybook.c -- multiple book inventory */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char * s_gets(char * st, int n);
#define MAXTITL 40
#define MAXAUTL 40
#define MAXBKS 15 /* maximum number of books */
struct book { /* set up book template */
char title[MAXTITL];
char author[MAXAUTL];
float value;
};
void show(struct book library[],int count);
int main(void)
{
struct book library[MAXBKS]; /* array of book structures */
struct book temp;
int count = 0;
int index;
printf("Please enter the book title.\n");
printf("Press [enter] at the start of a line to stop.\n");
while (count < MAXBKS && s_gets(library[count].title, MAXTITL) != NULL
&& library[count].title[0] != '\0')
{
printf("Now enter the author.\n");
s_gets(library[count].author, MAXAUTL);
printf("Now enter the value.\n");
scanf("%f", &library[count++].value);
while (getchar() != '\n')
continue; /* clear input line */
if (count < MAXBKS)
printf("Enter the next title.\n");
}
if (count > 0)
{
printf("Here is the list of your books:\n");
show(library,count);
printf("Here is the title list:\n");
for (index = 0; index < count-1; index++)
{
for (int j = 0; j < count-1-index; j++)
{
if(strcmp(library[j].title,library[j+1].title)>0)
{
temp=library[j];
library[j]=library[j+1];
library[j+1]=temp;
}
}
}
show(library,count);
printf("Here is the value list:\n");
for (index = 0; index < count-1; index++)
{
for (int j = 0; j < count-1-index; j++)
{
if(library[j].value>library[j+1].value)
{
temp=library[j];
library[j]=library[j+1];
library[j+1]=temp;
}
}
}
show(library,count);
}
else
printf("No books? Too bad.\n");
return 0;
}
void show(struct book library[],int count)
{
for (int index = 0; index < count; index++)
printf("%s by %s: $%.2f\n", library[index].title,
library[index].author, library[index].value);
}
char * s_gets(char * st, int n)
{
char * ret_val;
char * find;
ret_val = fgets(st, n, stdin);
if (ret_val)
{
find = strchr(st, '\n'); // look for newline
if (find) // if the address is not NULL,
*find = '\0'; // place a null character there
else
while (getchar() != '\n')
continue; // dispose of rest of line
}
return ret_val;
}