三天打鱼两天晒网判断C语言

一、题目名称:“三天打鱼两天晒网
二、题目内容:中国有句俗语叫“三天打鱼两天晒网”。某人从2010年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。用C或C++语言/java/python实现程序解决问题。
三、算法设计:
1.输入当前日期的年、月、日。
2.检验当前日期是否合法。
3.从2010年开始累加计算天数
3.1若当前年份小于输入年份
3.1.1若当前年份为闰年,则在daylist[1][i]将每月的天数累加
3.1.2若当前年份不是闰年,则在daylist[0][i]中将每月的天数相
4.再加上输入日期年份的总天数
5.将总天数对5取模,得到余数
6.若余数为1、2、3时,则当天打鱼,否则为晒网。
图 1 主函数算法流程图
在这里插入图片描述
图 2 days()函数算法流程图
在这里插入图片描述
四、测试结果:
在这里插入图片描述
输出结果正常。
源代码:

#include<stdio.h>
typedef struct date{          //定义日期的结构体     
    int year;
    int month;
    int day;
}Date;
int days(Date day)    //计算输入对象的该年的天数
{
   int daylist[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=1;i<day.month;i++)            //计算本年中自1月1日起的天数
        day.day+=daylist[lp][i];
    return day.day;
}

void main()
{
    Date today,temp;
    int allday,year,day;
    loop:printf("请输入日期,中间用空格隔开(如2010 1 1):");
    scanf("%d %d %d",&today.year,&today.month,&today.day);  //输入日期
 if(today.year>=2010&&today.month<13&&today.day<32 )//判断日期是否合法
 {
  if(today.month>0&&today.day>0)
  {
  temp.month=12;               //设置变量的初始值
        temp.day=31;                 
        for(allday=0,year=2010;year<today.year;year++)
  {
           temp.year=year;
           allday+=days(temp);     //计算从2010年至指定年共有多少天
  }
        allday+=days(today);       //加上指定年中到指定日期的天数
        day=allday%5;               //求余数进行判断
        if(day>0&&day<4)
   printf("他今天打渔!\n");   //输出结果
        else
   printf("他今天晒网!\n");
  }
 }
 else
 {
  printf("\n输入错误,请输入合法的日期!\n");
  goto loop;
 }
}

六、总结1. 在检测日期合法性的时候出现了一些问题,开始我使用if(today.year>=2010&&0<=today.month<13&&0<=today.day<32 )判断日期的合法性,但我发现它判断只要today.year合法,即使today.month和today.day不合法也会输出结果,并不弹出错误信息。如下图:
然后我用if 语句分两次判断解决了这个问题。if(today.year>=2010&&today.month<13&&today.day<32 )if(today.month>0&&today.day>0)
2. 一开始我想在输出错误信息的时候继续运行程序,想用goto语句跳转到开始的输入语句但这样做了以后发现程序进入了死循环,最后把程序整体检查了一遍,然后就好了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值