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
CC Attribution-Share Alike 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0