program do obliczeń dat c++

0

Witam. Piszę program do operacji na datach i stanąłem w martwym punkcie. Zrobiłem wyświetlanie dat w trzech formach jako trzy klasy. Chciałbym zrobić jeszcze operator odejmowania dwóch dat, próbowałem zrobić jako algorytm zamiany na dni juliańskie, odejmowanie i z powrotem na gregoriańskie. Efekt jest taki, że kompletnie się nie trzyma to rzeczywistości. Nie mogę sobie z tym poradzić, tym bardziej, że chcę aby wartość była pobierana z wartości w konstruktorze. Istnieje biblioteka 'time.h' i być może tu jest pies pogrzebany ale nie bardzo wiem jak z tego skorzystać. Dodatkowo chcę jeszcze aby przy pomocy operatora '<' przesunąć datę o zadaną ilość d/m/r, myślę, że rozwiązanie mogłoby być podobne aczkolwiek nie mogę sobie z tym poradzić. Z góry dzięki za wszelkie rady. Pozdrawiam. Chodzi o c++ oczywiście, dalej kod, który napisałem do tej pory.

#include <iostream>
#include <cmath>
#include <string>
#include <time.h>

using namespace std;

class Data1;

class Data
{
public:
	unsigned int dzien;
	unsigned int miesiac;
	unsigned int rok;
public:

	Data ();			//konstruktor domniemanny

	Data (const unsigned int &d, const unsigned int &m, const unsigned int &r);	//konstuktor par

	~Data ();

	virtual void drukuj();

	Data operator - (const Data &dod);

	int setdzien(const int &d);

	int getdzien();

	int setmiesiac(const int &m);
	int getmiesiac(const int &m);
	int setrok(const int &r);
	int getrok(const int &r);
};

Data::Data() : dzien(0) , miesiac(0), rok(0)
{
}

Data::Data(const unsigned int &d, const unsigned int &m, const unsigned int &r) //: dzien(d), miesiac(m), rok(r)
{
	cout << "konstr" << endl;

		//dzien = d;
	
	if(d<31)
	{
		dzien = d;
	}
	else
	{
		dzien=0;
		cout << "bledna data!!" << endl;
	}
	//drukuj();
	miesiac = m;
	rok = r;
}

Data::~Data()
{
	cout << "destr" << endl;
}

void Data::drukuj()
{
	//if(dzien!=0)
	//{
	//cout << " Drukuje date w formacie dd-mm-rrrr \n" ;

	cout.fill('0');
	cout.width(2);
	cout << dzien << "-";
	cout.fill('0');
	cout.width(2);
	cout << miesiac << "-";
	cout.fill(' ');
	cout.width(4);
	cout << rok << endl;
	//}
}

Data Data::operator - (const Data &dod)
{
	DateTime t = DateTime.now;

	Data tmp1;
	double X, A, Y, V, B, Q, C, W, E, JD;
	double X1, A1, Y1, V1, B1, Q1, C1, W1, E1, JD1;
	double W2, X2, U2, Y2, Z2, A2, B2, C2, E2, F2;
	double sum;

	X = (dod.miesiac + 9) / 12;
	A = 4716 + dod.rok + int(X);
	Y = 275 * dod.miesiac / 9;
	V = 7 * A / 4;
	B = 1729279.5 + (367 * dod.rok) + int(Y) + int(V) + dod.dzien;
	Q = (A + 83) / 100;
	C = int(Q);
	W = 3 * (C + 1) / 4;
	E = int(W);
	JD = B + 38 - E;

	X1 = (miesiac + 9) / 12;
	A1 = 4716 + rok + int(X1);
	Y1 = 275 * miesiac / 9;
	V1 = 7 * A1 / 4;
	B1 = 1729279.5 + (367 * rok) + int(Y1) + int(V1) + dzien;
	Q1 = (A1 + 83) / 100;
	C1 = int(Q1);
	W1 = 3 * (C1 + 1) / 4;
	E1 = int(W1);
	JD1 = B1 + 38 - E1;
	
	sum = JD - JD1;

	W2 = sum + 0.5;
	X2 = int(W2);
	U2 = W2 - X2;
	Y2 = int((X2 + 32044.5) / 36524.25);
	Z2 = X2 + Y2 - int(Y2 / 4) - 38;
	A2 = Z2 + 1524;
	B2 = int((A2 - 122.1) / 365.25);
	C2 = A2 - int(365.25 * B2);
	E2 = int(C2 / 30.61);
	F2 = int(E2 / 14);

	tmp1.rok = int(B2 - 4716 + F2);
	tmp1.miesiac = int(E2 - 1 - (12 * F2));
	tmp1.dzien = int(C2 + U2 - int(153 * E2 / 5));
	
	return tmp1;
}

