- Molte volte nel testo dell'esercizio si specificano dei vincoli sull'input. Occorre verificarne sempre la veridicità. Nel caso in cui l'input inserito non rispetti il vincolo, stampare un messaggio di errore e chiederne il reinserimento, fino a quando non viene fornito un input valido. Ad esempio, se il programma *pippo.go* attende in input un numero pari, un possibile scenario potrebbe essere il seguente:
```console
$./pippo
Inserire un numero n pari:
3
Numero non valido
Inserire un numero n pari:
5
Numero non valido
Inserire un numero n pari:
2
```
## Esercizio 1 (contare righe)
Creare programma che conta le righe di testo che vengono immesse a stdin. (ispirazione 'wc')
```
scanner := bufio.NewScanner(os.Stdin)
for scanner.Scan() {
line = scanner.Text()
}
```
Una prima soluzione:
```
packagemain
import(
"fmt"
"bufio"
"os"
)
funcmain(){
varlineaint
scanner:=bufio.NewScanner(os.Stdin)
forscanner.Scan(){
//programmatorescaltro1.0
//_=scanner.Text()
//programmatoreflussodicoscienza
//line:=scanner.Text()
//_=line
linea++
}
fmt.Println("hai inserito",linea,"righe")
}
```
### Variazione sul tema
Modificare il programma precedente in modo che stampi le righe precedute dal loro numero progressivo.
## Esercizio 2 (trasformare caratteri)
Creare programma che trasforma i caratteri dell'input, ad esempio da minuscole a maiuscole. (ispirazione 'tr')
//pernientecopiatodall'esempio della documentazione:
// (ma forse ora compreso)
scanner.Split(bufio.ScanWords)
count := 0
for scanner.Scan() {
count++
}
fmt.Println(count)
}
```
## Esercizio 4 (contare cose)
Creare programma che conta le parole in un testo che viene immesso a stdin, ma solo quelle che iniziano per vocale. (ispirazione 'grep' e 'wc')
Prima soluzione:
```
packagemain
import(
"bufio"
"fmt"
"os"
)
funcmain(){
scanner:=bufio.NewScanner(os.Stdin)
scanner.Split(bufio.ScanWords)
count:=0
forscanner.Scan(){
x:=scanner.Text()
switchstring(x[0]){
case"a","e","i","o","u":
count++
}
}
fmt.Println(count)
}
```
Seconda soluzione:
```
packagemain
import(
"bufio"
"fmt"
"os"
"strings"
)
funcmain(){
scanner:=bufio.NewScanner(os.Stdin)
//pernientecopiatodall'esempio della documentazione:
scanner.Split(bufio.ScanWords)
count := 0
voc := "aeiou"
for scanner.Scan() {
if strings.IndexAny(strings.ToLower(scanner.Text()), voc) == 0 {
count++
}
}
fmt.Println(count)
}
```
## Esercizio 5 (misurare cose)
Creare programma che misura la distanza media/min/max tra le 'a' successive in un testo che viene immesso a stdin.
#### Nota sull'esercizio sottostante
Al posto di inserire il valore *min* in modo esplicito, è più comodo utilizzare una costante presa direttamente dalla libreria (https://golang.org/pkg/math/) che indichi tale valore. Nello specifico, in questo caso la costante è MaxInt32 (oppure MaxInt64, dipende)