Esercizio: Conta massimo
Si vuole scrivere un programma che legga una sequenza di 10 interi positivi e stampi il massimo intero letto e quante volte il massimo compare nella sequenza.
Per individuare il massimo intero usiamo il piano per la ricerca del valore estremo, usando il primo numero in input per inizializzare la variabile max fuori dal ciclo. Per calcolare quante volte questo valore compare nella sequenza usiamo il piano per il conteggio. I due piani sono mostrati in questi frammenti di codice:
fmt.Scan(&numero)
max := numero
for i := 1; i < 10; i++ {
fmt.Scan(&numero)
if numero > max {
max = numero
}
}count := 0
for i := 0; i < 10; i++ {
fmt.Scan(&numero)
if numero == n {
count++
}
}Come già visto per altri casi, non è possibile combinare questi piani mettendoli semplicemente uno dopo l’altro (a meno di salvare inutilmente tutti i dati in input), perché il piano per la ricerca del massimo “consumerebbe” i numeri letti prima dell’inizio del piano di conteggio.
È possibile invece fondere i due piani in un unico ciclo. Tuttavia in questa fusione di piani è necessario prestare attenzione ad alcuni aspetti critici, che dipendono dalla relazione che lega i due goal del problema.
- Il valore
ncon cui confrontarenumeronel piano del conteggio è proprio il valore corrente dimax, che cambia durante l’esecuzione. - Il ciclo del piano per la ricerca del valore estremo è più breve di quello del piano del conteggio, perché il primo numero è usato per inizializzare la variabile
maxe quindi viene letto prima del ciclo; usando questo ciclo breve per la fusione dei piani, è necessario inizializzare diversamente anche la variabilecount. - La variabile
countva re-inizializzata anche ogni volta che si trova un massimo migliore, cioè ogni volta che si aggiorna la variabilemaxnel piano per la ricerca del massimo.
Completate il programma seguente inserendo, nell’ordine corretto, le istruzioni che trovate in fondo.
package main
import "fmt"
func main() {
var numero, i int
fmt.Scan(&numero)
max := numero
...
fmt.Println(max)
fmt.Println(count)
}}
if numero == max {
for i := 1; i<10; i++ {
count++
max = numero
count = 1
count := 1
fmt.Scan(&numero)
} else if numero > max {
}