Skip to content
Snippets Groups Projects
Unverified Commit 1acf3842 authored by Andrea Trentini's avatar Andrea Trentini
Browse files

lab06

parent 3cd66e23
Branches
No related tags found
No related merge requests found
Lab06.md 0 → 100644
# Lab 06 - (testing ripresa) puntatori, struct e array
# Consegne Lab05, stats
## sorgenti (inclusi nomi sbagliati) consegnati: 465
```
465 go (ma sono stati consegnati anche file di lab precedenti)
61 student-test
11 out (!?! tra l'altro alcuni che ho guardato sono identici al sorgente?!?)
3 virginia-test (NOME!)
3 studenti-test (NOME!)
3 exe (ESEGUIBILE!!!)
2 txt (NON RICHIESTO, era il test-out)
2 studente-test (NOME!)
1 xz (ARCHIVIO!!!)
1 operazioni (ESEGUIBILE)
```
**Avviso**. Abbiamo riaperto le sessioni di upload delle settimane scorse, vi chiediamo d'ora in poi di caricare le soluzioni nella sessione del Lab in cui è stato proposto l'esercizio.
## nomi file
```
26 funzioni.go
23 operazioni.go
23 disegna_v.go
19 minu_maiu.go
19 max_char.go
19 crescente.go
18 max_somma_cifre.go
18 fibonacci.go
18 disegna_slash.go
18 cesare.go
17 num_max.go
17 lunghezza_tot.go
16 trova.go
16 primo_multiplo.go
16 giorni_mese.go
16 briscola.go
15 stringaRune.go
15 stringaByte.go
14 max_num_cifre_pari.go
14 funzioni.student-test
13 operazioni.student-test
13 num_sequenze.go
11 prime_vocali.go
11 max_somma_cifre.student-test
10 ultima_pioggia.go
10 quanteDoppie.go
9 stampaRiquadro.go
9 min_lessicografica.go
9 disegna_v.student-test
9 cesare.student-test
8 maxGradino.go
8 ascending.go
6 pos_alfabeto.go
5 es0.go
4 num_maxP.go
3 giorni_mese.student-test
2 slash.go
2 briscola.student-test
1 usodellefunzioni.go
1 ultima_piggia.go (NOME!)
1 switch.out (BOH!)
1 switch.go
1 sumeo.go (NOME?)
1 stringa.go
1 somma-e-conta.out (BOH!)
1 sommaeconta.go
1 somma-e-conta.go
1 prova.go
1 primo_multiplo. (BOH!)
1 pari-e-dispari.out (BOH!)
1 pari-e-dispari.go
1 operazioni.student-test.txt
1 operazioni.studenti-test
1 operazioni_b.go
1 operazioni
1 operazione.go
1 num_max.exe (ESEGUIBILE WINDOWS!)
1 minu_malu.go
1 min_lessicografico.go
1 menu.out (BOH!)
1 menu.go
1 max_somma_cifre.virginia-test (NOME!)
1 max_somma_cifre.studente-test (NOME!)
1 max_somma_cifre.exe (ESEGUIBILE WINDOWS!)
1 max_num_cifre_pari.exe (ESEGUIBILE WINDOWS!)
1 lunghessa_tot.go
1 lib_test.go
1 Lab05.tar.xz (ARCHIVIO!)
1 hasUpper.go
1 funzioni.student-test.txt
1 funzioni.studenti-test
1 firstUpper.go
1 es1comprensione.go
1 disegna_v_test.go (CONSEGNA DEI NOSTRI FILE)
1 disegna_v.studente-test (NOME!)
1 disegna.virginia-test (NOME!)
1 disegna_slash.go.go
1 crea_v.go
1 compila.result
1 cesare.virginia-test (NOME!)
1 cesare.studenti-test (NOME!)
1 ascending.out (BOH!)
1 2b-for-unario.out (BOH!)
1 2b-for-unario.go
1 2a-for-unario.out (BOH!)
1 2a-for-unario.go
1 1prm-a-for-ternario.out (BOH!)
1 1prm-a-for-ternario.go
1 1exp-for-ternario.out (BOH!)
1 1exp-for-ternario.go
1 08_quadrati.out (BOH!)
1 08_quadrati.go
```
## file sbagliati (consegna precedente o nomi errati)
```
08_quadrati.go 1exp-for-ternario.go 1prm-a-for-ternario.go 2a-for-unario.go 2b-for-unario.go menu.go pari-e-dispari.go prime_vocali.go somma-e-conta.go switch.go (10)
cesare.go (1)
cesare.go crescente.go disegna_slash.go disegna_v.go es0.go fibonacci.go lunghezza_tot.go max_char.go max_num_cifre_pari.go max_somma_cifre.go maxGradino.go minu_maiu.go num_max.go num_maxP.go num_sequenze.go pos_alfabeto.go stringaByte.go stringaRune.go trova.go ultima_pioggia.go (20)
cesare.go crescente.go disegna_slash.go disegna_v.go es0.go fibonacci.go lunghezza_tot.go max_char.go max_num_cifre_pari.go minu_maiu.go num_max.go num_maxP.go num_sequenze.go pos_alfabeto.go prova.go stringaByte.go stringaRune.go ultima_pioggia.go (18)
cesare.go crescente.go disegna_slash.go disegna_v.go es1comprensione.go fibonacci.go lunghezza_tot.go max_char.go max_num_cifre_pari.go max_somma_cifre.go minu_maiu.go num_max.go num_sequenze.go stringaByte.go stringaRune.go trova.go (16)
cesare.go crescente.go disegna_slash.go disegna_v.go fibonacci.go lunghezza_tot.go max_char.go max_num_cifre_pari.go max_somma_cifre.go maxGradino.go minu_maiu.go num_max.go num_maxP.go num_sequenze.go stringaByte.go stringaRune.go trova.go ultima_pioggia.go prime_vocali.go (19)
cesare.go crescente.go disegna_slash.go disegna_v.go fibonacci.go lunghezza_tot.go max_char.go max_num_cifre_pari.go max_somma_cifre.go maxGradino.go minu_maiu.go num_max.go num_sequenze.go stringaByte.go stringaRune.go trova.go ultima_pioggia.go (17)
cesare.go crescente.go disegna_slash.go disegna_v.go fibonacci.go lunghezza_tot.go max_char.go max_num_cifre_pari.go max_somma_cifre.go maxGradino.go minu_maiu.go num_max.go num_sequenze.go stringaByte.go stringaRune.go trova.go ultima_pioggia.go (17)
cesare.go crescente.go disegna_slash.go disegna_v.go fibonacci.go lunghezza_tot.go max_char.go max_num_cifre_pari.go max_somma_cifre.go maxGradino.go minu_maiu.go num_max.go num_sequenze.go stringaByte.go stringaRune.go trova.go ultima_pioggia.go (17)
cesare.go crescente.go disegna_slash.go disegna_v.go fibonacci.go lunghezza_tot.go max_char.go max_num_cifre_pari.go max_somma_cifre.go maxGradino.go minu_maiu.go num_max.go num_sequenze.go stringaByte.go stringaRune.go trova.go ultima_pioggia.go prime_vocali.go (18)
cesare.go crescente.go disegna_slash.go disegna_v.go fibonacci.go lunghezza_tot.go max_char.go max_num_cifre_pari.go max_somma_cifre.go minu_maiu.go num_max.go num_sequenze.go stringaByte.go stringaRune.go trova.go operazioni_b.go (16)
cesare.go crescente.go disegna_slash.go disegna_v.go fibonacci.go lunghezza_tot.go max_char.go max_somma_cifre.go maxGradino.go minu_maiu.go num_max.go num_sequenze.go stringaByte.go stringaRune.go trova.go ultima_pioggia.go (16)
cesare.go crescente.go disegna_v.go fibonacci.go lunghezza_tot.go max_char.go max_somma_cifre.go minu_maiu.go num_max.go num_sequenze.go slash.go stringaByte.go stringaRune.go trova.go ultima_piggia.go min_lessicografico.go prime_vocali.go (17)
cesare.go crescente.go fibonacci.go lunghessa_tot.go max_char.go max_num_cifre_pari.go max_somma_cifre.go minu_malu.go num_max.go stringaByte.go stringaRune.go trova.go ultima_pioggia.go (13)
cesare.go disegna_slash.go disegna_v.go fibonacci.go lunghezza_tot.go max_char.go max_num_cifre_pari.go minu_maiu.go num_max.go num_sequenze.go stringaRune.go trova.go ultima_pioggia.go (13)
cesare.go disegna_v.go max_somma_cifre.go (3)
cesare.go disegna_v.go max_somma_cifre.go (3)
cesare.go disegna_v.go max_somma_cifre.go (3)
cesare.go disegna_v.go max_somma_cifre.go minu_maiu.go (4)
crea_v.go slash.go (2)
crescente.go disegna_slash.go (2)
crescente.go disegna_slash.go disegna_v.go es0.go fibonacci.go max_num_cifre_pari.go minu_maiu.go num_max.go pos_alfabeto.go prime_vocali.go (10)
crescente.go disegna_slash.go disegna_v.go es0.go lunghezza_tot.go max_char.go pos_alfabeto.go stringaByte.go stringaRune.go trova.go prime_vocali.go (11)
crescente.go disegna_slash.go disegna_v.go fibonacci.go lunghezza_tot.go max_char.go max_num_cifre_pari.go max_somma_cifre.go minu_maiu.go num_max.go stringaByte.go stringaRune.go trova.go prime_vocali.go (14)
crescente.go disegna_slash.go disegna_v.go fibonacci.go minu_maiu.go (5)
crescente.go disegna_slash.go.go disegna_v.go fibonacci.go max_somma_cifre.go minu_maiu.go num_max.go num_maxP.go (8)
crescente.go disegna_slash.go lunghezza_tot.go max_char.go pos_alfabeto.go stringa.go trova.go (7)
disegna_slash.go disegna_v.go es0.go firstUpper.go hasUpper.go (5)
disegna_v.go fibonacci.go lunghezza_tot.go max_char.go minu_maiu.go (5)
lunghezza_tot.go max_char.go stringaByte.go trova.go (4)
max_char.go (1)
max_num_cifre_pari.go maxGradino.go num_sequenze.go (3)
max_somma_cifre.go minu_maiu.go num_max.go pos_alfabeto.go prime_vocali.go (5)
operazione.go (1)
prime_vocali.go (1)
prime_vocali.go (1)
prime_vocali.go (1)
sommaeconta.go sumeo.go usodellefunzioni.go (3)
```
## errori compilazione
```
>>> ./ascending.go:13:16: cannot use false (untyped bool constant) as int value in assignment
>>> ./ascending.go:20:6: invalid operation: operator ! not defined on ascending (variable of type int)
./funzioni.go:52:6: palindroma declared and not used
>>> ./giorni_mese.go:34:1: missing return
./minu_maiu.go:6:2: "fmt" imported and not used
./minu_maiu.go:9:6: undefined: unicode
>>> ./operazioni.go:7:7: no new variables on left side of :=
>>> ./operazioni.go:8:10: no new variables on left side of :=
>>> ./operazioni.go:9:12: no new variables on left side of :=
./prime_vocali.go:26:1: syntax error: unexpected EOF, expected }
./max_char.go:7:11: missing import path
```
---
---
# Esercizi Go
## Go test
- Go TEST: alcuni "sul codice", altri "sull'eseguibile"
- convenzione nomi file (dir, file, mod: nomi uguali)
- nella dir dell'esercizio, lanciare il comando:\
```go mod init <nome programma senza estensione>```
- [file tar con i test e le specifiche](Lab06/Lab06.tar)
- le istruzioni su come scompattare il tar e come usare i test sono presenti nel [README-studenti](README-studenti.txt) per l'esame di Laboratorio
## Progettazione di funzioni
Quando dovete progettare una funzione, chiedetevi:
a. se la **funzione**:
1. deve **restituire** un nuovo valore o una nuova struttura di dati (array, struct, ecc.),
1. o se deve invece **modificare** il valore di uno o più dei suoi parametri, senza creare un nuovo dato
1. o se (è più raro) deve fare tutte e due le cose.
b. se i tipi di dati che passate alla funzione come **parametri**, in Go sono passati
1. per **copia**
2. o per **riferimento**
A seconda dei casi occorrerà una funzione void, cioè senza un tipo di ritorno (caso a.2.) o non void, cioè con tipi per i valori di ritorno (casi a.1. e a.3.) e occorrerà usare esplicitamente i puntatori oppure no (caso b.2.).
In ogni caso NON usate variabili globali (variabili di package).
## Esercizi
### Esercizio 1 - uso dei pacchetti strings e strconv
Alcune funzioni del pacchetto `strings` utili da conoscere:
- Contains
- ContainsAny
- ContainsRune
- Count
- Index + LastIndex
- IndexAny + LastIndexAny
- IndexByte e IndexRune + Last
- Repeat
- Replace
- Trim e TrimSpace
Alcune funzioni del pacchetto `strconv` utili da conoscere:
- Atoi
- Itoa
- ParseInt e ParseFloat
*Specifiche*. Scrivere un programma `usaStandard.go` che dichiara e inizializza le seguenti costanti:
- `VOCALI = "aeiouAEIOU"`
- una stringa `S1` a piacere lunga 1 solo carattere
- un'altra stringa `S2` a piacere, più lunga di 1.
Il programma deve leggere da standard input una parola e utilizzare le funzioni dei pacchetti `strings` e `strconv` per svolgere i seguenti compiti:
(1) verificare se la stringa letta contiene S2 come sottostringa (nel caso stampare un messaggio)
(2) verificare se la stringa letta contiene almeno una vocale (nel caso stampare un messaggio)
(3) determinare quante occorrenze di S1 ha la stringa letta (e stampare un messaggio)
(4) determinare in che posizione si trova la prima vocale della stringa letta e in che posizione si trova l'ultima vocale della stringa letta
e stampare i risultati ottenuti
(5) stampare la stringa ottenuta concatenando S2 3 volte con se stessa.
(6) stampare la stringa ottenuta concatenando S1 5 volte con se stessa.
(7) estrarre le eventuali cifre contenute nella parola letta, concatenarle in una stringa *s* nello stesso ordine in cui le incontra e stamparla
(8) convertire a int la stringa *s* e stampare l'int *n* ottenuto \
(usare `fmt.Printf("intero %d\n", n)`)
(9) ottenere il float64 *f* corrispondente a "0.*s*" e stamparlo\
(usare `fmt.Printf("float %f\n", f)`).
Esempio di esecuzione con S1 = "c" e S2 = "sc", su input "1scirocco45"
`./usaStandard`\
**1scirocco45**
```
(1) 1scirocco45 contiene sc
(2) 1scirocco45 ha vocali
(3) 1scirocco45 ha 3 c
(4) la prima vocale di 1scirocco45 è in posizione 3 , l'ultima in posizione 8
(5) scscsc
(6) ccccc
(7) stringa 145
(8) intero 145
(9) float 0.145000
```
nomefile: usaStandard.go
---
### Esercizi 2 - 6 di comprensione e completamento/modifica di codice
I testi di questi esercizi si trovano a [questo link](https://forms.gle/jw2jcBnYugPBSjXWA).
Rispondere alle domande, scrivere e caricare su upload i programmi.
---
## Esercizi con test
Scaricare e scompattare il tar (vedi indicazioni sopra) per avere le specifiche e i test dei seguenti esercizi, organizzati in directory
**NOTABENE**: nell'esercizio countdown il test potrebbe fallire se si usa l'opzione `timeout` di `go test`, perché?
### ARRAY
(vedi tar)
nomefile: array.go
### COUNTDOWN
(vedi tar)
nomefile: countdown.go
### CARTE DA GIOCO
(vedi tar)
nomefile: carte.go
### CIFRE
(vedi tar)
nomefile: conta_cifre.go
---
---
# Progetti Go
NB: progetti di ripasso su vari argomenti
## Progetto clessidra animata
Scrivere un programma clessidra.go che mostri una clessidra (animata) che scandisce un countdown.
<u>Esempio di cosa viene visualizzato per una clessidra che misura un tempo di 2 secondi</u>
al tempo 0 (i due strati di "sabbia" sono nel cono superiore ):
```go
\***/
\*/
/ \
/ \
```
al tempo 1 (uno strato di "sabbia" è nel cono superiore, l'altro è sceso in quello inferiore):
```
\ /
\*/
/ \
/***\
```
al tempo 2 (i due strati di "sabbia" sono nel cono inferiore ):
```
\ /
\ /
/*\
/***\
```
Il tempo (numero di secondi) va letto da stdin.
La dimensione della clessidra è funzione del numero di secondi.
Trovate qui le indicazioni su come impostare il programma.
Partite progettando la funzione che restituisce una singola riga dell'interno della clessidra, che potrà essere piena o vuota \
(la lunghezza della riga varia a seconda del numero di secondi iniziale e del tempo trascorso)
```go
// rigaClessidra restituisce la una singola riga di sabbia o di non sabbia (interna alla clessidra)
// accetta lunghezza, stato di sabbia o no, carattere da usare per la sabbia;
// usare le funzioni di strings (senza usare il for)
func rigaClessidra(length int, sand bool, sandChar byte) string {
```
e usate la funzione main per invocarla e testarla.
---
Progettate poi la funzione che disegna tutta la clessidra
```go
// funzione che disegna tutta la clessidra,
// per ogni riga, il cono e l'aria o la sabbia,
// accetta altezza, secondi passati dallo start, char per la sabbia
// l'altezza sara` il numero di secondi totali
// e sara` l'altezza di ciascun "cono"
// usate (altezza * 2 + 1) come base per il "cono"
func clessidra(height int, time int, char byte)
```
e usate la funzione main per invocarla e testarla,
dapprima una sola volta e poi in un ciclo che disegna le
varie clessidre all'avanzare del tempo (una per secondo).
---
Per ultimare il progetto vi saranno utili queste due funzioni (potete copiarle così come sono):
```go
// Funzione che fa il clear dello schermo
// importare "os/exec"
func cancella() {
cmd := exec.Command("clear")
cmd.Stdout=os.Stdout
cmd.Run()
}
```
```go
// Funzione che attende
// time.Sleep(time.Duration(n_seconds) * time.Second)
// (o time.Millisecond, time.Nanosecond....)
func attendi(n_seconds float64){
time.Sleep(time.Duration(n_seconds) * time.Second)
}
```
Infatti la funzione main dovrà chiamare la funzione che disegna la clessidra in un ciclo temporizzato, cancellando lo schermo tra un disegno e l'altro.
nomefile: clessidra.go
## Progetto Black Jack
Riprendere l'esercizio "carte da gioco" appena fatto, dove una carta era una struct Carta con i campi valore (string) e seme (string) e salvatelo
come black_jack.go.
Man mano che implementate le funzioni richieste che seguono, aggiungete al main le istruzioni per testarle.
Definire la funzione `getValoreBJ` che, data una carta, restituisce il corrispondente valore per il Black Jack (le figure valgono 10, le altre carte valgono il loro valore nominale, l'asso vale 11 o 1, come volete)
Definire una funzione `mazzoPoker` che crea e restituisce un mazzo ordinato di 52 carte da poker (usare un array) (la prima carta del mazzo è l'asso di cuori, l'ultima è il re di picche).
Definire una funzione `mischia` che, dato un mazzo di carte, lo rimescola in modo random (senza crearne un altro).
Usare questa tecnica: percorrere l'array e scambiare ciascuna carta con una scelta di volta in volta a caso tra le carte tra se stessa e la fine del mazzo. Utilizzare lo scambio diretto:
```go
mazzo[i], mazzo[r] = mazzo[r], mazzo[i]
```
dove r è un numero opportunamente estratto a caso.
nomefile: black_jack.go
File added
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment