Informatica di base A.A. 2003/2004 Algoritmi e programmi.

Post on 01-May-2015

224 views 1 download

transcript

Informatica di base A.A. 2003/2004

Algoritmi e programmi

2

Algoritmi

Algoritmo: procedura per risolvere una classe di problemiDa algoritmo a programmaCaratteristiche di un algoritmo efficace:

Generale: deve funzionare per tutti i problemiNon ambiguo: unica interpretazione dei passiEseguibile: i passi devono poter essere fatti in tempo finito

3

Programmazione

Disciplina che dice come definire gli algoritmi in modo che possano essere eseguiti da un calcolatoreProgramma: definizione di un algoritmo, scritto secondo certe regole sintatticheFasi di sviluppo di un programma:

Definizione: specifica del problema + algoritmoRealizzazione: scrittura del programma che corrisponde all’algoritmoManutenzione: modifiche del programma e/o dell’algoritmo

4

Caratteristiche di un programma

Efficienza: risolvere un problema nel minimo tempo e con le risorse (memoria) a disposizione

Leggibilita’: scritto in modo chiaro e documentato, per agevolare la manutenzione

Modificabilita’: Facilita’ di modificarlo

5

Efficienza – esempio:somma dei primi n numeri 1, ..., n

1. Leggi n2. Inizializza S a 03. Inizializza I a 14. Esegui S = S+I5. Incrementa I (I=I+1)6. Se I<n torna a 4, altrimenti se I=n esegui 77. Stampa SRichiede n somme

6

Secondo algoritmo

Uso la proprieta’ S = n x (n+1) /21. Leggi n2. Calcola S = n x (n+1)/23. Stampa SUna sola somma, 1 prodotto, 1 divisione: solo 3 operazioni aritmetiche piu’ efficiente

7

Sviluppo di un algoritmo

Diagrammi di flusso: rappresentazione grafica per mostrare l’ordine logico delle operazioniRettangolo: operazione da svolgereRombo: scelta fra due rami dell’algoritmo (salto condizionato)

8

Strategia top-down

Suddividere il problema in sottoproblemi indipendenti pezzi con un punto di ingresso e uno di uscitaComporre i pezzi dei sottoproblemi per ottenere l‘intero algoritmoVantaggi:

Scrivere i vari pezzi separatamenteProgrammi leggibiliErrori localizzati e semplice trovarliPiu’ programmatoriPochi salti intrecciati

Programmazione strutturata

9

Linguaggi di programmazione

Linguaggi ad alto livello (rispetto all’Assembler)Linguaggi imperativi: rispecchiano le operazioni reali nell’architettura di Von Neumann

Scrivere un valore in una cella di memoria o in un registro

Es.: Fortran (Formula Translator), 1954Algol, Cobol, APL, LISP (’60), Pascal, Prolog (’71), C (’74), Ada (’79), C++ (’85), Java (’94)

10

Elementi dei linguaggi di programmazione

Alfabeto: alfabeto inglese, cifre decimali (0,1,...,9), punteggiatura (;), simboli di operazioni (+,-,*,...)Parole chiave: es. IF, THEN, WHILE, ...Operatori: aritmetici, logici (and, not, or, ...), relazionali (<, >, =, ...)Tipi di dati: interi, reali, caratteri, ...Sintassi: regole per scrivere un programmaSemantica: significato dell’esecuzione di un programma

11

Variabili e assegnamenti

Variabile: nome associato ad una cella di memoriaPuo’ assumere un valore (quello contenuto nella cella)Istruzione di assegnamento per dare un valore ad una variabileValore ottenuto calcolando un’espressione (es: A+3)Es. (Pascal): X := Y+3Es. (C): X = Y+3Es. (C): X=X+1 (X da entrambe le parti!)

12

Costrutti di programmazione

SequenzaSelezioneIterazioneSalto incondizionatoProcedura rientranteFunzione ricorsiva

13

Sequenza

Istruzioni eseguite in sequenzaEs: S1;S2;S3; ...; Sk;Es. (Pascal):

