Ejemplo: Un programa de generación de quinielas (caso sencillo).







Análisis del problema
Un cliente desea un programa que construya quinielas de forma aleatoria. El programa deberá mostrar en pantalla tantas quinielas como desee el usuario; se considera que todos los resultados son igualmente probables. El número máximo de quinielas generables simultáneamente es de 10. Las quinielas se mostrarán en pantalla del modo habitual, esto es, ordenadas por filas (partidos) y columnas (resultados):
	                1  2  3  4  5  6  7  8  9 10
	--------------------------------------------
	Resultado  1|   1  X  1  2  1  X  2  1  2  2
	Resultado  2|   X  X  1  1  X  X  2  2  2  2
	Resultado  3|   2  X  X  X  1  1  X  X  1  2
	Resultado  4|   X  1  1  X  2  X  2  2  X  1
	Resultado  5|   1  X  2  2  1  X  1  2  2  2
	Resultado  6|   2  X  2  X  1  X  X  X  2  2
	Resultado  7|   X  1  1  X  2  1  2  1  2  1
	Resultado  8|   X  X  2  2  X  2  X  X  1  1
	Resultado  9|   2  2  1  2  X  2  2  X  X  2
	Resultado 10|   X  1  2  2  X  2  X  X  2  2
	Resultado 11|   2  X  2  X  2  1  X  X  1  1
	Resultado 12|   2  2  X  X  X  2  2  X  2  2
	Resultado 13|   1  1  1  X  1  X  1  2  2  X
	Resultado 14|   1  1  1  2  2  1  X  1  X  1
	Resultado 15|   2  2  X  1  X  1  2  2  X  X

Opciones del programa : A)cerca de, I)ndicar número de quinielas, M)ostrar quinielas, S)alir.
No se podrán mostrar las quinielas sin haber indicado previamente el número de quinielas deseado. La primera opción hace las veces de ayuda.

Diseño del programa
El ejemplo de programa visto anteriormente era una plantilla, que permite construir este nuevo programa con un mínimo de esfuerzo. La idea es crucial: crear una plantilla general que sirva después para el desarrollo de todas las aplicaciones posteriores. Aun cuando el esfuerzo de creación de un programa orientado a texto es relativamente pequeño, no sucede lo mismo cuando la interfaz de usuario es gráfica, y mucho menos si se pretende crear una aplicación gráfica, interactiva y multiplataforma. En tal caso, la creación de una biblioteca de clases facilitará mucho el trabajo de desarrollo, y es de hecho la aproximación que actualmente se sigue en la industria. Los esfuerzos en este sentido han llegado, incluso, a la creación de un lenguaje específicamente diseñado para ser multiplataforma, y dotado de las oportunas bibliotecas de clases.

Implementación
/*
 Este programa muestra quinielas de quince entradas en pantalla.
 Es un ejemplo de aplicación del programa Núcleo, y muestra
 bastantes detalles interesantes. Resulta excesivamente
 farragoso (léase poco elegante) porque está hecho sin
 funciones, que le darían un aspecto mucho más agradable.
 Véanse los ejercicios posteriores, que reducen mucho el
 código empleado y aportan la misma funcionalidad.
 */


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#include<ctype.h> /* Para utilizar toupper() */

/* DECLARACIONES DEL PROGRAMA NUCLEO */

int fin;           /* Control de iteración del programa */
char instruccion;  /* Dada por el usuario */
char menu[80];     /* Que muestra el programa  */
char opcionesvalidas[80]; /* Que admite el programa */

/*  DECLARACIONES ESPECIFICAS DE ESTE PROGRAMA */

/* Todo está preparado para más quinielas. La verdadera limitación  */
/* es el número de columnas de pantalla disponibles.                */

#define MAXQUINIELAS 10
#define NUM_PARTIDOS 15

int numquinielas = 0; /* Número de quinielas que se desean  */
int i, j, k;          /* Indices para generar las quinielas */


