• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

sprawdzenie poprawności daty

Object Storage Arubacloud
0 głosów
2,531 wizyt
pytanie zadane 17 sierpnia 2016 w C i C++ przez 87kelthuzad Obywatel (1,270 p.)

Witam mam taki problem chce by urzytkownik do tablicy char wpisał (taki format daty dd-mm-rrrr) date. I następnie chce ją sprawdzić i staram się kombinować na if ale coś nie wychodzi:

double payCash( double budget )
{
    char answer;
    do
    {
        string cashPurchases = {};
        char date[9] = {};
        double issuedMoney = 0;
        cout << "Podaj na co wydales/as pieniadze: ";
        cin >> cashPurchases;
        cout << "Podaj date foramt daty dd-mm-rrrr ";
        while ( true )
        {
            cin >> date;
            checkDate( date );
        }
    }
    while ( answer );


}

//===========================================================================================

int checkDate( char data[] )
{
    cout << "sprawdzam date" << endl;
    if ( ((data[0] == 0) && ( 1 <= data[1] <= 9)) || ((1 <= data[0] <= 3 ) && ( 0 <= data[1] <= 9)) )
    {
            cout << "masz porawny dzien" << endl;
    }
}

To jest tylko część kodu a dokładnie 2 funkcje ( reszta działa ). I tu moje pytanie czy może jest jakaś funkcja do tego. Słyszałem o wyrażeniach regularnych (regux) ale jak czytam to jest do wyszukiwania pewnych wzorców ale nie chyba do sprawdzania poprawności. Bo ja potrzebuje sprawdzić np czy dzień jest odpowiedni bo np 40 jest zły a 13 już ok. Czy może szybciej będzie jak do tego zrobię 3 tablice i będę sprawdzał np if ( 0 < data < 31 )  to ok??

3 odpowiedzi

0 głosów
odpowiedź 17 sierpnia 2016 przez criss Mędrzec (172,590 p.)
wybrane 17 sierpnia 2016 przez 87kelthuzad
 
Najlepsza

To:

( 1 <= data[1] <= 9)

zwróci true zawsze. Podobnie jak pozostałe tego typu porównania w linii 28.

Kompialtor to rozumie tak: ( ( 1 <= data[1]) <= 9)

Ostatecznie porównujesz wynik nierówności 1 <= data[1] (bool) z dziewiątką (9). Tyle, że bool przechowuje tylko wartości 0 oraz 1, a obie te wartości są mniejsze od 9. Tak więc... Musisz to zapisać tak:

1 <= data[1] && data[1] <= 9

0 głosów
odpowiedź 17 sierpnia 2016 przez 87kelthuzad Obywatel (1,270 p.)

ok dzięki ale jeszcze czegoś nie kumam chce sprawdzić od 00 01 02 i tak dalej do 09 ale nic się nie dzieje nie pokazuje mi że dzień jest podany poprawnie:

int checkDate( char data[] )
{
    cout << "sprawdzam date" << endl;
    if ( data[0] == 0 && ( (1 <= data[1]) || (data[1] <= 9) ) /*|| ((1 <= data[0] <= 3 ) && ( 0 <= data[1] <= 9))*/ )
    {
            cout << "masz porawny dzien" << endl;
    }
}

 

komentarz 17 sierpnia 2016 przez criss Mędrzec (172,590 p.)

Odpowiadaj w komentarzach do mojej odpowiedzi, wtedy dostaje powiadomienia :P

Jednej rzeczy nie zauważyłem. To jest tablica charów. Także porównuj to ze znakiem, nie z liczbą (swoja drogą odpowiadającą numerowi ascii jakiegoś znaku/sygnału).

(char to też liczba, ale pisząc '1' masz na myśli numer ascii znaku '1' który jest równy 49 http://www.asciitable.com/index/asciifull.gif )

W ten sposób:

'1' <= data[1] && data[1]  <= '9'

Btw: 

 (1 <= data[1]) || (data[1] <= 9) 

Dlaczego || a nie &&?

komentarz 17 sierpnia 2016 przez criss Mędrzec (172,590 p.)
Poza tym: zupełnie niepotrzebne zadeklarowane zwracane typy.

double payCash - w ciele funkcji nie ma żadnego return, a tym bardziej nie double.

int checkDate - to samo - żadnego return

Jak funkcja nic nie zwraca to powiedz to kompilatorowi, pisząc void jako typ zwracany.
komentarz 17 sierpnia 2016 przez 87kelthuzad Obywatel (1,270 p.)
Wielkie dzięki za pomoc a te dwie funkcje będą zwracać int i double ale jeszcze nie są skończone :D
0 głosów
odpowiedź 26 sierpnia 2016 przez 9au5a Początkujący (280 p.)
WItam :)

Z gory przepraszam za brak polskich znakow, ale niestety nie mam.

Jesli chcialbys zobaczyc jak wyglada naprawde przemyslana i pelna pomyslow klasa obslugujaca daty to polecam Ci ksiazke tworcy C++´a - "Programowanie. Teoria i praktyka z wykorzystaniem C++"  (dokladniej rozdzial 9. :) ).

Tak na szybko to moge Ci powiedziec, ze zapisywanie daty w tyblicy char nie jest zbyt dobrym pomyslem/praktyka, naprawde duzo lepiej jest stworzyc klase z trzema danymi (dzien, miesiac, rok) i albo dla kazdego uzyc typu int (latwiej), albo dla miesiaca sie pobawic i napisac enum :) Do tego proste funkcie typu bool check_day (gdzie np. w switch w jednym case mozesz wybrac miesace, ktore maja 31 dni i sprawdzin czy dany dzien jest poprawy, w drugim dla 30dniowych i 3 case dla lutego)..

Podobne pytania

0 głosów
1 odpowiedź 1,412 wizyt
pytanie zadane 23 marca 2016 w PHP przez GaCeL Dyskutant (7,500 p.)
0 głosów
1 odpowiedź 194 wizyt
pytanie zadane 8 lutego 2019 w PHP przez progNewbie Obywatel (1,130 p.)
0 głosów
1 odpowiedź 310 wizyt
pytanie zadane 28 stycznia 2016 w PHP przez gryzon Początkujący (480 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...