• Viernes 8 de Noviembre de 2024, 16:45

Autor Tema:  una mano con menu en Turbo C++  (Leído 5548 veces)

HuexoFxp

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
una mano con menu en Turbo C++
« en: Lunes 25 de Agosto de 2008, 07:12 »
0
hola! Soy nuevo en el foro y me estoy iniciando en la programacion en C++ y necesito ayuda con lo siguiente:

quiero haces un programa que maneje el puerto paralelo y envia datos para manejar una plaqueta que tiene leds. la intencion es hacer distintas secuencias.

lo que tendria que hacer es lo siguiente:

1) cuando lo ejecute, muestre un menu de 5 opciones. Esas opciones son distintas secuencias, o sea, presiono 1, hace una secuencia, presiono 2, otra distinta etc. son 5 en total.
2)cuando la secuencia termina, aparesca un cartel que diga "desea salir S/N" y obviamnete al presionar S me devualva al menu principal donde figuran las opciones de las secuencias. y si presiono N que se ejecute la secuencia nuevamente.

aca les dejo mi programa que maneja el puerto. espero que me puedan ayudar:D
Código: Text
  1. #include<stdio.h>
  2. #include<conio.h>
  3. #include<dos.h>
  4.  
  5. main()
  6.      {int a, puerto, dato[4]={129, 66, 36, 24};
  7.      clrscr();
  8.      puerto=peekb(0x40, 0x08);
  9.  
  10.      do
  11.      {
  12.      for(a=0; a<=3;a++)
  13.  
  14.      {clrscr();
  15.      outport(puerto, dato[a]);
  16.      printf("n  Lo que esta en el puerto es %d", dato[a]);
  17.      delay(1000);
  18.      }
  19.  
  20.      for(a=3; a>=3;a--)
  21.  
  22.      {clrscr();
  23.      outport(puerto, dato[a]);
  24.      printf("n  Lo que esta en el puerto es %d", dato[a]);
  25.      delay(1000);
  26.      }
  27.      }while(!kbhit());
  28.  
  29.      getch();
  30.      return(0);
  31.      }
  32.  

desde ya muchas gracias!

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: una mano con menu en Turbo C++
« Respuesta #1 en: Lunes 25 de Agosto de 2008, 10:58 »
0
Primero, comentarte que formateas fatal el código. Mucho más legible así:

Código: Text
  1.  
  2. #include<stdio.h>
  3.  #include<conio.h>
  4.  #include<dos.h>
  5.  
  6. main()
  7. {
  8.    int a, puerto, dato[4]={129, 66, 36, 24};
  9.    clrscr();
  10.    puerto=peekb(0x40, 0x08);
  11.    do
  12.    {
  13.       for(a=0; a<=3;a++)
  14.       {
  15.          clrscr();
  16.          outport(puerto, dato[a]);
  17.          printf("n  Lo que esta en el puerto es %d", dato[a]);
  18.          delay(1000);
  19.       }
  20.  
  21.       for(a=3; a>=3;a--)
  22.       {
  23.          clrscr();
  24.          outport(puerto, dato[a]);
  25.          printf("n  Lo que esta en el puerto es %d", dato[a]);
  26.          delay(1000);
  27.       }
  28.    } while(!kbhit());
  29.  
  30.    getch();
  31.    return(0);
  32. }
  33.  

Segundo, usas return(0); cuando no has declarado que main() devuelva ningún valor.

Tercero, el segundo bucle for "for(a=3; a>=3;a--)" es un bucle raro puesto que sólo se ejecuta una vez, cuando a vale 3, dado que en la siguiente iteración a vale 2 y la condición a>=3 devuelve falso.

Tampoco entiendo por qué dos bucles seguidos que hacen lo mismo...  :blink:

En cuanto a tus dudas, la (1) es bastante sencilla. Puedes usar printf() para poner las opciones en pantalla y getch() para recuperar el carácter pulsado. Si es uno de los números del menú, entonces ejecutas la opción correspondiente. Sino, pues simplemente la ignoras o imprimes un mensaje de error.

