From bc87732585c77fe40a54f76260da1c670a001a18 Mon Sep 17 00:00:00 2001 From: Damimani <41192030+Damimani@users.noreply.github.com> Date: Thu, 29 Oct 2026 18:11:21 +0100 Subject: [PATCH] feladat4 done, needs unit tests --- .../IFPQYY_feladat3V1/IFPQYY_feladat3V1.zip | Bin 3665 -> 0 bytes feladat4/feladat4/cmydate.cpp | 303 ++++++++++-------- feladat4/feladat4/cmydate.h | 4 +- feladat4/feladat4/cmydateexception.cpp | 28 +- feladat4/feladat4/cmydateexception.h | 13 +- feladat4/feladat4/feladat4.vcxproj | 1 + feladat4/feladat4/main.cpp | 91 +++++- 7 files changed, 302 insertions(+), 138 deletions(-) delete mode 100644 feladat3/IFPQYY_feladat3V1/IFPQYY_feladat3V1.zip diff --git a/feladat3/IFPQYY_feladat3V1/IFPQYY_feladat3V1.zip b/feladat3/IFPQYY_feladat3V1/IFPQYY_feladat3V1.zip deleted file mode 100644 index abac7ed86d54810f45addee16efdbe59c6e76de2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3665 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 diff --git a/feladat4/feladat4/cmydate.cpp b/feladat4/feladat4/cmydate.cpp index ee4eadf..f1da396 100644 --- a/feladat4/feladat4/cmydate.cpp +++ b/feladat4/feladat4/cmydate.cpp @@ -1,81 +1,40 @@ -//Tóth Dániel Mátyás | IFPQYY | V1 +//Tóth Dániel Mátyás | IFPQYY | V1 #include #include "cmydateexception.h" #include "cmydate.h" +#define TIMESTAMP_YEAR 1970 using namespace std; -static bool IsLeapYear(int year) { - if (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)) - { - return true; - } - return false; -} -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) { - if (day < 1) - { - throw new CMyDateException(CMyDateException::ErrMinDay); - } - switch (month) - { - case 1: - case 3: - case 5: - case 7: - case 8: - case 10: - case 12: - if (day > 31) - { - throw new CMyDateException(CMyDateException::ErrMaxDay); - } - break; - case 4: - case 6: - case 9: - case 11: - if (day > 30) - { - throw new CMyDateException(CMyDateException::ErrMaxDay); - } - break; - case 2: - if (day > 29 || (day > 28 && !IsLeapYear(year))) - { - throw new CMyDateException(CMyDateException::ErrMaxDay); - } - break; - default: - throw new CMyDateException(CMyDateException::ErrUnexpected); - break; - } -} +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() { - m_iYear = 1970; - m_iMonth = 1; - m_iDay = 1; + SetYear(1970); + SetMonth(1); + SetDay(1); } CMyDate::CMyDate(int year, int month, int day) { - IsValid(year, month, day); SetYear(year); SetMonth(month); SetDay(day); @@ -84,75 +43,53 @@ CMyDate::~CMyDate(){ //hey jimmy, get me a destructor with nothing } void CMyDate::Display() const { - char monthName[11] = {}; - switch (m_iMonth) - { - case 1: - strncpy(monthName, "Január", 7); - break; - case 2: - strncpy(monthName, "Február", 8); - break; - case 3: - strncpy(monthName, "Március", 8); - break; - case 4: - strncpy(monthName, "Április", 9); - break; - case 5: - strncpy(monthName, "Május", 6); - break; - case 6: - strncpy(monthName, "Június", 7); - break; - case 7: - strncpy(monthName, "Július", 7); - break; - case 8: - strncpy(monthName, "Augusztus", 10); - break; - case 9: - strncpy(monthName, "Szeptember", 11); - break; - case 10: - strncpy(monthName, "Október", 8); - break; - case 11: - strncpy(monthName, "November", 9); - break; - case 12: - strncpy(monthName, "December", 9); - break; - default: - throw new CMyDateException(CMyDateException::ErrUnexpected); - break; - } - cout << m_iYear << " " << monthName << " " << m_iDay << "."; + cout << GetYear() << " " << monthnames[GetMonth() - 1] << " " << GetDay() << "."; } int CMyDate::DayOfTheYear() const { - int d = 30.4375 * (m_iMonth - 1); //avg day in a month - return d + m_iDay - (int)IsLeapYear(m_iYear); + return DayOfTheYearArgs(GetYear(), GetMonth(), GetDay()); } bool CMyDate::IsValid(int year, int month, int day) const { - try - { - IsValidYear(year); - IsValidMonth(month); - IsValidDay(year, month, day); - } - catch (const CMyDateException& e) - { - - } + 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; } -int CMyDate::SubDays(int days) { +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; @@ -181,3 +118,117 @@ void CMyDate::SetYear(int 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; +} \ No newline at end of file diff --git a/feladat4/feladat4/cmydate.h b/feladat4/feladat4/cmydate.h index 90c090d..ba7e6df 100644 --- a/feladat4/feladat4/cmydate.h +++ b/feladat4/feladat4/cmydate.h @@ -1,4 +1,4 @@ -//Tóth Dániel Mátyás | IFPQYY | V1 +//Tóth Dániel Mátyás | IFPQYY | V1 #pragma once class CMyDate { public: @@ -9,7 +9,7 @@ public: int DayOfTheYear() const; bool IsValid(int year, int month, int day) const; void AddDays(int days); - int SubDays(int days); + void SubDays(int days); int DifferenceInDays(const CMyDate& other) const; void AddMonths(int months); int GetDay() const; diff --git a/feladat4/feladat4/cmydateexception.cpp b/feladat4/feladat4/cmydateexception.cpp index 6755035..75b06ff 100644 --- a/feladat4/feladat4/cmydateexception.cpp +++ b/feladat4/feladat4/cmydateexception.cpp @@ -1,8 +1,30 @@ -//Tóth Dániel Mátyás | IFPQYY | V1 +//Tóth Dániel Mátyás | IFPQYY | V1 #include "cmydateexception.h" -#include + +static int CopyStr(char* dest, const char* src, const char* concat = "\0") { + if (dest == nullptr || src == nullptr) { + return -1; + } + int i = 0; + while (src[i] != '\0') + { + dest[i++] = src[i]; + } + int j = 0; + while (concat[j] != '\0') + { + dest[i++] = concat[j++]; + } + dest[i] = '\0'; + return -1; +} CMyDateException::CMyDateException(const char* s) { - strncpy(msg, s, sizeof(s)); + CopyStr(msg, s); } + +const char* CMyDateException::what() { + return msg; +} + diff --git a/feladat4/feladat4/cmydateexception.h b/feladat4/feladat4/cmydateexception.h index 29c1739..3e834f2 100644 --- a/feladat4/feladat4/cmydateexception.h +++ b/feladat4/feladat4/cmydateexception.h @@ -1,14 +1,15 @@ -//Tóth Dániel Mátyás | IFPQYY | V1 +//Tóth Dániel Mátyás | IFPQYY | V1 #pragma once class CMyDateException { public: CMyDateException(const char* s); + const char* what(void); static constexpr const char* ErrMinDay = "Hiba: nap kisebb, mint 1!"; - static constexpr const char* ErrMaxDay = "Hiba: nap nagyobb, mint az adott hónap napszáma!"; - static constexpr const char* ErrMinMonth = "Hiba: hónap kisebb, mint 1!"; - static constexpr const char* ErrMaxMonth = "Hiba: hónap nagyobb, mint 12!"; - static constexpr const char* ErrMinYear = "Hiba: év kisebb, mint 1970!"; - static constexpr const char* ErrUnexpected = "Váratlan hiba"; + static constexpr const char* ErrMaxDay = "Hiba: nap nagyobb, mint az adott honap napszama!"; + static constexpr const char* ErrMinMonth = "Hiba: honap kisebb, mint 1!"; + static constexpr const char* ErrMaxMonth = "Hiba: honap nagyobb, mint 12!"; + static constexpr const char* ErrMinYear = "Hiba: ev kisebb, mint 1970!"; + static constexpr const char* ErrUnexpected = "Varatlan hiba"; private: char* msg; }; \ No newline at end of file diff --git a/feladat4/feladat4/feladat4.vcxproj b/feladat4/feladat4/feladat4.vcxproj index 37436df..1077ca5 100644 --- a/feladat4/feladat4/feladat4.vcxproj +++ b/feladat4/feladat4/feladat4.vcxproj @@ -111,6 +111,7 @@ _DEBUG;_CONSOLE;%(PreprocessorDefinitions) true stdcpp20 + /utf-8 %(AdditionalOptions) Console diff --git a/feladat4/feladat4/main.cpp b/feladat4/feladat4/main.cpp index bdf6b87..9caaa8b 100644 --- a/feladat4/feladat4/main.cpp +++ b/feladat4/feladat4/main.cpp @@ -1,6 +1,95 @@ //Tóth Dániel Mátyás | IFPQYY | V1 -#include "feladat4.h" +#include "cmydate.h" +using namespace std; +/*#define TIMESTAMP_YEAR 1970 +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) { + 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 int DayOfTheYearArgs(int year, int month, int day) { + for (int i = 1; i < month; i++) + { + day += GetMonthDayCount(i, year); + } + return day; +} +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; +}*/ int main() { + /*int t = DateToTimeStamp(1976, 10, 23); + cout << t << "\n"; + int y = 0, m = 0, d = 0; + TimeStampToDate(t, &y, &m, &d); + cout << y << ". " << m << ". " << d << ".";*/ return 0; } \ No newline at end of file