Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: eaguel en 31 Octubre 2012, 20:09 pm



Título: Duda en un ejercicio de programación
Publicado por: eaguel en 31 Octubre 2012, 20:09 pm
Hola, buenas necesito un poco de ayuda a ver si me podéis echar una mano, necesito que hacer un programa en C que  me pida que escriba un número y que me diga a que mes pertenece.
A partir de este código, tengo que hacer que me pida el número hasta que introduzca un 0, he pensado en introducir un while ( mes !=  0) arriba del while de los meses pero no me sale.
¿Algún consejo?
/*
**   Fichero:   estaciones.c
**   Autor:      Departamento de Ingenieria Telematica
**   Fecha:      24-09-2012
**
**   Descripcion:   Determina (aproximadamente) la estacion del año en
**         funcion del numero de mes que se le indique por teclado.
*/

/* Includes del sistema */
#include <stdio.h>

/* Includes de la aplicacion */

/* Constantes del fichero */
#define ERROR        0
#define INVIERNO     1
#define PRIMAVERA    2
#define VERANO       3
#define OTONO         4

#define ENERO         1
#define FEBRERO      2
#define MARZO        3
#define ABRIL        4
#define MAYO         5
#define JUNIO        6
#define JULIO        7
#define AGOSTO        8
#define SEPTIEMBRE   9
#define OCTUBRE     10
#define NOVIEMBRE   11
#define DICIEMBRE   12

/* Tipos definidos por el usuario para el fichero */
/* Prototipo de funciones locales */

int main ()
{
  int mes;
  int estacion;

  printf("Introduzca un mes: ");
  scanf(" %d", &mes);
  while ( mes > DICIEMBRE || mes < ENERO )
   {
    printf ("Introduzca un mes: ");
    scanf (" %d", &mes);
   }
      
  if(DICIEMBRE == mes || ENERO == mes || FEBRERO == mes)
  {
  estacion = INVIERNO;
  }
  else if (MARZO == mes || ABRIL == mes || MAYO == mes)
  {
  estacion = PRIMAVERA;
  }
  else if (JUNIO == mes || JULIO == mes || AGOSTO == mes)
  {
  estacion = VERANO;
  }
  else if(SEPTIEMBRE == mes || OCTUBRE == mes || NOVIEMBRE == mes)
  {
  estacion = OTONO;
  }
  else
  {
  estacion = ERROR;
  }
  printf ("El mes %d pertenece a la estacion %d\n", mes, estacion);

return 0;
}


Título: Re: Duda en un ejercicio de programación
Publicado por: $Edu$ en 31 Octubre 2012, 20:19 pm
Cuando pones:

printf("Introduzca un mes: ");
  scanf(" %d", &mes);
  while ( mes > DICIEMBRE || mes < ENERO )
   {
    printf ("Introduzca un mes: ");
    scanf (" %d", &mes);
   }

Lo haces porque necesitas que se ejecute una vez primero el mensaje no? para eso se usa Do-While, asi se ejecuta siempre una vez y luego si compara si es correcto para volver a preguntar o no. Tambien te aconsejaria que pongas el comando para limpiar la pantalla cada vez que entra al bucle Do-While.

Despues, en vez de hacer tantos "ifs" se usa "Swich" para mejor comodidad y se entendera mejor, busca para ver como aplicarlo.

Programa en papel y lapiz antes siempre asi te salen mejor las cosas.

Se espera la correcion a ver si logras mejorar algunas cosas por lo menos :P Sino preguntas de nuevo que alguien te contestara siempre, saludos!


Título: Re: Duda en un ejercicio de programación
Publicado por: Caster en 31 Octubre 2012, 20:27 pm
Lo que yo he entendido, es que quieres que al introducir 0 en los meses cierre el programa, esto se hace facilmente añadiendo esto despues del scanf que pide el numero del mes:

