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

 

 


Tema destacado: Sigue las noticias más importantes de seguridad informática en el Twitter! de elhacker.NET


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

Desconectado Desconectado

Mensajes: 4


Ver Perfil
problema con un ciclo do while
« 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();
               }


« Última modificación: 9 Marzo 2013, 09:01 am por diegoalberto_garcia95 » En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: problema con un ciclo do while
« Respuesta #1 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.


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 un ciclo do while
« Respuesta #2 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!. ....

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 Desconectado

Mensajes: 1.314


Ver Perfil
Re: problema con un ciclo do while
« Respuesta #3 en: 9 Marzo 2013, 14:09 pm »

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 Desconectado

Mensajes: 1.639


Ver Perfil
Re: problema con un ciclo do while
« Respuesta #4 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
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 Desconectado

Mensajes: 4


Ver Perfil
Re: problema con un ciclo do while
« Respuesta #5 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!
En línea

diegoalberto_garcia95

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Re: problema con un ciclo do while
« Respuesta #6 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!. ....

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
En línea

diegoalberto_garcia95

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Re: problema con un ciclo do while
« Respuesta #7 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 ! :)
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
¿Pregunta de C++, Ciclo FOR?
Programación C/C++
Zodiak98 3 2,463 Último mensaje 1 Abril 2013, 17:03 pm
por zonahurbana
ciclo for()
Programación C/C++
noah222 2 6,895 Último mensaje 18 Abril 2013, 15:23 pm
por rir3760
[Solucionado] Problema en ciclo infinito
Programación C/C++
Mario Olivera 5 2,790 Último mensaje 26 Julio 2014, 05:10 am
por leosansan
Ciclo Do While anidado que no coge al ciclo interior
Programación Visual Basic
Baldomero123 1 7,014 Último mensaje 4 Enero 2018, 14:19 pm
por Baldomero123
Problema con ciclo if [Java]
Programación General
S4ms3pi0l__ 2 2,982 Último mensaje 26 Mayo 2018, 16:04 pm
por Fenrir_01
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines