Integrazione sulle Variabili di controllo

L’ALGORITMO
I DATI
LE ISTRUZIONI
LE STRUTTURE FONDAMENTALI
ALGORITMO
FINE
1
PROGRAMMAZIONE STRUTTURATA
Teorema di Jacopini Böhm (1966)
Qualunque algoritmo può essere implementato
utilizzando le tre sole strutture di controllo:
• sequenza
• selezione
• iterazione
Tutti i linguaggi imperativi implementano le strutture di controllo
fondamentali con opportune istruzioni
Naturalmente la forma sintattica può a volte variare leggermente,
ma il funzionamento rimane identico
ALGORITMO
2
STRUTTURE DI CONTROLLO
• PRIMITIVE
necessarie e sufficienti per
risolvere qualsiasi algoritmo
(teorema di Bohm-Jacopini)
• NON PRIMITIVE
derivate da quelle primitive
ALGORITMO
SEQUENZA
SELEZIONE (o scelta logica)
ITERAZIONE con il controllo in coda
ITERAZIONE con controllo in testa
ITERAZIONE ENUMERATIVA
SCELTA (o selezione) MULTIPLA
3
LA SEQUENZA
E’ un insieme di azioni da
svolgere secondo un ordine
prefissato. L’ordine di
esecuzione è dalla prima
all’ultima istruzione seguendo
un percorso unico.
In Java si utilizza
{ per indicare l’inizio della sequenza
di istruzioni
Flow chart
pseudocodifica
………..
istruzione-1
istruzione-2
istruzione-3
……………
} per indicare la fine della sequenza
ALGORITMO
4
Esempio di istruzioni in sequenza
INIZIO
Scrivi “indica il prezzo”
Leggi PREZZO
Scrivi “indica lo sconto”
Leggi SCONTO
C  PREZZO - SCONTO
Scrivi “il prezzo è “ C
FINE
ALGORITMO
PROBLEMA: dato il prezzo di un prodotto e lo sconto effettuato,
calcolare e comunicare il prezzo scontato
Si propone l’algoritmo disegnato con la tecnica del
flow-chart e con la tecnica della pseudocodifca.
inizio
{ scrivi “indica il prezzo"
leggi PREZZO
scrivi “indica lo sconto"
leggi SCONTO
c  PREZZO – SCONTO
scrivi “il prezzo scontato è “ c
}
fine
nome
I/O
V/C
N/A
descrizione
PREZZO
I
V
N decimale
Prezzo del prodotto
SCONTO
I
V
N decimale
Sconto effettuato
C
O
V
N decimale
Prezzo scontato
ESERCIZIO: PREZZO
codifica il programma descritto nell’algoritmo
soluzione
5
Alcune osservazioni sulle tecniche per
descrivere l’algoritmo
INIZIO
Scrivi “indica il prezzo”
Leggi PREZZO
Scrivi “indica lo sconto”
La descrizione di un algoritmo può essere fatta sia con
la tecnica del flow-chart che con la tecnica della
pseudocodifca. Sono equivalenti, quindi nel seguito ne
verrà proposta solo una.
Laddove è sufficientemente chiaro, non verranno
indicate le istruzioni di output che servono per chiedere
all’utente di indicare i dati . Ad esempio:
Leggi SCONTO
C  PREZZO - SCONTO
Scrivi “il prezzo è “ C
FINE
ALGORITMO
Scrivi “indica il prezzo”
verrà sostituita dalla
sola istruzione
Leggi PREZZO
Leggi PREZZO
La tabella dei dati deve essere sempre descritta
6
Esercizi proposti sulla sequenza
•
Fornito un valore in input, calcolarne il doppio del quadrato del
successivo.
•
Dato un numero in input, calcolare la somma tra il suo doppio e la sua
metà.
•
Si devono comprare 3 kg mele e 2 kg di pere; dato in input il prezzo al
kg di ciascun prodotto , calcolare la spesa finale
•
Date le coordinate di un punto in un piano cartesiano, calcolare la sua
distanza dal centro
ALGORITMO
7
LA SELEZIONE (scelta logica )
Con questa struttura si seleziona in modo esclusivo una determinata
sequenza/blocco di istruzioni da eseguire sulla base di una
<condizione> rappresentata da una espressione booleana , che può
essere vera o falsa
pseudocodifica
Flow chart
Nel diagramma a blocchi compaiono
due possibili percorsi in base al
verificarsi o meno di una condizione.
Se la condizione è vera si segue il ramo
del SI, se è falsa, il ramo del NO.
NO
SI
COND
ALGORITMO
Nella pseudocodifica, se la condizione
è vera si esegue il primo blocco di
istruzioni , se è falsa, si esegue il
secondo blocco di istruzioni
se (condizione)
{
blocco_istruzioni_1
}
altrimenti
{
blocco_istruzioni_2
}
8
Esempio di struttura di selezione
Data l’equazione di 2° grado: Ax2 + Bx + C = 0
Per trovare le soluzioni reali è necessario
calcolare il valore del discriminante D:
Calcolo di D
NO
D = B2 - 4 AC
Non ci sono
radici reali
D0
SI
Calcolo due
radici reali
Se D0 calcolo delle due radici reali dell’equazione
altrimenti l’equazione non ha radici reali.
ALGORITMO
9
AZIONI DI TIPO LOGICO
Si dice enunciato una proposizione che può essere soltanto
vera o falsa
Un enunciato può essere vero o falso, ma non entrambe le cose
La verità o la falsità di un enunciato sono dette valori di verità e tali
valori corrispondono agli unici due valori dell’algebra booleana
Vero Falso
rappresentati anche con
1
0;
ESEMPI DI ENUNCIATI:
NON E’ UN ENUNCIATO
•
•
•
•
ROMA è composta da 4 lettere  vero
7>3
 vero
