栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

100个python算法超详细讲解:打鱼还是晒网

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

100个python算法超详细讲解:打鱼还是晒网

1.问题描述
中国有句俗语叫“三天打鱼两天晒网”。某人从1990年1月1日起便
开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还
是“晒网”。
2.问题分析
根据题意可以将解题过程分为以下三步:
1)计算从1990年1月1日开始至指定日期共有多少天。
2)由于“打鱼”和“晒网”的周期为5天,所以将计算出的天数用5去
除。
3)根据余数判断他是在“打鱼”还是在“晒网”。
若余数为1,2,3,则他是在“打鱼”,否则是在“晒网”。
3.算法设计
本题目使用的算法为数值计算算法,要利用循环求出指定日期距
1990年1月1日的天数,并考虑到循环过程中的闰年情况,闰年二月为
29天,平年二月为28天。判断闰年的方法可以用伪语句描述如下:
如果能被4整除并且不能被100整除或者能被400整除,则该年是闰
年,否则不是闰年。
提示: 在Python语言中判断能否整除可以使用求余运算符“%”。
4.确定程序框架
程序流程图如图1.11所示。

根据流程,构建程序框架如下:

if __name__ == '__main__':
print("please input 指定日期 包括年,月,日 如:1999 1 31")
year, month, day = [int(i) for i in input().split()]
# 定义一个日期字典
today = {'year': year, 'month': month, 'day': day}
totalDay = countDay(today) # 求出指定日期距离1990年1月1日的天数
print("%d年%d月%d日与1990年1月1日相差 %d 天" % (year, month, day,
totalDay))
# 天数 % 5,判断输出打鱼还是晒网
result = totalDay % 5
if result > 0 and result < 4:
print("今天打鱼")
else:
print("今天晒网")

 5.求出指定日期距离1990年1月1日的天数
这里为整个算法的核心部分,经过分析可以得到指定日期距离
1990年1月1日的天数totalDay=1990年至指定年的前一年共有多少天+指
定年中到指定日期的天数。由于每月天数不同,可以设置一个月份数
组int perMonth[13]存放每月的天数。程序利用年份作为循环变量,要
判断指定年份之前的每一年是否为闰年,若为闰年则执行
totalDay=totalDay+366,否则执行totalDay=totalDay+365;对于指定年
份,也要判定是否为闰年,然后根据月份数,将每月的天数累加到
totalDay中。
perMonth数组的初始化设置如表1.2所示。该设置含有13个元素,
perMonth[0]元素并不使用,原因在于这种设置可以使数组下标和月份
对应,便于编程设置循环变量,数组中二月天数初始设置为28,如果
当前年份为闰年,则需要执行perMonth[2]+=1操作。

提炼功能模块,我们设计一个函数countDay(currentDay)来实现求
总天数的功能,设计一个函数runYear(year)来判断是否为闰年。判断是
否为闰年的函数runYear(year)的实现如下:

# 判断是否为闰年。是,则返回1,否,则返回0
def runYear(year):
if (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0): # 是闰年
return 1
else:
return 0

 求总天数的函数countDay(currentDay)的实现如下:

# 计算指定日期距离1990年1月1日的天数
def countDay(currentDay):
每月天数数组
# 每月天数数组
perMonth = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30]
totalDay = 0
year = 1990
while year < currentDay['year']: # 求出指定日期之前的每一年的天数之和
if runYear(year) == 1: # 判断是否为闰年
totalDay = totalDay + 366
else:
totalDay = totalDay + 365
year += 1
# 如果为闰年,则二月份为29天
if runYear(currentDay['year']) == 1:
perMonth[2] += 1
i = 0
while i < currentDay['month']: # 将本年内的天数累加到totalDay中
totalDay += perMonth[i]
i += 1
totalDay += currentDay['day'] # 将本月内的天数累加到totalDay中
return totalDay

