Make your own free website on Tripod.com

Práctica #7

Sentencias de Control Repetitivas Anidadas.

7.1 Sentencias de Control Repetitivas Anidadas.
7.3 Actividad.

7.1 Sentencias de Control Repetitivas.

En la solución de problemas es necesario hacer uso de ciclos dentro de ciclos, así la complejidad de un problema se resuelve en la menor cantidad de líneas de código. Una aplicación es la implementación de menús y submenús, no solamente con una opción que el usuario introduzca, sino activar un menú por medio del teclado y de esta manera el usuario navegar en el menú.

Si recordamos los caracteres ASCII de la práctica # 2 ( punto 2.2 ), estos nos ayudan a identificar que tecla es presionada por el usuario en un teclado, ya que cada tecla tiene definido un caracter ASCII propio.

Las teclas más comunes utilizadas son:

Tecla
Código ASCII
Hexadecimal
Backspace
8
8
TAB
9
9
Enter
13
D
Esc
27
1B
Barra Espaciadora
32
20

Para teclas especiales como flechas, funciones (F1, F2, ..., F12) y de edición (insertar, borrar, etc.) se reconocen por medio de dos caracteres, donde el caracter inicial es detectado como un CERO y luego el caracter ASCII correspondiente, por ejemplo los siguientes caracteres son para las teclas de flechas:

Tecla
Código ASCII
Hexadecimal
Flecha Izquierda
0 , 72
0, 4B
Flecha Arriba
0 , 75
0, 4D
Flecha Abajo
0 , 77
0, 48
Flecha Derecha
0 , 80
0, 50

7.2 Menús.

Un menú es un conjunto de opciones para que el usuario seleccione, y al activar una de estas opciones realiza un procedimiento específico. Si una de las opciones manda activar otro conjunto de opciones, entonces estamos implementando el manejo de submenús.

La implementación de un menú se realiza con la aplicación de un ciclo selectivo SWITCH utilizando como opción seleccionada un caracter, el cual puede ser letra o dígito. La terminación del ciclo dependerá de un ciclo repetitivo WHILE el cual terminará al seleccionar una de las opciones como opción de salida.

En el caso de los submenús se utilizan los mismos ciclos, mas cabe hacer notar que no debe ciclarse la lógica entre ellos, con las opciones de terminación debe lograrse el acceso y salida de los submenús anidados.

7.2.1 Ejemplo

#include<graphics.h>
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>

void inicializa ( ) /* Activación de modo gráfico */
{
    int gd=DETECT,gm ;
    initgraph( &gd, &gm, "C:\\TC\\BGI" );
}

void cuadro ( int x1, int y1, int x2, int y2, int relleno, int color )
{
    int poly[8];
    poly[0]= x1; poly[2]= x2; poly[4]= x2; poly[6]= x1;
    poly[1]= y1; poly[3]= y1; poly[5]= y2; poly[7]= y2;
    setfillstyle(relleno,color);
    fillpoly(4,poly);
}

void menu ( )
{
    clearviewport();
    cuadro(0,0,getmaxx ( ),getmaxy ( ), 1 , BLUE);
    cuadro ( 220, 50, 420, 100, 9, MAGENTA ); outtextxy( 250, 75, " Opción Uno " );
    cuadro ( 220,150, 420, 200, 9, MAGENTA ); outtextxy( 250,175, " Opción Dos " );
    cuadro ( 220,250, 420, 300, 9, MAGENTA ); outtextxy( 250,275, " Opción Tres " );
    cuadro ( 220,350, 420, 400, 9, MAGENTA ); outtextxy( 250,375, " Salida " );
}

// Procedimientos ejemplo de opciones de menú
void uno ( )
{
    clearviewport();
    circle( getmaxx() / 2, getmaxy() /2, 200 );
    getch();
}

void dos ( )
{
    clearviewport();
    fillellipse( getmaxx() /2, getmaxy() /2, 300, 50 );
    getch();
}

