有句俗话“三天打鱼两天晒网”,假设小明从1990年1月1日起开始“三天打鱼两天晒网”,问小王在以后的某一天是在“打鱼”,还是在“晒网”?(键入日期,显示结果打鱼or晒网)。

本文介绍了一个用C语言编写的程序,该程序能够计算特定日期是一周中的哪一天,并展示整个月份的日历视图。通过定义函数判断闰年、获取每个月的最大天数、计算日期总天数等,实现了日期计算的功能。
#include <stdio.h>  
  
int Isleap(int year)  
{  
    if( (year % 400 == 0) || ((year % 4 == 0) && (year % 100 != 0)) )
{  
        return 1;
}  
    else  
    {
   return 0;
}      
}  
   
int Max_day(int year, int month)  
{  
    int Day[12]={31,28,31,30,31,30,31,31,30,31,30,31};
  
    if(Isleap(year) == 1)  
    {
    Day[1] = 29;
}
  
    return Day[month-1];  
}  
  
int Total_day(int year, int month ,int day)  
{  
    int sum = 0;  
    int i = 1;
  
    for(i = 1;i < month;i++)
{  
    sum = sum+Max_day(year,i);  
    sum = sum+day;
}
  
    return sum;  
}  
   
int Weekday(int year, int month ,int day)  
{  
    int count;
  
    count = (year-1)+(year-1)/4-(year-1)/100+(year-1)/400 +Total_day(year,  month,day);  
    count = count % 7;  
    return count;  
}  
  
void display_week(int year, int month , int day)  
{  
    int count;  
    count = Weekday(year,month,day);  
    switch(count)  
        {  
            case 0:printf("\033[32m\t%d-%d-%d is Sunday\n\033[0m",year,month,day);break;  
            case 1:printf("\033[32m\t%d-%d-%d is Monday\n\033[0m",year,month,day);break;  
            case 2:printf("\033[32m\t%d-%d-%d is Tuesday\n\033[0m",year,    month,day);break;  
            case 3:printf("\033[32m\t%d-%d-%d is Wednesday\n\033[0m",year,  month,day);break;  
            case 4:
printf("\033[32m\t%d-%d-%d is Thursday\n\033[0m",year,      month,day);break;  
            case 5:printf("\033[32m\t%d-%d-%d is Friday\n\033[0m",year,month,day);break;  
            case 6:printf("\033[32m\t%d-%d-%d is Saturday\n\033[0m",year,   month,day);break;  
            defult:system("cls");printf("error\n");  
        }  
}  