6.完整的程序
根据上面的分析,编写程序如下:

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @author : liuhefei
# @desc: 打鱼还是晒网
# 判断是否为闰年。是,则返回1;否,则返回0
def runYear(year):
if (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0): # 是闰年
return 1
else:
return 0
# 计算指定日期距离1990年1月1日的天数
def countDay(currentDay):
# 每月天数数组
perMonth = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30]
totalDay = 0
year = 1990
while year < currentDay['year']: # 求出指定日期之前的每一年的天数之和
if runYear(year) == 1: # 判断是否为闰年
totalDay = totalDay + 366
else:
totalDay = totalDay + 365
year += 1
# 如果为闰年,则二月份为29天
if runYear(currentDay['year']) == 1:
perMonth[2] += 1
i = 0
将本年内的天数累加到 中
while i < currentDay['month']: # 将本年内的天数累加到totalDay中
totalDay += perMonth[i]
i += 1
totalDay += currentDay['day'] # 将本月内的天数累加到totalDay中
return totalDay
if __name__ == '__main__':
while True:
print("please input 指定日期 包括年,月,日 如:1999 1 31")
year, month, day = [int(i) for i in input().split()]
# 定义一个日期字典
today = {'year': year, 'month': month, 'day': day}
totalDay = countDay(today) # 求出指定日期距离1990年1月1日的天数
print("%d年%d月%d日与1990年1月1日相差 %d 天" % (year, month, day,
totalDay))
# 天数 % 5,判断输出打鱼还是晒网
result = totalDay % 5
if result > 0 and result < 4:
print("今天打鱼")
else:
print("今天晒网")

7.运行结果
在PyCharm下运行程序,结果如图1.12所示。

8.补充知识点
(1)函数
函数是指用于实现某个功能的一系列语句的组合。在定义函数
时,需要指定函数的名称及所需参数,并编写一系列程序语句(函数
体),之后可以使用这个函数名称来直接调用它。
在Python中定义了许多内置函数,可以直接使用,在后续的章节中
将会讲到。同时Python也支持自定义函数,可以根据自己的需要,自己
定义一个函数来实现某个功能。自定义函数语法如下:

def 函数名(参数列表):
函数体

 规则如下:
·Python使用关键字def定义函数,也就是函数代码块以def关键字开
头,后面跟上函数标识符名称和圆括号“()”。
·在圆括号“()”中定义函数所需的参数,换句话说就是所有传入的
参数和变量都必须放到圆括号中。
·函数内容以冒号开始,注意函数体语句的缩进格式。
·可以使用return关键字来向函数调用方返回一个结果值,“return[表
达式]”用于结束函数,不带表达式的return语句相当于返回None。
·函数名的定义规则:必须以字母或下划线开头,如main函数
(__name__=="__main__"),不能以数字开头。同时不能把Python自带的
关键字定义为函数的名称。
(2)字典
在代码中,我们定义了一个日期字典,如下:

today = {'year': year, 'month': month, 'day': day}

字典是Python语言中的一种数据结构,以{}包含数据集,定义语法
如下:

字典名 = {key1: value1, key2: value2}

字典内的元素是由键/值(key/value)对组成的,键和值之间使用
冒号(:)分割,每个键/值对之间使用逗号(,)分割,每个键key必须
是唯一的,值可以不唯一。字典的值可以取任何数据类型,例如字符
串、数字或元组,而键必须是不可变的。
字典是无序的,通常情况下,我们是使用字典的键来访问其成员
的,它是采用哈希原理实现的。一个空字典不包含任何元素,仅使用
一个大括号定义,如{}。
下面介绍字典的常用操作方法。
·dict.clear():清空字典,也就是删除字典中的所有元素。
·dict.copy():复制字典,返回一个具有相同键/值对的新字典,是
浅复制。
·dict.fromkeys(seq[,value]):创建一个新字典,以序列seq中的元素
作为字典的键,value为字典所有键对应的初始值。
·dict.get(key,default=None):获取键key的value值,如果值不存在,
就返回默认值。
·dict.items():以列表的形式返回可遍历的(键/值)元组数组。
·dict.keys():以列表的形式,返回字典中的所有键。
·dict.pop(key):删除键key。
·dict.update(dict2):更新字典元素,用于把字典dict2的键/值对更新
到dict中。
·dict.values():以列表的形式返回字典中的所有值。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/883839.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号