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. 辛巴学院-Unity-剑英陪你零基础学c#系列(三)计算与类型

    辛巴学院:正大光明的不务正业. 中秋节快乐,每逢佳节倍思亲,尤其是那素未谋面的老婆,对吧,屌丝们.   今天我们来探索一下C#里面奇怪的计算,奇怪的类型. 奇怪的计算 当我刚刚接触计算机编程的时候,一 ...

  2. Android动画小记录

    今天在做一个头部滑动菜单的时候需要使用TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYD ...

  3. CSS3 Animation制作飘动的浮云和星星效果

    带平行视差效果的星星 先看效果: 如果下方未出现效果也可前往这里查看 http://sandbox.runjs.cn/show/0lz3sl9y 下面我们利用CSS3的animation写出这样的动画 ...

  4. CATransition转场动画

    背景: 最近在温习动画,分享个简单系统的转场动画 viewcontroller *VC=[self.storyboard instantiateViewControllerWithIdentifier ...

  5. JS原生基础终结篇 (帅哥)

    闭包 基础    面向对象基础 1.1 闭包 在程序语言中,所谓闭包,是指语法域位于某个特定的区域,具有持续参照(读写)位于该区域内自身范围之外的执行域上的非持久型变量值能力的段落.这些外部执行域的非 ...

  6. javascript技术难点(三)之this、new、apply和call详解

    4)    this.new.call和apply的相关问题 讲解this指针的原理是个很复杂的问题,如果我们从javascript里this的实现机制来说明this,很多朋友可能会越来越糊涂,因此本 ...

  7. webBrowser 加载网页

    事件 webBrowser_DocumentCompleted private void webBrowser_DocumentCompleted(object sender, WebBrowserD ...

  8. Android之控件使用

    Android系统为我们提供了大量的控件,例如:开关控件.单选按钮.多选按钮.单选菜单等等,那么这些控件如何使用呢?本篇我将带领大家一道学习一下如何使用这些控件.所谓无图无真相,先让大家看一下效果图: ...

  9. HttpUrlConnection发送url请求(后台springmvc)

    1.HttpURLConnection发送url请求 public class JavaRequest { private static final String BASE_URL = "h ...

  10. Python快速教程 尾声

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 写了将近两年的Python快速教程,终于大概成形.这一系列文章,包括Python基 ...