Autor
|
Tema: Problema con una funcion (Leído 4,390 veces)
|
ThronerAXE
Desconectado
Mensajes: 27
|
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: //Ultimo Programa de funciones #include <stdio.h> #include <conio.h> //Prototipos int menu(void); int semana(char); //Programa Principal void main() { int opcion; char dia; float valor; while((opcion=menu())!=2) { switch(opcion) { case 1: clrscr(); printf("\nIngrese la inicial del dia: "); printf("\nEl dia de la semana que le corresponde es el %d",semana (dia )); break; } } } //Funciones int menu(void) { int opc; clrscr(); printf("\n1...Para los dias de la semana"); do { printf("\n\nIngrese su opcion y presione enter: "); if(opc<1 || opc>2) { printf("\nHa ingresado un valor incorrecto!!!"); } }while(opc<1 || opc>2); return opc; } int semana(char fdia) { int fndia; switch(fdia) { case 'd': fndia=1; break; case 'l': fndia=2; break; case 'm': fndia=3; break; case 'M': fndia=4; break; case 'j': fndia=5; break; case 'v': fndia=6; break; case 's': fndia=7; break; } return fndia; }
|
|
|
En línea
|
|
|
|
leosansan
Desconectado
Mensajes: 1.314
|
Problema con el buffer, que en este caso se soluciona dejando un espacio en blanco en los scanf. Esto me da como salida: MENU 1...Para los dias de la semana 2...SALIR Ingrese su opcion y presione enter: 1 Ingrese la inicial del dia: s El dia de la semana que le corresponde es el 7 MENU 1...Para los dias de la semana 2...SALIR Ingrese su opcion y presione enter: 1 Ingrese la inicial del dia: d El dia de la semana que le corresponde es el 1 MENU 1...Para los dias de la semana 2...SALIR
Y el código con los espacios puestos://Ultimo Programa de funciones #include <stdio.h> #include <conio.h> //Prototipos int menu(void); int semana(char); //Programa Principal int main() { int opcion; char dia; float valor; while((opcion=menu())!=2) { switch(opcion) { case 1: clrscr(); printf("\nIngrese la inicial del dia: "); scanf(" %c",&dia); printf("\nEl dia de la semana que le corresponde es el %d",semana(dia)); break; } return 0; } } //Funciones int menu(void) { int opc; clrscr(); printf("\t\t\tMENU"); printf("\n1...Para los dias de la semana"); printf("\n2...SALIR"); do { printf("\n\nIngrese su opcion y presione enter: "); scanf(" %d",&opc); if(opc<1 || opc>2) { printf("\nHa ingresado un valor incorrecto!!!"); getch(); } }while(opc<1 || opc>2); return opc; } int semana(char fdia) { int fndia; switch(fdia) { case 'd': fndia=1; break; case 'l': fndia=2; break; case 'm': fndia=3; break; case 'M': fndia=4; break; case 'j': fndia=5; break; case 'v': fndia=6; break; case 's': fndia=7; break; } return fndia; }
Saluditos!. ....
|
|
« Última modificación: 8 Mayo 2013, 19:39 pm por leosansan »
|
En línea
|
|
|
|
pacoperico
Desconectado
Mensajes: 100
|
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(): 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. #include <stdio.h> #include <stdlib.h> //Prototipos int menu(void); int semana(char); //Programa Principal int main() { int opcion; char dia; while((opcion=menu())!=2) { printf("\nIngrese la inicial del dia: "); printf("\nEl dia de la semana que le corresponde es el %d\n",semana (dia )); } return 0; } //Funciones int menu(void) { int opc; printf("\n1...Para los dias de la semana"); do { printf("\n\nIngrese su opcion y presione enter: "); while(getchar()!='\n'); //limpieza del buffer del stdin if(opc<1 || opc>2) { printf("\nHa ingresado un valor incorrecto!!!"); } }while(opc<1 || opc>2); return opc; } int semana(char fdia) { int fndia = 0; switch(fdia) { case 'd': fndia=1; break; case 'l': fndia=2; break; case 'm': fndia=3; break; case 'M': fndia=4; break; case 'j': fndia=5; break; case 'v': fndia=6; break; case 's': fndia=7; break; } return fndia; }
|
|
|
En línea
|
|
|
|
leosansan
Desconectado
Mensajes: 1.314
|
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(): 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
Mensajes: 100
|
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: while(getchar()!='\n');
Al codigo pero bueno, yo nunca dejare de usarlo xD.
|
|
|
En línea
|
|
|
|
amchacon
Desconectado
Mensajes: 1.211
|
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
|
|
|
|
leosansan
Desconectado
Mensajes: 1.314
|
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
Mensajes: 27
|
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...
La profesora nos ha dicho sobre este codigo que limpia el buffer tambien...
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... //Cuarto Programa de funciones #include <stdio.h> #include <conio.h> #include <math.h> //Prototipos int menu(void); int semana(char); float fun_x(float); //Programa Principal void main() { int opcion; char dia; float valor; while((opcion=menu())!=3) { switch(opcion) { case 1: clrscr(); printf("\n\nDebe ingresar las letras en minuscula, a excepcion del dia miercoles en\n donde debes ingrasarla en mayuscula"); printf("\nIngrese la primera letra del dia de la semana: "); printf("\nEl dia de la semana que le corresponde es el %d",semana (dia )); break; case 2: clrscr(); do { printf("\nIngrese el valor de X: "); if(valor!=(-1/2) || valor>1) { printf("debe ingresar un valor menor a 1 y diferente de -1/2"); } }while(valor!=(-1/2) || valor>1); printf("\n\nEl valor de la funcion es de %.2f",fun_x (valor )); break; } } } //Funciones int menu(void) { int opc; clrscr(); printf("\n1...Para los dias de la semana"); printf("\n2...Para calcular el valor de una funcion"); do { printf("\n\nIngrese su opcion y presione enter: "); if(opc<1 || opc>3) { printf("\nHa ingresado un valor incorrecto!!!"); } }while(opc<1 || opc>3); return opc; } int semana(char fdia) { int fndia; switch(fdia) { case 'd': fndia=1; break; case 'l': fndia=2; break; case 'm': fndia=3; break; case 'M': fndia=4; break; case 'j': fndia=5; break; case 'v': fndia=6; break; case 's': fndia=7; break; } return fndia; } float fun_x(float fx) { float fresul; return fresul; }
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
Mensajes: 100
|
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.htmlPD: 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: if(0 == (-1/2)) printf("cierto"); else 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
Mensajes: 1.211
|
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
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
PROBLEMA CON FUNCIÓN CASE:
Programación Visual Basic
|
CRAB
|
8
|
2,692
|
3 Septiembre 2005, 21:28 pm
por NYlOn
|
|
|
Problema con la funcion Chr
Programación Visual Basic
|
sircid
|
2
|
1,773
|
9 Agosto 2006, 14:50 pm
por sircid
|
|
|
Problema con funcion
Programación C/C++
|
Caster
|
3
|
2,859
|
30 Septiembre 2012, 08:59 am
por Caster
|
|
|
Problema con Función..
« 1 2 »
ASM
|
Vaagish
|
16
|
9,579
|
22 Mayo 2013, 20:19 pm
por Vaagish
|
|
|
Problema con función en c
Programación C/C++
|
Gigasnike95
|
1
|
1,654
|
14 Diciembre 2014, 12:32 pm
por ivancea96
|
|