Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: jamatbar en 4 Enero 2014, 16:31 pm



Título: Duda con estructuras en C (Urgente)
Publicado por: jamatbar en 4 Enero 2014, 16:31 pm
Buenas, me han pedido un programa en la facultad en el que ,mediante estructuras, me pida dos fechas y el programa me dice si una fecha es posterior/anterior/igual a otra fecha y si los años son bisiestos o no.

Tengo dos ficheros, el primero es fecha.c que hace la lectura, comprobación, comparación, comprobación si es bisiesto o no,  con el código que me ha quedado así:

Código:
#include <stdio.h>
#include "fecha.h"

struct fecha leeFecha(void)

{

  struct fecha Fech;

    printf("Introduzca la fecha en formato dd/mm/aaaa: ");

    scanf("%d/%d/%d", &Fech.dia, &Fech.mes, &Fech.año);
 

  return Fech;
}


int compruebaFecha(struct fecha *pFecha)
{
  int compru;
//  int dia;
 // int mes;
  int bis;

  {
    if (pFecha->dia < 1 || pFecha->dia > 31)

      compru = 0;

    else if (pFecha->mes < 1 || pFecha->mes > 12)

      compru = 0;

    else if ((pFecha->mes == 4 || pFecha->mes == 6 || pFecha->mes == 9 || pFecha->mes == 11) && (pFecha->dia > 30))

      compru = 0;

    else if (pFecha->mes == 2)

      {
        if ((bis = 1) && (pFecha->dia > 29))

          compru = 0;

        else if ((bis = 0) && (pFecha->dia > 28))

          compru = 0;
      }

    else

      compru = 1;
  }

  return compru;

}


int comparaFecha(struct fecha f1, struct fecha f2)
/* Función comparaFecha, devuelve:
   -1 si fecha1 < fecha2
   0 si fecha1 = fecha2
   1 si fecha1 > fecha2
*/
{
  int compara;

  if (f1.año < f2.año)
    compara = -1;
  else if (f1.año > f2.año)
    compara = 1;
  else
    {
      if (f1.mes < f2.mes)
        compara = -1;
      else if (f1.mes > f2.mes)
        compara = 1;
      else
        {
          if (f1.dia < f2.dia)
            compara = -1;
          else if (f1.dia > f2.dia)
            compara = 1;
          else
            compara = 0;
        }
    }

  return compara;
}



void imprimeFecha(struct fecha f)
{

  printf("%02d/%02d/%d", f.dia, f.mes, f.año);

  return;
}



// Funcion para comprobar si un año es bisiesto:
int esBisiesto(struct fecha f)
{
  int bis = 0;

  // año bisiesto: {divisible por 4 y no por 100} o {divisible por 400}

  if (((f.año % 4 == 0) && (f.año % 100 != 0)) || (f.año % 400 == 0))
    bis = 1;

  return bis;
}

Aquí está el fichero estructura.c que contiene a la función main y usa las funciones de fecha.c


Código:
#include <stdio.h>
#include "fecha.h"

int main()
{
  struct fecha f1;
  struct fecha f2;
  // struct fecha *pf1;
  // struct fecha *pf2;
  int a;
  int compara;
  int bis1;
  int bis2;

  f1 = leeFecha();
  a = compruebaFecha(&f1);

  if (a == 0)
    {
      printf("Formato de fecha incorrecto\n");
    }

  else
    {
      f2 = leeFecha();
      a = compruebaFecha(&f2);

      if (a == 0)
        {
          printf("Formato de fecha incorrecto\n");
        }

      else

        {

          compara = comparaFecha(f1, f2);

/* Imprimir */

          imprimeFecha(f1);
          {
            if (compara > 0)

              printf(" es posterior a ");

            else if (compara == 0)

              printf(" es igual a ");

            else

              printf(" es anterior a ");
          }

          imprimeFecha(f2);

          bis1 = esBisiesto(f1);
          bis2 = esBisiesto(f2);

          {
            if (bis1 == 1 && bis2 == 0)

              printf("\nLa primera fecha es en bisiesto\n");

            else if (bis1 == 0 && bis2 == 1)

              printf("\nLa segunda fecha es en bisiesto\n");

            else if (bis1 == 1 && bis2 == 1)

              printf("\nAmbas fechas son en bisiesto\n");

            else

              printf("\nNinguna de las dos fechas es en bisiesto\n");

          }
        }
    }
  return 0;
}