La (2) igual, puedes recuperar S/N usando getch(). Ten en cuenta que tu código debe ir dentro de un while para que se repita en caso de que sea 'S'.

Si tienes dudas, pregunta. Un saludo.

HuexoFxp

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
Re: una mano con menu en Turbo C++
« Respuesta #2 en: Lunes 25 de Agosto de 2008, 15:46 »
0
lo de que el codigo valla con while ya me lo comentaron el tema es que no se como usarlo en el programa. Te dejo mi programa con un menu que realize pero no me funca.
Código: Text
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <conio.h>
  4. #include <dos.h>
  5.  
  6.  
  7.  
  8. int opcion1();
  9. int opcion2();
  10. int opcion3();
  11. int opcion4();
  12.  
  13. int main()
  14.     {
  15.     char b;
  16.     int opcion;
  17.     clrscr();
  18.      do{
  19.     printf ("n             M E N Un");
  20.     printf ("            =========nn");
  21.     printf (" 1. Secuencia N§ 1n");
  22.     printf (" 2. Secuencia N§ 2n");
  23.     printf (" 3. Secuencia N§ 3n");
  24.     printf (" 4. Secuencia N§ 4n");
  25.     printf (" 5. Secuencia N§ 5nn");
  26.     printf (" Elija una opcion: ");
  27.     opcion=getch();
  28.     switch (opcion){
  29.            case 49:
  30.             opcion1();
  31.             break;
  32.            case 50:
  33.             opcion2();
  34.             break;
  35.            case 51:
  36.             opcion3();
  37.             break;
  38.            case 52:
  39.             opcion4();
  40.             break;
  41.            case 53:
  42.             //esta opcion nos sacaria del menu al pulsar 5
  43.             break;
  44.             printf("Desea continuar S/N");
  45.             b==getchar();
  46.     }while(b='S')
  47.        return(0);
  48.        }
  49.        }
  50. int opcion1(){
  51.     printf("Hola Mundo xD!");
  52.     getch();
  53.  
  54.     return (0);
  55. }
  56.  
  57. int opcion2(){
  58.      int a, puerto, dato[4]={129, 66, 36, 24};
  59.      char b;
  60.      clrscr();
  61.      puerto=peekb(0x40, 0x08);
  62.      do
  63.      {
  64.      do
  65.      {
  66.      for(a=0; a<=3;a++)
  67.  
  68.      {clrscr();
  69.      outport(puerto, dato[a]);
  70.      printf("n  Lo que esta en el puerto es %d", dato[a]);
  71.      delay(1000);
  72.      }
  73.  
  74.      for(a=3; a>=3;a--)
  75.  
  76.      {clrscr();
  77.      outport(puerto, dato[a]);
  78.      printf("n  Lo que esta en el puerto es %d", dato[a]);
  79.      delay(1000);
  80.      }
  81.      }while(!kbhit());
  82.      printf("Desea continuar S/N");
  83.      b=getchar();
  84.      }while (b =='S');
  85.       return(0);
  86.      }
  87.  
  88.  
  89. int opcion3(){
  90.     //aqui meterias lo que quieres que se ejecute al elegir la tercera opcion pulsando 3
  91. return(0);
  92. }
  93.  
  94. int opcion4(){
  95.     //aqui meterias lo que quieres que se ejecute al elegir la cuarta opcion pulsando 4
  96.  
  97.     getchar();
  98.     return(0);
  99.     }
  100.  
  101. }
  102.  

si me podes dar una mano por favor voy a estar agradecido :D

saludos!

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: una mano con menu en Turbo C++
« Respuesta #3 en: Lunes 25 de Agosto de 2008, 16:08 »
0
Tienes mal esta línea (45):

Código: Text
  1.  
  2. b==getchar();
  3.  
  4.  

Tampoco cierras el switch(opcion) con su correspondiente "}"

