Python Why does my code produce incorrect output?

AI Thread Summary
The discussion centers around a Python code implementation for calculating the number of days between two dates, specifically addressing leap year considerations and the Gregorian calendar's historical context. The code includes functions to determine the next day, check if one date is before another, and calculate the total days between two dates, with assertions for input validation. A key issue raised is the incorrect result for the test case spanning from January 1, 1900, to December 31, 1999, due to the leap year rules that state years divisible by 100 are not leap years unless also divisible by 400. Participants also discuss the historical transition from the Julian to the Gregorian calendar, noting that this change was not uniform across countries, which can affect date calculations.
doktorwho
Messages
181
Reaction score
6
Python:
# Use Dave's suggestions to finish your daysBetweenDates
# procedure. It will need to take into account leap years
# in addition to the correct number of days in each month.

def nextDay(year, month, day):
    n=month
    if (n==1 or n==3 or n==5 or n==7 or n==8 or n==10 or n==12) and day < 31:
        return year, month, day + 1
    if (n==4 or n==6 or n==9 or n==11) and day <30 :
        return year, month, day + 1
    if month==2 and day < 29 and (year%4)==0:
        return year, month, day + 1
    if month==2 and day < 28 and (year%4)!=0:
        return year, month, day + 1
    else:
        if month == 12:
            return year + 1, 1, 1
        else:
            return year, month + 1, 1
 

def dateIsBefore(year1, month1, day1, year2, month2, day2):
    """Returns True if year1-month1-day1 is before year2-month2-day2. Otherwise, returns False."""
    if year1 < year2:
        return True
    if year1 == year2:
        if month1 < month2:
            return True
        if month1 == month2:
            return day1 < day2
    return False   

def daysBetweenDates(year1, month1, day1, year2, month2, day2):
    """Returns the number of days between year1/month1/day1
       and year2/month2/day2. Assumes inputs are valid dates
       in Gregorian calendar."""
    # program defensively! Add an assertion if the input is not valid!
    assert not dateIsBefore(year2, month2, day2, year1, month1, day1)
    days = 0
    while dateIsBefore(year1, month1, day1, year2, month2, day2):
        year1, month1, day1 = nextDay(year1, month1, day1)
        days += 1
    return days

def test():
    test_cases = [((2012,1,1,2012,2,28), 58),
                  ((2012,1,1,2012,3,1), 60),
                  ((2011,6,30,2012,6,30), 366),
                  ((2011,1,1,2012,8,8), 585 ),
                  ((1900,1,1,1999,12,31), 36523)]
 
    for (args, answer) in test_cases:
        result = daysBetweenDates(*args)
        if result != answer:
            print ("Test with data:"), args, "failed"
        else:
            print ("Test case passed!")
test()

I am suppose to write a code that calculates the number of days between two dates and i get everything from the test correctly except the last one, 1900,1,1,199,12,31. I get +1 day, why is that?
 
Last edited by a moderator:
Technology news on Phys.org
Do you know that there are no leap years on the 100's that are not divisible by 400?
 
  • Like
Likes jedishrfu
Borg said:
Do you know that there are no leap years on the 100's that are not divisible by 400?
I did not know that, thanks :-)
 
jedishrfu said:
Also historically there was a calendar change in 1582 by Pope Gregory to fix the time of the vernal equinox which was 10 days too late:

http://www.findingdulcinea.com/news...this-Day--In-1582--Oct--5-Did-Not-Exist-.html
The change from the Julian calendar to the Gregorian calendar didn't happen uniformly in all countries. In Great Britain and the colonies (including what is now the U.S.), this change didn't occur until almost two centuries later, in September of 1752. Here's an image of a calendar from that year. Notice the jump from Sep 2 to Sep 14, with no dates shown for the intervening 11 days.
Sept_1752_calendar.jpg
 
  • Like
Likes jedishrfu
Dear Peeps I have posted a few questions about programing on this sectio of the PF forum. I want to ask you veterans how you folks learn program in assembly and about computer architecture for the x86 family. In addition to finish learning C, I am also reading the book From bits to Gates to C and Beyond. In the book, it uses the mini LC3 assembly language. I also have books on assembly programming and computer architecture. The few famous ones i have are Computer Organization and...
I have a quick questions. I am going through a book on C programming on my own. Afterwards, I plan to go through something call data structures and algorithms on my own also in C. I also need to learn C++, Matlab and for personal interest Haskell. For the two topic of data structures and algorithms, I understand there are standard ones across all programming languages. After learning it through C, what would be the biggest issue when trying to implement the same data...

Similar threads

Replies
18
Views
2K
Replies
10
Views
978
Replies
11
Views
1K
Replies
15
Views
2K
Replies
1
Views
2K
Replies
7
Views
5K
Replies
11
Views
2K
Back
Top