您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# 怎么用C#实现打渔晒网问题
## 问题背景与需求分析
"打渔晒网"是一个经典的编程练习题,源于中国古代渔民的工作模式:三天打渔,两天晒网。我们需要通过程序计算某一天是处于"打渔"还是"晒网"周期。
**问题需求**:
1. 输入一个特定日期
2. 计算从固定起始日期到该日期的总天数
3. 根据总天数判断是"打渔"还是"晒网"
4. 5天为一个周期(前3天打渔,后2天晒网)
## 解决方案设计
### 核心算法
1. **日期差值计算**:计算两个日期之间的天数差
2. **周期判断**:对总天数取模5,余数为1-3打渔,4-0晒网
### 技术要点
- DateTime日期的处理
- 闰年判断逻辑
- 循环与条件判断
## C#完整实现代码
```csharp
using System;
class FishingSchedule
{
static void Main(string[] args)
{
// 设置固定起始日期(示例:2020年1月1日)
DateTime startDate = new DateTime(2020, 1, 1);
Console.WriteLine("请输入要查询的日期(格式:yyyy-MM-dd):");
string input = Console.ReadLine();
try
{
DateTime targetDate = DateTime.Parse(input);
if (targetDate < startDate)
{
Console.WriteLine("输入日期不能早于起始日期!");
return;
}
int totalDays = CalculateTotalDays(startDate, targetDate);
string result = JudgeFishingOrDrying(totalDays);
Console.WriteLine($"从{startDate:yyyy-MM-dd}到{targetDate:yyyy-MM-dd}共经历了{totalDays}天");
Console.WriteLine($"这一天是:{result}");
}
catch (FormatException)
{
Console.WriteLine("日期格式不正确!");
}
}
// 计算两个日期之间的天数差
static int CalculateTotalDays(DateTime start, DateTime end)
{
return (end - start).Days;
}
// 判断打渔还是晒网
static string JudgeFishingOrDrying(int days)
{
int remainder = days % 5;
return remainder switch
{
1 or 2 or 3 => "打渔",
_ => "晒网"
};
}
}
DateTime startDate = new DateTime(2020, 1, 1);
DateTime targetDate = DateTime.Parse(input);
DateTime
结构处理日期Parse
方法将字符串转换为日期对象return (end - start).Days;
int remainder = days % 5;
return remainder switch
{
1 or 2 or 3 => "打渔",
_ => "晒网"
};
测试日期 | 预期结果 | 实际结果 |
---|---|---|
2020-01-01 | 打渔 | 打渔 |
2020-01-04 | 晒网 | 晒网 |
2020-01-06 | 打渔 | 打渔 |
2021-02-28 | 晒网 | 晒网 |
class FishingConfig
{
public int FishingDays { get; set; } = 3;
public int DryingDays { get; set; } = 2;
}
static string JudgeStatus(int days, FishingConfig config)
{
int cycle = config.FishingDays + config.DryingDays;
int remainder = days % cycle;
return remainder <= config.FishingDays && remainder != 0
? "打渔" : "晒网";
}
static bool ValidateDate(string input, out DateTime date)
{
return DateTime.TryParseExact(
input,
"yyyy-MM-dd",
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out date);
}
Q1:为什么起始日期要固定? A:因为这是一个相对周期问题,需要参考基准点来计算总天数。
Q2:如何处理跨年的日期计算? A:DateTime的减法运算会自动处理闰年和月份天数差异,无需特殊处理。
Q3:如果输入日期早于起始日期怎么办? A:程序中已添加校验,会提示错误信息。
通过这个案例我们学会了: 1. C#中DateTime的基本操作 2. 时间跨度的计算方法 3. 周期问题的通用解决思路 4. 控制台程序的输入输出处理
完整项目代码已上传至GitHub:示例仓库链接
提示:实际开发中应考虑添加更多异常处理,如空值检查、日期范围验证等。 “`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。