《数据结构与算法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)                                   #返回日期的天
  1 #!/usr/bin/env python
  2 # -*- coding:utf-8 -*-
  3
  4
  5 """
  6 ADT Date:                                       #定义日期对象的抽象数据类型
  7     Date(self, int year, int month, int day)    #构造表示year/month/day的对象
  8     difference(self, Date d2)                   #求出self和d2的日期差
  9     plus(self, int n)                           #计算出日期第self之后n天的日期
 10     num_date(self, int year, int n)             #计算year年第n天的日期
 11     adjust(self, int n)                         #将日期d调整n天(n为带符号整数)
 12     year(self)                                  #返回日期的年
 13     month(self)                                 #返回日期的月
 14     day(self)                                   #返回日期的天
 15 """
 16
 17 class Date(object):
 18     __slots__ = (‘_year‘, ‘_month‘, ‘_day‘)
 19
 20     def __init__(self, year, month, day):
 21         if not isinstance(year, int) or not isinstance(month, int) or not isinstance(day, int):
 22             raise TypeError
 23
 24         if 1800<=year<year+30:
 25             self._year = year
 26             if 1 <= month <= 12:
 27                 self._month = month
 28                 bigmonth = (1,3,4,7,8,10,12)
 29                 smallmonth = (4,6,9,11)
 30                 if month in bigmonth:
 31                     if 0<day<=31:
 32                         self._day = day
 33                     else:
 34                         raise ValueError("%d is not valid day!" % day)
 35                 if month in smallmonth:
 36                     if 0<day<=30:
 37                         self._day = day
 38                     else:
 39                         raise ValueError("%d is not valid day!" % day)
 40                 elif month == 2:
 41                     if Date.leap_year(year):
 42                         if 0<day<=29:
 43                             self._day = day
 44                         else:
 45                             raise ValueError("%d is not valid day!" % day)
 46                     else:
 47                         if 0<day<=28:
 48                             self._day = day
 49                         else:
 50                             raise ValueError("%d is not valid day,the year is not leap_year!" % day)
 51             else:
 52                 raise ValueError("%d is not valid month!" % month)
 53         else:
 54             raise ValueError("%d is not valid year!" % year)
 55
 56     def difference(self, other):
 57         #日期差
 58         DateDiff = 0
 59         if self._year > other._year:
 60             #换个位置,方便计算
 61             tmp = (self._year,self._month,self._day)
 62             (self._year,self._month,self._day) = (other._year,other._month,other._day)
 63             (other._year, other._month, other._day) = tmp
 64
 65         #两个年之间的年直接加它一年的天数,分闰年和非闰年区别366和365
 66         for i in range(self._year+1,other._year):
 67             if Date.leap_year(i):
 68                 DateDiff += 366
 69             else:
 70                 DateDiff += 365
 71         #比较小的年,用后面的月份的天数相加在加上该月剩余的天数
 72         for i in range(self._month+1, 13):
 73             DateDiff += Date.month_day(self._year,i)
 74         DateDiff += Date.month_day(self._year,self._month) - self._day
 75
 76         #比较大的年,加前面月份的天数加上本月的天数
 77         for i in range(1,other._month):
 78             DateDiff += Date.month_day(other._year,i)
 79         DateDiff += other._day
 80         return DateDiff
 81
 82     def plus(self,n):
 83         if not isinstance(n,int):
 84             raise TypeError
 85         if n<0:
 86             raise ValueError("%d is not valid,must >= 0" % n)
 87         self._day += n
 88         while self._day > Date.month_day(self._year,self._month):
 89             self._day -= Date.month_day(self._year,self._month)
 90             self._month += 1
 91             if self._month == 13:
 92                 self._month = 1
 93                 self._year += 1
 94         return Date(self._year, self._month, self._day)
 95
 96     def num_date(self, year, n):
 97         if not isinstance(year, int) or not isinstance(n, int):
 98             raise TypeError
 99         if Date.leap_year(year):
