• 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

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
+1 głos
543 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,340 p.)

Dlaczego d i m zadeklarowałeś jako float?

komentarz 8 lutego 2022 przez VBService Ekspert (256,320 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,340 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,020 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 (256,320 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ź 312 wizyt
pytanie zadane 22 sierpnia 2016 w SQL, bazy danych przez Pieczenieg Początkujący (290 p.)
0 głosów
1 odpowiedź 176 wizyt
0 głosów
4 odpowiedzi 586 wizyt
pytanie zadane 14 czerwca 2016 w C i C++ przez zkkf56 Dyskutant (8,710 p.)

93,187 zapytań

142,201 odpowiedzi

322,012 komentarzy

62,514 pasjonatów

Advent of Code 2024

Top 15 użytkowników

  1. 2127p. - dia-Chann
  2. 2092p. - Łukasz Piwowar
  3. 2079p. - Łukasz Eckert
  4. 2037p. - Tomasz Bielak
  5. 2006p. - rucin93
  6. 2006p. - Michal Drewniak
  7. 2005p. - Łukasz Siedlecki
  8. 1964p. - CC PL
  9. 1946p. - Adrian Wieprzkowicz
  10. 1901p. - Mikbac
  11. 1744p. - rafalszastok
  12. 1734p. - Anonim 3619784
  13. 1586p. - Dawid128
  14. 1520p. - Marcin Putra
  15. 1480p. - ssynowiec
Szczegóły i pełne wyniki

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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...