void tres ( )
{
    clearviewport();
    outtextxy(50,300, " FELICIDADES " );
    getch();
}

// Procedimiento principal para mover opciones del menú
void mueve ( )
{
    char tecla; int i=1;
    menu ( ) ;
    do {
        switch ( i )
        {
            case 1 :
                cuadro ( 220, 50, 420, 100, 9, RED );
                outtextxy( 250, 75, " Opción Uno" );
            break;

            case 2 :
                cuadro ( 220,150, 420, 200, 9, RED );
                outtextxy( 250,175, " OpciónDos" );
            break;

            case 3 :
                cuadro ( 220,250, 420, 300, 9, RED );
                outtextxy( 250,275, " OpciónTres" );
            break;

            case 4 :
                cuadro ( 220,350, 420, 400, 9, RED );
                outtextxy( 250,375, " Salida " );
            break;

        }
        tecla=getch();
        switch ( i )
        {
            case 1 :
                cuadro ( 220, 50, 420, 100, 9, MAGENTA );
                outtextxy( 250, 75, "Opción Uno" );
            break;

            case 2 :
                cuadro ( 220,150, 420, 200, 9, MAGENTA );
                outtextxy( 250,175, "Opción Dos" );
            break;

            case 3 :
                cuadro ( 220,250, 420, 300, 9, MAGENTA );
                outtextxy( 250,275, "Opción Tres" );
            break;

            case 4 :
                cuadro ( 220,350, 420, 400, 9, MAGENTA );
                outtextxy( 250,375, "Salida " );
            break;

        }
        switch ( tecla )
        {
            case '\x0' :
                tecla=getch();
                switch (tecla)
                {
                    case '\x48' :
                        i=i -1;
                    break;

                    case '\x50':
                        i=i+1;
                    break;

                }

                if (i>4)
                    i=1;
                if (i<1)
                    i=4;
            break;

            case '\xD':
                switch ( i )
                {
                    case 1:
                        uno( );
                    break;

                    case 2:
                        dos( );
                    break;
                    case 3:
                        tres( );
                    break;

                    case 4:
                        tecla = '\x1B';
                    break;

                }
                if ( i!=4 )
                menu();
            break;

         }
    } while( tecla!='\x1B');
}

void main()
{
    inicializa();
    mueve();
}

Actividad.

Serie de ejercicios a realizar.

  1. Crear un programa el cual genere una caja del tamaño que el usuario especifique, tanto el ancho como el largo de la caja. Sólo emplear ciclos for anidados, no está permitido usar la función gotoxy( ).

  2. Imprimir las siguientes figuras:

  3. Leer un número comprendido entre 1 y 19 para especificar el número de renglón del diamante.

    *
    * * *
    * * * * *
    * * * * * * *
    * * * * *
    * * *
    *

  4. Imprimir una tabla de multiplicar del número 1 hasta la tabla del 12.

  5. Generar la siguiente pirámide

    1
    232
    34543
    4567654
    567898765

    Nota: no emplear cinco printf's.

  6. Desarrollar un programa que sea un una adivinanza de un número entre 1 y 20. Este número será escogido por la computadora. Mantenerse dentro del juego mientras el jugador no haya adivinado el número y no haya intentado más de 5 veces. Al finalizar el juego preguntar al jugador si desea volver a jugar, si es así continuar el juego, de lo contrario dar por terminado el programa.

  7. Desarrollar un programa sobre un juego de dados que, al lanzar dos dados, dé un número entre 2 y 12. El lanzamiento será realizado por la computadora. El jugador escogerá el número entre 2 y 12. Asegúrese que el número introducido por el jugador sea válido. Mantenerse dentro del juego mientras la computadora no haya lanzado el número escogido por el usuario y este último no haya intentado más de 10 veces. Al finalizar el juego, preguntar al jugador si desea volver a jugar, si es así continuar el juego, de lo contrario, dar por terminado el programa.