7 > 12
 falso
A > B dipende dal valore assunto dalle variabili A e B
forse pioverà
 non è né vero né falso
Dato un enunciato, possiamo esaminare la sua condizione ossia
l’essere vero o falso e in base a tale valutazione possiamo prendere
delle decisioni.
ALGORITMO
10
AZIONI DI TIPO LOGICO COMPOSTE
Gli enunciati possono essere composti ossia formati da
sottoenunciati collegati tra loro da connettivi
Siano p e q due enunciati; esaminiamo le tavole di verità dei
connettivi AND, OR, NOT
Connettivo AND (prodotto logico)
Connettivo OR (somma logica)
p
q
p AND q
p
q
p OR q
V
V
F
F
V
F
V
F
V
F
F
F
V
V
F
F
V
F
V
F
V
V
V
F
Connettivo NOT (negazione)
p
NOT p
V
F
F
V
ALGORITMO
11
Sintassi della struttura di Selezione
In Java la struttura di selezione si
codifica così
if (condizione)
istruzione1;
else
istruzione2 ;
Se sono presenti più istruzioni in ciascun ramo
if (condizione)
{ istruzione1;
istruzione2;
….
}
else
{ istruzione...;
…
}
ALGORITMO
RICORDA:
Le istruzioni che fanno parte della sequenza
sono racchiuse tra le parentesi graffe.
12
Esempio Istruzione di Selezione a due vie
PROBLEMA: dato un numero si comunichi se il numero è pari o
dispari
//
// Selezione.java
//
INIZIO
Leggi a
F
V
a %2=0
Scrivi
“il numero è dispari”
FINE
Scrivi
“il numero è pari”
import java.util.Scanner; // program uses class Scanner
public class Selezione
{
// main method begins execution of Java application
public static void main( String args[] )
{
// create Scanner to obtain input from command window
Scanner input = new Scanner( System.in );
int number1; // read a
System.out.print( "Enter an integer: " ); // prompt
number1 = input.nextInt(); // read first number from user
if((number1%2)==0)
{
System.out.printf( “Il numero e’ pari %d\n”, number1 );
}
else
{
System.out.printf( “Il numero e’ dispari %d\n”, number1 );
}
} // end method main
} // end class Selezione
ESERCIZIO: NUMERO POSITIVO
acquisire un numero e comunicare se è positivo o negativo
ALGORITMO
istruzione precedente
soluzione
13
LA SELEZIONE A UNA VIA
Sinora abbiamo esaminato casi in cui in base alla condizione si
potevano eseguire due diverse azioni alternativamente.
In alcuni casi invece è possibile scegliere di compiere o non compiere
un’azione; in tal caso l’azione da eseguire deve essere posta sul ramo
del SI.
In questo caso la codifica in Java è:
if (condizione)
istruzione1;
o nel caso di più istruzioni:
if (condizione)
{
istruzione1;
istruzione2;
………….;
}
ALGORITMO
La clausola else
(altrimenti) in
queste situazioni
non viene
codificata
NO
SI
COND
14
Esempio Istruzione di Selezione a una via
PROBLEMA: dato un numero intero si comunichi il valore della radice
quadrata del suo valore assoluto
INIZIO
Leggi a
V
F
a >=0
a = abs(a);
b = sqrt(a);
Scrivi b
FINE
ALGORITMO
//
// Selezione2.java
//
import java.util.Scanner; // program uses class Scanner
public class Selezione2
{
// main method begins execution of Java application
public static void main( String args[] )
{
// create Scanner to obtain input from command window
Scanner input = new Scanner( System.in );
int number1; // read a
double number2;
System.out.print( "Enter an integer: " ); // prompt
number1 = input.nextInt(); // read first number from user
/*if(number1<0)
{
number1=-number1;
}*/
number1 = Math.abs(number1);
System.out.printf("Il valore assoluto e' %d\n", number1 );
number2 = Math.sqrt(number1);
System.out.printf("La radice quadrata e' %f\n", number2 );
} // end method main
} // end class Selezione2
ESERCIZIO: VOTI
acquisire 3 voti, calcolare e comunicare la media; se la media è
insufficiente, comunicare “devi fare i corsi di recupero”
soluzione
15
Strutture di Controllo if-else Nidificati
A volte si possono usare
istruzioni di selezione ( a
una o a due vie) nidificate ,
ossia le istruzioni da
eseguire al verificarsi della
condizione sono a loro
volta istruzioni
condizionali
Il processo può essere
ripetuto a molti livelli
Occorre porre molta attenzione
nell’utilizzare una tale struttura,
poiché facilmente “ci si perde”
nell’esaminare le varie
condizioni
Istruzione Precedente
Falsa
Vera
Condizione
I1
Vera
I2
Vera
Falsa
Condizione
I3
I4
Istruzione Successiva
ESERCIZIO: NUMERO POSITIVO O NULLO
Acquisire un numero e comunicare se è positivo, negativo o nullo
ALGORITMO
Falsa
Condizione
soluzione
16
Esercizi proposti sulla selezione
• Dati 2 voti, calcolare la media ; se la media è sufficiente ,
comunicare “alunno promosso” altrimenti comunicare “alunno
rimandato”
• Volendo fare la spesa , si ha a disposizione una certa cifra iniziale.
Conoscendo l’importo da spendere, verificare se la spesa è
possibile
• Dati tre numeri, stabilire se possono essere le misure dei lati di un
triangolo rettangolo.
• Viene fornito in input il punteggio di un candidato ad un concorso.
Se tale punteggio è compreso tra 0 e 27, visualizzare RESPINTO,
tra 28 e 40 visualizzare AMMESSO, in tutti gli altri casi
ERRORE.
ALGORITMO
17
ITERAZIONE CON CONTROLLO IN CODA
( do…while )
Per iterazione si intende la ripetizione di una o più azioni sotto
il controllo di una condizione.
Il gruppo di azioni da ripetere è detto corpo del ciclo
Nell’iterazione con il controllo in coda, la
condizione da verificare si trova dopo il corpo del
ciclo
Istruzione Precedente
Corpo
Il corpo del ciclo verrà eseguito almeno una volta.
In Java, il ciclo che si ripete mentre la
condizione è vera; quando la condizione è falsa
il ciclo si interrompe, quindi è necessario che
all’interno del corpo vi sia una istruzione che
modifichi il valore della condizione, altrimenti
il ciclo “va in loop”
ALGORITMO
Vera
Condizione
Falsa
Istruzione Successiva
18
Esecuzione di un ciclo do..while
Questa struttura può essere utilizzata per il “controllo dei dati in input”
ESERCIZIO: Leggi ripetutamente un numero finchè
il numero letto è > 0
//
// Ciclo.java
//
import java.util.Scanner; // program uses class Scanner
public class Ciclo
{
// main method begins execution of Java application
public static void main( String args[] )
{
// create Scanner to obtain input from command window
Scanner input = new Scanner( System.in );
int number1; // read a
do
{
System.out.print( "Dammi un numero: " ); // prompt
number1 = input.nextInt(); // read first number from user
if(number1<=0)
{
System.out.println( "Numero non positivo-ripetere");
}
}
while(number1<=0);
System.out.println( "Fine");
} // end method main
} // end class Ciclo
ALGORITMO
La struttura do..while, consente di eseguire
ripetutamente il corpo del ciclo anche per un
numero di volte indeterminato
schermo
Dammi un numero
- 20
Numero non positivo-ripetere
Dammi un numero
- 30
Numero non positivo-ripetere
Dammi un numero
12
Fine
19
Esempio di iterazione con controllo in coda
ESERCIZIO: Visualizzazione dei
primi 10 multipli di 5
num=5
Codifica in Java:
int num=5; int cont=1;
int ris=0;
do
{
ris=num*cont;
System.out.printf(“%d”, ris);
cont++;
}
while (cont<=10);
ALGORITMO
cont=1
Inizio ciclo
ris=num*cont
Istruzioni
interne al ciclo
ripetute mentre
la variabile
cont è minore
o uguale a 10
Condizione di
fine ciclo
(quando cont
supera 10)
scrivi ris
cont=cont+1
s
cont10
N
20
RICORDA:
Quando si fa riferimento ad una condizione (sia nella scelta che
nell’iterazione) si intende che è possibile utilizzare anche
condizioni composte.
In C++
Si ottengono condizioni composte
legando due o più condizioni con
gli operatori logici:
Esempi in Java:
AND prodotto logico
OR somma logica
NOT negazione
OR nella selezione
if ((a>0) || (b>0)) …..;
AND nella ripetizione
do { …..
…..
} while ((a>0) && (b>0));
ESERCIZIO: BENVENUTO
Acquisire il nome di una persona e il sesso (tramite lettera ‘m’ o ‘f’) e
scrivere come messaggio: “Buongiorno, signor … “ oppure “Buongiorno
signora ….. “ seguito da nome
ALGORITMO
&&
||
!
soluzione
21
Esercizi proposti sulla iterazione con
controllo in coda
•
Dato in input un numero positivo (NUM>0), visualizzarne l’inverso
(INV=1/NUM), il doppio (DOP=2*NUM), il quadrato
(QUAD=NUM*NUM).
•
Visualizzare i primi N numeri pari, con N intero positivo fornito in
input.
•
Visualizzare la somma dei primi N interi, con N>3 fornito in input.
Oss: l’iterazione è sul controllo dell’input
ALGORITMO
22
STRUTTURE NON PRIMITIVE
Si tratta di strutture che derivano da quelle primitive di selezione e
iterazione con controllo in coda
Pur non essendo teoricamente indispensabili rendono più
semplice ed efficace l’attività di programmazione
• ITERAZIONE CON CONTROLLO IN TESTA
• ITERAZIONE ENUMERATIVA
• SCELTA (O SELEZIONE) MULTIPLA
ALGORITMO
23
ITERAZIONE CON CONTROLLO IN
TESTA ( while …)
Codifica in Java
while (cond)
{
istruzione1;
istruzione2;
}
La caratteristica di
questa iterazione è
che la condizione da
verificare si trova
prima delle azioni da
eseguire (corpo).
COND
N
s
istruzione1
istruzione2
Il while verifica la condizione all’inizio del ciclo per
cui se inizialmente la condizione risulta falsa il
corpo del ciclo non viene mai eseguito
Affinchè il ciclo while, nel caso la condizione sia stata inizialmente trovata vera,
abbia la possibilità di terminare è necessario che all’interno del corpo vi sia
una istruzione che modifichi il valore della condizione
ALGORITMO
24
Esecuzione di un ciclo while
ESERCIZIO: Leggi ripetutamente un numero in ingresso e
calcolane la radice quadrata fino a quando il numero letto è > 0
//
// Ciclo2.java
//
import java.util.Scanner; // program uses class Scanner
public class Ciclo2
{
// main method begins execution of Java application
public static void main( String args[] )
{
// create Scanner to obtain input from command window
Scanner input = new Scanner( System.in );
System.out.print( "Dammi il primo numero: " ); // prompt
int number1; // read a
number1 = input.nextInt(); // read first number from user
while(number1>0)
{
System.out.println(Math.sqrt(number1));
System.out.print( "Dammi un altro numero: " ); // prompt
number1 = input.nextInt(); // read first number from user
}
System.out.println( "Fine");
} // end method main
} // end class Ciclo2
schermo
Dammi il primo num.
5.0
25
Dammi un altro num.
3.0
9
Dammi un altro num.
0
Fine
Anche la struttura while…, consente di
eseguire ripetutamente il corpo del ciclo
anche per un numero di volte indeterminato
ALGORITMO
25
Esempio di iterazione con controllo in testa
ESERCIZIO: Visualizzazione dei primi 10
multipli di 5
num=5
Codifica in Java:
cont=1
num=5; cont=1;
while (cont<=10)
{
ris=num*cont;
Condizione di
inizio ciclo
(mentre cont10)
System.out.printf(“%d”, ris);
cont++;
}
cont10
N
fine ciclo
s
ris=num*cont
Istruzioni ripetute
all’interno del ciclo
scrivi ris
cont=cont+1
ALGORITMO
26
ITERAZIONE ENUMERATIVA (for)
Ha questo nome poiché si tratta di un’iterazione in cui si
conosce quante volte il ciclo viene ripetuto.
L’iterazione enumerativa è derivata dalla iterazione con controllo in
testa, perciò la sua rappresentazione con il flow-chart sarà simile a
quella dell’iterazione con controllo in testa.
E’ però presente una variabile intera di controllo del numero
ripetizioni del corpo del ciclo.
Tale variabile viene inizializzata fuori ciclo, incrementata nel ciclo
e controllata nella condizione di uscita dal ciclo (ciclo contatore).
Indicata nella gestione degli array monodimensionali (vettori) o
bidimensionali (matrici) poiché in queste strutture è obbligatorio dichiarare di
quanti elementi sono formate.
ALGORITMO
27
Esempio di iterazione enumerativa
ESERCIZIO: Visualizzazione dei primi 10 multipli di
di 5 (contatore sulla variabile cont)
num=5
inizializzazione
cont=1
Codifica in Java:
num=5;
for (cont=1;cont<=10;cont++)
{
ris=num*cont;
System.out.printf(“%d”, ris);
}
cont10
controllo
s
ris=num*cont
scrivi ris
incremento
ALGORITMO
cont=cont+1
28
Codifica in Java dell’ iterazione
enumerativa
for ( espressione1; espressione2 ; espressione3 )
istruzione;
L’istruzione for è composta da tre espressioni separate dal ‘;’ la prima è di
inizializzazione, la seconda di controllo, la terza di incremento.
L’ordine di esecuzione è il seguente:
1) esecuzione dell’espressione1 (una sola volta)
2) controllo dell’espressione2 (ripetuta dopo ogni incremento)
3) esecuzione dell’istruzione (se espressione2 è vera, altrimenti si esce dal ciclo)
4) esecuzione dell’espressione3 (incremento e ritorno al punto 2)
ALGORITMO
29
Quando si equivalgono while / for
Esempio di equivalenza strutture iterative while e for per iterazioni
controllate da contatore in Java:
float lato, area;
int i;
for (i=0; i<3;
…..
}
i++) {
float lato, area;
int i;
i=0;
while (i<3) {
….
i++;
}
ALGORITMO
30
Esercizi proposti sulla iterazione
enumerativa
•
Letto da tastiera un numero N positivo , acquisire N numeri e calcolarne la
media
•
Letto da tastiera un numero N positivo, acquisire N numeri e calcolare la
somma e la media dei positivi e la somma e la media dei negativi
ALGORITMO
31
SCELTA MULTIPLA
Nella realtà capita di dover
compiere, in modo esclusivo,
una tra più azioni
Nella scelta logica
• si sceglie di compiere o non
compiere un’azione
• si sceglie di compiere, in modo
esclusivo, una tra due azioni
La scelta multipla è derivata dalla scelta logica (selezione) ma
consente di scegliere tra più azioni
ALGORITMO
32
Esempio di scelta multipla
Esempio tipico di scelta multipla è quello di un programma che
permette all’utente, attraverso un menù iniziale, di scegliere tra
le funzioni offerte.
• Tale situazione è risolvibile
mediante una serie di scelte
logiche
• Molti linguaggi di
programmazione, tra cui il Java,
agevolano il programmatore
mettendo a disposizione la scelta
multipla
ALGORITMO
33
Rappresentazione della scelta multipla nel
diagramma a blocchi
X: variabile di cui va analizzato il contenuto
1
default
X
2
istr1
istr2
3
Default racchiude tutti i valori diversi da
quelli previsti
4
istr3
Valori che si prevede possa assumere X
(1, 2, 3, 4)
istr4
istrd
istr1, istr2,… rappresentano le istruzioni da eseguire.
Se nella variabile X c’è il valore 1 viene eseguito il gruppo di istruzioni istr1, se in X
c’è il valore 2 le istruzioni istr2 e così via.
ALGORITMO
34
Sintassi della selezione multipla in C++
In Java la Selezione Multipla è rappresentata dalla istruzione switch-case
switch (variabile){
case <costante1>: <sequenza di istruzioni1>; break;
case <costante2>: <sequenza di istruzioni2>; break;
....
case <costanten>: <sequenza di istruzionin>; break;
default : <sequenza di istruzioni>;
break;
}
•
•
•
•
le espressioni costanti costante1, costante2, ..., costanten devono essere di tipo intero
In Java i caratteri sono assimilati agli interi (ne viene considerata la codifica interna in
ASCII)
l’istruzione break serve per terminare lo switch dopo aver eseguito solo la sequenza
associata ad una particolare scelta (case) e proseguire con l’istruzione successiva allo
switch-case;
nel costrutto può comparire la clausola default per individuare la sequenza di operazioni
da compiere quando il valore esaminato non coincide con alcuno di quelli specificati
ALGORITMO
35
Semplice esempio di switch-case in Java
ESERCIZIO: dato un numero intero, visualizza il nome del
giorno della settimana corrispondente
class SwitchStagione {
public static void main(String args[]) {
int mese=4;
String stagione;
switch (mese) {
case 12:
case 1:
case 2:
stagione="inverno”;
break;
case 3:
case 4:
case 5:
stagione="primavera”;
break; //senza questo break si ha estate
case 6:
case 7:
case 8:
stagione="estate”;
break;
case 9:
case 10:
case 11:
stagione="autunno”;
break;
default: //la clausola default è opzionale
stagione="non identificabile”;
}
System.out.println("La stagione e' "+stagione+".");
}
}
ALGORITMO
36
Esercizi proposti sulla selezione multipla
• Prevedere un programma che visualizzi un menù con tutte le materie
scolastiche. Scelta una particolare materia, dovrà comparire il nome
dell’insegnante.
• Assegnazione dei premi ad un’estrazione.
Viene generato un intero casuale compreso tra 1 e 4 con i seguenti
abbinamenti:
1 vincita di un Personal Computer
2 vincita di una telecamera
3 vincita di un videoregistratore
4 vincita di una macchina fotografica
• Dato un numero compreso tra 1 e 12, indicare il nome del mese
corrispondente
ALGORITMO
37