2001/02 Lezione N. 9 Elementi di un algoritmo Inizio e fine. Sono i punti d’ingresso e d’uscita del flusso di esecuzione, rappresentati con ellissi nel diagramma di flusso e impliciti nella rappresentazione mediante pseudolinguaggi. Ingresso. Istruzione di acquisizione dei dati d’ingresso. I dati d’ingresso sono quelli che caratterizzano l’istanza del problema e si intendono forniti dall’utente che lancia l’esecuzione dell’algoritmo. Le operazioni di acquisizione di dati sono generalmente indicate come operazioni di lettura poiché si intende (con riferimento implicito ai calcolatori elettronici) che i dati vengano letti dai dispositivi di input o dalla memoria di massa. I valori acquisiti (letti) vengono assegnati a variabili. Uscita. Istruzione di presentazione dei risultati d’uscita. I risultati prodotti devono essere prodotti in uscita per essere fruibili. Le operazioni di produzione dei dati d’uscita sono indicate come operazioni di scrittura poiché si intende che i valori ottenuti vengano scritti su dispositivi di output o su dispositivi di memoria di massa. I valori scritti solo i valori correnti delle variabili specificate. Assegnamento. Le istruzioni di assegnamento hanno la forma variabile = espressione ed indicano che il valore corrente dell’espressione deve essere assegnato alla variabile. L’esecuzione di un’istruzione di assegnamento avviene in due fasi: la valutazione dell’espressione (utilizzando i valori correnti delle eventuali variabili che in essa compaiono) e l’aggiornamento del valore della variabile a sinistra del segno di uguaglianza. Es. Se a=3, l’istruzione b=a+2 lascia invariato il valore di a e assegna a b il valore 3+2, cioè 5. L’istruzione a=a+6 aggiorna il valore di a incrementandolo di 6 (il valore di a dopo l’esecuzione è 9). Salto. Deviazione del flusso di esecuzione rispetto all’ordine sequenziale delle istruzioni che compongono l’algoritmo. Diramazione di flusso condizionata. Biforcazione del flusso in due percorsi alternativi (mutuamente esclusivi) la cui esecuzione è condizionata al verificarsi di una condizione. L’esecuzione di un’istruzione condizionale comporta innanzitutto la valutazione della condizione, e quindi l’esecuzione delle istruzioni che compongono uno dei due cammini. Iterazione o ciclo. Esecuzione ripetuta di una o più istruzioni. La ripetizione dipende dall’esito di un controllo. È fondamentale che l’esito del controllo dipenda da variabili il cui valore può essere modificato dall’esecuzione delle istruzioni del ciclo. In caso contrario il ciclo verrebbe eseguito o mai (risultando inutile) o all’infinito (violando la definizione di algoritmo). Le variabili da cui dipende il controllo sono dette variabili di controllo del ciclo. Ogni ciclo è composto da 4 elementi: l’inizializzazione delle variabili di controllo, il controllo della condizione da cui dipende l’iterazione, il corpo del ciclo (sequenza delle istruzioni da eseguire ciclicamente) e l’aggiornamento delle variabili di controllo. falso cond. ramo 1 ramo 2 inizializz. falso cond. corpo aggiorn.. Es. Il seguente algoritmo contiene un ciclo controllato da una condizione sulla variabile di controllo A. 1. Leggi A 2. Leggi B 3. Se A=0 vai all’istruzione 7 4. Decrementa A 5. Incrementa B 6. Vai all’istruzione 3 7. Stampa B vero ⇐ inizializzazione della variabile di controllo ⇐ controllo della condizione ⇐ aggiornamento della variabile di controllo ⇐ corpo del ciclo vero Rappresentazione di domini numerici B R×R N×R B A B N× N B R×N A B ( A, B ) ∈ R × R | min{A, B}∈ N N×R ∪R× N A B A A Esempio Algoritmo 1: 1. Leggi A 2. Leggi B 3. P = 0 4. Se B=0 vai all’istruzione 8 5. Decrementa B 6. P = P+A 7. Torna all’istruzione 4 8. Stampa P Dominio di definizione: lo pseudocodice descrive un algoritmo nel dominio RxN (se B non fosse intero positivo o nullo l’esecuzione non terminerebbe). Dominio di applicazione al calcolo del prodotto: in tutto il dominio di definizione la funzione svolta dall’algoritmo è il calcolo di P=A*B. Complessità: le istruzioni 1. 2. 3. 4. e 8. vengono eseguite indipendentemente dal valore dei dati di ingresso. Ogni iterazione del ciclo comporta l’esecuzione delle istruzioni 5. 6. 7. e 4. Poichè il ciclo viene eseguito B volte, il numero totale di passi di esecuzione è Npassi=5+4*B. Eliminando le costanti si può dire che la complessità è O(B). Algoritmo 2: 1. Leggi A 2. Leggi B 3. P = 0 4. Se B<=0 vai all’istruzione 8 5. Decrementa B 6. P = P+A 7. Torna all’istruzione 4 8. Stampa P Dominio di definizione: RxR (l’esecuzione termina per qualsiasi coppia di valori di A e B) Dominio di applicazione al calcolo del prodotto: l’algoritmo calcola correttamente il prodotto P=A*B solo nel dominio RxN (se B è negativo il risultato è sempre 0, se B non è intero il risultato è sbagliato). Complessità: O(B). Equivalenza: gli algoritmi 1 e 2 non sono equivalenti poichè hanno domini di definizione diversi. Equivalenza ristretta a un sottodominio: nel dominio Nel dominio RxN sono equivalenti. Algoritmo 3: 1. Leggi A 2. Leggi B 3. P = 0 4. Se A<=0 vai all’istruzione 8 5. Decrementa A 6. P = P+B 7. Torna all’istruzione 4 8. Stampa P Dominio di definizione: RxR Dominio di applicazione al calcolo del prodotto: NxR (poichè questa volta è A ad essere usato come contatore del ciclo, è il primo ingresso a dover essere intero positivo). Complessità: O(A) Equivalenza: gli algoritmi 2 e 3 hanno lo stesso dominio, ma non sono equivalenti perchè esistono punti del dominio in cui forniscono risultati diversi (es: per A=2 B=-1 l’algoritmo 2 fornisce risultato 0, l’algoritmo 3 risultato – 2) Equivalenza ristretta a un sottodominio: i due algoritmi sono equivalenti nel dominio NxN. Algoritmo 4: Leggi A Leggi B P=0 A>B A<0 P = P+B A = A-1 B<0 Stampa P P = P+A B = B-1 Dominio: RxR. Dominio di applicazione al calcolo del prodotto: tutte le coppie di numeri tali che il minore dei due sia un numero naturale. In simboli: (A,B) appartenente a RxR tale che min{A,B} appartenga ad N. Complessità: O(min{A,B}) Equivalenza: l’algoritmo non è equivalente ai due precedenti perchè ha un dominio di applicazione al calcolo del prodotto diverso. Equivalenza ristretta ad un sottodominio: nel sottodominio NxN tutti i tre algoritmi sono equivalenti. Esercizi 1. Si osservi il seguente pseudocodice e si risponda ai quesiti sottostanti: 1. Leggi A 2. Leggi B 3. Se A≥B vai all’istruzione 7 4. C = A 5. A = B 6. B = C 7. R = 0 8. Se B≤0 vai all’istruzione 12 9. B = B-1 10. R = R+A 11. Torna all’istruzione 8 12. Stampa R a. b. c. d. e. f. g. h. i. Disegnare il diagramma di flusso equivalente allo pseudocodice. Tracciare l’esecuzione per i dati d’ingresso A=2, B=3. Tracciare l’esecuzione per i dati d’ingresso A=3, B=2. Determinare (se possibile) il valore finale di R (risultato dell’esecuzione) quando A=3.5, B=2. Determinare (se possibile) il valore finale di R (risultato dell’esecuzione) quando A=2.5, B=3. Stabilire in quanti passi termina l’esecuzione nei casi d. ed e. Stabilire il dominio di definizione dell’algoritmo. Determinare la complessità dell’algoritmo nel suo dominio di definizione. Indicare in quale dei seguenti domini l’algoritmo è definito e fornisce il prodotto di A e B (nelle risposte R indica il campo dei numeri reali, N il campo dei numeri naturali, interi positivi compreso lo 0, Z il campo dei numeri interi con segno, il simbolo x indica il prodotto cartesiano tra due insiemi)? RxR NxR RxN ZxZ NxN