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

[C++] WypiszJutrzejszaDate

Ostatnio zmodyfikowano 2015-03-15 16:53
Autor Wiadomość
kinguska__15
Temat założony przez niniejszego użytkownika
[C++] WypiszJutrzejszaDate
» 2015-03-13 08:22:42
Witam, piszę program, mający wypisywać datę kolejnego dnia wtedy, kiedy podana do programu data jest poprawna.
Niektóre "ify" mam wrażenie, że są źle wczytywane: np. po 28 lutym w roku nieprzestępnym wyskakuje mi data 29 luty,
a, co najdziwniejsze, kiedy wpisuję np. 31 grudnia, to program drukuje mi dwie daty: 1 stycznia i 2 stycznia. Nie mam pojęcia, skąd to sie bierze? Kod przy wszystkich ifach jest podobny, więc nie wiem, dlaczego raz mi drukuje jedną datę, a raz dwie.

C/C++
#include <iostream>
#include <cstdlib>
using namespace std;

int CzyPoprawnaData( int dzien, int miesiac, int rok )
{
    int dniMiesiaca[ 12 ] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
   
    // sprawdzamy rok
    if( rok < 0 )
         return 0;
   
    // sprawdzamy nr miesiaca
    if( miesiac < 1 || miesiac > 12 )
         return 0;
   
    // sprawdzamy dni miesiaca
    if( dzien < 1 || dzien > dniMiesiaca[ miesiac - 1 ] )
         return 0;
   
    //sprawdzamy luty z 29 dniami
    if( dzien == 29 && miesiac == 2 )
    {
        // rok nie jest przestepny
        if( !(( rok % 4 == 0 && rok % 100 != 0 ) || rok % 400 == 0 ) )
             return 0;
       
    }
   
    return 1; // brak bledow
}



void WypiszJutrzejszaDate( int dzien, int miesiac, int rok )
{
    int x = CzyPoprawnaData( dzien, miesiac, rok );
    if( x == 1 )
    {
        //if (dzien==31)
        //{
        if(( miesiac == 12 ) &&( dzien == 31 ) )
        {
            dzien = 1;
            miesiac = 1;
            rok = rok + 1;
            cout << dzien << "." << miesiac << "." << rok << endl;
        }
        if(( dzien == 31 ) &&( miesiac ==!12 ) )
        {
            dzien = 1;
            miesiac = miesiac + 1;
            cout << dzien << "." << miesiac << "." << rok << endl;
        }
        //}
        if( dzien == 30 )
        {
            dzien = 1;
            miesiac = miesiac + 1;
            cout << dzien << "." << miesiac << "." << rok;
        }
        if((( dzien == 29 ) &&( miesiac == 2 ) ) &&(( rok % 4 == 0 ) &&( rok % 400 == 0 ) &&( rok % 100 ==!0 ) ) )
        {
            dzien = 1;
            miesiac = miesiac + 1;
            cout << dzien << "." << miesiac << "." << rok << endl;
        }
        if((( dzien == 28 ) &&( miesiac == 2 ) ) &&(( rok % 4 ==!0 ) ||( rok % 400 ==!0 ) ||( rok % 100 == 0 ) ) )
        {
            dzien = 1;
            miesiac = miesiac + 1;
            cout << dzien << "." << miesiac << "." << rok << endl;
        }
        else
        {
            dzien = dzien + 1;
            cout << dzien << "." << miesiac << "." << rok << endl;
        }
    }
    else
    {
        cout << "Podana data jest bledna" << endl;
    }
   
}

int main()

{
    int dzien;
    int miesiac;
    int rok;
    cout << "Podaj dzien: ";
    cin >> dzien;
    cout << "Podaj miesiac: ";
    cin >> miesiac;
    cout << "Podaj rok: ";
    cin >> rok;
    int x = CzyPoprawnaData( dzien, miesiac, rok );
    WypiszJutrzejszaDate( dzien, miesiac, rok );
}
P-128240
aksen
» 2015-03-13 11:29:17
Niestety niewiele nauczyłaś się z funkcji "CzyPoprawnaData"

testuj:

