Autor
|
Tema: problema con un ciclo do while (Leído 4,317 veces)
|
diegoalberto_garcia95
Desconectado
Mensajes: 4
|
buenas tardes/dias/noches amigos, veran tengo un problema , ya lo he buscado en google , y tambien en mi manual escolar de programacion pero no logro encontrar que es lo que esta mal, lo que pasa es que en el programa mencionado despues de realizar todos los procesos que estan dentro del do , al ponerle que los repita usando while, el printf que dice " ingrese nombre del maestro" solo funciona la primera vez que el programa es ejecutado, ya cuando se le indica que se quiere repetir el proceso no me aparece para ingresar dicho "nombre del maestro" y se queda guardado el que use anteriormente,incluso en lugar de usar "ifs" volvi a realizar el programa usando "switch" y me seguia ocurriendo lo mismo,les dejo el codigo a continuacion para ver si me podrian hechar una mano, gracias de antemano #include<stdio.h> #include<math.h> #include<conio.h> #include<windows.h> main() { int niv,i,c,u,d,t,ct; char nom[30]; float si,sf ; i=0; c=0; u=0; d=0; t=0; ct=0; system ("cls"); do { system("cls"); c++; printf("nombre del maestro: "); scanf("%[^\n]",nom); gets(nom); printf("ingrese salario inicial: "); scanf("%f",&si); printf("ingrese nivel (1,2,3,4) "); scanf("%d",&niv); if(niv==1) { sf=si*1.035; u++; } else { if (niv==2) { sf=si*1.041; d++; } else { if (niv==3) { sf=si*1.048; t++; } else { if (niv==4) { sf=si*1.053; ct++; } else { } } } } printf("\n el salario final del maestro %ld sera de: %.2f",nom,sf); printf("\n desea repetir el proceso? 1. si 2. no"); scanf("%d",&i); } while(i==1); printf("\n el numero de maestros analizados es de: %d",c); printf("\n el numero de maestros con nivel uno es de: %d",u); printf("\n el numero de maestros con nivel dos es de: %d",d); printf("\n el numero de maestros con nivel tres es de: %d",t); printf("\n el numero de maestros con nivel cuatro es de: %d",ct); getche(); }
|
|
« Última modificación: 9 Marzo 2013, 09:01 am por diegoalberto_garcia95 »
|
En línea
|
|
|
|
amchacon
Desconectado
Mensajes: 1.211
|
Cambia de manual, cualquier manual que icentive el uso de conio y de void main denota la poca habilidad del autor. El error que ocurre es algo frecuente en las entradas en C (menos mal que yo me pasé a C++). Lo normal es que los datos se lean enteros pero a veces se cuela basurilla... Prueba poner esto después del ultimo scanf:
Lo que hace es forzar a que se eliminen todos los caracteres extraños hasta el ultimo enter (\n). Por seguridad también he puesto el caso de EOF (si se nos agotará el buffer). Por cierto no acabo de entender esto, no hace nada?:
Por otro lado:
Mucho cuidado con gets, si insertas un texto mayor que la variable char (en este caso 30) podría dar lugar a errores extraños... De hecho no se recomienda usar esa función. Además main debería ser int main (lo dice el estándar de C) y devolver con return 0; al final. PD: Un consejo, yo no empezaría con C sino que me iría a C++... Hay muchas más funciones, herramientas y menos limitaciones... Además cuando ya lleves un buen nivel, podrás empezar con la programación orientada a objetos sin problemas.
|
|
|
En línea
|
|
|
|
leosansan
Desconectado
Mensajes: 1.314
|
Cambia de manual, cualquier manual que icentive el uso de conio y de void main denota la poca habilidad del autor.
El error que ocurre es algo frecuente en las entradas en C (menos mal que yo me pasé a C++). Lo normal es que los datos se lean enteros pero a veces se cuela basurilla... Prueba poner esto después del ultimo scanf: .......................................... PD: Un consejo, yo no empezaría con C sino que me iría a C++... Hay muchas más funciones, herramientas y menos limitaciones... Además cuando ya lleves un buen nivel, podrás empezar con la programación orientada a objetos sin problemas.
Es como ser del Atlético de Madrid se es porque se es. Si es por eso y por la comodidad de tener más funciones "a mano" mejor te pasas a Pyttho, Ruby o el mismo basic. Sé que es más "duro" tener que implementar uno mismo ciertas funciones que da ya hechas el C++ pero eso "curte" como programador y como dije es como ser del Atleti.
Y en este caso la "basurilla" se elimina dejando simplemente un espacioen blanco en los scanf, tipo:Por cierto no acabo de entender esto, no hace nada?:
Es un formato del scanf, cosas del bendito C, que permite entrar una cadena con espacios en blanco, aunque debería indicar con un número la cantidad de carateres a tomar. Haría la misma función de esa manera que fgets.
Por otro lado:
Mucho cuidado con gets, si insertas un texto mayor que la variable char (en este caso 30) podría dar lugar a errores extraños... De hecho no se recomienda usar esa función. Es más aconsejable, como bien dice amchacon, el uso de fgets:Saluditos!. .... P.D: Además de conio te sobran las librerías math y windows.
|
|
« Última modificación: 9 Marzo 2013, 23:22 pm por leosansan »
|
En línea
|
|
|
|
leosansan
Desconectado
Mensajes: 1.314
|
se colo esto en lugar de reeditar. no sirve
|
|
« Última modificación: 9 Marzo 2013, 14:29 pm por leosansan »
|
En línea
|
|
|
|
rir3760
Desconectado
Mensajes: 1.639
|
Y en este caso la "basurilla" se elimina dejando simplemente un espacioen blanco en los scanf Correcto. En la primera llamada a scanf hay que cambiar la cadena de formato a:
Con las otras dos llamadas no es necesario porque cuando se utilizan los especificadores de formato "%d", "%f", etc. lo primero que hace scanf es descartar el espacio blanco (las únicas excepciones son "%c" y "%[]"). Un saludo
|
|
|
En línea
|
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly. -- Kernighan & Ritchie, The C programming language
|
|
|
diegoalberto_garcia95
Desconectado
Mensajes: 4
|
Cambia de manual, cualquier manual que icentive el uso de conio y de void main denota la poca habilidad del autor. El error que ocurre es algo frecuente en las entradas en C (menos mal que yo me pasé a C++). Lo normal es que los datos se lean enteros pero a veces se cuela basurilla... Prueba poner esto después del ultimo scanf:
Lo que hace es forzar a que se eliminen todos los caracteres extraños hasta el ultimo enter (\n). Por seguridad también he puesto el caso de EOF (si se nos agotará el buffer). Por cierto no acabo de entender esto, no hace nada?:
Por otro lado:
Mucho cuidado con gets, si insertas un texto mayor que la variable char (en este caso 30) podría dar lugar a errores extraños... De hecho no se recomienda usar esa función. Además main debería ser int main (lo dice el estándar de C) y devolver con return 0; al final. PD: Un consejo, yo no empezaría con C sino que me iría a C++... Hay muchas más funciones, herramientas y menos limitaciones... Además cuando ya lleves un buen nivel, podrás empezar con la programación orientada a objetos sin problemas. el lenguaje que estoy usando si es c++, perdona por no haber especificado al principio , y si , tendre cuidado con gets, muchas gracias!
|
|
|
En línea
|
|
|
|
diegoalberto_garcia95
Desconectado
Mensajes: 4
|
Es como ser del Atlético de Madrid se es porque se es. Si es por eso y por la comodidad de tener más funciones "a mano" mejor te pasas a Pyttho, Ruby o el mismo basic. Sé que es más "duro" tener que implementar uno mismo ciertas funciones que da ya hechas el C++ pero eso "curte" como programador y como dije es como ser del Atleti.
Y en este caso la "basurilla" se elimina dejando simplemente un espacioen blanco en los scanf, tipo:
Es un formato del scanf, cosas del bendito C, que permite entrar una cadena con espacios en blanco, aunque debería indicar con un número la cantidad de carateres a tomar. Haría la misma función de esa manera que fgets. Es más aconsejable, como bien dice amchacon, el uso de fgets:Saluditos!. .... P.D: Además de conio te sobran las librerías math y windows. muchas gracias! si era el espacio que no estaba dejando, lo puse y ya funciono !
|
|
|
En línea
|
|
|
|
diegoalberto_garcia95
Desconectado
Mensajes: 4
|
Correcto. En la primera llamada a scanf hay que cambiar la cadena de formato a:
Con las otras dos llamadas no es necesario porque cuando se utilizan los especificadores de formato "%d", "%f", etc. lo primero que hace scanf es descartar el espacio blanco (las únicas excepciones son "%c" y "%[]"). Un saludo si era ese el problema, muchisimas gracias !
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
¿Pregunta de C++, Ciclo FOR?
Programación C/C++
|
Zodiak98
|
3
|
2,455
|
1 Abril 2013, 17:03 pm
por zonahurbana
|
|
|
ciclo for()
Programación C/C++
|
noah222
|
2
|
6,857
|
18 Abril 2013, 15:23 pm
por rir3760
|
|
|
[Solucionado] Problema en ciclo infinito
Programación C/C++
|
Mario Olivera
|
5
|
2,784
|
26 Julio 2014, 05:10 am
por leosansan
|
|
|
Ciclo Do While anidado que no coge al ciclo interior
Programación Visual Basic
|
Baldomero123
|
1
|
6,974
|
4 Enero 2018, 14:19 pm
por Baldomero123
|
|
|
Problema con ciclo if [Java]
Programación General
|
S4ms3pi0l__
|
2
|
2,973
|
26 Mayo 2018, 16:04 pm
por Fenrir_01
|
|