FI03_IstruzioniCondizionali.pdf
Document Details
Uploaded by ArticulateHeather7381
Tags
Related
- Assembly Language Programming Lecture 7 PDF
- Medicare Basics in Personal Injury Cases Quiz PDF
- Lecture Notes: MIPS Case Study (Control Flow Instruction) PDF
- Instruction Execution: Straight-Line Sequencing and Branching PDF
- Chapitre 3 - Les instructions conditionnelles (les alternatives) PDF
- Conditional Value at Risk (CVaR) PDF
Full Transcript
Istruzioni Condizonali FONDAMENTI DI INFORMATICA Analisi dei Dati per l’Impresa e la Finanza Roberto Cavicchioli [email protected] Istruzioni condizionali Nella formulazione di un algoritmo si ha spesso la necessità di esprimere la scelta tra due o più sequenze di istruzioni,...
Istruzioni Condizonali FONDAMENTI DI INFORMATICA Analisi dei Dati per l’Impresa e la Finanza Roberto Cavicchioli [email protected] Istruzioni condizionali Nella formulazione di un algoritmo si ha spesso la necessità di esprimere la scelta tra due o più sequenze di istruzioni, in base al verificarsi o meno di una certa condizione durante l’esecuzione dello stesso algoritmo. Esempi: ◮ nel calcolo del valore assoluto di un numero, il risultato dipenderà dal segno di tale numero ◮ la soluzione di un’equazione di primo grado ax + b = 0 è data da − ba , se a /= 0, altrimenti non è definita o non è unica 248 Istruzioni condizionali In tutti i linguaggi di alto livello sono disponibili per questo scopo: ◮ le espressioni condizionali, che consentono di esprimere condizioni che possono essere vere o false (per es., a /= 0) ◮ l’istruzione condizionale, che consente di eseguire due diverse sequenze d’istruzioni alternative tra loro, in base al valore di un’espressione condizionale 249 Espressioni condizionali: sintassi Il tipo più semplice di espressione condizionale consiste nel confronto tra due espressioni. Sintassi: espressione1 operatore espressione2 ◮ espressione1 eespressione2 sono due espressioni Python qualsiasi, definite come si èvisto in precedenza (possono quindi contenere nomi di variabili, purché a tali variabili sia stato già assegnato un valore) ◮ operatore èun simbolo che indica il confronto da eseguire tra le due espressioni 250 Espressioni condizionali: operatori di confronto Nel linguaggio Python sono disponibili i seguenti operatori di confronto, che possono essere usati sia su espressioni aritmetiche che su espressioni composte da stringhe: simbolo significato == “uguale a” (notare il doppio sim- bolo =, per evitare ambiguità con l’istruzione di assegnamento) != “diverso da” < “minore di” “maggiore di” >= “maggiore o uguale a” 251 Espressioni condizionali: esempi Si assume che a ciascuna variabile che compare negli esempi seguenti sia già stato assegnato un valore. ◮ 1 < 2 ◮ a + 1 != 5 ◮ x >= y ◮ "macchina" < " ca s a " ◮ "mappa" + "mondo" == "mappamondo" 252 Espressioni condizionali: semantica Analogamente alle espressioni aritmetiche, il cui valore è un numero, ealle espressioni che coinvolgono stringhe, il cui valore è una stringa, un’espressione condizionale assume il valore logico “vero” oppure “falso”, in base all’esito del confronto. I due valori logici vengono indicati in Python con i simboli: ◮ True (vero) ◮ Fa l s e (falso) Si noti che questi simboli sono essi stessi espressioni lecite del linguaggio Python, proprio come i numeri ele stringhe. In particolare, nel caso di un confronto tra due valori di tipo stringa, gli operatori si riferiscono all’ordinamento alfabetico, con la convenzione che le cifre precedono le (sono “minori” delle) lettere maiuscole, le quali a loro volta precedono le lettere minuscole. 253 Uso delle espressioni condizionali Oltre che all’interno delle istruzioni condizionali (e iterative, come si vedrà più avanti), le espressioni condizionali possono essereusate all’interno di un programma Python come tutte le altre espressioni (numeri estringhe): ◮ il loro valore può essere assegnato a una variabile; per esempio, assumendo che alla variabile x sia già stato assegnato un valore numerico: risultato = (x > 0) ◮ il loro valore può essere stampato nella finestra della shell con l’istruzione p r i n t , per esempio: print(x > 0) ◮ i valori True e Fa l s e possono essere assegnati a variabili, per es.: trovato = True ◮ possono essere scritte nella shell, nella quale verrà mostrato il loro valore (True oppure Fa l s e ) 254 Espressioni condizionali: esempi 255 Espressioni condizionali: esempi Si assume che a tutte le variabili che compaiono negli esempi seguenti sia già stato assegnato un valore. ◮ 1 < 2 produce True ◮ a + 1 ! = 5 produce Fa l s e se il valore associato alla variabile a è4 (oppure 4.0), altrimenti produce True ◮ x == y produce True se le due variabili hanno lo stesso valore, altrimenti produce Fa l s e ◮ "macchina" < " c a s a " produce F a l s e ◮ "Macchina" < " c a s a " produce True ◮ "mappa" + "mondo" == "mappamondo" produce True ◮ "123" < "Casa" produce True 256 Espressioni condizionali: esempi 257 Espressioni condizionali composte Le espressioni condizionali viste finora si dicono semplici, poiché consistono in un singolo confronto tra due valori. Così come nel linguaggio naturale, nei linguaggi di programma- zione èpossibile costruire espressioni condizionali composte, otte- nute combinando espressioni condizionali qualsiasi (anche a loro volta composte) per mezzo di connettivi logici come i seguenti: ◮ la congiunzione “e” ◮ la congiunzione “o”, “oppure” ◮ l’avverbio “non” 258 Espressioni condizionali composte: sintassi Sintassi: ◮ espr-cond1 and espr-cond2 ◮ espr-cond1 or espr-cond2 ◮ not espr-cond dove: ◮ espr-cond1, espr-cond2 eespr-cond sono espressioni condizionali qualsiasi (quindi possono essere a loro volta espressioni composte) ◮ i simboli and, or e not sono detti operatori logici, e corrispondono rispettivamente ai connettivi logici del linguaggio naturale “e”, “oppure”, “non” ◮ è possibile usare le parentesi tonde per definire l’ordine degli operatori logici 259 Espressioni condizionali composte: semantica Anche le espressioni condizionali composte hanno come possibili valori i valori logici True e Fa l s e. Il valore di un’espressione condizionale composta èdefinito come segue: ◮ espr-cond1 and espr-cond2 produce True se entrambe le espressioni hanno valore True, altrimenti produce Fa l s e ◮ espr-cond1 or espr-cond2 produce True sealmeno una delle espressioni ha valore True, altrimenti produce Fa l s e ◮ not espr-cond produce True sel’espressione ha valore Fa ls e , e viceversa 260 Espressioni condizionali composte: esempi Come al solito, si assume che a tutte le variabili che compaiono negli esempi seguenti sia già stato assegnato un valore. ◮ x > 0 and y == 2 èvera (produce True) sela variabile x contiene un numero positivo, e la variabile y contiene il numero 2; altrimenti è falsa (produce F a l s e ) ◮ not ( x > 0 or y == 2 ) èvera sel’espressione tra parentesi (la stessa dell’esempio precedente) èfalsa, eviceversa ◮ ( a ! = b or b >= 0 ) and c < 1 èvera sele variabili a e b contengono valori diversi oppure se b contiene un numero non negativo, e contemporaneamente la variabile c contiene un numero minore di 1; altrimenti è falsa 261 Espressioni condizionali: esempi 262 L’istruzione condizionale Come si èdetto in precedenza, le espressioni condizionali sono uno dei componenti delle istruzioni condizionali, che consentono di esprimere in un programma la scelta tra due diverse sequenze di istruzioni in base al verificarsi o meno di una certa condizione durante l’esecuzione dello stesso programma. In linguaggio naturale, un’istruzione condizionale esprime la seguente richiesta all’esecutore di un algoritmo: se una data condizione èvera, allora esegui una certa sequenza d’istruzioni, altrimenti esegui un’altra sequenza d’istruzioni 263 L’istruzione condizionale La semantica dell’istruzione condizionale (cioè la sua esecuzione) può essere rappresentata graficamente per mezzo del seguente diagramma di flusso: VERO FALSO condizione sequenza sequenza d'istruzioni 1 d'istruzioni 2 264 L’istruzione condizionale: sintassi i f espr-cond : sequenza di istruzioni 1 else : sequenza di istruzioni 2 ◮ le parole-chiave i f e e l s e devono essere scritte senza rientri ◮ espr-cond èun’espressione condizionale ◮ sequenza di istruzioni 1 esequenza di istruzioni 2 sono due sequenze di una o più istruzioni qualsiasi ◮ ciascuna di tali istruzioni deve essere scritta in una riga distinta, con un rientro di almeno un carattere; il rientro deve essere identico per tutte le istruzioni 265 L’istruzione condizionale: semantica Seespressione condizionale èvera (cioè, seil suo valore è True), viene eseguita la sequenza di istruzioni 1 (le sue istruzioni vengono eseguite nello stesso ordine nel quale sono scritte). Seinvece espressione condizionale èfalsa, viene eseguita la sequenza di istruzioni 2. Si noti che solo una delle due sequenze di istruzioni viene eseguita. 266 L’istruzione condizionale: esempio Si assuma che alla variabile x sia già stato assegnato un valore: if x > 0 : p r i n t ( " L a condizione è v e r a. " ) z = x + 1 else : p r i n t ( " L a condizione è f a l s a. " ) Se il valore della variabile x (nel momento in cui l’istruzione condizionale viene eseguita) è un numero positivo, viene prima mostrato (nella shell ) il messaggio La condizione è v e ra. poi viene assegnato alla variabile z il valore dell’espressione x + 1. Altrimenti (se l’espressione x > 0 èfalsa) viene mostrato il messaggio La condizione è f a l s a. NOTA: dato che le istruzioni condizionali sono composte da più righe, per non confondersi con i rientri si consiglia di scrivere gli esempi che seguono in una finestra dell’editor (eseguendoli come programmi) piuttosto che nella shell. 267 L’istruzione condizionale: una variante L’istruzione condizionale può essere scritta anche senza indicare una sequenza di istruzioni (introdotta dalla parola chiave e l s e ) da eseguire nel caso in cui la condizione sia falsa. Questo èutile nei casi in cui un algoritmo preveda l’esecuzione di una certa sequenza di istruzioni solo nel caso in cui una data condizione sia vera. Sintassi: i f espr-cond : sequenza di istruzioni Semantica: seespr-cond èvera, allora viene eseguita la sequenza di istruzioni; in caso contrario, non viene eseguita nessuna istruzione (e si passa all’eventuale istruzione successiva). 268 L’istruzione condizionale: una variante Il diagramma di flusso corrispondente è il seguente: VERO condizione sequenza FALSO d'istruzioni 1 269 L’istruzione condizionale: esempio Si assuma che alla variabile x sia già stato assegnato un valore. if x > 0 : p r i n t ( " L a condizione è v e r a. " ) z = x + 1 Seil valore della variabile x (nel momento in cui l’istruzione condizionale viene eseguita) èun numero positivo, viene prima mostrato (nella shell) il messaggio La condizione è v e r a. poi viene assegnato alla variabile z il valore dell’espressione x + 1. In caso contrario non viene eseguita nessuna istruzione. 270 Nota sulle istruzioni condizionali I rientri sono l’unico elemento sintattico che indica quali istruzioni fanno parte di un’istruzione condizionale. Le istruzioni che seguono un’istruzione condizionale (senza farne parte) devono quindi essere scritte senza rientri rispetto a essa. Come esempio, si considerino le due sequenze di istruzioni: if x > 0 : if x > 0 : print("A") print("A") print("B") print("B") Nella sequenza a sinistra le due istruzioni p r i n t sono scritte con un rientro rispetto a i f : questo significa che fanno entrambe parte dell’istruzione condizionale, equindi verranno eseguite solo sela condizione x > 0 sarà vera. Nella sequenza a destra solo la prima istruzione p r i n t dopo i f èscritta con un rientro, equindi solo essafa parte dell’istruzione condizionale; la seconda istruzione p r i n t verrà invece eseguita dopo l’istruzione condizio- nale, indipendentemente dal valore di verità della condizione x > 0. 271 Istruzioni condizionali: esercizio Determinare che cosa viene stampato nella shell dalla sequenza di istruzioni mostrata in basso, nel caso in cui prima della loro esecuzione il valore della variabile x sia 1, enel caso in cui il valore di x sia invece −1. if x > 0 : print("A") y = 2 i f y 0 : print("A") i f y == 1 : print("B") else : print("C") print("D") else : print("E") 274 Istruzioni condizionali nidificate: esempio Per capire meglio una sequenza di istruzioni come quella mostrata in precedenza èutile eseguirla passo dopo passo, così come verrebbe effettivamente eseguita dal calcolatore. A questo scopo bisogna individuare prima di tutto le due sequenze di istruzioni che vengono eseguite nel caso in cui l’espressione condizionale della prima istruzione i f (quella “esterna”) sia vera, enel caso in cui tale espressione sia falsa. Questa informazione èsempre fornita esclusivamente dai rientri all’inizio di ciascuna riga, secondo la sintassi già descritta. 275 Istruzioni condizionali nidificate: esempio Le due sequenze di istruzioni contenute nella prima istruzione i f sono evidenziate in basso in magenta (per il caso in cui x > 0 è vera) ein blu (per il caso in cui x > 0 èfalsa). if x > 0 : print("A") i f y == 1 : print("B") else : print("C") print("D") else : print("E") 276 Istruzioni condizionali nidificate: esempio In particolare, la sequenza corrispondente al caso in cui x > 0 sia vera ècomposta da tre istruzioni: ◮ l’istruzione p r i n t ( " A " ) ◮ l’istruzione condizionale (nidificata) i f y == 1 :... ◮ l’istruzione p r i n t ( " D " ) Si noti che l’istruzione p r i n t ( " D " ) non fa parte dell’istruzione condizionale i f y == 1 :... , equindi verrà eseguita (nel caso in cui x > 0 sia vera) dopo di essa, indipendentemente dal valore di verità della condizione y == 1. 277 Istruzioni condizionali nidificate: esempio In conclusione: ◮ se x > 0 èvera: – prima viene stampato A – poi, se y == 1 èvera viene stampato B, altrimenti viene stampato C – poi viene stampato D ◮ se invece x > 0 è falsa, viene solo stampato E 278 Istruzioni condizionali nidificate: esercizio Determinare ciò che viene stampato nella shell dall’esecuzione delle istruzioni dell’esempio precedente, per ciascuno dei seguenti valori delle variabili x ey: ◮ x = -1 , y = - 1 ◮ x = 2, y = 1 ◮ x = -2, y = 1 ◮ x = 3, y = 2 279 Esempi di programmi contenenti istruzioni condizionali Un programma che calcola il valore assoluto di un numero acquisito attraverso la tastiera. File: 3_valore_assoluto_1.py n = e v a l ( i n p u t ( " I n s e r i r e un numero: " ) ) if n > 0 : p r i n t ( " Va l o r e a s s o l u t o : " , n) else: p r i n t ( " Va l o r e a s s o l u t o : " , - n ) 280 Esempi di programmi contenenti istruzioni condizionali Una versione alternativa, in cui si usa un’istruzione condizionale senza la parte e l s e. File: 4_valore_assoluto_2.py n = e v a l ( i n p u t ( " I n s e r i r e un numero: " ) ) if n < 0 : n = -n p r i n t ( " Va l o r e a s s o l u t o : " , n ) 281 Esempi di programmi contenenti istruzioni condizionali Un programma che acquisisce i coefficienti di un’equazione di primo grado, ax + b = 0, ene calcola la soluzione sequesta esiste ed èunica, altrimenti stampa un messaggio opportuno. File: 5_eq_primo_grado.py a = eval(input("Inserire i l coefficiente a : " ) ) b = eval(input("Inserire i l coefficiente b: " ) ) i f a != 0 : p r i n t ( " L a s olu zion e è " , - b/a) else : p r i n t ( " L a s ol u zi on e non e s i s t e o non è u n i c a. " ) 282 Esempi di programmi contenenti istruzioni condizionali Un programma che acquisisce i coefficienti di un’equazione di secondo grado, ax 2 + bx + c = 0, edetermina sele radici siano reali oppure complesse, stampando un opportuno messaggio. File: 6_eq_secondo_grado_1.py a = eval(input("Inserire i l coefficiente a : " ) ) b = eval(input("Inserire i l coefficiente b: " ) ) c = eval(input("Inserire i l coefficiente c : " ) ) d e l t a = b**2 - 4*a*c i f d e l t a >= 0 : p r i n t ( " L e r a d i c i sono r e a l i. " ) else : p r i n t ( " L e r a d i c i sono complesse.") 283 Esempi di programmi contenenti istruzioni condizionali Una variante dello stesso programma, che stampa anche i valori delle radici. File: 7_eq_secondo_grado_2.py a = eval(input("Inserire i l coefficiente a : " ) ) b = eval(input("Inserire i l coefficiente b: " ) ) c = eval(input("Inserire i l coefficiente c : " ) ) d e l t a = b**2 - 4*a*c i f d e l t a >= 0 : p r i n t ( " L e r a d i c i sono r e a l i. " ) print("x 1 = " , ( - b + delta**0.5) / ( 2 * a ) ) print("x2 = " , ( - b - delta**0.5) / (2*a)) else : p r i n t ( " L e r a d i c i sono complesse.") print("x1 =" , -b/(2*a), ((-delta)**0.5) / (2*a)) print("x2 =" , -b/(2*a), - ((-delta)**0.5) / (2*a)) 284 Esempi di programmi contenenti istruzioni condizionali Un’altra variante, che determina sele radici siano reali edistinte, reali e coincidenti, oppure complesse coniugate. In questo esempio si sono usate tre istruzioni condizionali in sequenza (non nidificate), corrispondenti a tre condizioni mutuamente esclusive (quindi una sola di tali istruzioni verrà eseguita). File: 8_eq_secondo_grado_3.py a = eval(input("Inserire i l coefficiente a : " ) ) b = eval(input("Inserire i l coefficiente b: " ) ) c = eval(input("Inserire i l coefficiente c : " ) ) d e l t a = b**2 - 4*a*c i f delta > 0 : p r i n t ( " L e r a d i c i sono r e a l i e d i s t i n t e. " ) i f d e l t a == 0 : p r i n t ( " L e r a d i c i sono reali e coincidenti.") i f delta < 0 : p r i n t ( " L e r a d i c i sono complesse c o n i u ga t e. " ) 285 Esempi di programmi contenenti istruzioni condizionali Una quarta variante, nella quale si usano istruzioni condizionali nidificate. File: 9_eq_secondo_grado_4.py a = eval(input("Inserire i l coefficiente a : " ) ) b = eval(input("Inserire i l coefficiente b: " ) ) c = eval(input("Inserire i l coefficiente c : " ) ) d e l t a = b**2 - 4*a*c i f delta > 0 : p r i n t ( " L e r a d i c i sono r e a l i e d i s t i n t e. " ) else : i f d e l t a == 0 : p r i n t ( " L e r a d i c i sono r e a l i e c o i n c i d e n t i. " ) else: p r i n t ( " L e r a d i c i sono complesse c o n i u ga t e. " ) 286 Esempi di programmi contenenti istruzioni condizionali Il programma mostrato di seguito acquisisce tre numeri, e determina se essi possano rappresentare le lunghezze dei lati di un triangolo (cioè se siano tutti positivi, eseciascuno sia minore della somma degli altri due); in caso affermativo determina sesi tratti di un triangolo equilatero, isoscele o scaleno, altrimenti stampa un messaggio opportuno. Si noti che in linguaggio Python èpossibile suddividere una istruzione in più righe, inserendo il carattere \ (backslash) nel punto in cui si interrompe una riga. Questa possibilità èstata sfruttata per suddividere in due righe l’espressione condizionale della prima istruzione i f. Nella prosecuzione di una riga si può inserire un rientro qualsiasi (anche nessuno). Per garantire la leggibilità del programma èperò buona norma usare un rientro coerente con il contenuto della riga precedente. 287 Esempi di programmi contenenti istruzioni condizionali File: 1 0 _ t r i a n g o l i _ 1. p y a = e v a l ( i n p u t ( " I n s e r i r e i l primo numero: " ) ) b = e v a l ( i n p u t ( " I n s e r i r e i l secondonumero: " ) ) c = eval(input("Inserire i l te r zo numero:" ) ) i f ( a > 0 ) and ( b > 0 ) and ( c > 0 ) and \ ( a < b + c ) and ( b < a + c ) and ( c < a + b ) : i f ( a == b ) and ( b == c) : print("Equilatero") else : i f a== b or b == c or a == c : print("Isoscele") else : print("Scaleno") else : print("Non rappresentano i l a t i d i un t r i a n g o l o. " ) 288 Esempi di programmi contenenti istruzioni condizionali Di seguito si mostra una seconda versione dello stesso programma, con una diversa espressione condizionale nella prima istruzione i f (tale espressione verifica sei tre numeri non corrispondano alle lunghezze dei lati di un triangolo). Questo consente di spostare nella parte e l s e della stessa istruzione la determinazione del tipo di triangolo, rendendo il programma più leggibile. 289 Esempi di programmi contenenti istruzioni condizionali File: 1 1 _ t r i a n g o l i _ 2. p y a = e v a l ( i n p u t ( " I n s e r i r e un numero: " ) ) b = e v a l ( i n p u t ( " I n s e r i r e un a l t r o numero: " ) ) c = e v a l ( i n p u t ( " I n s e r i r e l ’ u l t i m o numero: " ) ) i f not ( ( a > 0 ) and ( b > 0 ) and ( c > 0 ) and \ ( a < b + c ) and ( b < a + c ) and ( c < a + b ) ) : print("Non rappresentano i l a t i d i un t r i a n g o l o. " ) else : i f a == b and b == c : print("Equilatero") else : i f a == b or b == c or a == c : print("Isoscele") else : print("Scaleno") 290 Fine Istruzioni Condizionali Fondamenti di Informatica – a.a. 2024/2025 Roberto Cavicchioli [email protected] – http://personale.unimore.it/rubrica/dettaglio/rcavicch