Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: poisonkhriz en 20 Marzo 2011, 02:08 am



Título: ayuda en un menu en switch
Publicado por: poisonkhriz en 20 Marzo 2011, 02:08 am
hola a todos bueno soy nuevo en la programacion sobre todo en c,
uso un copilador bastante primitivo q es el turbo c  3.0 :xD ese nos exigen en la U XD

bueno al grano. lo que queria pedirles es como hacer un menu con funciones por ejemplo

#include<stdio.h>
#include<conio.h>
void alta( int........char.....)
void bajas(int....float...)
 
main()
{

printf(" menu")
.
.
.
.
.
switch(op);
{
case 1:                    // aqui es mi duda en como aplicar la funcion void en el case, tengo que llamarla,o simplementes hacer la operaciones pertinentes


no se si me de entender,es que la verdad mi maestra de curso no sabe explicar nada....

bueno ojala me puedan ayudar y de paso ojala me den algunos consejillos para programar XD


gracias por leer el post


Título: Re: ayuda en un menu en switch
Publicado por: Akai en 20 Marzo 2011, 02:28 am
El switch selecciona en función de lo que tu pongas. En tu caso, op.

lo que hay en el case, es lo que se hará si se da que op tiene ese valor.

Supongamos que n es una variable entera

Código
  1. switch(n){
  2. case 0:
  3. hago_algo();
  4. break;
  5. case 5:
  6. n=hago_otra_cosa(n);
  7. break;
  8. case default:
  9. no_hago_nada();
  10. break
  11. }

Si n vale 0, se llama a la función void hago_algo. si n vale 5, se llama a una función que devuelve un entero, que se guarda en n, y para cualquier otro caso, se llama a la función void no_hago_nada.

Espero que de esta forma se entienda como funciona el switch


Título: Re: ayuda en un menu en switch
Publicado por: poisonkhriz en 20 Marzo 2011, 02:52 am
si,eso lo entiendo.. bueno por ejemplo


he visto ejemplos en donde en el case solo se pone la funcion

case 1: altas
break;
case 2: bajas
break;
}
void altas //aca se llama la funcion y se hace la operacion


tengo duda en eso como aplicar las funciones en el case


o tambien les agradecería mucho si me puedieran dar un ejemplo de un switch con funciones void y que retornen valor


gracias por contestar  :D


Título: Re: ayuda en un menu en switch
Publicado por: Akai en 20 Marzo 2011, 02:57 am
No, en el case no se está poniendo la función.

(case 1) : función

el case, es el 1, los dos puntos, separan el case de lo que se tiene que realizar en el case, que es la función.

Y los ejemplos que pides, ya los he puesto antes, mira con atención.


Título: Re: ayuda en un menu en switch
Publicado por: Samael.Black en 20 Marzo 2011, 06:31 am
Bueno nose mucho de programacion... pero quisas te refieras a esto:

Código:
#include <iostream>
#include <stdlib.h>
void saludar(){ std::cout << "Hola mundo" << std::endl; } // <-- funcion 1
void adios(){ system("exit"); } // <-- funcion 2

int main()
{
empezar:
int accion = 0;
std::cout << "MENU:" << std::endl;
std::cout << "[1] Ir a la funcion." << std::endl;             // <-- menu
std::cout << "[2] Salir del programa." << std::endl;
std::cin >> accion;

switch(accion) <-- inicias switch leyendo el valor de variable accion
{
case 1: saludar(); <-- llamas a funciones
break;
case 2: adios(); // <--- llamas a funciones
break;
default: system ("cls"); std::cout << "Error valor no reconocido" << std::endl;
goto empezar;
}
return 0;
}


Título: Re: ayuda en un menu en switch
Publicado por: poisonkhriz en 20 Marzo 2011, 07:01 am
si exacto algo asi pero sin el iostream todavia no veo eso en clase  :xD


ahi llamas la funcion en el case y me imagino que cuando se termina el switch, llamas de nuevo la funcion para ejecutar el caso....


Título: Re: ayuda en un menu en switch
Publicado por: Akai en 20 Marzo 2011, 12:32 pm
poisonkhriz, date cuenta de lo siguiente.

NO llamas a la función para evaluar el case, sino una vez el case está evaluado.

Da lo mismo, que lo pongas de esta forma:

Código
  1. switch(n){
  2. case 0:
  3. hago_algo();
  4. break;
  5. case 5:
  6. n=hago_otra_cosa(n);
  7. break;
  8. case default:
  9. no_hago_nada();
  10. break
  11. }
  12.  

Código
  1. switch(n){
  2. case 0:hago_algo(); break;
  3. case 5:n=hago_otra_cosa(n); break;
  4. case default: no_hago_nada(); break
  5. }
  6.  

Es lo mismo. Y te repito NO TIENES FUNCIONES EN LA EVALUACIÓN DEL CASE, sino en lo que se realiza en caso de darse ese valor del parámetro evaluado por el switch.

EL CASE VA ANTES DE LOS DOS PUNTOS, TODO LO DEMÁS ES LO QUE SE HACE SI SE DA ESE CASO


Título: Re: ayuda en un menu en switch
Publicado por: <<<-Basura->>> en 20 Marzo 2011, 14:25 pm
Bueno Creo que lo que necesitas es esto:

Código
  1. #include <stdio.h>  // Liberia de Entrada y Salida E/S O/I
  2. #include <conio.h>  // Para usar clrscr();
  3. #include <stdlib.h> // Solo para usar exit();
  4.  
  5. altas(); // Se Declara Funcion Altas
  6.  
  7. bajas(); // Se Declara Funcion Bajas
  8.  
  9. error(); // Se Declara Funcion Error
  10.  
  11. void main(){
  12. char sw;  // Esta es la variable que va a cotrolar el menu ES un TIPO CHAR porque el int da errores...
  13. // Si declaras un int y por error meten una letra.. bucle infinito
  14. do{
  15. gotoxy(0,0);             // Espesificar donde va hacer la salida
  16. printf("1. Altas \n");   //
  17. printf("2. Bajas \n");   //  Esto es para imprimir el Menu
  18. printf("3. Salir \n");   //
  19.  
  20. scanf("%s",&sw);  // Le asigna un valor a la variable
  21.  
  22. switch(sw){
  23. case '1':
  24. clrscr(); // Limpiar la Consola
  25. altas();  // Se va a la Funcion altas
  26. break;
  27.  
  28. case '2':
  29. clrscr(); // limpiar la consola
  30. bajas();  //se va a la funcion bajas
  31. break;
  32. case '3':
  33. clrscr(); // limpiar la consola
  34. break;
  35. default:
  36. error(); // Se va a la Funcion Error
  37.  
  38.  }
  39. }while(sw!='3'); // SI se Escribe 3 se Sale del buble--- Terminar
  40.  
  41. exit(0); // Terminar Programa
  42. }
  43.  
  44. altas(){
  45. gotoxy(5,5); // Imprimir espeficicamente en la posicion 5,5
  46. printf("Altas");  //Salida.. Imprime Altas
  47. }
  48. bajas(){
  49. gotoxy(5,5); // Imprimir espeficicamente en la posicion 5,5
  50. printf("Bajas"); //Salida.. Imprime Bajas
  51. }
  52.  
  53. error(){  //      ESTO ES
  54. clrscr();  // limpiar la consola                       //  Por si meten algun valor que
  55. gotoxy(5,5);printf("No Selecciono Ninguna Obcion..."); //  No este en el Menu
  56. }
  57.  

Bueno Es lo Mejor que Pude Hacer. Espero que te sirva  ;-)


