// inizio esercizio
#include <stdio.h> // per printf()
#include <string.h> // per le funzioni di gestione delle stringhe
#include <stdlib.h> // per malloc()
#define NUM_LIBRI 40
/*
La dichiarazione del nuovo tipo viene effettuata FUORI dal corpo di main(), in modo tale che questa dichiarazione sia visibile a tutto il codice. Questo ci sarà utile nel momento in cui utilizzeremo delle funzioni per gestire le strutture.
*/
struct temp{char titolo[100];
char *autore;
int collocazione;};
typedef struct temp libro;
int main()
{int i=0;
char temp[4];
libro elenco[30];
// ciclo di inizializzazione
for(i = 0;i < 30 ; i++)
{
// inizializzo a 0 tutti i membri collocazione
elenco[i].collocazione = 0 ;
// assegno al primo elemento di ciascun array di char il valore '\0'
elenco[i].titolo[0] = '\0' ;
// o, in modo analogo
* ( elenco[i].titolo ) = '\0' ;
// allocazione di memoria
elenco[i].autore = (char *) malloc ( sizeof(char) * (50 + 1) );
}
// fine ciclo di inizializzazione
/* Ora l'utente deve iniziare ad inserire i valore. Per evitare che inserisca più valori di quanti ne siano disponibili implemento questa parte di codice con un ciclo for(); per lasciare all'utente la possibilità di uscire in qualsiasi momento eseguo un controllo all'interno del ciclo. */
// ciclo di assegnazione
for( i = 0 ; i < 30 ; i ++ )
{
printf(" Vuoi inserire autore e titolo di un libro ? (s/n)");
scanf("%s",temp);
// Perché ho usato una stringa e non un char ?
if( strncmp(temp,"s",1) == 0 ) break; // in questo modo anche sì viene accettato
printf("\n Inserisci il titolo del libro (max 100 car.)");
gets( elenco[i].titolo ) ;
printf("\n Inserisci nome e cognome dell'autore del libro (max 50 car.)");
gets( elenco[i].autore ) ;
printf("\n Inserisci la collocazione del libro");
scanf("%d", & ( elenco[i].collocazione ) ); // uso & perché il parametro è un int
}
// fine ciclo di assegnazione
/*
inizio ciclo di visualizzazione; devo stampare SOLO gli elementi dell'array in cui l'utente ha inserito titolo, autore e collocazione.
Distinguo tali elementi dagli altri sia perché la loro collocazione è diversa da zero sia perché la stringa titolo inizia con un carattere diverso da '\0'
*/
for(i = 0 ; i < 30 ; i ++ )
{
/* effettuiamo il riconoscimento degli elementi inizializzati a partire dal valore dell'elemento collocazione della struttura */
if(elenco[i].collocazione == 0) break;
printf("Il titolo del libro e\' : %s \n", elenco[i].titolo ) ;
printf("L\'autore del libro e\' : %s \n", elenco[i].autore ) ;
printf("La collocazione del libro e\' : %d \n", elenco[i].collocazione ) ;
}
// fine ciclo di visualizzazione
return 0;}
// fine esercizio