elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Security Series.XSS. [Cross Site Scripting]


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Problema con una funcion
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Problema con una funcion  (Leído 4,376 veces)
ThronerAXE

Desconectado Desconectado

Mensajes: 27


Ver Perfil
Problema con una funcion
« en: 8 Mayo 2013, 18:16 pm »

Buenas tengo este problema, estoy creando un pedazo de funcion(le tengo que agregar mas funciones) y estoy usando la estructura switch, mi problema es que cuando el programa corre, no entra en la funcion, aqui esta el codigo:

Código
  1. //Ultimo Programa de funciones
  2. #include <stdio.h>
  3. #include <conio.h>
  4. //Prototipos
  5. int menu(void);
  6. int semana(char);
  7. //Programa Principal
  8. void main()
  9. { int opcion;
  10.  char dia;
  11.  float valor;
  12.  
  13.  while((opcion=menu())!=2)
  14.  { switch(opcion)
  15.    { case 1: clrscr();
  16.              printf("\nIngrese la inicial del dia: ");
  17.              scanf("%c",&dia);
  18.              printf("\nEl dia de la semana que le corresponde es el %d",semana(dia));
  19.              break;
  20.    }
  21.  }
  22. }
  23. //Funciones
  24. int menu(void)
  25. { int opc;
  26.  clrscr();
  27.  printf("\t\t\tMENU");
  28.  printf("\n1...Para los dias de la semana");
  29.  printf("\n2...SALIR");
  30.  do
  31.  { printf("\n\nIngrese su opcion y presione enter: ");
  32.    scanf("%d",&opc);
  33.    if(opc<1 || opc>2)
  34.    { printf("\nHa ingresado un valor incorrecto!!!");
  35.      getch();
  36.    }
  37.  }while(opc<1 || opc>2);
  38.  return opc;
  39. }
  40.  
  41. int semana(char fdia)
  42. { int fndia;
  43.  switch(fdia)
  44.  { case 'd': fndia=1;
  45.              break;
  46.    case 'l': fndia=2;
  47.              break;
  48.    case 'm': fndia=3;
  49.              break;
  50.    case 'M': fndia=4;
  51.              break;
  52.    case 'j': fndia=5;
  53.              break;
  54.    case 'v': fndia=6;
  55.              break;
  56.    case 's': fndia=7;
  57.              break;
  58.  }
  59. return fndia;
  60. }
  61.  


En línea

leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Problema con una funcion
« Respuesta #1 en: 8 Mayo 2013, 19:02 pm »

Problema con el buffer, que en este caso se soluciona dejando un espacio en blanco en los scanf. Esto me da como salida:

Código
  1.                        MENU
  2. 1...Para los dias de la semana
  3. 2...SALIR
  4.  
  5. Ingrese su opcion y presione enter: 1
  6.  
  7. Ingrese la inicial del dia: s
  8.  
  9. El dia de la semana que le corresponde es el 7                  MENU
  10. 1...Para los dias de la semana
  11. 2...SALIR
  12.  
  13. Ingrese su opcion y presione enter: 1
  14.  
  15. Ingrese la inicial del dia: d
  16.  
  17. El dia de la semana que le corresponde es el 1                  MENU
  18. 1...Para los dias de la semana
  19. 2...SALIR
  20.  

Y el código con los espacios puestos:

Código
  1. //Ultimo Programa de funciones
  2. #include <stdio.h>
  3. #include <conio.h>
  4. //Prototipos
  5. int menu(void);
  6. int semana(char);
  7. //Programa Principal
  8. int main()
  9. { int opcion;
  10.  char dia;
  11.  float valor;
  12.  
  13.  while((opcion=menu())!=2)
  14.  { switch(opcion)
  15.    { case 1: clrscr();
  16.              printf("\nIngrese la inicial del dia: ");
  17.              scanf(" %c",&dia);
  18.              printf("\nEl dia de la semana que le corresponde es el %d",semana(dia));
  19.              break;
  20.    }
  21.  return 0;
  22. }
  23. }
  24. //Funciones
  25. int menu(void)
  26. { int opc;
  27.  clrscr();
  28.  printf("\t\t\tMENU");
  29.  printf("\n1...Para los dias de la semana");
  30.  printf("\n2...SALIR");
  31.  do
  32.  { printf("\n\nIngrese su opcion y presione enter: ");
  33.    scanf(" %d",&opc);
  34.    if(opc<1 || opc>2)
  35.    { printf("\nHa ingresado un valor incorrecto!!!");
  36.      getch();
  37.    }
  38.  }while(opc<1 || opc>2);
  39.  return opc;
  40. }
  41.  
  42.  
  43. int semana(char fdia)
  44. { int fndia;
  45.  switch(fdia)
  46.  { case 'd': fndia=1;
  47.              break;
  48.    case 'l': fndia=2;
  49.              break;
  50.    case 'm': fndia=3;
  51.              break;
  52.    case 'M': fndia=4;
  53.              break;
  54.    case 'j': fndia=5;
  55.              break;
  56.    case 'v': fndia=6;
  57.              break;
  58.    case 's': fndia=7;
  59.              break;
  60.  }
  61. return fndia;
  62. }
  63.  


