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

Sprawdzenie czy podane liczby mogą stanowić dzień i miesiąc w dacie

Object Storage Arubacloud
+1 głos
373 wizyt
pytanie zadane 8 lutego 2022 w C i C++ przez randy Nowicjusz (170 p.)
edycja 8 lutego 2022 przez ScriptyChris

Witajcie 

Mam do napisania program, polecenie brzmi 

Program, który na podstawie podanych dwóch liczb całkowitych (dzień,
miesiąc) sprawdza czy liczby te mogą stanowić dzień i miesiąc w dacie. Dzień
musi być mniejszy lub równy 31, a miesiąc mniejszy lub równy 12. Obie
wartości muszą być większe od 0. W odpowiedzi podaj zdanie:
„Tak, to może być data” lub
„Nie, miesiąc jest spoza zakresu” lub
„Nie, dzień jest spoza zakresu”
Dod* Po numerze miesiąca sprawdź czy to pierwsze półrocze, czy drugie.

Pisałem w DevC++

#include <iostream>
using namespace std;
int main()

{
	float d,m;
	
	cout<<"Wpisz miesiac: ";
	cin>> m;
	cout<< "Wpisz dzien: ";
	cin>> d;
	
	if(((d>0)&&(d<=31))&&((m>0)&&(m<=12)))
	cout<< "Tak, to moze byc data";
  	
	else
	{	
	    if ((0>m)&&(m>=12))
	    cout<< "Nie, dzien jest spoza zakresu";

	    else

	    if ((0>d)&&(d>=31))
	    cout<< "Nie, miesiac jest spoza zakresu";
	}
	return 0;	
}

program sie kompiluje ale dziala tylko pierwsza opcja ktora pokazuje ze "tak to moze byc ta data"

czego brakuje lub gdzie robie błąd ?

 

pozdrawiam 

komentarz 8 lutego 2022 przez Oscar Nałogowiec (29,290 p.)

Dlaczego d i m zadeklarowałeś jako float?

komentarz 8 lutego 2022 przez VBService Ekspert (253,340 p.)

W treści zadania nawet jest

na podstawie podanych dwóch liczb całkowitych

2 odpowiedzi

0 głosów
odpowiedź 8 lutego 2022 przez randy Nowicjusz (170 p.)
dopiero zaczynam z c++ odznaczylem jako dzien i miesiac - przy pierwszej opcji dziala dlatego idac tym krokiem pisalem dalsza czesc
komentarz 8 lutego 2022 przez Oscar Nałogowiec (29,290 p.)
edycja 8 lutego 2022 przez Oscar

Ale dni i miesiące nie występują w postaci ułamkowej. To są po prostu numery kolejne - a więc liczby całkowite.

A jeśli chodzi o sedno - pomyliłeś warunki. Są pewne prawa logiki zdań (boolowskiej)

Zanegowaniem warunku "a i b" jest "nie a lub nie b". Podobnie zanegowaniem nierówności nieostrej (typu większe lub równe) jest nierówność ostra (mniejsze).

W pierwszym ifie warunki masz zapisane dobrze, ale w kolejnych ifach masz negacje tych warunków ale błędnie zapisane.

 

Tak w ogóle nie jest zalecale pisanie kodu w ten sposób, że powtarzasz te same (lub zanegowane) warunki w kodzie. Bo jeśli znajdziesz błąd w jednym miejscu to możesz zapomnieć/przeoczyć poprawić inne "kopie". Lepiej napisać w taki sposów (pseudokod):
 

if (miesiać ok)
{
    if (dzien ok)
        cout << "wszystko ok" << endl;
    else
        cout << "Zly dzien" << endl;
}
else
    cout << "Zly miesiac" << endl;

Wtedy każde sprawdzenie odbywa się 1 raz.

komentarz 8 lutego 2022 przez tkz Nałogowiec (42,000 p.)

Ale dni i miesiące nie występują w postaci ułamkowej. To są po prostu numery kolejne - a więc liczby całkowite.

Śmichy, chichy, ale są ludzie(klienci), którzy chcą mieć plan(nieważne w jakiej rozdzielczości) w postaci ułamkowej. Wyobraź sobie, że takie systemy trafiają na produkcję gdzie musisz podać plan dnia w postaci 1/8, 1/16, dramat jest przy kwadransach albo niepiątkowych minutach, bo teraz taki petent musi sobie liczyć na kalkulatorze.  

