User Tools

Site Tools


pub:labprog:2020-11-19

# Note lezione (19/11/2020)

lezione precedente su wiki: https://sl-lab.it/dokuwiki/doku.php/pub:labprog:2020-11-12

wiki del lab: https://sl-lab.it/dokuwiki/doku.php/pub:labprog:home

link esercizi: https://forms.gle/vyNZJFHWCpb8RXjW9

link upload: https://upload.di.unimi.it/?id=2387

Attenzione a non sovrascrivere il testo esistente

## MEMO * scrivete tanto codice e fate saltar fuori gli errori * usate molto il prompt * non abbiate paura di fare domande (o scrivere commenti) * INDENTATE!!! (comando ```go fmt <nomeFile>```)

## FAQ ### Esercizio 1

La funzione ```rand.Intn(n int)``` ritorna un intero generato casualmente tra [0,n). Documentazione: https://golang.org/pkg/math/rand/ Nota (che non serve per questo esercizio in particolare): quando usate funzioni che devono generare qualcosa in modo pseudocasuale ricordatevi sempre di settare prima il seed: ``` rand.Seed(time.Now().UnixNano())``` Questa istruzione è necessaria, dal momento che se il seed non viene settato all'inizio, la sequenza di numeri generata sarà sempre la stessa ogni volta che lanciate il programma.

Ragionate sulla retta dei numeri per capire come modificare l'istruzione ```lancio := rand.Intn(7)``` per generare numeri nell'intervallo [1,6] invece che nell'intervallo [0,6]

In quali aspetti differiscono i due segmenti [0,6] e [1,6]? (Il secondo è più corto e inizia più a destra)

### Esercizio 2

Per la domanda “Di che tipo è la variabile data?” si intende quella nel main.

### Esercizio 3

Lo switch da riga 20 a 27 può e deve essere sostituito da una sola istruzione

Per stampare un ```%```: - con Printf scrivere ```fmt.Printf(“%%”)``` perché il primo argomento della printf è una STRINGA DI FORMATO che viene interpretata

Ecco cosa succede se non mettete entrambi i %: ```golang fmt.Printf(“print che fallisce a stampare il percentuale : %”) ``` ```shell ./prog.go:9:2: Printf format % is missing verb at end of string ``` Questo accade dato che dopo il ```%``` la printf si aspetta di dover interpretare qualcosa, ad esempio: ```fmt.Printf(“%d”, n)``` stampa un intero ```n```

- cont Println basta ```%```: ```fmt.Println(“%”)``` dal momento che nella println NON viene interpretato nulla

### Esercizio 4

L'esercizio non contiene errori. Una funzione eseguirà correttamente lo scambio, e l'altra no. Lo scopo dell'esercizio è farvi ragionare sul perchè una esegue lo scambio e l'altra fallisce.

### Esercizio 5

I significati dell'asterisco: - ``` n * m ``` con n e m numeri: è l'operatore per la moltiplicazione - altrimenti si riferisce a un puntatore

Contesti: ```golang package main

import “fmt”

la dicitura (x *int) significa che la funzione prende in input un puntatore ad un intero func StampaPuntatore(x *int) { fmt.Printf(“Valore del puntatore: %d\n”, *x) fmt.Printf(“Indirizzo di memoria di x: %x\n”, x) } func main() { x := 1 dichiaro un intero x

  StampaPuntatore(&x)  //passo come argomento l'indirizzo di memoria di x

} ``` Output: ``` Valore del puntatore: 1 Indirizzo di memoria di x: c000100010 ```

Proviamo ora a scrivere una funzione che modifica il valore di x:

```golang func modificaPuntatore(x *int, nuovoValore int){

  • x = nuovoValore assegno nuovoValore a ciò che punta x (a cui mi riferisco con *x) } ``` Per invocare la funzione: ```modificaPuntatore(&x, <nuovoValore>)``` Non sarebbe andato a buon fine il seguente tentativo: ```golang func modificaSbagliata(x int, nuovoValore int){ non prende in input un puntatore ma un int

x = nuovoValore }

func main() {

  x := 1		 //dichiaro un intero x
  modificaSbagliata(x,3) //non do in input un puntatore ma un int
  StampaPuntatore(&x)  //passo come argomento l'indirizzo di memoria di x

} ``` Output: ``` Valore del puntatore: 1 Indirizzo di memoria di x: c00002c008 ```

— La funzione ```newPunto``` deve restituire una variabile di tipo Punto avente come coordinate x e y passate in input alla funzione

Per modificare i campi di una struttura di cui abbiamo il puntatore:

```golang type Struttura struct{

  campo int

}

func modificaCampo(s *Struttura, n int) {

(*s).campo = n

}

func main() {

 s := Struttura{1}
 modificaCampo(&s, 2)
 fmt.Printf("%+v\n",s)  // %+v stampa una struttura con tutti i suoi campi

}

``` Output: ``` {campo:2} ``` — ### Esercizio CIFRE

Per verificare se una carattere è una cifra potete usare la funzione

```unicode.IsDigit(r Rune)```

Documentazione: https://golang.org/pkg/unicode/#IsDigit

Per ottenere l'int corrispondete a una runa c che rappresenta una cifra:

c - '0'

.

pub/labprog/2020-11-19.txt · Last modified: 2020/11/19 18:11 by atrent