Laboratorio di Programmazione. AA 2007/08.
Esercitazione n. 10

Scopo di questa esercitazione è di familiarizzarsi con strutture, unioni e puntatori a strutture.

Al solito, si suggerisce di creare una directory apposita per i files relativi a questa esercitazione.
.


  1. Definire un tipo dati "punto2D" mediante una struttura contenente due campi float per le coordinate x e y. Definire un secondo tipo dati "segmento2D" come struttura i cui due campi sono di tipo "punto2D". Definire infine una function che torni un float e di argomento "puntatore a  segmento2D" che calcoli la lunghezza del segmento secondo la formula: lunghezza = radice quadrata della somma dei quadrati delle differenze delle cordinate x e y dei due punti estremi dei segmenti. Usarla per calcolare la lunghezza del segmento di estremi (-1,2) e (3,5).

  2. Data una struttura dati così  definita:
     struct scheda
    { char *autore;
    char *titolo;
    int anno;
    };
    allocare dinamicamente memoria per una variabile del tipo struct scheda ed inizializzarla, contestualmente alla dichiarazione, mediante i valori "Dennis Ritchie" (autore), "Il mio primo programma C" (titolo), 1972 (anno). Scrivere quindi i valori dei 3 campi su schermo.

  3. Nel programma precedente, lasciare la sola dichiarazione e inizializzare i tre campi mediante assegnazione (il campo anno) e usando la funzione strcpy (vedi man per l' utilizzo) per le due stringhe.

  4. Rifare l' esercizio precedente usando, al posto della variabile di tipo struct scheda, un puntatore allo stesso tipo dati.

  5. Il seguente programma scrive su standard output la sequenza di bit corrispondene al valore di un intero letto da tastiera.
    #include <stdio.h>
    
    int main()
    {
    int i,intero;
                scanf("%i",&intero);
                for(i = 8*sizeof(intero)-1;  i >= 0;  i--)
                            printf("%d",(intero>>i)&1 );
                printf("\n");
                return 0;
    }
    
    
    
    Compilarlo, verificare che funzioni e studiarne il meccanismo di funzionamento (occorre ricordare il funzionamento degli operatori bit a bit).
    Lo stesso programma non può² essere utilizzato per scrivere la sequenza di bit di un dato di tipo float perchié© gli operatori bit a bit non sono definiti per dati non interi. Utilizzare una unione che contenga la sovrapposizione di uin int e di un float per leggere un float secondo il campo float e poi analizzare i bit usando la componente intera dell' unione come fatto nel programma sopra riportato. Si potrebbe realizzare lo stesso scopo mediante puntatori opportuni ?