Uniendo todo
Parte de la sección Logic & Flow del Journey de Rust de Coddy — lección 53 de 66.
Desafío
FácilRecibirás seis entradas. La primera entrada es un comando que puede ser add, check o sell. La segunda entrada es el nombre de un artículo. La tercera entrada es un número que representa la cantidad a vender (para el comando sell) o el precio inicial (para el comando add). La cuarta entrada es una lista de nombres de artículos en el inventario separados por comas. La quinta entrada es una lista de precios correspondientes a cada artículo separados por comas. La sexta entrada es una lista de cantidades correspondientes a cada artículo separados por comas.
Construye un sistema de gestión de inventario completo que maneje las tres operaciones: añadir artículos, verificar existencias y vender artículos. Usa un HashMap para almacenar los datos del inventario donde la clave es el nombre del artículo y el valor es una tupla que contiene el precio y la cantidad (f64, i32).
Requisitos:
- Importar
HashMapdestd::collections - Leer la primera entrada (comando) y eliminar los espacios en blanco
- Leer la segunda entrada (nombre del artículo) y eliminar los espacios en blanco
- Leer la tercera entrada (valor de cantidad/precio) y eliminar los espacios en blanco
- Convertir la tercera entrada a
f64 - Leer la cuarta entrada (nombres de artículos separados por comas) y eliminar los espacios en blanco
- Leer la quinta entrada (precios separados por comas) y eliminar los espacios en blanco
- Leer la sexta entrada (cantidades separadas por comas) y eliminar los espacios en blanco
- Crear un
HashMap<String, (f64, i32)>mutable para el inventario - Dividir los nombres de los artículos por comas
- Dividir los precios por comas y convertir cada uno a
f64 - Dividir las cantidades por comas y convertir cada una a
i32 - Insertar cada artículo en el inventario con su precio y cantidad correspondientes como una tupla
- Usar una expresión
matchen el comando para determinar qué operación realizar - Para el comando
add:- Usar
.entry()y.or_insert()para añadir el artículo si no existe, usando la tercera entrada como el precio y0como la cantidad inicial - Imprimir:
Added [item_name] to inventory - Imprimir:
Price: $[price] - Imprimir:
Quantity: 0
- Usar
- Para el comando
check:- Usar
.get()para verificar si el artículo existe - Usar una expresión
matchpara manejar elOption - Si es
Some, imprimir:[item_name] is in stockPrice: $[price]Quantity: [quantity]
- Si es
None, imprimir:[item_name] is not in stock
- Usar
- Para el comando
sell:- Convertir la tercera entrada a
i32como la cantidad a vender - Usar
.get()para verificar si el artículo existe - Usar una expresión
matchpara manejar elOption - Si es
Some:- Verificar si la cantidad actual es suficiente
- Si es así, actualizar el inventario con la nueva cantidad e imprimir:
Sold [quantity_to_sell] [item_name]Total: $[total_price]Remaining stock: [new_quantity]
- Si no, imprimir:
Insufficient stock for [item_name]Available: [current_quantity]
- Si es
None, imprimir:[item_name] is not in stock
- Convertir la tercera entrada a
- Para cualquier otro comando, imprimir:
Invalid command
Entrada:
- Primera línea: Comando (
add,checkosell) - Segunda línea: Nombre del artículo (por ejemplo,
Tablet) - Tercera línea: Número (precio para
add, cantidad parasell, ignorado paracheck) - Cuarta línea: Nombres de artículos separados por comas (por ejemplo,
Laptop,Mouse,Keyboard) - Quinta línea: Precios separados por comas (por ejemplo,
999.99,25.50,75.00) - Sexta línea: Cantidades separadas por comas (por ejemplo,
15,50,30)
Salida:
- Para el comando
add:Added [item_name] to inventoryPrice: $[price]Quantity: 0
- Para el comando
check(el artículo existe):[item_name] is in stockPrice: $[price]Quantity: [quantity]
- Para el comando
check(el artículo no existe):[item_name] is not in stock - Para el comando
sell(existencias suficientes):Sold [quantity_to_sell] [item_name]Total: $[total_price]Remaining stock: [new_quantity]
- Para el comando
sell(existencias insuficientes):Insufficient stock for [item_name]Available: [current_quantity]
- Para el comando
sell(el artículo no existe):[item_name] is not in stock - Para un comando no válido:
Invalid command
Pruébalo tú mismo
use std::collections::HashMap;
use std::io;
fn main() {
// Leer entradas
let mut command = String::new();
io::stdin().read_line(&mut command).expect("Failed to read line");
let command = command.trim();
let mut item_name = String::new();
io::stdin().read_line(&mut item_name).expect("Failed to read line");
let item_name = item_name.trim();
let mut value_input = String::new();
io::stdin().read_line(&mut value_input).expect("Failed to read line");
let value_input = value_input.trim();
let mut items_input = String::new();
io::stdin().read_line(&mut items_input).expect("Failed to read line");
let items_input = items_input.trim();
let mut prices_input = String::new();
io::stdin().read_line(&mut prices_input).expect("Failed to read line");
let prices_input = prices_input.trim();
let mut quantities_input = String::new();
io::stdin().read_line(&mut quantities_input).expect("Failed to read line");
let quantities_input = quantities_input.trim();
// Crear el HashMap del inventario
let mut inventory: HashMap<String, (f64, i32)> = HashMap::new();
// TODO: Escribe tu código a continuación
// Analizar las entradas separadas por comas y poblar el inventario
// Usar una expresión match en command para manejar las operaciones add, check y sell
// Recuerda imprimir los mensajes apropiados según el comando
}Todas las lecciones de Logic & Flow
1Flujo de control avanzado
La expresión 'match'Coincidencia de múltiples valoresCoincidencia de rangosLa expresión 'if let'Bucles como expresionesResumen - Analizador de comandos simple4Agrupando datos con Structs
¿Qué es un Struct?Visión general de los StructsAcceso a los campos de un StructStructs mutablesStructs como parámetros de funcionesStructs de tuplaResumen - Crear un Struct de Libro7Manejo de errores con 'Result'
¿Qué es un 'Result'?Uso de 'match' con 'Result'is_ok() e is_err()Atajos: unwrap y expectEl operador de signo de interrogación '?'Parsing de Strings a númerosResumen - Función de división segura10Closures y funciones anónimas
¿Qué es un Closure?Definir un Closure simpleClosures con parámetrosCapturar el entornoResumen - Closure sumador simple2Introducción a los vectores
¿Qué es un vector?Crear un vectorAñadir elementos con pushAcceder a los elementos de un vectorIterar sobre un vectorIteración mutableEliminar elementosResumen: Rastreador de puntuación básico5Pares clave-valor con Hash Maps
¿Qué es un Hash Map?Crear un Hash MapInsertar pares clave-valorAcceder a los valoresIterar sobre un Hash MapActualizar un valorEliminar un parRepaso: Contador de palabras8Proyecto: Inventario simple de artículos
Configuración del proyectoAgregar un artículoVerificar el stockVender un artículoUniendo todo3Lista de tareas en la línea de comandos
Configuración del proyectoAñadir una tareaVer todas las tareasEliminar una tareaCódigo final