Code to be written in Python:
Correct answer will get the brainliest!
Uyen decides to write a Python program to count towards the next birthday.
In order to do so, she plans to write a function count_days(start_date, end_date) which takes in the start date and end date in the string format, "dd/mm/yyyy", and returns the number of days between the start date and end date. The start date is included while the end date is not included in the count. Note that leading zeros in start_date and end_date are skipped if there are any (For example, the date 1st January 2017 will be in the format 1/1/2017).
Currently, Uyen has only completed a skeleton of count_days, and a few helper functions, which are provided below.
Your Tasks:
(a) Help Uyen complete the four functions marked with 'TODO'. They are get_day_month_year, less_than_equal, next_date and count_days.
(b) Uyen was quite careless, she didn't check for input data validity. You will also need to help her with this. We only proceed to count days if the dates are valid, and the start date is before or same as the end date.
Assume a valid date is between 1/1/1970 and 31/12/9999. The leap year and valid date check are already provided.
If one of the dates is not valid, throw an exception with a message that has the value: "Not a valid date: " + date, where date is the invalid date.
If the start date is after the end date, throw an exception with a message value: "Start date must be less than or equal end date."
Note: is_leap_year(year) and is_valid(d, m, y) are provided, you can make use of them.
Incomplete code:
def is_leap_year(year):
# DONE: do not need to modify
if year % 4 == 0 and year % 100 != 0:
return True
if year % 400 == 0:
return True
return False
def is_valid(d, m, y):
# DONE: do not need to modify
# d, m, y represents day, month, and year in integer.
if y < 1970 or y > 9999:
return False
if m < 1 or m > 12:
return False
if d < 1 or d > 31:
return False
if m == 4 or m == 6 or m == 9 or m == 11:
if d > 30:
return False
if is_leap_year(y):
if m == 2 and d > 29:
return False
else:
if m == 2 and d > 28:
return False
return True
def get_day_month_year(date):
# TODO: split the date and return a tuple of integer (day, month, year)
d = 1
m = 1
y = 1970
return (d, m, y)
def less_than_equal(start_day, start_mon, start_year, \
end_day, end_mon, end_year):
# TODO: return true if start date is before or same as end date
return False
def next_date(d, m, y):
# TODO: get the next date from the current date (d, m, y)
# return a tuple of integer (day, month, year).
return (d, m, y)
def count_days(start_date, end_date):
# date is represented as a string in format dd/mm/yyyy
start_day, start_mon, start_year = get_day_month_year(start_date)
end_day, end_mon, end_year = get_day_month_year(end_date)
# TODO: check for data validity here #
# if start date is not valid...
# if end date is not valid...
# if start date > end date...
# lazy - let the computer count from start date to end date
count = 0
while less_than_equal(start_day, start_mon, start_year, end_day, end_mon, end_year):
count = count + 1
start_day, start_mon, start_year = next_date(start_day, start_mon, start_year)
# exclude end date
return count - 1
Test Cases:
test_count_days('1/1/1970', '2/1/1970') 1
test_count_days('1/1/1970', '31/12/1969') Not a valid date: 31/12/1969
test_count_days('1/1/1999', '29/2/1999') Not a valid date: 29/2/1999
test_count_days('14/2/1995', '19/3/2014') 6973
test_count_days('19/3/2014', '19/4/2013') Start date must be less than or equal end date.
get_day_month_year('19/3/2014') (19, 3, 2014)
get_day_month_year('1/1/1999') (1, 1, 1999)
get_day_month_year('12/12/2009') (12, 12, 2009)
less_than_equal(19, 3, 2014, 19, 3, 2014) True
less_than_equal(18, 3, 2014, 19, 3, 2014) True
less_than_equal(20, 3, 2014, 19, 3, 2014) False
less_than_equal(19, 3, 2015, 19, 3, 2014) False
less_than_equal(19, 6, 2014, 19, 3, 2014) False
less_than_equal(18, 12, 2014, 19, 11, 2014) False
less_than_equal(18, 12, 2014, 19, 11, 2015) True
less_than_equal(31, 3, 2018, 29, 4, 2018) True
next_date(1, 1, 2013) (2, 1, 2013)
next_date(28, 2, 2014) (1, 3, 2014)
next_date(28, 2, 2012) (29, 2, 2012)
next_date(29, 2, 2012) (1, 3, 2012)
next_date(30, 4, 2014) (1, 5, 2014)
next_date(31, 5, 2014) (1, 6, 2014)
next_date(31, 12, 2014) (1, 1, 2015)
next_date(30, 5, 2014) (31, 5, 2014)