//int Data::setdzien(const int &d)
//{
//	//dzien = d;
//	if(d<31)
//	{
//		dzien = d;
//		return dzien;
//	}
//	else
//	{
//		dzien=0;
//		cout << "bledna data!!" << endl;
//		return 0;
//	}
//}
//
//int Data::getdzien()
//	{
//		return dzien;
//	}

class Data1 : public Data
{
public:
	string miesiac;
public:

	Data1();
	
	Data1 (const unsigned int &d, string m, const unsigned int &r);

	~Data1();

	void drukuj();

	int zamien();
};

Data1::Data1() 
{
	dzien = 0;
	miesiac;
	rok = 0;

}

Data1::Data1(const unsigned int &d, string m, const unsigned int &r)
{
	dzien = d;
	miesiac = m;
	rok = r;
	cout << "konst1" << endl;
	zamien();
}

Data1::~Data1()
{
	cout << "destr1" << endl;
}

void Data1::drukuj()
{
	//if(dzien!=0)
	//{
	//cout << " Drukuje date w formacie dd-mm-rrrr \n" ;

	cout.fill('0');
	cout.width(2);
	cout << dzien << " ";
//	cout.fill('0');
//	cout.width(2);
	cout << miesiac << " ";
	cout.fill(' ');
	cout.width(4);
	cout << rok << endl;
	//}

	//string str = miesiac;
	//int i = atoi(str.c_str());

	//cout << " \t miesiac w int  = " << i << endl;
}

int Data1::zamien()
{
	int tmp;
	if(miesiac=="styczen")
	{
		//m=miesiac;
		tmp=1;
		cout<< tmp << endl;
		return tmp;
	}
	else if(miesiac=="luty")
	{
		//m=miesiac;
		tmp=2;
		cout << tmp << endl;
		return tmp;
	}
	else if(miesiac=="marzec")
	{
		//m=miesiac;
		tmp=3;
		cout<< tmp << endl;
		return tmp;
	}
	else if(miesiac=="kwiecien")
	{
		//m=miesiac;
		tmp=4;
		cout<< tmp << endl;
		return tmp;
	}
	else if(miesiac=="maj")
	{
		//m=miesiac;
		tmp=5;
		cout<< tmp << endl;
		return tmp;
	}
	else if(miesiac=="czerwiec")
	{
		//m=miesiac;
		tmp=6;
		cout<< tmp << endl;
		return tmp;
	}
	else if(miesiac=="lipiec")
	{
		//m=miesiac;
		tmp=7;
		cout<< tmp << endl;
		return tmp;
	}
	else if(miesiac=="sierpien")
	{
		//m=miesiac;
		tmp=8;
		cout<< tmp << endl;
		return tmp;
	}
	else if(miesiac=="wrzesien")
	{
		//m=miesiac;
		tmp=9;
		cout<< tmp << endl;
		return tmp;
	}
	else if(miesiac=="pazdziernik")
	{
		//m=miesiac;
		tmp=10;
		cout<< tmp << endl;
		return tmp;
	}
	else if(miesiac=="listopad")
	{
		//m=miesiac;
		tmp=11;
		cout<< tmp << endl;
		return tmp;
	}
	else if(miesiac=="grudzien")
	{
		//m=miesiac;
		tmp=12;
		cout<< tmp << endl;
		return tmp;
	}
	else
	{
		cout << " nie ma takiego miesiaca " << endl;
		tmp = 0;
		return 0;
	}
	
}

class Data2 : public Data1
{
public:

	Data2();
	
	Data2 (const unsigned int &d, string m, const unsigned int &r);

	~Data2();

	void drukuj();

	int zamien();
};

Data2::Data2() 
{
	dzien = 0;
	miesiac;
	rok = 0;

}

Data2::Data2(const unsigned int &d, string m, const unsigned int &r)
{
	dzien = d;
	miesiac = m;
	rok = r;
	cout << "konst2" << endl;
}

Data2::~Data2()
{
	cout << "destr2" << endl;
}

