- Scrivere un algoritmo per calcolare l'area di un triangolo Variabili: base, altezza, area. Insieme di definizione: numeri reali LEGGI base e altezza area = base * altezza / 2 SCRIVI area - Algoritmo per scambiare 2 variabili a e b Variabili: a, b, tmp. Insieme di definizione: ? LEGGI a e b tmp = a a = b b = tmp SCRIVI a e b - Algoritmo per verificare se un numero e' pari o dispari Variabili: n, r. Insieme di definizione: numeri naturali LEGGI n r = n % 2 (resto della divisione intera fra n e 2) se (r = 0) allora SCRIVI "pari" altrimenti SCRIVI "dispari" - Algoritmo per verificare se un numero e' positivo Variabili: n. Insieme di definizione: numeri interi Leggi n se (n > 0) allora SCRIVI "Positivo" altrimenti SCRIVI "Negativo o nullo" Nota: nel costrutto di selezione visto parlando di Bohm Jacopini, la clausola "altrimenti" e' obbligatoria! E se avessimo voluto un algoritmo che scrive qualcosa solo se il numero e' positivo? Leggi n se (n > 0) allora SCRIVI "Positivo" altrimenti non fare niente Per semplificare un po' la scrittura, clausole del tipo "altrimenti non fare niente" vengono normalmente omesse! - Scrivi i primi 10 numeri naturali Variabili: i. Insieme di definizione: numeri naturali i = 0 mentre (i < 10) ripeti i = i + 1 SCRIVI i Nota: questo algoritmo scrivi i numeri da 1 a 10... Come si modifica per scrivere i numeri da 0 a 9? Si poteva scrivere il ciclo in modo diverso? - Algoritmo per convertire un numero da base 10 a base B Variabili: n, cifra. Insieme di definizione: numeri naturali LEGGI n mentre (n > 0) ripeti cifra = n % B (resto della divisione intera n / B) SCRIVI cifra a sinistra delle cifre scritte in precedenza n = n / B (divisione intera) Nota: "scrivi a sinistra delle cifra precedenti"... Non troppo formale. - Algoritmo per calcolare la media di n numeri reali Variabili: n, i. Insieme di definizione: numeri naturali somma, numero, media. Insieme di definizione: numeri reali LEGGI n i = 0 mentre (i < n) ripeti LEGGI numero somma = somma + numero i = i + 1 media = somma / n SCRIVI media Tutto ok? Uhm... Veramente no... L'algoritmo contiene un errore. Riuscite a vederlo? (suggerimento: qual'e' il valore iniziale della variabile somma?) Altro problema... E cosa succede se l'utente immette 0 come valore per la variabile n? - Algoritmo: dati i tre lati di un triangolo, decidere se e' equilatero isoscele o scaleno Variabili: lato1, lato2, lato3. Insieme di definizione: numeri reali LEGGI lato1, lato2 e lato3 se ((lato1 = lato2) and (lato1 = lato3)) allora SCRIVI "Equilatero!" altrimenti se ((lato1 = lato2) o (lato2 = lato3) o (lato1 = lato3)) allora SCRIVI "Isoscele!" altrimenti SCRIVI "Scaleno" - Convertire l'algoritmo per la risoluzione di equazioni di secondo grado in un programma C Prima di tutto, proviamo una conversione "brutale" dell'algoritmo, parola per parola: #include <stdio.h> #include <math.h> int main() { double a; double b; double c; double delta; /* In teoria, LEGGI a,b,c... */ /* In pratica, non abbiamo ancora visto funzioni di ingresso */ a = 1; b = 5; c = 4; delta = b * b - 4 * a * c; if (delta < 0) { printf("Non esistono radici reali\n"); return 0; } if (delta == 0) { double x; x = -b / (2 * a); printf("Due soluzioni reali e coincidenti: %f\n", x); return 0; } else { double x1; double x2; x1 = (-b - sqrt(delta)) / (2 * a); x2 = (-b + sqrt(delta)) / (2 * a); printf("Due soluzioni reali e distinte: %f %f\n", x1, x2); } return 0; } Nota: questo programma va compilato aggiungendo l'opzione "-lm" alla linea di comando di gcc, perche' usa la funzione "sqrt()" (notare "#include <math.h>") Notare inoltre che questo programma non e' strutturato: ha un solo inizio ma piu' di una fine!!! (piu' di uno statement "return"). Riscriviamolo come programma strutturato: #include <stdio.h> #include <math.h> int main() { double a; double b; double c; double delta; /* In teoria, LEGGI a,b,c... */ /* In pratica, non abbiamo ancora visto funzioni di ingresso */ a = 1; b = 5; c = 4; delta = b * b - 4 * a * c; if (delta < 0) { printf("Non esistono radici reali\n"); } else { if (delta == 0) { double x; x = -b / (2 * a); printf("Due soluzioni reali e coincidenti: %f\n", x); } else { double x1; double x2; x1 = (-b - sqrt(delta)) / (2 * a); x2 = (-b + sqrt(delta)) / (2 * a); printf("Due soluzioni reali e distinte: %f %f\n", x1, x2); } } return 0; }