Il concetto di stato Cosa si intende con stato I una particolare configurazione delle informazioni di una macchina, che in qualche modo memorizza le condizioni in cui si trova, e che cambia nel tempo passando ad un altra configurazione, in funzione dei segnali d ingresso. I Ad esempio, lo stato può rappresentare la posizione dell ascensore ad un certo piano di un edificio. In base allo stato si determina il modo in cui l ascensore si muove: se si intende andare al terzo piano e ci troviamo al primo piano, occorre che l ascensore salga. C. Bodei Dip.to Informatica FONDAMENTI DI PROGRAMMAZIONE a.a. 16/17 pag. 30 Il concetto di stato Il concetto di stato I La specifica (astratta) di un problema consiste nella descrizione di uno stato iniziale (che descrive i dati del problema) e di uno stato finale (che descrive i risultati attesi). I Si deve individuare una rappresentazione degli oggetti coinvolti (e dunque dello stato) direttamente manipolabile dall esecutore. I Un algoritmo è una sequenza di passi elementari che, se eseguiti, comportano ripetute modifiche dello stato fino al raggiungimento dello stato finale desiderato. I Le azioni di base che l esecutore è in grado di e ettuare devono dunque prevedere, tra le altre, azioni che hanno come e etto cambiamenti dello stato. I Possiamo pensare che lo stato sia il contenuto della memoria e che il cambiamento dello stato abbia come e etto il cambiamento di alcune posizioni della memoria. C. Bodei Dip.to Informatica FONDAMENTI DI PROGRAMMAZIONE a.a. 16/17 pag. 31
Il concetto di stato Un astrazione dello stato Dato che il calcolo procede attraverso l elaborazione dello stato, si devono poter esprimere valori dipendenti dallo stato. Astrazione del concetto di Stato Uno stato è un insieme di associazioni tra nomi simbolici e valori. In uno stato, ad ogni nome simbolico è associato al più un valore. Rappresentiamo una associazione tra il nome simbolico x ed il valore val con la notazione x ; val Il valore di x dipende dallo stato corrente, che gli associa un particolare valore val. C. Bodei Dip.to Informatica FONDAMENTI DI PROGRAMMAZIONE a.a. 16/17 pag. 32 Il concetto di stato Lo stato: esempi Stati corretti I {nome ; Antonio, cognome ; Rossi, età ; 25} I {importo ; $1650, tasso ; 10%, interesse ; $165 } I {a ; 25, b ; 3, c ; 50} Stati non corretti I {nome ; Antonio, nome ; Paolo, et a; 25} I {b ; 45, a; 150, b ; 10} C. Bodei Dip.to Informatica FONDAMENTI DI PROGRAMMAZIONE a.a. 16/17 pag. 33
I Introduciamo inizialmente l insieme di costrutti linguistici che costituiscono il nucleo di un qualunque linguaggio di programmazione reale, usando già la sintassi del C. I Senza entrare in eccessivi dettagli formali, nel presentare le notazioni utilizzate (sintassi) diamo anche una descrizione informale (semantica) di ciò che accade al momento dell esecuzione in corrispondenza dei vari costrutti. Il linguaggio contiene costrutti per: I rappresentare semplici calcoli attraverso le comuni operazioni logico/aritmetiche (espressioni) I modificare le associazioni nello stato (assegnamento e ingresso) I controllare l ordine di esecuzione delle azioni (controllo) I fornire i risultati (produzione in uscita dello stato finale) C. Bodei Dip.to Informatica FONDAMENTI DI PROGRAMMAZIONE a.a. 16/17 pag. 34 Espressioni Il ruolo delle espressioni è quello di denotare valori (dip. dallo stato). Espressioni Numeriche Il linguaggio consente di rappresentare semplici calcoli algebrici, attraverso le usuali espressioni costruite a partire dai valori numerici e dalle operazioni di somma + sottrazione - prodotto * divisione intera / resto della divisione intera %. Il significato di un espressione è il suo valore ottenuto secondo le usuali regole di calcolo. Esempio: il valore di 3 5+6è 21 il valore di 3 (5 + 6) è 33 C. Bodei Dip.to Informatica FONDAMENTI DI PROGRAMMAZIONE a.a. 16/17 pag. 35
Espressioni (cont.) Oltre ai valori numerici, le espressioni possono contenere nomi simbolici: il calcolo di un espressione che contiene un nome simbolico x dipende dallo stato, e precisamente dal valore associato al nome x nello stato. Esempio: il valore di 3 (5 + x) è I 33 in uno stato che contiene l associazione x ; 6 I 18 in uno stato che contiene l associazione x ; 1 C. Bodei Dip.to Informatica FONDAMENTI DI PROGRAMMAZIONE a.a. 16/17 pag. 36 Espressioni (cont.) Espressioni Booleane Il linguaggio consente poi di rappresentare condizioni ovvero espressioni il cui valore è un valore di verità (true o false). Le condizioni sono costruite attraverso le usuali operazioni di confronto (==,!= 2, <, >, <=, >=) e, come nel caso delle espressioni aritmetiche, il loro valore può dipendere dallo stato. Esempio: il valore di y==x+1 è I true in uno stato che contiene le associazioni x ; 5 e y ; 6 I false in uno stato che contiene le associazioni x ; 5 e y ; 9 Condizioni più complesse possono essere costruite attraverso operatori logici quali negazione (simbolo!), congiunzione (simbolo &&) e disgiunzione (simbolo ). 2!=sta per diverso C. Bodei Dip.to Informatica FONDAMENTI DI PROGRAMMAZIONE a.a. 16/17 pag. 37
Espressioni (cont.) I Significato di! -ilvalorediveritàdi!pè I true se il valore di verità di P è false I false se il valore di verità di P è true I Significato di && -ilvalorediveritàdip&&qè I true se i valori di verità di P e Q sono entrambi true I false altrimenti I Significato di -ilvalorediveritàdip Q è I false se i valori di verità di P e Q sono entrambi false I true altrimenti C. Bodei Dip.to Informatica FONDAMENTI DI PROGRAMMAZIONE a.a. 16/17 pag. 38 Esempio: I Il valore di (y >= x) &&(x > 5) è - true in uno stato che contiene le associazioni x ; 15 e y ; 30 - false in uno stato che contiene le associazioni x ; 3 e y ; 30 I Il valore di (y >= x) (x > 5) è - true in uno stato che contiene le associazioni x ; 2 e y ; 30 - false in uno stato che contiene le associazioni x ; 3 e y ; 1 C. Bodei Dip.to Informatica FONDAMENTI DI PROGRAMMAZIONE a.a. 16/17 pag. 39
Modifica dello stato: ASSEGNAMENTO Nella programmazione imperativa, la computazione viene descritta in termini di stato di programma. Il ruolo delle istruzioni è quello di modificare, con la loro esecuzione, lo stato. I Una delle istruzioni che consentono di rappresentare modifiche di stato è l assegnamento. I L assegnamento consente di cambiare un associazione nello stato, ovvero il valore associato nello stato ad un nome simbolico. I Useremo per l assegnamento la seguente notazione x=exp; dove x è un nome simbolico e exp una espressione. I L esecuzione dell assegnamento x = exp;consiste nel (i) calcolare il valore, sia esso val, dell espressione exp (ii) introdurre nello stato l associazione x ; val I Si noti che (ii) comporta la rimozione dallo stato della eventuale associazione già presente per il nome simbolico x (si parla a questo proposito di assegnamento distruttivo). C. Bodei Dip.to Informatica FONDAMENTI DI PROGRAMMAZIONE a.a. 16/17 pag. 40 ASSEGNAMENTO: esempi Vediamo alcuni esempi, indicando lo stato prima e dopo l esecuzione degli assegnamenti proposti. Le associazioni modificate nello stato finale sono evidenziate in verde. Stato iniziale Assegnamento Stato Finale { x ; 10, y ; 20} x = 5; { x ; 5, y; 20} { x ; 10, y ; 20} x = y*2; { x ; 40, y; 20} { x ; 10, y ; 20} x = x+1; { x ; 11, y; 20} Si noti come, nel terzo esempio, lo stesso nome simbolico x giochi un duplice ruolo: - a destra del simbolo = indica un valore (il valore associato ad x nello stato iniziale) - a sinistra del simbolo = indica l associazione da modificare nello stato a seguito dell assegnamento. C. Bodei Dip.to Informatica FONDAMENTI DI PROGRAMMAZIONE a.a. 16/17 pag. 41
Modifica dello stato: INPUT I La seconda istruzione di modifica dello stato consente di acquisire valori dal mondo esterno al momento dell esecuzione. La notazione è scanf(&x); dove x indica un nome simbolico, di cui &x rappresenta l indirizzo in memoria (aspetto su cui torneremo). I L esecuzione consiste nel: (i) Acquisire un nuovo valore, sia esso val (quando viene eseguita il programma si mette in attesa che l utente immetta un valore.) (ii) Introdurre nello stato l associazione x ; val I Come nel caso dell assegnamento, il punto (ii) comporta la rimozione dallo stato dell eventuale associazione già presente per il nome simbolico x I La presenza di tale istruzione permette di descrivere algoritmi generali in cui non tutti i dati sono noti a priori, ma lo saranno solo al momento dell esecuzione. C. Bodei Dip.to Informatica FONDAMENTI DI PROGRAMMAZIONE a.a. 16/17 pag. 42 Istruzioni di controllo: SEQUENZA I Negli esempi visti in precedenza gli algoritmi sono stati descritti come sequenze di passi elementari del tipo Passo 1. azione 1 Passo 2. azione 2... I Abbiamo utilizzato una sorta di numerazione per indicare l ordine di esecuzione delle varie azioni: prima azione 1 poi azione 2 poi... I Nel linguaggio che stiamo introducendo, e in C, una sequenza di azioni viene rappresentata mediante un blocco # { istruzione 1 istruzione 2... istruzione n } "! C. Bodei Dip.to Informatica FONDAMENTI DI PROGRAMMAZIONE a.a. 16/17 pag. 43
SEQUENZA (cont.) I Scriveremo dunque { istruzione 1 istruzione 2... } ad indicare che l ordine di esecuzione dei singoli passi è quello testuale del programma. I Si noti che ogni istruzione viene eseguita a partire dallo stato risultante dall esecuzione dell istruzione che la precede nella sequenza. I Assegnamento e ingresso sono istruzioni semplici il blocco è un istruzione composta. C. Bodei Dip.to Informatica FONDAMENTI DI PROGRAMMAZIONE a.a. 16/17 pag. 44 SEQUENZA: esempi Stato iniziale Sequenza Stato Finale { x ; 10, y ; 20} { x = 5; x = x+y; } { x ; 25, y; 20} { x ; 10, y ; 20} { x = x+1; y = x+1; } { x ; 11, y ; 12} { x ; 10, y ; 20} { x=x+y;y=x+y;} { x ; 30, y ; 50} I In tutti gli esempi, lo stato finale si ottiene dall esecuzione del secondo assegnamento nello stato intermedio risultante dall esecuzione del primo assegnamento. I Ad esempio, nel terzo caso: Stato iniziale Prima istruzione Stato Intermedio { x ; 10, y ; 20} x=x+y; { x ; 30, y; 20} Stato intermedio Seconda istruzione Stato Finale { x ; 30, y ; 20} y=x+y; { x ; 30, y ; 50} C. Bodei Dip.to Informatica FONDAMENTI DI PROGRAMMAZIONE a.a. 16/17 pag. 45
Istruzioni di controllo: CONDIZIONALE I Permette di determinare l azione da intraprendere a seconda del verificarsi o meno di una condizione. La notazione utilizzata è la seguente if (condizione) istruzione1 else istruzione2 dove condizione indica una espressione booleana, e istruzione1 istruzione2 sono istruzioni (semplici o composte). I L esecuzione del condizionale if (C) S1 else S2 consiste nel (i) Calcolare il valore, sia esso val, dell espressione booleana C (ii) Eseguire S1 se val è true, eseguire S2 se val è false. I Si noti che la presenza dell istruzione condizionale non è in conflitto con il requisito di non ambiguità degli algoritmi: l azione da intraprendere è univocamente determinata dal valore di verità della condizione (nello stato dato) e dunque non vi è facoltà di scelta da parte dell esecutore. Possiamo anche avere il solo if (condizione) istruzione1 C. Bodei Dip.to Informatica FONDAMENTI DI PROGRAMMAZIONE a.a. 16/17 pag. 46 CONDIZIONALE: esempi Stato iniziale Condizionale Stato Finale if (x > y) z=x; else z=y; { x ; 10, y ; 20} { x ; 10, y ; 20, z ; 20} { x ; 10, y ; 5} { x ; 10, y ; 5, z ; 10} C. Bodei Dip.to Informatica FONDAMENTI DI PROGRAMMAZIONE a.a. 16/17 pag. 47
Istruzioni di controllo: RIPETIZIONE I Consente di ripetere l esecuzione di una istruzione (o sequenza di istruzioni) fino al verificarsi di una certa condizione (cfr. esempio del calcolo del prodotto tra due numeri). while (condizione) Istruzione dove condizione indica una espressione booleana. I Terminologia: in while (C) S, la condizione C è detta guardia e l istruzione S è detta corpo (del ciclo). I L esecuzione di while (C) S consiste nel (i) Calcolare il valore, sia esso val, dell espressione booleana C (ii) Se val è false, terminare l esecuzione. (iii) Se val è true, eseguire S eripeteredalpunto(i). C. Bodei Dip.to Informatica FONDAMENTI DI PROGRAMMAZIONE a.a. 16/17 pag. 48 RIPETIZIONE Esempio: Riformulazione del passo 4 dell algoritmo per il prodotto (versione 2): while (b>0) { c = c+a; b = b-1; } I Intuitivamente, l esecuzione di while (guardia) corpo corrisponde all esecuzione di una sequenza del tipo { corpo corpo corpo... corpo...} I In tale sequenza, ogni ripetizione dell istruzione corpo viene detta iterazione del ciclo. In generale, non è possibile determinare a priori il numero di iterazioni (che può anche essere 0 nel caso in cui la guardia sia falsa nello stato iniziale). C. Bodei Dip.to Informatica FONDAMENTI DI PROGRAMMAZIONE a.a. 16/17 pag. 49
RIPETIZIONE I L aspetto più critico è il fatto che l esecuzione di un ciclo può essere fonte di non terminazione dell esecuzione dell intero algoritmo. while (3>0) x = 0; I Un ciclo si atto provoca la non terminazione dell esecuzione, dal momento che il valore di verità della guardia è sempre true edunque l esecuzione corrisponde ad una sequenza infinita x = 0; x = 0;...... ; x = 0;...... I È compito di chi definisce l algoritmo assicurare che i cicli presenti non diano luogo a non terminazione. I La pratica programmativa, ed il buon senso, suggeriscono ad esempio di utilizzare cicli in cui: - il valore di verità della guardia dipende dallo stato; - l esecuzione del corpo comporta modifiche di associazioni nello stato dalle quali dipende il valore di verità della guardia. C. Bodei Dip.to Informatica FONDAMENTI DI PROGRAMMAZIONE a.a. 16/17 pag. 50 RIPETIZIONE I Le indicazioni appena viste non sono tuttavia su cienti a garantire la terminazione dell esecuzione. Si consideri ad esempio il ciclo: while (x>0) x = x+1; che soddisfa entrambi i requisiti richiesti, ma che può non terminare nel caso in cui venga eseguito a partire da uno stato dove il valore associato al nome x è un valore positivo. I A partire dagli anni 70 sono stati sviluppati dei metodi formali per la verifica di correttezza di programmi, che comprendono tecniche per la dimostrazione formale di proprietà di terminazione dei cicli. C. Bodei Dip.to Informatica FONDAMENTI DI PROGRAMMAZIONE a.a. 16/17 pag. 51
Istruzioni di controllo: OUTPUT I Permette di rendere visibile all esterno la parte desiderata dello stato. La notazione utilizzata è printf(x); dove x indica un nome simbolico. I L esecuzione di questa istruzione consiste nel: (i) Recuperare il valore, sia esso val, associato nello stato al nome simbolico x. (ii) Produrre in uscita tale valore. I Questa operazione non comporta la modifica dello stato. Nei linguaggi di programmazione reali, l esecuzione delle operazioni di uscita produce di solito la visualizzazione di valori su supporti fisici quali video, stampanti etc. C. Bodei Dip.to Informatica FONDAMENTI DI PROGRAMMAZIONE a.a. 16/17 pag. 52 Esempi d uso dello pseudo-linguaggio Problema: Calcolo del valore assoluto di un numero Vediamo alcuni esempi di specifica di algoritmi che utilizzano lo pseudo-linguaggio. Specifica: Stato iniziale: { numero ; A } Stato finale: { risultato ; A } dove A indica un (generico) valore intero, diverso da zero. Algoritmo: if (numero > 0) risultato = else risultato = numero; - numero; C. Bodei Dip.to Informatica FONDAMENTI DI PROGRAMMAZIONE a.a. 16/17 pag. 53
Esempi d uso dello pseudo-linguaggio Problema: scambiare il valore di due variabili Specifica: Stato iniziale: { x ; A, y ; B } Stato finale: { x ; B, y ; A } Algoritmo: temp = x; x = y; y = temp; C. Bodei Dip.to Informatica FONDAMENTI DI PROGRAMMAZIONE a.a. 16/17 pag. 54 Esempi d uso dello pseudo-linguaggio Problema: scambiare il valore di due variabili (cont.) I Si noti l utilizzo di un nome simbolico aggiuntivo (temp): è essenziale per poter e ettuare correttamente lo scambio tra i valori associati ai due interi (a causa del carattere distruttivo dell assegnamento e della sequenzialità dell esecuzione). I Èfacileverificarecheunasequenzadeltipo x = y; y = x; non consente, in generale, di scambiare i valori associati a x e y. Esempio: Stato iniziale Stato Intermedio { x ; 10, y ; 20} x=y; { x ; 20, y; 20} Stato intermedio Stato Finale { x ; 20, y ; 20} y=x { x ; 20, y ; 20} C. Bodei Dip.to Informatica FONDAMENTI DI PROGRAMMAZIONE a.a. 16/17 pag. 55
Esempi d uso dello pseudo-linguaggio Problema: ordinare due interi positivi Specifica: Stato iniziale: { num1 ; A, num2 ; B } Stato finale: { num1 ; max(a,b), num2 ; min(a,b) } Algoritmo: if (num1 < num2) { temp = num1 = num2 = } num1; num2; temp; ATTENZIONE: non basta stabilire il massimo e il minimo; occorre anche che, alla fine, il massimo sia associato a num1 eilminimoa num2. C. Bodei Dip.to Informatica FONDAMENTI DI PROGRAMMAZIONE a.a. 16/17 pag. 56