28 - Estructura de datos tipo structs - campos de tipo struct

En este concepto veremos que los campos de un registro (struct) pueden ser también de tipo registro, es decir anidar un registro dentro de otro registro.

Problema 1:

Se tienen las siguientes declaraciones de registros:

type Fecha struct {
    dia int
    mes int
    año int
}

type Producto struct {
   codigo int
   descripcion string
   precio float64
   fechavencimiento Fecha
}
En la función main definir una variable de tipo "Producto".
Implementar dos funciones una que permita cargar el registro definido en la main y otra que lo imprima.

Programa: ejercicio129.go

package main

import "fmt"

type Fecha struct {
    dia int
    mes int
    año int
}

type Producto struct {
   codigo int
   descripcion string
   precio float64
   fechavencimiento Fecha
}

func cargar(producto *Producto) {
    fmt.Print("Ingrese código:")
    fmt.Scan(&producto.codigo)
    fmt.Print("Descripción:")
    fmt.Scan(&producto.descripcion)
    fmt.Print("Ingrese el precio:")
    fmt.Scan(&producto.precio)
    fmt.Println("Ingrese fecha de vencimiento")
    fmt.Print("Dia:")
    fmt.Scan(&producto.fechavencimiento.dia)
    fmt.Print("Mes:")
    fmt.Scan(&producto.fechavencimiento.mes)
    fmt.Print("Año:")
    fmt.Scan(&producto.fechavencimiento.año)
}

func imprimir(producto Producto) {
    fmt.Print(producto)
}

func main() {
    var producto1 Producto
    cargar(&producto1)
    imprimir(producto1)
}

El struct Producto tiene 4 campos, el cuarto es fechavencimiento que es de tipo Fecha.

Ahora cuando debemos acceder al campo fecha vencimiento para su carga debemos indicar cada uno de los campos que tiene dicho struct:

    fmt.Print("Dia:")
    fmt.Scan(&producto.fechavencimiento.dia)
    fmt.Print("Mes:")
    fmt.Scan(&producto.fechavencimiento.mes)
    fmt.Print("Año:")
    fmt.Scan(&producto.fechavencimiento.año)

Utilizamos el operador punto para acceder a los campos del registro producto como los subcampos de fechavencimiento.

Problema propuesto

  • Se tienen las siguientes declaraciones de registros:
    type Punto struct {
        x int
        y int
    }
    
    type Triangulo struct {
        punto1 Punto
        punto2 Punto
        punto3 Punto
    }
    
    Definir en la main un registro de tipo Triangulo.
    Codificar las funciones:
    1-Una función que cargue un registro de tipo Triangulo.
    2-Impresión del registro.
Solución
ejercicio130.go

package main

import "fmt"

type Punto struct {
    x int
    y int
}

type Triangulo struct {
    punto1 Punto
    punto2 Punto
    punto3 Punto
}

func cargar(triangulo *Triangulo) {
    fmt.Print("Ingrese coordenada x primer punto:")
    fmt.Scan(&triangulo.punto1.x)
    fmt.Print("Ingrese coordenada y primer punto:")
    fmt.Scan(&triangulo.punto1.y)
    fmt.Print("Ingrese coordenada x segundo punto:")
    fmt.Scan(&triangulo.punto2.x)
    fmt.Print("Ingrese coordenada y segundo punto:")
    fmt.Scan(&triangulo.punto2.y)
    fmt.Print("Ingrese coordenada x tercer punto:")
    fmt.Scan(&triangulo.punto3.x)
    fmt.Print("Ingrese coordenada y tercer punto:")
    fmt.Scan(&triangulo.punto3.y)        
}

func imprimir(triangulo Triangulo) {
    fmt.Println("Los vértices del triángulo están ubicados en:")
    fmt.Println("(", triangulo.punto1.x, ",", triangulo.punto1.y, ")")
    fmt.Println("(", triangulo.punto2.x, ",", triangulo.punto2.y, ")")
    fmt.Println("(", triangulo.punto3.x, ",", triangulo.punto3.y, ")")        
}

func main() {
    var triangulo1 Triangulo
    cargar(&triangulo1)
    imprimir(triangulo1)
}