void Data2::drukuj()
{
	//if(dzien!=0)
	//{
	//cout << " Drukuje date w formacie dd-mm-rrrr \n" ;

	cout.fill('0');
	cout.width(2);
	cout << dzien << ".";
//	cout.fill('0');
//	cout.width(2);
	cout << miesiac << ".";
	cout.fill(' ');
	cout.width(4);
	cout << rok << endl;
	//}
}

int Data2::zamien()
{
	int tmp;
	if(miesiac=="I")
	{
		//m=miesiac;
		tmp=1;
		cout<< tmp << endl;
		return tmp;
	}
	else if(miesiac=="II")
	{
		//m=miesiac;
		tmp=2;
		cout << tmp << endl;
		return tmp;
	}
	else if(miesiac=="III")
	{
		//m=miesiac;
		tmp=3;
		cout<< tmp << endl;
		return tmp;
	}
	else if(miesiac=="IV")
	{
		//m=miesiac;
		tmp=4;
		cout<< tmp << endl;
		return tmp;
	}
	else if(miesiac=="V")
	{
		//m=miesiac;
		tmp=5;
		cout<< tmp << endl;
		return tmp;
	}
	else if(miesiac=="VI")
	{
		//m=miesiac;
		tmp=6;
		cout<< tmp << endl;
		return tmp;
	}
	else if(miesiac=="VII")
	{
		//m=miesiac;
		tmp=7;
		cout<< tmp << endl;
		return tmp;
	}
	else if(miesiac=="VIII")
	{
		//m=miesiac;
		tmp=8;
		cout<< tmp << endl;
		return tmp;
	}
	else if(miesiac=="IX")
	{
		//m=miesiac;
		tmp=9;
		cout<< tmp << endl;
		return tmp;
	}
	else if(miesiac=="X")
	{
		//m=miesiac;
		tmp=10;
		cout<< tmp << endl;
		return tmp;
	}
	else if(miesiac=="XI")
	{
		//m=miesiac;
		tmp=11;
		cout<< tmp << endl;
		return tmp;
	}
	else if(miesiac=="XII")
	{
		//m=miesiac;
		tmp=12;
		cout<< tmp << endl;
		return tmp;
	}
	else
	{
		cout << " nie ma takiego miesiaca " << endl;
		tmp = 0;
		return 0;
	}
	
}

int main ()
{

	Data data1(2,2,2002);
	data1.drukuj();
	Data data4(5,5,505);
	data4.drukuj();
	Data data5;
	data5 = data1 - data5;
	data5.drukuj();
	//data1.setdzien(60);
	//Data data2(data1.getdzien(), 5, 2020);
	//data1.drukuj();
	Data1 data2(02, "czerwiec", 2015);
	data2.drukuj();

	//data2.zamien();

	Data2 data3(02,"X",2025);
	data3.drukuj();
	
}
4

Wersja "zamien" napisana z użyciem mózgu a nie palców:

map<string, int> m = {{"I", 1}, {"II", 2}, {"III", 3}, {"IV", 4}, {"V", 5}, {"VI", 6}, {"VII", 7}, {"VIII", 8}, {"IX", 9}, {"X", 10}, {"XI", 11}, {"XII", 12}};
if (m.count(key)){
    int tmp = m[miesiac];
    cout<< tmp << endl;
    return tmp;
}else{
    cout << " nie ma takiego miesiaca " << endl;
    return 0;
}

Widzisz pewną różnicę między tym co naipsałeś a tym kodem? Za każde użycie ctrl+c i ctrl+v przy włączonym IDE powinien wybuchać monitor.

2
  1. Człowieku nie znasz tablic a bierzesz się za klasy?
  2. Niech konstruktory (bo powinno być kilka) konwertują podaną datę na liczbę dni od jakieś tam ustalonej przez ciebie daty
  3. Przesunięcie dat rób za pomocą operatora << bo operatory < > <= >= == != powinny normalnie porównywać dwie daty
  4. Obejrzyj sobie dokumentacje funkcji strftime, może wystarczy że twoja klasa dobrze to opakuje.
1

Dzięki! Zaczynam szukać. Co do mózgu to rzeczywiście mało w życiu programowałem, to nie znaczy, że nie mogę, a optymalizacja jak zakładam przychodzi wraz z doświadczeniem. Za to jestem zobowiązany za udzielenie mi wskazówki! A co do pytania o klasy to tak wolę tak zaczynać, myślę, że ominę wówczas złe nawyki.

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