Saluditos!. ....  



« Última modificación: 8 Mayo 2013, 19:39 pm por leosansan » En línea

pacoperico

Desconectado Desconectado

Mensajes: 100


Ver Perfil
Re: Problema con una funcion
« Respuesta #2 en: 8 Mayo 2013, 19:05 pm »

Has de vaciar el buffer del stdin despues de usar scanf() en la definicion de tu funcion int menu(void). La forma mas sencilla es añadiendo esta linea justo despues del scanf():

Código
  1. while(getchar()!='\n');

Otras cosa ese switch con un solo case lo puedes quitar del codigo asi como la variable float valor que no la usas para nada. Yo la funcion main() siempre la declaro como int main() y con su return 0, en ver de void main() es costumbre mia. Y la libreria de conio.h siempre intento no usarla tiene funciones que a veces pueden ser problematicas.

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. //Prototipos
  5. int menu(void);
  6. int semana(char);
  7. //Programa Principal
  8.  
  9.  
  10. int main()
  11. { int opcion;
  12.  char dia;
  13.  
  14.  while((opcion=menu())!=2)
  15.    {
  16. system("cls");
  17.            printf("\nIngrese la inicial del dia: ");
  18.            scanf("%c",&dia);
  19.            printf("\nEl dia de la semana que le corresponde es el %d\n",semana(dia));
  20. system("pause");          
  21. }
  22.  return 0;
  23. }
  24.  
  25.  
  26. //Funciones
  27. int menu(void)
  28. { int opc;
  29.  system("cls");
  30.  printf("\t\t\tMENU");
  31.  printf("\n1...Para los dias de la semana");
  32.  printf("\n2...SALIR");
  33.  do
  34.  { printf("\n\nIngrese su opcion y presione enter: ");
  35.    scanf("%d",&opc);
  36. while(getchar()!='\n'); //limpieza del buffer del stdin
  37.    if(opc<1 || opc>2)
  38.    { printf("\nHa ingresado un valor incorrecto!!!");
  39.      getchar();
  40.    }
  41.  }while(opc<1 || opc>2);
  42.  return opc;
  43. }
  44.  
  45. int semana(char fdia)
  46. { int fndia = 0;
  47.  switch(fdia)
  48.  { case 'd': fndia=1;
  49.              break;
  50.    case 'l': fndia=2;
  51.              break;
  52.    case 'm': fndia=3;
  53.              break;
  54.    case 'M': fndia=4;
  55.              break;
  56.    case 'j': fndia=5;
  57.              break;
  58.    case 'v': fndia=6;
  59.              break;
  60.    case 's': fndia=7;
  61.              break;
  62.  }
  63. return fndia;
  64. }
  65.  
En línea

leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Problema con una funcion
« Respuesta #3 en: 8 Mayo 2013, 19:38 pm »

Has de vaciar el buffer del stdin despues de usar scanf() en la definicion de tu funcion int menu(void). La forma mas sencilla es añadiendo esta linea justo despues del scanf():

Código
  1. while(getchar()!='\n');

...............

Como comenté en el post anterior, en este caso concreto en que sólo se pueda quedar en el buffer es el \n, dejar el espacio en blanco antes del scanf me parece la opción más eficiente y breve. Otra cosa es que quedara resto de una cadena o algo así.

Por lo demás muy de acuerdo en el no uso  de la librería conio y , como digo yo, sus acólitos getch y compañía.

Un fuerte Saludo pacoperico.


P.D: Otra cosa a mejorar es el de opción, ya que si le entran una letra en lugar de un 1 o 2 se quedará en el sitio.
« Última modificación: 8 Mayo 2013, 21:25 pm por leosansan » En línea

pacoperico

Desconectado Desconectado

Mensajes: 100


Ver Perfil
Re: Problema con una funcion
« Respuesta #4 en: 8 Mayo 2013, 20:26 pm »