BeginX:=Y+3;Z:=X+4End

Es. (C):{X=Y+3;Z=X+4;}

S1

Sk

S2

14

Selezione (uno o due rami)

Se E e’ vera, esegui S1 (altrimenti esegui S2)E espressione Booleana (vera o falsa)Es.: A < BCostrutto IF THEN ELSEEs.: (Pascal)

If a > 0 then a: a-1 else b:=aEs. (C):

If (a >0) a=a-1 else b=a

E

S1V

F

E

S1

V F

S2

15

Selezione (piu’ di due rami)

Condizione non Booleana piu’ valori piu’ ramiCostrutto CASEEs. (Pascal):

Case veicolo ofBicicletta: tassa:=0;Motociclo: tassa:=30;Auto: tassa:=100End;

16

Iterazione - while

Per ripetere un gruppo di comandi finche’ non si verifica una certa condizioneCostrutto WHILE: finche’ E e’ vera ripeti STest prima del ciclo (loop) se E e’ falsa all’inizio, S non viene mai eseguitoEs. (Pascal):

i:=1;While i <= 100 doBegin ... i:=i+1 end;

Es. (C):I=1;While (i<=100) { ... I++;}

E

S1V

F

17

Iterazione -repeat

Costrutto REPEAT: ripeti S fino a che E e’ falsaTest dopo il loop S viene sempre seguito almeno una voltaEs. (Pascal):

I:=1;Repeat...I:=i+1Until i> 100;Es. (C): I=1;Do{...I++;} while (i<=100);

E

S1

V

F

18

Iterazione -for

Costrutto FOR: ripeti S n volte Non c’e bisogno di una condizione, so gia’ quante volte eseguire SEs. (Pascal):

For i:=1 to 100 do

Begin ... End

Es. (C): For (i=1;i<=100,i++)

{ ... }

19

Salto incondizionato

Per saltare ad una qualunque istruzione che non sia la seguente

Costrutto GOTO

Contrasta con la programmazione strutturata (effetto spaghetti)

Usare solo se assolutamente necessario!

20

Gruppi di aula informatica

Gruppo 1 (matematici): Martedi’ 4 Novembre 14:00

Mercoledi’ 12 Novembre 14:00

Venerdi’ 21 Novembre 11:20

Venerdi’ 28 Novembre 11:20

21

Gruppi di aula informatica

Gruppo 2: Mercoledi’ 5 Novembre 14:00

Givedi’ 13 Novembre 11:20

Giovedi’ 20 Novembre 11:20

Martedi’ 25 Novembre 14:00

22

Gruppi di aula informatica

Gruppo 3: Giovedi’ 6 Novembre 11:20

Venerdi’ 14 Novembre 11:20

Martedi’ 18 Novembre 14:00

Mercoledi’ 26 Novembre 14:00

23

Gruppi di aula informatica

Gruppo 4: Venerdi’ 7 Novembre 11:20

Martedi’ 11 Novembre 14:00

Mercoledi’ 19 Novembre 14:00

Giovedi’ 27 Novembre 11:20

24

Esercizio: programma per somma (C++)

Main(){Int X=10, Y=25, Zero=0;X=X+Y;If (X > Zero) Y=X);}

Dichiarazioni: utili per sapere quanto spazio allocare

per questi nomi

Nome funzione principale

Dichiarazioni

Sequenza

25

Esercizio: minimo esponente e tale che 2 alla e superi X (C++)

Main(){ Int X=10, p=1, e=0; While (X>p) { p=p*2; esponente++; }}

Nome funzione principale

Dichiarazioni

Sequenza

26

Struttura di un programma (C)

Intestazione Dichiarazione variabiliComandi (corpo) programma principaleFunzione 1Funzione 2...Funzione n

27

Esempio: stampa dei numeri da 1 a 10

main() { Int i; For (i=0;i<10;i++) Printf(“%d\n,i+1); }

28

Procedura rientrante (o sottoprogramma)

