Array di strutture

Si possono definire array di un qualsiasi tipo numerico, come int, float, ecc. È però anche possibile definire array di puntatori, e array di strutture. Le regole sono esattamente identiche: un array è una sequenza di variabili di uno stesso tipo, e ogni variabile è identificata da un indice numerico.

Se quindi nel programma il tipo struttura struct Esempio è definito, allora si può definire una variabile di tipo array di strutture, nel seguente modo:

  struct Esempio vett[100];

Questo definisce cento variabili di tipo struttura, ognuna identificata da un indice numerico. Quindi, vett[0] è una variabile struttura, come anche vett[1], ecc.

Il programma seguente array.c risolve usando un array di strutture il problema seguente: dato un file che contiene, per ogni riga, una coppia composta da un intero e una stringa, che rappresentano la dimensione di un file e il suo nome (senza estensione), trovare il nome del file più grande. Per esempio, nel file files.txt il file più grande è puntind, che ha dimensione 12.

Questo esercizio si può risolvere come segue: per ogni file memorizziamo la sua dimensione e il suo nome in una struttura. Quindi, per memorizzare un singolo file, usiamo una struttura con due campi, che sono un intero e una stringa. La definizioe della struttura è quindi la seguente:

struct DimFile {
  int dimensione;
  char nome[100];
};

Procediamo in questo modo: facciamo una scansione del file, memorizzando i dati di ogni file in una struttura di tipo struct DimFile. Dal momento che abbiamo bisogno di un certo numero di variabili di questo tipo, usiamo un vettore di strutture:

  struct DimFile files[100];

Da questo momento in poi, files[0], files[1], ecc sono variabili di tipo struttura. Quindi, quando si legge la prima riga, possiamo memorizzare la dimensione nella variabile intera files[0].dimensione e la il suo nome nella variabile stringa files[0].nome.

Nel dettaglio, il programma risolutivo che usiamo legge tutto il file e lo memorizza nel vettore di strutture. Per trovare il massimo, fa una scansione del vettore, memorizzando nella variabile intera max l'indice del vettore in cui è memorizzato il file più grande incontrato fino ad ora (questa variabile parte a 0, e viene aggiornata ogni volta che si trova un elemento di dimensione maggiore del massimo). Si noti che, essendo max l'indice della struttura che contiene l'elemento più grande del vettore, allora il nome del file più grande è quello memorizzato in files[max].nome, e la sua dimensione si trova in files[max].dimensione.

/*
  Trova il nome del file piu' grande.
Esempio di uso di array di strutture.
*/

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

/* una struttura che contiene la dimensione di
un file e il suo nome */

struct DimFile {
  int dimensione;
  char nome[100];
};

int main() {
  FILE *fd;
  int res;

  struct DimFile files[100];
  int n;

  int i, max;


		/* apre il file */
  fd=fopen("files.txt", "r");
  if( fd==NULL ) {
    perror("Errore in apertura del file");
    exit(1);
  }
  

		/* legge il file */
  n=0;
  while(1) {
			/* legge la dimensione */
    res=fscanf(fd, "%d", &files[n].dimensione);
    if(res!=1)
      break;

			/* legge il nome */
    res=fscanf(fd, "%s", &files[n].nome);
    if(res!=1) {
      printf("Errore in lettura del nome di file\n");
      exit(1);
    }

    n++;
  }



		/* trova il massimo */
  max=0;
  for(i=0; i<=n-1; i++)
    if( files[max].dimensione<files[i].dimensione )
      max=i;


		/* stampa il massimo */
  printf("Il file piu' lungo e' %s. Ha dimensione %d\n",
         files[max].nome, files[max].dimensione);


  return 0;
}