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

[C++] Funkcja CzyPoprawnaData

Ostatnio zmodyfikowano 2015-03-10 12:17
Autor Wiadomość
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?

C/C++
#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):
C/C++
#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;
   
}
P-128072
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.

C/C++
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;
   
   
    // cout << CzyPoprawnaData( 10, 3, 2015 ) << endl;
   
    // system("pause");
    return 0;
}
P-128075
aksen
» 2015-03-10 11:31:47
można tę funkcję napisać dużo czytelniej i prościej:

C/C++
#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 };
   
    // sprawdzamy rok
    if( rok < 0 )
         return false;
   
    // sprawdzamy nr miesiaca
    if( miesiac < 1 || miesiac > 12 )
         return false;
   
    // sprawdzamy dni miesiaca
    if( dzien < 1 || dzien > dniMiesiaca[ miesiac - 1 ] )
         return false;
   
    //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 false;
       
    }
   
    return true; // brak bledow
}


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;
   
   
    //system("pause");
    return 0;
}
P-128076
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:

C/C++
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?
P-128077
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!
P-128078
aksen
» 2015-03-10 11:37:52
To nie wina kompilatora tylko złe użycie funkcji.

taka funkcja nic nie wypisuje:
C/C++
CzyPoprawnaData( dzien, miesiac, rok );

musisz użyć cout (nie potrzeba do tego dodatkowo deklarować "x")
C/C++
cout << CzyPoprawnaData( dzien, miesiac, rok ) << endl;
P-128079
kinguska__15
Temat założony przez niniejszego użytkownika
» 2015-03-10 12:17:51
Ok, dzięki wielkie. Zamykam temat :)
P-128080
« 1 »
  Strona 1 z 1