Pezzo di programma con un nome e una lista di variabili (argomenti o parametri) Scritto una volta solo, ma posso ‘’chiamarlo’’ piu’ volte e con dati diversiAnche risultati dal sottoprogramma al programma chiamante (funzione)Quando lo chiamo (call), salto alla prima istruzione del sottoprogramma e salvo l’indirizzo della prossima istruzioneQuando finisce, ritorno al punto in cui ero (quello salvato)

29

Esempio: funzione per xy (in Pascal)

Function potenza (base: real, esponente: integer): real;Var risultato: real;begin risultato := 1; While (esponente >0) begin Risultato := risultato * base; Esponente := esponente –1; End; Potenza : = risultatoEnd;

30

Esempio: funzione per xy (in C)

Float potenza (float base, int esponente){ Float risultato = 1.0; While (esponente >0) { Risultato = risultato * base; Esponente = esponente –1; } Return risultato;}

Es. di chiamata: z = potenza(x,3);

31

Struttura delle chiamate –1

Programma

Call A

Call B

Call C

Call B

Funzione A

Fine AFunzione B

Fine B

Fine C

Funzione C

32

Struttura delle chiamate - 2

Programma

Call A

Call A

Funzione A

Call B

Fine C

Funzione C

Funzione B

Call C

Fine B

Fine A

33

Funzioni ricorsive

Definizione ricorsiva: in termini di se’ stessoFunzione ricorsiva: chiama se’ stessa al suo internoEsempio: funzione fattoriale (fatt)

0! = 1N! = 1*2*3*4*...*n

Definizione iterativa:If (n=0 or n=1) then fatt = 1else {fatt = 1; for i=2 to n fatt = fatt*i}return fatt

34

Funzioni ricorsive

Definizione ricorsiva: in termini di se’ stessoFunzione ricorsiva: Chiama se’ stessa al suo internoEsempio: funzione fattoriale (fatt)

0! = 1N! = 1*2*3*4*...*n

Definizione ricorsiva: 0! = 1N! = n*(n-1)!

Funzione ricorsiva:If (n=1 or n=0) then fatt = 1Else {fatt = 1; fatt = n*fatt(n-1)}Return fatt

35

Da linguaggio X a linguaggio macchina

Se X= Assembler assemblatoreSe X piu’ ad alto livello compilatore o interpreteFasi di un compilatore:

Analisi lessicale: da caratteri a nomi, operatori, parole chiave, ... (tokens)Analisi sintattica/semantica: da tokens a costrutti (if then else, while, ...)

Generazione codice oggetto in linguaggio macchinaLinker/loader: collegamento tra vari Programmi e scelta degli indirizzi di RAM

Codice oggetto

eseguibile

compilatore

linker

loader

Programma

Programma in ling. macchina in RAM

36

Esempio

p := p + r * 60 sequenza di caratteriAnalisi lessicale: id1 := id2 + id3 * 60 sequenza di tokensAnalisi sintattica/semanticaGenerazione codice intermedio:

Temp1 := 60Temp2 := id3*temp1Temp3 := id2 + temp2Id1 := temp3

Ottimizzazione codice:Temp1 := id3 * 60Id1 := id2 + temp1

Generazione codice oggetto:MOVE id3 R2MULT R2 60MOVE id2 R1ADD R1 R2MOVE R1 id1

:=

id1

id2

id3 60

+

*

37

Tipi di dati

I programmi possono gestire dati di diverso tipo:

Numerici: interi e realiNon numerici: booleani e caratteri

Inoltre, i dati possono essere:semplici (es. Un numero singolo o un carattere) strutturati (es. Ora: ore, minuti, secondi)

38

Tipi di dato strutturati

ArrayRecordCodaPilaLista

39

Array

Sequenza finite di dati omogeneiPer indicare un elemento: nome dell’intero array + indice(i)

Indice: posizione rispetto al primo elementoUn indice vettore (array monodimensionale). Es.: V[3]Due o piu’ indici matrice. Es.: V[3,2]

