[ Foro de C ]

¿Usar menos variables?

29-Dec-2010 22:00
Toms Poveda Retamosa
2 Respuestas

Muy buenas a todos, hace no mucho empecé con el curso de programación de nacho cabanes y bueno, he llegado a los arrays y no sé, los ejercicios se me quedan bastante largo. En estos momentos voy por el ejercicio 2 del apartado 5.1.2 de la página 74 y bueno, he conseguido hacer funcionar el programilla correctamente pero he utilizado MUCHÍSIMAS variables y no sé como hacer para utilizar menos variables, sé que se puede pero no sé como xD, aquí os dejo el código (es bastante lioso, por, como ya he dicho, la gran cantidad de variables).


/* Un programa que almacene en una tabla el número de días que tiene cada mes (año
no bisiesto), pida al usuario que le indique un mes (ej. 2 para febrero) y un día (ej. el
día 15) y diga qué número de día es dentro del año (por ejemplo, el 15 de febrero sería
el día número 46, el 31 de diciembre sería el día 365).*/

#include <stdio.h>

main()
{
    int dias[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};    
    int totaldias[12] = {31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365};   .
    int mes, diasmeses, diames, diassobran, totaldia;   
    
do  
    {
    printf ("\nIntroduzca un mes (Ejp. Enero = 1 ... Diciembre = 12): "); 
    scanf ("%d", &mes);
        {
        if ((mes <= 12) && (mes > 0)) 
        {
    --mes; 
    diasmeses = totaldias[mes]; 
        }
        else goto salida;   
        }
    printf ("Ahora introduzca un dia dentro del mes elegido: "); 
    scanf ("%d", &diames);
        {
        if ((diames < dias[mes]+1) && (diames>0)) 
        {
        diassobran = dias[mes] - diames; 
        totaldia = diasmeses - diassobran; 
        printf ("\nEl mes introducido tiene %d dias y en total %d dias de 365 dias.\n", dias[mes], totaldia); 
        }
        else goto salida; 
        }

    }
    while ((mes < 12) && (mes>0));
    salida:
    printf ("\n Has introducido un mes o un dia inexistente!!!! \a\a");



LO SUBO COMO ADJUNTO (Con explicaciones paso a paso de como funciona el programa).

Muchas gracias a todos.




07-Jan-2011 00:31
Nacho Cabanes (+83)

Bienvenido, Tomás.

Perdona el retraso en contestar. Tu programa es razonable, no tiene una cantidad exagerada de variables.

Se podría "optimizar" eliminando alguna variable, si alguno de los cálculos lo haces directamente en el "printf". Por ejemplo, podrías fundir en una sola las líneas

       diassobran = dias[mes] - diames;
       totaldia = diasmeses - diassobran;
       printf ("\nEl mes introducido tiene %d dias y en total %d dias de 365 dias.\n", dias[mes], totaldia);

pero muchas veces eso hará el programa menos legible. Yo soy partidario de no escatimar mucho en el uso de variables.


También se podría hacer alguna mejora en los arrays, pero no en cuanto a la cantidad de variables, sino a la cantidad de valores iniciales: los datos del segundo array se pueden calcular a partir de los datos del primero. Eso complica un poco la lógica del programa, a cambio de que sea más difícil que haya errores de tecleo.


De paso, te regaño: usar "goto" en este caso es totalmente innecesario. Una solución igual, pero algo más legible es emplear "break". Lo ideal sería ni siquiera utilizar "break", sino escribir la condición de forma distinta, para que un simple vistazo a la condición, deje claro cuándo se va a terminar de repetir, en vez deque sea necesario analizar todo el programa, línea por línea.


08-Jan-2011 00:11
Toms Poveda Retamosa

Muy buenas Nacho, por la tardanza no hay problema porque he estado liado estos días con tanatas comidas familiares de Navidad. Ya he cambiado el programa quitándole el goto, la verdad que ahora es bastante más legible.

Sin más, muchas gracias y sigue así aportando tanto.

Un saludo :-)






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)