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.
- 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");
- Implentare in un programma C il calcolo della radice quadrata di
un numero p mediante il
seguente algoritmo:
- x=1
- fintanto che | x*x - p | /p > 1.0e-6 iterare la
seguente
riassegnazione di valore a x ( | ... | indica il valore
assoluto):
x = (x*x + p)/(2*x)
- il valore finale di x corrisponderà ad un'
approssimazione
della radice quadrata di p con precisione relativa 1.0e-6 (si
ricorda che la scrittura 5.2e-3 equivale a 5.2 10-3) .
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é?
- 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.
- 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.
- 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.
- 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.
- 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;
}
- 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++);
}