Problema ejericio 104 bisiesto

Iniciado por viruss1362, 22 Abril 2005, 19:59 PM

0 Miembros y 2 Visitantes están viendo este tema.

viruss1362

hola tengo un problema con el ejericio 104 mi codigo es el siguiente:

/* Ejercicio 104
Escribir un programa que solicite un año e indique si es bisiesto o no
Un año es bisiesto si es múltiplo de 4 excluyendo aquellos que son múltiplo de 100 y no de 400.
- Los años exactamente divisibles entre 4 son años bisiestos.
- Los años exactamente divisibles entre 100 no son años bisiestos.
- Los años exactamente divisibles entre 400 sí son años bisiestos.
*/
#include <stdio.h>
int num;
int resto;
main()
{
printf("Escriba un año y le dire si es bisiesto o no: ");
fflush(stdin);
scanf("%d",&num);
if (num>1 && num<20000)
    {
    resto = num%4;
    if(resto == 0 && num%100 != 0)
    printf("El año es bisiesto");
    else if(num%100 == 0 && num%400 != 0)
    printf("El año no es bisiesto");
    else
    printf("El año no es bisiesto");
    }
else
{
printf("Introduzca un numero razonable");
}
getchar();
getchar();
}


Si lo probais verias k si poneis 2003 como es logico no es bisiesto pero si ponemos 2004 si es bisiesto, de momento todo bien, pero y si pongo 2000? me dice que no es bisiesto pero si lo es.. y en vuestro codigo publicado en soluciones c pasa lo mismo.. se puede arreglar o es k 2000 es un año especial?
Más vale parecer un idiota con la boca cerrada, que abrir la boca y demostrar que lo eres

www.equipome.com

Crack_X

Citar- Los años exactamente divisibles entre 100 no son años bisiestos.

Tengo entendido que los años bisiestos son los divisibles entre 4. Pero por que no puede ser divisible entre 100, si 100 es divisible entre 4 ?
Shit loads of money spend to show us wrong from right. Say no to war


Yasser Has Things To Say
WarZone

Cobac

CitarTengo entendido que los años bisiestos son los divisibles entre 4. Pero por que no puede ser divisible entre 100, si 100 es divisible entre 4 ?

lo dice en el "enunciado" que dejo soplo:

CitarUn año es bisiesto si es múltiplo de 4 excluyendo aquellos que son múltiplo de 100 y no de 400.

cierto que esta mal el código, no me lo debi leer bien (lo siento)

ahora creo que esta bien xDD (pruebalo si quieres), el código mio sería este:

#include <stdio.h>

main()
{
int ano=0, rest=0;

    printf("Introduce el año: ");
    scanf("%d", &ano);
   
    if(ano < 0)
        printf("Años negativos no\n");
       
    else
    {
        rest = ano%4;
       
        if(ano%100 == 0 && ano%400 != 0)
                printf("El año %d no es bisiesto\n", ano);
               
        else if(rest == 0 && ano%100 != 0 || (ano%400 == 0 && ano%100 == 0))
                printf("El año %d es bisiesto!!\n", ano);
       
        else
                printf("El año %d no es bisiesto\n", ano);
    }
   
getchar();
getchar();
}


es decir primera condición si el divirlo por 100 da 0 de resto y al dividirlo por 400 da distinto no es bisiesto

y la segunda condición, si el resto da 0 y sino es disivisble por cien es bisiesto o!! que año sea divisible por 400 y por 100...

salu2
PIV 2533 @ 2720Mhz | 512MB DRR333 @ 358 | 160 Gb + 40 Gb Seagate Barracuda

En la Edad Media la Iglesia robaba con los diezmos. En el siglo XXI la SGAE roba con sus cánones.

viruss1362

perfecto Cobac  ;D e estado mas de 1 hora calentandome la cabeza y vas tu en 10 minutos y ale xD, es k el problema que como soy novato no sabia k podia hacer esto:
else if(rest == 0 && ano%100 != 0 || (ano%400 == 0 && ano%100 == 0))

es decir meter tantas condiciones.. yo creia k solo podia poner 2  ::) y por eso no me salia bien el programa... bueno pos nada ya esta arreglao y encima e aprendio una cosa importante, enga gracias cobac voy a seguir con los ejercicios en C que habeis puesto ... que ya se complica la cosa..  :P
Más vale parecer un idiota con la boca cerrada, que abrir la boca y demostrar que lo eres

www.equipome.com

Cobac

puedes meter las condiciones que quieras ;)

salu2

P.D.:Gracias a ti por ver el fallo del programa, si ves otro no dudes en decirlo ;)
PIV 2533 @ 2720Mhz | 512MB DRR333 @ 358 | 160 Gb + 40 Gb Seagate Barracuda

En la Edad Media la Iglesia robaba con los diezmos. En el siglo XXI la SGAE roba con sus cánones.

Nehemoth

Hola jovenes.

Un nuevo por aqui.

Estoy tomando una clases de C++ en la univ, y me han puesto este mismo ejercicio.

Lamentablemente la forma de educacion de mi Pais deja mucho que desear, pero ese es otro tema. La cosa es que no he querido buscar el codigo para hacer este programa, pero despues de un sin numero de intentos fallidos he estado buscando para ver donde esta mi error, he dado con este tema y este codigo el cual he probado pero igual sigue mal.