100             if n>366 and n<1:
101                 raise ValueError
102         else:
103             if n>365 and n<1:
104                 raise ValueError
105         self._year = year
106         #判该n对应的月份和天数
107         for i in range(1,13):
108             d = n
109             n -= Date.month_day(year,i)
110             if n<=0:
111                 self._month = i
112                 self._day = d
113                 break
114         return Date(self._year, self._month, self._day)
115
116     def adjust(self,n):
117         if not isinstance(n,int):
118             raise TypeError
119         #n为正的情况
120         if n>=0:
121             self.plus(n)
122         #n为负的情况
123         else:
124             self._day += n
125             while self._day < 0:
126                 if self._month -1 == 0:
127                     self._month = 13
128                     self._year -= 1
129                 self._day += Date.month_day(self._year, self._month-1)
130                 self._month -= 1
131         return Date(self._year, self._month, self._day)
132
133     def __str__(self):
134         return str(self._year) + "-" + str(self._month) + "-" + str(self._day)
135
136
137     def year(self):
138         return self._year
139
140     def month(self):
141         return self._month
142
143     def day(self):
144         return self._day
145
146     @staticmethod
147     def leap_year(year):
148         if (year % 4 == 0 and year % 100 != 0) or year % 400 == 0:
149             return True
150         else:
151             return False
152
153     #每月的天数,字典实现
154     @staticmethod
155     def month_day(year,month):
156         d = {}
157         bigmonth = (1,3,5,7,8,10,12)
158         smallmonth = (4,6,9,11)
159         for i in range(1,13):
160             if i in bigmonth:
161                 d[i] = 31
162             elif i in smallmonth:
163                 d[i] = 30
164             elif i == 2:
165                 if Date.leap_year(year):
166                     d[i] = 29
167                 else:
168                     d[i] = 28
169         return d[month]
170
171
172 if __name__==‘__main__‘:
173     d = Date(2003,12,10)
174     d1 = Date(2005,2,28)
175     print(d)
176     print("===")
177     print(d.difference(d1))
178     d.plus(30)
179     print("===")
180     print(d)
181     print("===")
182     d3 = Date(2006,12,13)
183     d3.num_date(2016,10)
184     print(d3)
185     d3.adjust(-20)
186     print("===")
187     print(d3)

 
时间: 2024-10-11 19:35:22

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

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

对于一个初学者来说,作者的Solutions Manual把太多的细节留给了读者,这里尽自己的努力给出部分习题的详解: 不当之处,欢迎指正. 1.  按增长率排列下列函数:N,√2,N1.5,N2,NlogN, NloglogN,Nlog2N,Nlog(N2),2/N,2N,2N/2,37,N2logN,N3.指出哪些函数以相同的增长率增长. 答:排列如下2/N < 37 < √2 < N < NloglogN < NlogN < Nlog(N2) < Nlog2

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

表.栈和队列是最简单和最基本的三种数据结构.基本上,每一个有意义的程序都将明晰地至少使用一种这样的数据结构,比如栈在程序中总是要间接地用到,不管你在程序中是否做了生命. 本章学习重点: 理解抽象数据类型(ADT)的概念 学习如何对表进行有效的操作 熟悉栈ADT及其在实现递归方面的应用 熟悉队列ADT及其在操作系统和算法设计中的应用 ADT 抽象数据类型(abstract data type)是一个操作的集合,是数学的抽象,在ADT中不涉及如何实现操作的集合,这可以看作是模块化设计的扩充. 对于每

《数据结构与算法分析—C语言描述》pdf

下载地址:网盘下载 内容简介 编辑 <数据结构与算法分析:C语言描述(原书第2版)>内容简介:书中详细介绍了当前流行的论题和新的变化,讨论了算法设计技巧,并在研究算法的性能.效率以及对运行时间分析的基础上考查了一些高级数据结构,从历史的角度和近年的进展对数据结构的活跃领域进行了简要的概括.由于<数据结构与算法分析:C语言描述(原书第2版)>选材新颖,方法实用,题例丰富,取舍得当.<数据结构与算法分析:C语言描述(原书第2版)>的目的是培养学生良好的程序设计技巧和熟练的算

数据结构与算法分析 c语言描述 pdf 高清下载

