Introducción a C#
Por Nacho Cabanes, versión 0.93 de 16-abr-2010


(Nota: Estás viendo una versión del curso antigua, creada en 2009. Es recomendable que sigas la versión 2015, mucho más actualizada, con contenidos más detallados, más ejemplos y más ejercicios propuestos)

4.3. Estructuras o registros

4.3.1. Definición y acceso a los datos

Un registro es una agrupación de datos, los cuales no necesariamente son del mismo tipo. Se definen con la palabra "struct". La serie de datos que van a formar

En C# (al contrario que en C), primero deberemos declarar cual va a ser la estructura de nuestro registro, lo que no se puede hacer dentro de "Main". Más adelante, ya dentro de "Main", podremos declarar variables de ese nuevo tipo.

Los datos que forman un "struct" pueden ser públicos o privados. Por ahora, a nosotros nos interesará que sean accesibles desde el resto de nuestro programa, por lo que les añadiremos delante la palabra "public" para indicar que queremos que sean públicos.

Ya desde el cuerpo del programa, para acceder a cada uno de los datos que forman el registro, tanto si queremos leer su valor como si queremos cambiarlo, se debe indicar el nombre de la variable y el del dato (o campo) separados por un punto:

/*---------------------------*/
/*  Ejemplo en C# nº 39:     */
/*  ejemplo39.cs             */
/*                           */
/*  Registros (struct)       */
/*                           */
/*  Introduccion a C#,       */
/*    Nacho Cabanes          */
/*---------------------------*/
 
using System;
 
public class Ejemplo39
{
 
  struct tipoPersona
  {
    public string nombre;
    public char   inicial;
    public int    edad;
    public float  nota;
  } 
 
  public static void Main()
  {
    tipoPersona persona;
 
    persona.nombre = "Juan";
    persona.inicial = 'J';
    persona.edad = 20;
    persona.nota = 7.5f;
    Console.WriteLine("La edad de {0} es {1}", 
      persona.nombre, persona.edad);
    }
}
 

Nota: La notación 7.5f se usa para detallar que se trata de un número real de simple precisión (un "float"), porque de lo contrario, 7.5 se consideraría un número de doble precisión, y al tratar de compilar obtendríamos un mensaje de error, diciendo que no se puede convertir de "double" a "float" sin pérdida de precisión. Al añadir la "f" al final, estamos diciendo "quiero que éste número se tome como un float; sé que habrá una pérdida de precisión pero es aceptable para mí”.

Ejercicio propuesto: Un "struct" que almacene datos de una canción en formato MP3: Artista, Título, Duración (en segundos), Tamaño del fichero (en KB). Un programa debe pedir los datos de una canción al usuario, almacenarlos en dicho "struct" y después mostrarlos en pantalla.

4.3.2. Arrays de estructuras

Hemos guardado varios datos de una persona. Se pueden almacenar los de varias personas si combinamos el uso de los "struct" con las tablas (arrays) que vimos anteriormente. Por ejemplo, si queremos guardar los datos de 100 personas podríamos hacer:

 
/*---------------------------*/
/*  Ejemplo en C# nº 40:     */
/*  ejemplo40.cs             */
/*                           */
/*  Array de struct          */
/*                           */
/*  Introduccion a C#,       */
/*    Nacho Cabanes          */
/*---------------------------*/
 
using System;
 
public class Ejemplo40
{
 
  struct tipoPersona
  {
    public string nombre;
    public char   inicial;
    public int    edad;
    public float  nota;
  } 
 
  public static void Main()
  {
    tipoPersona[] persona = new tipoPersona[100];
 
    persona[0].nombre = "Juan";
    persona[0].inicial = 'J';
    persona[0].edad = 20;
    persona[0].nota = 7.5f;
    Console.WriteLine("La edad de {0} es {1}", 
      persona[0].nombre, persona[0].edad);
 
    persona[1].nombre = "Pedro";
    Console.WriteLine("La edad de {0} es {1}", 
      persona[1].nombre, persona[1].edad);
    }
}
 

La inicial de la primera persona sería "persona[0].inicial", y la edad del último sería "persona[99].edad".

Al probar este programa obtenemos

La edad de Juan es 20
La edad de Pedro es 0

Porque cuando reservamos espacio para los elementos de un "array" usando "new", sus valores se dejan "vacíos" (0 para los números, cadenas vacías para las cadenas de texto).

Ejercicio propuesto: Un programa que permita guardar datos de "imágenes" (ficheros de ordenador que contengan fotografías o cualquier otro tipo de información gráfica). De cada imagen se debe guardar: nombre (texto), ancho en píxeles (por ejemplo 2000), alto en píxeles (por ejemplo, 3000), tamaño en Kb (por ejemplo 145,6). El programa debe ser capaz de almacenar hasta 700 imágenes (deberá avisar cuando su capacidad esté llena). Debe permitir las opciones: añadir una ficha nueva, ver todas las fichas (número y nombre de cada imagen), buscar la ficha que tenga un cierto nombre.

4.3.3. Estructuras anidadas

Podemos encontrarnos con un registro que tenga varios datos, y que a su vez ocurra que uno de esos datos esté formado por varios datos más sencillos. Por ejemplo, una fecha de nacimiento podría estar formada por día, mes y año. Para hacerlo desde C#, incluiríamos un "struct" dentro de otro, así:

/*---------------------------*/
/*  Ejemplo en C# nº 41:     */
/*  ejemplo41.cs             */
/*                           */
/*  Registros anidados       */
/*                           */
/*  Introduccion a C#,       */
/*    Nacho Cabanes          */
/*---------------------------*/
 
using System;
 
public class Ejemplo41
{
 
  struct fechaNacimiento 
  {
    public int  dia;
    public int  mes;
    public int anyo;
  } 
 
 
  struct tipoPersona
  {
    public string nombre;
    public char   inicial;
    public fechaNacimiento diaDeNacimiento;
    public float  nota;
  } 
 
  public static void Main()
  {
    tipoPersona persona;
 
    persona.nombre = "Juan";
    persona.inicial = 'J';
    persona.diaDeNacimiento.dia = 15;
    persona.diaDeNacimiento.mes = 9;
    persona.nota = 7.5f;
    Console.WriteLine("{0} nació en el mes {1}", 
      persona.nombre, persona.diaDeNacimiento.mes);     
    }
}