L’ALGORITMO
I DATI
LE ISTRUZIONI
LE STRUTTURE FONDAMENTALI
ALGORITMO
FINE
1
L’ALGORITMO
Informalmente, un algoritmo è una procedura ben definita che
serve per risolvere un dato problema
E’ una sequenza di passi che prende dei valori come input e
produce altri valori come output
Più precisamente, un algoritmo è un procedimento di calcolo ,
descrivibile con un numero finito di operazioni che conducono al
risultato
ALGORITMO
2
Diffusione degli algoritmi
Le tecniche di progettazione di algoritmi e di analisi di
correttezza e di efficienza si sono evolute nella seconda metà
del XX secolo grazie alla diffusione dei calcolatori elettronici
Ovunque si impieghi un calcolatore occorrono algoritmi
corretti e efficienti che ne utilizzino al massimo le possibilità
Esempi di algoritmi efficienti: controllo dei voli aerei
•
regolazione reattori nucleari
•
reperimento d’informazioni da archivi
•
smistamento di comunicazioni telefoniche
•
gioco degli scacchi
•
controllo della produzione di una catena di montaggio
ALGORITMO
3
IL PROGRAMMA
Gli algoritmi sono astratti e per controllarne il funzionamento
devono essere realizzati con un qualche strumento concreto
• Ad esempio la descrizione di una ricetta di cucina è un algoritmo ma la preparazione della pietanza
è la realizzazione della ricetta.
E’ solo allora che si vede se la ricetta “funziona”
• Altro esempio può essere rappresentato da una qualsiasi formula matematica, che rappresenta,
nel linguaggio matematico un procedimento. Ma la bontà di tale regola può essere verificata solo
con dei veri e propri calcoli, sostituendo alle variabili dei veri numeri.
In ambito informatico, un algoritmo viene descritto tramite un
programma, ossia un testo scritto in uno specifico linguaggio
detto linguaggio di programmazione per essere eseguito da
calcolatori elettronici
ALGORITMO
4
L’algoritmo e il programma
Ogni linguaggio di programmazione ha una sua sintassi ed una
propria rappresentazioni dei dati, e utilizza le proprie operazioni
di manipolazione dei dati
Invece:
Le proprietà degli algoritmi sono talmente fondamentali, generali e
robuste, da essere indipendenti dalle caratteristiche di specifici
linguaggi di programmazione o di particolari calcolatori elettronici
Quindi:
PER RISOLVERE UN PROBLEMA E’ ASSOLUTAMENTE
NECESSARIO TROVARE UN PROCEDIMENTO RISOLUTIVO
DESCRIVIBILE CON UN ALGORITMO, E SOLO DOPO SI
PUO’ PASSARE A SCRIVERE IL PROGRAMMA
ALGORITMO
5
PROGRAMMA = ISTRUZIONI + DATI
Un programma può essere visto come un manipolatore di dati:
a fronte di dati in ingresso che descrivono il problema
producono dati in uscita come risultato del problema
INPUT
(dati)
OUTPUT
PROCESSO
(istruzioni)
(dati)
Le operazioni sui dati sono le istruzioni.
I dati sono gli oggetti su cui vengono eseguite le istruzioni.
Tutti i linguaggi di programmazione prevedono un insieme di
dati e istruzioni
che il programmatore può utilizzare nella realizzazione dei propri
programmi.
ALGORITMO
6
I DATI
I dati possono essere distinti in base a :
INPUT
• Utilizzo all’interno del processo
OUTPUT
LAVORO
INTERO
• Formato
NUMERICO
DECIMALE
ALFANUMERICO
• Valore assunto durante il processo
VARIABILE
COSTANTE
Questi aspetti dei dati devono essere definiti già nell’algoritmo,
in modo da poterli poi “tradurre” con la sintassi propria del
linguaggio di programmazione
ALGORITMO
7
LE ISTRUZIONI
Anche le istruzioni devono essere scritte rispettando la
sintassi propria del linguaggio di programmazione
Ogni linguaggio di programmazione ha le proprie istruzioni, ma
tutti i linguaggi devono possedere alcune istruzioni per compiere
le azioni fondamentali
 Acquisire i dati su cui attivare il processo di elaborazione
