I have problems with the following program which is long to post at once so I will explain what are the problems step by step.
1. Define two structs that represents books and a bookstore as following:

typedef struct
{
 char id[14];
 char title[16];
 int availableNumOfBooksWithSameTitle;
}BOOK;

typedef struct
{
 char bookstoreName[31];
 int totalNumberOfBooksInBookstore;
 BOOK *books;
}BOOKSTORE;
  1. Write a function that reads n books. If the book with previously read ID already exists, then just increment variable availableNumOfBooksWithSameTitle.

    void readBook(BOOK *bk)
    {
     printf("ID: ");
     scanf("%s",bk->id);
     while(strlen(bk->id) != 13)
     {
     printf("Invalid ID length. Try again.\n");
     printf("ID: ");
     scanf("%s",bk->id);
     }
     printf("Title: ");
     scanf("%s",bk->title);
     //Does this variable has to be read, or to keep track of books with the same title?
     printf("Available number of books with the same title: ");
     scanf("%d",&bk->availableNumOfBooksWithSameTitle);
    }
    
    BOOK* readNBooks(int *n)
    {
     /*If the user enters ID which already exists, then
     increment the current number of availableNumOfBook.
     How to implement this?
     */
     do
     {
     printf("n = ");
     scanf("%d",n);
     }
     while(*n < 1);
    
     BOOK *arr;
     arr=(BOOK *)malloc(*n * sizeof(BOOK));
     int i;
     for(i=0; i<*n;i++)
     {
     printf("%d. book: \n",i+1);
     readBook(arr+i);
     }
    
     return arr;
    }
    
  2. Read data about a bookstore.

     void readBookstore(BOOKSTORE *bs)
        {
         //How to get the total num. of all books?
         printf("Bookstore name: ");
         scanf("%s",bs->bookstoreName);
         printf("Total number of books in bookstore: ");
    
    
    
     bs->books=calloc(bs->totalNumberOfBooksInBookstore,sizeof(*bs->books));
     int i;
     for(i=0; /*i < numOfBooksWithDifferentTitle*/ ; i++)
     {
     printf("%d. book:\n",i+1);
     readBook(bs->books+i);
     }
    }
    
  3. Sort data about books in descending order by ID.

       void sortBooks(BOOKSTORE *b)
            {
             //How to get the number of books with different title?
             int i,j;
             for(i=0; /*i < numOfBooksWithDifferentTitle-1*/ ; i++)
             for(j=i+1; /*j < numOfBooksWithDifferentTitle*/ ; j++)
             if(strcmp(b->books[i].id,b->books[j].id) < 0)
             {
             BOOK temp=b->books[i];
             b->books[i]=b->books[j];
             b->books[j]=temp;
             }
            }
    
  4. Allow user to purchase the book from a bookstore if it is available.

     void purchase(BOOK *bk,char *bookTitle)
        {
         //How to check if book with specified title is available?
         if(/*bookExists()*/ && bk->availableNumOfBooksWithSameTitle > 0)
         {
         bk->availableNumOfBooksWithSameTitle--;
         printf("Book %s is sold.",bk->title);
         }
         else
         printf("Book is not available.");
        }
    
  5. Print formatted data about a bookstore.

        void printBookstore(BOOKSTORE *b)
        {
         //How to get the number of books with the same
         //and with different title?
         printf("BOOKSTORE:%s",b->bookstoreName);
         printf("BOOKS:\n");
         printf("NUM BOOK ID  BOOK TITLE  NUM. OF BOOKS WITH THE SAME TITLE\n");
         printf("--- ------------- --------------- ---------------------------------\n");
         int i;
         for(i=0; /*i < numOfBooksWithDifferentTitle*/; i++)
         {
         printf("%2d.",i+1);
         printf("%-13s %-15s %d",b->books[i].id,b->books[i].title,/*numOfBooksWithSameTitle*/);
         printf("\n");
         }
         printf("--- ------------- --------------- ---------------------------------");
        }
    

If someone could reply I would be very thankful.
Full program:

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

typedef struct
{
    char id[14];
    char title[16];
    int availableNumOfBooksWithSameTitle;
}BOOK;

