2026-27-cpp-homework/feladat4/feladat4/cmydate.cpp
2026-10-29 18:11:21 +01:00

234 lines
No EOL
4.8 KiB
C++

//Tóth Dániel Mátyás | IFPQYY | V1
#include <iostream>
#include "cmydateexception.h"
#include "cmydate.h"
#define TIMESTAMP_YEAR 1970
using namespace std;
static char monthnames[12][11] = {
"Január",
"Február",
"Március",
"Április",
"Május",
"Június",
"Július",
"Augusztus",
"Szeptember",
"Október",
"November",
"December"
};
static bool IsLeapYear(int year);
static int GetMonthDayCount(int month, int year);
static bool IsValidYear(int year);
static bool IsValidMonth(int month);
static bool IsValidDay(int year, int month, int day);
static int DateToTimeStamp(int year, int month, int day);
static void TimeStampToDate(int timestamp, int* year, int* month, int* day);
static int DayOfTheYearArgs(int year, int month, int day);
CMyDate::CMyDate() {
SetYear(1970);
SetMonth(1);
SetDay(1);
}
CMyDate::CMyDate(int year, int month, int day) {
SetYear(year);
SetMonth(month);
SetDay(day);
}
CMyDate::~CMyDate(){
//hey jimmy, get me a destructor with nothing
}
void CMyDate::Display() const {
cout << GetYear() << " " << monthnames[GetMonth() - 1] << " " << GetDay() << ".";
}
int CMyDate::DayOfTheYear() const {
return DayOfTheYearArgs(GetYear(), GetMonth(), GetDay());
}
bool CMyDate::IsValid(int year, int month, int day) const {
IsValidYear(year);
IsValidMonth(month);
IsValidDay(year, month, day);
return true;
}
void CMyDate::AddDays(int days) {
int timestamp = DateToTimeStamp(GetYear(), GetMonth(), GetDay());
int y = 0, m = 0, d = 0;
TimeStampToDate(timestamp + days, &y, &m, &d);
IsValid(y, m, d);
m_iYear = y;
m_iMonth = m;
m_iDay = d;
}
void CMyDate::SubDays(int days) {
AddDays(days * (-1));
}
int CMyDate::DifferenceInDays(const CMyDate& other) const {
int thistmstmp = DateToTimeStamp(GetYear(), GetMonth(), GetDay());
int othertmstmp = DateToTimeStamp(other.GetYear(), other.GetMonth(), other.GetDay());
int result = thistmstmp - othertmstmp;
return result < 0 ? result * (-1) : result;
}
void CMyDate::AddMonths(int months) {
m_iYear += (m_iMonth - 1 + months) / 12;
m_iMonth += ((m_iMonth - 1 + months) % 12) + 1;
try
{
IsValidDay(m_iYear, m_iMonth, m_iDay);
}
catch (CMyDateException e)
{
if (e.what() == CMyDateException::ErrMaxDay)
{
SetDay(GetMonthDayCount(m_iMonth, m_iYear));
}
else
{
throw e;
}
}
}
int CMyDate::GetDay() const {
return m_iDay;
}
int CMyDate::GetMonth() const {
return m_iMonth;
}
int CMyDate::GetYear() const {
return m_iYear;
}
void CMyDate::SetDay(int day) {
if (IsValidDay(m_iYear, m_iMonth, day))
{
m_iDay = day;
}
}
void CMyDate::SetMonth(int month) {
if (IsValidMonth(month))
{
m_iMonth = month;
}
}
void CMyDate::SetYear(int year) {
if (IsValidYear(year))
{
m_iYear = year;
}
}
static bool IsLeapYear(int year) {
if (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0))
{
return true;
}
return false;
}
static int GetMonthDayCount(int month, int year) {
IsValidMonth(month);
switch (month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
return 31;
break;
case 4:
case 6:
case 9:
case 11:
return 30;
break;
case 2:
if (IsLeapYear(year))
{
return 29;
}
else
{
return 28;
}
break;
default:
throw new CMyDateException(CMyDateException::ErrUnexpected);
break;
}
}
static bool IsValidYear(int year) {
if (year < 1970)
{
throw new CMyDateException(CMyDateException::ErrMinYear);
}
return true;
}
static bool IsValidMonth(int month) {
if (month < 1)
{
throw new CMyDateException(CMyDateException::ErrMinMonth);
}
if (month > 12)
{
throw new CMyDateException(CMyDateException::ErrMaxMonth);
}
return true;
}
static bool IsValidDay(int year, int month, int day) {
int monthday = GetMonthDayCount(month, year);
if (day < 1)
{
throw new CMyDateException(CMyDateException::ErrMinDay);
}
if (day > monthday)
{
throw new CMyDateException(CMyDateException::ErrMaxDay);
}
return true;
}
static int DateToTimeStamp(int year, int month, int day) { //counting from 1970-01-01
int y = year - 1;
int e = TIMESTAMP_YEAR - 1;
int days = 365 * (year - TIMESTAMP_YEAR)
+ (y / 4 - e / 4)
- (y / 100 - e / 100)
+ (y / 400 - e / 400);
return days + DayOfTheYearArgs(year, month, day - 1);
}
static void TimeStampToDate(int timestamp, int* year, int* month, int* day) {
*year = TIMESTAMP_YEAR;
while (timestamp < 0)
{
(*year)--;
timestamp += IsLeapYear(*year) ? 366 : 365;
}
while (timestamp >= (IsLeapYear(*year) ? 366 : 365))
{
timestamp -= IsLeapYear(*year) ? 366 : 365;
(*year)++;
}
*month = 1;
int monthDay = GetMonthDayCount(*month, *year);
while (timestamp >= monthDay)
{
timestamp -= monthDay;
(*month)++;
monthDay = GetMonthDayCount(*month, *year);
}
*day = timestamp + 1;
}
static int DayOfTheYearArgs(int year, int month, int day) {
for (size_t i = 1; i < month; i++)
{
day += GetMonthDayCount(i, year);
}
return day;
}