Código
  1. printf("Introduzca un mes: ");
  2.    scanf(" %d", &mes);
  3.    if (mes == 0) break;
  4.  

Aparte de esto, he metido todo el codigo en un bucle do - while para que al final te pida si quieres volver a hacerlo o finalizar el programa, al final el codigo queda asi:

Código
  1. /*
  2. **   Fichero:   estaciones.c
  3. **   Autor:      Departamento de Ingenieria Telematica
  4. **   Fecha:      24-09-2012
  5. **
  6. **   Descripcion:   Determina (aproximadamente) la estacion del año en
  7. **         funcion del numero de mes que se le indique por teclado.
  8. */
  9.  
  10. /* Includes del sistema */
  11. #include <stdio.h>
  12.  
  13. /* Includes de la aplicacion */
  14.  
  15. /* Constantes del fichero */
  16. #define ERROR        0
  17. #define INVIERNO     1
  18. #define PRIMAVERA    2
  19. #define VERANO       3
  20. #define OTONO         4
  21.  
  22. #define ENERO         1
  23. #define FEBRERO      2
  24. #define MARZO        3
  25. #define ABRIL        4
  26. #define MAYO         5
  27. #define JUNIO        6
  28. #define JULIO        7
  29. #define AGOSTO        8
  30. #define SEPTIEMBRE   9
  31. #define OCTUBRE     10
  32. #define NOVIEMBRE   11
  33. #define DICIEMBRE   12
  34.  
  35. /* Tipos definidos por el usuario para el fichero */
  36. /* Prototipo de funciones locales */
  37.  
  38. int main ()
  39. {
  40.  int mes;
  41.  int estacion;
  42.  int opcion;
  43.  
  44.  do
  45.  {
  46.    printf("Introduzca un mes: ");
  47.    scanf(" %d", &mes);
  48.    if (mes == 0) break;
  49.  
  50.  
  51.    if(DICIEMBRE == mes || ENERO == mes || FEBRERO == mes)
  52.    {
  53.    estacion = INVIERNO;
  54.    }
  55.    else if (MARZO == mes || ABRIL == mes || MAYO == mes)
  56.    {
  57.    estacion = PRIMAVERA;
  58.    }
  59.    else if (JUNIO == mes || JULIO == mes || AGOSTO == mes)
  60.    {
  61.    estacion = VERANO;
  62.    }
  63.    else if(SEPTIEMBRE == mes || OCTUBRE == mes || NOVIEMBRE == mes)
  64.    {
  65.    estacion = OTONO;
  66.    }
  67.    else
  68.    {
  69.    estacion = ERROR;
  70.    }
  71.    printf ("El mes %d pertenece a la estacion %d\n", mes, estacion);
  72.    printf("Pulse cualquier letra para volver al inicio, pulse 0 para terminar el programa\n");
  73.    scanf("%d", &opcion);
  74.  
  75.  }while (opcion != 0);
  76.  
  77. return 0;
  78. }

Tambien te recomendaria que cambiases todos los if por un switch, es mas como y mas facil de entender.

Saludos

P.D: Advertencia - mientras estabas escribiendo, una nueva respuesta fue publicada. Probablemente desees revisar tu mensaje.


Título: Re: Duda en un ejercicio de programación
Publicado por: eaguel en 31 Octubre 2012, 21:05 pm
el problema es que no puedo usar ni break ni Swich porque es para clase probare lo del do while


Título: Re: Duda en un ejercicio de programación
Publicado por: eaguel en 31 Octubre 2012, 21:41 pm
Perdonar que siga dando el tostón pero estoy muy jodido  :huh:   a ver ahora, utilizando tu consejo  Caster, consigo que me diga la estación a la que pertenece el mes y que si pulso 0 se cierra el programa pero ahora lo que no consigo hacer es que cuando introduzca un mes incorrecto no lo procese, y ahora me dice: " el mes x pertenece a la estación 0"
Pego aquí el codigo:
/*
**   Fichero:   estaciones.c
**   Autor:      Departamento de Ingenieria Telematica
**   Fecha:      24-09-2012
**
**   Descripcion:   Determina (aproximadamente) la estacion del año en
**         funcion del numero de mes que se le indique por teclado.
*/
 
