Récapitulatif - Comprendre les pointeurs
Fait partie de la section Fondamentaux du Journey GO de Coddy — leçon 66 sur 109.
Défi
MoyenDans ce défi, vous allez construire un système simple de gestion d'inventaire pour un petit magasin. Vous utiliserez des pointeurs pour mettre à jour les quantités en stock, calculer les valeurs et suivre les changements.
Complétez les trois fonctions ci-dessous :
-
updateQuantity(quantity *int, change int) (int, bool)
Modifiez la valeur à l'adressequantityen ajoutantchange(négatif pour les ventes, positif pour les réapprovisionnements).
Si le résultat est inférieur à0, fixez*quantityà0à la place.
Retournez la nouvelle quantité et un booléen qui vauttruesi l'article est maintenant en rupture de stock (*quantity == 0). -
calculateValue(itemName string, quantity int, price float64, mostValuableItem *string, highestValue *float64) float64
CalculeztotalValuecommefloat64(quantity) * price.
SitotalValueest supérieur à*highestValue, mettez à jour*highestValueet définissez*mostValuableItemavecitemNameen utilisant les pointeurs.
RetourneztotalValue. -
displayInventory(apples, oranges, bananas *int, applePrice, orangePrice, bananaPrice float64)
Affichez le nom de chaque article, sa quantité (déréférencée de son pointeur) et sa valeur calculée en utilisantfmt.Printf.
Format :Apples: 10 (Value: $5.00)— utilisez%.2fpour les prix.
La sortie attendue pour l'inventaire initial est :
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
Conseil : Utilisez *quantity pour lire ou écrire la valeur vers laquelle pointe un pointeur. Par exemple, *quantity += change modifie directement la variable d'origine.
Essayez vous-même
package main
import "fmt"
// updateQuantity met à jour la quantité d'un article et retourne la nouvelle quantité
// et si l'article est en rupture de stock (quantité = 0)
func updateQuantity(quantity *int, change int) (int, bool) {
// TODO: Mettre à jour le pointeur de quantité et retourner la nouvelle valeur et le statut de rupture de stock
return 0, false
}
// calculateValue calcule la valeur totale d'un article en fonction de la quantité et du prix
// Elle met également à jour mostValuableItem si cet article a plus de valeur
func calculateValue(itemName string, quantity int, price float64, mostValuableItem *string, highestValue *float64) float64 {
// TODO: Calculer la valeur totale, mettre à jour mostValuableItem si nécessaire, et retourner la valeur totale
return 0.0
}
// displayInventory affiche les détails de l'inventaire
// Elle utilise des pointeurs pour permettre à la fonction d'afficher des données en temps réel
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() {
// Initialiser l'inventaire
apples := 10
oranges := 15
bananas := 8
// Prix
applePrice := 0.5 // 0,50 $ chacun
orangePrice := 0.7 // 0,70 $ chacun
bananaPrice := 0.3 // 0,30 $ chacun
// Suivre l'article ayant le plus de valeur
var mostValuableItem string
var highestValue float64
// Afficher l'inventaire initial
fmt.Println("Initial Inventory:")
displayInventory(&apples, &oranges, &bananas, applePrice, orangePrice, bananaPrice)
// Calculer les valeurs initiales et trouver l'article ayant le plus de valeur
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)
// Simuler quelques ventes
fmt.Println("Processing sales...")
_, applesOutOfStock := updateQuantity(&apples, -4) // Vendre 4 pommes
_, orangesOutOfStock := updateQuantity(&oranges, -8) // Vendre 8 oranges
_, bananasOutOfStock := updateQuantity(&bananas, -10) // Essayer de vendre 10 bananes (plus que ce que nous avons)
// Vérifier si des articles sont en rupture de stock
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!")
}
// Afficher l'inventaire mis à jour
fmt.Println("\nUpdated Inventory:")
displayInventory(&apples, &oranges, &bananas, applePrice, orangePrice, bananaPrice)
// Réinitialiser le suivi de l'article le plus précieux pour le recalcul
mostValuableItem = ""
highestValue = 0
// Recalculer les valeurs
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)
// Réapprovisionner les articles
fmt.Println("Restocking...")
updateQuantity(&apples, 5) // Ajouter 5 pommes
updateQuantity(&oranges, 10) // Ajouter 10 oranges
updateQuantity(&bananas, 12) // Ajouter 12 bananes
// Afficher l'inventaire final
fmt.Println("\nFinal Inventory:")
displayInventory(&apples, &oranges, &bananas, applePrice, orangePrice, bananaPrice)
// Réinitialiser le suivi de l'article le plus précieux pour le calcul final
mostValuableItem = ""
highestValue = 0
// Calcul de la valeur 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)
}Toutes les leçons de Fondamentaux
4Opérateurs de comparaison et logiques
Opérateurs de comparaison - Partie 1Opérateurs de comparaison - Partie 2Opérateur logique ANDOpérateur logique OROpérateur logique NOTBases de la priorité des opérateursRécapitulatif - Effectuer des comparaisons7Structures de contrôle : Les boucles
Explication de la boucle `for`Boucle For - Les basesBoucle For - Condition uniquementLe mot-clé `break`Le mot-clé `continue`Boucles imbriquéesRécapitulatif - Répéter des actions2Variables et types de données de base
Qu'est-ce qu'une variableInférence de type avec `:=` Entiers (int)Nombres à virgule flottanteBooléensChaînes de caractères (Strings)Valeurs zéroConstantesConventions de nommageRécapitulatif - Variables et types5Entrées/Sorties de base
Sortie formatéeVerbes de formatageAffichage des typesSaisie utilisateur de baseRécapitulatif - Entrées et Sorties8Fonctions
Comprendre les fonctionsDéclarer une fonctionAppeler des fonctionsParamètres de fonctionRetourner une valeur uniqueRetourner plusieurs valeursValeurs de retour nomméesBases de la portée des fonctionsRécapitulatif - Créer du code réutilisable11Types composites : Slices
Introduction aux SlicesDéclaration de littéraux de SlicesCréation de Slices avec `make`Longueur vs Capacité des SlicesAccès aux éléments d'un SliceAjout d'élémentsDécoupage de Slices/Tableaux existantsItération sur les SlicesCopie de SlicesRécapitulatif - Listes dynamiques3Opérateurs de base
Opérateurs arithmétiquesOpérateur de divisionL'opérateur moduloOpérateur d'affectationOpérateurs d'affectation augmentéeIncrémentation et décrémentationRécapitulatif - Calculs6Structure de contrôle : Les conditionnelles
L'instruction `if`Le mot-clé `else`Le mot-clé `else if`Masquage de variable dans `if`Initialisation des variablesL'instruction `switch``switch` avec expressions`switch` sans expressionLe mot-clé `fallthrough`Récapitulatif - Prendre des décisions9Pointeurs
Qu'est-ce qu'un pointeur ?Déclaration de variables pointeursL'opérateur d'adresseDéréférencement de pointeursUtiliser des pointeurs dans les fonctionsPointeurs NilRécapitulatif - Comprendre les pointeurs12Types composites : Maps
Introduction aux MapsDéclaration de littéraux de MapCréation de Maps avec `make`Ajout et mise à jour de paires clé-valeurAccès aux valeurs d'une MapVérification de l'existence d'une cléSuppression d'entrées de MapTaille d'une MapItération sur les MapsRécapitulatif - Stockage clé-valeur