User Tools

Site Tools


pub:labprog:2020-11-19

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

pub:labprog:2020-11-19 [2020/11/19 18:11] (current)
atrent created
Line 1: Line 1:
 +#  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