Laboratorio di Informatica I: Programmazione. AA 2003/04.
Esercitazione n. 7

Scopo di questa esercitazione è di familiarizzarsi con i puntatori, array, stringhe, strutture e unioni.

Al solito, si suggerisce di creare una directory apposita per i files relativi a questa esercitazione.
Ricordare inoltre che i prototipi delle function di libreria per operare sulle strighe risiedono nel file di header string.h.


     
  1. Dato il seguente programma
       #include <stdio.h>
    int main(){
    float a[4]= { 1.30, 2.30, 3.30, 14.60}, *ip, *iq;
    ip = &a[0];
    iq = ip;
    printf("valore di a[0]: %f,indirizzo di a[0]: %p \n", a[0], &a[0]);
    return 0;
    }
    Aggiungere anche la scrittura di
     *ip, &ip, ip, a (con gli opportuni convertitori di formato)
    e interpretare i risultati. Aggiungere quindi anche la stampa di
     *ip + 3 e  *(ip+3)
    ed interpretare anche questi risultati.

  2. Scrivere un programma che dichiari un array float di 10 elementi e poi legga i valori e ne calcoli la somma dei quadrati (e la scriva).

  3. Scrivere un programma che legga N valori interi in input e li memorizzi in un array e li ordini in ordine crescente mediante bubblesort (si itera per un numero sufficiente di volte l' esame di tutte le coppie  consecutive di elementi  ordinandole  se necessario).  Un modo per "scambiare di posto" due elementi consecutivi dell' array e' il seguente:
    tmp    = a[i];
    a[i] = a[i+1];
    a[i+1] = tmp;




  4. Scrivere un programma che dichiari ed inizializzi due  array a due indici (matrici) di dimensione 2x2 e poi calcoli la matrice prodotto i cui elementi sono dati da

    cij = Somma_su_k_da_1_a_2     aik bkj

    per 1 <= i<= 2 e 1 <= j<= 2

    Tener conto dei diversi limiti degli indici degli arrays C.

  5. Cosa scriverà il seguente programma ?

    #include <stdio.h>

    int main(){
    int i;
    char s1[] = "Immetti un numero";
    for(i=0;i< sizeof(s1); i++)
    printf("%c \n",s1[i]);
    printf("%s \n",s1);
    return 0;
    }

    Modificarlo in modo da introdurre una seconda stringa di lunghezza 40 e copiarvi sopra la stringa s1.


  6. 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)
     
     E se le istruzioni precedenti fossero in una function ?

    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 = 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.

  7. Modificare opportunamente il programma usato per ordinare una sequenza di numeri (esercizio n.3 ) in modo da poterlo impiegare sotto forma di function per ordinare sequenze di stringhe secondo l' ordine lessicografico (quello del dizionario).Suggerimento: per il confronto tra stringhe e per lo scambio, utilizzare le function di libreria strcmp e strcpy la cui modalita' di utilizzo e' reperibile mediante il comando man.


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

  9. Data una struttura dati cosi' definita:
     struct scheda
    { char *autore;
    char *titolo;
    int anno;
    };
    ed un puntatore a struct scheda (di nome ps), allocare dinamicamente memoria per ps e assegnare ai campi i valori "Dennis Ritchie" (autore), "Il mio primo programma C" (titolo), 1972 (anno). Scrivere quindi i valori dei 3 campi su schermo.

  10. Svolgere l' esercizio n. 8 dell' esercitazione n.6 mediante il tipo dati union.