29 - Estructura de datos tipo array - componentes de tipo struct

Hemos trabajado bastante con la estructura de datos tipo array (vectores y matrices) definiendo componentes de tipo int, float64, string etc.

Ahora veremos que podemos definir vectores cuyos elementos sean de tipo struct.

Problema 1:

Se tiene la siguiente declaración de registro:

type Producto struct {
    codigo int
    descripcion string
    precio float64
}
Definir un vector de 4 elementos de tipo Producto.

Implementar las funciones:

  • Carga del vector.
  • Impresión del vector.
  • Mostrar el nombre del articulo con precio mayor.

Programa: ejercicio131.go

package main

import "fmt"

type Producto struct {
    codigo int
    descripcion string
    precio float64
}

func cargar(productos *[4]Producto) {
    for f := 0; f < len(productos); f++ {
        fmt.Print("Ingrese el codigo del producto:")
        fmt.Scan(&productos[f].codigo)
        fmt.Print("Ingrese la descripción:")
        fmt.Scan(&productos[f].descripcion)
        fmt.Print("Ingrese el precio:")
        fmt.Scan(&productos[f].precio)
    }
}

func imprimir(productos [4]Producto) {
    fmt.Println("Listado completo de productos.")
    for f := 0; f < len(productos); f++ {
        fmt.Println("Código:", productos[f].codigo)
        fmt.Println("Descripción:", productos[f].descripcion)
        fmt.Println("Precio:", productos[f].precio)    
    }
}

func precioMayor(productos [4]Producto) {
    pos := 0
    for f :=1; f < len(productos); f++ {
        if productos[f].precio > productos[pos].precio {
            pos = f
        }
    }
    fmt.Println("Producto mas caro:",productos[pos].descripcion)
}


func main() {
    var productos [4]Producto
    cargar(&productos)
    imprimir(productos)
    precioMayor(productos)
}

En la función main definimos un vector de cuatro elementos de tipo "Producto", llamamos a las distintas funciones y le pasamos el vector para cargarlo, imprimirlo y ver el producto más caro:

func main() {
    var productos [4]Producto
    cargar(&productos)
    imprimir(productos)
    precioMayor(productos)
}

Como la función cargar necesita modificar la variable definida en la main lo que le pasamos es la dirección de la variable, por lo tanto la función cargar recibe un puntero:

func cargar(productos *[4]Producto) {

Cuando accedemos ahora al vector debemos indicar el nombre del vector, el subíndice que queremos acceder y finalmente a que campo del registro de dicha componente:

    for f := 0; f < len(productos); f++ {
        fmt.Print("Ingrese el codigo del producto:")
        fmt.Scan(&productos[f].codigo)
        fmt.Print("Ingrese la descripción:")
        fmt.Scan(&productos[f].descripcion)
        fmt.Print("Ingrese el precio:")
        fmt.Scan(&productos[f].precio)
    }

Para obtener el nombre del producto con mayor precio procedemos a inicializar la variable pos con el valor cero suponiendo que en dicha posición se encuentra el artículo con mayor precio. Luego en cada vuelta del for verificamos el precio del artículo si supera al que hemos considerado mayor hasta ese momento, en caso afirmativo actualizamos la variable pos:

func precioMayor(productos [4]Producto) {
    pos := 0
    for f :=1; f < len(productos); f++ {
        if productos[f].precio > productos[pos].precio {
            pos = f
        }
    }
    fmt.Println("Producto mas caro:",productos[pos].descripcion)
}

Problema propuesto

  • Se tiene la siguiente declaración de registro:
    type Libro struct{
        codigo int
        titulo string
        autor string
    }
    
    Definir un vector de cuatro elementos de tipo Libro.
    Codificar las funciones:
    1-Carga del vector.
    2-Listado completo.
    3-Ingresar por teclado un nombre de autor y luego mostrar todos los títulos de libros que ha escrito o un mensaje si no tiene.
Solución
ejercicio132.go

package main

import "fmt"

type Libro struct{
    codigo int
    titulo string
    autor string
}

func cargar(libros *[4]Libro) {
    for f := 0; f < len(libros); f++ {
        fmt.Print("Ingrese el código:")
        fmt.Scan(&libros[f].codigo)
        fmt.Print("Ingrese el título:")
        fmt.Scan(&libros[f].titulo)
        fmt.Print("Ingrese el autor:")
        fmt.Scan(&libros[f].autor)        
    }
}

func imprimir(libros [4]Libro) {
    fmt.Println(libros)
}

func consulta(libros [4]Libro) {
    var autor string
    var existe bool
    existe = false
    fmt.Print("Ingrese el nombre del autor a consultar:")
    fmt.Scan(&autor)
    for f := 0; f < len(libros); f++ {
        if autor == libros[f].autor {
            fmt.Println("Titulo: ", libros[f].titulo)
            existe = true
        }
    }
    if existe == false {
        fmt.Println("No hay libros de este autor.")
    }
}

func main() {
    var libros [4]Libro
    cargar(&libros)
    imprimir(libros)
    consulta(libros)
}