Dichiarazione di un array: nome + numero dimensioni + tipo elementi + numero elementi in ogni dimensione. Es.: int V[100];In memoria: celle contigue a partire da B, N elementi, ognuno lungo L indirizzo elemento i: B+ixLLimiti: dimensione fissa e dati omogeneiVantaggio: accesso diretto con tempo fisso

V

V[i]

V[1]

B+ixL

B L

40

Esempio (C)

Inizializzazione a 0 degli elementi di una matrice 20x20#define Max 20#define zero 0.0;main(){ int i,j; float A[Max][Max]; for (i=0;i<Max;i++) for j=0; j<Max; J++) A[i][j] = zero}

Macro: ogni occorrenza di Max e zero viene sostituita con 20 e 0.0 prima di iniziare a compilare (pre-processore)

41

Esempio (C++): determinare la posizione del massimo in un array di interi (while)

#include <iostream> il pre-processore include la libreria di funzioni iostream main(){ int a[]={10,0,5,-12,45,-9,23}; int i=1, max=A[0], pos_max=0; while (i<7) { if (A[i]>max) { max=A[i]; pos_max=i; } i++; } cout<<‘’Il massimo e’:’’<<max<<‘’ in posizione:’’ <<pos_max<<endI;}

Output standard (video)

Funzione << di scrittura

42

Esempio (C++): determinare la posizione del massimo in un array di interi (for)

#include <iostream>main(){ int a[]={10,0,5,-12,45,-9,23}; int max=A[0], pos_max=0; for (int i=1;i<7;i++) if (A[i]>max) { max=A[i]; pos_max=i; } cout<<‘’Il massimo e’:’’<<max<<‘’ in posizione:’’ <<pos_max<< endI;}

43

Esempio (C): prodotto degli elementi di un vettore di interi

main(){ int num[100]={10,0,5,-12,45,-9,23, ...}; float prod = 1.0; for (i=0;i<100;i++) prod= prod*num[i]; printf(“il Prodotto e’”,prod);}

44

Esempio (C): minimo e massimo di un vettore

main(){ int V[10]={10,0,5,-12,45,-9,23,8,10,9}; int min=max=V[0]; for (i=1;i<10;i++) { if (V[i]<min) min=V[i]; if (V[i]>max) max=V[i]; }}

45

Esempio (C): trovare la posizione di un elemento in un vettore

main(){ int val = 45, pos, i, T[10]={10,0,5,-12,45,-9,23,8,10,9}; pos=-1; i=0; do { if (val ==T[i]) pos=i; i++; }}

Numero di confronti O(n): 1 nel caso migliore, n nel caso pessimo (val non e’ contenuto in T)

46

Esempio (C): trovare la posizione di un elemento in un vettore ordinato – metodo dicotomico

main(){ int sn, dx, ct, N=10, val = 45, pos, i, T[10]={10,0,5,-12,45, 9,23,8,10,9}; pos=-1; sn = 0; dx = N-1; do { ct = (sn+dx+1)/2; if (val ==T[ct]) pos = ct; if (val < T[ct]) dx = ct-1 else sn=ct+1; } while (sn<=dx);}

Numero di confronti O(log2(n))

47

Esempio (C++): numero di elementi <0 in un array

main(){ int num=0,T[10]={10,0,5,-12,45, 9,23,8,10,9}; for (i=0;i<10;i++) if (T[i] < 0) num=num+1;}

48

Record

Composto da campi contenenti dati possibilmente di tipo diversoEs.: elenco del telefono, ogni riga e’ un record con

Cognome: sequenza di caratteriNome: sequenza di caratteriNumero telefono: intero

Struttura dati staticaAccesso direttoCome un array, ma con elementi di tipo diverso e indicati con nome invece che indice. Es.: riga.cognome = RossiEs. (C):

struct riga{

char cognome[20];char nome[20];int numero_telefono;

}

49

Lista

