Effacer les filtres
Effacer les filtres

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 vues (au cours des 30 derniers jours)
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 commentaires
Emma Sellers
Emma Sellers le 4 Jan 2019
The full question listed in the HW is posted above, underneath my code
Steven Lord
Steven Lord le 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.

Connectez-vous pour commenter.

Réponse acceptée

Jan
Jan le 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.

Plus de réponses (0)

Catégories

En savoir plus sur Elementary Polygons dans Help Center et File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by