Menu
Coddy logo textTech

Verificando o Estoque

Parte da seção Lógica & Fluxo do Journey de GO da Coddy — lição 46 de 68.

challenge icon

Desafio

Fácil

Implemente uma função de verificação de estoque para o seu sistema de gerenciamento de inventário que recupere com segurança as quantidades de produtos e trate casos em que os produtos não existem. Este desafio baseia-se na base de inventário da lição anterior e adiciona tratamento de erros para consultas de estoque.

Você receberá duas entradas:

  • Uma string contendo dados de inventário existentes no formato "product1:price1:quantity1,product2:price2:quantity2,product3:price3:quantity3" (ex: "Laptop:999.99:5,Mouse:25.50:15,Keyboard:75.00:8")
  • Uma string contendo solicitações de verificação de estoque no formato "product1,product2,product3" (ex: "Mouse,Tablet,Keyboard")

Sua tarefa é:

  1. Usar a mesma struct Product da lição anterior com os campos Price (float64) e Quantity (int)
  2. Analisar a primeira entrada dividindo-a por vírgulas para obter as entradas individuais de produtos
  3. Para cada entrada de produto, dividir por dois-pontos para obter o nome do produto, preço e quantidade
  4. Converter a string de preço para float64 e a string de quantidade para int
  5. Criar e preencher o mapa inventory com os dados de produtos analisados
  6. Criar uma função chamada checkStock que recebe o mapa de inventário e um nome de produto como parâmetros e retorna (int, error):
    • Se o produto existir no inventário, retornar sua quantidade e nil
    • Se o produto não existir, retornar 0 e um erro com a mensagem "product not found: [product_name]"
  7. Analisar a segunda entrada dividindo-a por vírgulas para obter a lista de produtos a serem verificados
  8. Exibir o cabeçalho de verificação de estoque: "Stock Check Results:"
  9. Para cada produto na lista de verificação, chamar a função checkStock e exibir os resultados:
    • Se não houver erro: "[product_name]: [quantity] units in stock"
    • Se houver erro: "[product_name]: Error - [error_message]"
  10. Contar e exibir estatísticas de resumo:
    • "Check Summary:"
    • "Products checked: [total_number_of_products_checked]"
    • "Products found: [number_of_products_that_exist]"
    • "Products not found: [number_of_products_that_dont_exist]"
  11. Exibir o estoque total para os produtos encontrados:
    • "Total stock for found products: [sum_of_quantities_for_existing_products] units"
  12. Listar quaisquer produtos ausentes:
    • Se houver produtos ausentes: "Missing products: [comma_separated_list_of_missing_products]"
    • Se não houver produtos ausentes: "All requested products are available"

Use o pacote strings para dividir as strings de entrada, o pacote strconv para converter strings em números, o pacote errors para criar mensagens de erro e o pacote fmt para saída formatada. Este desafio demonstra como implementar a recuperação segura de dados com o tratamento de erros adequado, um padrão fundamental em sistemas de gerenciamento de inventário.

Experimente você mesmo

package main

import (
	"bufio"
	"fmt"
	"os"
	"sort"
	"strconv"
	"strings"
)

// Define the Product struct
type Product struct {
	Price    float64
	Quantity int
}

func main() {
	// Read input using bufio.Scanner to handle spaces properly
	scanner := bufio.NewScanner(os.Stdin)
	
	scanner.Scan()
	storeInfo := scanner.Text()
	
	scanner.Scan()
	productData := scanner.Text()
	
	// 1. Parse store information (split by comma)
	storeInfoParts := strings.Split(storeInfo, ",")
	storeName := ""
	location := ""
	if len(storeInfoParts) >= 2 {
		storeName = storeInfoParts[0]
		location = storeInfoParts[1]
	}
	
	// 2. Parse product data (split by comma, then by colon for each product)
	productEntries := strings.Split(productData, ",")
	
	// 3. Create inventory map
	inventory := make(map[string]Product)
	
	// 4. Convert strings to appropriate types and populate inventory
	for _, entry := range productEntries {
		parts := strings.Split(entry, ":")
		if len(parts) >= 3 {
			productName := parts[0]
			price, _ := strconv.ParseFloat(parts[1], 64)
			quantity, _ := strconv.Atoi(parts[2])
			
			inventory[productName] = Product{
				Price:    price,
				Quantity: quantity,
			}
		}
	}
	
	// 5. Display store information
	fmt.Printf("=== %s Inventory System ===\n", storeName)
	fmt.Printf("Location: %s\n", location)
	fmt.Printf("Inventory initialized with %d products\n", len(inventory))
	
	// 6. Display current inventory (sorted alphabetically)
	fmt.Println("Current Inventory:")
	var productNames []string
	for name := range inventory {
		productNames = append(productNames, name)
	}
	sort.Strings(productNames)
	
	for _, name := range productNames {
		product := inventory[name]
		fmt.Printf("- %s: $%.2f (Stock: %d)\n", name, product.Price, product.Quantity)
	}
	
	// 7. Calculate and display inventory statistics
	totalProducts := len(inventory)
	totalItems := 0
	totalValue := 0.0
	
	for _, product := range inventory {
		totalItems += product.Quantity
		totalValue += product.Price * float64(product.Quantity)
	}
	
	fmt.Println("Inventory Statistics:")
	fmt.Printf("Total Products: %d\n", totalProducts)
	fmt.Printf("Total Items in Stock: %d\n", totalItems)
	fmt.Printf("Total Inventory Value: $%.2f\n", totalValue)
	
	// 8. Display system status
	fmt.Println("System Status: Ready")
	fmt.Println("Inventory management system initialized successfully")
}

Todas as lições de Lógica & Fluxo