• Non ci sono risultati.

Lab 07 - programmazione in Go - mappe e slice - analisi e tracciatura

N/A
N/A
Protected

Academic year: 2022

Condividi "Lab 07 - programmazione in Go - mappe e slice - analisi e tracciatura"

Copied!
9
0
0

Testo completo

(1)

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

(2)

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? *

(3)

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) *

(4)

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) *

(5)

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.

(6)

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? *

(7)

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

La funzione contains restituisce un valore di tipo bool. Che controllo fa? Dati come parametri una mappa e una stringa:

*

A cosa serve la funzione creaMenu in questo programma? (selezionare le risposte valide) *

Di che tipo è la variabile ordine? *

A cosa serve la funzione prendiOrdini? (selezionare le risposte valide) *

(8)
(9)

Associa a ciascuna istruzione o coppia di istruzioni (individuata dal numero nel commento subito prima) l'operazione su slice corrispondente *

1 2 3 4 5 6 7 8 9 10 11

Estende una slice con una nuova slice di lunghezza j

Estrae, cancellandolo dalla slice, l'ultimo elemento di una slice

Aggiunge un elemento alla fine di una slice

Inserisce un elemento in posizione i

Inserisce alla posizione i una slice esistente

Crea una slice di interi dati

Copia una slice in una nuova slice

Rimuove l'elemento di indice i da una slice

Rimuove gli elementi di indici da i (incluso) a j (escluso) dalla slice a

Inserisce alla posizione i una nuova slice di lunghezza j

Appende una slice esistente ad una slice Estende una slice con una nuova slice di lunghezza j

Estrae, cancellandolo dalla slice, l'ultimo elemento di una slice

Aggiunge un elemento alla fine di una slice

Inserisce un elemento in posizione i

Inserisce alla posizione i una slice esistente

Crea una slice di interi dati

Copia una slice in una nuova slice

Rimuove l'elemento di indice i da una slice

Rimuove gli elementi di indici da i (incluso) a j (escluso) dalla slice a

Inserisce alla posizione i una nuova slice di lunghezza j

Appende una

slice esistente

ad una slice

Riferimenti

Documenti correlati

Il tempo neces- sario per stabilire la connessione col sito A ` e descritto da una variabile aleatoria T A con legge (assolutamente continua) uniforme sull’intervallo [0, 40]

In seguito useremo la seguente convenzione: quando un vettore v viene consid- erato come vettore colonna, verra’ indicato con lo stesso simbolo v, quando un vettore v viene

un'operazione finanziaria, che prevede il ricavo di 300 euro tra un anno e di 500 tra due anni, a fronte di una spesa odierna di 700 euro, determina il dominio, gli asintoti e

Si scrivano in particolare le equazioni degli asintoti e le ascisse dei punti di massimo, di minimo e di flesso.. La funzione ha un asintoto orizzontale per x

Diego Calvanese Fondamenti di Informatica — Corso di Laurea in Ingegneria Elettronica — A.A. ) int isprint(int c); carattere stampabile (incluso lo spazio) int isgraph(int c);

Come detto in precedenza, l’approssimazione delle trasformate di Fourier con- tinue con le trasformate discrete presenta dei problemi legati alle condizioni di calcolo: la funzione

Numero di parametri sulla linea di comando Incrementato di uno, in quanto il nome del programma viene considerato come un parametro Se non vi sono argomenti effettivi, vale 1 Se

Fonte: Conferenza nazionale dei delegati dei Rettori per i Poli universitari penitenziari (Cnupp) Elaborazione a cura del Garante nazionale - Unità organizzativa Privazione