Por ejemplo si entramos el año 1999 dice que es bisiesto y logico que no lo es, hasta ahora con el unico año que me ha funcionado es con el 2200 y ni siquiera e calculado mentalmente a ver si lo es.

Teniendo en cuenta lo siguiente :
- Un año divisible por 4 es bisiesto.
- Un año divisible por 100 no es bisiesto.
- Un año divisible por 400 es bisiesto.

Hasta ahora este es el codigo que he creado, pero obvio que tiene problemas y me gustaria me ayudaran a comprender mas

#include <stdio.h>


using namespace std;

int main()
{
   
    std::cout <<"*****************************************"<<endl;
    std::cout <<"*Programa Que Dice Si Un Año Es Bisiesto*"<<endl;
    std::cout <<"*****************************************"<<endl;
   
    int ano=0;
    std::cout <<"Introduzca Ano"<< endl;
    std::cin >> ano;
    if (ano % 4 == 0 && ano % 400 == 0)
                printf ("El Ano %d Es Bisiesto");
    else if (ano % 100 == 0)
                printf ("El Ano %d No Es Bisiesto");
   
return 0;
}


Gracias de antemano
PD : Estoy usando el compilador DEV-C++ version 4.9.9.2 en Windows XP SP2
When once you have tasted flight, you will forever walk the earth with your eyes turned skyward, for there you have been and there you will always long to return.

— Leonardo da Vinci

Nehemoth

Ok he logrado mejorar un poco mi codigo y ahora me funciona con algunos años y otros no (como el 2004).

Al parecer mi problema era con la formula y la sintaxis de If no estaba poniendo el {} aunque aun no se del todo porque son necesarios.

El nuevo codigo es

#include <iostream>
#include <stdio.h>

using namespace std;

//Programa Año Bisiesto
//Grimaldy Soto
//2006-0309
//Creacion January 21 2008.....Modificacion January 21 2008
int main(int argc, char *argv[])
{
    std::cout <<"*****************************************"<<endl;
    std::cout <<"*Programa Que Dice Si Un Año Es Bisiesto*"<<endl;
    std::cout <<"*****************************************"<<endl;
   
    int ano=0;
    int rest=0;
    std::cout <<"Introduzca Ano"<< endl;
    scanf("%d", &ano);
    if(ano%4 == 0 && ano%400 == 0) {
                printf ("El ano %d es bisiesto\n", ano);
        }       
        else if (ano%100 != 0) {
                printf ("El ano %d No es bisiesto!!\n", ano);
        }
           
getchar();
getchar();
}
When once you have tasted flight, you will forever walk the earth with your eyes turned skyward, for there you have been and there you will always long to return.

— Leonardo da Vinci

Nehemoth

Ok, ahora si creo que lo he logrado, de hecho tal parece que mi codigo ha resultado mejor que el que esta entre las respuestas de los ejercicios, pero no nos adelantemos.

Al parecer el problema de la formula esta en que el año debe ser divisible entre 4 mas sin embargo al parecer no debe ser divisible exactamente.

Favor intentar en los demas codigos con los años 2004, 2008 o 2012 y probar con este codigo lo mismo


#include <iostream>
#include <stdio.h>

using namespace std;

//Programa Año Bisiesto
//Grimaldy Soto
//2006-0309
//Creacion January 21 2008.....Modificacion January 21 2008
int main(int argc, char *argv[])
{
    std::cout <<"*****************************************"<<endl;
    std::cout <<"*Programa Que Dice Si Un Año Es Bisiesto*"<<endl;
    std::cout <<"*****************************************"<<endl;
   
    int ano=0;
    printf ("Introduzca Ano: ");
    scanf("%d", &ano);
    if(ano%4 == 0 && ano%400 && ano%100 !=0) {
                printf ("El ano %d es bisiesto\n", ano);
        }       
        else {
                printf ("El ano %d No es bisiesto!!\n", ano);
        }
           
getchar();
getchar();
}
When once you have tasted flight, you will forever walk the earth with your eyes turned skyward, for there you have been and there you will always long to return.

— Leonardo da Vinci

Drmaloy

#8
Hola que tal, la verdad es que he pasado por este mismo problema , asi que he estado buscando la solucion por un par de dias. La verdad es que es un programa bastante sencillo, pero para pensar mucho y razonar de manera interesante, en fin les adjunto la solucion que he hallado...El código no es C, sino C++, pero es facilmente comprensible por los usuarios de C.


#include <iostream.h>
/*#include <conio.h>----->Si trabajas es Dev c++ es necesaria esta libreria*/
main()

{
int anho;
cout<<"Ingrese un año cualquiera: ";
cin>>anho;
if (((anho%4)==0 && (anho%100!=0)) || (anho%400==0))
{
cout<<"El año es Bisiesto";
}
else
{
cout<<"El año No es Bisiesto";
}
/*getche (); otra linea más necesaria en Dev c++*/
}


Yo lo he compilado en mi Mac, en Xcode, pero tambien es posible portarlo a Dev c++ (u otros compliadores no lo se...) agregando la libreria y el getche, en fin solo hace falta quitarle los comentarios
Oh, yes! fill the churches with dirty thoughts! Introduce honesty to the white house! Write letters in dead languages to people you've never met! Paint filthy words on the foreheads of children! Burn your credit cards and wear high heels! Asylum doors stand open! Fill the suburbs with murder and rape! Divine madness! Let there be ecstacy, ecstacy in the streets! Laugh and the world laughs with yo