Email *
anna.morpurgo@unimi.it
Esercizio 1 - libretto
Esercizio di analisi e tracciatura
programma libretto.go (nei commenti i numeri di riga)
package main // 1 import (
"fmt"
) // 5 func main() {
const MIN = 18 const MAX = 30
var voto int //10 libretto := make(map[int]int)
//fmt.Print("inserisci i tuoi voti ('-1' per terminare): ") for {
fmt.Scan(&voto)
if voto == -1 { //15 break
}
libretto[voto]++
}
//20 for voto = MIN; voto <= MAX; voto++ {
if num, ok := libretto[voto]; ok { fmt.Println(voto, ":", num) }
} //25 }
Lab 07 - programmazione in Go - mappe e slice - analisi e tracciatura
Inserire la mail @studenti.unimi.it
array int map slice non lo so
salvare i voti letti da stdin
contare le occorrenze dei voti (per ogni voto letto, quante volte è stato preso) sommare i voti letti da stdin
non lo so
bool byte err int string non lo so
a salvare in num un voto
a salvare in num quante volte è stato preso un dato volto a verificare se voto è già tra le chiavi della mappa non lo so
Di che tipo è la variabile 'libretto'? *
A cosa serve la variabile 'libretto'? *
Di che tipo è la variabile ok? *
A cosa serve l'istruzione alla riga 22? *
a stampare, per ogni valore tra MIN e MAX, quante volte è stato preso come voto a stampare tutti (e soli) i voti presi e, per ciascuno, quante volte è stato preso a fare una somma pesata dei voti presi
non lo so
18 : 1 22 : 2 24 : 2 30 : 1
Esercizio 2 - lunghezze
Esercizio di analisi e tracciatura del codice
programma lunghezze.go (nei commenti i numeri di riga)
package main // 1 import (
"bufio"
"fmt"
"os"
"strings"
)
func main() { // 10 conteggio := make(map[int]int)
scanner := bufio.NewScanner(os.Stdin)
for scanner.Scan() { // 15 riga := scanner.Text()
aggiornaConteggio(conteggio, riga) }
fmt.Println(conteggio) // 20 }
func aggiornaConteggio(m map[int]int, s string) { listaParole := strings.Fields(s) // 25 for _, parola := range listaParole {
m[len(parola)]++
} }
// 30
A cosa serve il for alle righe 21-25? *
Tracciate o lanciate il programma e scrivete qui che output viene stampato per input: 24 18 22 30 24 22 -1
(riproducetelo esattamente) *
Restituisce una slice di stringhe che contiene le sotto-stringhe di s che si ottengono spezzando s dove ci sono caratteri white spaces
Per ogni parola nella lista di parole listaParole, aggiorna la mappa m che tiene i conteggi di quante parole ci sono di ogni lunghezza, cioè ad ogni iterazione incrementa di 1 il valore associato alla lunghezza della parola che sta considerando in quella iterazione
della prima stringa che le è stata passata dell'ultima stringa che le è stata passata
cumulativi di tutte le stringhe che le sono state passate non lo so
mai
al primo invio all'invio di ctrl D dopo aver letto 5 valori non lo so
map[1:1 2:2 3:2 4:1]
Esercizio 3 - ristorante
Esercizio di analisi e comprensione di codice
Che cosa fa la funzione strings.Fields? *
Cosa fa il for alle righe 26-28? *
Se dal main invoco su diverse stringhe, quindi più volte, la funzione aggiornaConteggio, la variabile conteggio alla fine conterrà i dati: *
Quando termina il for alle righe 15-18? *
Tracciate il programma e scrivete qui che output viene stampato per input: 1 333 22 4444 22 333 (riproducetelo
esattamente) *
programma ristorante.go
package main import (
"fmt"
"strconv"
)
func main() {
carta := "Menu del giorno:\n"
menu := make(map[int]string) carta += creaMenu(menu) fmt.Println()
fmt.Println(carta) ordine := prendiOrdini() fmt.Println("Hai ordinato:") for _, key := range ordine {
fmt.Println(menu[key]) }
}
func creaMenu(mappa map[int]string) string { lista := ""
var nuovaVoce string key := 1
for {
fmt.Print("inserire voce nel menu ('q' per terminare): ") fmt.Scan(&nuovaVoce)
if nuovaVoce == "q" || nuovaVoce == "Q" { break
}
if !contains(mappa, nuovaVoce) { mappa[key] = nuovaVoce
lista += strconv.Itoa(key) + ". " + nuovaVoce + "\n"
key++
} }
return lista }
func prendiOrdini() (ordine []int) { var scelta int
fmt.Println("Inizia a ordinare (-1 per terminare") for scelta != -1 {
fmt.Print("piatto n. ") fmt.Scan(&scelta) if scelta == -1 {
break }
ordine = append(ordine, scelta) }
return }
func contains(m map[int]string, value string) bool { for _, v := range m {
if v == value { return true }
}
return false }
Analizzate il programma e rispondete alle domande che seguono. Se vi può aiutare, salvate il programma in un file
per poterlo eseguire.
bool map slice string non lo so
bool map slice string non lo so
niente una mappa una stringa una slice
una mappa e una stringa non lo so
Di che tipo è la variabile carta? *
Di che tipo è la variabile menu? *
Che cosa restituisce la funzione creaMenu? *
controlla se la mappa contiene valori o è vuota
controlla se la stringa è uno dei valori salvati nella mappa controlla se la stringa è una delle chiavi salvate nella mappa non lo so
ad aggiungere nuove voci nel menu da stampare
ad aggiungere nuovi piatti nel "database" dei piatti ordinabili, individuati ciascuno da un numero progressivo a terminare il programma quando l'utente inserisce 'q' come ordinazione
a raccogliere le ordinazioni di un utente non lo so
bool map slice string non lo so
a prendere una ordinazione
a terminare il programma se l'utente fa l'ordine -1
a salvare una lista di interi corrispondenti alle voci del menu che si vogliono ordinare non lo so
Esercizio 4 - operazioni su slice
Esercizio di analisi e comprensione del codice