Vi propongo un esercizio schematico in GO, con qualche confronto in C++, per capire l’uso dei vettori e annesse funzionalità. Ecco il testo dell’esercizio, suddiviso in 10 possibili punti, un po’ a simulare il punteggio scolastico raggiungibile.
- Impostare la dimensione massima del vettore come costante pari a 25
- acquisire la dimensione effettiva del vettore da caricare
- caricare il vettore (usare per il nome del vettore il proprio cognome, es: rossi [MAX])
- stampare il vettore
- invertire gli elementi del vettore
- stampare il vettore
- calcolare e stampare il numero di partecipanti più alto
- calcolare e stampare il totale dei partecipanti
- calcolare e stampare il numero di concerti con numero di partecipanti inferiori al valore medio
- calcolare e stampare il numero di concerti con numero di partecipanti superiore o uguale al valore medio
Soluzione in GO
Passaggio di parametri con array è piuttosto interessante in GO. La dimensione dell’array gioca un ruolo fondamentale poiché GO ha una tipizzazione tale da richiedere come parametro un vettore della stessa identica dimensione di quello passato. Questa è una pratica scomoda che richiederebbe una variabile globale o una strategia predeterminata. Possiamo invece utilizzare l’operatore slice : che in realtà altro non nasconde che il concetto del passare un puntatore ad un array come argomento, non la struttura array stessa. Se il C++ usa questa tecnica implicitamente, GO chiede al programmatore di essere perfettamente consapevole del passaggio.
GO => carica(centinaro[:], n) vs C++ carica(centinaro, n);
Interessante rispetto al C/C++ l’uso necessario del cast esplicito float/int. Nella media infatti abbiamo un rapporto tra due interi che ci aspettiamo frazionario. In GO i due interi devono essere passati a float con un cast esplicito e preventivo all’assegnazione finale. Qui abbiamo fatto il cast di ogni elemento del vettore, si poteva scegliere di farlo una tantum fuori dal ciclo sulla variabile somma complessiva. Stessa cosa: GO non consente il confronto diretto intero/decimale.
func media(vettore []int, n int) float64 {
somma := 0.0
for i := 0; i < n; i++ {
somma += float64(vettore[i])
}
media := somma / float64(n)
return media
}
Non abbiamo usato altre tecniche particolari se non l’assegnazione diretta con l’operatore :=. Fate sempre attenzione alle parentesi graffe come sono aperte e alle variabili non utilizzate che, sembra noioso, ma sono elementi di non compilabilità.
Listato completo
package main
import "fmt"
func carica(vettore []int, n int) {
for i := 0; i < n; i++ {
fmt.Println("Inserisci elemento ")
fmt.Scanln(&vettore[i])
}
}
func stampa(vettore []int, n int) {
for i := 0; i < n; i++ {
fmt.Print(vettore[i], " ")
}
fmt.Println("\n")
}
func invertire(vettore []int, n int) {
j := n - 1
for i := 0; i < n; i++ {
tmp := vettore[i]
vettore[i] = vettore[j]
vettore[j] = tmp
}
}
func max(vettore []int, n int) int {
max := 0
for i := 0; i < n; i++ {
if max < vettore[i] {
max = vettore[i]
}
}
return max
}
func somma(vettore []int, n int) int {
somma := 0
for i := 0; i < n; i++ {
somma += vettore[i]
}
return somma
}
func media(vettore []int, n int) float64 {
somma := 0.0
for i := 0; i < n; i++ {
somma += float64(vettore[i])
}
media := somma / float64(n)
return media
}
func quantiMaggiori(vettore []int, n int, avg float64) int {
conta := 0
for i := 0; i < n; i++ {
if float64(vettore[i]) >= avg {
conta++
}
}
return conta
}
func quantiMinori(vettore []int, n int, avg float64) int {
conta := 0
for i := 0; i < n; i++ {
if float64(vettore[i]) < avg {
conta++
}
}
return conta
}
func main() {
const MAX = 25
var n int
var centinaro [MAX]int //Punto 1.
//Punto 2.
fmt.Println("Inserisci la lunghezza del vettore da inserire")
fmt.Scanln(&n)
carica(centinaro[:], n) //Punto 3.
fmt.Println("Vettore originale: ")
stampa(centinaro[:], n) //Punto 4.
invertire(centinaro[:], n) //Punto 5.
fmt.Println("Vettore invertito: ") //Punto 6.
stampa(centinaro[:], n)
max := max(centinaro[:], n) //Punto 7.
fmt.Println("Il valore massimo è: ", max)
somma := somma(centinaro[:], n) //Punto 8.
fmt.Println("La somma dei partecipanti è: ", somma)
media := media(centinaro[:], n)
fmt.Println("La media dei partecipanti è: ", media)
minori := quantiMinori(centinaro[:], n, media)
fmt.Println("I valori dei partecipanti minori della media sono #", minori)
maggiori := quantiMaggiori(centinaro[:], n, media)
fmt.Println("I valori dei partecipanti maggiori della media sono #", maggiori)
}
Ultima modifica 25 Maggio 2023