【Matlab学习】判断年份

编写函数题目要求:

编写一个valid_date函数,输入为(year,month,day)。如果这三个符合正确形式,则返回值vaildtrue,否则返回false。如果输入的不是正确的实数标量返回值也是false。
需要注意的是年份判断中需要区分闰年和非闰年。能被4整除,但是不能被100整除的年份是闰年,且能被400整除的也是闰年。例如:1900年能同时被4和100整除,故不是闰年。但是2000能被400整除故2000是闰年。闰年的2月有29天。需要正确的书写程序,写不用程序中自带的判断年份函数判断。

设计思路:

判断日期主要分为三部分,

  1. 格式以及范围判断,输入的年月日必须都是标量,不能是向量或者其他形式,且月份是1-12整数,日是1-31整数
  2. 月份和日期的判断。月份分为大小月,大月有31天,小月有30天。大月包括[1,3,5,7,8,10,12],小月包括[4,6,9,11]这里2月因为闰年的关系,需要单独拎出来判断年份。稍后会单独考虑。
  3. 闰年判断。能被4整除,但是不能被100整除的年份是闰年,且能被400整除的也是闰年。闰年的2月有29天,其余2月28年。
    根据以上的思路判断,使用if else语句编写函数,判断输入是否符合要求。

代码设计:

function valid = valid_date(year,month,day)
%判断日期是否正确,输入年月日,出入判断结果 true or false.
%前期准备条件,首先默认valid为true如果符合以下不符合条件的判断,则输出false
valid = true;
num=[1 3 5 7 8 10 12];
num2 =[4,6,9,11];
%分别判断年月日是否都是标量,大于0的正整数,月和日都有范围限制
if ~isscalar(year) || (year<=0) || fix(year)~=year
    valid = false;
    
elseif ~isscalar(month)|| month<=0||month>12||fix(month)~=month
    valid = false;
    
elseif ~isscalar(day) || day<=0||day>31||fix(day)~=day
    valid = false;
    % 月份和日期的判断,如果是大月分则day不能超过31,小月份day不能超过30
elseif sum(ismember(num,month))&& (day>=32)
    valid = false;
elseif sum(ismember(num2,month)) && (day>=31)
    valid = false;
    
    %判断闰年
    
elseif ((( rem(year,100)~= 0 && rem(year,4) == 0 )|| (rem(year,100) == 0 && rem(year,400) == 0)))&& month == 2
    if day>=30
        valid = false;
    end
elseif month == 2
    if day>=29
        valid = false;
    end
end
end

可以随机输入年月日判断函数是否正确。
valid = valid_date(2018,4,1)
valid = valid_date(2018,4,31)
结果如下图所示:
在这里插入图片描述

官方答案:

以上是笔者自己写的代码,大家在学习的时候多练练就会熟悉了。也有标准答案,下面我把官方给的标准答案po出来,大家也可以学习一下。代码设计其实有很多种,就看哪种方法最简洁最方便,多学习多思考,提高代码的可读性和简约性。

function isvalid = valid_date(y, m, d)
   % Check if the inputs are valid 
   % Check that they are scalars
   if ~(isscalar(y) && isscalar(m) && isscalar(d))
       isvalid = false;
   % Check that inputs are positive
   elseif ~all([y, m, d] > 0)
       isvalid = false;
   % Check that inputs are integers (not the data type)    
   elseif any(rem([y, m, d], 1))
       isvalid = false;
   % Check that m and d are below the max possible
   elseif (m > 12) || (d > 31)
       isvalid = false;
   % The inputs could be a valid date, let's see if they actually are
   else
       % Vector of the number of days for each month
       daysInMonth = [31 28 31 30 31 30 31 31 30 31 30 31];
       % If leap year, change days in Feb
       if isequal(rem(y, 4), 0) && (~isequal(rem(y, 100), 0) || isequal(rem(y, 400), 0))
            daysInMonth(2) = 29;
       end
       maxDay = daysInMonth(m);
       if d > maxDay
           isvalid = false;
       else
           isvalid = true;
       end
       
   end
end

如果有什么疑问,欢迎大家留言交流。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值