Write a function called valid_date that takes three positive integer scalar inputs year, month, day. If these three represent a valid date, return a logical true, otherwise false. The name of the output argument is valid.

조회 수: 3 (최근 30일)
unction valid = valid_date(year,month,day)
if year < 1 || ~isscalar(year) || year ~= fix(year)
valid1 = false;
else
valid1 = true;
end
if month > 12 || month < 1 || ~isscalar(month) || month ~= fix(month)
valid2 = false;
else
valid2 = true;
end
if month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12
if day > 31 || day < 1 || ~isscalar(day) || day ~= fix(day)
valid3 = false;
valid4 = false;
valid5 = false;
valid6 = false;
else
valid3 = true;
valid4 = false;
valid5 = false;
valid6 = false;
end
end
if month == 2
if year/4 ~= fix(year/4) || ( year/100 == fix(year/100) && year/400 ~= fix(year/400) )
if day > 28 || day < 1 || ~isscalar(day) || day ~= fix(day)
valid4 = false;
valid3 = false;
valid5 = false;
valid6 = false;
else
valid4 = true;
valid3 = false;
valid5 = false;
valid6 = false;
end
else if day > 29 || day < 1 || ~isscalar(day) || day ~= fix(day)
valid5 = false;
valid3 = false;
valid4 = false;
valid6 = false;
else
valid5 = true;
valid3 = false;
valid4 = false;
valid6 = false;
end
end
end
if month == 4 || month == 6 || month == 9 || month == 11
if day > 30 || day < 1 || ~isscalar(day) || day ~= fix(day)
valid6 = false;
valid3 = false;
valid4 = false;
valid5 = false;
else
valid6 = true;
valid3 = false;
valid4 = false;
valid5 = false;
end
end
if valid1 == true && valid2 == true && ( valid3 == true || valid4 == true || valid5 == true || valid6 == true )
valid = true;
else
valid = false;
end
end
so i know this is not the best of solutions but i tried to not get anything online and just use what i know, so it works good except for detecting non scalar inputs, so when u give it a vector or a matrix it just gives an error and doesn't give the output false and i don't know why

답변 (1개)

Rik
Rik 2020년 9월 22일
You test everything at once. You can do that, but you need to pay attention to what is evaluated first:
%steps in evaluation:
[3 4]<0 || ~isscalar([3 4])
[false false] || ~isscalar([3 4])
##error##
%steps in evaluation:
~isscalar([3 4]) || [3 4]<0
true || [3 4]<0
true % the second condition is not tested, because || and && and short-circuit
  댓글 수: 4
Mohamed Amr
Mohamed Amr 2020년 9월 22일
Yea that is what i did to make it work, i put an if at the start of the function to check if everything is scalar with the rest of the function nested in it and an else end at the end of function but i just didn’t know what was wrong with this one since it seemed to be exactly like the one in the course except that it wasn’t, the order was different but i didn’t know that can affect it
Thanks alot for your help 😃
Rik
Rik 2020년 9월 23일
For bonus rigor you can also test if you have three input arguments with nargin.
Glad to be of help. If my answer solved your problem, please consider marking it as accepted answer. If not, feel free to comment with your remaining issues.

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Logical에 대해 자세히 알아보기

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by