Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: diegoalberto_garcia95 en 9 Marzo 2013, 07:55 am



Título: problema con un ciclo do while
Publicado por: diegoalberto_garcia95 en 9 Marzo 2013, 07:55 am
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

Código:
#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();
               }


Título: Re: problema con un ciclo do while
Publicado por: 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:

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

Por otro lado:
Código
  1. 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.


Título: Re: problema con un ciclo do while
Publicado por: leosansan en 9 Marzo 2013, 14:04 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:


Código:
scanf(" %f",&si);

Citar
Por cierto no acabo de entender esto, no hace nada?:

Código
  1. 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.



Citar
Por otro lado:
Código
  1. 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:

Código:
fgets(nom,31,stdin);

Saluditos!. ....(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)

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


Título: Re: problema con un ciclo do while
Publicado por: leosansan en 9 Marzo 2013, 14:09 pm
se colo esto en lugar de reeditar. no sirve

(http://www.planetsmilies.com/avatars/simpsons/simpsons0015.gif)


Título: Re: problema con un ciclo do while
Publicado por: rir3760 en 9 Marzo 2013, 18:51 pm
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:
Código
  1. 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


Título: Re: problema con un ciclo do while
Publicado por: diegoalberto_garcia95 en 10 Marzo 2013, 22:57 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:

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

Por otro lado:
Código
  1. 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!


Título: Re: problema con un ciclo do while
Publicado por: diegoalberto_garcia95 en 10 Marzo 2013, 23:00 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:


Código:
scanf(" %f",&si);

Código
  1. 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:

Código:
fgets(nom,31,stdin);

Saluditos!. ....(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)

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


Título: Re: problema con un ciclo do while
Publicado por: diegoalberto_garcia95 en 10 Marzo 2013, 23:00 pm
Correcto. En la primera llamada a scanf hay que cambiar la cadena de formato a:
Código
  1. 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 ! :)