View
220
Download
0
Category
Preview:
Citation preview
Gli algoritmi
• Analisi e programmazione
• Gli algoritmiProprietà ed esempi
Costanti e variabili, assegnazione, istruzioni, proposizioni epredicati
Vettori e matrici
I diagrammi a blocchi
Analisi strutturata
Gli algoritmi iterativi
La pseudocodifica
Gli algoritmi ricorsivi
1
Ancora esempi…
2
• Problema: Somma di unasequenza di numeri
Indicando con ai il genericoelemento da sommare, la formulagenerale è
S a1 a2 … an
La variabile n conta quante volte
si ripete l’iterazione: n viene
decrementata di 1 ad ogniiterazione ed il ciclo termina
quando n vale 0
La variabile A è usata per l’inputdegli ai, S per le somme parziali etotale
Costruiamo il primo algoritmo
Supportati da questo bagaglio di strumenti e di suggerimenti possiamo cimentarci nella costruzione del nostro primo algoritmo
Per fare questo ci atteniamo alla sequenza di fasi che emergono dall’algoritmo
Applichiamo questo procedimento risolutivo al problema del calcolo della media di una lista di numeri
Prepariamo tutti i materiali del problema: dati in input
Anzitutto ci occorre la lista dei numeri
ES: Abbiamo la lista cartacea allegata, sotto la forma di una tabella
Di questa tabella l’analisi testuale del testo del problema ci dice che ci occorre solo la colonna dei voti
La colonna dei voti sono i dati noti, ossia l’input all’algoritmo
nome studente classe materia data voto
Bianchi IIIAL Italiano 17/09/08 6
Rossi IIIAL Matematica 17/09/08 5
Tizio IIIAL Storia 17/09/08 7
Bianchi IIIAL Inglese 18/09/08 6
Caio IIIAL Storia 18/09/08 5
Sempronio IIIAL Sc. Informatiche 22/09/08 7
Rossi IIIAL Sc. Informatiche 22/09/08 8
Bianchi IIIAL Sc. Elettriche 22/09/08 4
Tizio IIIAL Inglese 25/09/08 6
Mario IIIAL Matematica 25/09/08 6
Bianchi IIIAL Sc. Informatiche 25/09/08 7
Sempronio IIIAL Italiano 25/09/08 5
Qui IIIAL Storia 01/10/08 6
Rossi IIIAL Sc. Elettriche 01/10/08 5
Quo IIIAL Italiano 02/10/08 6
Tizio IIIAL Sc. Meccaniche 02/10/08 5
Quo IIIAL Sc. Informatiche 02/10/08 7
Qua IIIAL Sc. Meccaniche 02/10/08 9
Rossi IIIAL Matematica 02/10/08 3
Bianchi IIIAL Sc. Meccaniche 02/10/08 5
Mario IIIAL Sc. Elettriche 03/10/08 5
Qua IIIAL Inglese 03/10/08 6
Qui IIIAL Storia 03/10/08 6
Sempronio IIIAL Sc. Elettriche 03/10/08 6
Mario IIIAL Italiano 03/10/08 7
Bianchi IIIAL Sc. Informatiche 03/10/08 6
Tizio IIIAL Matematica 06/10/08 5
Rossi IIIAL Inglese 06/10/08 2
Sempronio IIIAL Sc. Elettriche 06/10/08 9
Analisi testuale: dati di output
In questo esempio, essendo il testo del problema molto breve e semplice, è facile ricavare quali sono i dati incogniti, ossia in output, cioè
Il voto medio della classe
Problema
data una lista cartacea di numeri interi positivi
che possono rappresentare diversi dati, ad esempio
supponiamo che siano i voti di tutti gli studenti di una classe
determinare il voto medio della classe.
Intervistare gli esperti Fare una media di numeri è il lavoro da eseguire
Intervistiamo un esperto del dominio del problema, un matematico statistico (!!!)
Egli ci dice che l’operazione della media è:
Quindi dobbiamo fare due operazioni
La somma di tutti i voti da 1 a al numero complessivo dei voti N
Dividere questa somma per il numero complessivo dei voti N
N
i
ivotoN
media1
1
Le operazioni
In questo caso, determinata la soluzione del problema con una formula matematica, ne consegue che le operazioni da eseguire sono due operazioni aritmetiche:
Somma
Divisione
Gli operandi (i dati) della somma sono i singoli valori dei voti
Gli operandi (i dati) della divisione sono la somma totale dei voti e il numero complessivo dei voti
La fasi dell’algoritmo somma
Possiamo individuare due fasi di lavoro:
Sommatoria di tutti i voti
Calcolo della media matematica della sommatoria
La prima fase è un’attività ripetitiva
Qui si può vedere quale è il ragionamento intuitivo mentale
Nel caso in cui noi facciamo a memoria questo calcolo esplicitando la nostra attività:
Dedichiamo una cella (variabile) della nostra memoria
Sommiamo il primo numero a questa zona di memoria
Continuiamo a sommare i numeri successivi alla medesima cella di memoria finchè tutti i numeri sono terminati
Contiamo quanti sono i numeri sommati
Alla fine dividiamo la somma complessiva per il numero complessivo dei numeri
Revisione delle operazioni
1. Somma dei voti
2. Conteggio del numero dei voti
3. Divisione della somma per il conteggio del numero dei voti
Le prime due operazioni sono ripetitive ed avvengono nella prima fase dell’algoritmo
La terzo operazione è un’unica istruzione che viene eseguita in una seconda fase del lavoro,al termina della prima fase
Stesura dell’algoritmo
Si legge un voto alla volta
Si incrementa una sommatoria parziale
Si incrementa il contatore dei numeri
Si ripete questo blocco di istruzioni finchè ci sono numeri nella lista cartacea
Quando i numeri sono terminati la sommatoria parziale è la sommatoria S di tutti i voti della lista
Il contatore è la somma N del numero di tutti i voti
Si divide la sommatoria totale per il numero totale dei voti N e si ottiene media=S/N il risultato desiderato, ossia la media dei voti
Soluzione alternativa ?
Avremmo anche potuto caricare tutti i voti della lista ciascuno in una sua area di memoria
Quindi avremmo potuto fare un’unica istruzione di somma sommando contemporaneamente tutti i numeri
Contare il totale dei numeri della lista cartaceaEd infine calcolare la media dei voti come prima
Tuttavia questa seconda soluzione non comporta l’utilizzo della iterazione e ci piace di meno perché l’operazione di somma cambia al variare del numero dei voti da sommare
Invece il sistema iterativo non muta con il numero dei voti da sommare ed è quindi preferibile al precedente metodo
Quale è la soluzione di algoritmo preferibile ?
Quando per fare un algoritmo ho diverse possibilità
Occorre scegliere quelle che non devo cambiare al mutare dei dati, quali il numero dei dati o il valore di questi dati
Le soluzioni che utilizzano blocchi di istruzioni ripetitivi con l’ausilio di costrutti tecnici quali l’iterazione sono particolarmente «simpatici» perché resistono alle modifiche indotte dal mutato ambiente nozionistico
Per concretizzare l’algoritmo è utile un disegno (il flowchart)
L’inizio e la fine dell’algoritmo lo rappresentiamo con una forma geometrica ovale
Un’operazione di input e di output con un parallelogrammo
Un’operazione interna con un rettangolo
Una domanda con un rombo
Il collegamento tra queste forme geometriche tramite frecce orientate che rappresentano il verso della sequenza delle istruzioni
Inizio/fine
Input/output
domanda
calcolo
Le variabili del nostro algoritmo
Leggiamo dalla lista cartacea un numero alla volta
Occorre una cella di memoria per memorizzare il numero letto, chiamiamola “numero”
Occorre una cella di memoria per memorizzare la sommatoria parziale, chiamiamola “somma”
Occorre una cella per calcolare il numero dei voti, chiamiamola “contaVoti”
Occorre una cella di memoria per calcolare la media dei voti, chiamiamola “media”
Occorre individuare un costrutto di iterazione
Il flowchart della media dei voti
MediaVoti
Leggo voto
somma = somma + voto
contaVoti=contaVoti+1
altri voti ?
media=somma/contaVoti
scrivi media
fine
si
NB Parte difficile! Come si specifica?!
Scrittura dell’algoritmo in pseudoItaliano
MediaVoti ripeti finchè ci sono voti nella lista
leggi voto
aggiungi voto a somma
Incrementa di uno contaVoti
dividi somma per contaVoti ed assegna il risultato a media
scrivi media
fine
La pseudocodifica 1
• La pseudocodifica è un linguaggio per la descrizionedi algoritmi secondo le regole della programmazionestrutturata
• La descrizione di un algoritmo in pseudocodifica sicompone di due parti...
la dichiarazione delle variabili usate nell’algoritmo
la descrizione delle azioni dell’algoritmo
17
La pseudocodifica 2
• Tipo delle variabiliIl tipo di una variabile indica l’insieme dei valori chepossono essere assegnati a quella variabile
Su costanti e variabili di un tipo è possibile effettuare leoperazioni che sono proprie di quel tipo e tutte leoperazioni di confronto
Sono permessi i seguenti 4 tipi: integer, real, boolean,stringq
18
La pseudocodifica 3
• integer: sono le variabili cui possono essere assegnati numeri interi;le costanti di tipo integer sono numeri interi, ad es. 1, 3, 150
• real: sono le variabili cui possono essere assegnati numeri razionali;le costanti real possono essere rappresentate in notazione decimale,con un “.” che separa la parte intera dalla parte decimale (ad es.,5.17, 12.367, 123., 0.005) o in notazione scientifica(23.476E3=23476, 456.985E3=0.456985)
• boolean: sono le variabili cui possono essere assegnati i valori logici;le costanti logiche sono true e false
• stringq: sono le variabili cui possono essere assegnate parole (ostringhe) costituite da q caratteri; le costanti stringq sono costituiteda parole di q caratteri racchiusi tra apici (che non fanno parte dellacostante); ad es., ‘FABIO’ è una costante string5,‘+’ è una costantestring1 e ‘124’ string3
19
La pseudocodifica 4
• Dichiarazione delle variabiliLa dichiarazione delle variabili nella pseudocodifica è unelenco, preceduto dalla parola var, delle variabili sulle qualil’algoritmo operaLe variabili sono suddivise per tipo: quelle dello stesso tiposono separate l’una dall’altra da una “,”; l’elenco dellevariabili dello stesso tipo è seguito dai “:” e dall’indicazionedel tipo; gli elenchi di variabili di tipo diverso sono separatidal “;”, l’ultimo elenco è seguito da un “.”
• Esempio:var i, j, a(20): integer;
p, q: real;
nome: string20;
sw: boolean.
20
La pseudocodifica 5
• Descrizione delle azioniGli schemi di flusso fondamentali sono descrittiutilizzando convenzioni linguistiche: ad ogni schemastrutturato corrisponde una convenzione linguisticaLa descrizione di un algoritmo deve soddisfare leseguenti regole:a) La prima azione dell’algoritmo è preceduta dalla parola begin;b) L’ultima azione dell’algoritmo è seguita dalla parola end;c) L’azione di lettura è rappresentata dalla parola read;d) L’azione di scrittura è rappresentata dalla parola write;
e) Lo schema di sequenza di n flussi S1, S2,…, Sn è rappresentatocome
S1;
S2;
Sn;
21
…
La pseudocodifica 6
f) Gli schemi di selezione sono rappresentati come:
g) Gli schemi di iterazione sono rappresentati come:
22
S, Sf, Sv sonoschemi di flussostrutturati
La pseudocodifica 7
• Esistono convezioni linguistiche alternative in relazione aparticolari schemi di flusso
• Esempio: Ciclo enumerativo
23
Se il valore di “incremento” è 1,la parte “step incremento” dellafrase for...endfor può essereomessa
La pseudocodifica 8
• Esempio: Algoritmo per il calcolo del vettore somma di due vettori dinumeri razionali
24
var a(100), b(100), c(100): real;
i, n: integer.
begin
read n;
for i from 1 to n do
read a(i), b(i);
c(i) a(i) b(i);
write c(i)
endfor
end
La pseudocodifica 9
• Esempio: Algoritmo per il calcolo del massimo elemento di unvettore di numeri razionali
25
var max, v(100): real;
i, n: integer.
begin
read n;
for i from 1 to n do
read v(i)
endfor
max v(1);
for i from 2 to n do
if max < v(i)
then max v(i)
endif
endfor
write max
end
La pseudocodifica 10
• Esempio: Algoritmo per il calcolo delle radici di equazioni di 2o grado
26
var x1, x2, a, b, c, delta: real.
begin
read a, b, c;
delta b24ac;
if delta0
then write “non esistono radici reali”
else if delta0
then x1 b/2a;
x2 x1
else x1 (b delta)/2a;
x2 (b delta)/2a
endif
write x1, x2
endif
end
Ancora esempi…
• Esempio: Algoritmo per il calcolo della somma di una sequenza di
numeri
27
var a, s: real;
n: integer.
begin
read n;
s 0;
repeat
read a;
s s a;
n n 1
until n 0
endrepeat
write s
end
Ancora esempi…
• Esempio: Ordinamento crescente per scambio
28
var a, v(100): real;
i, j, n: integer.
begin
i 1;
repeat
j i 1;
repeat
if v(j) v(i)
then a v(i);
v(i) v(j);
v(j) a
endif
j j 1
until j n
endrepeat
i i 1
until i n
endrepeat
end
Si suppone che (la dimensione e)gli elementi del vettore siano giàstati letti e memorizzati
Un esempio “comparativo”
• Letti due interi n e k, entrambi maggiori
di zero, stampare i primi n multipli di k
29
i 1;
while i n
p ki ;
write p;
i i 1;
endwhile
var i, n, k, p: integer.
begin
read n;
read k;
for i from 1 to n do
p ki ;
write p
endfor
end
#include <stdio.h>
main()
{
int i,n,k,p;
scanf(“%d”,&n);
scanf(“%d”,&k);
for(i1;i<n;i)
{
p ki;
printf(“%d”,p);
}
exit(0);
}
Linguaggio C
Considerazioni finali 1
• Attenzione alla scelta di un “buon” algoritmo…
Due algoritmi si dicono equivalenti quando:hanno lo stesso dominio di ingresso
hanno lo stesso dominio di uscita
in corrispondenza degli stessi valori nel dominio di ingressoproducono gli stessi valori nel dominio di uscita
Due algoritmi equivalenti forniscono lo stesso risultato, mapossono avere diversa efficienza e possono essereprofondamente diversi
30
Considerazioni finali 2
• Un esempio di due algoritmi equivalenti, ma con diversaefficienza, per la moltiplicazione fra interi è…
31
Considerazioni finali 3
• Esistono problemi che non possono essere risolti tramiteun calcolatore elettronico perché…
…la soluzione del problema non esiste
…la soluzione del problema richiederebbe un tempo dicalcolo eccessivo (anche infinito)
…la natura del problema è percettiva e/o la soluzione delproblema è “soggettiva”
32
Considerazioni finali 4
• Un esempio di problema indecidibile, tale cioè che non esistaalcun algoritmo capace di risolverlo, è il problema decisionaledella terminazione :
Dato un algoritmo B ed i suoi dati D, stabilire se lacomputazione B(D) termina
• In questo caso, infatti, non esiste un algoritmo A, cheaccettata una qualsiasi coppia B, D come dato in ingresso,stabilisca sempre in tempo finito se B(D) termina o meno
• Nota: A non può semplicemente consistere nel comandarel’esecuzione B(D) e controllarne il comportamento, poiché, setale esecuzione non terminasse, A non risponderebbe intempo finito
33
Considerazioni finali 5
• Un esempio di problema la cui soluzione richiederebbeun tempo infinito consiste nello stabilire se, data unafunzione intera f, f(x) è costante per ogni valore di x
• Infine, un esempio di problema la cui soluzione èsoggettiva è rappresentato dalla scelta, dato un insiemedi immagini di paesaggi, del paesaggio più rilassante
34
Esercizi
• Formalizzare l’algoritmo, attraverso diagramma a blocchi opseudocodifica, per risolvere i problemi:
Siano dati in input due vettori di interi, a e b, di dimensione n (ininput). Si calcoli la somma incrociata degli elementi a(1)+b(n),a(2)+b(n1), etc., la si memorizzi nel vettore c, e lo si stampi.
Siano dati in input un vettore v1 di interi (di dimensione n, ininput) ed un intero k. Si determini l’elemento di v1 più prossimo ak, e lo si stampi assieme all’indice corrispondente.
Dato l’insieme dei risultati d’esame (nell’intervallo da 0 a 100) din studenti, contare il numero di studenti che hanno superato laprova, sapendo che l’esame si intende superato con un votomaggiore o uguale a 50.
35
Recommended