jaja no sabia yo eso de poner un espacio en blanco dentro del scanf() para limpiar el \n en el buffer del stdin. Lo he probado y funciona, es mucho mas sencillo que añadir:
Código
  1. while(getchar()!='\n');

Al codigo pero bueno, yo nunca dejare de usarlo xD.
En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: Problema con una funcion
« Respuesta #5 en: 8 Mayo 2013, 21:08 pm »

Por lo demás muy de acuerdo en el dichoso uso de la librería conio y , como digo yo, sus acólitos getch y compañía.
Creo que querías decir "desacuerdo"

Puedes sustituir getch por getchar(), asi no tendrás que usar la librería conio (solo funciona en Windows, es una buena costumbre hacer las cosas multiplataforma).
En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Problema con una funcion
« Respuesta #6 en: 8 Mayo 2013, 21:24 pm »

Creo que querías decir "desacuerdo"

Puedes sustituir getch por getchar(), asi no tendrás que usar la librería conio (solo funciona en Windows, es una buena costumbre hacer las cosas multiplataforma).

Desacuerdo total, gracias por la precisión, reeditaré el post para que no queden dudas.

Saluditos!. ....
En línea

ThronerAXE

Desconectado Desconectado

Mensajes: 27


Ver Perfil
Re: Problema con una funcion
« Respuesta #7 en: 9 Mayo 2013, 01:22 am »

Muchas gracias por sus consejos, muchos me dicen sobre no usar la librería conio.h pero el problema esque asi lo evalua la profesora en la universidad. Otra cosita es sobre la limpieza del buffer utilizando el codigo...
Código
  1.    while(getchar()!='\n');
La profesora nos ha dicho sobre este codigo que limpia el buffer tambien...
Código
  1. fflush(stdin);

mi pregunta, ¿Hacen la misma funcion?¿y que diferencia hay en colocar un fflush(stdin) y un fflush(stdout). Yo pues la verdad, me gusta experimentar metiendo codigos y ver como interactuan, pero la verdad esque no veo que me altere ni me modifique el programa si las utilizo o no...

Otra cosita, les habia comentado que el codigo que habia posteado era un pedazo de funcion, ahora le fui a agregar otra funcion(y es por eso que habia agregado el switch), bueno pues resulta que  es el calculo de una funcion matematica, al cual le tengo que pedir que ingrese un valor numerico que sea menor a 1 y diferente de -1/2 y que ademas tengo que validar. el programa corre normal, pero cuando le ingreso el valor se queda en el ciclo y no sale nunca, solamente funciona cuando le doy al valor de la variable el numero 0, alli si funciona, aqui esta el codigo...
Código
  1. //Cuarto Programa de funciones
  2. #include <stdio.h>
  3. #include <conio.h>
  4. #include <math.h>
  5. //Prototipos
  6. int menu(void);
  7. int semana(char);
  8. float fun_x(float);
  9. //Programa Principal
  10. void main()
  11. { int opcion;
  12.  char dia;
  13.  float valor;
  14.  
  15.  while((opcion=menu())!=3)
  16.  { switch(opcion)
  17.    { case 1: clrscr();
  18.              printf("\n\nDebe ingresar las letras en minuscula, a excepcion del dia miercoles en\n donde debes ingrasarla en mayuscula");
  19.              printf("\nIngrese la primera letra del dia de la semana: ");
  20.              scanf(" %c",&dia);
  21.              printf("\nEl dia de la semana que le corresponde es el %d",semana(dia));
  22.              getch();
  23.              break;
  24.      case 2: clrscr();
  25.              do
  26.              { printf("\nIngrese el valor de X: ");
  27.                scanf("%f",&valor);
  28.                if(valor!=(-1/2) || valor>1)
  29.                { printf("debe ingresar un valor menor a 1 y diferente de -1/2");
  30.                  getch();
  31.                }
  32.              }while(valor!=(-1/2) || valor>1);
  33.              printf("\n\nEl valor de la funcion es de %.2f",fun_x(valor));
  34.              getch();
  35.              break;
  36.    }
  37.  }
  38. }
  39. //Funciones
  40. int menu(void)
  41. { int opc;
  42.  clrscr();
  43.  printf("\t\t\tMENU");
  44.  printf("\n1...Para los dias de la semana");
  45.  printf("\n2...Para calcular el valor de una funcion");
  46.  printf("\n3...SALIR");
  47.  do
  48.  { printf("\n\nIngrese su opcion y presione enter: ");
  49.    scanf("%d",&opc);
  50.    if(opc<1 || opc>3)
  51.    { printf("\nHa ingresado un valor incorrecto!!!");
  52.      getch();
  53.    }
  54.  }while(opc<1 || opc>3);
  55.  return opc;
  56. }
  57.  
  58. int semana(char fdia)
  59. { int fndia;
  60.  switch(fdia)
  61.  { case 'd': fndia=1;
  62.              break;
  63.    case 'l': fndia=2;
  64.              break;
  65.    case 'm': fndia=3;
  66.              break;
  67.    case 'M': fndia=4;
  68.              break;
  69.    case 'j': fndia=5;
  70.              break;
  71.    case 'v': fndia=6;
  72.              break;
  73.    case 's': fndia=7;
  74.              break;
  75.  }
  76. return fndia;
  77. }
  78.  
  79. float fun_x(float fx)
  80. { float fresul;
  81.  
  82.  fresul=pow(fx,(2*fx+1))-5*pow(M_E,(3*log10(fabs(sqrt(1-fx)))));
  83.  return fresul;
  84. }
  85.  