Y aquí está fecha.h:

Código:
#ifndef FECHA_H
#define FECHA_H

struct fecha {
  int dia;
  int mes;
  int año;
};

#define AMBAS_BISIESTO   "Ambas fechas son en bisiesto\n"
#define PRIMERA_BISIESTO "La primera fecha es en bisiesto\n"
#define SEGUNDA_BISIESTO "La segunda fecha es en bisiesto\n"
#define NINGUNA_BISIESTO "Ninguna de las dos fechas es en bisiesto\n"

struct fecha leeFecha( void );
int compruebaFecha( struct fecha *pFecha );
int comparaFecha( struct fecha f1, struct fecha f2 );
void imprimeFecha( struct fecha f );
int esBisiesto( struct fecha f );

#endif


Pues bien, el programa me funciona perfectamente salvo por un pequeño error que no consigo solucionar, puede ser una tontería pero llevo tanto tiempo haciendo el programa que no lo veo.

En la ejecución, si le pongo las fechas 06/01/1981 y 02/06/1980 me dice:

6/1/1981 es posterior a 2/6/1980
La segunda fecha es en bisiesto

¿Cómo consigo que en vez de 6/1/1981 y 2/6/1980 me ponga 06/01/1981 y 02/06/1980?

Es decir, que no se "coma" esos ceros.

¿Alguna ayuda?, gracias de antemano

Necesito que me de la ejecución tal y como digo por que si no no me lo dan como válido el programa, aunque funcione correctamente

Un saludo!


Título: Re: Duda con estructuras en C (Urgente)
Publicado por: amchacon en 4 Enero 2014, 16:33 pm
Esta línea:
Código
  1. printf("%d/%d/%d", f.dia, f.mes, f.año);

Cámbiala por:

Código
  1. printf("%02d/%02d/%04d", f.dia, f.mes, f.año);


Título: Re: Duda con estructuras en C (Urgente)
Publicado por: rir3760 en 4 Enero 2014, 19:04 pm
Y aquí está el fichero fecha.h:

Código
  1. #ifndef FECHA_H
  2. #define FECHA_H
  3.  
  4. struct fecha {
  5.  int dia;
  6.  int mes;
  7.  int año;
  8. };
  9.  
  10. /* ... */
  11.  
La solución ya la dio amchacon, otra parte a cambiar en el programa es el nombre del campo "año" ya que en C solo son validos (como parte de un identificador) los caracteres del alfabeto ingles (ello excluye a la 'ñ').

Un saludo


Título: Re: Duda con estructuras en C (Urgente)
Publicado por: jamatbar en 4 Enero 2014, 20:08 pm
Muchas gracias, ya está resuelto!


Título: Re: Duda con estructuras en C (Urgente)
Publicado por: dato000 en 4 Enero 2014, 20:22 pm
Vaya, es muy buen programa para fechas la verdad, solo una cosa:

es mejor no usar variables con "ñ" puede que de errores de compilación, o bueno, es solo una sugerencia.

año ---> anyo, es muy recomendable no usar ese tipo de caracteres para lenguajes de programación, verás, estos lenguajes son principalmente basados en habla inglesa, donde no existe este caracter.

slds


Título: Re: Duda con estructuras en C (Urgente)
Publicado por: jamatbar en 4 Enero 2014, 20:35 pm
Respecto a lo de la variable año, yo tengo puesto anyo, pero supongo que por englobar en esta web el código me sale con ñ xD

Me queda una última cosa, que es que cuando le meta las fechas por ejemplo: 29/02/2000 y 29/02/1900 (la primera fecha es correcta ya que el 2000 es un año bisiesto pero el segundo no, ya que el 1900 no es un año bisiesto), entonces tendría que ponerme simplemente el mensaje de "Formato de fecha incorrecto"

