Laboratorio di Informatica I: Programmazione. AA 2002/03.
Esercitazione n. 5

Scopo di questa esercitazione è di familiarizzarsi con operazioni su allocazione dinamica della memoria, stringhe, arrays, strutture, union, lettura e scrittura con files.

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


     
  1. Data le  seguenti dichiarazioni delle stringhe  s1 ed s2:
      
    char s1[20]="Pippo";
    char s2[30];
    verificare ed interpretare il risultato  di
     sizeof(s1)
    sizeof(s2)
    strlen(s1)
    strlen(s2)
     
     Copiare quindi la stringa s1 su s2 mediante la function di libreria strcpy. (Utilizzarla come:strcpy(s2,s1); ) Ristampare il risultato di 
     strlen(s2)
    Infine dichiarare un puntatore a caratteri, pc, allocare memoria con l' istruzione
    pc = (char *)malloc(...);
    
    Dove   al posto dei puntini, nella chiamata a malloc, va data la lunghezza della stringa che vogliamo utilizzare (la possiamo ricavare dai dati ottenuti fin qui). Infine copiare s1 nell' area riservata a pc e visualizzare la stringa mediante pc.

  2. Definire (mediante le istruzioni typedef  e struct) un nuovo tipo dato di nome Complex corrispondente ai numeri complessi dell' algebra. La struttura corrispondente dovra' avere 2 campi float di nome real e imag. Definire due function, a valori Complex, che calcolino la somma ed il prodotto di due numeri di tipo Complex secondo le regole dell' aritmetica dei  numeri complessi (se z1 = (x1,y1) e z2 = (x2,y2)  z1+z2 = (x1+x2,y1+y2) e z1*z2=(x1*x2-y1*y2,x1*y2+x2*y1) ) 

  3. Modificare opportunamente il programma usato per ordinare una sequenza di numeri (Esercitazione n.  4 esercizio n.4 ) in modo da poterlo impiegare sotto forma di function per ordinare sequenze di stringhe secondo l' ordine lessicografico (quello del dizionario).

  4. Definire un array di 10 variabili di tipo struttura formata da due campi  alfabetici per nome e cognome di persona. Leggere le 10 variabili da standard input ,(es.  scanf("%s%s",&persona[i].nome,&persona[i].cognome); Quindi usare la function di cui all' esercizio precedente, per ordinare l' array sulla base dei nomi o dei cognomi. Scrivere i dati cosi' ordinati su standard output. Infine usare il meccanismo delle ridirezioni Unix per leggere da un file contenente nomi e cognomi e scrivere gli elenchi ordinati su files.

  5. Utilizzare una union contenente un campo int ed uno float per verificare il contenuto di bits di una variabile  float  secondo lo schema dell' esercitazione n.3, es.n.7.

  6. 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 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).