int main(void)
{
 /* INICIACIONES - ADECUACION DE NUCLEO A ESTA APLICACION */

 fin = 0;   /* Acabamos de arrancar, no hay que salir */
 strcpy(menu,"A)cerca, I)ndicar, M)ostrar, S)alir");
 strcpy(opcionesvalidas,"AIMS"); /* OPCIONES ADMISIBLES          */
 srand(clock());

 do {

 /*                 TOMAR UNA INSTRUCCION                        */

  do {
   puts(menu);
   scanf("%c%*c",&instruccion);
   instruccion=toupper(instruccion);
  } while (!strchr(opcionesvalidas,instruccion));

 /*                 PROCESAR UNA INSTRUCCION                     */

 switch(instruccion)
 {
  case 'A': {
      puts("Acerca de Quini  .- Este programa sirve para");
      puts("escribir quinielas (pleno al 15). Por tanto,");
      puts("el  programa permite I) ndicar el  número de");
      puts("quinielas  deseadas, M) ostrar las quinielas");
      puts("solicitadas y S) alir de programa. El número");
      printf("máximo de quinielas es %d\n\n",MAXQUINIELAS);
     }
     break;
  case 'I': {
      do
       {
        printf("¿Cuántas quinielas desea (1 < n < %d) ?:",MAXQUINIELAS);
        scanf("%d%*c", &numquinielas);
    } while (numquinielas < 1 || numquinielas > MAXQUINIELAS);
      }
      break;
  case 'M': {
    if (numquinielas < 1 || numquinielas > MAXQUINIELAS)
    {
printf("Por favor, I)ndique el número de quinielas que desea.\n\n");
     }
    else
     {
     printf("\nSe han solicitado %d quinielas:\n\n",numquinielas);
     printf("              ");
     for (i=0; i < numquinielas; i++) printf("%3d",i+1);
     printf("\n");
     printf("--------------");
     for (i=0; i < numquinielas; i++) printf("---");
      printf("\n");
     for(i=0; i < NUM_PARTIDOS; i++)
       {
        printf("Resultado %2d| ",i+1);
        for(j=0; j < numquinielas; j++)
         switch(rand() % 3)
         {
          case 0: printf("  1");
            break;
          case 1: printf("  X");
            break;
          case 2: printf("  2");
               break;
         }
         printf("\n");
       }
       printf("\n");
     }
   }
      break;
   case 'S': {
       fin = 1;
       puts("\n\nFin de Programa.\n");
      }
      break;
  }

 }
 while (!fin);

 /*                 INSTRUCCIONES FINALES                        */

 puts("\n\nThat's all folks!\n");
}
/*
	RESULTADO
	A)cerca, I)ndicar, M)ostrar, S)alir
	a
	Acerca de Quini  .- Este programa sirve para
	escribir quinielas (pleno al 15). Por tanto,
	el  programa permite I) ndicar el  número de
	quinielas  deseadas, M) ostrar las quinielas
	solicitadas y S) alir de programa. El número
	máximo de quinielas es 10

	A)cerca, I)ndicar, M)ostrar, S)alir
	i
	¿Cuántas quinielas desea (1 < n < 10) ?:10
	A)cerca, I)ndicar, M)ostrar, S)alir
	m

	Se han solicitado 10 quinielas:

	                1  2  3  4  5  6  7  8  9 10
	--------------------------------------------
	Resultado  1|   1  X  1  2  1  X  2  1  2  2
	Resultado  2|   X  X  1  1  X  X  2  2  2  2
	Resultado  3|   2  X  X  X  1  1  X  X  1  2
	Resultado  4|   X  1  1  X  2  X  2  2  X  1
	Resultado  5|   1  X  2  2  1  X  1  2  2  2
	Resultado  6|   2  X  2  X  1  X  X  X  2  2
	Resultado  7|   X  1  1  X  2  1  2  1  2  1
	Resultado  8|   X  X  2  2  X  2  X  X  1  1
	Resultado  9|   2  2  1  2  X  2  2  X  X  2
	Resultado 10|   X  1  2  2  X  2  X  X  2  2
	Resultado 11|   2  X  2  X  2  1  X  X  1  1
	Resultado 12|   2  2  X  X  X  2  2  X  2  2
	Resultado 13|   1  1  1  X  1  X  1  2  2  X
	Resultado 14|   1  1  1  2  2  1  X  1  X  1
	Resultado 15|   2  2  X  1  X  1  2  2  X  X

	A)cerca, I)ndicar, M)ostrar, S)alir
	s


	Fin de Programa.



	That's all folks!

*/



Comprobación y Depuración
El algoritmo empleado se limita a plantear posibles resultados, de forma razonablemente aleatoria gracias al uso de srand() para iniciar la serie de números aleatorios, y de rand() para generar un número aleatorio para cada partido. De este modo los resultados son equiprobables, sin tener en cuenta para nada la historia anterior u otras circunstancias pertinentes. El formato obtenido en pantalla coincide con los resultados solicitados; queda sin embargo por comprobar lo que pasa ante la introducción de instrucciones marcadamente incorrectas (inserción de múltiples letras en lugar de una sola, inserción de letras en lugar de números etc).

Documentación
Al haber escrito una breve ayuda, el programa queda parcialmente documentado. Se han insertado numerosos comentarios en el código; sin embargo, se aprecia un exceso general de detalle, debido a que no se han utilizado funciones en su construcción. Véanse las versiones siguientes, más próximas a un programa real.