Laboratorio di programmazione. AA 2007/08.
Esercitazione n. 5

Scopo di questa esercitazione è di familiarizzarsi con salti condizionati, espressioni, uso di funzioni matematiche e rappresentazioni degli interi, nonché definizione ed uso di function.

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


     
  1. Trasformare il frammento di codice seguente in modo da sostituire gli if-else con un costrutto switch-case.  Inserire in un programma C e verificare.
    if ((x ==1) || (x==2))
    printf(" primo caso \n");
    else if ((x == 3) || (x == 4) || (x == 5))
    printf(" secondo caso \n");
    else if ((x == 6) || (x ==7))
    printf(" terzo caso \n");
    else if (x == 8)
    printf(" quarto caso \n");

  2. Implentare in un programma C il calcolo della radice quadrata di un numero p  mediante il seguente algoritmo:
    Verificare il corretto funzionamento del programma confrontando con il risultato della funzione  sqrt(p).
    L' inclusione della libreria matematica  (da effettuarsi con l' istruzione #include <math.h>   e compilando con "gcc -std=c99 -pedantic -lm  nomefile.c ") mette a disposizione la funzione fabs(x) che fornisce il valore assoluto dell' argomento (di tipo float o double ) x.

    Cosa succede se si chiede di calcolare la radice di 2 e si aumenta la richiesta di precisione relativa (diciamo 1.0e-8) ? Perché?


  3. La seguente sezione di codice  opera su una variabile c di tipo  char  e,  se il carattere corrisponde ad una lettera dell' alfabeto minuscola, la trasforma nella corrispondente maiuscola, altrimenti  il carattere resta inalterato. Notare il modo con cui viene implementato sia il riconoscimento della condizione di avere un carattere nell' intervallo  delle minuscole, sia la trasformazione minuscola-maiuscola. Perché funziona?

    if( (c >= 'a') && (c <= 'z') )
    c = c + 'A' - 'a';


    Scrivere una function di nome toup di prototipo char toup(char); che implementi la trasformazione di cui sopra e usarla in un programma C che legga un carattere alla volta da tastiera e ne mostri la trasformazione attraverso la function toup.

  4. Scrivere un programma che, partendo dal numero n (di tipo int)  231  - 3,   generi i  sei numeri successivi  incrementando n   una unità alla volta.  (Suggerimento:per l' elevazione a potenza il C non ha un operatore dedicato. Si può utilizzare la function della libreria matematica pow(x,y) che ritorna la potenza xy.

  5. Modificare il programma del punto precedente in modo da lavorare con una variabile di tipo  unsigned short, partendo dal valore 216-3. Modificare poi il convertitore di formato, della printf prima trasformandolo in %hd (usa solo i 16 bit dello short int) e poi nel corretto convertitore ( %hu ) che usa solo i 16 bit ma tiene presente l' interpretazione come unsigned e cercare di interpretare i risultati ottenuti.

  6. Scrivere un programma C che implementi il calcolo del fattoriale di un intero attraverso una function ricorsiva. Verificarne il funzionamento con numeri interi crescenti tra 1 e 20. Sono tutti corretti ?  Il fattoriale ( indicato con n! ) di n e' il prodotto di  tutti i numeri naturali da 1 a n   ( 4! = 1*2*3*4 ).
    Controllare da quale valore di n i risultati sono sbagliati.

  7. Cosa scrive il seguente programma ? Fare la previsione e controllarla.
    #include <stdio.h>

    float x=3.4;

    int main(){
    int i;
    float x=2.6;
    float fun( float);
    printf(" x prima del for = %f \n",x);
    for(i=1;i<=5;i++){
    float x= -5.5;
    x = x + 1.0;
    printf(" x nel for, iterazione n. %d, = %f \n",i,x);
    }
    printf(" x dopo il for = %f \n",x);
    x = fun(x);
    printf(" x dopo la chiamata a fun = %f \n",x);
    return 0;
     }
    float fun( float y){
    float x=3.0;
    x = x + y;
    return x;
    }

  8. Variabili di blocco che abbiano la classe di memoria auto ricevono una nuova allocazione di spazio in memoria (ed una nuova riinializzazione) ogni volta che si entra nel blocco. Variabili con classe di memoria static vengono inizializzate solo una volta e poi mantengono locazione e contenuto in memoria. Prevedere cosa scrivera' il seguente programma.
    #include <stdio.h>
    void funa(void);
    void funs(void);

    int main(void)
    {
    int i;
    for(i=1;i<=10;i++)
    {
    funa();
    }
    for(i=1;i<=10;i++)
    {
    funs();
    }
    }

    void funa(void)
    {
    int j=1; //equivale a auto int j=1;
    printf(" j = %d \n",j++);
    }
    void funs(void)
    {
    static int j=1;
    printf(" j = %d \n",j++);
    }