Array di strutture






Esercizio

Utilizzando la struttura avente il seguente prototipo:

struct temp{char titolo[100];
                 char *autore;
                 int collocazione;};

typedef struct temp libro;


implementare un codice in cui si svolgano le seguenti operazioni:

  1. si dichiari un array di strutture di tipo libro
  2. si inizializzino a zero tutti gli elementi collocazione delle strutture facenti parte dell'array
  3. si assegni al primo carattere di ciascun elemento dell' array di char titolo il valore '\0'. Fatto questo, per ciascuno degli elementi autore delle varie strutture si allochi un'area di memoria di dimensione tale da contenere 50 caratteri (terminatore escluso)
  4. si chieda all'utente di assegnare un valore ai membri di ciascuna delle strutture facenti parte dell'array. L'utente deve poter scegliere quando interrompere l'inserimento dei valori.
  5. si visualizzino i valori contenuti negli elementi dell'array di strutture (solo quelli che sono stati modificati dall'utente)







// 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 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