Título: Re: ayuda en un menu en switch
Publicado por: Akai en 20 Marzo 2011, 14:34 pm
rasielunderwar, sinceramente, tu código necesita un par de arreglos.
Código
  1. scanf("%s",&sw);
Lees un carácter como un string? MAL

para leer caracteres
Código
  1. char sw;
  2. scanf("%c",&sw);

para leer cadenas
Código
  1. char cadena[10];
  2. // o si jugamos con memoria dinámica
  3. char* cadena;
  4. scanf("%s",cadena);


Usar conio... ejem, tiende a pecado. Es una librería tremendamente obsoleta.

Por otro lado, para qué terminar con un exit 0? haz tu main int y que haga un return 0.


Título: Re: ayuda en un menu en switch
Publicado por: <<<-Basura->>> en 20 Marzo 2011, 15:30 pm
Pues gracias por los consejos... cambie mi codigo a int main, y quite el exit(0); pero me manda un error:

General Protection Exception
          SW.CPP 42
SW(2) 0x138F:0x0097 Processor Fault

por eso fue que lo hice con el exit :) , Podrias decirme porque es que sale ese error.. jeje


Título: Re: ayuda en un menu en switch
Publicado por: Akai en 20 Marzo 2011, 15:33 pm
pusiste el return 0 al final de main? Y con qué compilador lo hiciste?


