04 Sezione 4 di 15
Le basi del linguaggio
Tutto quello che serve per scrivere programmi veri: come si conservano i valori, come si prendono decisioni, come si ripete un lavoro e come lo si mette in una funzione. Ogni esempio si può copiare ed eseguire così com'è.
La forma del codice#
Un programma Leo è un file di testo con estensione .leo. Poche regole valgono sempre:
- un'istruzione per riga (per metterne due sulla stessa riga separale con
;); - i blocchi si aprono con
alloraofaie si chiudono sempre confine; - i commenti vanno da
#a fine riga, o tra#[e]#su più righe: Leo li ignora, servono a chi legge; - le parole chiave si scrivono in minuscolo; i nomi possono avere lettere accentate (
età,città).
# Questo è un commento: Leo lo salta#[ anche questo, su più righe ]#stampa("Una riga")stampa("Due"); stampa("righe")Una riga Due righe
Variabili#
Una variabile è una scatola con un nome che contiene un valore. La prima volta si dichiara con variabile; poi si cambia con =.
variabile punti = 0punti = 10punti += 5 # ora vale 15; esistono anche -=, *=, /=stampa(punti)15
Usare un nome mai dichiarato è un errore: così un errore di battitura (pnuti = 3) non crea di nascosto una variabile nuova, e Leo ti propone il nome giusto.
Si possono dichiarare più variabili insieme, e scambiare due valori in una riga:
variabile nome, anni = ["Beatrice", 24]variabile a, b = 1, 2a, b = b, astampa(nome, anni, a, b)Beatrice 24 2 1
Dove si vede una variabile. Una variabile dichiarata dentro un blocco (un se, un ciclo, una funzione) esiste solo lì dentro. Per cambiare una variabile di fuori basta =:
variabile totale = 0per ogni n in [1, 2, 3] fai variabile doppio = n * 2 # esiste solo dentro il ciclo totale += doppio # cambia la variabile esternafinestampa(totale)12
Costanti#
Una costante è un valore che non cambia mai. Si scrive di solito in maiuscolo. Provare a cambiarla è un errore.
costante IVA = 22variabile prezzo = 50stampa("Con IVA: {prezzo + prezzo * IVA / 100} euro")stampa(PI_GRECO) # una costante già prontaCon IVA: 61.0 euro 3.141592653589793
Aumenta e diminuisci#
Per cambiare un numero puoi anche usare le parole: aumenta e diminuisci. Dopo di scrivi di quanto; senza di vuol dire di 1.
variabile punti = 0variabile vite = 3variabile voti = [6, 7]aumenta punti di 10 # come punti += 10diminuisci vite # come vite -= 1aumenta voti[0] di 2 # anche gli elementi di una listastampa(punti, vite, voti)10 2 [8, 7]
Funziona anche con le proprietà dei controlli: aumenta Pulsante1.alto di 5.
I tipi di valore#
| Tipo | Esempi | Note |
|---|---|---|
intero | 42, -7, 1_000_000 | senza limiti di grandezza; _ separa le cifre |
decimale | 3.14, 2.0e-3 | con il punto, mai la virgola |
testo | "ciao" | tra virgolette doppie |
logico | vero, falso | il risultato di un confronto |
nulla | nulla | «nessun valore» |
lista | [1, 2, 3] | elementi in ordine, dall'indice 0 |
dizionario | {"nome": "Ada"} | coppie chiave → valore |
tipo(x) dice il tipo di un valore. Leo non converte mai da solo: "3" + 4 è un errore. Le conversioni si fanno a mano:
stampa(tipo(3.5))stampa(intero("42") + 1)stampa(decimale(3))stampa("Hai " + testo(18) + " anni")decimale 43 3.0 Hai 18 anni
Numeri e operazioni#
stampa(7 + 2, 7 - 2, 7 * 2)stampa(7 / 2) # diviso: sempre un decimalestampa(7 // 2) # divisione interastampa(7 % 3) # restostampa(2 ^ 10) # potenzastampa(arrotonda(3.14159, 2), assoluto(-5), radice(16))stampa(minimo(4, 9, 2), massimo([3, 9, 4]), somma([1, 2, 3]))9 5 14 3.5 3 1 1024 3.14 5 4.0 2 9 6
Per un numero a caso tra due valori, estremi compresi, c'è casuale(1, 6): il dado.
Confronti e logica#
I confronti danno vero o falso: == (uguale), != (diverso), <, <=, >, >=. Si combinano con e, o, non.
variabile x = 7stampa(x == 7, x != 7)stampa(0 < x < 10) # i confronti si possono concatenarestampa(x > 0 e x < 5)stampa(non (x > 5))stampa("a" in "casa", 3 in [1, 2, 3])vero falso vero falso falso vero vero
Testi#
I testi stanno tra virgolette doppie. Tra graffe {…}, dentro un testo, puoi mettere qualunque valore o calcolo: Leo lo sostituisce.
variabile nome = "Beatrice"stampa("Ciao, {nome}! Il tuo nome ha {lunghezza(nome)} lettere.")stampa("Prima riga\nSeconda riga\tcon una tabulazione")stampa("Le graffe vere: \{ e \}")Ciao, Beatrice! Il tuo nome ha 8 lettere.
Prima riga
Seconda riga con una tabulazione
Le graffe vere: { e }Numeri formattati: dopo il valore, due punti e il formato.
variabile prezzo = 3.5variabile abitanti = 1234567variabile totale = 1234.5stampa("Prezzo: {prezzo:2} euro")stampa("Abitanti: {abitanti:migliaia}")stampa("Totale: {totale:migliaia 2} euro")Prezzo: 3.50 euro Abitanti: 1.234.567 Totale: 1.234,50 euro
Metodi dei testi: si chiamano con il punto e danno un testo nuovo (quello di partenza non cambia).
variabile frase = " Leo parla italiano "stampa(frase.pulisci())stampa(frase.maiuscolo())stampa(frase.pulisci().dividi(" "))stampa(", ".unisci(["pane", "latte", "uova"]))stampa("mela".sostituisci("m", "b"), "casa".inizia_con("ca"))stampa("Leo"[0], "Leo"[-1])Leo parla italiano LEO PARLA ITALIANO ["Leo", "parla", "italiano"] pane, latte, uova bela vero L o
Un testo su più righe si scrive tra tre virgolette """:
variabile nome = "Ada"variabile lettera = """ Cara {nome}, grazie della visita. """stampa(lettera)Cara Ada, grazie della visita.
Liste#
Una lista è una fila di valori tra parentesi quadre. Il primo elemento ha indice 0; con un indice negativo si conta dal fondo.
variabile voti = [28, 30, 24]stampa(voti[0]) # il primostampa(voti[-1]) # l'ultimovoti[1] = 29voti.aggiungi(27)stampa(voti, lunghezza(voti))stampa(27 in voti)voti.ordina()stampa(voti)28 24 [28, 29, 24, 27] 4 vero [24, 27, 28, 29]
Altri metodi utili: inserisci(indice, x), rimuovi(x), estrai(), inverti(), trova(x), conta(x). Per sapere se una lista è vuota: vuota(lista).
Una lista si può anche costruire in una riga, dicendo come calcolare ogni elemento:
variabile quadrati = [n * n per ogni n in 1..6]variabile pari = [n per ogni n in 1..10 se n % 2 == 0]stampa(quadrati)stampa(pari)[1, 4, 9, 16, 25, 36] [2, 4, 6, 8, 10]
Dizionari#
Un dizionario associa a ogni chiave un valore, come una rubrica.
variabile persona = {"nome": "Ada", "età": 36}stampa(persona["nome"])persona["città"] = "Londra" # aggiunge una chiavestampa(persona.prendi("email", "-")) # "-" se la chiave mancastampa(persona.ha("età"))per ogni chiave, valore in persona fai stampa("{chiave}: {valore}")fineAda - vero nome: Ada età: 36 città: Londra
Chiedere una chiave che non c'è con le parentesi quadre dà un errore (ErroreChiave): quando non sei sicuro usa .prendi(chiave, predefinito) o controlla prima con .ha(chiave). Altri metodi: chiavi(), valori(), coppie(), rimuovi(chiave).
Decidere: se, altrimenti#
variabile voto = 16se voto >= 18 allora stampa("Promosso")altrimenti se voto >= 15 allora stampa("Orale di recupero")altrimenti stampa("Respinto")fineOrale di recupero
Un solo fine chiude tutta la catena; altrimenti se e altrimenti sono facoltativi. Dopo se ci vuole un valore vero o falso: per sapere se una lista è vuota si scrive se vuota(lista) allora.
Tanti casi: scegli#
Quando un valore va confrontato con molte possibilità, scegli è più leggibile:
variabile voto = 7scegli voto caso 10 allora stampa("eccellente") caso 8, 9 allora stampa("molto bene") caso 6..7 allora stampa("sufficiente") altrimenti stampa("da ripassare")finesufficiente
Un caso può avere più valori separati da virgole, un intervallo 6..7 (estremi compresi) o una lista. Vince il primo che corrisponde.
Ripetere: i cicli#
Un numero fisso di volte: ripeti#
ripeti 3 volte stampa("Ciao!")fineCiao! Ciao! Ciao!
Su ogni elemento: per ogni#
Funziona con le liste, i testi (lettera per lettera), gli intervalli e i dizionari.
per ogni frutto in ["mela", "pera", "fico"] fai stampa("Mi piace: {frutto}")fineper ogni i in 1..5 fai stampa(i * i)fineper ogni i in 3..1 fai # all'indietro stampa(i)fineMi piace: mela Mi piace: pera Mi piace: fico 1 4 9 16 25 3 2 1
Finché una condizione è vera: mentre#
variabile n = 3mentre n > 0 fai stampa(n) n -= 1finestampa("Via!")3 2 1 Via!
Uscire o saltare un giro#
interrompi esce subito dal ciclo; continua salta al giro successivo.
per ogni i in 1..100 fai se i % 2 == 0 allora continua # salta i pari fine se i > 9 allora interrompi # basta così fine stampa(i)fine1 3 5 7 9
Funzioni#
Una funzione dà un nome a un pezzo di codice, così lo puoi usare tante volte. Riceve dei valori (i parametri) e con restituisci dà un risultato.
funzione saluta(nome, saluto = "Ciao") restituisci "{saluto}, {nome}!"fine stampa(saluta("Giulia"))stampa(saluta("Marco", saluto = "Buongiorno"))Ciao, Giulia! Buongiorno, Marco!
- un parametro con
=ha un valore predefinito: si può non passarlo; - alla chiamata un parametro si può indicare per nome (
saluto = "Buongiorno"); - senza
restituiscila funzione dànulla; - una funzione va definita prima di essere chiamata (oppure si usa il blocco
inizio, qui sotto).
Una funzione può anche chiamare se stessa (ricorsione):
funzione fattoriale(n) se n <= 1 allora restituisci 1 fine restituisci n * fattoriale(n - 1)finestampa(fattoriale(10))3628800
Il programma principale: inizio … fine#
Il codice che deve partire subito si può racchiudere tra inizio e fine. Funzioni, costanti e gestori quando stanno fuori, prima o dopo. Il blocco parte dopo che tutto il resto del file è pronto, quindi le funzioni scritte sotto si possono già usare.
costante SUFFICIENZA = 6 inizio variabile voti = [7, 5, 8, 6] stampa("Media: {media_di(voti):2}") stampa(giudizio(media_di(voti)))fine funzione media_di(lista) restituisci somma(lista) / lunghezza(lista)fine funzione giudizio(m) se m >= SUFFICIENZA allora restituisci "promosso" fine restituisci "da recuperare"fineMedia: 6.50 promosso
Le regole: inizio va scritto da solo sulla sua riga, e c'è un solo blocco inizio per file. Quando c'è, fuori dal blocco restano solo funzioni, gestori quando, variabili, costanti e importa. Nell'editor di Leo Studio inizio + Tab scrive lo schema.
Tutto insieme#
Un piccolo programma che usa quasi tutto quello che hai visto: calcola la media di una classe, trova il voto migliore e dice chi è sopra la media.
inizio variabile classe = {"Ada": 8, "Bruno": 6, "Carla": 9, "Dario": 5} variabile m = somma(classe.valori()) / lunghezza(classe) stampa("Media della classe: {m:2}") stampa("Voto migliore: {massimo(classe.valori())}") per ogni nome, voto in classe fai se voto > m allora stampa("- {nome} è sopra la media") fine finefineMedia della classe: 7.00 Voto migliore: 9 - Ada è sopra la media - Carla è sopra la media