Si ahora lo hago me sale el mensaje: 29/02/2000 es posterior a 29/02/1900 La primera fecha es en bisiesto

¿Alguna ayuda?

Saludos!


Título: Re: Duda con estructuras en C (Urgente)
Publicado por: dato000 en 4 Enero 2014, 21:18 pm
Pues solo seria mostrar el mensaje en pantalla no?? ya comprobaste todo dentro de las funciones

Ya hiciste todo el trabajo sucio, solo es indicarlo en pantalla para el usuario.

Código
  1. bis1 = esBisiesto(f1);
  2. bis2 = esBisiesto(f2);
  3. {
  4.     if (bis1 == 1 && bis2 == 0)
  5.     {
  6.              printf("\nLa primera fecha es en bisiesto");
  7.              printf("\nLa segunda fecha no es bisiesto\n");
  8.     }
  9.  
  10.     else if (bis1 == 0 && bis2 == 1)
  11.     {
  12.              printf("\nLa primera fecha no es bisiesto");
  13.              printf("\nLa segunda fecha es en bisiesto\n");
  14.     }
  15.  
  16.     else if (bis1 == 1 && bis2 == 1)
  17.              printf("\nAmbas fechas son en bisiesto\n");
  18.  
  19.     else
  20.              printf("\nNinguna de las dos fechas es en bisiesto\n");
  21.  
  22. }
  23.  


Título: Re: Duda con estructuras en C (Urgente)
Publicado por: jamatbar en 4 Enero 2014, 21:33 pm
Pues solo seria mostrar el mensaje en pantalla no?? ya comprobaste todo dentro de las funciones

Ya hiciste todo el trabajo sucio, solo es indicarlo en pantalla para el usuario.

Código
  1. bis1 = esBisiesto(f1);
  2. bis2 = esBisiesto(f2);
  3. {
  4.     if (bis1 == 1 && bis2 == 0)
  5.     {
  6.              printf("\nLa primera fecha es en bisiesto");
  7.              printf("\nLa segunda fecha no es bisiesto\n");
  8.     }
  9.  
  10.     else if (bis1 == 0 && bis2 == 1)
  11.     {
  12.              printf("\nLa primera fecha no es bisiesto");
  13.              printf("\nLa segunda fecha es en bisiesto\n");
  14.     }
  15.  
  16.     else if (bis1 == 1 && bis2 == 1)
  17.              printf("\nAmbas fechas son en bisiesto\n");
  18.  
  19.     else
  20.              printf("\nNinguna de las dos fechas es en bisiesto\n");
  21.  
  22. }
  23.  

No pero no es eso lo que busco, lo que busco es que si por ejemplo pongo las fechas que he dicho (29/02/2000 y 29/02/1900) al ser la segunda una fecha incorrecta ,ya que no existe, que ponga sólo por pantalla "Formato de fecha incorrecto".

Poner que no es bisiesto estaría mal ya que el 29/02/1900 directamente es una fecha que no existe puesto que al no ser bisiesto el 29 de Febrero no existe xD


Título: Re: Duda con estructuras en C (Urgente)
Publicado por: dato000 en 4 Enero 2014, 22:31 pm
pues entonces el control tendria que ser mucho más estricto, especificandole al usuario que debe saber exactamente cuales son la cantidad de dias hay en cada mes en particular, incluyendo el mes bisiesto, dentro de las condiciones de los meses y dias, tendria que hacerse un ciclo (yo usaria un while).

En el que solo pueda usarse digamos, en enero, que solo tiene 31 días, no recibir la fecha que se use en el mes de enero --> DD/01/AAAA si es menor a 1 y mayor a 31, puesto que es incorrecto, indicandole al usuario que digite un fecha correcta, y así, se valide correctamente la información, en primera debe hacerse un control así en cada mes, dependiendo de la cantidad de días, y luego sería hacer un control particular sobre febrero, aunque lo indicado sería orientar al usuario sobre cuales años son biciestos. 


Título: Re: Duda con estructuras en C (Urgente)
Publicado por: jamatbar en 4 Enero 2014, 22:40 pm
Gracias por la ayuda aunque no tengo ni idea de como hacerlo :S