/* Includes del sistema */
#include <stdio.h>
 
/* Includes de la aplicacion */
 
/* Constantes del fichero */
#define ERROR        0
#define INVIERNO    1
#define PRIMAVERA 2
#define VERANO       3
#define OTONO         4
 
#define ENERO         1
#define FEBRERO     2
#define MARZO         3
#define ABRIL            4
#define MAYO            5
#define JUNIO            6
#define JULIO             7
#define AGOSTO        8
#define SEPTIEMBRE   9
#define OCTUBRE     10
#define NOVIEMBRE   11
#define DICIEMBRE   12
 
/* Tipos definidos por el usuario para el fichero */
/* Prototipo de funciones locales */
 
int main ()
{
  int mes;
  int estacion;
 
  do
  {
    printf("Introduzca un mes: ");
    scanf(" %d", &mes);
    while (mes == 0)
     {
      return 0;
     }
 
 
    if(DICIEMBRE == mes || ENERO == mes || FEBRERO == mes)
    {
    estacion = INVIERNO;
    }
    else if (MARZO == mes || ABRIL == mes || MAYO == mes)
    {
    estacion = PRIMAVERA;
    }
    else if (JUNIO == mes || JULIO == mes || AGOSTO == mes)
    {
    estacion = VERANO;
    }
    else if(SEPTIEMBRE == mes || OCTUBRE == mes || NOVIEMBRE == mes)
    {
    estacion = OTONO;
    }
    else
    {
    estacion = ERROR;
    }
    printf ("El mes %d pertenece a la estacion %d\n", mes, estacion);
   
   
 
  }while (mes != 0);
 
return 0;
}


Título: Re: Duda en un ejercicio de programación
Publicado por: eaguel en 31 Octubre 2012, 22:01 pm
Por fiin, muchas gracias a todos los que habéis contestado por fin me ha salido no se hasta que punto es correcto el return 0 ese que he puesto por hay en medio pero funcionar el programa funciona.
Ya mañana indagare que llevo desde las 5 con el puto programa.
Os pego como lo he dejado al final.
/*
**   Fichero:   estaciones.c
**   Autor:      Departamento de Ingenieria Telematica
**   Fecha:      24-09-2012
**
**   Descripcion:   Determina (aproximadamente) la estacion del año en
**         funcion del numero de mes que se le indique por teclado.
*/
 
/* Includes del sistema */
#include <stdio.h>
 
/* Includes de la aplicacion */
 
/* Constantes del fichero */
#define ERROR        0
#define INVIERNO     1
#define PRIMAVERA    2
#define VERANO       3
#define OTONO        4
 
#define ENERO        1
#define FEBRERO      2
#define MARZO        3
#define ABRIL        4
#define MAYO         5
#define JUNIO        6
#define JULIO        7
#define AGOSTO       8
#define SEPTIEMBRE   9
#define OCTUBRE     10
#define NOVIEMBRE   11
#define DICIEMBRE   12
 
/* Tipos definidos por el usuario para el fichero */
/* Prototipo de funciones locales */
 
