- 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
- iterare, fino a quando | x*x - p | > 1.0e-6 la seguente
riassegnazione di valore a x:
x = (x*x + p)/(2*x)
- il valore finale di x corrisponde ad un' approssimazione
della radice quadrata di p.
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.
Provare a calcolare la radice di 1012 e di 10-12.
Cosa succede se si chiede di calcolare la radice di 2 e si aumenta la
richiesta di precisione ?
- Scrivere un programma che permetta di passare da coordinate
cartesiane a coordinate polari e viceversa. Il programma dovrebbe
chiedere quale delle due conversioni e' desiderata e poi richiedere i
due valori di input. La selezione tra i due tipi di conversione
dovrà essere realizzata mediante uso del costrutto switch-case.
Le formule (in
notazione simile a quella matematica e non secondo la sitassi C)
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 -std=c99 -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 (es. man atan2 ).
- 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';
- L' operatore sizeof
ritorna la dimensione in char di ciascun tipo dati. P. es
il seguente programma
#include <stdio.h>
int main(void){
printf("%d \n",sizeof(int));
return 0;
}
ci informa sulla lunghezza in char (ma su molti sistemi 1 char =
1 byte) 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 byte
delle seguenti costanti letterali : 12,
'f', 123L.
- Scrivere un programma che, partendo dal numero n (di tipo int) 231
- 3, generi 6 numeri 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. 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.