User Tools

Site Tools


pub:labprog:2020-11-12

# Note lezione (12/11/2020)

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)

## Argomenti

* switch * funzioni

## TODO

## Esercizi e note

### `break` con label Voglio interrompere il for superiore direttamente dallo switch. Se scrivessi `break` nello switch uscirebbe lo switch, invece con la label posso rompere il for superiore da lì. E dovrebbe funzionare con tutto. Molto bello

```go Loop:

  for {
      switch qualcosa {
      case 1:
         // ...
      case 2:
        // ...
      case 3:
        break Loop
      }
  }

```

### ```Scanf``` rattoppata

```go package main import “fmt”

func main() {

  
  var r rune;
  
  for{
      fmt.Println("Inserire carattere")
      fmt.Scanf("%c\n", &r) //in questo modo catturo l'invio
      fmt.Printf("Carattere inserito: %c\n", r)
      
  }

} ```

### Variabili di ritorno nelle funzioni

Caso: variabili nominate ```golang func funz()(valore_restituito string){

  valore_restituito = "ciao"
  return

} ```

Caso: non nominate ```golang func funz()(string){

  valore_restituito := "ciao"
  return valore_restituito

} ```

### dal form delle esercitazioni

### Es. 1

(da uno studente)

``` go package main

import (

"fmt"
"unicode"

)

func main() {

var ordineFinale string = "hai ordinato"
const MENU = "menu del giorno:\n" +
	"a. pizza\n" +
	"b. penne al pomodoro\n" +
	"c. cotoletta e patatine\n" +
	"d. crostata e caffè"
fmt.Println(MENU)
fmt.Println("ordinazione? schiacciare f e dare l'invio per terminare l'ordinazione")
var scelta rune
for scelta != 'f' {
	fmt.Scanf("%c", &scelta)
      
      // sarebbe più pulito con un unico switch?
	if unicode.IsSpace(scelta) {
		continue  // dove va? salta il resto di QUESTA iterazione
	} else if scelta == 'f' {
		break
	} else if 'a' <= scelta && scelta <= 'd' {
		var ordinazione string
		switch scelta {
		case 'a':
			ordinazione = "pizza"
		case 'b':
			ordinazione = "penne al pomodoro"
		case 'c':
			ordinazione = "cotoletta e patatine"
		case 'd':
			ordinazione = "crostata e caffè"
		}
		ordineFinale += ", " + ordinazione
	} else {
		fmt.Println(string(scelta), "non è valido e non è stato considerato")
	}
}
if ordineFinale == "hai ordinato" {
	fmt.Println("Non hai ordinato nulla")
} else {
	fmt.Println(ordineFinale)
}

} ```

### Es.2

```go /* * Scrivi una funzione operazioni(n1, n2 int) (int, int, int) che * accetta due interi e restituisce somma, prodotto e differenza. * Scrivine una versione con variabili di ritorno nominate e una senza. * Scrivi un main per invocare e testare la funzione. * Il programma legge da standard input due int. */ package main

import “fmt”

func main() {

fmt.Println(operazioni(4, 5)) // primo test "hardcoded"

}

è giusto mettere la funzione qui? func operazioni(n1, n2 int) (int, int, int) { somma := n1 + n2 prodotto := n1 * n2 differenza := n1 - n2 return somma, prodotto, differenza } ``` ### Es. 3 ```go /* Vogliamo scrivere una funzione giorniInMese(mese int) int che, dato come parametro il numero corrispondente a un mese, restituisce il numero di giorni di quel mese (28 per febbraio). */ ``` ## Es. 5 (da uno studente) ```go package main import ( “fmt” ) func findVowel(s string) { for _, c := range s { if isVowel© { fmt.Println(string©) return } } fmt.Println(“la parola non contiene vocali”) meglio non stampare da dentro una funzione, salvo esplicitamente richiesto dale specifiche }

func isVowel(c rune) bool {

  switch c {
      case 'a', 'e', 'i', 'o', 'u': return true
      default: return false
  }

}

func main() {

  const K = 5
  var parola string
  for i := 0; i < K; i++ {
      fmt.Scan(&parola)
      findVowel(parola)
  }

} ```

pub/labprog/2020-11-12.txt · Last modified: 2020/11/12 17:46 by atrent