Struttura dinamica: oltre a leggere e scrivere elementi, anche inserimento e cancellazioneOgni elemento ha due parti: dato + indirizzo (puntatore) elemento successivo elemento successivi possono essere in posizioni lontane di memoriaPer accedere all’elemento i-esimo: scansione sequenziale dall’indirizzo del primo elemento tempo variabileInserzione di E tra Ei e Ei+1:

Scansione fino a EiLink(E) = link(Ei)Link(Ei)= ind(E)

Eliminazione di Ei:Scansione fino a Ei-1Link(Ei-1) = link(Ei)

E1 E2 En

50

Coda e pila

Dati ordinati in sequenzaStrutture dinamiche Coda: meccanismo FIFO (first in, first out)

Inserzione in fondoEliminazione in cima

Pila: estrazione e inserzione dalla stessa parte (LIFO: last in, first out)Celle contigue di memoriaPer una coda, basta un array (se si conosce la dimensione max.) e il puntatore al primo elementoPer la pila, lista con inizio pila = inizio lista no scansionePila usata per gestione memoria dei sottoprogrammi

coda pila

51

Domande – algoritmi e programmi

Cos’e’ un algoritmo?

Che differenza c’e’ tra un algoritmo e un programma?

Come si misura l’efficienza di un algoritmo?

Un algoritmo che ha complessita’ O(n) e’ piu’ o meno efficiente di uno che ha complessita’ O(logn)? E di uno che e’ O(n2) o O(2n)?

Cosa sono le parole chiave di un linguaggio di programmazione?

52

Domande – linguaggi

Cos’e’ la sintassi di un linguaggio di programmazione? E la semantica?

Cosa si intende per linguaggi imperativi?

Cos’e’ una variabile?

Cos’e’ un’espressione Booleana?

Cos’e’ un assegnamento?

53

Domande – costrutti e sottoprogrammi

Descrivere il costrutto di selezione a uno, due o piu’ rami

Descrivere i tre costrutti per l’iterazione, specificando le loro differenze

A cosa servono le dichiarazioni in un programma?

Cos’e’ un sottoprogramma?

Che differenza c’e’ tra una procedura e una funzione?

Cosa succede quando viene chiamato un sottoprogramma?

Cosa si intende per sottoprogramma ricorsivo?

54

Domande – compilatori e tipi di dato

Qual e’ la funzione di un compilatore?

Cosa succede durante la fase di analisi lessicale?

E quella di analisi sintattica?

Fare degli esempi di tipi di dati semplici

Cosa sono i tipi di dati strutturati? Fare degli esempi

Quali sono le principali caratteristiche di un array?

Cosa contiene la dichiarazione di un array?

Quali sono le principali differenze tra array e record?

55

Domande - liste

Quali sono le principali caratteristiche delle liste, e le differenze con gli array?

A parita’ di dati memorizzati, occupa piu’ spazio un array o una lista?

Quali sono le operazioni necessarie per inserire un nuovo elemento in una lista?

E per cancellare un elemento?

56

Cosa contengono le variabili d, n, e i alla fine dell’esecuzione del seguente programma?

Dato un qualunque array a, cosa calcola il programma nella variabile d? main();{ int n=0, a[] = {11, 3, 2, 4, 5}; float d = 0.0; for (i=0;i<5;i++) { d = d+a[i]; n=n+1; } d=d/n;}

Esercizio

d=5.0, n=5, i=4

d calcola la media degli elementi dell’array a

57

Esercizio: trovare il minimo e il massimo di una matrice

main(){ int V[10][20]={10,0,5, ...}; int min=max=V[0][0]; for (i=0;i<10;i++) for (j=0;j<20;j++) { if (V[i][j]<min) min=V[i][j]; if (V[i][j]>max) max=V[i][j]; }}

58

Esercizio: inizializzare una matrice a righe crescenti

main(){ int V[4][4]; for (i=0;i<4;i++) for (j=0;j<4;j++) { V[i][j] = j +1 + i*4; }}

9 10 11 12

5 6 7 8

1 2 3 4

13 14 15 16