Menu
Coddy logo textTech

Einen neuen Artikel hinzufügen

Teil des Abschnitts Logik & Ablauf der GO-Journey von Coddy. Lektion 47 von 68.

challenge icon

Aufgabe

Einfach

Erweitere dein Bestandsverwaltungssystem, indem du eine Funktion zum sicheren Hinzufügen neuer Produkte implementierst. Diese Herausforderung baut auf dem vorherigen System zur Bestandsprüfung auf und ergänzt die Möglichkeit, deinen Bestand zu erweitern und dabei durch eine geeignete Fehlerbehandlung doppelte Einträge zu verhindern.

Du erhältst zwei Eingaben:

  • Eine Zeichenkette mit den vorhandenen Bestandsdaten im Format "product1:price1:quantity1,product2:price2:quantity2,product3:price3:quantity3" (z. B. "Laptop:999.99:5,Mouse:25.50:15,Keyboard:75.00:8")
  • Eine Zeichenkette mit den hinzuzufügenden neuen Produkten im Format "product1:price1:quantity1,product2:price2:quantity2,product3:price3:quantity3" (z. B. "Monitor:299.99:10,Mouse:19.99:20,Webcam:89.99:12")

Deine Aufgabe ist es:

  1. Dieselbe Product-Struktur wie in den vorherigen Lektionen mit den Feldern Price (float64) und Quantity (int) zu verwenden
  2. Die erste Eingabe durch Aufteilen an Kommas zu verarbeiten, um einzelne vorhandene Produkteinträge zu erhalten
  3. Für jeden vorhandenen Produkteintrag an Doppelpunkten aufzuteilen, um Produktname, Preis und Menge zu erhalten
  4. Die Preiszeichenkette in float64 und die Mengenzeichenkette in int umzuwandeln
  5. Die Map inventory zu erstellen und mit den vorhandenen Produktdaten zu befüllen
  6. Eine Funktion namens addNewItem zu erstellen, die die Bestands-Map, den Produktnamen, den Preis und die Menge als Parameter übernimmt und einen Fehler zurückgibt:
    • Wenn das Produkt bereits im Bestand vorhanden ist, einen Fehler mit der Nachricht "product already exists: [product_name]" zurückzugeben
    • Wenn das Produkt nicht vorhanden ist, es zum Bestand hinzuzufügen und nil zurückzugeben
  7. Die zweite Eingabe durch Aufteilen an Kommas zu verarbeiten, um die Liste der hinzuzufügenden neuen Produkte zu erhalten
  8. Für jeden neuen Produkteintrag an Doppelpunkten aufzuteilen, um Produktname, Preis und Menge zu erhalten
  9. Die Preiszeichenkette in float64 und die Mengenzeichenkette in int umzuwandeln
  10. Die Überschrift für den Hinzufügevorgang anzuzeigen: "Adding New Items:"
  11. Für jedes neue Produkt die Funktion addNewItem aufzurufen und die Ergebnisse anzuzeigen:
    • Wenn kein Fehler auftritt: "[product_name]: Successfully added - $[price] (Stock: [quantity])"
    • Wenn ein Fehler auftritt: "[product_name]: Failed to add - [error_message]"
  12. Die Hinzufügestatistiken zu zählen und anzuzeigen:
    • "Addition Summary:"
    • "Items processed: [total_number_of_items_processed]"
    • "Items added: [number_of_items_successfully_added]"
    • "Items rejected: [number_of_items_that_failed_to_add]"
  13. Den aktualisierten Bestand alphabetisch nach Produktname anzuzeigen:
    • "Updated Inventory:"
    • Für jedes Produkt: "- [product_name]: $[price] (Stock: [quantity])"
  14. Die abschließenden Bestandsstatistiken zu berechnen und anzuzeigen:
    • "Final Inventory Statistics:"
    • "Total Products: [total_number_of_products_in_inventory]"
    • "Total Items in Stock: [sum_of_all_quantities]"
    • "Total Inventory Value: $[sum_of_price_times_quantity_for_all_products]"
  15. Alle abgelehnten Produkte aufzulisten:
    • Wenn es abgelehnte Produkte gibt: "Rejected products: [comma_separated_list_of_rejected_products]"
    • Wenn es keine abgelehnten Produkte gibt: "All new products were added successfully"

Verwende das Paket strings, um die Eingabezeichenketten aufzuteilen, das Paket strconv, um Zeichenketten in Zahlen umzuwandeln, das Paket errors, um Fehlermeldungen zu erstellen, das Paket fmt für formatierte Ausgaben und das Paket sort, um die Produktnamen alphabetisch zu sortieren. Formatiere alle Preise mit 2 Dezimalstellen und den Gesamtwert des Bestands ebenfalls mit 2 Dezimalstellen. Diese Herausforderung zeigt, wie sich Datensammlungen sicher erweitern lassen, während durch geeignete Fehlerbehandlung und Validierung doppelte Einträge verhindert werden.

Probier es selbst

package main

import (
	"errors"
	"fmt"
	"strconv"
	"strings"
)

type Product struct {
	Price    float64
	Quantity int
}

func checkStock(inventory map[string]Product, productName string) (int, error) {
	product, exists := inventory[productName]
	if !exists {
		return 0, errors.New("product not found: " + productName)
	}
	return product.Quantity, nil
}

func main() {
	var inventoryData string
	var checkRequests string
	fmt.Scanln(&inventoryData)
	fmt.Scanln(&checkRequests)

	inventory := make(map[string]Product)

	// Parse inventory data
	productEntries := strings.Split(inventoryData, ",")
	for _, entry := range productEntries {
		parts := strings.Split(entry, ":")
		name := parts[0]
		price, _ := strconv.ParseFloat(parts[1], 64)
		quantity, _ := strconv.Atoi(parts[2])
		inventory[name] = Product{Price: price, Quantity: quantity}
	}

	// Parse check requests
	productsToCheck := strings.Split(checkRequests, ",")

	fmt.Println("Stock Check Results:")

	var productsFound int
	var productsNotFound int
	var totalStock int
	var missingProducts []string

	for _, productName := range productsToCheck {
		quantity, err := checkStock(inventory, productName)
		if err != nil {
			fmt.Printf("%s: Error - %s\n", productName, err.Error())
			productsNotFound++
			missingProducts = append(missingProducts, productName)
		} else {
			fmt.Printf("%s: %d units in stock\n", productName, quantity)
			productsFound++
			totalStock += quantity
		}
	}

	fmt.Println("Check Summary:")
	fmt.Printf("Products checked: %d\n", len(productsToCheck))
	fmt.Printf("Products found: %d\n", productsFound)
	fmt.Printf("Products not found: %d\n", productsNotFound)
	fmt.Printf("Total stock for found products: %d units\n", totalStock)

	if len(missingProducts) > 0 {
		fmt.Printf("Missing products: %s\n", strings.Join(missingProducts, ","))
	} else {
		fmt.Println("All requested products are available")
	}
}

Alle Lektionen in Logik & Ablauf

Übe selbstständig: Online-Go-Compiler