input
• Comunicare all’esterno i risultati ottenuti
output
 Azioni di tipo aritmetico
- assegnare un valore ad una variabile
- utilizzare gli operatori aritmetici (+, -, /, *, %)
 Azioni di tipo logico
- Utilizzare gli operatori di relazione( =, <, >, <=, >=, <>) per
confrontare il contenuto di due variabili
- Utilizzare gli operatori logici (and, or, not)
ALGORITMO
assegnazione
confronto
8
ISTRUZIONI DI OUTPUT
Sono le istruzioni che visualizzano dati e messaggi a video
Esempio: scrivere un programma che manda un messaggio a video
INIZIO
Scrivi “ciao! Sono il
computer”
FINE
#include <iostream>
using namespace std;
int main( )
{
cout<<"\nciao! Sono il computer”;
system("PAUSE");
}
Nell’algoritmo il comando di output è scrivi seguito dal messaggio o dal dato
che si deve far vedere a video
In linguaggio C++ l’istruzione è cout<<
Il messaggio deve essere inserito tra virgolette
ESERCIZIO : messaggio
Codifica un programma che manda a video il seguente messaggio:
“Ciao! Io sono il Computer! Benvenuto nel mio mondo!”
ALGORITMO
soluzione
9
ISTRUZIONI DI INPUT
Sono le istruzioni che acquisiscono dati digitati da tastiera
Esempio: scrivere un programma che legge un numero e le riscrive a video
INIZIO
scrivi “indica un numero”
Leggi numero
scrivi “il numero indicato
vale”
#include <iostream>
using namespace std;
int main()
{ int numero;
cout<<"\nindica un numero"<<endl;
cin>>numero;
cout<<"\nil numero indicato vale :“;
cout<<numero<<endl;
scrivi numero
system("PAUSE");
FINE
}
Nell’algoritmo il comando di input è leggi seguito dal dato che si deve acquisire
In linguaggio C++ l’istruzione è cin>>
Il dato deve essere stato definito prima dell’acquisizione
ALGORITMO
10
Esempio di esecuzione di input e di output
#include <iostream>
using namespace std;
1
2
3
ram
int main()
{ int numero;
numero
7
cout<<"\nindica un numero"<<endl;
cin>>numero;
4
cout<<"\nil numero indicato vale :“;
5
cout<<numero<<endl;
system("PAUSE");
}
1 Allocazione della variabile numero
2 Output a video di un messaggio
3 Acquisizione del valore digitato da tastiera
con echo a video
4 Output a video di un messaggio
5 Output del valore della variabile numero
ALGORITMO
Programma caricato in memoria
per essere eseguito
7
tastiera
video
indica un numero
7
Il numero indicato
7
11
OUTPUT DI DATI
Nell’esempio precedente abbiamo visto l’output di un dato numerico:
cout<<numero<<endl;
A differenza dell’output dei messaggi, il dato non deve essere
inserito tra virgolette
A video viene mostrato il valore del dato, e non il nome
Tabella dei dati
INIZIO
nome
I/O
V/C
N/A
descrizione
altezza
I/O
V
N intero
Altezza della persona
scrivi “quanto sei alto?”
leggi altezza
scrivi “adesso il computer sa
che sei alto “
scrivi altezza
FINE
ESERCIZIO : ALTEZZA
soluzione
Codifica il programma indicato nell’algoritmo
ALGORITMO
12
ISTRUZIONI DI ASSEGNAZIONE
L’istruzione di assegnazione è quella che assegna un
valore ad un dato
Esempio: definire una variabile detta lato
ed assegnare a tale variabile il valore 9
int lato;
lato = 9;
L’assegnazione del valore può essere fatto anche
int lato=9;
contestualmente alla definizione
float prezzo= 0;
Trattandosi di variabili, il valore può essere
…..
modificato, ma senza ridefinire la variabile
…..
prezzo = 10.3;
Nel caso di valori costanti, l’assegnazione avviene necessariamente
nel momento della definizione e ovviamente non può essere
modificato
#define costante 9;
oppure
const int costante=9;
ALGORITMO
13
ASSEGNAZIONE TRAMITE
OPERAZIONI DI CALCOLO
Il valore di una variabile può essere il risultato di un calcolo
aritmetico
Gli operatori aritmetici binari (cioè che richiedono due dati su cui operare) del
linguaggio C++ sono:
+
Addizione
risultato = numero1 + numero2
-
Sottrazione
risultato = numero1 – numero2
*
Moltiplicazione
risultato = numero1 * numero2
/
Divisione
risultato = numero1 / numero2
%
Resto della divisione tra interi
risultato = numero1 % numero2
ALGORITMO
14
Esempio di operazioni di calcolo
INIZIO
Acquisire due numeri e mostrare il risultato della loro somma
#include <iostream>
sing namespace std;
scrivi “indica il primo
valore”
leggi N1
int main()
{ int N1, N2, totale ;
scrivi “indica il secondo valore”
cout<<"\nindica il primo valore "<<endl;
cin>>N1;
cout<<"\nindica il secondo valore "<<endl;
cin>>N2;
totale= N1 +N2;
cout<<"\nla somma è : " <<totale<<endl;
system("PAUSE");
leggi N2
totale N1 + N2
scrivi “la somma è : “ totale
FINE
}
nome
I/O
V/C
N1
I
V
N intero
Primo addendo
N2
I
V
N intero
Secondo addendo
totale
O
V
N intero
Numero ottenuto dalla somma dei due addendi
ALGORITMO
N/A
descrizione
15
Output concatenato
Dall’esempio precedente abbiamo visto che è possibile
concatenare più output con una stessa istruzione
cout<<"\nla somma è : " <<totale<<endl;
messaggio di testo
dato
carattere per andata a capo
Abbiamo visto anche che è possibile definire più variabili dello
stesso tipo con una stessa istruzione
int N1, N2, totale ;
ESERCIZIO : OPERAZIONI
Acquisire due numeri e mostrare il risultato delle quattro operazioni
ALGORITMO
soluzione
16
Operatore modulo
L’operatore modulo calcola il resto della divisione tra interi
Ad esempio:
7%3=1
6%4=2
6%3=0
Può essere utilizzato per verificare se un numero è pari o dispari.
Se un numero è pari, il resto della divisione per 2 è 0
6%2=0
Se un numero è dispari, il resto della divisione per 2 è 1
7%2=1
ALGORITMO
17
Esempio di utilizzo di operatore modulo
Dati due numeri interi, calcolare quoziente e resto
INIZIO
nome
scrivi “indica il primo
valore”
leggi N1
scrivi “indica il secondo valore”
leggi N2
I/O
V/C
N/A
descrizione
N1
I
V
N
intero
dividendo
N2
I
V
N
intero
divisore
quoziente
O
V
N
intero
Numero ottenuto dalla divisione di N1 e
N2
resto
O
V
N
intero
Resto ottenuto dalla divisione di N1 e
N2
quoziente N1 / N2
resto N1 % N2
scrivi “il quoziente è “ quoziente
“ il resto è “ resto
FINE
ALGORITMO
ESERCIZIO : QUOZIENTE E RESTO
codificare l’algoritmo scritto per calcolare
quoziente e resto di due numeri interi
soluzione
18
ASSEGNAZIONE TRAMITE
OPERATORI UNARI
Gli operatori aritmetici unari sono quelli che richiedono
un solo operando.
Nel linguaggio C++ sono:
++
Per incrementare di una unità l’operando
--
Per decrementare di una unità l’operando
l’istruzione
numero++
equivale all’istruzione
numero = numero + 1
l’istruzione
numero- -
equivale all’istruzione
numero = numero - 1
ALGORITMO
19
Esempio di assegnazione con operatori unari
Acquisire un numero e mostrare il successivo
INIZIO
scrivi “indica un numero”
leggi numero
numero++
scrivi “il valore successivo è
: “ numero
FINE
#include <iostream>
using namespace std;
int main()
{ int numero;
cout<<"\nindica un numero :";
cin>>numero;
numero++;
cout<<"\nil valore successivo e':"<<numero<<endl;
system("PAUSE");
}
ESERCIZIO : ETA’ DEI FIGLI
Una mamma ha tre figli, nati in anni consecutivi.
Data in input l’età del terzo figlio, comunicare l’età degli altri due
ALGORITMO
soluzione
20
ORGANIZZAZIONE DELLE ISTRUZIONI
Abbiamo visto le principali istruzioni che intervengono in un
algoritmo, e quindi in un programma.
La scrittura dell’algoritmo è una fase molto delicata e quindi si
ha bisogno di regole per una corretta organizzazione del lavoro
Tali regole sono alla base della programmazione strutturata
Secondo la programmazione strutturata, le istruzioni di un
algoritmo devono essere organizzate secondo strutture ben
definite, non devono cioè essere scritte senza uno schema ben
preciso
ALGORITMO
21
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
22
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
23
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 C++ 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
24
Esempio di istruzioni in sequenza
INIZIO
Scrivi “indica il prezzo”
Leggi PREZZO
Scrivi “indica lo sconto”
Leggi PREZZO
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
25
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 PREZZO
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
26
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
27
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
}
28
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
29
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
30
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
31
Sintassi della struttura di Selezione
In C++ 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.
32
Esempio Istruzione di Selezione a due vie
PROBLEMA: dato un numero si comunichi se il numero è pari o
dispari
INIZIO
Leggi a
F
V
istruzione precedente
#include <iostream>
istruzione if-else
using namespace std;
int main()
istruzione successiva
{
int a;
cin >> a; // leggi numero da terminale
a %2=0
Scrivi
“il numero è dispari”
if ((a % 2) = = 0)
{ cout << “il numero e’ pari”;
}
else
{ cout << “il numero e’ dispari”;
}
system("PAUSE");
Scrivi
“il numero è pari”
FINE
}
ESERCIZIO: NUMERO POSITIVO
acquisire un numero e comunicare se è positivo o negativo
ALGORITMO
soluzione
33
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 C++ è:
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
34
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
F
V
a >0
a = abs(a);
b = abs(a);
Scrivi b
FINE
ALGORITMO
istruzione precedente
#include <iostream>
istruzione if
using namespace std;
int main()
istruzioni
{
int a; float b;
successive
cin >> a; // leggi numero da terminale
if (a < 0 )
{
a = abs(a); // calcola valore assoluto di a
}
b = sqrt(a);
cout << “Radice quadrata: “ << b;
system("PAUSE");
}
ESERCIZIO: VOTI
acquisire 3 voti, calcolare e comunicare la media; se la media è
insufficiente, comunicare “devi fare i corsi di recupero”
soluzione
35
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
36
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
37
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 C++, 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
38
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
int n;
do
{cout << “Dammi un numero.“;
cin >> n;
if (n<=0)
cout<<“numero non positivo- ripetere”;
} //chiusura del corpo del ciclo
while (n<=0);
cout << “Fine”;
Memoria RAM
n
-30
12
xxx
-20
schermo
Dammi un numero
Numero non positivo-ripetere
Dammi un numero
- 30
Numero non positivo-ripetere
Dammi un numero
La struttura do..while, consente di eseguire
ripetutamente il corpo del ciclo anche per un
numero di volte indeterminato
ALGORITMO
- 20
12
Fine
39
Esempio di iterazione con controllo in coda
ESERCIZIO: Visualizzazione dei
primi 10 multipli di 5
num=5
Codifica in C++:
num=5; cont=1;
do
{
ris=num*cont;
cout<<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
40
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 C++:
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
41
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
42
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
43
ITERAZIONE CON CONTROLLO IN
TESTA ( while …)
Codifica in C++
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
44
Esecuzione di un ciclo while
ESERCIZIO: Leggi ripetutamente un numero in ingresso e
calcolane la radice quadrata fino a quando il numero letto è > 0
Memoria RAM
i
int i;
cout << “Dammi il primo num.”;
cin >> i;
while ( i > 0 )
{ cout << sqrt(i) << endl;
cout << “Dammi un altro num.“;
cin >> i;
}
//corpo del ciclo
cout << “Fine”;
Anche la struttura while…, consente di
eseguire ripetutamente il corpo del ciclo
anche per un numero di volte indeterminato
ALGORITMO
09
xxx
25
schermo
Dammi il primo num.
5
25
Dammi un altro num.
3
9
Dammi un altro num.
0
Fine
45
Esempio di iterazione con controllo in testa
ESERCIZIO: Visualizzazione dei primi 10
multipli di 5
num=5
Codifica in C++:
cont=1
num=5; cont=1;
while (cont<=10)
{
Condizione di
inizio ciclo
(mentre cont10)
ris=num*cont;
cout<<ris;
cont++;
cont10
N
fine ciclo
s
ris=num*cont
Istruzioni ripetute
all’interno del ciclo
scrivi ris
}
cont=cont+1
ALGORITMO
46
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
47
Esempio di iterazione enumerativa
ESERCIZIO: Visualizzazione dei primi 10 multipli di
di 5 (contatore sulla variabile cont)
num=5
Codifica in C++:
inizializzazione
num=5;
for
(cont=1;cont<=10;cont++)
{
ris=num*cont;
cout<<ris;
}
cont=1
cont10
controllo
s
ris=num*cont
scrivi ris
incremento
ALGORITMO
cont=cont+1
48
Codifica in C++ 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
49
Quando si equivalgono while / for
Esempio di equivalenza strutture iterative while e for per iterazioni
controllate da contatore in C++:
float lato, area;
int i;
for (i=0; i<3;
i++) {
cout << “Lato ? ” << endl;
cin >> lato;
area=lato*lato;
cout << “Area: “ << area << endl;
}
cout << “Fine”;
ALGORITMO
float lato, area;
int i;
i=0;
while (i<3) {
cout << “Lato ? ”
<< endl;
cin >> lato;
area=lato*lato;
cout << “Area: “
<< area
<< endl;
i++;
}
cout << “Fine”;
50
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
51
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
52
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 C++,
agevolano il programmatore
mettendo a disposizione la scelta
multipla
ALGORITMO
53
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
54
Sintassi della selezione multipla in C++
in C++ 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 C++ 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
55
Semplice esempio di switch-case in C++
ESERCIZIO: dato un numero intero, visualizza il nome del
giorno della settimana corrispondente
main()
{
int num;
cout <<"Dammi un giorno (numero): ";
cin >> num ;
switch (num)
{
case 1: cout<<“ Lunedi” ; break;
case 2: cout<<“ Martedi” ; break;
case 3: cout<<“Mercoledi“ ; break;
case 4: cout<<“Giovedi“ ; break;
case 5: cout<<“Venerdi“ ; break;
case 6: cout<<“Sabato“
; break;
case 7: cout<<“Domenica“ ; break;
default : cout<<“Giorno Inesistente“ ; break;
}
}
ALGORITMO
56
Esercizio sulla selezione multipla
SEMPICE CALCOLATRICE
Scrivere un programma che, acquisiti due interi positivi, visualizzi un menù
che consenta di scegliere quale operazione aritmetica eseguire.
ANALISI
Si acquisiscono due interi , con il controllo che siano positivi
Si ripetono le seguenti istruzioni, finchè l’utente non indica espressamente che
vuole terminare
• si presenta a video un menu di scelta tra le 4 operazioni: 1- addizione, 2sottrazione, 3-moltiplicazione, 4-divisione.
Con la scelta 5 si esce dall’iterazione
• Si acquisisce la scelta e si esegue l’operazione richiesta mostrando a video il
risultato.
• In caso di scelta diversa da 1,2,3,4, 5 si manda un messaggio d’errore.
ALGORITMO
57
Esercizio : semplice calcolatrice
#include <iostream.h>
#include <conio.h>
void main( )
{
// campo per la scelta dell’operazione
char scelta;
// primo, secondo operando e risultato
int num1,num2,ris;
do
{
cout<<“\nInserisci primo numero “;
cin>>num1;
} while (num1<=0);
do
{ cout<<“\nInserisci secondo numero “;
cin>>num2;
} while (num2<=0);
ALGORITMO
//
Visualizzazione del menù di scelta
do
{
clrscr();
cout<<“\nMENU’ DI SCELTA\n\n”;
cout<<“\n1: Addizione”;
cout<<“\n2: Sottrazione”;
cout<<“\n3: Moltiplicazione”;
cout<<“\n4: Divisione”;
cout<<“\n5: Fine lavoro”;
cout<<“\nInserisci scelta “;
//
Acquisizione del campo scelta
cin>> scelta;
58
Esercizio : semplice calcolatrice
(prosegue soluzione)
// Utilizzo della scelta multipla
switch (scelta)
{
case ‘1’: {ris=num1+num2; cout<<“\nIl risultato è “<<ris; break; }
case ‘2’: {ris=num1-num2; cout<<“\nIl risultato è “<<ris; break; }
case ‘3’: {ris=num1*num2; cout<<“\nIl risultato è “<<ris; break; }
case ‘4’: {ris=num1/num2; cout<<“\nIl risultato è “<<ris; break; }
case ‘5’: break;
default : cout<<“\nScelta errata”;
}
cout<<“\nIl risultato è “<<ris;
} while (scelta !=‘5’);
cout<<“\nCiao!”;
}
ALGORITMO
59
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
60
Soluzione esercizi
•
•
•
•
•
•
•
•
•
•
Messaggio
Altezza
Operazioni
Quoziente e resto
Età dei figli
Prezzo
Numero positivo
Voti
Numero positivo o nullo
benvenuto
ALGORITMO
61
Esercizio : Messaggio
ESERCIZIO : messaggio
Codifica un programma che manda a video il seguente messaggio:
“Ciao! Io sono il Computer! Benvenuto nel mio mondo!”
#include <iostream>
using namespace std;
int main( )
{
cout<<"\nCiao! Sono il computer!Benvenuto nel mio mondo!”;
system("PAUSE");
}
Teoria
ALGORITMO
Elenco esercizi
62
Esercizio: altezza
ESERCIZIO : ALTEZZA
#include <iostream>
Leggere l’altezza di una persona e poi mostrarla a video
using namespace std;
int main()
{
int altezza;
cout<<"\nquanto sei alto?";
cin>>altezza;
cout<<"\nadesso il computer sa che sei alto "<<altezza<<endl;
system("PAUSE");
}
Teoria
ALGORITMO
Elenco esercizi
63
Esercizio: Operazioni
ESERCIZIO : OPERAZIONI
#include <iostream>
using namespace std;
int main()
Acquisire due numeri e mostrare il risultato delle quattro operazioni
{
float n1, n2, ris;
cout<<"\nindica il primo operando :"; cin>>n1;
cout<<"\nindica il secondo operando :"; cin>>n2;
ris=n1+n2;
cout<<"\nla loro somma vale : "<<ris;
ris=n1-n2;
cout<<"\nla loro differenza vale : "<<ris;
ris=n1*n2;
cout<<"\nil loro prodotto vale : "<<ris;
ris=n1/n2;
cout<<"\nil loro rapporto vale : "<<ris<<endl;
system("PAUSE");
}
Teoria
ALGORITMO
Elenco esercizi
64
Esercizio: quoziente e resto
#include <iostream>
using namespace std;
int main()
{
int n1, n2;
float quoziente, resto;
cout<<"\nindica il primo valore :";
cout<<"\nindica il secondo valore :";
ESERCIZIO : QUOZIENTE E RESTO
codificare l’algoritmo scritto per calcolare
quoziente e resto di due numeri interi
cin>>n1;
cin>>n2;
quoziente = n1/n2;
resto = n1% n2;
cout<<"\nil quoziente e': "<<quoziente <<" e il resto e' "<<resto;
system("PAUSE");
}
Teoria
ALGORITMO
Elenco esercizi
65
Esercizio: età dei figli
ESERCIZIO : ETA’ DEI FIGLI
#include <iostream>
Una mamma ha tre figli, nati in anni consecutivi.
using namespace std;
Data in input l’età del terzo figlio, comunicare l’età degli altri due
int main()
{
int eta;
cout<<"\nindica l'eta' del terzo figlio :"; cin>>eta;
eta++;
cout<<"\nil secondo figlio ha "<<eta<<" anni "<<endl;
eta++;
cout<<"\nil primo figlio ha "<<eta<<" anni "<<endl;
system("PAUSE");
}
Teoria
ALGORITMO
Elenco esercizi
66
Esercizio: prezzo
#include <iostream>
using namespace std;
PROBLEMA: dato il prezzo di un prodotto e lo
sconto effettuato, calcolare e comunicare il
prezzo scontato
int main()
{
float prezzo, sconto, c;
cout<<"\nindica il prezzo : ";
cin>>prezzo;
cout<<"\nindica lo sconto : ";
cin>>sconto;
c = prezzo - sconto;
cout<<"\nil prtezzo scontato e' : "<<c<<endl;
system("PAUSE");
}
ALGORITMO
Teoria
Elenco esercizi
67
Esercizio: numero positivo
#include <iostream>
using namespace std;
int main()
ESERCIZIO: NUMERO POSITIVO
acquisire un numero e comunicare se è positivo o negativo
{
int numero;
cout<<"\nindica un numero : ";
cin>>numero;
if(numero >0)
cout<<"\nil numero "<<numero<<" e' positvo"<<endl;
else
cout<<"\nil numero "<<numero<<" e' negativo o nullo"<<endl;
system("PAUSE");
}
Teoria
ALGORITMO
Elenco esercizi
68
Esercizio: voti
#include <iostream>
using namespace std;
int main()
ESERCIZIO: VOTI
acquisire 3 voti, calcolare e comunicare la media; se la media è
insufficiente, comunicare “devi fare i corsi di recupero”
{
int voto1, voto2, voto3, somma;
float media;
cout<<"\nindica il primo voto : ";
cin>>voto1;
cout<<"\nindica il secondo voto : ";
cout<<"\nindica il terzo voto : ";
cin>>voto2;
cin>>voto3;
somma = voto1+voto2+voto3;
media = (float) somma / 3;
cout<<"\nla media dei voti e' "<<media<<endl;
if(media <6)
cout<<"\ndevi fare i corsi di recupero"<<endl;
system("PAUSE");
}
ALGORITMO
Teoria
Elenco esercizi
69
Esercizio: numero positivo o nullo
#include <iostream>
using namespace std;
ESERCIZIO: NUMERO POSITIVO O NULLO
acquisire un numero e comunicare se è positivo ,negativo o nullo
int main()
{
int numero;
cout<<"\nindica un numero : ";
cin>>numero;
if(numero >0)
cout<<"\nil numero "<<numero<<" e' positvo"<<endl;
else
if(numero <0)
cout<<"\nil numero "<<numero<<" e' negativo "<<endl;
else
cout<<"\nil numero "<<numero<<" e' nullo "<<endl;
system("PAUSE");
}
ALGORITMO
Teoria
Elenco esercizi
70
#include <iostream>
using namespace std;
int main()
{
string nome;
char sesso;
Esercizio: benvenuto
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
cout<<"\nindica il nome : ";
do
{
cout<<"\nindica il sesso : ";
if
cin>>nome;
cin>>sesso;
(sesso != 'm' and sesso != 'f')
cout<<"\nvalore errato: indicare 's' o 'm'"<<endl;
}
while (sesso != 'm' and sesso != 'f');
if (sesso =='m')
cout<<"\nBuongiorno, signor "<<nome<<endl;
else
cout<<"\nBuongiorno, signora "<<nome<<endl;
system("PAUSE");
Teoria
Elenco esercizi
}
ALGORITMO
71
Scarica

l`algoritmo