Ripasso - Capire i puntatori
Fa parte della sezione Fondamenti del percorso GO di Coddy. Lezione 66 di 109.
Sfida
MedioIn questa sfida creerai un semplice sistema di gestione dell'inventario per un piccolo negozio. Userai i puntatori per aggiornare le quantità dell'inventario, calcolare i valori e tenere traccia delle modifiche.
Completa le tre funzioni seguenti:
-
updateQuantity(quantity *int, change int) (int, bool)
Modifica il valore a cui puntaquantityaggiungendochange(negativo per le vendite, positivo per i rifornimenti).
Se il risultato scenderebbe sotto0, imposta invece*quantitysu0.
Restituisci la nuova quantità e un booleano che ètruese l'articolo è ora esaurito (*quantity == 0). -
calculateValue(itemName string, quantity int, price float64, mostValuableItem *string, highestValue *float64) float64
CalcolatotalValuecomefloat64(quantity) * price.
SetotalValueè maggiore di*highestValue, aggiorna*highestValuee imposta*mostValuableItemsuitemNameusando i puntatori.
RestituiscitotalValue. -
displayInventory(apples, oranges, bananas *int, applePrice, orangePrice, bananaPrice float64)
Stampa il nome e la quantità di ogni articolo (dereferenziata dal suo puntatore) e il valore calcolato usandofmt.Printf.
Formato:Apples: 10 (Value: $5.00): usa%.2fper i prezzi.
L'output previsto per l'inventario iniziale è:
Initial Inventory: Apples: 10 (Value: $5.00) Oranges: 15 (Value: $10.50) Bananas: 8 (Value: $2.40) Total inventory value: $17.90 Most valuable item: Oranges
Suggerimento: Usa *quantity per leggere o scrivere il valore a cui punta un puntatore. Per esempio, *quantity += change modifica direttamente la variabile originale.
Provalo tu
package main
import "fmt"
// updateQuantity aggiorna la quantità di un articolo e restituisce la nuova quantità
// e indica se l'articolo è esaurito (quantity = 0)
func updateQuantity(quantity *int, change int) (int, bool) {
// TODO: Aggiornare il valore a cui punta quantity e restituire il nuovo valore e lo stato di esaurimento
return 0, false
}
// calculateValue calcola il valore totale di un articolo in base alla quantità e al prezzo
// Aggiorna anche mostValuableItem se questo articolo ha un valore maggiore
func calculateValue(itemName string, quantity int, price float64, mostValuableItem *string, highestValue *float64) float64 {
// TODO: Calcolare il valore totale, aggiornare mostValuableItem se necessario e restituire il valore totale
return 0.0
}
// displayInventory stampa i dettagli dell'inventario
// Accetta puntatori per consentire alla funzione di mostrare i dati aggiornati in tempo reale
func displayInventory(apples, oranges, bananas *int, applePrice, orangePrice, bananaPrice float64) {
fmt.Printf("Apples: %d (Value: $%.2f)\n", *apples, float64(*apples) * applePrice)
fmt.Printf("Oranges: %d (Value: $%.2f)\n", *oranges, float64(*oranges) * orangePrice)
fmt.Printf("Bananas: %d (Value: $%.2f)\n", *bananas, float64(*bananas) * bananaPrice)
}
func main() {
// Inizializza l'inventario
apples := 10
oranges := 15
bananas := 8
// Prezzi
applePrice := 0.5 // $0.50 ciascuna
orangePrice := 0.7 // $0.70 ciascuna
bananaPrice := 0.3 // $0.30 ciascuna
// Tieni traccia dell'articolo di maggior valore
var mostValuableItem string
var highestValue float64
// Mostra l'inventario iniziale
fmt.Println("Initial Inventory:")
displayInventory(&apples, &oranges, &bananas, applePrice, orangePrice, bananaPrice)
// Calcola i valori iniziali e trova l'articolo di maggior valore
appleValue := calculateValue("Apples", apples, applePrice, &mostValuableItem, &highestValue)
orangeValue := calculateValue("Oranges", oranges, orangePrice, &mostValuableItem, &highestValue)
bananaValue := calculateValue("Bananas", bananas, bananaPrice, &mostValuableItem, &highestValue)
fmt.Printf("Total inventory value: $%.2f\n", appleValue+orangeValue+bananaValue)
fmt.Printf("Most valuable item: %s\n\n", mostValuableItem)
// Simula alcune vendite
fmt.Println("Processing sales...")
_, applesOutOfStock := updateQuantity(&apples, -4) // Vendi 4 mele
_, orangesOutOfStock := updateQuantity(&oranges, -8) // Vendi 8 arance
_, bananasOutOfStock := updateQuantity(&bananas, -10) // Prova a vendere 10 banane (più di quelle disponibili)
// Controlla se qualche articolo è esaurito
if applesOutOfStock {
fmt.Println("Apples are out of stock!")
}
if orangesOutOfStock {
fmt.Println("Oranges are out of stock!")
}
if bananasOutOfStock {
fmt.Println("Bananas are out of stock!")
}
// Mostra l'inventario aggiornato
fmt.Println("\nUpdated Inventory:")
displayInventory(&apples, &oranges, &bananas, applePrice, orangePrice, bananaPrice)
// Azzera il monitoraggio dell'articolo di maggior valore per ricalcolarlo
mostValuableItem = ""
highestValue = 0
// Ricalcola i valori
appleValue = calculateValue("Apples", apples, applePrice, &mostValuableItem, &highestValue)
orangeValue = calculateValue("Oranges", oranges, orangePrice, &mostValuableItem, &highestValue)
bananaValue = calculateValue("Bananas", bananas, bananaPrice, &mostValuableItem, &highestValue)
fmt.Printf("Total inventory value: $%.2f\n", appleValue+orangeValue+bananaValue)
fmt.Printf("Most valuable item: %s\n\n", mostValuableItem)
// Riassortisci gli articoli
fmt.Println("Restocking...")
updateQuantity(&apples, 5) // Aggiungi 5 mele
updateQuantity(&oranges, 10) // Aggiungi 10 arance
updateQuantity(&bananas, 12) // Aggiungi 12 banane
// Mostra l'inventario finale
fmt.Println("\nFinal Inventory:")
displayInventory(&apples, &oranges, &bananas, applePrice, orangePrice, bananaPrice)
// Azzera il monitoraggio dell'articolo di maggior valore per il calcolo finale
mostValuableItem = ""
highestValue = 0
// Calcolo del valore finale
appleValue = calculateValue("Apples", apples, applePrice, &mostValuableItem, &highestValue)
orangeValue = calculateValue("Oranges", oranges, orangePrice, &mostValuableItem, &highestValue)
bananaValue = calculateValue("Bananas", bananas, bananaPrice, &mostValuableItem, &highestValue)
fmt.Printf("Total inventory value: $%.2f\n", appleValue+orangeValue+bananaValue)
fmt.Printf("Most valuable item: %s\n", mostValuableItem)
}Tutte le lezioni di Fondamenti
4Operatori di confronto e logici
Operatori di confronto - Parte 1Operatori di confronto - Parte 2Operatore AND logicoOperatore OR logicoOperatore NOT logicoNozioni di base sulla precedenza degli operatoriRiepilogo - Eseguire confronti7Flusso di controllo: cicli
Come funziona il ciclo `for`Ciclo `for` - baseCiclo `for` - solo condizioneLa parola chiave `break`La parola chiave `continue`Cicli annidatiRiepilogo - ripetere le azioni2Variabili e tipi di dati di base
Che cos'è una variabileInferenza del tipo con `:=`Numeri interi (int)Numeri in virgola mobileValori booleaniStringheValori zeroCostantiConvenzioni di denominazioneRiepilogo: variabili e tipi5Input/output di base
Output formattatoVerbi di formattazioneVisualizzazione dei tipiAcquisire input di base dall’utenteRiepilogo - Input e output8Funzioni
Capire le funzioniDichiarare una funzioneChiamare le funzioniParametri delle funzioniRestituire un singolo valoreRestituire più valoriValori restituiti con nomeFondamenti dell'ambito delle funzioniRiepilogo - Creare codice riutilizzabile3Operatori di base
Operatori aritmeticiOperatore di divisioneL'operatore moduloOperatore di assegnazioneOperatori di assegnazione compostaIncremento e decrementoRiepilogo - Calcoli6Flusso di controllo: condizioni
L'istruzione `if`La parola chiave `else`La parola chiave `else if`Ombreggiamento delle variabili in `if`Inizializzare le variabiliL'istruzione `switch``switch` con espressioni`switch` senza espressioneLa parola chiave `fallthrough`Riepilogo: prendere decisioni9Puntatori
Che cos’è un puntatore?Dichiarare variabili puntatoreL’operatore indirizzoDereferenziare i puntatoriUsare i puntatori nelle funzioniPuntatori nilRipasso - Capire i puntatori12Tipi compositi: mappe
Introduzione alle mappeDichiarare i letterali delle mappeCreare mappe con `make`Aggiungere e aggiornare coppie chiave-valoreAccedere ai valori delle mappeVerificare l'esistenza di una chiaveEliminare elementi dalle mappeLunghezza delle mappeIterare sulle mappeRiepilogo - Archiviazione chiave-valoreEsercitati da solo: Compilatore Go online