PD: esta bien que en los codigos utilize quebrados(fracciones), o debería utilizar decimales, lo digo en el caso de la segunda funcion en donde debo validar el valor ingresado por el usuario
En línea

pacoperico

Desconectado Desconectado

Mensajes: 100


Ver Perfil
Re: Problema con una funcion
« Respuesta #8 en: 9 Mayo 2013, 03:20 am »

mi pregunta, ¿Hacen la misma funcion?¿y que diferencia hay en colocar un fflush(stdin) y un fflush(stdout). Yo pues la verdad, me gusta experimentar metiendo codigos y ver como interactuan, pero la verdad esque no veo que me altere ni me modifique el programa si las utilizo o no...

Podemos pensar a priori que fflush(stdin) limpia el buffer de entrada del stdin (teclado) ya que por su parte fflush(stdout) limpia el buffer de salida enviandolo al stdout (pantalla), pero no es asi ya que fflush(stdin) no esta definido en el estandar y su comportamiento es algo totalmente imprevisible. En la chincheta de este foro lo explican mas detalladamente:
http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html

PD: esta bien que en los codigos utilize quebrados(fracciones), o debería utilizar decimales, lo digo en el caso de la segunda funcion en donde debo validar el valor ingresado por el usuario

Ese -1/2 que tienes en tu codigo, el lenguaje C lo interpreta como una division entre dos numeros enteros (tipo int) y su resultado debera ser un numero entero (de tipo int). Si el resultado de la operacion matematica contiene decimales C lo redondea para convertirlo en un numero entero. En este caso el lenguaje C  transforma tu -1/2 a 0. Esto lo puedes comprobar facilmente:
Código
  1.  if(0 == (-1/2))
  2.  printf("cierto");
  3.  else
  4.  printf("falso");

Lo mas sencillo seria que cambiases el -1/2 por su valor de -0.5. Otra opcion que tambien tienes, seria sustituir esa division entre numeros enteros (tipo int) por una division entre numeros decimales (tipo float), solo has de añadirle una parte decimal es decir, en lugar de escribir -1/2 escribes -1.0/2.0. Para nosotros los humanos -1/2 es lo mismo que -1.0/2.0 pero para el lenguaje C no lo es.


En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: Problema con una funcion
« Respuesta #9 en: 9 Mayo 2013, 10:53 am »

fflus(stdin) solo funciona en Windows. Si quieres que tu código sea multiplataforma debes usar otras alternativas.

Francamente, me parece vergonsozo que profesores recomienden cosas como esa. El toque de gracia será que también haya recomendado el Devcpp (o peor aún, turbo C xD).

Personalmente, no uses la librería conio. La única función que estás utilizando es getch() y puedes usar getchar() en su lugar (es correcto, la profesora no te va a decir que no). Si te da a elegir, usa el otro método para limpiar el buffer. No solo hay que aprobar sino acostumbrarse a programar bien.
En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
PROBLEMA CON FUNCIÓN CASE:
Programación Visual Basic
CRAB 8 2,676 Último mensaje 3 Septiembre 2005, 21:28 pm
por NYlOn
Problema con la funcion Chr
Programación Visual Basic
sircid 2 1,768 Último mensaje 9 Agosto 2006, 14:50 pm
por sircid
Problema con funcion
Programación C/C++
Caster 3 2,843 Último mensaje 30 Septiembre 2012, 08:59 am
por Caster
Problema con Función.. « 1 2 »
ASM
Vaagish 16 9,544 Último mensaje 22 Mayo 2013, 20:19 pm
por Vaagish
Problema con función en c
Programación C/C++
Gigasnike95 1 1,649 Último mensaje 14 Diciembre 2014, 12:32 pm
por ivancea96
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines