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

Scopo di questa esercitazione è di familiarizzarsi con salti condizionati, espressioni, uso di funzioni matematiche e rappresentazioni degli interi.

Al solito, si suggerisce di creare una directory apposita per i files 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(" Caso 1 \n");
    else if ((x == 3) || (x == 4) || (x == 5))
    printf(" Caso 2 \n");
    else if ((x == 6) || (x ==7))
    printf(" Caso 3 \n");
    else if (x == 8)
    printf(" Caso 4 \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 -ansi -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 ?


  3. Cosa scrivera' la istruzione printf? (Cercare di prevederlo prima di eseguire le stesse in un programma).
    int i,j;
    float f;
    char c;
    j=4;
    i= 2.0/3;
    f = (float) 3/2 ;
    printf("%f \n", (j=3, f==i+1?10.4:20.7) );

    E cosa succede se la linea in cui si assegna il valore di f diviene
          f = (float) (3/2);  ?
    
  4. Scrivere un programma che permetta di passare da coordinate cartesiane a  coordinate polari e viceversa. Il programma dovrbbe chiedere quale delle due conversioni e' desiderata e poi richiedere i due valori di input. Le formule sono

    x = r cos(phi)

    y = r sin(phi)

    e

    r = sqrt( x2 + y2 )

    phi = arc tg (y/x)

    L' inclusione della libreria matematica  (da effettuarsi con l' istruzione #include <math.h>   e compilando con "gcc -ansi -pedantic -lm  nomefile.c ") mette a disposizione, oltre alla radice quadrata anche le funzioni trigonometriche dirette e inverse (sin(x),cos(x), atan2(y,x)=arc tg (y/x)). Per maggiori informazioni su ciascuna function man nome_function.

  5. 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 nel range delle minuscole, sia la trasformazione minuscola-maiuscola. Perché funziona?

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


  6. L' istruzione (operatore)  sizeof  ritorna la dimensione in bytes di ciascun tipo dati. P. es   il seguente programma
    #include <stdio.h>

    int main(){
    printf("%d \n",sizeof(int));
    return 0;
    }

    Ci informa sulla lunghezza in bytes del tipo dati int. Modificarlo in modo da ottenere la lunghezza in bytes di ciascun tipo dati  previsto dal linguaggio (v. tabella tipi dati).  Far scrivere anche la  lunghezza in bytes delle seguenti costanti letterali :   3.1415 ,  12,   'f',  123L   (es: sizeof(3.1415)) .

  7. Scrivere un programma che, partendo dal numero n (tipo int)  231  - 3   generi  6 numeri  incrementando n   una unita' alla volta.  (Suggerimento: ricordare l' estensione degli interi di tipo int ).
  8. Modificare il programma del punto precedente in modo da lavorare con una variabile di tipo  unsigned char, partendo dal valore 254. (Per scrivere  unsigned char come numeri occorre usare nella printf il convertitore di formato    %hhd ).
  9. Scrivere un programma C che implementi il calcolo del fattoriale di un intero. 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 n per tutti i numeri naturali non nulli  che lo precedono ( 4! = 4*3*2*1 ).