OPS435 Python Assignment 1 2018 Fall
Contents
Overview
When making back up of data files or log files, it is a very common practice to name the backup directories and/or files based on the date the backup was done. In order to restore or locate the directory/file, we often need to find out the backup date from today's date.
The computation task for this assignment is to write a python program with appropriate functions which will take a date in the "YYYYMMDD" format and the number of day before or after the given date as the command line arguments, calculate and output to the standard output data channel the requested date which is the number of day before or after the given date in the same format.
Coding Standard
Command Line Argument to be supported
- Name your python script as a1_[student_id].py, where [student_id] is your Seneca email user name.
- Your python script must support two command line arguments: (1) any valid date in YYYYMMDD format, (2) number of days before or after the given date.
- If there are less or more than two command line arguments given on the command line, your script should display the correct usage message and exit.
Required Functions
You must at least have the the following three functions defined in your python script:
- dbda()
- tomorrow()
- yesterday()
You can also create additional functions to improved the re-usability of your python code by adding the following functions:
- leapyear()
- validdate()
- usage()
Documentation
- Please use python's docstring to document your python script and each of the functions you created for this assignment.
- The following shows the docstring that was added to the tomorrow() function which provides the following information when call with help(tomorrow) in the python interactive shell:
Help on function tomorrow in module rchan: tomorrow(today) -> str tomorrow() takes a valid date string in 'YYYYMMDD' format and return a date string for the next day in 'YYYYMMDD' format. e.g. tomorrow('20171231') -> '20180101' tomorrow('20180131') -> '20180201' tomorrow('20180228') -> '20180301' (END)
Authorship Declaration
All your Python code for this assignment must be placed in a single source file. Please include the following declaration as the docstring in your Python source code file (replace "Student Name" with your own name):
OPS435 Assignment 1 - Fall 2018
Program: [student_id].py (replace student_id with your Seneca User name)
Author: "Student Name"
The python code in this file ([Student_id].py) is original work written by
"Student Name". No code in this file is copied from any other source
except those provided by the course instructor, including any person,
textbook, or on-line resource. I have not shared this python script
with anyone or anything except for submission for grading.
I understand that the Academic Honesty Policy will be enforced and
violators will be reported and appropriate action will be taken.
Tests and Test results
You must name your python 3 script as a1_[Student_id].py
. The following examples assumes that the student_id is rchan.The script should accept two command line arguments, the first one is the date in "YYYYMMDD" format, and the second one is the number of day from the given date, a positive value indicates the number of days after the given date, and a negative value indicates the number of days before the given date. There is an option called --step that makes the program print out all dates until the target date. If the "YYYYMMDD" format is broken give an appropriate error message. Invalid months (>12) or invalid days of month(different for each month), should be detected and give appropriate error messages. For examples:
-
python3 a1_rchan.py 20180101 1
, and the output should be
20180102
-
python3 a1_rchan.py 20180101 -1
, and the output should be
20171231
-
python3 a1_rchan.py 20180101 2
, and the output should be
20180103
-
python3 a1_rchan.py --step 20180101 3
, and the output should be
20180102 20180103 20180104
-
python3 a1_rchan.py 20180701 500
, and the output should be
20191113
-
python3 a1_rchan.py 20189901 2
, and the output should be
Error: wrong month entered
-
python3 a1_rchan.py 20180199 2
, and the output should be
Error: wrong day entered
-
python3 a1_rchan.py 2018 2
, and the output should be
Error: wrong date entered
If there is too few or too many command line arguments given, display the proper usage.
Script structure and sample template
Your program code should all be in a single python file with at least the functions mentioned above: dbda(), tomorrow(), and yesterday(). You can also add additional functions like: leapyear(), validdate(), usage(), etc
- The dbda() function will take a date in "YYYYMMDD" format, a positive or negative integer, and return a date either before or after the given date according to the value of the given integer in the same format.
- The yesterday() function will take a date in "YYYYMMDD" format and return the date of the previous day in the same format.
- The tomorrow() function will take a date in "YYYYMMDD" format and return the date of the next day in the same format. Next paragraph is a sample python code for the tomorrow() function.
- The leapyear() function will take a year in "YYYY" format, and return True if the given year is a leap year, otherwise return False.
- The validdate() function will take a date in "YYYYMMDD" format, and return True if the given date is a valid date, otherwise return False.
- The usage() function will take no argument and return a string describing the usage of the script.
#!/usr/sbin/env python3 import ... def tomorrow(today): .... return next_day def yesterday(today): .... return previous_day .... def dbda(yyyymmdd,days): ... setup loop call tomorrow or yesterday as appropriate return target_day if __name__ == "__main__": .. processing command line arguments .. .. call dbda() ... output the expected date
Sample code for the tomorrow() function
# Return the date in YYYYMMDD after the given day # def tomorrow(today): if len(today) != 8: return '00000000' else: year = int(today[0:4]) month = int(today[4:6]) day = int(today[6:]) lyear = year % 4 if lyear == 0: feb_max = 29 # this is a leap year else: feb_max = 28 # this is not a leap year lyear = year % 100 if lyear == 0: feb_max = 28 # this is not a leap year lyear = year % 400 if lyear == 0: feb_max = 29 # this is a leap year tmp_day = day + 1 # tomorrow's day mon_max = { 1:31, 2:feb_max, 3:31, 4:30, 5:31, 6:30, 7:31, 8:31, 9:30, 10:31, 11:30, 12:31} if tmp_day > mon_max[month]: to_day = tmp_day % mon_max[month] # if tmp_day > this month's max, reset to 1 tmp_month = month + 1 else: to_day = tmp_day tmp_month = month + 0 if tmp_month > 12: to_month = 1 year = year + 1 else: to_month = tmp_month + 0 next_date = str(year)+str(to_month).zfill(2)+str(to_day).zfill(2) return next_date
Due Date
This Assignment is due on Sunday October 14, 2018 before mid-night. Please submit your python script together with test result on blackboard under the assignments section.