Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - jamatbar

#51
Cita de: xiruko en  8 Enero 2014, 23:40 PM
leer valor --> i=2 --> (valor%i == 0) --> Sí --> Fin (No es primo)
                                                        --> No --> (i++) --> (i < valor) --> Sí --> Volver a (valor%i == 0)
                                                                                                        --> No --> Fin (Sí es primo)

Yo lo haría así. Aunque la condición de (i < valor) puedes reducirla a (i <= valor/2) para ahorrarte ciclos en el for.

Saludos.

Buenas, antes que nada gracias por mirarlo aunque he de decirte que por ahora no tengo que cambiar el código, ya que según lo que me pidan tendré que modificarlo de una forma u otra. Por ahora lo que tengo que hacer es hacer el diagrama de flujo de dicho código, aunque sé de antemano que es bastante pobre como programa xD
#52
Buenas, me piden hacer el diagrama de flujo de este programa:

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

/* Includes de la aplicacion */
/* Constantes del fichero */
#define RESPUESTANOPRIMO " %d no es primo\n"
#define RESPUESTAPRIMO   " %d es primo\n"

/* Tipos definidos por el usuario para el fichero */

/* Prototipo de funciones locales */
int main()
{
  /* Almacenara el numero leido por teclado */
  int valor;
  /* Servira como indice del bucle for que vamos a utilizar. */
  int i;
  /* Solicitamos el numero que queremos saber si es primo */
  printf("Introduzca un valor: ");
  scanf(" %d", &valor);

  /* El bucle lo comenzamos en 2: todo numero es divisible por 1
   * y lo terminamos antes de valor: todo numero es divisible por si mismo */

  for ( i = 2; i < valor; i++ )
    if (0 == (valor % i))

      /* Si el resto es cero, es porque i divide
       * No es primo. */
      printf(RESPUESTANOPRIMO, valor);

  return 0;
}


Y lo he hecho así:



¿Modificaríais algo?

Gracias de antemano y un saludo!
#53
Gracias!, le echaré un ojo ;)
#54
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!
#55
Bueno, he puesto estructura.c así:

#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

#56
Gracias por la ayuda aunque no tengo ni idea de como hacerlo :S
#57
Cita de: 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.


bis1 = esBisiesto(f1);
bis2 = esBisiesto(f2);
{
    if (bis1 == 1 && bis2 == 0)
    {
             printf("\nLa primera fecha es en bisiesto");
             printf("\nLa segunda fecha no es bisiesto\n");
    }
   
    else if (bis1 == 0 && bis2 == 1)
    {
             printf("\nLa primera fecha no es bisiesto");
             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");

}


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
#58
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!
#59
Muchas gracias, ya está resuelto!
#60
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í:

#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


#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:

#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!