Menu
Coddy logo textTech

Juntando Tudo

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

challenge icon

Desafio

Fácil

Complete seu sistema de gerenciamento de inventário criando um programa principal abrangente que integre todas as funcionalidades que você construiu nas lições anteriores. Este desafio final reúne a inicialização do inventário, verificação de estoque, adição de itens, atualizações de estoque e geração de relatórios em uma interface de linha de comando completa com navegação orientada por menu.

Você receberá três entradas:

  • Uma string contendo os dados iniciais do inventário 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 uma sequência de operações de menu no formato "operation1,operation2,operation3" onde as operações podem ser "check", "add", "update", "report", ou "exit" (ex: "check,add,update,report,exit")
  • Uma string contendo os parâmetros da operação no formato "param1|param2|param3" onde cada parâmetro corresponde à operação na mesma posição (ex: "Mouse|Monitor:299.99:10|Laptop:5|full,10")

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 e inicializar o mapa do inventário com os dados dos produtos existentes
  3. Exibir a mensagem de inicialização do sistema:
    • "=== INVENTORY MANAGEMENT SYSTEM ==="
    • "System initialized with [number_of_products] products"
    • "Starting interactive session..."
  4. Analisar a segunda entrada para obter a sequência de operações a serem executadas
  5. Analisar a terceira entrada para obter os parâmetros de cada operação
  6. Para cada operação na sequência, exibir o cabeçalho da operação e realizar a ação correspondente:
    • Para "check": Exibir "--- STOCK CHECK ---" e verificar o estoque do produto especificado
    • Para "add": Exibir "--- ADD ITEM ---" e adicionar o produto especificado
    • Para "update": Exibir "--- UPDATE STOCK ---" e atualizar o estoque do produto especificado
    • Para "report": Exibir "--- GENERATE REPORT ---" e gerar o relatório especificado
    • Para "exit": Exibir "--- SYSTEM EXIT ---" e mostrar as informações de saída
  7. Implementar a função checkStock que retorna a quantidade e o erro como nas lições anteriores
  8. Implementar a função addNewItem que adiciona produtos e retorna erro como nas lições anteriores
  9. Implementar a função updateStock que atualiza quantidades e retorna erro como nas lições anteriores
  10. Implementar a função generateReport que cria relatórios como nas lições anteriores
  11. Para a operação "check":
    • Usar o parâmetro como o nome do produto a ser verificado
    • Exibir: "Checking stock for: [product_name]"
    • Se encontrado: "Stock level: [quantity] units"
    • Se não encontrado: "Product not found in inventory"
  12. Para a operação "add":
    • Analisar o parâmetro no formato "product_name:price:quantity"
    • Exibir: "Adding new product: [product_name]"
    • Se bem-sucedido: "Product added successfully"
    • Se falhar: "Failed to add product: [error_message]"
  13. Para a operação "update":
    • Analisar o parâmetro no formato "product_name:change"
    • Exibir: "Updating stock for: [product_name]"
    • Se bem-sucedido e a alteração for positiva: "Added [change] units. New stock: [new_quantity]"
    • Se bem-sucedido e a alteração for negativa: "Removed [absolute_change] units. New stock: [new_quantity]"
    • Se falhar: "Update failed: [error_message]"
  14. Para a operação "report":
    • Analisar o parâmetro no formato "report_type,threshold"
    • Exibir: "Generating [report_type] report with threshold [threshold]"
    • Gerar e exibir o relatório completo como nas lições anteriores
  15. Para a operação "exit":
    • Exibir as estatísticas finais do inventário:
      • "Final inventory status:"
      • "Total products: [total_products]"
      • "Total items: [total_items]"
      • "Total value: $[total_value]"
    • Exibir: "Session completed successfully"
    • Exibir: "Thank you for using the Inventory Management System"
  16. Após cada operação (exceto exit), exibir: "Operation completed. Continuing to next operation..."

Use o pacote strings para dividir as strings de entrada, o pacote strconv para converter strings em números, o pacote errors para tratamento de erros, o pacote fmt para saída formatada e o pacote sort para ordenação alfabética. Formate todos os preços e valores com 2 casas decimais. Este desafio demonstra como criar um sistema interativo completo que integra múltiplos componentes funcionais em uma experiência de usuário coesa com tratamento de erros e gerenciamento de estado adequados.

Experimente você mesmo

package main

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

type Task struct {
	Name      string
	Completed bool
}

func removeTask(tasks []Task, index int) []Task {
	return append(tasks[:index], tasks[index+1:]...)
}

func main() {
	// Read input using bufio.Scanner to handle spaces properly
	scanner := bufio.NewScanner(os.Stdin)
	
	scanner.Scan()
	_ = scanner.Text() // Read but don't use the number of tasks
	
	scanner.Scan()
	taskData := scanner.Text()
	
	scanner.Scan()
	indexStr := scanner.Text()
	
	// Parse task data
	taskEntries := strings.Split(taskData, ",")
	var tasks []Task
	
	for _, entry := range taskEntries {
		parts := strings.Split(entry, ":")
		if len(parts) >= 2 {
			name := parts[0]
			status := parts[1] == "true"
			tasks = append(tasks, Task{Name: name, Completed: status})
		}
	}
	
	// Convert index string to integer
	index, _ := strconv.Atoi(indexStr)
	
	// Store the name of the task to be removed
	removedTaskName := tasks[index].Name
	
	// Remove the task
	tasks = removeTask(tasks, index)
	
	// Display remaining tasks
	completedCount := 0
	for _, task := range tasks {
		if task.Completed {
			fmt.Printf("[x] %s\n", task.Name)
			completedCount++
		} else {
			fmt.Printf("[ ] %s\n", task.Name)
		}
	}
	
	// Print confirmation message
	fmt.Printf("Task '%s' removed successfully!\n", removedTaskName)
	
	// Print summary
	totalCount := len(tasks)
	incompleteCount := totalCount - completedCount
	fmt.Printf("Total: %d tasks (%d completed, %d remaining)\n", totalCount, completedCount, incompleteCount)
}

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