概述
三天打鱼两天晒网编程题
- 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语言实现“三天打鱼两天晒网”编程题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复