int main ()
{
  int mes;
  int estacion;
 
  do
  {
    printf("Introduzca un mes: ");
    scanf(" %d", &mes);
    while (mes == 0)
     {
      return 0;
     }
 
     {
      while ( mes < ENERO || mes > DICIEMBRE )
      {
       printf ("Introduzca un mes: ");
       scanf (" %d", &mes);
      }
     }
    if(DICIEMBRE == mes || ENERO == mes || FEBRERO == mes)
    {
    estacion = INVIERNO;
    }
    else if (MARZO == mes || ABRIL == mes || MAYO == mes)
    {
    estacion = PRIMAVERA;
    }
    else if (JUNIO == mes || JULIO == mes || AGOSTO == mes)
    {
    estacion = VERANO;
    }
    else if(SEPTIEMBRE == mes || OCTUBRE == mes || NOVIEMBRE == mes)
    {
    estacion = OTONO;
    }
    else
    {
    estacion = ERROR;
    }
    printf ("El mes %d pertenece a la estacion %d\n", mes, estacion);
   
   
 
  }while (mes != 0);
 
return 0;
}


Título: Re: Duda en un ejercicio de programación
Publicado por: Caster en 31 Octubre 2012, 23:57 pm
Si, el codigo funciona, el uso de return 0 en medio del programa nose si es correcto, supongo que si, pero el bucle while que contiene return 0, no tiene sentido que sea un bucle, porque esa sentencia termina el programa, entonces solo se ejecutara una vez, lo mas logico seria con un if, cambia esto:

Código
  1. while (mes == 0)
  2.     {
  3.      return 0;
  4.     }

Por esto:

Código
  1. if (mes == 0) return 0;

Saludos


Título: Re: Duda en un ejercicio de programación
Publicado por: DickGumshoe en 1 Noviembre 2012, 00:10 am
Si, el codigo funciona, el uso de return 0 en medio del programa nose si es correcto, supongo que si, pero el bucle while que contiene return 0, no tiene sentido que sea un bucle, porque esa sentencia termina el programa, entonces solo se ejecutara una vez, lo mas logico seria con un if, cambia esto:

Código
  1. while (mes == 0)
  2.     {
  3.      return 0;
  4.     }

Por esto:

Código
  1. if (mes == 0) return 0;

Saludos


Normalmente se devuelve 0 cuando el programa termina correctamente u otro número si hay un error. Con el return 0 funcionará, pero como técnica sería mejor poner otro número (normalmente 1 o -1).

Saludos.


Título: Re: Duda en un ejercicio de programación
Publicado por: BatchianoISpyxolo en 1 Noviembre 2012, 00:12 am
Si, el codigo funciona, el uso de return 0 en medio del programa nose si es correcto, supongo que si, pero el bucle while que contiene return 0, no tiene sentido que sea un bucle, porque esa sentencia termina el programa, entonces solo se ejecutara una vez, lo mas logico seria con un if, cambia esto:

Código
  1. while (mes == 0)
  2.     {
  3.      return 0;
  4.     }

Por esto:

Código
  1. if (mes == 0) return 0;

Saludos

No he leído el código pero además si dentro del while no tuviera una instrucción que modificara la variable de control del bucle, este se iría a infinito. Porque tiene return y termina la ejecución de la función que si no... Catapún xD

Por cierto:
Código
  1. if (mes == 0) return 0;

Es una redundancia, lo lógico sería escribir:

Código
  1. return mes

Por otra parte, dejas el return en una bifurcación, que puede ser tomada o no. Problema avistado xD

¡Saludetes!


Título: Re: Duda en un ejercicio de programación
Publicado por: eaguel en 1 Noviembre 2012, 08:26 am
Muchas gracias por todos vuestros consejos, me habéis salvado el culo, al final lo he dejado cambiando el while ese del principio por un if, como ha dicho Caster pero el return 0; no lo puedo quitar, si lo cambio por un 1 o -1 , como habéis dicho, cuando escribo 0 no termina y si pongo return mes tampoco.


Título: Re: Duda en un ejercicio de programación
Publicado por: Caster en 1 Noviembre 2012, 09:22 am

Normalmente se devuelve 0 cuando el programa termina correctamente u otro número si hay un error. Con el return 0 funcionará, pero como técnica sería mejor poner otro número (normalmente 1 o -1).

Saludos.

Pero si no pones 0, el programa no termina, y lo que esta tratando de buscar eaguel es que el programa se cierre.

