Laboratorio di Programmazione. AA 2004/05.
Esercitazione n. 5

Scopo di questa esercitazione è di familiarizzarsi con i costrutti iterativi,  con le principali caratteristiche dell' aritmetica dei computer e  con l' utilizzo di alcune  function C. 

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


     
  1. Scrivere un programma che riscriva su stdout  tutti i caratteri che riceve in input, trasformando le lettere maiuscole in minuscole, finché   non viene dato un punto (.)  come input, nel qual caso termina l' esecuzione del programma. (Per cambiare le maiuscole in minuscole, si può adattare il meccanismo usato nell' esercizio n.5 dell'esercitazione n.4).

  2. Trasformare il seguente ciclo for in cicli equivalenti che utilizzino i costrutti while e do-while. (i e sum sono di tipo dati int).
    for(i=0;i<10;i++)
    { sum += i*i;
    printf("i= %d, sum= %d \n",i,sum);
    }

  3. Realizzare un programma che calcoli le due radici della generica equazione di secondo grado. Tener conto anche dei casi degeneri ( coefficiente zero per il termine quadratico e/o quello lineare dell' equazione).


  4. Per dati di tipo intero, sono definiti gli operatori bit a bit:  ~ (complemento bit a bit: trasforma ogni bit 1 in 0 e viceversa); & (AND bit a bit: viene fatto un and tra ciascun bit del primo operando ed il corrispondente del secondo operando), |  (OR  bit a bit: viene fatto un or tra ciascun bit del primo operando ed il corrispondente del secondo operando), ^ (XOR bit a bit: viene fatto un or esclusivo tra ciascun bit del primo operando ed il corrispondente del secondo operando), >> e << (shift a destra e a sinistra: i bit vengono fatti scorrere nella locazione di memoria di tanti posti verso destra o sinistra quanto indica il secondo operando).  Un AND bit a bit tra una variabile intera x e 1 ( x & 1)  dà come risultato 0 se l'ultimo bit di x è 0  e 1  se vale 1.  

    Utilizzare gli operatori di shift e di AND bit a bit per verificare il valore dei 32 bit di un int scrivendoli   in output. Verificare la rappresentazione degli interi  3,   9,  -1,   231-1, -231

    Modificare il programma per lavorare con i float. Cosa succede ? Perché ?


  5. Trovare, per tentativi, qual è  il più  piccolo float x   ed il più piccolo double y tali che  1+x=1    e 1+y=1. 
  6. (Facoltativo). Trovare, mediante un programma C, tre float,  a,b,c, tali che non valga la proprieta' associativa (  (a+b)+c != a+ (b+c) ) e tre (d,e,f) per cui non valga la propriata' distributiva  ( d*(e+f) != d*e + d*f ).
  7. La costante e (numero di Nepero) è definibile come limite per n che tende ad infinito della successione  (1 + 1/n)n. Scrivere un programma che determini quale valore di n è necessario per ottenere e,rappresentata come float, con la stessa precisione con cui viene calcolata dalla funzione exp(1.0) della libreria matematica. (In pratica si chiede di determinare il valore di n per cui l' espressione float (1 + 1/n)n risulti uguale a exp(1.0)).