Título: Re: ayuda en un menu en switch
Publicado por: <<<-Basura->>> en 20 Marzo 2011, 15:34 pm
Lo hice con Turbo c++ 4.5 :S que sera


Título: Re: ayuda en un menu en switch
Publicado por: xassiz~ en 20 Marzo 2011, 15:39 pm
Las funciones altas(), bajas() y error() de qué tipo son?

PD: Se dice Opción, no Obción.


Título: Re: ayuda en un menu en switch
Publicado por: Akai en 20 Marzo 2011, 15:41 pm
Cierto, tus funciones no tienen tipo.

void? int? float? char? qué devuelven?

Me extraña mucho que un compilador no te avise que una función no tiene tipo o.o

Algo me dice, que alguien tiene que reaprender a programar en C o C++, dejándose de conio, turbo c++ y cosas por el estilo.


Título: Re: ayuda en un menu en switch
Publicado por: <<<-Basura->>> en 20 Marzo 2011, 15:46 pm
nonono... las funciones no tienen tipo porque no resiven un valor O.O...

hay muchos caminos para llegar a la meta, el problema es que mientras llegues todos son correctos ;) .

lo que me extraña es el Error raro jaja pero hay me la juge para evitarlo O.O


Título: Re: ayuda en un menu en switch
Publicado por: Akai en 20 Marzo 2011, 15:50 pm
Te equivocas, las funciones se tipan según lo que DEVUELVEN
Código
  1. void hola( ){
  2. printf("hola\n");
  3. }
  4.  
  5. void que_numero(int n){
  6. printf("numero: %d\n",n);
  7. }


Código
  1. int cuatro( ){
  2. return 4;
  3. }
  4. int suma(int a, int b){
  5. return a+b;
  6. }
  7.  

Entiendes?

Tus funciones deberían pasar a ser void todas, para el código que has puesto.


Título: Re: ayuda en un menu en switch
Publicado por: <<<-Basura->>> en 20 Marzo 2011, 15:55 pm
Si yo se pero ... quiero evitar la fatiga poniendo void... sirven de = manera al no resivir ningun valor y tampoco retornarlo... Si no me crees pruevalo  :-*


Título: Re: ayuda en un menu en switch
Publicado por: Akai en 20 Marzo 2011, 15:59 pm
"Para evitar la fatiga"? WHAT THE FUCK? Qué clase de intento de programador dice eso?

En tu compilador, puede que funcione, en GCC, eso te da AVISOS. Y si te centras en el C o C++ estándar, eso es un ERROR.

Te repito, a las funciones se les da tipo según lo que DEVUELVEN, no lo que reciben.


Título: Re: ayuda en un menu en switch
Publicado por: <<<-Basura->>> en 20 Marzo 2011, 16:03 pm
puss puss puss.... ¬¬ pruevalo.... :'( ....


Título: Re: ayuda en un menu en switch
Publicado por: Akai en 20 Marzo 2011, 16:04 pm
En tu compilador, puede que funcione, en GCC, eso te da AVISOS. Y si te centras en el C o C++ estándar, eso es un ERROR.

Lee, a ver qué entiendes de esa linea.


Título: Re: ayuda en un menu en switch
Publicado por: <<<-Basura->>> en 20 Marzo 2011, 16:11 pm
jejeje dejemolo hay no discutamos mas ... no llegaremos a nada ... cada quien tiene su forma ya entendi que si se pasa de compilador ERROR !.. XDD

lei una de tus respuestas en otro post.. mensionastes Programación con el estándar ISO y la Biblioteca de Plantillas .... no lo tenes hay para descargarlo.. jeje ;)


Título: Re: ayuda en un menu en switch
Publicado por: Akai en 20 Marzo 2011, 16:14 pm
No, no lo tengo. Lo tengo en papel. Imagino que igual estará por ahí si buscas en google.

Por otro lado, esto es un foro más o menos serio, no el patio del colegio, para que vengas con un "puss puss puss.... ¬¬ pruevalo.... :'( ...." como si le hablases a tu colega o por el msn a dios sabe quien


Título: Re: ayuda en un menu en switch
Publicado por: Samael.Black en 20 Marzo 2011, 18:23 pm
si exacto algo asi pero sin el iostream todavia no veo eso en clase  :xD

La libreria iostream es usada mas que nada en C++, en C seria la libreria stdio.h y en ves de cout, cin y endl, usarias printf, scanf y /n...


