Este sitio web usa cookies de terceros para analizar el tráfico y personalizar los anuncios. Si no está de acuerdo, abandone el sitio y no siga navegando por él. ×


4.6. 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 (archivos de ordenador). 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.

La única complicación real es que el array no estará completamente lleno: habrá espacio para 1000 datos, pero iremos añadiendo de uno en uno. Basta con contar el número de fichas que tenemos almacenadas, y así sabremos en qué posición iría la siguiente: 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 existentes, 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

(esta segunda alternativa es la que se suele considerar "más natural" para un programador en un lenguaje como C#).

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_04_06a.cs
// Tabla con muchos struct y menú para manejarla
// Introducción a C#, por Nacho Cabanes

using System;

public class Ejemplo_04_06a {

  struct tipoFicha {
     public string nombreFich;   // Nombre del fichero
     public long tamanyo;        // El tamaño en KB
  };

  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, repetitivo
      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 por encima 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= 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

(Como quizá hayas notado, este fuente, que es un poco más largo que los anteriores, abre las llaves al final de cada línea -estilo Java- y usa tabulaciones de 2 espacios, en vez de 4, para ocupar menos espacio en papel y caber en el ancho de una página; recuerda que puedes usar estilo Java si lo prefieres, pero en general el fuente será más legible con tabulaciones de 4 espacios en vez de 2).

Este programa 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 descontado, 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:

Ejercicio propuesto 4.6.1: Un programa que pida el nombre, el apellido y la edad de una persona, los almacene en un "struct" y luego muestre los tres datos en una misma línea, separados por comas.
Ejercicio propuesto 4.6.2: Un programa que pida datos de 8 personas: nombre, dia de nacimiento, mes de nacimiento, y año de nacimiento (que se deben almacenar en un array de structs). Después deberá repetir lo siguiente: preguntar un número de mes y mostrar en pantalla los datos de las personas que cumplan los años durante ese mes. Terminará de repetirse cuando se teclee 0 como número de mes.
Ejercicio propuesto 4.6.3: Un programa que sea capaz de almacenar los datos de 50 personas: nombre, dirección, teléfono, edad (usando una tabla de structs). Deberá ir pidiendo los datos uno por uno, hasta que un nombre se introduzca vacío (se pulse Intro sin teclear nada). Entonces deberá aparecer un menú que permita:
  • Mostrar la lista de todos los nombres
  • Mostrar las personas de una cierta edad
  • Mostrar las personas cuya inicial sea la que el usuario indique
  • Salir del programa
(lógicamente, este menú debe repetirse hasta que se escoja la opción de "salir").
Ejercicio propuesto 4.6.4: Mejorar la base de datos de ficheros (ejemplo 04_06a) para que no permita introducir tamaños incorrectos (números negativos) ni nombres de fichero vacíos.
Ejercicio propuesto 4.6.5: Ampliar la base de datos de ficheros (ejemplo 04_06a) para que incluya una opción de búsqueda parcial, en la que el usuario indique parte del nombre y se muestre todos los ficheros que contienen ese fragmento (usando "Contains" o "IndexOf"). Esta búsqueda no debe distinguir mayúsculas y minúsculas (con la ayuda de ToUpper o ToLower).
Ejercicio propuesto 4.6.6: Ampliar el ejercicio anterior (4.6.5) para que la búsqueda sea incremental: el usuario irá indicando letra a letra el texto que quiere buscar, y se mostrará todos los datos que lo contienen (por ejemplo, primero los que contienen "j", luego "ju", después "jua" y finalmente "juan").
Ejercicio propuesto 4.6.7: Ampliar la base de datos de ficheros (ejemplo 04_06a) para que se pueda borrar un cierto dato (habrá que "mover hacia atrás" todos los datos que había después de ese, y disminuir el contador de la cantidad de datos que tenemos).
Ejercicio propuesto 4.6.8: Mejorar la base de datos de ficheros (ejemplo 04_06a) para que se pueda modificar un cierto dato a partir de su número (por ejemplo, el dato número 3). En esa modificación, se deberá permitir al usuario pulsar Intro sin teclear nada, para indicar que no desea modificar un cierto dato, en vez de reemplazarlo por una cadena vacía.
Ejercicio propuesto 4.6.9: Ampliar la base de datos de ficheros (ejemplo 04_06a) para que se permita ordenar los datos por nombre. Para ello, deberás buscar información sobre algún método de ordenación sencillo, como el "método de burbuja" (en el siguiente apartado tienes algunos), y aplicarlo a este caso concreto.