problema con un ciclo do while

Iniciado por diegoalberto_garcia95, 9 Marzo 2013, 07:55 AM

0 Miembros y 1 Visitante están viendo este tema.

diegoalberto_garcia95

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();
              }


amchacon

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:

while(getchar() != '\n' && getchar() != EOF);

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?:
scanf("%[^\n]",nom);

Por otro lado:
gets(nom);

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.
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

#2
Cita de: amchacon en  9 Marzo 2013, 12:27 PM
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:


scanf(" %f",&si);

CitarPor cierto no acabo de entender esto, no hace nada?:

scanf("%[^\n]",nom);


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.



CitarPor otro lado:
gets(nom);

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:

fgets(nom,31,stdin);

Saluditos!. ....

P.D: Además de conio te sobran las librerías math y windows.

leosansan

#3
se colo esto en lugar de reeditar. no sirve


rir3760

Cita de: leosansan en  9 Marzo 2013, 14:04 PMY 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:
scanf(" %[^\n]", nom);

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
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

Cita de: amchacon en  9 Marzo 2013, 12:27 PM
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:

while(getchar() != '\n' && getchar() != EOF);

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?:
scanf("%[^\n]",nom);

Por otro lado:
gets(nom);

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!

diegoalberto_garcia95

Cita de: leosansan en  9 Marzo 2013, 14:04 PM
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:


scanf(" %f",&si);

scanf("%[^\n]",nom);


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:

fgets(nom,31,stdin);

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 ! :D

diegoalberto_garcia95

Cita de: rir3760 en  9 Marzo 2013, 18:51 PM
Correcto. En la primera llamada a scanf hay que cambiar la cadena de formato a:
scanf(" %[^\n]", nom);

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 ! :)