No he leído el código pero además si dentro del while no tuviera una instrucción que modificara la variable de control del bucle, este se iría a infinito. Porque tiene return y termina la ejecución de la función que si no... Catapún xD

Por cierto:
Código
  1. if (mes == 0) return 0;

Es una redundancia, lo lógico sería escribir:

Código
  1. return mes

Por otra parte, dejas el return en una bifurcación, que puede ser tomada o no. Problema avistado xD

¡Saludetes!

Sera una redundancia, pero si pones return mes el programa no se cierra, y el return 0 esta puesto para que se cierre si introduces el numero 0, lo que no entiendo es lo de la bifurcacion, el return 0 solo se ejecutara si introduces el numero 0, y despues el otro return 0 si la ejecucion del programa es correcta, no hay mas.

Saludos


Título: Re: Duda en un ejercicio de programación
Publicado por: BatchianoISpyxolo en 1 Noviembre 2012, 12:41 pm
Pero si no pones 0, el programa no termina, y lo que esta tratando de buscar eaguel es que el programa se cierre.

Sera una redundancia, pero si pones return mes el programa no se cierra, y el return 0 esta puesto para que se cierre si introduces el numero 0, lo que no entiendo es lo de la bifurcacion, el return 0 solo se ejecutara si introduces el numero 0, y despues el otro return 0 si la ejecucion del programa es correcta, no hay mas.

Saludos

Disculpa, eso pasa cuando no lees los códigos xD.

Otra cosa, el do while va a terminar cuando mes sea igual a 0... Pero dentro de ese ciclo tienes otro ciclo que verifique que introduces números entre 1 y 12 para mes... Nunca va a terminar...

Código
  1. while (mes < ENERO || mes > DICIEMBRE) {..}

Ahí pides un número entre 1 y 12 para mes... Por tanto al llegar al final del do while, mes nunca será 0.

Si lo colocas así ya va a funcionar como quieres:

Código
  1. while ((mes < ENERO-1) || mes > DICIEMBRE) {..}


Título: Re: Duda en un ejercicio de programación
Publicado por: Caster en 1 Noviembre 2012, 13:15 pm
Disculpa, eso pasa cuando no lees los códigos xD.

Otra cosa, el do while va a terminar cuando mes sea igual a 0... Pero dentro de ese ciclo tienes otro ciclo que verifique que introduces números entre 1 y 12 para mes... Nunca va a terminar...

Código
  1. while (mes < ENERO || mes > DICIEMBRE) {..}

Ahí pides un número entre 1 y 12 para mes... Por tanto al llegar al final del do while, mes nunca será 0.

Si lo colocas ahí ya va a funcionar como quieres:

Código
  1. while ((mes < ENERO-1) || mes > DICIEMBRE) {..}

Ahi si que tienes razon, si la primera vez introduces un mes incorrecto, despues ya no saldria del bucle, con tu solucion es suficiente.

Saludos


Título: Re: Duda en un ejercicio de programación
Publicado por: eaguel en 1 Noviembre 2012, 13:44 pm
Tenéis razón si introduzco un número raro antes de uno correcto ya no se corta con el 0, lo he corregido introduciendo otra vez el if ese del principio dentro del bucle.


Título: Re: Duda en un ejercicio de programación
Publicado por: Caster en 1 Noviembre 2012, 13:46 pm
Tenéis razón si introduzco un número raro antes de uno correcto ya no se corta con el 0, lo he corregido introduciendo otra vez el if ese del principio dentro del bucle.

No tienes porque poner dos veces el if, lee la solucion que te ha dejado BatchianoISpyxolo mas arriba.

Saludos


Título: Re: Duda en un ejercicio de programación
Publicado por: eaguel en 1 Noviembre 2012, 13:56 pm
Si, es cierto, muchas gracias a los dos por todo, estaba bastante jodido con el puto ejercicio.