怎么用c#实现打渔晒网问题

发布时间:2021-12-18 16:05:39 作者:iii
来源:亿速云 阅读:205
# 怎么用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 => "打渔",
            _ => "晒网"
        };
    }
}

代码解析

1. 日期输入处理

DateTime startDate = new DateTime(2020, 1, 1);
DateTime targetDate = DateTime.Parse(input);

2. 天数计算

return (end - start).Days;

3. 状态判断

int remainder = days % 5;
return remainder switch
{
    1 or 2 or 3 => "打渔",
    _ => "晒网"
};

功能测试案例

测试日期 预期结果 实际结果
2020-01-01 打渔 打渔
2020-01-04 晒网 晒网
2020-01-06 打渔 打渔
2021-02-28 晒网 晒网

进阶优化方案

1. 支持自定义周期

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 
        ? "打渔" : "晒网";
}

2. 增加日期验证

static bool ValidateDate(string input, out DateTime date)
{
    return DateTime.TryParseExact(
        input, 
        "yyyy-MM-dd", 
        CultureInfo.InvariantCulture, 
        DateTimeStyles.None, 
        out date);
}

3. 性能优化建议

常见问题解答

Q1:为什么起始日期要固定? A:因为这是一个相对周期问题,需要参考基准点来计算总天数。

Q2:如何处理跨年的日期计算? A:DateTime的减法运算会自动处理闰年和月份天数差异,无需特殊处理。

Q3:如果输入日期早于起始日期怎么办? A:程序中已添加校验,会提示错误信息。

总结

通过这个案例我们学会了: 1. C#中DateTime的基本操作 2. 时间跨度的计算方法 3. 周期问题的通用解决思路 4. 控制台程序的输入输出处理

完整项目代码已上传至GitHub:示例仓库链接

提示:实际开发中应考虑添加更多异常处理,如空值检查、日期范围验证等。 “`

推荐阅读:
  1. 用C#实现递归方法
  2. 怎么用C#实现单个打印快递单号

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

上一篇:C语言的冒泡排序方法怎么使用

下一篇:如何进行springboot配置templates直接访问的实现

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》