打鱼还是晒网问题

发布时间 2023-04-13 21:09:33作者: 软件拓荒人

一、问题描述

一个渔夫从1990年1月1日起开始“三天打鱼两天晒网”,问这人在以后的某一天是打鱼还是晒网

二、设计思路:
1:要求出总天数;
2:考虑到闰年和平年的二月天数不同;
3:打鱼还是晒网主要是找一个周期,明显为5,对5求余找余数;
 
 
三、程序流程图
 
四、代码实现
#include<stdio.h>
typedef struct date//定义一个时间类的结构体
    {
        int year;
        int month;
        int day;    
    }Date;

int runYear(int b)//写一个判断润年的函数
{
    if((b%400==0)||(b%100!=0&&b%4==0))
    {
        return 1;//是闰年则返回真值1
    }
    else return 0;//不是闰年则返回0
}
int coutday(Date a)//写一个计算总天数的函数
{
    int permonth[13]={0,31,28,31,30,31,30,31,31,30,31,30};//初始化当闰年时候的月份天数
    //特意设置13个的长度,为了将数组名月月份相对应
    int year;//定义一个年份中间变量
    int i;
    int totalday=0;//定义并初始化总天数
    for(year=1990;year<a.year;year++)//利用年份的循环求出指定年份与1990年的天数累加和
    {
        if(runYear(year))//条件判断,当该年为闰年
        {
            totalday=totalday+366;//则总天数加上366天
        }
        else totalday=totalday+365;//否则总天数加上365天
        
    }
    if(runYear(a.year))//这里做到了修改二月的天数,如果为闰年,则2月份为29天
    {
        permonth[2]++;
    }
    for(i=0;i<a.month;i++)//把指定日期前的月份加起来,指定日期所在月份不足一个月,不能加,跳出循环
    {
        totalday+=permonth[i];
        
    }
    totalday+=a.day;//把指定日期不足一个月的天数,也加进总天数
    return totalday;//返回总天数的值,等待调用
}

int main()
{    
    Date today;//初始化一个名为today的结构体对象
    int totalday;
    int result;
    printf("请输入年月日,如1999 1 31\n");//提示用户输入,一定要有
    scanf("%d%d%d",&today.year,&today.month,&today.day);//结构体以圆点的形式访问地址
    totalday=coutday(today);//函数声明
    result=totalday%5;//三天打鱼两天晒网,则周期为5天,总天数对5求余,若结果为1,2,3则打鱼,
    if(result>0&&result<4)
    {
        printf("今天打鱼");
    }
    else printf("今天晒网");
    return 0;
}
五、收获
1:结构体来定义多个变量比较好操作;
2:从年,月,日逐层去剥的思路,先加年份,再加月份,再加日
3,找周期,求余数来判断打鱼还是晒网