网盘下载:数据结构与算法分析 c语言描述 pdf 高清下载 – 易分享电子书PDF资源网 作者: [美] Mark Allen Weiss 出版社: 机械工业出版社 副标题: C语言描述 原作名: Data Structures and Algorithm Analysis in C:Second Edition 译者: 冯舜玺 出版年: 2004-1-1 页数: 391 定价: 35.00元 装帧: 平装 内容简介 · · · · · · 本书是<Data Structures and Alg

数据结构与问题求解-Java语言描述(第三版)

数据结构对程序的重要性不言而喻,用java语言来实现常见的一些数据结构,以及在相应数据结构上的操作对学习java的同学来说是必须掌握的. 本系列博文参考<数据结构与问题求解-Java语言描述(第三版)>来实现 在自己学习的过程中,更希望有机会与大家交流. PS :本人是菜鸟,只是用博客的方式激励自己.请轻喷.Fighting!

【软件构造】第二章第二节 软件构造的过程、系统和工具

第二章第二节 软件构造的过程.系统和工具 Outline 广义的软件构造过程 编程 静态代码分析 动态代码分析 调试与测试 重构 狭义的软件构造过程 构造系统:经典BUILD场景 构造系统的组件 构造过程和构造描述 Java编译工具 子目标和结构变体 构造工具 Notes ## 广义的软件构造过程 [编程(Coding)] 开发语言:如Java.C.Python 使用IDE(集成开发工具)的优势(组成) 方便编写代码和管理文件(有代码编辑器,代码重构工具.文件和库(Library)管理工具) 能

Git帮助文档阅读笔记----第二章-第二节

查看提交历史 1.查看提交历史 git log 默认不用任何参数的话,git log 会按提交时间列出所有的更新,最近的更新排在最上面 git log 有许多选项可以帮助你搜寻感兴趣的提交 1.  -p选项展开显示每次提交的内容差异 2.  -2显示最近的两次更新 该选项除了显示基本信息之外,还在附带了每次 commit 的变化.当进行代码审查,或者快速浏览某个搭档提交的 commit 的变化的时候,这个参数就非常有用了. 某些时候,单词层面的对比,比行层面的对比,更加容易观察.Git 提供了 

数据结构与算法+Python语言描述pdf

下载地址:网盘下载 本书基于Python语言介绍了数据结构与算法的基本知识,主要内容包括抽象数据类型和Python面向对象程序设计.线性表.字符串.栈和队列.二叉树和树.集合.排序以及算法的基本知识.本书延续问题求解的思路,从解决问题的目标来组织教学内容,注重理论与实践的并用. 下载地址:网盘下载 原文地址:https://www.cnblogs.com/cf3276625841/p/9325994.html

数据结构与算法分析_Java语言描述(第2版)高清版pdf免费下载

下载地址:网盘下载 备用地址:网盘下载 内容简介编辑“数据结构”是计算机专业的基础与核心课程之一,Java是现今一种热门的语言.本书在编写过程中特别考虑到了面向对象程序设计(OOP)的思想与Java语言的特性.它不是从基于另一种程序设计语言的数据结构教材简单地“改编”而来的,因此在数据结构的实现上更加“地道”地运用了Java语言,并且自始至终强调以面向对象的方式来思考.分析和解决问题.本书是为数据结构入门课程(通常课号是CS-2)而编写的教材.作者Frank Carrano在编写过程自始至终特别

数据结构与算法分析_Java语言描述(第2版)pdf

下载地址:网盘下载 本书是国外数据结构与算法分析方面的经典教材,使用卓越的Java编程语言作为实现工具讨论了数据结构(组织大量数据的方法)和算法分析(对算法运行时间的估计). 随着计算机速度的不断增加和功能的日益强大,人们对有效编程和算法分析的要求也不断增长.本书将算法分析与最有效率的Java程序的开发有机地结合起来,深入分析每种算法,并细致讲解精心构造程序的方法,内容全面.缜密严格. 第3版的主要更新如下: ? 第4章包含AVL树删除算法的实现. ? 第5章进行了全面修订和扩充,现在包含两种较