首页 > 代码库 > 《数据结构与算法Python语言描述》习题第二章第二题(python版)

《数据结构与算法Python语言描述》习题第二章第二题(python版)

ADT Date:                                  #定义日期对象的抽象数据类型
Date(self, int year, int month, int day) #构造表示year/month/day的对象
difference(self, Date d2) #求出selfd2的日期差
plus(self, int n) #计算出日期第self之后n天的日期
num_date(self, int year, int n) #计算year年第n天的日期
adjust(self, int n) #将日期d调整n天(n为带符号整数)
year(self) #返回日期的年
month(self) #返回日期的月
day(self) #返回日期的天

  1 #!/usr/bin/env python
  2 # -*- coding:utf-8 -*-
  3 
  4 
  5 """
  6 ADT Date:                                       #定义日期对象的抽象数据类型
  7     Date(self, int year, int month, int day)    #构造表示year/month/day的对象
  8     difference(self, Date d2)                   #求出self和d2的日期差
  9     plus(self, int n)                           #计算出日期第self之后n天的日期
 10     num_date(self, int year, int n)             #计算year年第n天的日期
 11     adjust(self, int n)                         #将日期d调整n天(n为带符号整数)
 12     year(self)                                  #返回日期的年
 13     month(self)                                 #返回日期的月
 14     day(self)                                   #返回日期的天
 15 """
 16 
 17 class Date(object):
 18     __slots__ = (_year, _month, _day)
 19 
 20     def __init__(self, year, month, day):
 21         if not isinstance(year, int) or not isinstance(month, int) or not isinstance(day, int):
 22             raise TypeError
 23 
 24         if 1800<=year<year+30:
 25             self._year = year
 26             if 1 <= month <= 12:
 27                 self._month = month
 28                 bigmonth = (1,3,4,7,8,10,12)
 29                 smallmonth = (4,6,9,11)
 30                 if month in bigmonth:
 31                     if 0<day<=31:
 32                         self._day = day
 33                     else:
 34                         raise ValueError("%d is not valid day!" % day)
 35                 if month in smallmonth:
 36                     if 0<day<=30:
 37                         self._day = day
 38                     else:
 39                         raise ValueError("%d is not valid day!" % day)
 40                 elif month == 2:
 41                     if Date.leap_year(year):
 42                         if 0<day<=29:
 43                             self._day = day
 44                         else:
 45                             raise ValueError("%d is not valid day!" % day)
 46                     else:
 47                         if 0<day<=28:
 48                             self._day = day
 49                         else:
 50                             raise ValueError("%d is not valid day,the year is not leap_year!" % day)
 51             else:
 52                 raise ValueError("%d is not valid month!" % month)
 53         else:
 54             raise ValueError("%d is not valid year!" % year)
 55 
 56     def difference(self, other):
 57         #日期差
 58         DateDiff = 0
 59         if self._year > other._year:
 60             #换个位置,方便计算
 61             tmp = (self._year,self._month,self._day)
 62             (self._year,self._month,self._day) = (other._year,other._month,other._day)
 63             (other._year, other._month, other._day) = tmp
 64 
 65         #两个年之间的年直接加它一年的天数,分闰年和非闰年区别366和365
 66         for i in range(self._year+1,other._year):
 67             if Date.leap_year(i):
 68                 DateDiff += 366
 69             else:
 70                 DateDiff += 365
 71         #比较小的年,用后面的月份的天数相加在加上该月剩余的天数
 72         for i in range(self._month+1, 13):
 73             DateDiff += Date.month_day(self._year,i)
 74         DateDiff += Date.month_day(self._year,self._month) - self._day
 75 
 76         #比较大的年,加前面月份的天数加上本月的天数
 77         for i in range(1,other._month):
 78             DateDiff += Date.month_day(other._year,i)
 79         DateDiff += other._day
 80         return DateDiff
 81 
 82     def plus(self,n):
 83         if not isinstance(n,int):
 84             raise TypeError
 85         if n<0:
 86             raise ValueError("%d is not valid,must >= 0" % n)
 87         self._day += n
 88         while self._day > Date.month_day(self._year,self._month):
 89             self._day -= Date.month_day(self._year,self._month)
 90             self._month += 1
 91             if self._month == 13:
 92                 self._month = 1
 93                 self._year += 1
 94         return Date(self._year, self._month, self._day)
 95 
 96     def num_date(self, year, n):
 97         if not isinstance(year, int) or not isinstance(n, int):
 98             raise TypeError
 99         if Date.leap_year(year):
100             if n>366 and n<1:
101                 raise ValueError
102         else:
103             if n>365 and n<1:
104                 raise ValueError
105         self._year = year
106         #判该n对应的月份和天数
107         for i in range(1,13):
108             d = n
109             n -= Date.month_day(year,i)
110             if n<=0:
111                 self._month = i
112                 self._day = d
113                 break
114         return Date(self._year, self._month, self._day)
115 
116     def adjust(self,n):
117         if not isinstance(n,int):
118             raise TypeError
119         #n为正的情况
120         if n>=0:
121             self.plus(n)
122         #n为负的情况
123         else:
124             self._day += n
125             while self._day < 0:
126                 if self._month -1 == 0:
127                     self._month = 13
128                     self._year -= 1
129                 self._day += Date.month_day(self._year, self._month-1)
130                 self._month -= 1
131         return Date(self._year, self._month, self._day)
132 
133     def __str__(self):
134         return str(self._year) + "-" + str(self._month) + "-" + str(self._day)
135 
136 
137     def year(self):
138         return self._year
139 
140     def month(self):
141         return self._month
142 
143     def day(self):
144         return self._day
145 
146     @staticmethod
147     def leap_year(year):
148         if (year % 4 == 0 and year % 100 != 0) or year % 400 == 0:
149             return True
150         else:
151             return False
152 
153     #每月的天数,字典实现
154     @staticmethod
155     def month_day(year,month):
156         d = {}
157         bigmonth = (1,3,5,7,8,10,12)
158         smallmonth = (4,6,9,11)
159         for i in range(1,13):
160             if i in bigmonth:
161                 d[i] = 31
162             elif i in smallmonth:
163                 d[i] = 30
164             elif i == 2:
165                 if Date.leap_year(year):
166                     d[i] = 29
167                 else:
168                     d[i] = 28
169         return d[month]
170 
171 
172 if __name__==__main__:
173     d = Date(2003,12,10)
174     d1 = Date(2005,2,28)
175     print(d)
176     print("===")
177     print(d.difference(d1))
178     d.plus(30)
179     print("===")
180     print(d)
181     print("===")
182     d3 = Date(2006,12,13)
183     d3.num_date(2016,10)
184     print(d3)
185     d3.adjust(-20)
186     print("===")
187     print(d3)

 

 

《数据结构与算法Python语言描述》习题第二章第二题(python版)