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.5 Ejemplo completo

Vamos a hacer un ejemplo completo que use tablas ("arrays"), registros ("struct") y que además manipule cadenas.

La idea va a ser la siguiente: Crearemos un programa que pueda almacenar datos de hasta 1000 ficheros. Para cada fichero, debe guardar los siguientes datos: Nombre del fichero, Tamaño (en KB, un número de 0 a 8.000.000.000). El programa mostrará un menú que permita al usuario las siguientes operaciones:


1- Añadir datos de un nuevo fichero
2- Mostrar los nombres de todos los ficheros almacenados
3- Mostrar ficheros que sean de más de un cierto tamaño (por ejemplo, 2000 KB).
4- Ver todos los datos de un cierto fichero (a partir de su nombre)
5- Salir de la aplicación (como no usamos ficheros, los datos se perderán).

No debería resultar difícil. Vamos a ver directamente una de las formas en que se podría plantear y luego comentaremos alguna de las mejoras que se podría (incluso se debería) hacer.

Una opción que podemos a tomar para resolver este problema es la de contar el número de fichas que tenemos almacenadas, y así podremos añadir de una en una. Si tenemos 0 fichas, deberemos almacenar la siguiente (la primera) en la posición 0; si tenemos dos fichas, serán la 0 y la 1, luego añadiremos en la posición 2; en general, si tenemos "n" fichas, añadiremos cada nueva ficha en la posición "n". Por otra parte, para revisar todas las fichas, recorreremos desde la posición 0 hasta la n-1, haciendo algo como

  for (i=0; i<=n-1; i++) { /* ... más órdenes ... */ }

o bien algo como

  for (i=0; i<n; i++) { /* ... más órdenes ...} */ 

El resto del programa no es difícil: sabemos leer y comparar textos y números, comprobar varias opciones con "switch", etc. Aun así, haremos una última consideración: hemos limitado el número de fichas a 1000, así que, si nos piden añadir, deberíamos asegurarnos antes de que todavía tenemos hueco disponible.

Con todo esto, nuestro fuente quedaría así:

/*---------------------------*/
/*  Ejemplo en C# nº 46:     */
/*  ejemplo46.cs             */
/*                           */
/*  Tabla con muchos struct  */
/*  y menu para manejarla    */
/*                           */
/*  Introduccion a C#,       */
/*    Nacho Cabanes          */
/*---------------------------*/
 
using System;
 
public class Ejemplo46
{
 
  struct tipoFicha {
     public string nombreFich;   /* Nombre del fichero */
     public long tamanyo;        /* El tamaño en bytes */
  };
 
  public static void Main()
  {
    tipoFicha[] fichas   /* Los datos en si */
       = new tipoFicha[1000];
    int numeroFichas=0;  /* Número de fichas que ya tenemos */
    int i;               /* Para bucles */
    int opcion;          /* La opcion del menu que elija el usuario */
    string textoBuscar; /* Para cuando preguntemos al usuario */
    long tamanyoBuscar;   /* Para buscar por tamaño */
 
 
    do {
      /* Menu principal */
      Console.WriteLine();
      Console.WriteLine("Escoja una opción:");
      Console.WriteLine("1.- Añadir datos de un nuevo fichero");
      Console.WriteLine("2.- Mostrar los nombres de todos los ficheros");
      Console.WriteLine("3.- Mostrar ficheros que sean de mas de un cierto tamaño");
      Console.WriteLine("4.- Ver datos de un fichero");
      Console.WriteLine("5.- Salir");
 
      opcion = Convert.ToInt32( Console.ReadLine() );
 
      /* Hacemos una cosa u otra según la opción escogida */
      switch(opcion){
         case 1: /* Añadir un dato nuevo */
           if (numeroFichas < 1000) {  /* Si queda hueco */
             Console.WriteLine("Introduce el nombre del fichero: ");
             fichas[numeroFichas].nombreFich = Console.ReadLine();
             Console.WriteLine("Introduce el tamaño en KB: ");
             fichas[numeroFichas].tamanyo  = Convert.ToInt32( Console.ReadLine() );
             /* Y ya tenemos una ficha más */
             numeroFichas++;
           } else   /* Si no hay hueco para más fichas, avisamos */
             Console.WriteLine("Máximo de fichas alcanzado (1000)!");
           break;
         case 2: /* Mostrar todos */
           for (i=0; i<numeroFichas; i++) 
              Console.WriteLine("Nombre: {0}; Tamaño: {1} Kb",
                fichas[i].nombreFich, fichas[i].tamanyo);
           break;
         case 3: /* Mostrar según el tamaño */
           Console.WriteLine("¿A partir de que tamaño quieres que te muestre?");
           tamanyoBuscar = Convert.ToInt64( Console.ReadLine() );
           for (i=0; i<numeroFichas; i++)
             if (fichas[i].tamanyo >= tamanyoBuscar)
                Console.WriteLine("Nombre: {0}; Tamaño: {1} Kb",
                  fichas[i].nombreFich, fichas[i].tamanyo);
           break;
         case 4: /* Ver todos los datos (pocos) de un fichero */
           Console.WriteLine("¿De qué fichero quieres ver todos los datos?");
           textoBuscar = Console.ReadLine();
           for (i=0; i<numeroFichas; i++) 
             if ( fichas[i].nombreFich == textoBuscar )
                Console.WriteLine("Nombre: {0}; Tamaño: {1} Kb",
                  fichas[i].nombreFich, fichas[i].tamanyo);
           break;
         case 5: /* Salir: avisamos de que salimos */
           Console.WriteLine("Fin del programa"); 
           break;
         default: /* Otra opcion: no válida */
           Console.WriteLine("Opción desconocida!"); 
           break;
         }
     } while (opcion != 5);  /* Si la opcion es 5, terminamos */
 
  }
}
 
 

Funciona, y hace todo lo que tiene que hacer, pero es mejorable. Por supuesto, en un caso real es habitual que cada ficha tenga que guardar más información que sólo esos dos apartados de ejemplo que hemos previsto esta vez. Si nos muestra todos los datos en pantalla y se trata de muchos datos, puede ocurrir que aparezcan en pantalla tan rápido que no nos dé tiempo a leerlos, así que sería deseable que parase cuando se llenase la pantalla de información (por ejemplo, una pausa tras mostrar cada 25 datos). Por supuesto, se nos pueden ocurrir muchas más preguntas que hacerle sobre nuestros datos. Y además, cuando salgamos del programa se borrarán todos los datos que habíamos tecleado, pero eso es lo único "casi inevitable", porque aún no sabemos manejar ficheros.

Ejercicios propuestos: