Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

Python Why does my code produce incorrect output?

Tags:
  1. Nov 29, 2016 #1
    Code (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: Nov 29, 2016
  2. jcsd
  3. Nov 29, 2016 #2

    Borg

    User Avatar
    Gold Member

    Do you know that there are no leap years on the 100's that are not divisible by 400?
     
  4. Nov 29, 2016 #3
    I did not know that, thanks :-)
     
  5. Nov 29, 2016 #4

    jedishrfu

    Staff: Mentor

  6. Nov 29, 2016 #5

    Mark44

    Staff: Mentor

    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
     
  7. Nov 29, 2016 #6

    jbriggs444

    User Avatar
    Science Advisor

Know someone interested in this topic? Share this thread via Reddit, Google+, Twitter, or Facebook

Have something to add?
Draft saved Draft deleted