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

时间:2023-02-03 18:06:57
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. 《数据结构与算法分析&colon;C语言描述&lowbar;原书第二版》CH2算法分析&lowbar;课后习题&lowbar;部分解答

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

  3. 《数据结构与算法分析&colon;C语言描述&lowbar;原书第二版》CH3表、栈和队列&lowbar;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. 吐个槽:bose的售后真心差劲!愧对这个*音响产品!

    400电话只提供周一到周五(中午有1个小时非服务时间),打进去就不厌其烦地告知你服务时间,你多按几个0,对方就直接把电话给你挂了!即使耐心等待它啰嗦完,哪怕只有0个人等待或1个人等待,你也是接不进去的 ...

  2. 报错:init&colon; Could not find wglGetExtensionsStringARB&excl;

    如下操作即可恢复:

  3. js监听浏览器&comma;关闭&comma;刷新

    //浏览器关闭或刷新事件 function bindCloseBrowser() { var a = "注意!!\n您即将离开页面!离开后可能会导致数据丢失\n\n您确定要离开吗?&quot ...

  4. Jenkins进阶系列之——09配置Linux系统ssh免密码登陆

    ssh认证的完整描述:https://www.ibm.com/developerworks/cn/linux/security/openssh/part1/ 说明:点我去查看 今天我们只说生成ssh的 ...

  5. WMB代理无法正常启动时的解决方案。

     情况:执行了启动命令,查看状态的时候 还是停止..再启动,又说已经启动了..   解决方案:正常情况在hosts文件加一条记录:主机IP和hostname的映射关系就好了

  6. 客户端获取服务器SessionID &lpar;Asp&period;net SessionID&rpar;

    SessionID是客户端首次访问某个方法或页面, 并且这个方法中设置了Session["xxx"]=xx; 此时服务器返回的响应头(HttpResponse.Headers)中会 ...

  7. 深度学习基础(五)ResNet&lowbar;Deep Residual Learning for Image Recognition

    ResNet可以说是在过去几年中计算机视觉和深度学习领域最具开创性的工作.在其面世以后,目标检测.图像分割等任务中著名的网络模型纷纷借鉴其思想,进一步提升了各自的性能,比如yolo,Inception ...

  8. Exp9 Web安全基础

    Exp9 Web安全基础 20154305 齐帅 一.实验要求 本实践的目标理解常用网络攻击技术的基本原理. Webgoat实践下相关实验: [目录] [第一部分 WebGoat 8.0] 1.Web ...

  9. 理解TCP序列号(Sequence Number)和确认号(Acknowledgment Number)

    原文见:http://packetlife.net/blog/2010/jun/7/understanding-tcp-sequence-acknowledgment-numbers/ from:ht ...

  10. 右值引用&amp&semi;&amp&semi;

    以下内容参考https://blog.csdn.net/china_jeffery/article/details/78520237 右值引用若不作为函数参数使用,基本等于滥用 右值引用 (Rvalu ...