Clear Filters
Clear Filters

2. Write a function called year2016 that returns a row-vector of struct-s whose elements correspond to the days of a month in 2016 as specified by the input argument. If the input is not an integer between 1 and 12, the function returns the empty arr

2 views (last 30 days)
Please explain to me why this code will not work.
function[d] = year2016(m)
if m<1 || m>12 || ~isscalar(m)|| m~=fix(m)
d = [];
else days = datenum([2016,m,1]):datenum([2016,m+1,1])-1;
date = 1 + mod(days-3,7);
month = {'January', 'february','March', 'April', 'May', 'June', 'July','August', 'September','October', 'November', 'December'};
day = {'Mon', 'Tue', 'Wed','Thu', 'Fri','Sat'};
x = day(date);
y = num2cell(1:numel(days));
z = month(m);
d = struct('day',x, 'date',y,'month',z);
end
  9 Comments
Steven Lord
Steven Lord on 4 Jan 2019
In this case, order matters due to the short circuiting behavior of the || operator.
m = [1 2];
This section of code will error. The expression "m < 1" returns a vector not a scalar, and the || operator requires the two values with which it's computing to be scalar.
if m < 1 || ~isscalar(m)
disp('wrong!')
end
This section of code will work and will display 'wrong!'. The expression "~isscalar(m)" returns true, which is a logical scalar value. Since "true or <something else>" is true, MATLAB doesn't need to evaluate the second part of the expression. Therefore the fact that "m < 1" would have returned a non-scalar when evaluated doesn't matter. It doesn't get that far.
if ~isscalar(m) || m < 1
disp('wrong!')
end
If m were a scalar, "~isscalar(m)" would be false. Now MATLAB isn't sure whether the expression should be true or false based solely on the first expression's value, so it has to continue on to the second expression. But now we're guaranteed that "m < 1" returns a scalar which || can handle.

Sign in to comment.

Accepted Answer

Jan
Jan on 4 Jan 2019
If m is not a scalar, the comparison:
if m<1 || m>12 ...
fails, because the || operator can be applied to scalars only. Move the check for scalar inputs to the front:
if ~isscalar(m) || m<1 || m>12 || m~=fix(m)
Now the first condition is true for a non-scalar input already and the rest of the condition is not evaluated anymore.

More Answers (0)

Categories

Find more on Elementary Polygons 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!