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. SecureCRT使用技巧

    原创文章转载请注明出处:@协思, http://zeeman.cnblogs.com   修改SecureCRT颜色配置 option->Global options –> Termina ...

  2. 由乱序播放说开了去-数组的打乱算法Fisher–Yates Shuffle

    之前用HTML5的Audio API写了个音乐频谱效果,再之后又加了个播放列表就成了个简单的播放器,其中弄了个功能是'Shuffle'也就是一般播放器都有的列表打乱功能,或者理解为随机播放. 但我觉得 ...

  3. Azure Table storage 基本用法 -- Azure Storage 之 Table

    Azure Storage 是微软 Azure 云提供的云端存储解决方案,当前支持的存储类型有 Blob.Queue.File 和 Table,其中的 Table 就是本文的主角 Azure Tabl ...

  4. Qt Disable QDebug And Warning Output

    如何禁止qDebug的输出 在项目开发的过程中,为了开发方便,我们常常在Qt的Application Output中输出一些内容,慢慢的. 有些qDebug就会被我们遗忘再角落里. 虽然对整个程序影响 ...

  5. SQL分页

    --第一种分页(TOP方式)-- select * from T_Sys_User where User_Id in ( User_Id from T_Sys_User where User_Id n ...

  6. css知多少(6)——选择器的优先级

    1. 引言 上一节<css知多少(5)——选择器>最后提到,选择器类型过多将导致一些问题,是什么问题呢?咱们直接举例子说明. 上图中,css中的两个选择器都是针对<span>的 ...

  7. Spring(二)scope、集合注入、自动装配、生命周期

    原文链接:http://www.orlion.ga/189/ 一.scope bean的scope属性中常用的有两种:singleton(单例,默认)和prototype(原型,每次创建新对象) 例: ...

  8. Unity基础知识学习笔记二

    1,object Instantiate(object original,Vector3 position,Quaternion rotation)       克隆原始物体,并返回克隆物体.     ...

  9. Android okHttp网络请求之Retrofit+Okhttp+RxJava组合

    前言: 通过上面的学习,我们不难发现单纯使用okHttp来作为网络库还是多多少少有那么一点点不太方便,而且还需自己来管理接口,对于接口的使用的是哪种请求方式也不能一目了然,出于这个目的接下来学习一下R ...

  10. NFS Volume Provider(Part II) - 每天5分钟玩转 OpenStack(63)

    上一节我们将 NFS volume provider 配置就绪,本节将创建 volume. 创建 volume 创建 NFS volume 操作方法与 LVM volume 一样,唯一区别是在 vol ...