35
Gli algoritmi Analisi e programmazione Gli algoritmi Proprietà ed esempi Costanti e variabili, assegnazione, istruzioni, proposizioni e predicati Vettori e matrici I diagrammi a blocchi Analisi strutturata Gli algoritmi iterativi La pseudocodifica Gli algoritmi ricorsivi 1

Nessun titolo diapositiva - mat.unical.it · Tizio IIIAL Storia 17/09/08 7 Bianchi IIIAL Inglese 18/09/08 6 Caio IIIAL Storia 18/09/08 5 ... breve e semplice, è facile ricavare quali

Embed Size (px)

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