To check Scalar or Not
45 views (last 30 days)
Show older comments
Rakeshwar Elango
on 29 Jun 2019
Commented: Walter Roberson
on 18 Jul 2021
I have debugged the code and now the Scalar test for this code is failing although I have given a provition in the 3rd line of the code to check wheather the given inputs are scalar or not.
please help!
function valid = valid_date(year,month,day)
if nargin==3
if fix(month) && isscalar(month) && fix(day) && isscalar(day) && fix(year) && isscalar(year) && isscalar(valid_date) && year>0 && month>0 && day>0
if mod(year,4)==0&&mod(year,100)~=0 || mod(year,400)==0&&mod(year,100)==0
if ismember(month,[1,3,5,7,8,10,12]) && ismember(day,[1:31])
valid=true;
elseif month==2 && ismember(day,[1:29])
valid=true;
elseif ismember(month,[4,6,9,11]) && ismember(day,[1:30])
valid=true;
else
valid=false;
end
else
if ismember(month,[1,3,5,7,8,10,12]) && ismember(day,[1:31])
valid=true;
elseif ismember(month,[4,6,9,11]) && ismember(day,[1:30])
valid=true;
elseif month==2 && ismember(day,[1:28])
valid=true;
else
valid=false;
end
end
else
valid=false;
end
else
valid=false;
end
Assessment result: correctVarious inputs
Assessment result: incorrectNon-scalar
Return false if an input is not scalar...
Assessment result: correctThe last day of every month
Assessment result: correctRandom leap years
Assessment result: correctRandom non-leap years
Assessment result: correctRandom dates
6 Comments
Sunney Kumar
on 12 Jun 2020
Edited: Sunney Kumar
on 12 Jun 2020
funtion valid = valid_date(year, month, day)
[i, j] = size(year);
[k, l] = size(month);
[o, p] = size(day);
if (i == 1 && j ~= 1) || (k == 1 && l ~= 1) || (o == 1 && p ~= 1)
valid = false
else
%rest of the code
end
Try this piece of code to find out about whether input is scalar or not.
Hakan Karapinar
on 17 Jun 2020
if (~isscalar(year) || year < 1 || year ~= fix(year) ) || (~isscalar(month) || month < 1 || month ~= fix(month) ) || (~isscalar(day) || day < 1 || day ~= fix(day) )
valid = false
return ;
check my code out bro.we take same course.:D its worked i passed week 6
Accepted Answer
Stephen23
on 29 Jun 2019
Edited: Stephen23
on 29 Jun 2019
The reason is likely because of the order you check the inputs with, e.g.:
fix(month) && isscalar(month)
%^^^^^^^^^ what is this supposed to test for?
% ^^^^^^^^^^^^^^ this must be tested first!
If month is non-scalar, then fix(month) will return a non-scalar value, and then this will throw an error because && does not accept non-scalar input values. If you test isscalar first, then for a non-scalar month it will return false (i.e. a scalar!) and then MATLAB does not evaluate anything that follows the &&. Read the documentation to know more:
Note that it is unclear what your fix(...) code is supposed to achieve, but I doubt that it does anything very useful. In any case, the order should be like this:
isscalar(month) && ??? you need to decide what to put here
0 Comments
More Answers (1)
iitm_pnkj
on 18 Jul 2021
function valid = valid_date(year, month, day)
m31 = [1 3 5 7 8 10 12];
m30 = [4 6 9 11];
if isscalar(year) == 1 && isscalar(month) == 1 && isscalar(day) == 1 && year > 0 && month > 0 && day > 0
if (mod(year,100) == 0 || mod(year,4) ~= 0) && month == 2 && day <=28
valid = true;
elseif ((mod(year,100) ~= 0 && mod(year,4) == 0) || (mod(year,400) == 0)) && month == 2 && day <= 29
valid = true;
elseif day <= 31 && any(m31(:)== month) == 1
valid = true;
elseif day <= 30 && any(m30(:)== month) == 1
valid = true;
else
valid = false;
end
else
valid = false;
end
end
1 Comment
Walter Roberson
on 18 Jul 2021
All those == 1 are unneeded. isscalar() already returns false or true.
The comparisons to 0 are valid, though.
See Also
Categories
Find more on Dates and Time in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!