Esto en el primer vistazo  :(

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: una mano con menu en Turbo C++
« Respuesta #4 en: Lunes 25 de Agosto de 2008, 16:16 »
0
Otras cosillas:

¿Para qué quieres declarar opcion1(), opcion2(), etc... como que devuelven int? Si no necesitas que una función devuelva nada, usa void, por ejemplo:

Código: Text
  1.  
  2. void opcion1();
  3.  
  4.  

Así te ahorras los return().

Esto sigue estando mal (línea 74):

Código: Text
  1.  
  2. for(a=3; a>=3;a--)
  3.  
  4.  

ya que el bucle se ejecuta una sola vez como ya te comenté anteriormente. Sigo sin saber para qué 2 fors que hacen lo mismo. ¿Es para probar a++ y a--  :D ?

Y por último tienes que aprender a formatear el código. Menos mal que es sencillo sino ni lo habría visto.  :bad:

HuexoFxp

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
Re: una mano con menu en Turbo C++
« Respuesta #5 en: Lunes 25 de Agosto de 2008, 18:10 »
0
yo hice lo de los fors asi por que asi me lo indico un profesor amigo, si lo ejecutas al programa mostraria los siguiente:

129, 66, 36, 24, 24, 36, 66, 129 etc, se sigue repitiendo esa secuencia hasta que presione una tecla, el tema es que cuando lo hago me saca del programa y yo quiero que me devuelva al menu...

los fors quye tienen ++ y -- es para que valla aumentando los bits y que los muestre en la pantalla.

espero explicarme bien  :D .

me podrias explicar bien como lo tendria que hacer?

desde ya muchas gracias :D

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: una mano con menu en Turbo C++
« Respuesta #6 en: Martes 26 de Agosto de 2008, 09:16 »
0
Cita de: "HuexoFxp"
aumentando los bits

Sí, efectivamente a++ es postincremento y a-- postdecremento, es decir, que se suma/resta 1 después de la línea en que aparezca. Es decir, a==a++ es verdadero. El preincremento/predecremento es ++a y --a y se realiza antes de cualquier otra cosa en su línea, es decir, a==++a es falso. Pero no aumenta los bits, sino el int (no confundamos términos).

Lo pongo bien formateado porque sino es un lío:

Código: Text
  1.  
  2. int opcion2(){
  3.    int a, puerto, dato[4]={129, 66, 36, 24};
  4.    char b;
  5.  
  6.    clrscr();
  7.    puerto=peekb(0x40, 0x08);
  8.     do
  9.     {
  10.        do
  11.        {
  12.           for(a=0; a<=3;a++)
  13.           {
  14.              clrscr();
  15.              outport(puerto, dato[a]);
  16.              printf("n  Lo que esta en el puerto es %d", dato[a]);
  17.              delay(1000);
  18.           }
  19.  
  20.           for(a=3; a>=3;a--)
  21.           {
  22.              clrscr();
  23.              outport(puerto, dato[a]);
  24.              printf("n  Lo que esta en el puerto es %d", dato[a]);
  25.              delay(1000);
  26.           }
  27.        } while(!kbhit());
  28.       printf("Desea continuar S/N");
  29.       b=getchar();
  30.    } while (b =='S');
  31.    return(0);
  32. }
  33.  
  34.  

No sé para qué asignas valores a dato[] en su declaración puesto que los sobreescribes con outport() más tarde.

Me parece muy bien lo del profesor, pero for(a=3; a>=3;a--) sigue estando mal. ¿Seguro que la has copiado bien? ¿No será por casualidad for(a=3; a>=0;a--)? Vamos, digo yo.

El problema que me comentas radica en que tienes este código

Código: Text
  1.  
  2. printf("Desea continuar S/N");
  3. b=getchar();  /*Corregido*/
  4.  
  5.  

mal puesto dentro de un Case. ¿Por qué? Pues porque al volver de opcion2() ejecutas el break (línea 34) y por tanto se sale del switch(), pasando a ejecutar while(b=='S') (por cierto, esto también lo tenías mal (while(b='S')  :no: ) y como b no es 'S' sale del while y ejecuta return(0) saliendo de main y del programa.

Ahora que sabes dónde está el problema, ¿cómo lo resolverías?  :wacko:  :ph34r:

HuexoFxp

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
Re: una mano con menu en Turbo C++
« Respuesta #7 en: Martes 26 de Agosto de 2008, 16:12 »
0
mira, por las dudas de que lo pienses, yo no busco que me hagas el programa, si busco saber por que no anda bien el programa y usar el Do...While. como ya te dije antes  yo recien estoy empezando y no me doy muchas ideas de esto...

Gracias = por perder el tiempo conmigo.

saludos

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: una mano con menu en Turbo C++
« Respuesta #8 en: Martes 26 de Agosto de 2008, 21:31 »
0
Cita de: "HuexoFxp"
busco saber por que no anda bien el programa

Bueno si lo que quieres es que te haga el programa nada más, tú mismo:

Código: C
  1.  
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <conio.h>
  5. #include <dos.h>
  6.  
  7. void opcion1();
  8. void opcion2();
  9. void opcion3();
  10. void opcion4();
  11.  
  12. int main()
  13. {
  14.      char b;
  15.      int opcion;
  16.      clrscr();
  17.       do{
  18.      printf ("n             M E N Un");
  19.      printf ("            =========nn");
  20.      printf (" 1. Secuencia N§ 1n");
  21.      printf (" 2. Secuencia N§ 2n");
  22.      printf (" 3. Secuencia N§ 3n");
  23.      printf (" 4. Secuencia N§ 4n");
  24.      printf (" 5. Secuencia N§ 5nn");
  25.      printf (" Elija una opcion: ");
  26.      opcion=getch();
  27.      switch (opcion){
  28.             case 49:
  29.              opcion1();
  30.              break;
  31.             case 50:
  32.              opcion2();
  33.              break;
  34.             case 51:
  35.              opcion3();
  36.              break;
  37.             case 52:
  38.              opcion4();
  39.              break;
  40.             case 53:
  41.              //esta opcion nos sacaria del menu al pulsar 5
  42.              break;
  43.      }
  44.      printf("Desea continuar S/N");
  45.      b=getchar();
  46.      }while(b=='S')
  47.      return(0);
  48. }
  49.         }
  50.  
  51. void opcion1(){
  52.      printf("Hola Mundo xD!");
  53.      getch();
  54.  }
  55.  
  56. void opcion2(){
  57.       int a, puerto, dato[4];
  58.       char b;
  59.       clrscr();
  60.       puerto=peekb(0x40, 0x08);
  61.       do
  62.       {
  63.       do
  64.       {
  65.       for(a=0; a<=3;a++)
  66.  
  67.       {clrscr();
  68.       outport(puerto, dato[a]);
  69.       printf("n  Lo que esta en el puerto es %d", dato[a]);
  70.       delay(1000);
  71.       }
  72.  
  73.       for(a=3; a>=0;a--)
  74.  
  75.       {clrscr();
  76.       outport(puerto, dato[a]);
  77.       printf("n  Lo que esta en el puerto es %d", dato[a]);
  78.       delay(1000);
  79.       }
  80.       }while(!kbhit());
  81.       printf("Desea continuar S/N");
  82.       b=getchar();
  83.       }while (b =='S');
  84. }
  85.  
  86. void opcion3(){
  87.      //aqui meterias lo que quieres que se ejecute al elegir la tercera opcion pulsando 3
  88. }
  89.  
  90. void opcion4(){
  91.      //aqui meterias lo que quieres que se ejecute al elegir la cuarta opcion pulsando 4
  92.      getchar();
  93.      }
  94.  
  95.  

HuexoFxp

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
Re: una mano con menu en Turbo C++
« Respuesta #9 en: Viernes 29 de Agosto de 2008, 04:00 »
0
no entiendo que quisiste decirme mostrando el programa... si sos tan amable por fas decime :D

saludos

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: una mano con menu en Turbo C++
« Respuesta #10 en: Viernes 29 de Agosto de 2008, 11:06 »
0
Así está correcto (o por lo menos eso creo porque no está probado). Adiós.