Algo muy interesante que estamos viendo en los últimos conceptos es que podemos definir elementos de un array que sean también estructuras de datos. En general veremos que podemos anidar una estructura de datos dentro de otra estructura de datos.
Hemos dicho que un maps consta de claves y valores para esas claves. Desarrollaremos problemas donde los valores para esas claves sean structs.
Confeccionar un programa que permita cargar un código de producto como clave en un map. Guardar para dicha clave el nombre del producto, su precio y cantidad en stock (definir un struct para estos valores)
Implementar las siguientes actividades:
1) Carga de datos en el maps.
2) Listado completo de productos.
3) Consulta de un producto por su clave, mostrar el nombre, precio y stock.
4) Listado de todos los productos que tengan un stock con valor cero.
package main import "fmt" type Producto struct { descripcion string precio float64 stock int } func cargar(productos map[int]Producto) { var codigo int var opcion string var pro Producto for { fmt.Print("Ingrese el codigo del producto:") fmt.Scan(&codigo) fmt.Print("Ingrese la descripcion:") fmt.Scan(&pro.descripcion) fmt.Print("Ingrese el precio:") fmt.Scan(&pro.precio) fmt.Print("Ingrese el stock actual:") fmt.Scan(&pro.stock) productos[codigo] = pro fmt.Print("Desea cargar otro producto[s/n]?") fmt.Scan(&opcion) if opcion == "n" { break; } } } func imprimir(productos map[int]Producto) { fmt.Println("Listado completo") for codigo, producto := range productos { fmt.Println("Código:", codigo) fmt.Println("Descripcion:", producto.descripcion) fmt.Println("Precio:", producto.precio) fmt.Println("Stock:", producto.stock) fmt.Println("-----------------------") } } func consulta(productos map[int]Producto) { var codigo int fmt.Print("Ingrese el código de artículo a consultar:") fmt.Scan(&codigo) producto, existe := productos[codigo] if existe { fmt.Println("Descripcion:", producto.descripcion) fmt.Println("Precio:", producto.precio) fmt.Println("Stock:", producto.stock) } else { fmt.Println("No existe") } } func stockCero(productos map[int]Producto) { fmt.Println("Listado de articulos con stock en cero:") for codigo, producto := range productos { if producto.stock == 0 { fmt.Println("Código:", codigo, " Datos:", producto) } } } func main() { productos := make(map[int]Producto) cargar(productos) imprimir(productos) consulta(productos) stockCero(productos) }
En la función main creamos un map cuya clave es un int y su valor es un struct de tipo "Producto:"
func main() { productos := make(map[int]Producto) cargar(productos) imprimir(productos) consulta(productos) stockCero(productos) }
La función de cargar recibe el map. Cargamos por teclado un entero que representa el código de producto y un struct de tipo "Producto". Almacenamos en el map el registro cargado por teclado:
func cargar(productos map[int]Producto) { var codigo int var opcion string var pro Producto for { fmt.Print("Ingrese el codigo del producto:") fmt.Scan(&codigo) fmt.Print("Ingrese la descripcion:") fmt.Scan(&pro.descripcion) fmt.Print("Ingrese el precio:") fmt.Scan(&pro.precio) fmt.Print("Ingrese el stock actual:") fmt.Scan(&pro.stock) productos[codigo] = pro fmt.Print("Desea cargar otro producto[s/n]?") fmt.Scan(&opcion) if opcion == "n" { break; } } }
El listado completo lo hacemos mediante un for range:
func imprimir(productos map[int]Producto) { fmt.Println("Listado completo") for codigo, producto := range productos { fmt.Println("Código:", codigo) fmt.Println("Descripcion:", producto.descripcion) fmt.Println("Precio:", producto.precio) fmt.Println("Stock:", producto.stock) fmt.Println("-----------------------") } }
Para la consulta ingresamos un código de producto y si existe pasamos a mostrar todos los datos de ese producto en particular:
func consulta(productos map[int]Producto) { var codigo int fmt.Print("Ingrese el código de artículo a consultar:") fmt.Scan(&codigo) producto, existe := productos[codigo] if existe { fmt.Println("Descripcion:", producto.descripcion) fmt.Println("Precio:", producto.precio) fmt.Println("Stock:", producto.stock) } else { fmt.Println("No existe") } }
El listado de productos con stock en cero es similar al listado completo pero en este caso lo mostramos solo si el stock es cero:
func stockCero(productos map[int]Producto) { fmt.Println("Listado de articulos con stock en cero:") for codigo, producto := range productos { if producto.stock == 0 { fmt.Println("Código:", codigo, " Datos:", producto) } } }
ejercicio134.go package main import "fmt" type Colegio struct { nombre string nromesa int } func cargar(personas map[int]Colegio) { var dni int var opcion string var colegio Colegio for { fmt.Print("Ingrese el dni del votante:") fmt.Scan(&dni) fmt.Print("Ingrese el nombre del colegio donde vota:") fmt.Scan(&colegio.nombre) fmt.Print("Ingrese número de mesa:") fmt.Scan(&colegio.nromesa) personas[dni] = colegio fmt.Print("Desea cargar otro votante[s/n]?") fmt.Scan(&opcion) if opcion == "n" { break; } } } func listar(personas map[int]Colegio) { fmt.Println("Listado completo de votantes") for dni, colegio := range personas { fmt.Println("Dni:", dni) fmt.Println("Nombre del colegio:", colegio.nombre) fmt.Println("Número de mesa:", colegio.nromesa) fmt.Println("-----------------------") } } func consultaMesa(personas map[int]Colegio) { var dni int fmt.Print("Ingrese el dni a consultar:") fmt.Scan(&dni) colegio, existe := personas[dni] if existe { fmt.Println("Nombre del colegio:", colegio.nombre) fmt.Println("Número de mesa:", colegio.nromesa) } else { fmt.Println("No existe") } } func main() { personas := make(map[int]Colegio) cargar(personas) listar(personas) consultaMesa(personas) }