30 - Estructura de datos tipo maps - valor de tipo struct

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.

Problema 1:

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.

Programa: ejercicio133.go

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)
        }
    }
}

Problema propuesto

  • Se desea almacenar los datos de personas que votan en una elección. Definir un map cuya clave sea el número de documento de la persona. Como valor almacenar una struct con el nombre del colegio y número de mesa donde vota.
    Crear las siguientes funciones:
    1) Carga de las personan y lugares donde votan.
    2) Listado de todos los votantes
    3) Consulta de la mesa y colegio ingresando el número de documento.
Solución
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)
}