Título: Re: Duda con estructuras en C (Urgente)
Publicado por: amchacon en 5 Enero 2014, 13:28 pm
Comprueba los datos cuando te los introduzca el usuario, después es más lioso:

- Si día es < 1 devuelves un error
- Si mes es < 1 devuelves un error
- Si anyo es < 0 devuelves un error
- Si mes > 12 devuelves un error
- Si dia > dias_del_mes devuelves un error (febrero tendrá 29 días).
- Si anyo != bisiesto, es febrero y es el día 29 devuelves un error-


Título: Re: Duda con estructuras en C (Urgente)
Publicado por: dato000 en 5 Enero 2014, 21:11 pm
Comprueba los datos cuando te los introduzca el usuario, después es más lioso:

- Si día es < 1 devuelves un error
- Si mes es < 1 devuelves un error
- Si anyo es < 0 devuelves un error
- Si mes > 12 devuelves un error
- Si dia > dias_del_mes devuelves un error (febrero tendrá 29 días).
- Si anyo != bisiesto, es febrero y es el día 29 devuelves un error-

Eso es, exacto, pero realmente me parece muy recargado meterle tanta cosa para un programa así, me parece que tal y como esta esta bien.

es como decir en el caso de enero, que tiene 31 días:

Código
  1. while(fecha.mes == 1 && fecha.dia > 0 && fecha.dia < 32)
  2. {
  3.    //instrucciones de ejecucion
  4.    //validar registro
  5.    //comparar fechas
  6.    //determinar si es bisiesto
  7.  
  8.   if(fecha.dia < 0 || fecha.dia > 31)
  9.   {
  10.            printf("\nError en el registro de fecha, formato incorrecto, intentalo otra vez besta!!\n");
  11.   }
  12. }
  13.  

Ahora, el problema es que practicamente hay que hacer un while para todos los meses, y luego realizar uno para determinar si es bisiesto en el mismo ciclo de febrero, y pues se hace muy tedioso. Claro que se puede resumir a meses que tengan una cantidad de días iguales así como ya has hecho antes, y seguro que si sacas una, sacas todas las apreciaciones para determinar la mecanica del proceso.

Aunque la verdad, yo lo dejaria hasta ahi, esta muy bien hecho... :silbar: :silbar:


Título: Re: Duda con estructuras en C (Urgente)
Publicado por: jamatbar en 5 Enero 2014, 22:47 pm
Bueno, he puesto estructura.c así:

Código:
#include <stdio.h>
#include "fecha.h"

int main()
{
  struct fecha f1;
  struct fecha f2;
  // struct fecha *pf1;
  // struct fecha *pf2;
  int a;
  int compara;
  int bis1;
  int bis2;

while(fecha.mes == 1 && fecha.dia > 0 && fecha.dia < 32)
{
  f1 = leeFecha();
  a = compruebaFecha(&f1);

  if (a == 0)
    {
      printf("Formato de fecha incorrecto\n");
    }

  else
    {
      f2 = leeFecha();
      a = compruebaFecha(&f2);

      if (a == 0)
        {
          printf("Formato de fecha incorrecto\n");
        }

      else

        {

          compara = comparaFecha(f1, f2);

  /* Imprimir */

          imprimeFecha(f1);
          {
            if (compara > 0)

              printf(" es posterior a ");

            else if (compara == 0)

              printf(" es igual a ");

            else

              printf(" es anterior a ");
          }

          imprimeFecha(f2);

          bis1 = esBisiesto(f1);
          bis2 = esBisiesto(f2);

          {
            if (bis1 == 1 && bis2 == 0)

              printf("\nLa primera fecha es en bisiesto\n");

            else if (bis1 == 0 && bis2 == 1)

              printf("\nLa segunda fecha es en bisiesto\n");

            else if (bis1 == 1 && bis2 == 1)

              printf("\nAmbas fechas son en bisiesto\n");

            else

              printf("\nNinguna de las dos fechas es en bisiesto\n");

          }
        }
if (fecha.dia < 0 || fecha.dia > 31)
{
printf("\nFormato de fecha incorrecto\n");
}
}
    }
  return 0;
}

