Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 1
Esempio
Problema: risolvere l’equazione di I grado ax+b=0, con i coefficienti a e b numeri reali
Esempio
Analisi e Specifica
Definizione del problema: calcolare la soluzione di un’equazione di I grado ax+b=0, con i coefficienti a e b numeri reali
Definizione dei dati del problema:
I: A, B coefficienti dell’equazione, di tipo reale Pi:
U: X, soluzione dell’equazione, di tipo reale
Pu: per A=0, B <> 0 , x è indefinito, equazione impossibile
per A=0, B=0, equazione indeterminata
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 3
Esempio
Nome variabile Descrizione Tipo
A, B Coefficienti dell’equazione FLOAT
Nome variabile Descrizione Tipo
X Risultato dell’equazione FLOAT
Tabella delle variabili di ingresso
Tabella delle variabili di uscita
Esempio
Progettazione
Descrizione del metodo di elaborazione:
1. sono letti i valori dei coefficienti A e B;
2. se A = 0 e se B< >0 stampare ‘equazione impossibile’
3. se A = 0 e se B=0 stampare ‘equazione indeterminata’
4. se A< >0 si calcola il risultato dell’equazione X= -B/A e lo
si visualizza;
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 5
Esempio
Codifica (LDP)
1. sono letti i valori dei coefficienti A e B;
write (“immetti coefficiente A “);
read (“%f” A);
write (“immetti coefficiente B “);
read (“%f” B);
Esempio
Codifica
2. se A = 0 e se B< >0 stampare ‘equazione impossibile’
3. se A = 0 e se B=0 stampare ‘equazione indeterminata’
if (A=0) then
if (B<>0) then
write (“Equazione Impossibile”) endif
if (B=0) then
write (“Equazione indeterminata”) endif
endif …..
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 7
Esempio
Codifica
2. se A = 0 e se B< >0 stampare ‘equazione impossibile’
3. se A = 0 e se B=0 stampare ‘equazione indeterminata’
... un modo alternativo ...
if ((A=0) and (B<>0)) then
write (“Equazione Impossibile”) endif
if ((A=0) and (B=0)) then
write (“Equazione indeterminata”) endif
…..
Esempio
if (A=0) then
if (B<>0) then
write (“Equazione Impossibile”) endif
if (B=0) then
write (“Equazione indeterminata”) endif
endif …..
if ((A=0) and (B<>0)) then
write (“Equazione Impossibile”)
È equivalente a:
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 9
Esempio Codifica
4. se A< >0 si calcola il risultato dell’equazione X:= -B/A e lo si visualizza;
if (A=0) then ……..
endif
if (A< >0) then begin
X = -B/A;
write (“X = “, “%f” X);
end endif
Risoluzione Equazione I grado - LDP
Program equazioneIgrado;
FLOAT A, B, X;
begin
write (“immetti coefficiente A “);
read (“%f” A);
write (“immetti coefficiente B “);
read (“%f” B);
if (A=0) then
if (B< >0) then
write (“Equazione Impossibile’”
endif
if (B=0) then
write (“Equazione indeterminata”) endif
endif
if (A< >0) then begin X = -B/A;
write (“X = “, “%f” X);
end endif end.
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 11
Risoluzione Equazione I grado - C
#include<stdio.h>
main()
{// questo programma risolve un’equazione di I grado float A, B, X;
printf ("immetti coefficiente A \n");
scanf ("%f", &A);
printf("immetti coefficiente B \n");
scanf ("%f", &B);
if (A==0)
{ if (B!=0)
printf ("Equazione Impossibile \n");
if (B==0)
printf ("Equazione indeterminata \n");
} if (A!=0)
{ X=-B/A;
printf("X = %f \n", X);
} }
Risoluzione Equazione I grado - C
#include<stdio.h>
main()
{ // il programma risolve un’equazione di I grado float A, B, X;
printf ("immetti coefficiente A \n");
scanf ("%f", &A);
printf("immetti coefficiente B \n");
scanf ("%f", &B);
if (A==0) { if (B!=0)
printf ("Equazione Impossibile \n");
if (B==0)
printf ("Equazione indeterminata \n");
}
... bisogna verificare se ci sono errori (specie di tipo logico) nel programma ...
... Bisogna fare il testing ....
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 13
Sviluppo di programmi Analisi e
Specifica
Progettazione
Codifica
Testing
Rilascio
… mediante una serie di fasi …
Definire cosa fa il programma; Individuare e specificare
• dati di ingresso e di uscita
• Precondizioni e postcondizioni Definizione di un dizionario dei dati
Definire come il programma effettuerà l’elaborazione specificata;
Progettazione dell’algoritmo per raffinamenti successivi (stepwise refinement) ... Decomposizione funzionale …
Redazione del programma con il linguaggio di programmazione scelto
Sviluppo di programmi Testing
Una volta effettuata la codifica e la compilazione del programma bisogna
‘testarlo’ per verificare la eventuale presenza di malfunzionamenti nell’esecuzione del programma dovuti a difetti presenti nel codice - Definizione dei casi di prova (casi di test – testcases):
• Definizione/selezione di valori delle variabili di input con cui
‘testare’ (provare) il programma
• Esecuzione del programma
• Verifica dei risultati ottenuti rispetto ai risultati attesi (corretti)
…. Se risultati ottenuti sono diversi da quelli attesi, il test è positivo in quanto ha rilevato un malfunzionamento …
…. Il testing ha lo scopo di rivelare e rilevare i malfunzionamenti …
… rimozione difetti che li causano (Debugging) …
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 15
Sviluppo di programmi Scelta dei casi di prova e verifica
I casi di prova non vanno scelti “a casaccio”
… definire casi di prova che hanno una maggiore probabilità di individuare malfunzionamenti …
l’obiettivo è quello di una verifica il più possibile esaustiva … (NB: in generale però è impossibile effetture un testing esaustivo ...)
… cercare di evitare i casi di prova ridondanti ...
… i casi di prova e i risultati del testing vanno documentati ...
Sviluppo di programmi
I malfunzionamenti sono dovuti a difetti (errori) presenti nel codice del programma
Tipologie di difetti in programmi - Difetti di tipo lessicale/sintattico
• individuati dal compilatore
• dovuti ad errata scrittura o a mancanza di conoscenza delle regole del linguaggio (ad es. mancanza del “;” alla fine di una istruzione)
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 17
Difetti di tipo Logico
Possono essere dovuti ad errori di diverso tipo, commessi durante lo sviluppo del programma:
- Errori nella definizione del problema (fasi di analisi e specifica) - Errori di progettazione (es. nella definizione/scelta dell’algoritmo) -Errori nella stesura (codifica) dei programmi
errata definizione del programma (o sua trascrizione durante la codifica, ad es. scrittura dell’operatore + invece del *)
provocano malfunzionamenti durante l’esecuzione del programma
possono essere difficili da individuare e correggere
Più ‘alta’ è la fase di sviluppo in cui è commesso l’errore generante il difetto più è difficile individuarlo e correggerlo:
correzione degli errori => eliminazione dei difetti => debugging
Sviluppo di programmi
Risoluzione Equazione I grado - C
#include<stdio.h>
main()
{ // il programma risolve un’equazione di I grado float A, B, X;
printf ("immetti coefficiente A \n");
scanf ("%f", &A);
printf("immetti coefficiente B \n");
scanf ("%f", &B);
if (A==0) { if (B!=0)
printf ("Equazione Impossibile \n");
if (B==0)
printf ("Equazione indeterminata \n");
} if (A!=0)
{ X = -B/A;
printf("X = %f \n", X);
} }
... bisogna verificare se ci sono errori (specialmente di tipo logico) nel programma ...
... definiamo i casi di prova ....
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 19
Esempio
Testing
criteri per la scelta dei casi di prova:
• almeno un caso di test (prova) con valori di A e B entrambi < > 0
• un caso di test (prova) con A = 0 e B < > 0
• un caso di test (prova) con A = 0 e B = 0
Risoluzione Equazione I grado - LDP
Supponendo che l’equazione sia:
3x + 9 = 0
Primo caso di prova:
A=3 B=9
Esecuzione ‘carta e penna’
#include<stdio.h>
main()
{ // il programma risolve un’equazione di I grado float A, B, X;
printf ("immetti coefficiente A \n");
scanf ("%f", &A);
printf("immetti coefficiente B \n");
scanf ("%f", &B);
if (A==0) { if (B!=0)
printf ("Equazione Impossibile \n");
if (B==0)
printf ("Equazione indeterminata \n");
}
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 21
A= 0 ? A=3 => FALSO
Risoluzione Equazione I grado - C
Esecuzione ‘carta e penna’
A<>0 A=3 => VERO X = - B/A = - 9/3 = -3 X= - 3
if (A==0) { if (B!=0)
printf ("Equazione Impossibile \n");
if (B==0)
printf ("Equazione indeterminata \n");
} if (A!=0)
{ X = -B/A;
printf("X = %f \n", X);
} }
Risoluzione Equazione I grado - LDP
Primo caso di prova:
3x + 9 = 0 => A=3 - B=9
Esecuzione ‘carta e penna’
#include<stdio.h>
main()
{ // il programma risolve un’equazione di I grado float A, B, X;
1. printf ("immetti coefficiente A \n");
2. scanf ("%f", &A);
3. printf("immetti coefficiente B \n");
4. scanf ("%f", &B);
5. if (A==0) 6. { if (B!=0)
7. printf ("Equazione Impossibile \n");
8. if (B==0)
9. printf ("Equazione indeterminata \n");
10. } 11. if (A!=0)
12. { X = -B/A;
13. printf("X = %f \n", X);
14. }
}
# A B X operazione
1 2 3 4 5 6 7 8 9 10 11 12 13 14
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 23
Risoluzione Equazione I grado - LDP
Primo caso di prova:
3x + 9 = 0 => A=3 - B=9
Esecuzione ‘carta e penna’
#include<stdio.h>
main()
{ // il programma risolve un’equazione di I grado float A, B, X;
1. printf ("immetti coefficiente A \n");
2. scanf ("%f", &A);
3. printf("immetti coefficiente B \n");
4. scanf ("%f", &B);
5. if (A==0) 6. { if (B!=0)
7. printf ("Equazione Impossibile \n");
8. if (B==0)
9. printf ("Equazione indeterminata \n");
10. } 11. if (A!=0)
12. { X = -B/A;
13. printf("X = %f \n", X);
14. }
}
# A B X operazione
1 immetti coefficiente A
2 3 A=3
3 immetti coefficiente B
4 9 B=9
5 A=0 ? Falso
6 7 8 9 10
11 A <> 0? Vero
12 -3 X = -9/3;
13 X=-3
14
#include<stdio.h>
main()
{ // il programma risolve un’equazione di I grado float A, B, X;
printf ("immetti coefficiente A \n");
scanf ("%f", &A);
printf("immetti coefficiente B \n");
scanf ("%f", &B);
Risoluzione Equazione I grado - LDP
Esecuzione ‘carta e penna’
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 25
A= 0 ? VERO
Risoluzione Equazione I grado - LDP
Esecuzione ‘carta e penna’
if (A==0) { if (B!=0)
printf ("Equazione Impossibile \n");
if (B==0)
printf ("Equazione indeterminata \n");
} if (A!=0)
{ X = -B/A;
printf("X = %f \n", X);
} }
A!=0 ?
A=0 => FALSO B<> 0 ?
B = 9 => VERO Equazione Impossibile B==0?
B = 9 => FALSO
Risoluzione Equazione I grado - LDP
Secondo caso di prova:
A=0 - B=9
Esecuzione ‘carta e penna’
#include<stdio.h>
main()
{ // il programma risolve un’equazione di I grado float A, B, X;
1. printf ("immetti coefficiente A \n");
2. scanf ("%f", &A);
3. printf("immetti coefficiente B \n");
4. scanf ("%f", &B);
5. if (A==0) 6. { if (B!=0)
7. printf ("Equazione Impossibile \n");
8. if (B==0)
9. printf ("Equazione indeterminata \n");
10. } 11. if (A!=0)
12. { X = -B/A;
13. printf("X = %f \n", X);
14. }
}
# A B X operazione
1 immetti coefficiente A
2 0 A=0
3 immetti coefficiente B
4 9 B=9
5 A=0 ? Vero
6 B<>0? Vero
7 Equazione Impossibile
8 B=0 ? Falso
9 10
11 A<>0 ? Falso 12
13 14
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 27
#include<stdio.h>
main()
{ // il programma risolve un’equazione di I grado float A, B, X;
printf ("immetti coefficiente A \n");
scanf ("%f", &A);
printf("immetti coefficiente B \n");
scanf ("%f", &B);
Terzo caso di prova:
A = 0 B = 0
Risoluzione Equazione I grado - LDP
Esecuzione ‘carta e penna’
Risoluzione Equazione I grado - LDP
A= 0 ? VERO B<> 0 ?
B = 0 => FALSO
Esecuzione ‘carta e penna’
if (A==0) { if (B!=0)
printf ("Equazione Impossibile \n");
if (B==0)
printf ("Equazione indeterminata \n");
} if (A!=0)
{ X = -B/A;
printf("X = %f \n", X);
A <> 0 ? FALSO B= 0 ? VERO Equazione indeterminata
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 29
Risoluzione Equazione I grado - LDP
Terzo caso di prova:
A=0 - B=0
Esecuzione ‘carta e penna’
#include<stdio.h>
main()
{ // il programma risolve un’equazione di I grado float A, B, X;
1. printf ("immetti coefficiente A \n");
2. scanf ("%f", &A);
3. printf("immetti coefficiente B \n");
4. scanf ("%f", &B);
5. if (A==0) 6. { if (B!=0)
7. printf ("Equazione Impossibile \n");
8. if (B==0)
9. printf ("Equazione indeterminata \n");
10. } 11. if (A!=0)
12. { X = -B/A;
13. printf("X = %f \n", X);
14. }
}
# A B X operazione
1 immetti coefficiente A
2 0 A=0
3 immetti coefficiente B
4 0 B=0
5 A=0? Vero
6 B<>0 Falso
7
8 B=0? Vero
9 Equazione Indeterminata
10
11 A<>0 Falso 12
13 14
Risoluzione Equazione I grado - LDP C1 Primo caso di prova: A=3 - B=9 C2 Primo caso di prova: A=0 - B=9 C3 Primo caso di prova: A=0 - B=0
# C1 C2 C3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<stdio.h>
main()
{ // il programma risolve un’equazione di I grado float A, B, X;
1. printf ("immetti coefficiente A \n");
2. scanf ("%f", &A);
3. printf("immetti coefficiente B \n");
4. scanf ("%f", &B);
5. if (A==0) 6. { if (B!=0)
7. printf ("Equazione Impossibile \n");
8. if (B==0)
9. printf ("Equazione indeterminata \n");
10. } 11. if (A!=0)
12. { X = -B/A;
13. printf("X = %f \n", X);
14. }
} Tutte le istruzioni eseguite almeno 1 volta !!
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 31
Esercizio
Analisi e Specifica
Definizione del problema: Scrivere un programma che ricevuti in input tre numeri interi trova quello con valore massimo Definizione dei dati del problema:
I: i tre numeri di tipo intero Pi: nessuna
Problema: Dati tre numeri interi trovare quello con valore
massimo
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 33
Esempio
Nome variabile Descrizione Tipo
A, B,C I tre numeri interi tra cui INT trovare il massimo
Nome variabile Descrizione Tipo
MAX Il numero con valore massimo INT Tabella delle variabili di ingresso
Tabella delle variabili di uscita
Esempio
Progettazione
Descrizione del metodo di elaborazione:
MAX = ? 5 MAX = 5 7 > MAX = 5 ?
3 > MAX = 7 ? 9 > MAX = 7 ?
… se il terzo valore invece di 3 fosse stato:
Vero MAX = 7
Falso MAX = 7
Vero MAX = 9
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 35
Esempio
Progettazione
Descrizione del metodo di elaborazione:
• sono letti i valori dei tre numeri interi assegnandoli ad A, B, C rispettivamente;
• inizialmente si considera il primo numero (variabile A) come quello
massimo, ovvero si assegna alla variabile MAX il valore del primo numero;
• si confronta il valore di MAX con quello del secondo numero (variabile B) e se questo è maggiore di MAX si aggiorna il valore di MAX con il valore del secondo numero;
• si confronta il valore di MAX con quello del terzo numero (variabile C) e se questo è maggiore di MAX si aggiorna il valore di MAX con il valore del terzo numero
• si stampa il valore della variabile MAX così calcolato
Esempio Codifica
• sono letti i valori dei tre numeri interi;
write (“immetti il primo numero A “);
read (“%d” A);
write (“immetti il secondo numero B “);
read (“%d” B);
write (“immetti il terzo numero C “);
read (“%d” C);
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 37
Esempio Codifica
• inizialmente si considera il primo numero (variabile A) come quello massimo, ovvero si assegna alla variabile MAX il valore del primo numero;:
MAX=A;
• si confronta il valore di MAX con quello del secondo numero (variabile B) e se questo è maggiore di MAX si aggiorna il valore di MAX con il valore del secondo numero:
if (B>MAX) then MAX=B endif
Esempio Codifica
• si confronta il valore di MAX con quello del terzo numero (variabile C) e se questo è maggiore di MAX si aggiorna il valore di MAX con il valore del terzo numero :
if (C>MAX) then MAX=C endif
• si stampa il valore della variabile MAX così calcolato:
write (“Valore massimo = “, “%d” MAX);
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 39
Max fra tre - il programma in LDP e C
#include <stdio.h>
main () {
// massimo_tra_tre numeri interi int A, B, C, MAX;
printf (“immetti il primo numero A \n“);
scanf (“%d”, &A);
printf(“immetti il secondo numero B \n“);
scanf (“%d”, &B);
printf (“immetti il terzo numero C \n“);
scanf (“%d”, &C);
MAX=A;
if (B>MAX) MAX=B;
if (C>MAX) MAX=C;
printf(“Valore massimo = %d \n”, MAX);
} Program massimo_tra_tre;
INT A, B, C, MAX;
begin
write (“immetti il primo numero A “);
read (“%d” A);
write (“immetti il secondo numero B“);
read (“%d” B);
write (“immetti il terzo numero C “);
read (“%d” C);
MAX=A;
if (B>MAX) then MAX=B endif
if (C>MAX) then MAX=C endif
write (“Valore massimo= “, ”%d%”MAX);
end.
Esempio Testing
criteri per la scelta dei casi di prova:
almeno un caso di test (prova) con valori di A e B e C tutti diversi tra loro
un caso di test (prova) con due numeri uguali ed il terzo diverso
un caso di test (prova) con tutti e tre i numeri uguali
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 41
Risoluzione Equazione I grado - LDP
… usando strutture if … then … else
if (A=0) then
if (B<>0) then
write (‘Equazione Impossibile’) endif
if (B=0) then
write (‘Equazione indeterminata’) endif
endif
if (A=0) then if (B<>0) then
write (‘Equazione Impossibile’) else
write (‘Equazione indeterminata’) endif
endif Sequenza di due strutture if … then
Nella seconda la condizione è la negazione della condizione nella prima struttura if .. then Si può usare una struttura if … then … else ….
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 43
Esempio
if (A=0) then ……..
endif
if (A< >0) then begin X = -B/A;
write (‘X = ‘, X);
end endif
if (A=0) then ……..
else begin
X = -B/A;
write (‘X = ‘, X);
end endif
… stessa situazione …
Sequenza di due strutture if … then Nella seconda la condizione è la negazione della condizione nella prima struttura if .. then Si può usare una struttura if … then … else ….
Risoluzione Equazione I grado - LDP
if (A=0) then if (B<>0) then
write (“Equazione Impossibile”) else
write (“Equazione indeterminata”) endif
else begin
… usando strutture if … then … else
Program equazioneIgrado;
FLOAT A, B, X;
begin
write (“immetti coefficiente A”);
read (A);
write (“immetti coefficiente B”);
read (B);
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 45
Risoluzione Equazione I grado - LDP
if (A=0)
then
if (B<>0) then
write (“Equazione Impossibile”)
else
write (“Equazione indeterminata”) endif
else
begin X = -B/A;
write (“X = “, X);
end endif end.
if (A=0)
then
if (B<>0) then
write (“Equazione Impossibile”) endif
if (B=0) then
write (“Equazione indeterminata”) endif
endif
if (A<>0)
begin X = -B/A;
write (“X = “, X);
end endif end.
… differenze tra uso di if … then ed if … then … else
Risoluzione Equazione I grado - il programma in C
#include <stdio.h>
main ()
{ // questo programma risolve un’equazione di I grado float A, B, X;
printf (“immetti coefficiente A \n“);
scanf (“%f”, &A);
printf(“immetti coefficiente B \n”);
scanf (“%f”, &B);
if (A==0) { if (B!=0)
printf (“Equazione Impossibile \n”);
else
printf (“Equazione indeterminata \n”);
} else
{ X= -B/A;
printf(“X = %f \n”, X);
} }
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 47
Esempio Testing
criteri per la scelta dei casi di prova:
almeno un caso di test (prova) con valori di A e B entrambi <> 0 un caso di test (prova) con A = 0 e B <> 0
un caso di test (prova) con A = 0 e B = 0
Risoluzione Equazione I grado - C
Supponendo che l’equazione sia
Esecuzione ‘carta e penna’
#include <stdio.h>
main ()
{ // questo programma risolve un’equazione di I grado float A, B, X;
printf (“immetti coefficiente A \n“);
scanf (“%f”, &A);
printf(“immetti coefficiente B \n”);
scanf (“%f”, &B);
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 49
A= 0 ? Falso
else
X = - B/A = - 9/3 = -3 X= -3
Risoluzione Equazione I grado - C
Esecuzione ‘carta e penna’
if (A==0) { if (B!=0)
printf (“Equazione Impossibile \n”);
else
printf (“Equazione indeterminata \n”);
} else {
X= -B/A;
printf(“X = %f \n”, X);
} }
Secondo caso di prova:
A=0 B=9
Risoluzione Equazione I grado - LDP
Esecuzione ‘carta e penna’
#include <stdio.h>
main ()
{ // questo programma risolve un’equazione di I grado float A, B, X;
printf (“immetti coefficiente A \n“);
scanf (“%f”, &A);
printf(“immetti coefficiente B \n”);
scanf (“%f”, &B);
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 51
A= 0 ?
VERO
B<> 0 ? VERO
Equazione Impossibile
Risoluzione Equazione I grado - LDP
Esecuzione ‘carta e penna’
if (A==0) { if (B!=0)
printf (“Equazione Impossibile \n”);
else
printf (“Equazione indeterminata \n”);
} else {
X= -B/A;
printf(“X = %f \n”, X);
} }
Risoluzione Equazione I grado - LDP
Esecuzione ‘carta e penna’
#include <stdio.h>
main ()
{ // questo programma risolve un’equazione di I grado float A, B, X;
printf (“immetti coefficiente A \n“);
scanf (“%f”, &A);
printf(“immetti coefficiente B \n”);
scanf (“%f”, &B);
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 53
Risoluzione Equazione I grado - LDP
A= 0 ?
VERO B<> 0 ?
FALSO else
Equazione indeterminata
Esecuzione ‘carta e penna’
if (A==0) { if (B!=0)
printf (“Equazione Impossibile \n”);
else
printf (“Equazione indeterminata \n”);
} else {
X= -B/A;
printf(“X = %f \n”, X);
} }
Esempio Analisi e Specifica
Definizione del problema: Calcolare le soluzioni del sistema di due equazioni lineari
ax+by=e cx+dy=f
Definizione dei dati del problema:
I: a,b,c,d,e,f, coefficienti del sistema di tipo reale Pi: determinante dei coefficienti diverso da zero U: x, y soluzioni del sistema, di tipo reale
Pu: se il determinante dei coefficienti è uguale a zero, x e y
sono indefiniti ed il sistema impossibile
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 55
Esempio
Nome variabile Descrizione Tipo
A, B,C, D, E, F I coefficienti del sistema REAL
Nome variabile Descrizione Tipo
X, Y Soluzioni del sistema REAL
Tabella delle variabili di ingresso
Tabella delle variabili di uscita
Nome variabile Descrizione Tipo
G Determinante dei coefficienti x e y REAL Tabella delle variabili di algoritmo
Esempio Progettazione
Descrizione del metodo di elaborazione:
• sono letti i valori dei coefficienti;
• si calcola il determinante dei coefficienti (g=(a*d)-(b*c))
• se g è diverso da zero si calcolano le soluzioni x=((e*d)-(f*b))/g
y=((a*f)-(c*e))/g
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 57
Esempio Codifica
• sono letti i valori dei coefficienti;
write (‘immetti i coefficienti ‘);
read (A, B, C, D, E, F);
• si calcola il determinante dei coefficienti …...
G=(A*D)-(B*C);
Esempio Codifica
• se g è diverso da zero si calcolano le soluzioni …...
if G<>0 then begin
X=(E*D)-(F*B))/G ; Y=((A*F)-(C*E))/G;
write (‘le soluzioni sono X=‘, X, ‘ Y = ‘, Y);
end
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 59
Esempio Codifica
• se g=0 stampare ‘Sistema impossibile’
if G<>0 then ………
else
write (‘Sistema Impossibile’);
endif
Esempio -
il programma in LDP
Program sistema_2_equazioni;
REAL A, B, C, D, E, F,G;
REAL X, Y;
begin
write (‘immetti il coefficiente A ‘);
read (“%f” A);
….
write (‘immetti il coefficiente F ‘);
read (“%f” F);
G=(A*D)-(B*C);
if G<>0 then begin
X=((E*D)-(F*B))/G ; Y=((A*F)-(C*E))/G;
write (‘le soluzioni sono X=‘, X, ‘ Y = ‘, Y);
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 61
Risoluzione sistema_2_equazioni - il programma in C
#include <stdio.h>
main ()
{ // sistema_2_equazioni float A, B, C, D, E, F, G;
float X, Y;
printf (“immetti il coefficiente A \n“);
scanf (“%f”, &A);
printf (“immetti il coefficiente B \n“);
scanf (“%f”, &B);
printf (“immetti il termine noto E \n“);
scanf (“%f”, &E);
printf (“immetti il coefficiente C \n“);
scanf (“%f”, &C);
printf (“immetti il coefficiente D \n“);
scanf (“%f”, &D);
printf (“immetti il termine noto F \n“);
scanf (“%f”, &F);
G=(A*D)-(B*C);
if (G!=0)
{ X=((E*D)-(F*B))/G ; Y=((A*F)- (C*E))/G;
printf (“le soluzioni sono X= %f Y= %f \n“, X, Y);
} else
printf(“Sistema Impossibile \n”);
}
Ax + By = E Cx + Dy = F
{
Esempio Testing
criteri per la scelta dei casi di prova:
…. Lo studente definisca, quale esercizio, i casi di prova ...
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 63
Esempio a=2 b=3 c=2 d=3 e=6 f=9 g=(2*3)-(3*2) = 0
Risultato atteso => “Sistema impossibile”
a=4 b=-9 c=2 d=3 e=6 f=9 g=(4*3) - (-9*2) = 30
x=((e*d)-(f*b))/g = ((3*6) - (9*-9))/30 = (18 + 81)/30 = 3,3 y=((a*f)-(c*e))/g = ((4*9) - (2*6))/30 = (36 - 12)/30 = 0,80 Risultato atteso => x = 3,3 y = 0,80
Testing (I caso prova) 2x+3y=6
2x+3y=9
{
Testing (II caso prova) 4x - 9y = 6
2x + 3y = 9
{
…. Lo studente definisca ed esegua ulteriori casi di prova ...
Esercizio
Analisi e Specifica
Definizione del problema: Scrivere un programma che genera in modo casuale un valore compreso tra 1 e 6, estremi inclusi, e lo assegna ad una variabile DADO (rappresentante il risultato del lancio del dado);
... ... ... ...
Problema: lanciato un dado, un giocatore vince se il risultato del lancio è 1 oppure 6, perde se il risultato è 2, 3 o 5, rilancia il dado se il risultato è 4. Se vince, vince il doppio della posta puntata (che non può essere più di 2 euro)
Prof. G. A. Di Lucca - Univ. del Sannio
Elementi di Informatica 65
… si usa la funzione rand() della libreria <stdlib.h>
#include <stdio.h>
#include <stdlib.h>
main () {int a;
printf ("Generazione random di un numero intero \n");
a = rand() %70; //la funzione rand() genera in modo random un numero intero;
// l’applicazione di %70 fa in modo che il numero generato // sia modulo 70, ossia compreso tra 0 e 69.
printf ("Numero = %d \n", a);
}
Generazione casuale (random) di un numero intero in C
// Programma per simulare il risultato del lancio di un dado
#include <stdio.h>
#include <stdlib.h>
main ()
{ int faccia_dado;
faccia_dado = rand() % 6; //genera un numero casuale fra 0 e 5 faccia_dado++; // per ottenere un valore tra 1 e 6
printf(“Faccia_dado = %d\n",faccia_dado);
system("Pause");
}
Generazione casuale (random) di un numero intero in C
Prof. G. A. Di Lucca - Univ. del Sannio
Elementi di Informatica 67
… Se
eseguiamo il programma più volte si ottiene sempre lo stesso risultato!!!… ciò è dovuto al fatto che rand() genera numeri pseudo-casuali, cioè numeri che "sembrano" casuali …
Affinchè ogni esecuzione del programma generi un diverso valore deve essere effettuata la ‘randomizzazione’ della funzione, ovvero inizializzare il generatore di numeri pseudo-casuali usando un valore che viene detto ‘seme’
La randomizzazione può essere fatta usando la funzione srand(), che richiede un parametro di input di tipo unsigned (intero senza segno), che funge da seme.
Per inizializzare il seme è solitamente usata la funzione time(), della libreria time.h, con parametro NULL (o zero); la funzione time() fornisce un valore unsigned calcolato in base all'ora corrente del giorno, espressa in secondi.
Generazione casuale (random) di un numero intero in C
// Programma per simulare il risultato del lancio di un dado - randomizzato
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
main ()
{ int lancio1, lancio2;
srand(time(NULL)); //inizializza il generatore di numeri random // lancia il dado 2 volte e mostra il risultato
lancio1= rand() % 6; //genera un numero casuale fra 0 e 5 lancio1++; // per ottenere un valore tra 1 e 6
Generazione casuale (random) di un numero intero in C
Prof. G. A. Di Lucca - Univ. del Sannio
Elementi di Informatica 69
Esercizio
Analisi e Specifica
Definizione del problema: Scrivere un programma che genera in modo casuale un valore compreso tra 1 e 6, estremi inclusi, e lo assegna ad una variabile DADO (rappresentante il risultato del lancio del dado);
Il giocatore immette quanti euro scommette; se la puntata è valida:
Nel caso il valore di DADO è 1 oppure 6 visualizza “Bravo! Hai vinto”
Nel caso il valore di DADO è 4 visualizza “Lancia di nuovo il dado”
Nel caso caso il valore di DADO è 2, 3 oppure 5 visualizza “Peccato, non hai vinto!”
Se ha vinto si visualizza l’importo della vincita pari al doppio della scommessa
Se la puntata non è valida è visualizzato un messaggio di errore ed il programma termina
Problema: lanciato un dado, un giocatore vince se il risultato del lancio è 1 oppure 6, perde se il risultato è 2, 3 o 5, rilancia il dado se il risultato è 4. Se vince, vince il doppio della posta puntata (che non può essere più di 2 euro)
Esercizio
Definizione dei dati del problema:
I: DADO, di tipo intero, rappresentante il risultato del lancio del dado;
scommessa, importo in euro della posta puntata;
Pi: il valore di DADO deve essere compreso tra 1 e 6, estremi inclusi;
il valore di scommessa deve essere maggiore di zero e non superare 2 U: vinto, variabile booleana indicante se il giocatore ha vinto
vincita, importo della vincita
Pu: vinto = VERO importo vincita uguale al doppio di scommessa;
Prof. G. A. Di Lucca - Univ. del Sannio
Elementi di Informatica 71
Esempio
Nome variabile Descrizione Tipo
DADO rappresenta il valore del lancio del dado INT
scommessa importo scommesso FLOAT
Nome variabile Descrizione Tipo
vinto il giocatore ha vinto BOOL
vincita importo vincita FLOAT
Tabella delle variabili di ingresso
Tabella delle variabili di uscita
Progettazione
Descrizione del metodo di elaborazione:
• Il giocatore immette l’importo che vuole scommettere;
• Se l’importo è non maggiore di zero o supera 2 si stampa "IMPORTO SCOMMESSA NON VALIDO !!! FINE PROGRAMMA”,
altrimenti
• Si assegna alla variabile DADO un valore, compreso tra 1 e 6, generato in maniera casuale usando le funzioni srand () e rand() del linguaggio C (libreria <stdlib.h>) e si visualizza il valore di DADO;
• Nel caso che DADO ha valore:
• 1 oppure 6: si visualizza “Bravo! Hai vinto”, si pone vinto = 1 e si calcola vincita = scommessa * 2;
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 73
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
main ()
{ int DADO, vinto=0;
float scommessa, vincita;
printf("quanti euro scommetti ? (massimo 2 euro)\n");
scanf("%f", &scommessa);
if ((scommessa<=0)|| (scommessa>2))
printf("IMPORTO SCOMMESSA NON VALIDO!!!
FINE PROGRAMMA \n");
else
{ srand(time(NULL));//inizializza generatore di numeri random DADO= rand() % 6; //genera un numero casuale fra 0 e 5 DADO++; // per ottenere un valore tra 1 e 6
printf(" Lancio dado = %d \n ", DADO);
switch (DADO)
{ case 1: case 6: { vinto=1;
vincita= scommessa * 2;
printf ("Bravo! Hai vinto \n");
break; }
case 2: case 3: case 5:
{ printf("Peccato, non hai vinto!\n");
break;}
case 4: { printf("Lancia di nuovo il dado \n");
break; }
default: printf("ERRORE !!!\n"); break;
}
if (vinto == 1) printf ("Hai vinto %f euro \n", vincita);
} // fine else system("Pause");
}
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 75
Esempio Analisi e Specifica
Definizione del problema: Dato in input il valore di N, numero intero maggiore di zero, calcolare
ovvero la sommatoria dei numeri da 1 a n Definizione dei dati del problema:
I: N Pi: N>0
U: la sommatoria dei numeri da 1 a N Pu: la sommatoria è maggiore di 0
Esempio
Nome variabile Descrizione Tipo
N estremo superiore della sommatoria INT Tabella delle variabili di ingresso
Tabella delle variabili di uscita
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 77
Esempio Progettazione
Descrizione del metodo di elaborazione:
• è letto il valore di N
• si verifica il valore di N e la lettura è ripetuta se N=<0
• si inizializza il valore di Sommatoria a zero
• si inizializza il valore di i a uno
• si ripetono, mentre i è non maggiore di N, le seguenti due istruzioni:
• si incrementa di i il valore di Sommatoria
• si incrementa di (uno) 1 il valore di i
• alla fine del ciclo si visualizza il valore di Sommatoria
Esempio
Nome variabile Descrizione Tipo N estremo superiore della sommatoria INT
Nome variabile Descrizione Tipo
Sommatoria Sommatoria INT Tabella delle variabili di ingresso
Tabella delle variabili di uscita
Nome variabile Descrizione Tipo i indice elemento sommatoria e di controllo di ciclo INT Tabella delle variabili di algoritmo
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 79
#include<stdio.h>
main()
{ // Calcola la sommatoria dei numeri interi da 1 a N int i, N; long Sommatoria;
printf (”Immetti il valore di N \n”);
// continua a leggere N mentre è NON maggiore di zero scanf("%d", &N);
while (N<=0)
{ printf (”Immesso un valore non positivo, Immetti il valore di N \n”);
scanf("%d", &N);
}
// inizializza il valore di Sommatoria a zero e di i a 1 Sommatoria=0; i=1;
Esempio - il programma in C
Errore!! Manca l’incremento della variabile i !!!
Sommatoria incrementata solo di 1 (uno) !
Ciclo NON convergente ! // ciclo while per calcolare la sommatoria
while (i<=N)
Sommatoria=Sommatoria + i;
printf("Sommatoria = %d \n", Sommatoria);
}
#include<stdio.h>
main()
{ // Calcola la sommatoria dei numeri interi da 1 a N int i, N; long Sommatoria;
printf (”Immetti il valore di N \n”);
scanf("%d", &N);
// continua a leggere N mentre è NON maggiore di zero while (N<=0)
{ printf (”Immesso un valore non positivo, Immetti il valore di N \n”);
scanf("%d", &N);
}
// inizializza il valore di Sommatoria a zero e di i a 1 Sommatoria=0; i=1;
Esempio - il programma in C
// ciclo while per calcolare la sommatoria
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 81
Esempio Analisi e Specifica
Definizione del problema: Dato in input il valore di N, numero intero maggiore di zero, calcolare la sommatoria dei numeri da 1 a N
… risoluzione del problema con l’uso di cicli a condizione finale …
Definizione dei dati del problema:
I: N Pi: N>0
U: la sommatoria dei numeri da 1 a N Pu: la sommatoria è maggiore di 0
Esempio
Nome variabile Descrizione Tipo
N estremo superiore della sommatoria INT
Nome variabile Descrizione Tipo
Sommatoria Sommatoria INT Tabella delle variabili di ingresso
Tabella delle variabili di uscita
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 83
Esempio Progettazione
Descrizione del metodo di elaborazione:
• è letto il valore di N
• la lettura è ripetuta se N=<0
• si inizializza il valore di Sommatoria a zero
• si inizializza il valore di i a uno
• si incrementa di i il valore di Sommatoria
• si incrementa di 1 (uno) il valore di i
• si ripetono, con un ciclo, i due passi precedenti finché i è non maggiore di N
• alla fine del ciclo si visualizza il valore di Sommatoria
Esempio
Nome variabile Descrizione Tipo N estremo superiore della sommatoria INT
Nome variabile Descrizione Tipo
Sommatoria Sommatoria INT Tabella delle variabili di ingresso
Tabella delle variabili di uscita
Tabella delle variabili di algoritmo
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 85
#include<stdio.h>
main()
{ // Calcola la sommatoria dei numeri interi da 1 a N int i, N; long int Sommatoria;
// legge il valore di N finché è maggiore di zero do
{ printf (”Immetti il valore di N maggiore di zero\n”);
scanf("%d", &N);
}
while (N<=0);
// inizializza il valore di Sommatoria a zero e di i a 1 Sommatoria=0; i=1;
// ciclo per calcolare la sommatoria do
{Sommatoria=Sommatoria + i;
i++; } while (i<=N) ;
printf("Sommatoria = %d \n", Sommatoria);
}
Esempio - il programma in C
#include<stdio.h>
main()
{ // Calcola la sommatoria dei numeri interi da 1 a N int i, N; logint Sommatoria;
// legge il valore di N e continua finché assume un valore maggiore di zero
do
{ printf (”Immetti il valore di N \n”);
scanf("%d", &N);
} while (N<=0);
// inizializza il valore di Sommatoria a zero e di i a 1 Sommatoria=0; i=1;
// ciclo per calcolare la sommatoria do
{Sommatoria=Sommatoria + i;
i++; } while (i<=N) ;
printf("Sommatoria = %d \n", Sommatoria);
}
Esempio - il programma in C
… con ciclo do … while ( )
#include<stdio.h>
main()
{ // Calcola la sommatoria dei numeri interi da 1 a N int i, N; logint Sommatoria;
printf (”Immetti il valore di N \n”);
scanf("%d", &N);
//continua a leggere N mentre è NON maggiore zero while (N<=0)
{ printf (”Immesso un valore non positivo, Immetti il valore di N \n”);
scanf("%d", &N);
}
// inizializza il valore di Sommatoria a zero e di i a 1
Sommatoria=0; i=1;
// ciclo while per calcolare la sommatoria while (i<=N)
{Sommatoria=Sommatoria + i;
i++; }
printf("Sommatoria = %d \n", Sommatoria);
}
… con ciclo while ( )