我是靠谱客的博主 霸气西牛,最近开发中收集的这篇文章主要介绍Go语言实现“三天打鱼两天晒网”编程题,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

三天打鱼两天晒网编程题

    • 1、题目描述
    • 2、思路
    • 3、代码实现
      • 3.1 创建可以计算日期的函数SumDays()
      • 3.2 创建判断打鱼还是晒网的函数fishOrNet()
      • 3.3 创建接收输入日期信息的函数inputFunc()
      • 3.4 主函数main()中调用
    • 4、输出结果
    • 5、问题及改进方案
      • 5.1 改进方案
      • 5.2代码实现

1、题目描述

编写一个函数,判断打鱼还是晒网:
中国有句俗语叫“三天打鱼两天晒网”,如果从1990年1月1日期开始执行"三天打鱼两天晒网”,如何判断在以后的某一天中是“打鱼”还是“晒网”?

2、思路

首先计算出1990年1月1日到输入的年月日之间共有多少天:
第一步,1990年1月1日到所输入的年份之间的天数 需要注意的是:平年365天,闰年366天
第二步,输入的这个年份中,从1月1号一直到输入的月份之间的天数
第三步,输入的日期即为当月的天数
然后“三天打鱼两天晒网”一共五天,每隔五天循环一次,那么,可以用总的天数除以5,得出余数:
如果余数是1,2,3,则输出“今日打鱼”
如果余数是4,5,则输出“今日晒网”

3、代码实现

为保证代码的可复用性(比如需要更改开始日期,更改判断条件“三天打鱼两天晒网改成五天打鱼四天晒网”等等),所以创建三个不同功能函数

3.1 创建可以计算日期的函数SumDays()

func sumDays(yearNum, monthNum, dayNum int) int {
count := 0
for i := 1990; i < yearNum; i++ {
if (i%4 == 0 && i%100 != 0) || i%400 == 0 {
count += 366
} else {
count += 365
}
}
for j := 1; j < monthNum; j++ {
switch monthNum {
case 1, 3, 5, 7, 8, 10, 12:
count += 31
case 4, 6, 9, 11:
count += 30
case 2:
if (yearNum%4 == 0 && yearNum%100 != 0) || yearNum%400 == 0 {
count += 29
} else {
count += 28
}
}
}
return count + dayNum
}

3.2 创建判断打鱼还是晒网的函数fishOrNet()

func fishOrNet(days int) {
res := days % 5
switch res {
case 1, 2, 3:
fmt.Println("这一天在打鱼!")
case 4, 5:
fmt.Println("这一天在晒网!")
}
}

3.3 创建接收输入日期信息的函数inputFunc()

func inputFun() (num1, num2, num3 int) {
var year int
var month int
var day int
for {
fmt.Print("请输入年:")
fmt.Scanln(&year)
if year >= 1990 {
break
} else {
fmt.Println("输入的年份错误!")
}
}
for {
fmt.Print("请输入月:")
fmt.Scanln(&month)
if month > 0 && month <= 12 {
break
} else {
fmt.Println("输入的月份错误!")
}
}
for {
fmt.Print("请输入日:")
fmt.Scanln(&day)
if (year%4 == 0 && year%100 != 0) || year%400 == 0 {
if day > 0 && day <= 29 {
break
}
fmt.Println("输入月份错误!")
} else {
if day > 0 && day <= 28 {
break
}
fmt.Println("输入月份错误!")
}
}
return year, month, day
}

3.4 主函数main()中调用

func main() {
for {
dayCount := sumDays(inputFun())
fishOrNet(dayCount)
}
}

4、输出结果

请输入年:1990
请输入月:1
请输入日:6
这一天在打鱼!
请输入年:1990
请输入月:1
请输入日:9
这一天在晒网!
请输入年:

5、问题及改进方案

此程序逻辑比较简单,但是代码过于冗长,time包中相关函数,可以将初始时间和输入时间之间进行运算,得出中间的总天数。

5.1 改进方案

time包中的Parse()函数可以解析一个格式化的时间字符串并返回它代表的时间
time.Sub()函数可以计算两个时间之间的差
再利用time.Hours()函数将时间差转换成小时
总的小时数/24得出来的即为天数

5.2代码实现

原来计算日期的函数sumDays()即可以改为:

func daySum(year, month, day int) int {
inputTime := time.Date(year, time.Month(month), day, 0, 0, 0, 0, time.Local)
initTime := time.Date(1990, 1, 1, 0, 0, 0, 0, time.Local)
daysSum := int(inputTime.Sub(initTime).Hours()/24)
return daysSum+1
}

time.Date函数
func (t Time) Date() (year int, month Month, day int)
返回时间点t对应的年、月、日。
最后要注意的是,1990年1月1日本身应看作一天,不过如果按上述计算,1990年1月1日-1990年1月1日,为0天,所以需要返回的总天数+1天

最后

以上就是霸气西牛为你收集整理的Go语言实现“三天打鱼两天晒网”编程题的全部内容,希望文章能够帮你解决Go语言实现“三天打鱼两天晒网”编程题所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(35)

评论列表共有 0 条评论

立即
投稿
返回
顶部