Pero me da errores de ejecución:

estructura.c: En la función ‘main’:
estructura.c:26:7: error: ‘fecha’ no se declaró aquí (primer uso en esta función)
estructura.c:26:7: nota: cada identificador sin declarar se reporta sólo una vez para cada función en el que aparece

El problema es que por mi lo dejaría tal como está, pero el profesor pasa un programa de comprobación del ejercicio con distintas pruebas, y la prueba esa no la pasa :S (que al poner una segunda fecha incorrecta me salga sólo el mensaje de "Formato de fecha incorrecto"). Y no se me ocurre como ponerlo para que me salga :S



Título: Re: Duda con estructuras en C (Urgente)
Publicado por: dato000 en 6 Enero 2014, 17:10 pm
estructura.c: En la función ‘main’:
estructura.c:26:7: error: ‘fecha’ no se declaró aquí (primer uso en esta función)
estructura.c:26:7: nota: cada identificador sin declarar se reporta sólo una vez para cada función en el que aparece

El problema es que por mi lo dejaría tal como está, pero el profesor pasa un programa de comprobación del ejercicio con distintas pruebas, y la prueba esa no la pasa :S (que al poner una segunda fecha incorrecta me salga sólo el mensaje de "Formato de fecha incorrecto"). Y no se me ocurre como ponerlo para que me salga :S

Pues lo que pasa es que debes usar la variable, no el tipo de variable:

Código
  1. while(f1.mes == 1 && f1.dia > 0 && f1.dia < 32)

Pero de todas maneras, tu ya tienes esos datos de comprobación listos, no entiendo realmente cuando mencionas lo del formato, porque el formato de una fecha es el siguiente:

Citar
DD/MM/AAAA

Entiendo tu punto de vista, pero realmente lo que necesitas es simplemente indicar si es un bisiesto o no, porque el formato de fechas es correcto, le pones un número menor a 2 digitos para el día y el mes, y un año correcto dentro del estandar de las fechas, ahora lo que debe hacerse es indicarle al usuario si la fecha es correcta o no. Lo unico que debes hacer, es que si quieres restringir en el caso de las fechas:

29/02/2000 
29/02/1900

Es que en el exclusivo caso de que se comparen años biciestos y uno no sea correcto, no por el día, no por el mes, sino porque el año no corresponde a un año biciesto es realizar la restriccion de que si se comparan fechas con meses de febrero, en el cuaĺ, si no es una fecha correcta, pues no se hace el proceso de comparar las fechas, sino simplemente arrojar el resultado que indique "no es biciesto" pero el formato de fechas si corresponde con el que se usa para una fecha, si el usuario indica una fecha en el cual no es un año biciesto, pues el mismo programa le indica, "no es un año biciesto".

Creo que la falla no esta en la programación del programa, de hecho, ya todo esta ahi, solo es reacomodarlo y restructurarlo, no se necesita más ciclos ni condiciones, ya esta todo ahi en las funciones de fecha.c

