Borrar filtros
Borrar filtros

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 visualizaciones (últimos 30 días)
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 comentarios
Steven Lord
Steven Lord el 4 de En. de 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.

Iniciar sesión para comentar.

Respuesta aceptada

Jan
Jan el 4 de En. de 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.

Más respuestas (0)

Categorías

Más información sobre Elementary Polygons en Help Center y File Exchange.

Etiquetas

Community Treasure Hunt

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

Start Hunting!

Translated by