《数据结构与算法Python语言描述》习题第二章第二题(python版)
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版)的更多相关文章
- 数据结构与算法分析——C语言描述 第三章的单链表
数据结构与算法分析--C语言描述 第三章的单链表 很基础的东西.走一遍流程.有人说学编程最简单最笨的方法就是把书上的代码敲一遍.这个我是头文件是照抄的..c源文件自己实现. list.h typede ...
- 《数据结构与算法分析:C语言描述_原书第二版》CH2算法分析_课后习题_部分解答
对于一个初学者来说,作者的Solutions Manual把太多的细节留给了读者,这里尽自己的努力给出部分习题的详解: 不当之处,欢迎指正. 1. 按增长率排列下列函数:N,√2,N1.5,N2,N ...
- 《数据结构与算法分析:C语言描述_原书第二版》CH3表、栈和队列_reading notes
表.栈和队列是最简单和最基本的三种数据结构.基本上,每一个有意义的程序都将明晰地至少使用一种这样的数据结构,比如栈在程序中总是要间接地用到,不管你在程序中是否做了声明. 本章学习重点: 理解抽象数据类 ...
- 检索算法 -- 数据结构与算法的javascript描述 第13章
检索算法-如何在列表中查找特定的值. 顺序查找 从列表的第一个元素开始对列表元素逐个进行判断,直到找到了想要的结果,它属于暴力查找技巧的一种,在执行查找时可能会访问到数据结构里的所有元素. 代码: / ...
- 排序算法 -- 数据结构与算法的javascript描述 第12章
排序是常见的功能,给定一组数据,对其进行排序. 在此之前,我们需要准备个基础工作--自动生成数组,并可以对该组数据做任何处理. /** * 测试类 ,数组 * @param numElements * ...
- 【数据结构与算法分析——C语言描述】第一章总结 引论
这一章主要复习了一些数学知识,像指数.对数.模运算.级数公式:还有2种证明方法,归纳假设法和反证法.所幸以前学过,重新拾捡起来也比较轻松. 简要地复习了递归,提出了编写递归例程的四条基本法则: 基准情 ...
- 字典 -- 数据结构与算法的javascript描述 第七章
字典 字典是一种以键-值对形式存储数据的数据结构 最基本功能规划 add 添加数据到字典 remove 从字典中移除数据 get 从字典中取出数据 count 统计字典数据量 find 查找数据在字典 ...
- 链表的实现 -- 数据结构与算法的javascript描述 第六章
链表 链表是由一组节点组成的集合.每个节点都使用一个对象的引用指向它的后继.指向另一个节点的引用叫做链 结构示意图 : 链表头需要我们标识 head { element:head,next:obj1 ...
- 队列的实现 -- 数据结构与算法的javascript描述 第五章
队列也是列表的一种,有不同于列表的规则. 先进先出 入队方法 出队方法 可以找到队首 可以找到队尾 可以查看队列有多长 可以查看队列是否为空 这是一个基本的需求,围绕他来实现,当然我们可以自己扩展列表 ...
- 栈的实现 -- 数据结构与算法的javascript描述 第四章
栈 :last-in-first-out 栈有自己特殊的规则,只能 后进入的元素 ,最先被推出来,我们只需要模拟这个规则,实现这个规则就好. peek是返回栈顶元素(最后一个进入的). /** * 栈 ...
随机推荐
- MySQL 对比数据库表结构
200 ? "200px" : this.width)!important;} --> 介绍 本章主要介绍怎样对比数据库的表结构的差异,这里主要介绍使用mysqldiff工具 ...
- TODO:Linux安装PHP MongoDB驱动
TODO:Linux安装PHP MongoDB驱动 PHP利于学习,使用广泛,主要适用于Web开发领域. MongoDB的主要目标是在键/值存储方式(提供了高性能和高度伸缩性)以及传统的RDBMS系统 ...
- <canvas>设置宽高遇到的问题
在使用<canvas>元素时必须设置宽度和高度,指定可以绘画的区域大小.但是这里设置宽度和高度的时候有一个小问题. 样例代码: <!DOCTYPE html> <html ...
- VS web项目 基于IIS调试和模拟域名调试
1.安装IIS 2.注册.net framework 到IIS 打开程序-运行-cmd:输入一下命令重新注册IISC:\WINDOWS\Microsoft.NET\Framework\v4.0.303 ...
- 设有一数据库,包括四个表:学生表(Student)、课程表(Course)、成绩表(Score)以及教师信息表(Teacher)。
一. 设有一数据库,包括四个表:学生表(Student).课程表(Course).成绩表(Score)以及教师信息表(Teacher).四个表的结构分别如表1-1的表(一)~表( ...
- 《Qt Quick 4小时入门》学习笔记2
http://edu.csdn.net/course/detail/1042/14805?auto_start=1 Qt Quick 4小时入门 第五章:Qt Quick基本界面元素介绍 1. ...
- ExtJS面向对象
序言 1.ExtJs是一套很好的后台框架.现在很流行的,我们要会. 2.这是我写ExtJs的第一篇,以后会写很多直到把这框架运用的炉火纯青,走火入魔. ExtJs中的命名空间 我是做.net的,这命名 ...
- jQuery源码分析系列:Callback深入
关于Callbacks http://www.cnblogs.com/aaronjs/p/3342344.html $.Callbacks()的内部提供了jQuery的$.ajax() 和 $.Def ...
- 前端工程师技能之photoshop巧用系列第一篇——准备篇
× 目录 [1]作用 [2]初始化 [3]常用工具[4]快捷键 前面的话 photoshop是前端工程师无法回避的一个软件,这个软件本身很强大,但我们仅仅需要通过这个工具来完成基本的切图工作即可.本文 ...
- 【彩票】彩票预测算法(一):离散型马尔可夫链模型C#实现
前言:彩票是一个坑,千万不要往里面跳.任何预测彩票的方法都不可能100%,都只能说比你盲目去买要多那么一些机会而已. 已经3个月没写博客了,因为业余时间一直在研究彩票,发现还是有很多乐趣,偶尔买买,娱 ...