Menu
Coddy logo textTech

Adicionando um Novo Item

Parte da seção Lógica & Fluxo do Journey de GO da Coddy. Lição 47 de 68.

challenge icon

Desafio

Fácil

Amplie seu sistema de gerenciamento de estoque implementando uma funcionalidade para adicionar novos produtos com segurança. Este desafio se baseia no sistema anterior de verificação de estoque e adiciona a capacidade de expandir seu estoque, evitando entradas duplicadas por meio de um tratamento adequado de erros.

Você receberá duas entradas:

  • Uma string contendo os dados do estoque existente no formato "product1:price1:quantity1,product2:price2:quantity2,product3:price3:quantity3" (por exemplo, "Laptop:999.99:5,Mouse:25.50:15,Keyboard:75.00:8")
  • Uma string contendo os novos produtos a serem adicionados no formato "product1:price1:quantity1,product2:price2:quantity2,product3:price3:quantity3" (por exemplo, "Monitor:299.99:10,Mouse:19.99:20,Webcam:89.99:12")

Sua tarefa é:

  1. Usar a mesma struct Product das lições anteriores, com os campos Price (float64) e Quantity (int)
  2. Analisar a primeira entrada dividindo-a por vírgulas para obter as entradas individuais dos produtos existentes
  3. Para cada entrada de produto existente, dividi-la por dois-pontos para obter o nome, o preço e a quantidade do produto
  4. Converter a string do preço para float64 e a string da quantidade para int
  5. Criar e preencher o mapa inventory com os dados dos produtos existentes
  6. Criar uma função chamada addNewItem que receba o mapa de estoque, o nome do produto, o preço e a quantidade como parâmetros e retorne um erro:
    • Se o produto já existir no estoque, retornar um erro com a mensagem "product already exists: [product_name]"
    • Se o produto não existir, adicioná-lo ao estoque e retornar nil
  7. Analisar a segunda entrada dividindo-a por vírgulas para obter a lista de novos produtos a serem adicionados
  8. Para cada nova entrada de produto, dividi-la por dois-pontos para obter o nome, o preço e a quantidade do produto
  9. Converter a string do preço para float64 e a string da quantidade para int
  10. Exibir o cabeçalho do processo de adição: "Adding New Items:"
  11. Para cada novo produto, chamar a função addNewItem e exibir os resultados:
    • Se não houver erro: "[product_name]: Successfully added - $[price] (Stock: [quantity])"
    • Se houver erro: "[product_name]: Failed to add - [error_message]"
  12. Contar e exibir as estatísticas de adição:
    • "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. Exibir o estoque atualizado em ordem alfabética por nome do produto:
    • "Updated Inventory:"
    • Para cada produto: "- [product_name]: $[price] (Stock: [quantity])"
  14. Calcular e exibir as estatísticas finais do estoque:
    • "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. Listar todos os produtos rejeitados:
    • Se houver produtos rejeitados: "Rejected products: [comma_separated_list_of_rejected_products]"
    • Se não houver produtos rejeitados: "All new products were added successfully"

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, o pacote fmt para a saída formatada e o pacote sort para ordenar os nomes dos produtos alfabeticamente. Formate todos os preços com 2 casas decimais e o valor total do estoque com 2 casas decimais. Este desafio demonstra como ampliar coleções de dados com segurança, evitando entradas duplicadas por meio de um tratamento adequado de erros e validação.

Experimente você mesmo

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")
	}
}

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

Pratique por conta própria: Compilador de Go online