Código
  1. #include <stdio.h>
  2. #include "fecha.h"
  3.  
  4. struct fecha leeFecha(void)
  5. {
  6.    struct fecha Fech;
  7.    printf("Introduzca la fecha en formato dd/mm/aaaa: ");
  8.    scanf("%d/%d/%d", &Fech.dia, &Fech.mes, &Fech.anyo);
  9.    return Fech;
  10. }
  11.  
  12.  
  13. int compruebaFecha(struct fecha *pFecha)
  14. {
  15.    int compru;
  16.    int bis;
  17.    {
  18.        if (pFecha->dia < 1 || pFecha->dia > 31) // por defecto los meses tienen un promedio de 31
  19.        compru = 0;
  20.  
  21.        else if (pFecha->mes < 1 || pFecha->mes > 12) // por defecto cada año tiene 12 meses
  22.            compru = 0;
  23.  
  24.        // Caso particular para meses:
  25.        // Abril
  26.        // Junio
  27.        // Septiembre
  28.        // Noviembre
  29.        // Que solo poseen 30 dias
  30.        else if ((pFecha->mes == 4 || pFecha->mes == 6 || pFecha->mes == 9 || pFecha->mes == 11) && (pFecha->dia > 30))
  31.            compru = 0;
  32.  
  33.        // Caso Particular Febrero
  34.        // Por defecto solo tiene 28 dìas
  35.        // Excepto en el año biciesto
  36.        else if (pFecha->mes == 2)
  37.        {
  38.            if ((bis = 1) && (pFecha->dia > 29))
  39.                compru = 0;
  40.  
  41.            else if ((bis = 0) && (pFecha->dia > 28))
  42.                compru = 0;
  43.        }
  44.  
  45.        else
  46.            compru = 1;
  47.    }
  48.    return compru;
  49. }
  50.  
  51.  
  52. int comparaFecha(struct fecha f1, struct fecha f2)
  53.    /* Función comparaFecha, devuelve:
  54.        -1 si fecha1 < fecha2
  55.        0 si fecha1 = fecha2
  56.        1 si fecha1 > fecha2
  57.     */
  58. {
  59.    int compara;
  60.  
  61.    if (f1.anyo < f2.anyo)
  62.        compara = -1;
  63.    else if (f1.anyo > f2.anyo)
  64.        compara = 1;
  65.    else
  66.    {
  67.        if (f1.mes < f2.mes)
  68.            compara = -1;
  69.  
  70.        else if (f1.mes > f2.mes)
  71.            compara = 1;
  72.  
  73.        else
  74.        {
  75.            if (f1.dia < f2.dia)
  76.                compara = -1;
  77.  
  78.            else if (f1.dia > f2.dia)
  79.                compara = 1;
  80.  
  81.            else
  82.                compara = 0;
  83.        }
  84.    }
  85.  
  86.    return compara;
  87. }
  88.  
  89.  
  90. void imprimeFecha(struct fecha f)
  91. {
  92.    printf("%02d/%02d/%04d", f.dia, f.mes, f.anyo);
  93. }
  94.  
  95.  
  96.  
  97. // Funcion para comprobar si un año es bisiesto:
  98. int esBisiesto(struct fecha f)
  99. {
  100.    int bis = 0;
  101.  
  102.    // año bisiesto: {divisible por 4 y no por 100} o {divisible por 400}
  103.    if (((f.anyo % 4 == 0) && (f.anyo % 100 != 0)) || (f.anyo % 400 == 0))
  104.        bis = 1;
  105.  
  106.    return bis;
  107. }
  108.  
  109.  

no ha cambiado nada, solo deje claro los casos de los meses pues ya estan hechos, solo es para que tengas en cuenta de que los formatos de fecha son correcto, lo que se necesita es solo decirle  al usuario si la fecha que escribio es un año biciesto o no, no es un error de programación, es un error de sentido común, el usuario piensa que es año bisiesto, pero el programa realiza el cálculo de los modulos y los mutiplos y le indica que no es así.

Solo necesitas ajustar la perspectiva, porque todo esta bien ahi, creo yo.


Título: Re: Duda con estructuras en C (Urgente)
Publicado por: jamatbar en 6 Enero 2014, 23:03 pm
Muchas gracias, cuando tenga tiempo lo miro ya que se ha pasado el plazo de entrega del ejercicio y como tengo los exámenes encima no tengo tiempo para ponerme ahora a hacerlo xD

Aún así, muchísimas gracias!


Título: Re: Duda con estructuras en C (Urgente)
Publicado por: do-while en 7 Enero 2014, 11:43 am
¡Buenas!

En la función que comprueba la corrección de una fecha tienes un error muy gordo de lógica en el caso de febrero:
Código
  1.    else if (pFecha->mes == 2)
  2.  
  3.      {
  4.        if ((bis = 1) && (pFecha->dia > 29))
  5.  
  6.          compru = 0;
  7.  
  8.        else if ((bis = 0) && (pFecha->dia > 28))
  9.  
  10.          compru = 0;
  11.      }
  12.  

29/2/1992 (año bisiesto):
- bis = 1: true dia> 29: false --> pasamos al else
- bis = 0: false --> pasamos al else ---> ¡NO HAY ELSE! ---> compru queda indefinido.