C/C++
void WypiszJutrzejszaDate( int dzien, int miesiac, int rok )
{
    int dniMiesiaca[ 12 ] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
   
    if( !CzyPoprawnaData( dzien, miesiac, rok ) )
    {
        cout << "Podana data jest bledna" << endl;
        return;
    }
   
    //sprawdzamy 28 luty
    if( dzien == 28 && miesiac == 2 )
    {
        // rok jest przestepny
        if((( rok % 4 == 0 && rok % 100 != 0 ) || rok % 400 == 0 ) )
             dzien++;
        else
        {
            dzien = 1;
            miesiac++;
        }
       
        cout << dzien << "." << miesiac << "." << rok << endl;
        return;
    }
   
    // koniec roku
    if( dzien == 31 && miesiac == 12 )
    {
        dzien = 1; miesiac = 1; rok++;
        cout << dzien << "." << miesiac << "." << rok << endl;
        return;
    }
   
    // koniec miesiaca
    if( dzien == dniMiesiaca[ miesiac - 1 ] )
    {
        dzien = 1; miesiac++;
        cout << dzien << "." << miesiac << "." << rok << endl;
        return;
    }
   
    // wszystkie inne przypadki
    dzien++;
    cout << dzien << "." << miesiac << "." << rok << endl;
}
P-128242
kinguska__15
Temat założony przez niniejszego użytkownika
» 2015-03-13 19:42:10
Chciałam iść "na łatwiznę" i skorzystać w nowej funkcji z poprzedniej funkcji. Myślałam, że tak będzie prościej.. I w sumie niby działa, ale chwilami źle i niestety nie mogę dojść do tego, dlaczego.

Dzięki wielkie za przykład nowej funkcji :) Ale czy jest ktoś, kto potrafiłby wytłumaczyć mi błąd w mojej propozycji? Dlaczego przy wpisywaniu 31.12 dowolnego roku zwraca mi dwie daty, czyli 1 i 2 stycznia?
P-128280
michal11
» 2015-03-13 20:25:29
Zdebuguj to będziesz wiedziała.
P-128281
aksen
» 2015-03-13 21:56:28
Funkcję napisałaś w dość kiepskim stylu i bardzo nieczytelnie (gmatwanina warunków).
Po wypisaniu daty przez funkcję nie używasz return, więc może być spełnionych
klika warunków i dostaniesz w wyniku kilka dat - duży błąd.

Ucz się na przykładach funkcji napisanych dużo prościej (które dostałaś ostatnio)
zamiast powtarzać te same błędy w tym samym stylu.

tu masz opisane błędy których szukasz: (wklej funkcję do programu i wstaw datę 31.12.dowolny rok)
możesz też mieć inne błędy (nie testowałem tego kodu)
C/C++
void WypiszJutrzejszaDate( int dzien, int miesiac, int rok )
{
    int x = CzyPoprawnaData( dzien, miesiac, rok );
    if( x == 1 )
    {
        //if (dzien==31)
        //{
        if(( miesiac == 12 ) &&( dzien == 31 ) )
        {
            dzien = 1;
            miesiac = 1;
            rok = rok + 1;
            cout << dzien << "." << miesiac << "." << rok << " pierwszy wydruk " << endl; // 1. tu !!!!!!!!!!!!!!!!!
        }
        if(( dzien == 31 ) &&( miesiac ==!12 ) )
        {
            dzien = 1;
            miesiac = miesiac + 1;
            cout << dzien << "." << miesiac << "." << rok << endl;
        }
        //}
        if( dzien == 30 )
        {
            dzien = 1;
            miesiac = miesiac + 1;
            cout << dzien << "." << miesiac << "." << rok;
        }
        if((( dzien == 29 ) &&( miesiac == 2 ) ) &&(( rok % 4 == 0 ) &&( rok % 400 == 0 ) &&( rok % 100 ==!0 ) ) )
        {
            dzien = 1;
            miesiac = miesiac + 1;
            cout << dzien << "." << miesiac << "." << rok << endl;
        }
        if((( dzien == 28 ) &&( miesiac == 2 ) ) &&(( rok % 4 ==!0 ) ||( rok % 400 ==!0 ) ||( rok % 100 == 0 ) ) )
        {
            dzien = 1;
            miesiac = miesiac + 1;
            cout << dzien << "." << miesiac << "." << rok << endl;
        }
        else
        {
            dzien = dzien + 1;
            cout << dzien << "." << miesiac << "." << rok << " drugi wydruk " << endl; // 2. tu !!!!!!!!!!!!!!!!!!
        }
    }
    else
    {
        cout << "Podana data jest bledna" << endl;
    }
   
}
P-128291
aksen
» 2015-03-13 22:30:16
PS.
Inny błąd: wpisuje datę 31.7.2014, a w wyniku dostaję: 32.7.2014
wpisuje datę 30.7.2014, a w wyniku dostaję: 1.8.2014 i 2.8.2014
Ta funkcja działa źle w wielu przypadkach.
P-128294
Brunon3
» 2015-03-13 22:32:24
Inny błąd: wpisuje datę 31.7.2014, a w wyniku dostaję: 32.7.2014
Wypisuje datę kolejnego dnia, kodu nie analizowałem, ale przecież nazwa tego tematu to "wypiszJutrzejsząDatę". :)

-B3.
P-128295
aksen
» 2015-03-13 22:36:09
do #Brunon3
Najpierw myśl, a potem pisz.
P-128296
« 1 » 2
  Strona 1 z 2 Następna strona