# we can set up the months as a dictionary so we can easily access extra data about them (like the month factor for calculating the start # day of the month, and the number of days the month has in it) months = {'jan':[31,0], 'feb':[28,3], 'mar':[31,3], 'apr':[30,6], 'may':[31,1], 'jun':[30,4], 'jul':[31,6], 'aug':[31,2], 'sept':[30,5], 'oct':[31,0], 'nov':[30,3], 'dec':[31,5]} def getDOW(month): #this will get the day of the week the month starts on according to a quick google search leading to this website http://www.jimloy.com/math/day-week.htm #it only works for 2013 for now but can be expanded # this expects a list from the months dictionary centuryCode = 5 y = 13 m = month[1] # this will be the second element w = (centuryCode + y + (y//4)+1 + m + 1) % 7 # The final '1' is because the day factor needed is for the day the month will begin on return w #returns the day of week the first of the month will be on, 0 is sun, 6 is sat def formatMonth(month): # This just formats the month string to be capitalized m = month[0].upper() + month[1:] # uppercase the first element of the string and concatonate with the second element on return m def formatCal(monthEnd, dayOfWeek): # This formats the calendar for the user # It takes a monthEnd which is the number of days the month has in it (can easily be extended for leap years) # and the day of the week the first of the month is on 0 being sunday and 6 is saturday line = 'sun mon tue wed thu fri sat' # print the days line1 = list(range(1, 8-dayOfWeek)) # this creates a list of the days that will fit on the first row of the cal #These all take the ending date of the previous line e.g. 6 add 1 and create a list that will fit on that line i.e. equal to 7 line2 = list(range(line1[-1]+1, line1[-1]+8)) line3 = list(range(line2[-1]+1, line2[-1]+8)) line4 = list(range(line3[-1]+1, line3[-1]+8)) line5 = list(range(line4[-1]+1, monthEnd+1)) # this will end the month apropriatly # This is all formating junk not really inportant but you can see a few loops are used instead of typing it all out print(line) print(' '*(dayOfWeek), end=' ') #dayOfWeek can be zero for i in line1: print(i, end=' ') print('\n') for line in line2, line3, line4, line5: #this just loops over the lines/lists we described above for i in line: # for each element in the list print it with certian spaces according to one or two digits if i >= 9: print('',i , end=' ') else: print('',i , end=' ') print('\n') # throw a new line in to break them up def main(): month = input('What month? (three letter abbriviation only, q to quit): ') # get user input for three letter month while month != 'q': # make a little loop so that entering q will quit if month.lower() in months.keys(): # just check if the lowercase input is in the keys of the dict key = month.lower() # if it is then lets just use it DOW = getDOW(months[key]) # this calls the function returning the day (0-6) that the month starts on monthEnd = months[key][0] # gets the months end date print('\n') print(formatMonth(key)) # prints the month capitolized print('------------------------------------') print(formatCal(monthEnd, DOW)) #print the calendar print('\n') month = input('What month? (q to quit): ') # ask for input again for the loop (q to quit) else: # this input was not int the dictionary keys so just ask again print('Only enter the three letter month abbriviation.') month = input('What month? (q to quit): ') # q to quit if __name__ == '__main__': # Start the program main()