• 《数据结构与算法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)
    
    
    
     
  • 相关阅读:
    .net core web api swagger 配置笔记
    mvc下ajax请求遇到session超时简单处理方式
    sql ltrim/rtrim 字段中为中文时出现?的问题
    SQL 将一个字段内用逗号分隔的内容分成多条记录
    bootstrap下modal模态框中webuploader控件按钮异常(无法点击)问题解决办法【转】
    mvc 封装控件使用mvcpager
    uploadify在chrome下初始化失败,在Firefox下却可以原因探析
    MVC FormCollection 无法获取值的问题
    linq to sql之like
    mvcpager 表单提交时无法获取pageindex的值
  • 原文地址:https://www.cnblogs.com/xautxuqiang/p/6089728.html
Copyright © 2020-2023  润新知