Raccolta di bestseller

Il New York Times pubblica ogni settimana, fin dal 1942, la lista dei libri più venduti nelle librerie americane, i cosiddetti bestseller. Dovete completare il programma in calce, affinché legga e memorizzi alcuni dettagli relativi ai libri più venduti e sappia compiere alcune ricerche su di essi.

Non importa adesso che cerchiate una soluzione efficiente per la ricerca: questo sarà richiesto nell'esercizio successivo! Invece, memorizzate i dettagli relativi ai bestseller tramite un semplice array. Non potete fare assunzioni sul numero di bestseller da memorizzare, quindi il vettore va allocato dinamicamente: cominciate con un numero prefissato di posizioni, e ridimensionate opportunamente quando necessario.

Il programma deve leggere una sequenza di comandi, tra i seguenti:

Nel comando + bestseller, un bestseller è descritto come una stringa formata dalla concatenazione di: titolo, autore, editore, data in cui ha raggiunto la vetta della classifica dei libri più venduti, genere (Fiction oppure Nonfiction). I vari attributi sono separati da un carattere di tabulazione \t. La data è rappresentata nel formato americano mese/giorno/anno.

Per la lettura dei dettagli relativi a un bestseller potete sfruttare la funzione read_tab, che legge da standard input una sequenza di caratteri fino a quando non trova il carattere di tabulazione, memorizza i caratteri letti in una stringa (allocando lo spazio necessario) e ne restituisce l'indirizzo.

L'output del comando ? data deve essere nel formatodata: titolo - autore.

Se lo ritenete utile, potete scrivere anche funzioni aggiuntive.

Esempio

Eseguendo

./soluzione

avendo nel flusso di ingresso le righe:

+ Bring On the Empty Horses	David Niven	Putnam	11/30/1975	Nonfiction
+ Breaking the Surface	Greg Louganis	Random House	3/19/1995	Nonfiction
? 3/19/1995
f

il programma emette sul flusso di uscita:

3/19/1995: Breaking the Surface - Greg Louganis

Esempio

Eseguendo

./soluzione

avendo nel flusso di ingresso le righe:

+ Breaking the Surface  Greg Louganis   Random House    3/19/1995       Nonfiction
+ Bring On the Empty Horses     David Niven     Putnam  11/30/1975      Nonfiction
+ 1st to Die	James Patterson	Little, Brown	3/25/2001	Fiction
+ 2nd Chance	James Patterson	Little, Brown	3/24/2002	Fiction
+ 3rd Degree	James Patterson	Little, Brown	3/21/2004	Fiction
+ 4th of July	James Patterson	Little, Brown	5/22/2005	Fiction
+ 61 Hours	Lee Child	Delacorte	6/6/2010	Fiction
+ A Breath of Snow and Ashes	Diana Gabaldon	Delacorte	10/16/2005	Fiction
+ A Common Life	Jan Karon	Viking	4/29/2001	Fiction
? 6/6/2010
f

il programma emette sul flusso di uscita:

6/6/2010: 61 Hours - Lee Child

Programma da completare

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

//FORMATO: title TAB author TAB publisher TAB mm/dd/yyyy TAB Fiction
typedef struct bestseller {
....
} *Bs;


Bs read_bs(); // legge una riga con i dati di un bestseller
void print_bs( Bs b); // stampa i dettagli di un bestseller


int main(){
  char comando = '\0';
  short int d, m, y;
  ...

  while( (comando = getchar()) != 'f' ) {
    switch( comando ) {

    case '+': // seguito da riga con dettagli su un bestseller
      ...
      break;

    case '?': // seguito da una data. stampa il libro bestseller in quella data
      scanf( "%hd/%hd/%hd", &d, &m, &y);
      ....
      }
      break;

    }
  }

  return 0;
}





// legge da standard input fino a quando non trova un carattere di tabulazione (e ignorando gli spazi iniziali)
char *read_tab( void ) {
  char *p, c;
  int size = 2;
  int n = 0;

  p = malloc( size );
  while ( isspace( c = getchar() ) )
      ;

  while ( c != EOF ) {

    /* se ho terminato lo spazio, raddoppio l'allocazione */
    if ( n >= size ) {
      size *=2;
      //printf( "\nnew size = %d\n", size );
      p = realloc( p, size * sizeof(char) );
    }

    /* memorizzo l'n-esimo elemento */
    if ( c == '\t' ) { /* se leggo '\t', memorizzo '\0' e interrompo */
      p[n] = '\0';
      break;
    }

    p[n++] = c;
    c = getchar();
  }

  //printf( "%s\n", p );
  return p;
}

// legge una riga con i dati di un bestseller e la memorizza in una struttura di cui restituisce l'indirizzo
Bs read_bs(){
  ....
}

// stampa i dettagli di un bestseller
void print_bs( Bs b)
{
....
}