Strutture di alternanza
Il lavoro di creazione dell'algoritmo risolutivo di un problema si può descrivere, in buona approssimazione, con la stesura di una serie di operazioni da compiere per ottenere il risultato prefissato.
La programmazione strutturata schematizza sistematicamente le operazioni da svolgere secondo alcune operazioni atomiche ricorrenti:
- sequenza, in cui le istruzioni sono eseguite una dopo l'altra
- alternanza, in cui alcune istruzioni sono eseguite alternativamente (o un gruppo o un altro)
- ripetizione, in cui alcune istruzioni sono ripetute un numero finito di volte.
Accanto a queste semplici strutture possono esserne inserite altre più generali o più particolari, per schematizzare ogni algoritmo secondo i criteri che più si adattano ai propri gusti. Queste tre sono state scelte perché vale il seguente:
Teorema di Jacopini-Bohm (1966)
"Qualsiasi algoritmo può essere riscritto in maniera equivalente utilizzando solo le strutture di sequenza, alternanza, ripetizione."
Questo algoritmo cioè sostanzialmente afferma che le tre strutture indicate sono i mattoni fondamentali per riprodurre qualsiasi algoritmo formulabile dall'uomo. In altre parole, tutti i problemi che sono risolvibile, hanno anche una soluzione costruita semplicemente con istruzioni in sequenza, alternanza e ripetizione.
Istruzione if
if è la più semplice istruzione per realizzare la struttura di alternanza. Si pone una condizione e a seconda che essa risulti vera oppure no si eseguono alternativamente due blocchi di istruzione.
Vediamo la definizione di codice:
if condizione:
# blocco di codice da eseguire se condizione è vera
# indentato di 4 caratteri
# poi si va a istruzione successiva
[elif condizione2:
# blocco di codice da eseguire se condizione2 è vera
# indentato di 4 caratteri]
# poi si va a istruzione successiva
[elif condizione3:
# blocco di codice da eseguire se condizione3 è vera
# indentato di 4 caratteri]
# poi si va a istruzione successiva
[else:
# blocco di codice da eseguire se TUTTE LE CONDIZIONI PRECEDENTI sono false
# indentato di 4 caratteri]
# ISTRUZIONE SUCCESSIVA
Le parentesi quadre sopra indicano parti opzionali della struttura di alternanza. Spero si capisca meglio con qualche esempio:
x = int (input("Inserisci un numero intero: "))
if x > 0 :
print("POSITIVO")
elif x == 0:
print("ZERO")
else:
print("NEGATIVO")
print("FINITO")
Dal punto di vista funzionale, il codice scorre le istruzioni sopra scritte come nel diagramma seguente:
Le parti con le istruzioni elif
ed else
sono opzionali,
ovvero si può costruire un if-else
semplice, come questo:
y = int (input("Inserisci un altro numero intero: "))
if y % 2 == 0 :
print("Hai inserito un numero pari")
else:
print("Hai inserito un numero dispari")
oppure lasciare proprio l'istruzione if
da sola:
Capito??
Provate tutti questi codici e poi giù con gli esercizi...
Indentazione in Python
Indentazione
Indentare significa inserire una certa quantità di spazi vuoti all'inizio di una o più righe per incolonnare opportunamente il codice sorgente.
I linguaggi più famosi, come C o Java, utilizzano le parentesi graffe per indicare un blocco di codice e opzionalmente suggeriscono di indentare il codice per rendere i blocchi più evidenti:
if (numero > 0)
{
// fai qualcosa se numero è maggiore di ZERO
}
else
{
// fai qualcosa se numero NON è maggiore di ZERO
}
Come si vede, lo spostamento a destra di alcune righe del codice le rende più evidenti. Come dicevamo comunque, per C o Java l'indentazione è assolutamente opzionale e il seguente pezzo di codice è assolutamente equivalente al precedente.
if (numero > 0) { // fai qualcosa se numero è maggiore di ZERO
} else { // fai qualcosa se numero NON è maggiore di ZERO
}
Io penso che sia alquanto evidente come il primo esempio sia molto più facile da leggere, da comprendere e imparare rispetto al secondo, anche se per il linguaggio C essi rappresentano lo stesso identico concetto.
Altri linguaggi, come il PASCAL, non utilizzano le parentesi ma parole chiave del linguaggio. Anche qui l'indentazione è opzionale.
if (numero > 0) then ( fai qualcosa se numero è maggiore di ZERO )
else
( fai qualcosa se numero NON è maggiore di ZERO } ;
Anche qui, pur avendo le parole chiave if ... then ... else ...
che racchiudono
i due blocchi, a mio parere senza indentazione la leggibilità e la
chiarezza del codice vengono molto meno.
Python obbliga i suoi utilizzatori ad usare l'indentazione come unica forma di organizzazione del codice in blocchi!
In questo modo le parole del linguaggio da imparare sono pochissime e la struttura del linguaggio è molto facile da leggere.
A questo aggiungiamo che lo stile predefinito di Python per l'indentazione è di inserire 4 spazi ogni volta si voglia identificare un blocco di codice. In questo modo tutti i programmi Python sono per definizione
- i più semplici da leggere
- con una struttura logica identica alla indentazione delle righe di codice che la implementano
- con una organizzazione uniforme in TUTTI i programmi Python.
Vediamo il solito esempio scritto in Python:
if numero > 0 :
# i blocchi Python iniziano con 4 spazi
# Qui si fa qualcosa se numero è maggiore di ZERO
else:
# altro blocco di codice
# qui si fa qualcosa se numero NON è maggiore di ZERO
print("qui i blocchi sono finiti")
Tutto qua!
D'ora in avanti quando incontreremo strutture con blocchi di codice li evidenzieremo tramite indentazione di 4 spazi. Come vedremo alcuni editor di testo ci aiutano molto per questa operazione :)
Roba da precisoni!!!
Python 3.x utilizza una specifica chiamata PEP8 che descrive per filo e per segno come scrivere qualunque struttura di codice Python.
Questo con l'obiettivo dichiarato di uniformare lo stile di qualsiasi pezzo di codice Python scritto da chiunque e semplificare così la lettura del codice!
In particolare vorrei sottolineare come questa specifica sia assolutamente allergica al carattere di tabulazione TAB, presente in alto a destra in ogni tastiera. Il carattere di tabulazione NON deve essere usato negli script Python.
Suggerimento
Se state utilizzando Thonny (come dovreste) potete utilizzare tranquillamente il tasto TAB della tastiera perché esso trasforma automaticamente ogni TAB in una sequenza di 4 caratteri evitando fastidi durante l'esecuzione del codice e semplificando il lavoro del programmatore che non deve digitare a mano 4, 8, 12,,, spazi!!
Per forzare gli utenti ad usare queste buone regole di uniformità, l'interprete Python segnala un errore ogni volta che trova un carattere di tabulazione nel codice. E il prof mette una insufficienza. Fate voi...
Esercizi
Esercizio 201
Scrivere un programma che richiede un numero intero all'utente e visualizza la scritta "PARI" oppure "DISPARI" a seconda del valore inserito.
Esercizio 202
Scrivere un programma che richiede un numero intero all'utente e visualizza la scritta "DIVISIBILE PER 5" oppure "NON DIVISIBILE PER 5" a seconda del valore inserito.
Esercizio 203
Dati due numeri interi da parte dell'utente, da memorizzare nelle variabili n1, n2, verificare se il primo è un multiplo del secondo. Visualizzare la scritta "MULTIPLO" o "NON MULTIPLO".
Esercizio 204
Dato un numero intero, inserito dall'utente, restituire la scritta CORRETTO se il numero è pari e compreso fra 100 e 200 (estremi esclusi), NON CORRETTO altrimenti.
Esercizio 205
Dato un numero intero, inserito dall'utente, restituire la scritta CORRETTO se il numero è dispari e compreso fra -5 e 5 (estremi inclusi), NON CORRETTO altrimenti.
Esercizio 206: confronti
Dati due numeri reali da parte dell'utente, visualizzarli in ordine crescente (prima il più piccolo, poi il più grande).
Esercizio 207
Dati due numeri reali da parte dell'utente, memorizzati nelle variabili n1 e n2, inserire il valore più piccolo nella variabile "piccolo" e il più grande nella variabile "grande", infine visualizzarli.
Esercizio 208
Dati tre numeri reali da parte dell'utente, visualizzarli in ordine crescente (prima il più piccolo, poi il medio, poi il più grande).
Esercizio 209
Dati tre numeri reali da parte dell'utente, memorizzati nelle variabili n1, n2, n3; inserire il valore più piccolo nella variabile "v1", il medio nella variabile "v2" e il più grande nella variabile "v3".
Esercizio 210
Dati quattro numeri reali da parte dell'utente, memorizzati nelle variabili n1, n2, n3, n4; visualizzare il valore più grande fra i 4.
Esercizio 211
Dati quattro numeri reali da parte dell'utente, memorizzati nelle variabili n1, n2, n3, n4; visualizzare il valore più piccolo fra i 4.
Esercizio 212: metà e doppio di un intero
Programma che, dato un numero intero, ne visualizza la metà se il numero è pari o ne visualizza il doppio se il numero è dispari.
Esercizio 213: radice quadrata
Programma che dato un numero intero, dice se questo è positivo oppure no. Se il numero è positivo, ne calcola la radice quadrata. Se il numero è negativo ne calcola l'opposto.
Esercizio 214
da sostituire
Esercizio 215: anno bisestile
Dato un numero intero da parte dell'utente, visualizzare se questo rappresenta un anno bisestile oppure no. Un anno è bisestile se è divisibile per 4, ma non per 100 oppure se è divisibile per 400.
Ad esempio il 1900 non è stato un anno bisestile, perché 1900 è divisibile per 4 ma anche per 100. L'anno 2000 è stato bisestile perché 2000 è divisibile per 400.
Esercizio 216
Un negozio applica degli sconti diversi a seconda del prezzo dei prodotti. Sul prezzo di un prodotto viene praticato lo sconto del 3% se costa fino a 100 euro e del 5% se costa di più. Inserito da tastiera il prezzo P, calcolare il prezzo da pagare secondo la regola sopra descritta.
Esercizio 217: biglietto del treno
Sul prezzo di un biglietto di un treno viene applicato un supplemento del 7% se il treno è di tipo 'A', del 12% se è di tipo 'B' e del 18% se è di tipo 'C'. Per gli altri treni non c'è supplemento.
Chiedere all'utente di inserire un numero reale che rappresenta il costo del biglietto e un carattere che rappresenta il tipo di treno, quindi calcolare il prezzo reale del biglietto, applicando l'eventuale sovrapprezzo secondo le indicazioni precedenti.
Infine visualizzare il prezzo iniziale (inserito dall'utente) il tipo di treno indicato e il prezzo finale.
Esercizio 218: temperature
Si permetta all'utente di inserire un numero reale che rappresenterà una temperatura in gradi Celsius. Il programma visualizzerà la temperatura inserita e poi la convertirà in gradi Fahrenheit e in gradi Kelvin. Prima della conversione, il programma verificherà se la temperatura inserita è minore allo zero assoluto (ZERO gradi Kelvin) e in quel caso visualizzerà un errore senza visualizzare le conversioni.
Suggerimento
Per convertire le temperature, usa le seguenti formule:
Esercizio 219
Da sostituire
Esercizio 220: triangolo o no
Dati 3 numeri A, B, C da parte dell'utente, che rappresentano le lunghezze di 3 lati, valutare se essi possono rappresentare un triangolo. In caso affermativo dire quale tipo di triangolo: equilatero, isoscele, rettangolo, scaleno.
Esercizio 221: cifre1
Chiedere all'utente di inserire un numero intero. Visualizzare poi il numero stesso e la cifra delle centinaia. Ad esempio se il numero inserito è 243, la cifra da visualizzare è 2. Se il numero inserito è 85, la cifra da visualizzare è 0. Se il numero inserito è 1357, la cifra da visualizzare è 3.
Suggerimento
Se sapete verificare se un numero è multiplo di un altro, sapete trovare le cifre di un numero, verificando se è multiplo di 10, 100, 1000...)
Esercizio 222: cifre2
Chiedere all'utente di inserire un numero intero. Visualizzare poi il numero stesso e la cifra delle decine.
Ad esempio se il numero inserito è 243, la cifra da visualizzare è 4.
Se il numero inserito è 85, la cifra da visualizzare è 8.
Se il numero inserito è 1357, la cifra da visualizzare è 5.
Esercizio 223: data valida
Chiedere all'utente di inserire 2 numeri interi GG, MM e si determini se questi possono rappresentare i giorni e i mesi di una data. In particolare, se questo è vero si riporti la scritta DATA VALIDA, altrimenti la scritta DATA NON VALIDA.
Ad esempio,
- dati i valori GG = 25, MM = 7 si ritorna DATA VALIDA.
- dati i valori GG = 5, MM = 17 si ritorna DATA NON VALIDA.
- dati i valori GG = 31, MM = 3 si ritorna DATA VALIDA.
- dati i valori GG = 31, MM = 4 si ritorna DATA NON VALIDA.
Il 29 febbraio non è una data valida, non essendo presente il controllo sull'anno.
Filastrocca sui mesi
Trenta d conta Novembre, con April, Giugno e Settembre. Di ventotto ce n'è uno... tutti gli altri ne han trentuno!!!
Esercizio 224: orario
Chiedere all'utente di inserire due numeri interi per le ore e i minuti di un orario e visualizzare la scritta ORARIO ERRATO se esso è una combinazione impossibile (ad esempio se i valori sono negativi, oppure se le ore superano 23, etc...).
Se l'orario è corretto, visualizzare una scritta secondo il seguente schema:
- Dalle 8.00 alle 8.59: visualizzare PRIMA ORA
- Dalle 9.00 alle 9.59: visualizzare SECONDA ORA
- Dalle 10.00 alle 10.54: visualizzare TERZA ORA
- Dalle 10.55 alle 11.04: visualizzare INTERVALLO
- Dalle 11.05 alle 11.59: visualizzare QUARTA ORA
- Dalle 12.00 alle 13.00: visualizzare QUINTA ORA
In tutti gli altri casi, visualizzare la scritta TEMPO LIBERO.