Programmazione.html.it

  Home page

   Guida Base

   Guida al Java

   Guida al C

   Guida al C++

   Guida al Delphi

   Guida a VB .NET

   Guida al Visual Basic

   Guida al Python

   Guida al'UML

  Forum di discussione
  HTML.it




Guida al linguaggio C
  LEZIONE:  Tipi di Dati avanzati - I


Lezione 12 - Tipi di Dati avanzati
Una volta presa dimestichezza con le principali caratteristiche del C si possono utilizzare dei tipi di Dati avanzati. Qui di seguito presentiamo i tipi di dati avanzati del C, ovvero tipi non semplici nella loro rappresentazione, e per questo spiegati nel dettaglio.

Strutture
Le strutture del C sono simili ai record del Pascal e sostanzialmente permettono un'aggregazione di variabili, molto simile a quella degli array, ma a differenza di questi non ordinata e non omogenea (una struttura può contenere variabili di tipo diverso). Per denotare una struttura si usa la parola chiave struct seguita dal nome identificativo della struttura, che è opzionale. Nell'esempio sottostante si definisce una struttura "libro" e si crea un'istanza di essa chiamata "biblio":

// dichiarazione della struct
struct libro
   {
      char titolo[100];
      char autore[50];
      int anno_pubblicazione;
      float prezzo;
   };

//dichiarazione dell'istanza biblio
struct libro biblio;

La variabile "biblio" può essere dichiarata anche mettendo il nome stesso dopo la parentesi graffa:

// dichiarazione della struct e della variabile biblio
struct libro
   {
      char titolo[100];
      char autore[50];
      int anno_pubblicazione;
      float prezzo;
   } biblio;

mentre è possibile pre-inizializzare i valori, alla dichiarazione, mettendo i valori (giusti nel tipo) compresi tra parentesi graffe:

struct libro biblio = {"Guida al C", "Fabrizio Ciacchi", 2003, 45.2};

Per accedere alle variabili interne della struttura si usa l'operatore "."; una volta che si può accedere ad una variabile interna questa può essere trattata e/o manipolata come qualsiasi altra variabile:

// assegna un valore al prezzo del libro
biblio.prezzo = 67.32;

// assegna ad una variabile int l'anno di pubblicazione del libro
int anno = biblio.anno_pubblicazione;

// stampa il titolo del libro
printf ("%s \n", biblio.titolo);


Nuovi tipi di dato
Per definire nuovi tipi di dato viene utilizzata la funzione typedef. Con typedef e l'uso di struct è possibile creare tipi di dato molto complessi, come mostrato nell'esempio seguente:

typedef struct libro
   {
      char titolo[100];
      char autore[50];
      int anno_pubblicazione;
      float prezzo;
   } t_libro;

t_libro guida={"Guida al C", "Fabrizio Ciacchi", 2003, 45.2};

In questo modo abbiamo definito un nuovo tipo di nome "t_libro", che non è altro che una struttura; "guida" è la variabile creata di tipo "t_libro"; come per ogni altro tipo di dato, anche con "t_libro" si possono creare degli array:

t_libro raccolta[5000];

e, per accedervi, o per inizializzare i valori, è sufficiente utilizzare l'indice per identificare l'elemento dell'array ed il punto (.) per accedere alle variabili interne del tipo "t_libro";

// assegna un valore al prezzo del 341o libro
raccolta[340].prezzo = 67.32;

// assegna ad una variabile int l'anno di pubblicazione del 659o libro
int anno = raccolta[658].anno_pubblicazione;

// stampa il titolo del 23o libro
printf ("%s \n", raccolta[22].titolo);

Unioni
Il tipo di dato union serve per memorizzare (in istanti diversi) oggetti di differenti dimensioni e tipo, con, in comune, il ruolo all'interno del programma. Si alloca la memoria per la più grande delle variabili, visto che esse non possono mai essere utilizzate contemporaneamente (la scelta di una esclude automaticamente le altre), condividendo il medesimo spazio di memoria. In C una unione viene definita tramite la parola chiave union, come mostrato di seguito:

union numero
   {
      short numero_piccolo;
      long numero_lungo;
      double numero_grande;
   } numeri;

Una unione è molto simile ad una struttura, ed è medesimo il modo di accedervi. Inoltre, usata in combinazione con una struttura, si possono ottenere gradevoli effetti in cui viene selezionato automaticamente il tipo giusto della union:

typedef struct
   {
      int max_passeggeri;
   } jet;

typedef struct
   {
      int max_altezza;
   } elicottero;

typedef struct
   {
      int max_carico;
   } aereocargo;

typedef union
   {
      jet un_jet;
      elicottero un_elicottero;
      aereocargo un_aereocargo;
   } velivolo;

typedef struct
   {
      tipo_velivolo tipo;
      int velocita;
      velivolo descrizione;
   } un_velivolo;

In questo esempio viene definita un'unione di nome "velivolo" che può essere un jet, un elicottero o un aereocargo. Nella struttura "un_velivolo" c'è un oggetto che identifica il tipo e che permette di selezionare la struttura giusta al momento giusto.






Torna a inizio pagina