Difference between two dates C++

Click For Summary

Discussion Overview

The discussion revolves around a C++ programming problem where participants are trying to calculate the total number of days between two dates. The focus includes handling leap years, user input formatting, and the implementation of the date class without modifying the main function.

Discussion Character

  • Homework-related
  • Technical explanation
  • Debate/contested

Main Points Raised

  • One participant describes their code and the issue of receiving an invalid binary operation error when trying to subtract two date objects, suggesting that the getDifference function should be called instead.
  • Another participant suggests overloading the minus operator to allow for direct subtraction of date objects.
  • A later reply includes an updated code snippet but indicates that it still does not compile correctly.
  • One participant reports receiving an incorrect total difference of days (727081) between two specific dates, questioning the accuracy of the calculation.
  • Another participant points out that the getDifference function does not consider the end date and questions the logic of adding leap year days multiple times within the loop.
  • A participant highlights an unrelated error regarding the addition of leap year days for each month, suggesting that it should only be added once.

Areas of Agreement / Disagreement

Participants express differing views on the implementation of the date class and the logic used in calculating the difference between dates. There is no consensus on the correct approach or solution, and multiple competing views remain regarding the handling of leap years and the overall calculation method.

Contextual Notes

Limitations include unresolved mathematical steps in the calculation of days, potential issues with user input handling, and the need for proper operator overloading. The scope is limited to the context of the provided code and does not resolve the correctness of the proposed solutions.

Hughng
Messages
26
Reaction score
0

Homework Statement


I am trying to solve a problem that asks me to give the total days between two dates. I have to take care of the some matters between those two dates such as leap years and the way of inputting the years by the users. (For example, if you input 1 and 17, the code will still give you the difference is 16 years (2017 - 2001 = 16). I am not supposed to change ANYTHING inside the main() function. Here is my code.

Homework Equations


#include <iostream>
#include <cmath>

using namespace std;

class date
{
private:
int m;
int d;
int y;

public:
date();
date(int, int, int);
int countLeapYears(date&);
int getDifference(date&, date&);


};

int main()
{
int day, month, year;
char c;

count << "Enter a start date: " << endl;
cin >> month >> c >> day >> c >> year;

date start = date(month, day, year);

count << "Enter an end date: " << endl;
cin >> month >> c >> day >> c >> year;

date end = date(month, day, year);

int duration = end - start;

count << "The number of days between those two dates are: " << duration << endl;

return 0;
}

date::date()
{
m = 0;
d = 0;
y = 0;
}

date::date(int a, int b, int c)
{
m = a;
d = b;
y = c;
}

const int monthDays[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

int date::countLeapYears(date& d)
{
int years = d.y;
if (d.m <= 2)
years--;


return years / 4 - years / 100 + years / 400;
}

int date::getDifference(date& start, date& end)
{

int n1 = start.y*365 + start.d;

for (int i=0; i<start.m - 1; i++)
{
n1 += monthDays;
n1 += countLeapYears(start);
}

int n2 = end.y*365 + end.d;

for (int i=0; i<end.m - 1; i++)
{
n2 += monthDays;
n2 += countLeapYears(end);
}
int duration = n2 - n1;
return duration;
}

The Attempt at a Solution


have an issue with my code above, and I need your help please. When I ran it, it said invalid binary operation between "date" and "date". Now, I assume that when I initialized int duration = end - start, I should have got a number. I guess what I am doing wrong here is I failed to convert the (end - start) date type into integer. I thought my function getDifference already took care of that issue. Somehow, it appeared that I did not take care of that issue.
 
Physics news on Phys.org
Your code has no idea that the minus sign should trigger the getDifference function. With the current functionality you would have to use int duration = date::getDifference(end, start);. To use the minus sign you have to overload the minus operator.
 
let me update my code.
#include <iostream>
#include <cmath>

using namespace std;

class date
{
private:
int m;
int d;
int y;

public:
date(int, int, int);
int countLeapYears(date&);
int getDifference(date&);
friend int operator-(const date&);

};
date::date(int a, int b, int c)
{
m = a;
d = b;
y = c;
}

const int monthDays[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

int date::countLeapYears(date& d)
{
int years = d.y;
if (d.m <= 2)
years--;
return years / 4 - years / 100 + years / 400;
}

int date::getDifference(date& start)
{

int n1 = start.y*365 + start.d;

for (int i=0; i<start.m - 1; i++)
{
n1 += monthDays;
n1 += countLeapYears(start);
}

return n1;
}

int date operator-(const date& d)
{
int difference = getDiffernce(d);
return difference;
}

int main()
{
int day, month, year;
char c;

count << "Enter a start date: " << endl;
cin >> month >> c >> day >> c >> year;

date start = date(month, day, year);

count << "Enter an end date: " << endl;
cin >> month >> c >> day >> c >> year;

date end = date(month, day, year);
int duration = end-start;

count << "The number of days between those two dates are: " << duration << endl;

return 0;
}
 
You can write [i] as [plain][i][/plain] to avoid that the forum interprets it as marker to make the text italic. Or put the whole code in [code]...[/code]-tags, then things like indentation stay visible.

The new code is better, but exactly like that it won't even compile.
 
it gave me the wrong total difference days between two input dates.
It gave me

727081
as the difference between 1/1/1992 and 1/1/2016
 
Where does your getDifference consider the other date?

727081/365.25 = 1990.6
 
What do you mean by that? Please help me
 
Code:
int date::getDifference(date& start)
{

  int n1 = start.y*365 + start.d;

  for (int i=0; i<start.m - 1; i++)
  {
    n1 += monthDays[i];
    n1 += countLeapYears(start);
  }

  return n1;
}
Does the output change in any way if you have a different end date? Can you calculate the difference between two dates if you don't even consider the end date?

An unrelated error: you add days for LeapYears every month. 0 times in your example, but up to 11 times if the start date is in December. You should add them exactly once.
 

Similar threads

  • · Replies 3 ·
Replies
3
Views
1K
  • · Replies 15 ·
Replies
15
Views
2K
  • · Replies 17 ·
Replies
17
Views
2K
  • · Replies 12 ·
Replies
12
Views
2K
  • · Replies 2 ·
Replies
2
Views
3K
  • · Replies 7 ·
Replies
7
Views
2K
  • · Replies 3 ·
Replies
3
Views
2K
  • · Replies 4 ·
Replies
4
Views
2K
  • · Replies 4 ·
Replies
4
Views
2K
  • · Replies 3 ·
Replies
3
Views
2K