Supongo que tu intención no era asignar valores uno o cero a bis, sino asignar el valor de la función que evalúa si un año es o no bisiesto. Por cierto, asigna a compru el valor 1 desde el principio, ya que en tu código estás buscando los casos de error y has visto que al menos en el caso de febrero su valor queda indefinido.

Por cierto, en una función que compruebe cosas sobre datos, nunca imprimas mensajes ni pidas datos. No hagas ninguna de las dos cosas porque no sabes la interfaz que va a tener tu programa, lo mismo puede ser un entrono de ventanas que de consola que ser un código empotrado en algún sistema... si una función comprueba la validez de unos datos, si quieres indicar que algo ha salido mal, devuelve datos numéricos que indiquen el error. Así la función que haya llamado a la función de comprobación podrá saber si algo ha salido mal, y actuar en consecuencia.

¡Saludos!


Título: Re: Duda con estructuras en C (Urgente)
Publicado por: jamatbar en 7 Enero 2014, 13:01 pm
Gracias!, le echaré un ojo ;)


Título: Re: Duda con estructuras en C (Urgente)
Publicado por: dato000 en 7 Enero 2014, 14:16 pm
Por cierto, en una función que compruebe cosas sobre datos, nunca imprimas mensajes ni pidas datos. No hagas ninguna de las dos cosas porque no sabes la interfaz que va a tener tu programa, lo mismo puede ser un entrono de ventanas que de consola que ser un código empotrado en algún sistema... si una función comprueba la validez de unos datos, si quieres indicar que algo ha salido mal, devuelve datos numéricos que indiquen el error. Así la función que haya llamado a la función de comprobación podrá saber si algo ha salido mal, y actuar en consecuencia.

No lo se, puede que sea una mala costumbre, pero no le veo problema pedirle datos en pantalla para comprobación de funciones, al menos, yo lo hago mientras construyo correctamente las funciones y comprobando que efectivamente si realiza la llamada a funciones de una manera que espero, al final, dejo de lado tales impresiones y realizo el retorno correspondiente, excepto en casos particulares donde es necesaria una que otra impresión, eso depende del uso, no me parece un error así macro, más bien es una costumbre adquirida o un habito que no termina que gustar en general  :P :P

Es por ello que existen excepciones no?? me gusta relacionar ese tipo de cosas para C, porque no existen excepciones (así como en una forma explicita como en C++) que se manejen de manera, como decirlo, automatica por parte del compilador o del IDE.

aunque el detalle que mencionas tienes razón, es mejor iniciar la variable para el control.   :)


Título: Re: Duda con estructuras en C (Urgente)
Publicado por: do-while en 7 Enero 2014, 17:51 pm
¡Buenas!

No lo digo porque esté mal, el código evidentemente funciona si lo haces así. Lo digo por organizar bien el código. Una función un trabajo. Esa es la filosofía, mientras puedas mantenerla, evidentemente. Lo lógico es que hagas una función para recoger los datos, esta dependerá de la interfaz que estés utilizando en cada momento, y otra que compruebe su corrección, que solo tendrás que implementarla una vez y si funciona correctamente nunca mas la tendrás que volver a tocar, y la podrás utilizar en windows, en mac en castellano en latín o incluso en chino, ya que al no depender de la interfaz ni del idioma la podrás utilizar donde y cuando te de la gana (siempre y cuando no haya dependencias de librerías ajenas al código que tu mismo facilites o hayas creado).

¡Saludos!

Acabo de ver lo de las excepciones. Hace poco volví a coger C++, con el nuevo estandar, la STL... ha cambiado muchísimo desde el primer contacto que tuve con el... y las excepciones no me gustan nada.  :xD, si tengo que decirle algo a la función llamadora, le paso un código de error y que ella lo trate como le de la gana. A lo mejor no he estudiado como debería las excepciones, pero me parece una chorrada crear una clase y bloques try, catch, para algo que se ha hecho de toda la vida (o por lo menos yo así lo he hecho) devolviendo enteros y con un switch...

¡Saludos!