编写函数题目要求:
编写一个valid_date函数,输入为(year,month,day)。如果这三个符合正确形式,则返回值vaild为true,否则返回false。如果输入的不是正确的实数标量返回值也是false。
需要注意的是年份判断中需要区分闰年和非闰年。能被4整除,但是不能被100整除的年份是闰年,且能被400整除的也是闰年。例如:1900年能同时被4和100整除,故不是闰年。但是2000能被400整除故2000是闰年。闰年的2月有29天。需要正确的书写程序,写不用程序中自带的判断年份函数判断。
设计思路:
判断日期主要分为三部分,
- 格式以及范围判断,输入的年月日必须都是标量,不能是向量或者其他形式,且月份是1-12的整数,日是1-31的整数。
- 月份和日期的判断。月份分为大小月,大月有31天,小月有30天。大月包括[1,3,5,7,8,10,12],小月包括[4,6,9,11]这里2月因为闰年的关系,需要单独拎出来判断年份。稍后会单独考虑。
- 闰年判断。能被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
如果有什么疑问,欢迎大家留言交流。