Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[c++] Zadanie kalendarz juliański i gregoriański - for i string

Ostatnio zmodyfikowano 2014-04-23 19:04
Autor Wiadomość
Azathanai
Temat założony przez niniejszego użytkownika
[c++] Zadanie kalendarz juliański i gregoriański - for i string
» 2014-04-22 14:18:33
Witajcie, mam problem z zadaniem z c++ Treść tego zadania brzmi:

 Latami przestępnymi w kalendarzu juliańskim były wszystkie te lata, które dzieliły się
bez reszty przez 4.
 Według kalendarza gregoriańskiego latami przestępnymi są te, które dzielą się bez reszty
przez 4, z wyjątkiem tych, które dzielą się bez reszty przez 100, a nie dzielą się bez reszty
przez 400.
a) Napisz program, który uwzględniając powyższy opis, wyświetli wszystkie daty wypadające
w podanym z klawiatury dniu tygodnia w lutym wskazanego roku.
Przykładowe okno dialogowo-wynikowe:
podaj dz. tygodnia: wtorek
podaj rok: 2000
Odp:
01.02.2000
08.02.2000
15.02.2000
22.02.2000
29.02.2000

mój kod wygląda tak :
pwszy to zmienna mająca określić który dzień tygodnia jest 1-szego lutego danego roku. z przykładu wziąłem że 1 lutego 2000 roku to wtorek

C/C++
#include<iostream>
#include<string>

using namespace std;

void main()
{
    string dzien, pwszy, dlut;
    int rok, koniec = 0, w = 1, lut;
    string dn[ 7 ] = { "poniedzialek", "wtorek", "sroda", "czwartek", "piatek", "sobota", "niedziela" };
    pwszy = dn[ 1 ];
   
    do
    {
        cout << "Podaj dz. tygodnia:";
        cin >> dzien;
        for( int i = 0; i < 7; i++ )
        {
            if( dzien == dn[ i ] ) koniec = 1;
           
        }
        if( koniec == 0 ) cout << "Podaj prawidlowy dzien!" << endl;
       
    }
    while( koniec == 0 );
   
    do
    {
        cout << "Podaj rok:";
        cin >> rok;
        if(( rok <= 2005 ) &&( rok >= 1500 ) ) cout << "";
        else cout << "Podaj rok z przedzialu <1500;2005> !" << endl;
       
    }
    while(( rok >= 2005 ) ||( rok <= 1500 ) );
   
    if( rok < 2000 )
    {
        for( int i = 2000; i >= rok; i-- )
        {
            if( rok == 1582 )
            {
                for( int o = 0; o < 11; o++ )
                {
                    if( w == 0 )
                    {
                        w = 6;
                        pwszy = dn[ w ];
                    }
                    else
                    {
                        w--;
                        pwszy = dn[ w ];
                    }
                }
            }
           
            else if( rok % 4 == 0 && rok % 100 != 0 || rok % 400 == 0 )
            {
                for( int o = 0; o < 2; o++ )
                {
                    if( w == 0 )
                    {
                        w = 6;
                        pwszy = dn[ w ];
                    }
                    else
                    {
                        w--;
                        pwszy = dn[ w ];
                    }
                }
            }
            else if( w == 0 )
            {
                w = 6;
                pwszy = dn[ w ];
            }
            else
            {
                w--;
                pwszy = dn[ w ];
            }
        }
       
    }
    if( rok > 2000 )
    {
        for( int i = 2000; i <= rok; i++ )
        {
            if( rok == 1582 )
            {
                for( int o = 0; o < 11; o++ )
                {
                    if( w == 6 )
                    {
                        w = 0;
                        pwszy = dn[ w ];
                    }
                    else
                    {
                        w++;
                        pwszy = dn[ w ];
                    }
                }
            }
           
            else if( rok % 4 == 0 && rok % 100 != 0 || rok % 400 == 0 )
            {
                for( int o = 0; o < 2; o++ )
                {
                    if( w == 6 )
                    {
                        w = 0;
                        pwszy = dn[ w ];
                    }
                    else
                    {
                        w++;
                        pwszy = dn[ w ];
                    }
                }
            }
            else if( w == 6 )
            {
                w = 0;
                pwszy = dn[ w ];
            }
            else {
                w++;
                pwszy = dn[ w ];
            }
        }
    }
    if(( rok % 4 == 0 && rok % 100 ) || rok % 400 == 0 ) lut = 29;
    else lut = 28;
   
    for( int i = 1; i <= lut; i++ )
    {
        dlut = dn[ w ];
        if( dzien == dlut ) cout << i << ".02." << rok << endl;
       
        if( w == 6 ) w = 0;
        else w++;
       
    }
    system( "pause" );
}
 Niestety mimo licznych prób cały czas wynik jest przesunięty o kilka dni . W jednym z przypadków(niestety nie zapisałem go) co 4 lata różnica powiększała się o 1 czasami wyskakiwał błąd Unhandled exception at 0x777515de in matura1.cpp.exe: 0xC0000005: Access violation reading location 0x01165000. Jeśli mógłby ktoś pomóc w znalezieniu błędów byłbym bardzo wdzięczny :)
P-108505
Gabes
» 2014-04-22 18:52:29
W 1582 roku gdy wprowadzono kalendarz gregoriański dokonano "ominięcia 10 dat dziennych".
Kalendarz gregoriański-Wikipedia
P-108522
Adik80
» 2014-04-23 19:04:26
Jesli zaczynasz od roku 2000 i chcesz sprawdzic np. 1995 to powinienes odjac 1 dzien (2 w przestepnym) dla dla 'rokow' 1995-1999, a u ciebie w petli jest 2000 wlacznie. Podonbioe jesli robisz dla np. 2005 to powinienes doac 1 (2 w przetepnym) dla 2000-2004, a u ciebie w petli jest do 2005.
BTW. zamaist odejmowac lepiej jest dodawac i dzielic modulo przez 7. Stringi tez niepotrzebnie w petli ustawiasz.
P-108560
« 1 »
  Strona 1 z 1