kinguska__15 Temat założony przez niniejszego użytkownika |
[C++] Funkcja CzyPoprawnaData » 2015-03-10 10:26:39 Hej, od niedawna uczę się programować w C++ i mam do napisania program z funkcją CzyPoprawnaData. Program ma wczytywać dzień, miesiąc i rok, a następnie funkcja ma zwracać wartość 0, gdy data jest poprawna, a 1, gdy data jest niepoprawna. Mój problem leży prawdopodobnie gdzieś w instrukcji if, ponieważ program za każdym razem mówi mi, że data jest niepoprawna (czyli zwraca 0). Pisałam już kilka wersji i każda działa mi niepoprawnie.. Może ktoś z Was potrafiłby pomóc mi w zrozumieniu, co robię źle? Czy chodzi o jakieś złe zagnieżdżenie w sobie warunków, czy o co? #include <iostream> #include <cstdlib> using namespace std;
int CzyPoprawnaData( int dzien, int miesiac, int rok ) { if((( dzien <= 31 ) &&( dzien >= 1 ) ) &&(( miesiac >= 1 ) &&( miesiac <= 12 ) ) &&( rok >= 0 ) ) { if(( dzien == 31 ) &&( miesiac ==!2 ) &&((( miesiac % 2 == 1 ) &&( miesiac <= 7 ) ) ||(( miesiac % 2 == 0 ) &&( miesiac >= 8 ) ) ) ) return 1; if(( dzien <= 30 ) &&( miesiac ==!2 ) ) return 1; if(( dzien == 29 ) &&( miesiac == 2 ) ) { if((( rok % 4 == 0 ) &&( rok % 100 != 0 ) ) ||( rok % 400 == 0 ) ) return 1; else return 0; } if( dzien <= 28 ) return 1; else return 0; } else return 0; }
int main()
{ int dzien; int miesiac; int rok; cout << "Podaj dzien: "; cin >> dzien; cout << "Podaj miesiac: "; cin >> miesiac; cout << "Podaj rok: "; cin >> rok; CzyPoprawnaData( dzien, miesiac, rok ); }
I druga wersja (myślałam, że już będzie dobra. Int() jest taki sam, jak w pierwszej wersji): #include <iostream> #include <cstdlib> using namespace std;
int CzyPoprawnaData( int dzien, int miesiac, int rok ) { if((( dzien <= 31 ) &&( dzien >= 1 ) ) &&(( miesiac >= 1 ) &&( miesiac <= 12 ) ) &&( rok >= 0 ) ) { if(( dzien == 31 ) &&( miesiac ==!2 ) &&((( miesiac % 2 == 1 ) &&( miesiac <= 7 ) ) ||(( miesiac % 2 == 0 ) &&( miesiac >= 8 ) ) ) ) return 1; if( dzien <= 30 ) { if( miesiac ==!2 ) return 1; if( miesiac == 2 ) { if( dzien == 29 ) { if((( rok % 4 == 0 ) &&( rok % 100 != 0 ) ) ||( rok % 400 == 0 ) ) return 1; else return 0; } if( dzien <= 28 ) return 1; } } } else return 0; }
|
|
aksen |
» 2015-03-10 11:03:48 Nie działa za każdym razem źle. np. data dzisiejsza daje poprawny wynik (innych dat ne sprawdzałem). Zamiast 0 i 1 zwracaj raczej true i false. int main() { int dzien; int miesiac; int rok; cout << "Podaj dzien: "; cin >> dzien; cout << "Podaj miesiac: "; cin >> miesiac; cout << "Podaj rok: "; cin >> rok; cout << CzyPoprawnaData( dzien, miesiac, rok ) << endl; return 0; }
|
|
aksen |
» 2015-03-10 11:31:47 można tę funkcję napisać dużo czytelniej i prościej: #include <iostream> #include <cstdlib> using namespace std;
bool 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 false; if( miesiac < 1 || miesiac > 12 ) return false; if( dzien < 1 || dzien > dniMiesiaca[ miesiac - 1 ] ) return false; if( dzien == 29 && miesiac == 2 ) { if( !(( rok % 4 == 0 && rok % 100 != 0 ) || rok % 400 == 0 ) ) return false; } return true; }
int main() { int dzien; int miesiac; int rok; cout << "Podaj dzien: "; cin >> dzien; cout << "Podaj miesiac: "; cin >> miesiac; cout << "Podaj rok: "; cin >> rok; cout << CzyPoprawnaData( dzien, miesiac, rok ) << endl; return 0; }
|
|
kinguska__15 Temat założony przez niniejszego użytkownika |
» 2015-03-10 11:32:26 U mnie za KAŻDYM razem zwraca 0. Już rozwiązałam problem, wykasowałam w funkcji int main() fragment: CzyPoprawnaData( dzien, miesiac, rok ); i zamieniłam na: int x = CzyPoprawnaData( dzien, miesiac, rok ); cout << x; i działa jak ta lala. :) Zastanawia mnie jednak w takim razie, dlaczego u Ciebie działa wszystko okej: czy to może być kwestia innego kompilatora? |
|
kinguska__15 Temat założony przez niniejszego użytkownika |
» 2015-03-10 11:36:10 Rzeczywiście, jest dużo czytelniej :) Jednak na potrzeby uczelni funkcja ma mi zwracać 0 lub 1, ale potem wprowadzę zmiany w tej funkcji wrzuconej przez Ciebie i powinno być ok. Dzięki wielkie! |
|
aksen |
» 2015-03-10 11:37:52 To nie wina kompilatora tylko złe użycie funkcji. taka funkcja nic nie wypisuje: CzyPoprawnaData( dzien, miesiac, rok );
musisz użyć cout (nie potrzeba do tego dodatkowo deklarować "x") cout << CzyPoprawnaData( dzien, miesiac, rok ) << endl;
|
|
kinguska__15 Temat założony przez niniejszego użytkownika |
» 2015-03-10 12:17:51 Ok, dzięki wielkie. Zamykam temat :) |
|
« 1 » |