关于C语言经典程序“打渔晒网”

关于C语言经典程序“打渔晒网”,第1张

楼主你好!!!俺仔细的看了一下程序代码,代码没有错误!!!凯或!

俺解释一下(就针对与楼主的问题)

1.for(i=1i<day.monthi++) 这个for()语句没有错误,这句确实只算了11个月的,但前面的term.day=31  给了补上!!!原因是无论那一年,1月和12月都是31天,所以楼主先把1月和12月的算在一起啦!!!这也正是楼主第二个疑问的所在!!!

如果楼棚拿主不信的话!!!可以把每一年的打印出啦,看看是不是365/366

要是少算一个月的话,那一定不是365/365

修改如下:

#include<stdio.h>

#include<iostream.h>

struct date

{

int year

int month

int day

}

int days(struct date day)

{

static int day_tab[2][13]=

{

{0,31,28,31,30,31,30,31,31,30,31,30,31,},  /*平均每月的天数*/

{0,31,29,31,30,31,30,31,31,30,31,30,31,},

}

int i,lp

lp=day.year%4==0&&day.year%100!=0||day.year%400==0

/*判定year为闰年还是平年,lp=0为平年,非0为闰年*/

for(i=1i<day.monthi++)            /*计算本年中自1月1日起的天数*/

day.day+=day_tab[lp][i]

cout<<day.day<<endl

return day.day

}

void main()

{

struct date today,term

int yearday,year,day

printf("Enter year/month/day:")

scanf("%d%d%d",&today.year,&today.month,&today.day)  /*输入日期*/

term.month=12               /*设置变量的初始值:月*/

term.day=31    链孙搭             /*设置变量的初始值:日*/

//注意这里哈

for(yearday=0,year=1990year<today.yearyear++)

{

term.year=year

yearday+=days(term)     /*计算从1990年至指定年的前一年共有多少天*/

}

yearday+=days(today)       /*加上指定年中到指定日期的天数*/

day=yearday%5               /*求余数*/

if(day>0&&day<4)

printf("he was fishing at that day.\n")   /*打印结果*/

else

printf("He was sleeping at that day.\n")

}

根据题意可以将解题过程分为三步:

1、计算从1990年1月1日开始至指定日期共有多少天;

2、由于“打鱼”和“晒网”的周期为5天,所以将计袜仿埋算出的天数用5去除;

3、根据余数判断他是告蚂在“打鱼”还是在大轮“晒网”;若  余数为1,2,3,则他是在“打鱼”;否则  是在“晒网”。

#include <stdio.h>

/*定义日期结构体*/

typedef struct date {

    int year

    int month

    int day

} DATE

/*判断是否为闰年,是返回1,否返回0*/

int isLeap (int year) {

    return ( (year%4==0 && year%100!=0) || (year%400==0) )

}

/*计算指定日期距离1990年1月1日的天数*/

int countDay (DATE currentDay) {

    int perMonth[13]={0,31,28,31,30,31,30,31,31,30,31,30}  /*每月天数数组*/

    int totalDay=0,year,i

    

    /*求出指定日期之前的每一年的天数累加和*/

    for(year=1990 year<currentDay.year year++) {

        if(isLeap(year))  /*判断是否为闰年*/

            totalDay=totalDay+366

        else

            totalDay=totalDay+365

    }

    /*如果为闰年,则二月份为29天*/

    if(isLeap(currentDay.year))

        perMonth[2]+=1

    /*将本年内的天数累加到totalDay中*/

    for(i=0 i<currentDay.month i++)

        totalDay+=perMonth[i]

    /*将本月内的天数累加到totalDay中*/

    totalDay+=currentDay.day

    /*返回totalDay*/

    return totalDay

}

int main(void) {

    DATE today  /*指定日期*/

    int totalDay  /*指定日期距离1990年1月1日的天数*/

    int result  /*totalDay对5取余的结果*/

    int error

    do { /*输入指定日期*/

     printf("Please input the year/month/day :\n")

   scanf("%d/%d/%d", &today.year, &today.month, &today.day)

   printf("\n")

   error=0

if(today.year<1990) /*判断日期格式是否正确*/                                           

{printf("The year should be larger than 1990!\n")error=1}

if(today.month<1||today.month>12)

{printf("The month input is error!\n")error=1}

if(today.day<0||today.day>31)  

{printf("The day input is error!\n")error=1}

printf ("======================================================\n\n")

    } while(error)

    totalDay=countDay(today)  /*求出指定日期距离1990年1月1日的天数*/

    /*天数%5,判断输出打鱼还是晒网*/

    result=totalDay%5

    if(result>0 && result<4)

        printf("fishing!\n")

    else

        printf("sleeping!\n")

    printf("\n")

    return 0

}

运行结果

1991/10/25,打渔

1992/10/25,晒网

日期输入错误


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12217103.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存