- 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");
- Implentare in un programma C il calcolo della radice quadrata di
un numero p mediante il
seguente algoritmo:
- x=1
- iterare fintanto che | x*x - p | > 0.000001 la seguente
riassegnazione di valore a x:
x = (x*x + p)/(2*x)
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 ?
- 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); ?
- 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.
- 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';
- 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)) .
- 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 ).
- 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 ).
- 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 ).