Anno accademico 2001-2002
Politecnico di Torino – sezione di Alessandria
Laboratorio di Informatica
10-10-2001
Corso A Corso B
Concetto di modello: risultati, dati, limiti, algoritmo
Esempi proposti e risolti
insieme con discussione.
Problema: Risoluzione
equazione 2° grado
Risultati: |
nessuna
soluzione, due soluzioni distinte,
due soluzioni coincidenti. |
Dati:
|
a, b, c
|
Limiti: |
a < > 0 |
Algoritmo:
leggi a, b, c
se a = = 0
errore nei dati
altrimenti
calcola delta à delta = b^2 – 4*a*c
se delta < 0
scrivi nessuna soluzione
altrimenti
x1 = (-b + radice(delta)) / (2 * a)
x2 = (-b - radice(delta)) / (2 * a)
scrivi x1, x2
risultato: |
triangolo eq, iso, scaleno,
nessun triangolo |
dati: |
l1, l2, l3 |
limiti: |
l1 > 0 AND l2 > 0 AND l3 > 0 |
Algoritmo:
RIPETI
LEGGI l1, l2, l3
SINO A QUANDO l1 > 0 AND l2 > 0
AND l3 > 0
SE
l1+l2 > l3 and l2+l3>l1
and l1+l3>l2
Scrivi triangolo
Se l1 = = l2 and l2 = = l3
Scrivi equilatero
Altrimenti
Se l1 == l2 or l2==l3 or l3== l1
Scrivi iso
Altrimenti
Scrivi scaleno
Altrimenti
Scrivi non è un triangolo
17-10-2001
Corso A Corso B
Problema: Dati 3 numeri
individuare il tipo di triangolo
Obiettivo. Risultato. Dati: Limiti: |
Classificare eventualmente i triangoli Scaleno, eq, is, non triangolo l1, l2, l3 l1, l2, l3 > 0 L3 < l1 + l2 AND l1 < l2 +
l3 AND l2 < l1 + l3 |
ripeti LEGGI l1, l2, l3 Fino a
quando l1 > 0 AND l2 > 0 AND l3 > 0 Se L3 >= l1 + l2 OR
l1 >=l2 + l3 OR l2 >= l1 + l3 SCRIVI non è un triangolo altrimenti Se l1 == l2 AND l2 == l3 Scrivi triangolo equilatero altrimenti Se l1
== l2 OR l2 == l3 OR l3 == l1 Scrivi triangolo is Altrimenti Scrivi triangoloScaleno |
do {
scanf(“%d %d %d”, &l1, &l2, &l3); }while( (l1 <=0) || (l2
<=0) || (l3 <= 0) ); if( (l3 >= l1 + l2) || (l1 >=l2 + l3) || (l2 >= l1 + l3 ) ) printf(“non è un triangolo”); else if (( l1 == l2 )
&& ( l2 == l3 )) printf(“triangolo
equilatero”); else if ((l1 == l2) || (l2 == l3) || (l3 == l1)) printf(“triang. Is”); else printf(“triang. scal”); |
Utilizzo Turbo C++ per il test del programma.
Corso A Corso B
Rappresentazione dei numeri con notazione scientifica.
Risultato: Dati: |
r1 r2 con r1 = (a+b)+c r2=a+(b+c) a, b, c |
Algoritmo:
Leggi a, b, c R1 = a +
b R1 = r1 +
c R2 = b +
c R2 = a + r2 Srivi r1, r2 |
#include
<stdio.h> main()
{ float r1, r2, a, b, c;
printf("ok. "); scanf("%f %f %f",
&a, &b, &c); r1 = a + b; r1 = r1 + c; r2 = b + c; r2 = a + r2; printf("R1 = %f \n", r1); printf("R2
= %f \n", r2); } Testato il programma con 1e20, -1e20, 12345 |
Discussione del codice con particolare riferimento ai due cicli while.
main() {
double err1=1.0, err2;
while( (1 + err1) > 1)
err1 = err1 / 2;
while( (1 + err1) == 1) {
err2 = err1;
err1 = err1 * 1.01;
}
printf("Errore relativo 1 = %e\nErrore relativo 2 = %e\n", err1, err2);
}
Solo Corso A
Problema: dati n numeri
contare i pari e i dispari.
Risultati: Dati: Limiti: |
pari, dispari n, numero n > 0 |
Algoritmo:
Leggi n Mentre n < 0 Scrivi errore Leggi n Per n volte Leggi numero Se resto = 0 Pari ++ Altrimenti Dispari ++ Scrivi pari dispari |
#include <stdio.h> main() { int n, numero, pari =0, dispari =0, i;
scanf("%d", &n); while( n < 0 ) { printf(" errrrrrorrrre"); scanf("%d", &n); } for(i=1 ;
i<= n; i++){ scanf("%d", &numero); if( numero % 2 == 0) pari++; else dispari++; } printf("I pari sono %d \n", pari); printf("I dispari sono %d \n", dispari); } |
leggo a, b, c Se a == 0 Errore nei dati altrimenti calcolo delta se delta < 0 scrivo impossibile altrimenti x1 = (-b + radice(delta)) / (2 * a) x2 = (-b - radice(delta)) / (2 * a) scrivi x1, x2 |
#include <stdio.h> #include <math.h> main() { float a, b, c,
delta, x1, x2; scanf("%f %f %f", &a, &b, &c); if (a == 0) printf("errore nei dati"); else { delta = b * b - 4 * a *c; if(delta < 0) printf(" eq
impossibile "); else { x1 = (- b +
sqrt(delta) ) / ( 2 * a ); x2 = (- b -
sqrt(delta) ) / ( 2 * a ); printf("x1 =
%f\n", x1); printf("x2 =
%f\n", x2); } } } |
Il programma è stato testato con vari valori.
Discussione con 1, 10000, -1 perché una soluzione = 0.
31-10-2001
Corso A Corso B
Puntualizzazione sui tipi predefiniti
char |
short int |
int |
long int |
unsigned
char |
unsigned
short int |
unsigned
int |
unsigned
long int |
float |
double |
--- |
--- |
Problema: calcolare la
media aritmetica di n numeri.
Risultato: Dati: Limiti: Algoritmo: |
media n numero n > 0 |
leggi n mentre n<0 leggi n per n volte leggi numero somma = somma + numero media = somma / n scrivi media |
#include
<stdio.h> main() í int n, i; float soma=0, media, numero; scanf(“%d”, &n); while (n <= 0) scanf(“%d”, &n); for(i=1; i<=n; i++) í scanf(“%f”,&numero); somma = somma + numero; ý media = somma / n; printf(“media = %f\n”, media); ý |
Ricordando che la funzione scanf restituisce il numero di conversioni corrette che è riuscita a compiere, il problema precedente si può risolvere nel seguente modo:
#include
<stdio.h> main() í int n=0; float soma=0, media, numero; while ( scanf(“%f”, &numero) == 1) í n++; somma = somma + numero; ý media = somma / n; printf(“media = %f\n”, media); ý |
Per interrompere la lettura dei dati si deve scrivere ctrl^ d sui computer UNIX e ctrl^ z in ambiente MICROSOFT.
Problema: dati n numeri contare i pari e i dispari.
Risultato: Dati: Limiti: Algoritmo: |
pari dispari n numero n > 0 |
leggi n mentre n < 0 leggi n per n volte leggi numero se è_pari(numero) pari++ altrimenti dispari++ scrivi pari dispari |
#include <stdio.h> main() í int n,
i, pari=0, dispari=0, numero;
scanf(“%d”, &n); while (n <= 0) scanf(“%d”, &n);
for(i=1; i<=n; i++) í
scanf(“%f”,&numero);
if(numero % 2 == 0) pari++;
else dispari++; ý
printf(“\npari = %d\dispari = %d\n”, pari,dispari); ý |
Ricordando che la funzione scanf restituisce il numero di conversioni corrette che è riuscita a compiere, il problema precedente si può risolvere nel seguente modo:
#include
<stdio.h> main() í int pari=0, dispari=0, numero; while ( scanf(“%f”, &numero) == 1) if(numero % 2 == 0) pari++; else dispari++; printf(“\npari = %d\dispari = %d\n”, pari,dispari); ý |
Per interrompere la lettura dei dati si deve scrivere ctrl^ d sui computer UNIX e ctrl^ z in ambiente MICROSOFT.
Problema: contare le vocali tra n caratteri
Risultato: Dati: Limiti: |
vocale n, caratteri n >0 |
leggi n mentre n<0 leggi n per n volte leggi carattere if(vocale(carattere)) vocale++ scrivi vocale |
#include
<stdio.h> main()
í int n, i, vocale=0; char
carattere;
scanf(“%d”, &n); while (n <= 0) scanf(“%d”, &n); for(i=1; i<=n; i++) í
scanf(“%c”,&carattere);
if( (carattere==’A’)||(carattere==’E’)||
(carattere==’I’)||(carattere==’U’)||
(carattere==’O’)||
(carattere==’a’)||(carattere==’e’)||
(carattere==’i’)||(carattere==’u’)||
(carattere==’o’) ) vocale++; ý
printf(“media = %d\n”, vocale); ý |
7-11-2001
Problema: dati n numeri
calcolare la media aritmetica. Risolto come in precedenza.
Problema: Dati n numeri
calcolare la media aritmetica dei pari.
Risultato: Dati: Limiti: Algoritmo: |
media n, numero n>0 |
leggi n mentre n < 0 leggi n per n volte leggi numero se è_pari(numero) pari++ somma = somma + numero media = somma / pari scrivi media |
#include
<stdio.h> main()
í int n, i, pari=0, numero; float
somma, media; scanf(“%d”,
&n); while (n <= 0) scanf(“%d”, &n); for(i=1; i<=n; i++) í
scanf(“%f”,&numero);
if(numero % 2 == 0) pari++; somma=somma+numero; ý
media=somma/pari;
printf(“\media = %f \n”, media); ý |
Versione con interruzione dei dati:
#include
<stdio.h> main() í int pari=0, numero; float somma, media while ( scanf(“%f”, &numero) == 1) if(numero % 2 == 0) í pari++; somma=somma+numero; ý media=somma/pari; printf(“\media = %f \n”, media); ý |
Cosa succede se si dichiara int somma ?
14-11-2001
Introduzione function attraverso esempi.
Problema: calcolare n!
Definizione di fattoriale
0! --> 1
1! --> 1
n! -->
n*(n-1)! à n*(n-1)*(n-2)*
.......* 1
Risultato: fatt Dati: n Limite: n > 0 |
Algoritmo:
leggi n
mentre n < 0
leggi n
fatt = fattoriale( n )
scrivi fatt
dove fattoriale calcola il fattoriale di n. Supponiamo in un primo tempo di avere a disposizione questa funzione, simile q uella utilizzata in un esercizio precedente ( sqrt ) per il calcolo della radice quadrata.
Codifica in c
main(){
int n;
long fatt;
scanf(“%d”, &n);
while ( n < 0 )
scanf(“%d”, &n);
fatt = fattoriale( n );
printf(“Il fattoriale di %d è %ld \n”, n, fatt);
}
fattoriale è una funzione che deve essere definita. Il concetto di funzione è già conosciuto dalla matematica: una relazione tra insiemi che gode di particolari proprietà. Nel caso di fattoriale è una relazione tra int e long. Dato in ingresso un numero int positivo calcola il corrispondente long applicando la definizione di fattoriale:
long fattoriale( int n ) {
long f = 1;
if( (n == 0) || (n == 1) ) return 1; /* inutile. Perchè? */
for( ; n > 1; n--)
f = f * n;
return f;
}
Problema: calcolare a ^ n con n intero positivo ed a qualunque.
Risultato: r Dati: a n Limiti: n > 0 |
Algoritmo:
leggi a
leggi n
mentre n < 0
leggi n
r = eleva( a, n )
scrivi r
Codifica in c
main() {
int n;
double a, r ;
scanf(“%f”, &a);
scanf(“%d”, &n);
while( n < 0 )
scanf(“%d”, &n);
r = eleva( a, n );
printf(“ %f ^ %d = %f \n”, a, n, r);
}
eleva è così definita:
double eleva( double a, int n ) {
double r = 1 ;
for( ; n > 0 ; n--)
r = r * a;
return
r;
}
Questa funzione non prevede il caso 0^0, forma indeterminate. Come si può modificare?