void display_month(int year, int month, int day)  
{  
    int i = 0,j = 1;  
    int week,max;  
    week = Weekday(year,month,1);  
    max = Max_day(year,month);  
    printf("\t\t\t\t%d",month);  
    printf("\033[31m\n\tSUN\tMON\tTUE\tWED\tTHU\tFRI\tSAT\n\033[0m");  
    for(i = 0;i < week;i++)  
    printf("\t");  
    for(j = 1;j <= max;j++)  
    {  
        printf("\t%d",j);  
        if(i % 7 == 6)  
            printf("\n");  
        i++;  
    }  
    printf("\n");  
}  
  
  
int main()  
{  
    int year,month,day;  
    printf("\tplease enter year month day: ");  
    scanf("%d%d%d",&year,&month,&day);  
    if(month<1||month>12||day<1||day>31)  
    {  
        printf("error...\n");  
        return -1;  
    }  
    display_week(year,month,day);  
    display_month(year,month,day);  
    return 0;  
}  
<think>嗯,用户想用C语言写一个程序,根据输入的天数n来判断是打鱼还是晒网。首先,我需要理清楚题的要求。根据用户提供的引用内容,比如引用[1]中提到,这个题需要计算从起始日期到指定日期的总天数,然后用5去除,余数1、2、3是打鱼,否则晒网。不过不同的引用中起始份不同,比如有的从1990开始,有的从2010或2011开始,但用户现在的题可能只需要处理天数n,而不是具体的日期转换。不过用户的题描述可能有些混淆,因为他说“根据输入的天数n”来判断,而不是具体的日期。但引用中的例子都是先计算日期到起始日期的天数,再取余。 所以,我需要确认用户的需求。用户可能希望输入一个天数n,比如从第1开始,然后判断第n天是打鱼还是晒网。或者,用户可能实际上需要处理的是从某个固定起始日期开始到输入日期的天数,但题描述中简化成了直接输入天数n。这时候需要明确程序的结构。 假设用户的题确实是输入天数n,那么程序逻辑就比较简单:对n取余5,余数1-3打鱼,否则晒网。但根据引用中的例子,比如引用[5]中的运行效果,比如输入2022-4-19输出sleeping,而计算出的天数可能对应余数4或0。因此,正确的逻辑应该是总天数减1后取余5,因为起始(第1天)是打鱼。例如,第1天是余数0的话,那么余数0对应打鱼,这可能需要调整。 不过根据引用[1]中的步骤,计算天数后用5去除,余数1、2、3打鱼,否则晒网。比如如果总天数是5,余数为0,则晒网。但起始1990-1-1是第1天,余数1的话是打鱼。那么假设总天数是从起始开始计算,包括当天。比如第1天:1%5=1打鱼;第5天:5%5=0,晒网。所以余数判断是1、2、3打鱼,0、4晒网?或者是否余数0对应第5天? 这里可能需要注意,余数的处理是否正确。比如总天数是从1开始计算的,比如n天后的余数是n%5,如果n=5,余数0,对应第五天,应该是晒网。但根据引用[5]的例子,比如输入2020-1-4(第4天)应该晒网,余数4%5=4,这时候余数大于3,所以晒网。而第5天5%5=0,同样晒网。所以判断条件应该是如果余数是1、2、3,打鱼;否则晒网。余数0的情况对应第五天,属于晒网。所以代码中应该用n%5的结果,如果余数在1-3之间,打鱼,否则晒网。 因此,程序的大体结构应该是: 1. 输入天数n。 2. 计算余数:remainder = n %5。 3. 如果remainder在1-3之间,输出打鱼,否则晒网。 但需要确认起始是否是第1天,比如用户的题中可能n=1对应第一天,这时候余数1打鱼。例如,如果用户输入的天数是n=5,余数0,晒网。所以逻辑正确。 那程序应该怎么写呢?例如: #include <stdio.h> int main() { int n; printf("输入天数n:"); scanf("%d", &n); int remainder = n %5; if (remainder >=1 && remainder <=3) { printf("打鱼\n"); } else { printf("晒网\n"); } return 0; } 不过用户可能需要的是处理日期的转换,比如输入具体的日期,计算该日期距离起始的天数,然后取余判断。但用户的题描述是“根据输入的天数n”来判断,所以可能用户已经解决了计算天数的部分,现在只需要处理余数的判断。或者用户的题可能被简化了,只需要处理余数的判断部分。 根据用户的题描述,他说“我想编写一个C语言程序来判断给定天数是'打鱼'还是'晒网'的状态”,所以可能直接输入的是天数n,而不是日期。因此,程序只需要处理这个余数判断即可。 但需要提醒用户,如果是输入日期的话,需要先计算该日期距离起始的总天数。例如,引用中的各个例子都需要计算从某个固定起始到输入日期的总天数,然后再进行余数判断。因此,可能用户的题需要分为两部分:计算天数,然后判断余数。但用户现在的题可能只是针对第二部分,即已知天数n的情况下判断状态。 所以,回答需要分情况:如果输入的是天数n,则直接取余判断;如果输入的是日期,则需要先计算天数,再判断。根据用户的题,他可能已经知道如何计算天数,现在需要如何判断余数,或者需要整个过程的实现。 但根据用户的题描述:“如何用C语言实现根据输入的天数n判断该天是'打鱼'还是'晒网'”,所以答案应针对输入n的情况,给出余数判断的代码。但可能用户的理解有误,认为n是直接输入的天数,而实际可能需要从日期转换得到n。因此,在回答时需要明确两种情况,或者确认用户的需求。 假设用户的题确实是直接输入天数n,那么代码非常简单,如上述所示。但如果用户需要处理的是日期输入,那么需要更复杂的代码来计算天数。比如引用[5]中的例子,输入格式是-月-,需要计算该日期距离起始的天数。 例如,用户可能混淆了“输入天数n”和“输入日期”的区别。比如,用户可能想输入日期,而不是天数。因此,需要进一步明确。 但根据用户的题描述,他明确说“根据输入的天数n”,所以可能他希望程序直接接受n的值,而不是日期。因此,回答应针对这种情况,给出相应的代码,并解释逻辑。 但可能用户的题更复杂,需要处理日期到天数的转换。这时候需要结合引用中的内容,比如如何计算两个日期之间的天数。比如,用户提供的引用中有多个关于如何计算天数的例子,比如引用[1]中的步骤分为计算天数、取余、判断。 因此,用户可能需要完整的程序,包括处理日期输入,计算天数,再判断状态。但根据用户的题,他可能现在只关注如何根据已知的天数n来判断,而日期转换部分可能已经解决或者需要另外处理。 因此,在回答中应该分步骤说明: 1. 确定起始日期,如1990-1-1或其他日期,不同的引用中起始日期不同,需要用户明确。但用户的题可能希望将起始日期作为第1天,然后输入n为之后的天数。 2. 计算从起始到目标的总天数n。 3. 根据n%5的余数判断状态。 但用户的题现在是如何根据n来判断状态,因此代码部分只需要实现步骤3。然而,可能用户需要的是一个完整的程序,包括处理日期输入,计算天数,再判断。这时候需要将两部分结合起来。 例如,完整的程序需要: - 输入一个日期,例如格式为YYYY-MM-DD。 - 计算该日期距离起始(如1990-1-1)的天数n。 - 计算n%5,判断余数。 但用户现在的题是如何根据输入的天数n来判断,所以可能他需要的是第三部分。因此,在回答中,可以给出两种情况: 情况一:直接输入天数n,判断状态: 代码如上面所述。 情况二:输入日期,计算天数n,再判断状态。这时候需要编写计算天数的函数,比如判断闰,计算每个月的天数,累加从起始到目标、月的天数,再加上。 因此,回答中可能需要包含这两个部分,但根据用户的题描述,他现在可能只需要处理情况一。或者,用户可能误将题简化为输入天数,而实际需要处理的是日期。 需要进一步分析用户的题。用户的题描述可能不够准确,因为引用中的例子都是处理日期输入,而用户的题现在提到的是“输入天数n”。可能用户希望简化题,先处理已知天数的情况,或者他可能误解了题,将日期转换为天数的题视为已经解决,现在需要余数判断部分。 因此,回答应该先解决用户明确提到的部分:输入天数n,判断状态。然后,可能生成相关题中包含如何处理日期转换的题,引导用户进一步学习。 因此,在回答中: 1. 给出根据天数n判断的代码,解释逻辑。 2. 可能提醒用户,如果是输入日期,需要先计算天数,并提供相关的实现步骤或参考引用中的方法。 例如,在回答中,可以首先说明核心判断逻辑(取余),然后提供该部分的代码。接着,如果用户需要处理日期转换,可以指导其如何实现,比如参考引用中的方法,或者给出计算天数的示例代码。 在用户提供的引用中,引用[1]详细说明了计算天数的步骤:计算从起始日期到指定日期的总天数,涉及到闰的判断,按月累加天数等。因此,在回答中,如果用户需要处理日期输入,可以指导他如何实现这一部分,可能引用相关的资料。 总结: 用户的题可能分为两部分: a) 输入天数n,判断状态。 b) 输入日期,计算天数n,再判断状态。 根据用户的题描述,他现在需要的是a部分的实现。因此,回答应首先给出a的代码,然后可能补充说明如果处理日期输入的话,如何扩展程序,并引用相关的引用资料,如引用[1]中的步骤。 因此,回答的结构可能是: - 核心判断逻辑(根据余数) - 示例代码(输入n的情况) - 扩展说明如何处理日期输入,并引用相关引用中的方法 - 相关题,如如何计算两个日期的天数差等。 这样既解决了用户的直接题,又引导他处理更复杂的情况。</think>### 分步实现步骤 #### 一、核心逻辑分析 根据题意,判断逻辑可简化为数学表达式: $$ n \mod 5 \in \{1,2,3\} \Rightarrow \text{打鱼} $$ $$ \text{否则} \Rightarrow \text{晒网} $$ #### 二、基础实现代码 ```c #include <stdio.h> int main() { int n; printf("输入天数n:"); scanf("%d", &n); // 核心判断逻辑 if (n % 5 >= 1 && n % 5 <= 3) { printf("状态:打鱼\n"); } else { printf("状态:晒网\n"); } return 0; } ``` #### 三、日期转换扩展 若需处理真实日期输入,需增加日期计算功能(以19901月1为起点): ```c #include <stdio.h> // 判断闰函数 int is_leap_year(int year) { return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0); } // 计算日期距离1990-1-1的天数 int calc_days(int y, int m, int d) { int month_days[] = {0,31,28,31,30,31,30,31,31,30,31,30,31}; int total = 0; // 计算 for (int i = 1990; i < y; i++) { total += is_leap_year(i) ? 366 : 365; } // 月计算 if (is_leap_year(y)) month_days[2] = 29; for (int i = 1; i < m; i++) { total += month_days[i]; } // 计算 return total + d - 1; // 减11月1算第0天 } int main() { int year, month, day; printf("输入日期(格式:):"); scanf("%d %d %d", &year, &month, &day); int days = calc_days(year, month, day); printf("距离基准天数:%d\n", days); // 调用基础判断逻辑 if (days % 5 >= 1 && days % 5 <= 3) { printf("状态:打鱼\n"); } else { printf("状态:晒网\n"); } return 0; } ``` [^1]: 日期计算核心逻辑参考自经典日期算法设计 [^2]: 状态判断方法符合周期性规律特征
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值