Poniéndolo todo junto
Parte de la sección Lógica y Flujo del Journey de GO de Coddy — lección 25 de 68.
Desafío
FácilCompleta tu sistema de gestión de inventario creando un programa principal integral que integre toda la funcionalidad que has construido en las lecciones anteriores. Este desafío final reúne la inicialización del inventario, la verificación de existencias, la adición de artículos, las actualizaciones de existencias y la generación de informes en una interfaz de línea de comandos completa con navegación basada en menús.
Recibirás tres entradas:
- Una cadena que contiene los datos iniciales del inventario en el formato
"product1:price1:quantity1,product2:price2:quantity2,product3:price3:quantity3"(por ejemplo,"Laptop:999.99:5,Mouse:25.50:15,Keyboard:75.00:8") - Una cadena que contiene una secuencia de operaciones de menú en el formato
"operation1,operation2,operation3"donde las operaciones pueden ser"check","add","update","report", o"exit"(por ejemplo,"check,add,update,report,exit") - Una cadena que contiene los parámetros de la operación en el formato
"param1|param2|param3"donde cada parámetro corresponde a la operación en la misma posición (por ejemplo,"Mouse|Monitor:299.99:10|Laptop:5|full,10")
Tu tarea es:
- Utilizar el mismo struct
Productde las lecciones anteriores con los camposPrice(float64) yQuantity(int) - Analizar la primera entrada e inicializar el mapa de inventario con los datos de productos existentes
- Mostrar el mensaje de inicio del sistema:
"=== INVENTORY MANAGEMENT SYSTEM ===""System initialized with [number_of_products] products""Starting interactive session..."
- Analizar la segunda entrada para obtener la secuencia de operaciones a realizar
- Analizar la tercera entrada para obtener los parámetros de cada operación
- Para cada operación en secuencia, mostrar el encabezado de la operación y realizar la acción correspondiente:
- Para
"check": Mostrar"--- STOCK CHECK ---"y verificar las existencias del producto especificado - Para
"add": Mostrar"--- ADD ITEM ---"y añadir el producto especificado - Para
"update": Mostrar"--- UPDATE STOCK ---"y actualizar las existencias del producto especificado - Para
"report": Mostrar"--- GENERATE REPORT ---"y generar el informe especificado - Para
"exit": Mostrar"--- SYSTEM EXIT ---"y mostrar la información de salida
- Para
- Implementar la función
checkStockque devuelve la cantidad y un error como en las lecciones anteriores - Implementar la función
addNewItemque añade productos y devuelve un error como en las lecciones anteriores - Implementar la función
updateStockque actualiza las cantidades y devuelve un error como en las lecciones anteriores - Implementar la función
generateReportque crea informes como en las lecciones anteriores - Para la operación
"check":- Usar el parámetro como el nombre del producto a verificar
- Mostrar:
"Checking stock for: [product_name]" - Si se encuentra:
"Stock level: [quantity] units" - Si no se encuentra:
"Product not found in inventory"
- Para la operación
"add":- Analizar el parámetro en formato
"product_name:price:quantity" - Mostrar:
"Adding new product: [product_name]" - Si tiene éxito:
"Product added successfully" - Si falla:
"Failed to add product: [error_message]"
- Analizar el parámetro en formato
- Para la operación
"update":- Analizar el parámetro en formato
"product_name:change" - Mostrar:
"Updating stock for: [product_name]" - Si tiene éxito y el cambio es positivo:
"Added [change] units. New stock: [new_quantity]" - Si tiene éxito y el cambio es negativo:
"Removed [absolute_change] units. New stock: [new_quantity]" - Si falla:
"Update failed: [error_message]"
- Analizar el parámetro en formato
- Para la operación
"report":- Analizar el parámetro en formato
"report_type,threshold" - Mostrar:
"Generating [report_type] report with threshold [threshold]" - Generar y mostrar el informe completo como en las lecciones anteriores
- Analizar el parámetro en formato
- Para la operación
"exit":- Mostrar las estadísticas finales del inventario:
"Final inventory status:""Total products: [total_products]""Total items: [total_items]""Total value: $[total_value]"
- Mostrar:
"Session completed successfully" - Mostrar:
"Thank you for using the Inventory Management System"
- Mostrar las estadísticas finales del inventario:
- Después de cada operación (excepto exit), mostrar:
"Operation completed. Continuing to next operation..."
Utiliza el paquete strings para dividir las cadenas de entrada, el paquete strconv para convertir cadenas a números, el paquete errors para el manejo de errores, el paquete fmt para la salida formateada y el paquete sort para el ordenamiento alfabético. Formatea todos los precios y valores a 2 decimales. Este desafío demuestra cómo crear un sistema interactivo completo que integra múltiples componentes funcionales en una experiencia de usuario cohesiva con un manejo adecuado de errores y gestión de estado.
Pruébalo tú mismo
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 las lecciones de Lógica y Flujo
1Flujo de control avanzado
Switch con `fallthrough`Salir de bucles anidadosContinuar un bucle específicoLa sentencia `goto`Repaso: Control de bucles avanzado4Proyecto: Lista de tareas sencilla
Configuración del proyectoAñadir una tarea2Estructuras y Métodos
Definición de métodos en estructurasReceptores de valorReceptores de punteroElegir receptoresMétodos vs FuncionesResumen - Comportamiento de estructuras5Mapas en profundidad
Mapas de StructsPunteros como valores de MapVerificación de Maps NilComparación de MapsResumen - Contador de frecuencia de palabras3Interfaces (Conceptos básicos)
¿Qué es una interfaz?Definir una interfazImplementar una interfazUso de tipos de interfazInterfaz vacíaAserciones de tipoType SwitchResumen: Formas y comportamientos