0 głosów
odpowiedź 8 lutego 2022 przez VBService Ekspert (253,340 p.)
edycja 8 lutego 2022 przez VBService

Do tego co napisał @Oscar,

A jeśli chodzi o sedno - pomyliłeś warunki. Są pewne prawa logiki zdań (boolowskiej)

czyli, tu masz błędny zapis

if ((0>m)&&(m>=12))

 

i

 

if ((0>d)&&(d>=31))

do tego jeszcze raczej powinno być od 1 a nie od 0 (zera) i trzeba znak = też usuną bo 12 miesiąc istnieje i 31 dzień też w pewnym sensie istnieje (z pewnymi wyjątkami wink - ale to nie jest treścią zadania)

bo gdy poprawimy warunki, tylko

#include <iostream>
using namespace std;

int main()
 
{
    int d,m;
     
    cout << "Wpisz miesiac: ";
    cin >> m;
    cout << "Wpisz dzien: ";
    cin >> d;
     
    if(((d>0) && (d<=31)) && ((m>0) && (m<=12)))
        cout << "Tak, to moze byc data";
    else
    {   
        if ((m<0) || (m>12))
            cout << "Nie, miesiac jest spoza zakresu";
        else
            if ((d<0) || (d>31))
                cout << "Nie, dzien jest spoza zakresu";
    }

    return 0;   
}

to jak podamy 

"nic" się nie dzieje. wink

No i ten else

        if ((0>m)&&(m>=12))

        cout<< "Nie, dzien jest spoza zakresu";

 

        else

 

        if ((0>d)&&(d>=31))

        cout<< "Nie, miesiac jest spoza zakresu";

bo mogą być  "spoza zakresu":

  • dzień tak, miesiąc tak
  • dzień tak, miesiąc nie
  • dzień nie, miesiąc tak

 

czyli mogło by to wyglądać tak

przykład

#include <iostream>
using namespace std;

int main()
 
{
    int d,m;
     
    cout << "Wpisz miesiac: ";
    cin >> m;
    cout << "Wpisz dzien: ";
    cin >> d;
     
    if(((d>0) && (d<=31)) && ((m>0) && (m<=12)))
    {
        cout << "Tak, to moze byc data\n";
        
        //Po numerze miesiąca sprawdź czy to pierwsze półrocze, czy drugie
        if (... sam wpisz ...)
            cout << "pierwsze polrocze\n";
        else
            cout << "drugie polrocze\n";
    }
    else
    {   
        if ((m<1) || (m>12))
            cout << "Nie, miesiac jest spoza zakresu\n";

        if ((d<1) || (d>31))
            cout << "Nie, dzien jest spoza zakresu\n";
    }

    return 0;   
}

 

P.S.1. błąd jest jeszcze tu, m to miesiąc a jest

if ((0>m)&&(m>=12))

        cout<< "Nie, dzien jest spoza zakresu";

to samo, d to dzień a jest 

if ((0>d)&&(d>=31))

        cout<< "Nie, miesiac jest spoza zakresu";

 

P.S.2 Jeżeli warunek if ma "przyjąć" wartość true to dla:

  • liczb z zakresu używamy && ( and - i )
  • liczb z poza zakresu używamy || ( or - lub )

czyli, np. mamy zakres 1..5

  • z zakresu  ( 1, 2, 3, 4, 5 )
    if (x>0 && x<6) ...
    if (x>=1 && x<=5) ...
  • z poza zakresu ( ..., -1, 0, 6, 7, ... )
    if (x<1 || x>5) ...

 

 

Podobne pytania

0 głosów
1 odpowiedź 258 wizyt
pytanie zadane 22 sierpnia 2016 w SQL, bazy danych przez Pieczenieg Początkujący (290 p.)
0 głosów
1 odpowiedź 155 wizyt
0 głosów
4 odpowiedzi 436 wizyt
pytanie zadane 14 czerwca 2016 w C i C++ przez zkkf56 Dyskutant (8,710 p.)

92,568 zapytań

141,422 odpowiedzi

319,638 komentarzy

61,957 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!

...