«[Figlio dell'uomo] Porgi l'orecchio e ascolta le parole di KGB
e applica la tua mente alla SUA istruzione
» Pv. 22,17

Qui si straparla di vari argomenti:
1. Il genere dei pezzi è segnalato da varie immagini, vedi Legenda
2. Per contattarmi e istruzioni per i nuovi lettori (occasionali e non) qui
3. L'ultimo corto è questo
4. Molti articoli di questo blog fanno riferimento a definizioni e concetti che ho enunciato nella mia Epitome gratuitamente scaricabile QUI. Tali riferimenti sono identificati da una “E” fra parentesi quadre e uno o più capitoli. Per esempio: ([E] 5.1 e 5.4)

domenica 13 marzo 2016

CdP, Lezione 1: le variabili (parte 2/2)

E finalmente eccoci alle variabili!
La variabile è la struttura dati più semplice e serve a indicare un valore: linguaggi diversi hanno regole più o meno complesse per definirle ma dal nostro punto di vista, quello della costruzione di algoritmi, questi dettagli implementativi non ci interessano.
Per noi la variabile è come una grande tasca in cui possiamo inserire (e poi riprendere!) qualsiasi cosa. Ogni variabile ha un proprio nome e tramite esso possiamo assegnarle nuovi valori usando delle espressioni più o meno complesse. Non solo: possiamo usare il nome di una variabile per adoperarne il contenuto (ciò che abbiamo messo nella tasca) all'interno di un'espressione.
Con le variabili possiamo quindi fare due operazioni diverse: 1. assegnarli un valore; 2. usare il valore assegnato alla variabile.
La prima operazione è chiamata assegnamento ed è una delle operazioni base di ogni linguaggio (e quindi avrà una sintassi ben precisa). Nello pseudo codice che userò l'assegnamento avrà la seguente forma:
Nome_Variabile := Espressione

I linguaggi di programmazione sono molto precisi e rigorosi nel definire cosa sia un'espressione. Ma a noi, che lavoreremo (per il momento!) a livello di pseudo codice, non ci serve una definizione esatta: l'intenderemo nel senso generico che tale parola ha in italiano. Quando servirà faremo ulteriori precisazioni...

Quattro esempi:
A := 12
oppure
Lato := 43.6
oppure
frase := “questa è una frase”
oppure
compl := 3 + 12 * funzione1() - funzione2()

Nel primo esempio assegniamo l'intero 12 alla variabile chiamata “A”.
Nel secondo esempio assegniamo il numero reale 43,6 alla variabile chiamata “Lato”.
Nel terzo esempio assegniamo la sequenza di caratteri (chiamata “stringa”) compresi fra le virgolette alla variabile chiamata frase: da notare che le virgolette servono solo a identificare e racchiudere la sequenza di caratteri e che non sono a loro volta assegnate alla variabile!
Nel quarto esempio l'espressione sulla destra è più complessa: in questo caso ci sono operazioni aritmetiche (l'asteristico “*” indica la moltiplicazione) mentre “funzione1()” e “funzione2()” sono delle funzioni (le vedremo approfonditamente in un'altra lezione) che restituiscono dei valori numerici usati poi nel calcolo dell'espressione.

Leggere il valore di una variabile è ancora più semplice: basta inserire il nome della variabile direttamente in un'espressione.
Altri quattro esempi:
A := B
oppure
Lato := A
oppure
frase := “questa è una ” # Nome
oppure
compl := A + Lato * funzione1() - funzione2()

Nel primo esempio assegniamo il valore contenuto nella variabile chiamata “B” alla variabile chiamata “A”.
Nel secondo esempio assegniamo il valore contenuto nella variabile chiamata “A” alla variabile chiamata “Lato”.
Nel terzo esempio assegniamo alla variabile chiamata “frase” la stringa “questa è una ” concatenata al contenuto della variabile chiamata “Nome”. Il simbolo “#” indica appunto l'operazione di concatenazione: ogni linguaggio ha la sua sintassi ma spesso viene adoperato il “+”. Io credo però che sia più istruttivo distinguere il “+” dell'operazione matematica dalla concatenazione e, per questo, ho optato per il simbolo “#”.
Nel quarto esempio alla variabile chiamata “compl” assegniamo l'espressione calcolata usando il valore della variabile chiamata “A”, della variabile chiamata “Lato” e i valori restituiti dalle due funzioni.
Attenzione! Da adesso in poi, per semplicità, scriverò “il valore di A” per indicare “il valore della variabile chiamata A”.

ESEMPI

Problema 1: “Area quadrato” - Calcolare l'area di un quadrato di lato 10.

Algoritmo 1:
1- assegna lato noto
2- calcola area

Pseudo codice 1 (i numeri all'inizio di ogni linea non fanno parte dello pseudo codice ma servono solo per facilitarne la descrizione e spiegazione):

1. Lato := 10
2. Area := Lato * Lato

Osservazioni:

Algoritmo:
-

Pseudo codice:
Nell'istruzione 1 assegniamo alla variabile “Lato” il valore 10.
Nell'istruzione 2 assegniamo alla variabile “Area” il risultato dell'espressione che moltiplica la variabile “Lato” per la variabile “Lato”.

Problema 2: “Raccolta fondi” - Tim, Tom e Tam hanno raccolto rispettivamente 10, 15 e 7 euro: calcolare quanti euro hanno raccolto in totale e quanti ne mancano all'obiettivo finale di 50€.

Algoritmo 2:
1- Assegna i dati noti
2- Calcola totale raccolta
3- Calcola soldi mancanti

Pseudo codice 2:
1. Soldi_Tim := 10
2. Soldi_Tom := 15
3. Soldi_Tam := 5
4. Tot_Soldi := Soldi_Tim + Soldi_Tom + Soldi_Tam
5. Soldi_Mancanti := 50 – Tot_Soldi

Osservazioni:
Algoritmo:
Il passo 1 è interessante: non si tratta di una istruzione singola ma di una generica. Come spiegato precedentemente l'importante è che le istruzioni non siano ambigue e questa non lo è perché il testo del problema ci dice esattamente quali siano i dati noti. Nello pseudo codice avrei potuto sostituire tale istruzione dell'algoritmo con la chiamata a una funzione: non l'ho fatto perché le funzioni ancora non le abbiamo studiate e comunque in questo caso, nascondere questi assegnamenti iniziali, avrebbe reso lo pseudo codice meno chiaro invece di semplificarlo.
Pseudo codice:
Passi 1, 2 e 3 sono assegnamenti analoghi a quanto visto nell'esercizio precedente.
Passo 4: è da sottolineare che in realtà avrei potuto fare a meno delle tre istruzioni precedenti inserendo i valori noti dei soldi raccolti direttamente nell'espressione di questo assegnamento (cioè Tot_Soldi := 10 + 15 + 5). Non l'ho fatto perché il passaggio intermedio mi sembrava leggermente più chiaro: è comunque da tenere sempre presente che per risolvere un dato problema possono esistere più algoritmi.
Passo 5: nell'espressione mischio insieme numeri e variabili: non volevo dare l'impressione che fosse obbligatorio usare solo variabili! Avrei infatti potuto assegnare alla variabile Obiettivo_Fondi il valore 50 e poi usarla nell'espressione: ma variare mi è sembrato più didattico.

Problema 3: “Scambio di variabile” - Alle variabili A e B sono già stati precedentemente assegnati dei valori noti: si vuole che B prenda il valore di A e che A prenda il valore di B.

Algoritmo 3
1- Assegna alla variabile temporanea TMP il valore di A
2- Assegna ad A il valore di B
3- Assegna a B il valore di TMP

Pseudo codice 3:
1. TMP := A
2. A := B
3. B:= tmp

Osservazioni:
Algoritmo:
Perché ho introdotto la variabile temporanea TMP? Non avrei potuto semplicemente assegnare il valore di A alla variabile B e viceversa (cioè B :=A e A:=B)?
No, non avrei potuto perché gli assegnamenti vengono eseguiti in sequenza e non contemporaneamente: questo significa che dopo aver eseguito il primo assegnamento (B := A) si sarebbe perso il valore iniziale della variabile B cosicché il secondo assegnamento (A := B) avrebbe semplicemente riassegnato il valore originale di A alla stessa variabile A. Invece, usando la variabile temporanea TMP, “salviamo” il valore originale di una variabile prima che le venga assegnato il suo nuovo valore.
Pseudo codice:
Passo 1 e 3: volutamente ho chiamato la variabile temporanea prima TMP (passo 1) e poi tmp (passo 3). In genere i linguaggi di programmazione hanno delle regole molto precise sulla sintassi delle variabili: spesso i caratteri maiuscoli sono considerati diversi dai minuscoli (per certi linguaggi TMP e tmp sarebbero quindi due variabili diverse!) ma nel nostro pseudo codice questo livello di attenzione non ha senso: comunque, per evitare confusione, da adesso userò la stessa variabile senza cambiarne i caratteri maiuscoli in minuscoli o vice versa. L'ho fatto in questo caso solo per richiamare l'attenzione del lettore su questo dettaglio!

Esercizi per casa:
Per i seguenti problemi scrivere sia l'algoritmo che lo pseudo codice.

Problema 4: “Area rettangolo” - Calcolare l'area di un rettangolo con i lati di 10 e 12 cm.

Problema 5: “Le biglie” - Tim, Tom e Tam hanno lo stesso numero di biglie che, in totale, sono 30: giocando fra loro Tim vince 5 biglie e Tom ne perde 1. Con quante biglie è rimasto Tam?

Problema 6: “Scambio di più variabili” - Alle variabili A, B e C sono già stati precedentemente assegnati dei valori noti: adesso si vuole che A prenda il valore originale di B, B quello di C e C il valore originale di A.

Per non annoiare troppo i lettori che già hanno qualche rudimento di programmazione presento anche il seguente esercizio un po' più, che si basa solo su assegnamenti e può comunque essere tentato da tutti. Non ci sono trucchi strani ma è necessario sfruttare un po' di algebra elementare...
Problema 7 (bonus!): Le due variabili - Alle variabili A e B sono già stati precedentemente assegnati dei valori noti: si vuole che B prenda il valore di A e che A prenda il valore di B. Senza usare nessuna variabile temporanea: ovvero usando solo assegnamenti fra A e B...

Conclusione: nella prossima lezione vedremo le soluzioni degli esercizi proposti...

Nessun commento:

Posta un commento