ADT Date:                                  #定义日期对象的抽象数据类型
Date(self, int year, int month, int day) #构造表示year/month/day的对象
difference(self, Date d2) #求出self和d2的日期差
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) #返回日期的天
 #!/usr/bin/env python
# -*- coding:utf-8 -*- """
ADT Date: #定义日期对象的抽象数据类型
Date(self, int year, int month, int day) #构造表示year/month/day的对象
difference(self, Date d2) #求出self和d2的日期差
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) #返回日期的天
""" class Date(object):
__slots__ = ('_year', '_month', '_day') def __init__(self, year, month, day):
if not isinstance(year, int) or not isinstance(month, int) or not isinstance(day, int):
raise TypeError if 1800<=year<year+30:
self._year = year
if 1 <= month <= 12:
self._month = month
bigmonth = (1,3,4,7,8,10,12)
smallmonth = (4,6,9,11)
if month in bigmonth:
if 0<day<=31:
self._day = day
else:
raise ValueError("%d is not valid day!" % day)
if month in smallmonth:
if 0<day<=30:
self._day = day
else:
raise ValueError("%d is not valid day!" % day)
elif month == 2:
if Date.leap_year(year):
if 0<day<=29:
self._day = day
else:
raise ValueError("%d is not valid day!" % day)
else:
if 0<day<=28:
self._day = day
else:
raise ValueError("%d is not valid day,the year is not leap_year!" % day)
else:
raise ValueError("%d is not valid month!" % month)
else:
raise ValueError("%d is not valid year!" % year) def difference(self, other):
#日期差
DateDiff = 0
if self._year > other._year:
#换个位置,方便计算
tmp = (self._year,self._month,self._day)
(self._year,self._month,self._day) = (other._year,other._month,other._day)
(other._year, other._month, other._day) = tmp #两个年之间的年直接加它一年的天数,分闰年和非闰年区别366和365
for i in range(self._year+1,other._year):
if Date.leap_year(i):
DateDiff += 366
else:
DateDiff += 365
#比较小的年,用后面的月份的天数相加在加上该月剩余的天数
for i in range(self._month+1, 13):
DateDiff += Date.month_day(self._year,i)
DateDiff += Date.month_day(self._year,self._month) - self._day #比较大的年,加前面月份的天数加上本月的天数
for i in range(1,other._month):
DateDiff += Date.month_day(other._year,i)
DateDiff += other._day
return DateDiff def plus(self,n):
if not isinstance(n,int):
raise TypeError
if n<0:
raise ValueError("%d is not valid,must >= 0" % n)
self._day += n
while self._day > Date.month_day(self._year,self._month):
self._day -= Date.month_day(self._year,self._month)
self._month += 1
if self._month == 13:
self._month = 1
self._year += 1
return Date(self._year, self._month, self._day) def num_date(self, year, n):
if not isinstance(year, int) or not isinstance(n, int):
raise TypeError
if Date.leap_year(year):
if n>366 and n<1:
raise ValueError
else:
if n>365 and n<1:
raise ValueError
self._year = year
#判该n对应的月份和天数
for i in range(1,13):
d = n
n -= Date.month_day(year,i)
if n<=0:
self._month = i
self._day = d
break
return Date(self._year, self._month, self._day) def adjust(self,n):
if not isinstance(n,int):
raise TypeError
#n为正的情况
if n>=0:
self.plus(n)
#n为负的情况
else:
self._day += n
while self._day < 0:
if self._month -1 == 0:
self._month = 13
self._year -= 1
self._day += Date.month_day(self._year, self._month-1)
self._month -= 1
return Date(self._year, self._month, self._day) def __str__(self):
return str(self._year) + "-" + str(self._month) + "-" + str(self._day) def year(self):
return self._year def month(self):
return self._month def day(self):
return self._day @staticmethod
def leap_year(year):
if (year % 4 == 0 and year % 100 != 0) or year % 400 == 0:
return True
else:
return False #每月的天数,字典实现
@staticmethod
def month_day(year,month):
d = {}
bigmonth = (1,3,5,7,8,10,12)
smallmonth = (4,6,9,11)
for i in range(1,13):
if i in bigmonth:
d[i] = 31
elif i in smallmonth:
d[i] = 30
elif i == 2:
if Date.leap_year(year):
d[i] = 29
else:
d[i] = 28
return d[month] if __name__=='__main__':
d = Date(2003,12,10)
d1 = Date(2005,2,28)
print(d)
print("===")
print(d.difference(d1))
d.plus(30)
print("===")
print(d)
print("===")
d3 = Date(2006,12,13)
d3.num_date(2016,10)
print(d3)
d3.adjust(-20)
print("===")
print(d3)

 

《数据结构与算法Python语言描述》习题第二章第二题(python版)的更多相关文章

  1. 数据结构与算法分析——C语言描述 第三章的单链表

    数据结构与算法分析--C语言描述 第三章的单链表 很基础的东西.走一遍流程.有人说学编程最简单最笨的方法就是把书上的代码敲一遍.这个我是头文件是照抄的..c源文件自己实现. list.h typede ...

  2. 《数据结构与算法分析:C语言描述_原书第二版》CH2算法分析_课后习题_部分解答

    对于一个初学者来说,作者的Solutions Manual把太多的细节留给了读者,这里尽自己的努力给出部分习题的详解: 不当之处,欢迎指正. 1.  按增长率排列下列函数:N,√2,N1.5,N2,N ...

  3. 《数据结构与算法分析:C语言描述_原书第二版》CH3表、栈和队列_reading notes

    表.栈和队列是最简单和最基本的三种数据结构.基本上,每一个有意义的程序都将明晰地至少使用一种这样的数据结构,比如栈在程序中总是要间接地用到,不管你在程序中是否做了声明. 本章学习重点: 理解抽象数据类 ...

  4. 检索算法 -- 数据结构与算法的javascript描述 第13章

    检索算法-如何在列表中查找特定的值. 顺序查找 从列表的第一个元素开始对列表元素逐个进行判断,直到找到了想要的结果,它属于暴力查找技巧的一种,在执行查找时可能会访问到数据结构里的所有元素. 代码: / ...

  5. 排序算法 -- 数据结构与算法的javascript描述 第12章

    排序是常见的功能,给定一组数据,对其进行排序. 在此之前,我们需要准备个基础工作--自动生成数组,并可以对该组数据做任何处理. /** * 测试类 ,数组 * @param numElements * ...

  6. 【数据结构与算法分析——C语言描述】第一章总结 引论

    这一章主要复习了一些数学知识,像指数.对数.模运算.级数公式:还有2种证明方法,归纳假设法和反证法.所幸以前学过,重新拾捡起来也比较轻松. 简要地复习了递归,提出了编写递归例程的四条基本法则: 基准情 ...

  7. 字典 -- 数据结构与算法的javascript描述 第七章

    字典 字典是一种以键-值对形式存储数据的数据结构 最基本功能规划 add 添加数据到字典 remove 从字典中移除数据 get 从字典中取出数据 count 统计字典数据量 find 查找数据在字典 ...

  8. 链表的实现 -- 数据结构与算法的javascript描述 第六章

    链表 链表是由一组节点组成的集合.每个节点都使用一个对象的引用指向它的后继.指向另一个节点的引用叫做链 结构示意图 : 链表头需要我们标识 head { element:head,next:obj1 ...

  9. 队列的实现 -- 数据结构与算法的javascript描述 第五章

    队列也是列表的一种,有不同于列表的规则. 先进先出 入队方法 出队方法 可以找到队首 可以找到队尾 可以查看队列有多长 可以查看队列是否为空 这是一个基本的需求,围绕他来实现,当然我们可以自己扩展列表 ...

  10. 栈的实现 -- 数据结构与算法的javascript描述 第四章

    栈 :last-in-first-out 栈有自己特殊的规则,只能 后进入的元素 ,最先被推出来,我们只需要模拟这个规则,实现这个规则就好. peek是返回栈顶元素(最后一个进入的). /** * 栈 ...

随机推荐

  1. Hibernate 延迟加载原理

        如何简单的理解延迟加载?开发中常见的org.hibernate.LazyInitializationException no session错误又是怎么产生的?下面通过一个简单的例子来解析一下 ...

  2. 老司机学新平台 - Xamarin Forms开发框架之MvvmCross插件精选

    在前两篇老司机学Xamarin系列中,简单介绍了Xamarin开发环境的搭建以及Prism和MvvmCross这两个开发框架.不同的框架,往往不仅仅使用不同的架构风格,同时社区活跃度不同,各种功能模块 ...

  3. 《Spark大数据处理》—— 读后总结

    前几章 工作机制

  4. 《超实用的JavaScript代码段》—— 读后总结

    这本书全是代码,从头到尾跟着坐下来确实收获很多.比那些古板的教科书式的理解更多,不过书中并不是每个例子都做了,有的作者封装的太多,觉得看了收获不多,就没细看——比如模块渐变.有空好好学学这段的代码. ...

  5. Struts2-修改数据

    <body> 用户信息:<br><br> <% List<User> lu = (List<User>)request.getAttr ...

  6. iOS--知识综合应用成就时髦小功能点

    iOS--知识综合应用成就时髦小功能点

  7. iOS-----正则表达式

    摘要: 正则表达式在字符串检验和查找中用处很广,IOS中也有其支持的类. 正则表达式在iOS开发中的应用 正则表达式在字符串查找,替换,检测中的应用非常广泛,正则表达式是什么,有怎样的语法,可以参考我 ...

  8. The transaction log for database 'xxxx' is full due to 'ACTIVE_TRANSACTION'

    今天查看Job的History,发现Job 运行失败,错误信息是:“The transaction log for database 'xxxx' is full due to 'ACTIVE_TRA ...

  9. Android之线程池深度剖析

    1.线程池的引入   引入的好处:   1)提升性能.创建和消耗对象费时费CPU资源   2)防止内存过度消耗.控制活动线程的数量,防止并发线程过多.   使用条件:      假设在一台服务器完成一 ...

  10. Javascript对象的方法赋值

    Javascript对象编程学习中,一直不能很好的掌握对象的属性(property)和方法(method).今天在写代码过程中,又犯了一个低级错误. <!DOCTYPE html> < ...