Sprawdzanie poprawności dat na podstawie danych pobranych z klawiatury

0

Witam wszystkich, na wstępie przepraszam, jeśli temat by się powtórzył. Pilnie potrzebuję pomocy w względnie prostym programie. Chodzi o to, że niestety miałem pobyt w szpitalu i nie byłem na kilku zajęciach, na których były właśnie te podstawy, a teraz muszę nadrabiać zaległości.

Zadanie 1 : Napisz program, który wczytuje z klawiatury 3 zmienne całkowite (dzień, miesiąc i rok), a następnie sprawdza czy jest to poprawna data (uwzględniając lata przestępne [w treści zaznaczone jest, że rok przestępny to taki, który nie dzieli się przez 4 lub dzieli się przez 100, ale nie przez 400]).

No więc udało mi się napisać coś takiego :

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <windows.h>

using namespace std;


int main()
{
  SetConsoleOutputCP(1250);
    int a, b, c;
    cout << "Podaj dzień:";
    cin >> a;
    cout << "Podaj miesiąc:";
    cin >> b;
    cout << "Podaj rok:";
    cin >> c;
    if(b==1,3,5,7,8,10,12 && a>=1 && a<=31)
	{
	cout << "Data prawidłowa" << endl;
	}
	if(b==4,6,9,11 && a>= 1 && a<=30)
	{
	cout << "Data prawidłowa" << endl;
	}
	if(b==2 && a>= 1 && a<=28)
	{
	cout << "Data prawidłowa" << endl;
	}
	if(b==2 && a>= 1 && a<=28 && ((c%4)!=0 || ((c%100)=0 && (c%400)!=0))
	{
	cout << "Data prawidłowa" << endl;
	}
	else
	{
    cout << "Data nieprawidłowa" << endl;
	}
	return 0;
}

No i, jak pewnie widać głównym problemem jest zmienna b i c. Tutaj pojawia się moje pytanie, jak utworzyć coś na kształt zbioru matematycznego b = {1,3,5,7,8,9,11,12} no i jak wykonać te obliczenia w c. Oczywiście przeanalizuję także inne propozycje wykonania tego zadania, bo zapewne, jako żółtodziób zrobiłem to mało profesjonalnie. Z góry dziękuję za pomoc.

0

Zmieniłem na coś takiego :

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <windows.h>

using namespace std;


int main()
{
	SetConsoleOutputCP(1250);
    int a, b, c;
	cout << "Podaj dzień:";
    cin >> a;
    cout << "Podaj miesiąc:";
    cin >> b;
    cout << "Podaj rok:";
    cin >> c;
    if(b==1,3,5,7,8,10,12 && a>=1 && a<=31)
	{
	cout << "Data prawidłowa" << endl;
	}
	if(b==4,6,9,11 && a>= 1 && a<=30)
	{
	cout << "Data prawidłowa" << endl;
	}
	if(b==2 && a>= 1 && a<=28)
	{
	cout << "Data prawidłowa" << endl;
	}
	if(b==2 && a>= 1 && a<=29 && ((c%4)==0 && ((c%100)!=0 || (c%400)==0)))
{
	cout << "Data prawidłowa" << endl;
	}
	else
	{
    cout << "Data nieprawidłowa" << endl;
	}
	return 0;
}

Program się uruchamia, jednak jest kilka błędów

  1. Tylko w momencie gdy wpisze się dzień większy niż deklarowałem (np. 34) to pojawia się komunikat o nieprawidłowej dacie, natomiast po wpisaniu np. 14 miesiąca pojawia się komunikat :
Data prawidłowa
Data prawidłowa
Data nieprawidłowa

No więc nierozwiązana pozostaje kwestia zbioru o którym mówiłem (po prostu nie wiem jak przedstawić b=1,3,5,7,8,10,12 jako b={1,3,5,7,8,10,12}), no i tego by nie wyświetlało tych trzech komunikatów na raz, ale zakładam, że jedno rozwiąże się przy okazji drugiego.

0

Popraw jeszcze nawiasy w tej samej linii. Przeczytaj dokładnie wiki.

W linii 19 masz coś co fajnie jakby było w C, ale niestety nie ma - zbiory.
Niestety poprawienie tego to nie będzie jedna linijka.

0

W mojej opinii to powinno wyglądać tak, co nadal nie rozwiązuje problemu pojawiania się trzech komunikatów na raz :/

if(b==2 && a>= 1 && a<=29 && (((c%4)==0 && (c%100)!=0) || (c%400)==0))
0

Jeśli kogoś by to interesowało, to tak działa. Może nie wygląda najlepiej, ale przecież nie o to chodzi, prawda? :) Dzięki wielkie za pomoc.

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <windows.h>

using namespace std;


int main()
{
	SetConsoleOutputCP(1250);
    int a, b, c;
	cout << "Podaj dzień:";
    cin >> a;
    cout << "Podaj miesiąc:";
    cin >> b;
    cout << "Podaj rok:";
    cin >> c;
    if(b==1 || b==3 || b==5 || b==7 || b==8 || b==10 || b==12 && a>=1 && a<=31)
	{
	cout << "Data prawidłowa" << endl;
	}
	if(b==4 || b==6 || b==9 || b==11 && a>= 1 && a<=30)
	{
	cout << "Data prawidłowa" << endl;
	}
	if(b==2 && a>= 1 && a<=28)
	{
	cout << "Data prawidłowa" << endl;
	}
	if(b==2 && a>= 1 && a<=29 && (((c%4)==0 && (c%100)!=0) || (c%400)==0))
    {
	cout << "Data prawidłowa" << endl;
	}
	else
	{
    cout << "Data nieprawidłowa" << endl;
	}
	return 0;
}
0

Lepiej rozbić na mniejsze funkcje i od razu przyjemniej się czyta i łatwiej debuguje.

Tu masz funkcję która będzie zwracała true jeżeli rok jest przestępny, w przeciwnym razie false.

bool is_leap_year(int year)
{
	if (year % 4 == 0 && year % 100 != 0)
		return true;
	else if (year % 400 == 0)
		return true;
	else
		return false;
}

Następnie można napisać funkcję która będzie zwracała maksymalną ilość dni. Musi ona przyjąć 2 parametry - miesiąc oraz czy rok jest przestępny.

Do sierpnia:
Miesiące parzyste mają 30 dni (za wyjątkiem lutego)
Nieparzyste - 31

Potem:
Parzyste - 31
Nieparzyste - 30

#define FEBRUARY 2
#define JULY 7

int max_days_in_month(int month, bool leap_year)
{
	if (month == FEBRUARY)
	{
		return leap_year ? 29 : 28;
	}

	if (month <= JULY)
	{
		return month % 2 == 0 ? 30 : 31;
	}

	return month % 2 == 0 ? 31 : 30;
}

I na końcu funkcja sprawdzająca poprawność dat:

bool is_correct_date(int day, int month, int year)
{
	if (day <= 0 || day > 31 || month <= 0 || month > 12)
		return false;

	int max_days = max_days_in_month(month, is_leap_year(year));
	
	return day <= max_days;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1