ahi llamas la funcion en el case y me imagino que cuando se termina el switch, llamas de nuevo la funcion para ejecutar el caso....
Si no me equvico con esto quieres decir que cuando realize la funcion de los case segun el correspondiente... vuelva a imprimir el menu... eso lo puedes hacer con un do while. ejemplo:
Código:
#include <iostream>
#include <stdlib.h>
void saludar(){ std::cout << "Hola mundo" << std::endl; }
void adios(){ system("exit"); }

int main()
{
int accion = 0;
empezar:
do{ // <-- Inicio de declaración de do
std::cout << "MENU:" << std::endl;
std::cout << "[1] Ir a la funcion." << std::endl;
std::cout << "[2] Salir del programa." << std::endl;
std::cin >> accion;

switch(accion)
{
case 1: saludar();
break;
case 2: adios();
break;
default: system ("cls"); std::cout << "Error valor no reconocido" << std::endl;
goto empezar;
}
}
while(accion == 1); <-- condición de declaración
return 0;
}


Título: Re: ayuda en un menu en switch
Publicado por: Akai en 20 Marzo 2011, 18:41 pm
Hay dos cosas que no tienen sentido:

Código
  1. void adios(){ system("exit"); }

system(exit) para?

Código
  1. void adios(){ exit(0);}


En el switch
Código
  1. default: system ("cls"); std::cout << "Error valor no reconocido" << std::endl;
  2. goto empezar;

goto para? ya tienes un while. Si te montas bien la condición el ogot sobra. Y usar goto no es aconsejable

Y luego un apunte, las llamadas a system, mejor evitarlas.


Título: Re: ayuda en un menu en switch
Publicado por: Samael.Black en 20 Marzo 2011, 18:48 pm
Hay dos cosas que no tienen sentido:

Código
  1. void adios(){ system("exit"); }

system(exit) para?

Código
  1. void adios(){ exit(0);}


En el switch
Código
  1. default: system ("cls"); std::cout << "Error valor no reconocido" << std::endl;
  2. goto empezar;

goto para? ya tienes un while. Si te montas bien la condición el ogot sobra. Y usar goto no es aconsejable

Y luego un apunte, las llamadas a system, mejor evitarlas.
Si lose xD error mio xD en si solo quería explicarle lo del do while... y no me di cuenta de ello xD

Hayi esta el codigo como deberia ser:
Código:
#include <iostream>
#include <stdlib.h>
void saludar(){ std::cout << "Hola mundo" << std::endl; }
void adios(){ exit(0); }

int main()
{
int accion = 0;
do{
std::cout << "MENU:" << std::endl;
std::cout << "[1] Ir a la funcion." << std::endl;
std::cout << "[2] Salir del programa." << std::endl;
std::cin >> accion;

switch(accion)
{
case 1: saludar();
break;
case 2: adios();
break;
default: system ("cls"); std::cout << "Error valor no reconocido" << std::endl;
}
}
while(accion < 2 || accion > 2);
return 0;
}

Por cierto lo de exit(0) no me la savia... he aprendido algo nuevo xD


Título: Re: ayuda en un menu en switch
Publicado por: <<<-Basura->>> en 20 Marzo 2011, 19:19 pm
Cuando trabajes con iostream ... te aconsejo que debajo de las librerias pon
using namespace std;

esto es para no poner tantos std jeje std::cout, std cin

Código
  1. #include <iostream>
  2. using namespace std;
  3. void main(){
  4.     cout<<"hola";
  5. }
  6.  


Título: Re: ayuda en un menu en switch
Publicado por: Samael.Black en 20 Marzo 2011, 19:33 pm
Cuando trabajes con iostream ... te aconsejo que debajo de las librerias pon
using namespace std;

esto es para no poner tantos std jeje std::cout, std cin

Código
  1. #include <iostream>
  2. using namespace std;
  3. void main(){
  4.     cout<<"hola";
  5. }
  6.  

Si eso lose... pero como el código no era muy extenso, lo hice manualmente... pero gracias por el punto...


Título: Re: ayuda en un menu en switch
Publicado por: Akai en 20 Marzo 2011, 19:40 pm
De hecho, queda un poco en entredicho que por ahorrarte unos cuantos golpes de tecla sea conveniente usar el espacio de nombres estándar.

Para programas pequeños, en los que trabajas con la biblioteca estándar y poco más, no hay demasiado problema, pero por ejemplo, hay bibliotecas que incluyen su propio espacio de nombres, y entonces, puede crear confusión.

El camino fácil no suele ser el mejor.