typedef struct
{
    char bookstoreName[31];
    int totalNumberOfBooksInBookstore;
    BOOK *books;
}BOOKSTORE;

void readBook(BOOK *bk);//reads one book
BOOK* readNBooks(int *n);//reads n number of books 
void readBookstore(BOOKSTORE *bs);//reads bookstore with books
void sortBooks(BOOKSTORE *b);//sorts books by descending order of ID
void purchase(BOOK *bk,char *bookTitle);//prints message about successful or unsuccessful purchase
void printBookstore(BOOKSTORE *b);//prints formatted data about bookstore

void readBook(BOOK *bk)
{
       printf("ID: ");
       scanf("%s",bk->id);
       while(strlen(bk->id) != 13)
       {
           printf("Invalid ID length. Try again.\n");
           printf("ID: ");
           scanf("%s",bk->id);
       }
       printf("Title: ");
       scanf("%s",bk->title);

       //Does this variable has to be read, or to keep track of books with the same title?
       printf("Available number of books with the same title: ");
       scanf("%d",&bk->availableNumOfBooksWithSameTitle);
}

BOOK* readNBooks(int *n)
{
          /*If the user enters ID which already exists, then
       increment the current number of availableNumOfBook.
       How to implement this?
       */

   do
   {
       printf("n = ");
       scanf("%d",n);
   }
   while(*n < 1);

   BOOK *arr;
   arr=(BOOK *)malloc(*n * sizeof(BOOK));
   int i;
   for(i=0; i<*n;i++)
   {
       printf("%d. book: \n",i+1);
       readBook(arr+i);
   }

   return arr;
}

void readBookstore(BOOKSTORE *bs)
{
    //How to get the total num. of all books?

    printf("Bookstore name: ");
    scanf("%s",bs->bookstoreName);
    printf("Total number of books in bookstore: ");

    bs->books=calloc(bs->totalNumberOfBooksInBookstore,sizeof(*bs->books));
    int i;
    for(i=0; /*i < numOfBooksWithDifferentTitle*/ ; i++)
    {
        printf("%d. book:\n",i+1);
        readBook(bs->books+i);
    }
}

void sortBooks(BOOKSTORE *b)
{
   //How to get the number of books with different title?

   int i,j;
   for(i=0; /*i < numOfBooksWithDifferentTitle-1*/ ; i++)
        for(j=i+1; /*j < numOfBooksWithDifferentTitle*/ ; j++)
            if(strcmp(b->books[i].id,b->books[j].id) < 0)
            {
                BOOK temp=b->books[i];
                b->books[i]=b->books[j];
                b->books[j]=temp;
            }
}

void purchase(BOOK *bk,char *bookTitle)
{
   //How to check if book with specified title is available? 

   if(/*bookExists()*/ && bk->availableNumOfBooksWithSameTitle > 0)
   {
      bk->availableNumOfBooksWithSameTitle--;
      printf("Book %s is sold.",bk->title);
   }
   else
      printf("Book is not available.");
}

void printBookstore(BOOKSTORE *b)
{
    //How to get the number of books with the same
    //and with different title?

    printf("BOOKSTORE:%s",b->bookstoreName);
    printf("BOOKS:\n");
    printf("NUM BOOK ID       BOOK TITLE      NUM. OF BOOKS WITH THE SAME TITLE\n");
    printf("--- ------------- --------------- ---------------------------------\n");
    int i;
    for(i=0; /*i < numOfBooksWithDifferentTitle*/; i++)
    {
       printf("%2d.",i+1);
       printf("%-13s %-15s %d",b->books[i].id,b->books[i].title,/*numOfBooksWithSameTitle*/);
       printf("\n");
    }
    printf("--- ------------- --------------- ---------------------------------");
}

int main()
{
    BOOKSTORE *bs;
    BOOK bk;
    char *bookTitle

    readBookstore(bs);
    sortBooks(bs);
    purchase(&bk,bookTitle);
    printBookstore(bs);
    free(bs);

    return 0;
}

Edited 9 Months Ago by negru

This article has been dead for over six months. Start a new discussion instead.