Juntando Tudo
Parte da seção Lógica & Fluxo do Journey de GO da Coddy — lição 25 de 68.
Desafio
FácilComplete 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 é:
- Usar a mesma struct
Productdas lições anteriores com os camposPrice(float64) eQuantity(int) - Analisar a primeira entrada e inicializar o mapa do inventário com os dados dos produtos existentes
- Exibir a mensagem de inicialização do sistema:
"=== INVENTORY MANAGEMENT SYSTEM ===""System initialized with [number_of_products] products""Starting interactive session..."
- Analisar a segunda entrada para obter a sequência de operações a serem executadas
- Analisar a terceira entrada para obter os parâmetros de cada operação
- 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
- Para
- Implementar a função
checkStockque retorna a quantidade e o erro como nas lições anteriores - Implementar a função
addNewItemque adiciona produtos e retorna erro como nas lições anteriores - Implementar a função
updateStockque atualiza quantidades e retorna erro como nas lições anteriores - Implementar a função
generateReportque cria relatórios como nas lições anteriores - 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"
- 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]"
- Analisar o parâmetro no formato
- 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]"
- Analisar o parâmetro no formato
- 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
- Analisar o parâmetro no formato
- 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"
- Exibir as estatísticas finais do inventário:
- 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
1Fluxo de Controle Avançado
Switch com `fallthrough`Interrompendo Loops AninhadosContinuando um Loop EspecíficoA Instrução `goto`Recapitulação - Controle de Loop Avançado4Projeto: Lista de Tarefas Simples
Configuração do ProjetoAdicionando uma Tarefa2Structs e Métodos
Definindo Métodos em StructsRecebedores de ValorRecebedores de PonteiroEscolhendo RecebedoresMétodos vs FunçõesRecapitulação - Comportamento de Structs5Mapas em Profundidade
Mapas de StructsPonteiros como Valores de MapVerificando Mapas NilComparando MapasRecapitulação - Contador de Frequência de Palavras3Interfaces (O Básico)
O que é uma Interface?Definindo uma InterfaceImplementando uma InterfaceUsando Tipos de InterfaceInterface VaziaAsserções de TipoType SwitchRecapitulação - Formas e Comportamentos