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. #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 }; if( rok < 0 ) return 0; if( miesiac < 1 || miesiac > 12 ) return 0; if( dzien < 1 || dzien > dniMiesiaca[ miesiac - 1 ] ) return 0; if( dzien == 29 && miesiac == 2 ) { if( !(( rok % 4 == 0 && rok % 100 != 0 ) || rok % 400 == 0 ) ) return 0; } return 1; }
void WypiszJutrzejszaDate( int dzien, int miesiac, int rok ) { int x = CzyPoprawnaData( dzien, miesiac, rok ); if( x == 1 ) { 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 ); }
|
|
aksen |
» 2015-03-13 11:29:17 Niestety niewiele nauczyłaś się z funkcji "CzyPoprawnaData" testuj: 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; } if( dzien == 28 && miesiac == 2 ) { if((( rok % 4 == 0 && rok % 100 != 0 ) || rok % 400 == 0 ) ) dzien++; else { dzien = 1; miesiac++; } cout << dzien << "." << miesiac << "." << rok << endl; return; } if( dzien == 31 && miesiac == 12 ) { dzien = 1; miesiac = 1; rok++; cout << dzien << "." << miesiac << "." << rok << endl; return; } if( dzien == dniMiesiaca[ miesiac - 1 ] ) { dzien = 1; miesiac++; cout << dzien << "." << miesiac << "." << rok << endl; return; } dzien++; cout << dzien << "." << miesiac << "." << rok << endl; }
|
|
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? |
|
michal11 |
» 2015-03-13 20:25:29 Zdebuguj to będziesz wiedziała. |
|
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) void WypiszJutrzejszaDate( int dzien, int miesiac, int rok ) { int x = CzyPoprawnaData( dzien, miesiac, rok ); if( x == 1 ) { if(( miesiac == 12 ) &&( dzien == 31 ) ) { dzien = 1; miesiac = 1; rok = rok + 1; cout << dzien << "." << miesiac << "." << rok << " pierwszy wydruk " << 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 << " drugi wydruk " << endl; } } else { cout << "Podana data jest bledna" << endl; } }
|
|
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. |
|
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. |
|
aksen |
» 2015-03-13 22:36:09 do #Brunon3 Najpierw myśl, a potem pisz. |
|
« 1 » 2 |