Ejercicio 8, práctico 3

Ejercicio 8, práctico 3

de Nicolás Gustavo Leites Silveira -
Número de respuestas: 3

Hola, buenas tardes

Estamos intentando hacer el ejercicio 8 y no sabemos porque nuestra solución da error en octave

Adjunto código:

E='ELADIO';

D='DIESTE';

v=zeros(1,100);

for i=1:100

       if mod(i,3)==0

         v(i)='E';

      elseif mod(i,5)==0

          v(i)='D';

      else

           v(i)=i;

      endif

endfor


Gracias, saludos

En respuesta a Nicolás Gustavo Leites Silveira

Re: Ejercicio 8, práctico 3

de Eduardo Fernandez -

Hola Nicolás, 

Te da error? Lo ejecuto y funciona, no da mensaje de error. 

Lo que ocurre es que no funciona como pide la letra. 

Veo dos problemas:
1) Generas un vector V y a ese vector le pones números o letras alternadamente. Eso no es posible en Octave con vectores normales. Las letras las transforma en números (por el código ASCII de cada letra). La idea sería que vayas desplegando en pantalla los números o los textos 'ELADIO' y 'DIESTE' según corresponda, no que armes un vector y luego despliegues todo junto. Usá el comando disp() para ello.

2) La secuencia de if, elseif no es correcta, porque un número puede ser múltiplo de 3 y de 5 a la vez (15, 30, ... por ejemplo) y en tu código cuando entra por múltiplo de 3 no va a entrar por múltiplo de 5, por usar elseif. La solución pasaría por hacer if ... endif if .... endif ... para contemplar cada caso de forma independiente (múltiplo de 3, múltiplo de 5, múltiplo de ninguno).

Creo que con estos comentarios podrás estar más cerca de resolverlo.

Eduardo

 

En respuesta a Eduardo Fernandez

Re: Ejercicio 8, práctico 3

de Maria Constanza Oñate Villar -
buenas, intente tambien este ejercicio con el siguiente codigo y me da error, pero no veo donde estoy haciendo mal. Gracias.

for n= 1:100
if mod(n,3)==0 & mod(n,5)==0
y= "ELADIO DIESTE";
elseif mod(n,3)==0 & mod(n,5)~=0
y= "ELADIO";
elseif mod(n,3)~=0 & mod(n,5)==0
y= "DIESTE";
else
y= n;
endif
disp(y)
endfor

Tambien lo intente con este otro codigo, pero tambien me da error:
v=[1:100]
y=[];
for i= 1:100
  if mod(v(i),3)==0 & mod(v(i),5)==0
    y= [y,"ELADIO DIESTE"];
  elseif mod(v(i),3)==0 & mod(v(i),5)~=0
    y= [y,"ELADIO"];
  elseif mod(v(i),3)~=0 & mod(v(i),5)==0
    y= y=[y,"DIESTE"];
  else
    y= [y,v(i)];
  endif
  disp(y)
endfor


En respuesta a Maria Constanza Oñate Villar

Re: Ejercicio 8, práctico 3

de Eduardo Fernandez -

Hola,

Antes que nada, estaría bueno que digan exactamente cuál es el error, así no nos obliga a ejecutar el código para ver qué ocurrió. 

Luego de ejecutarlo veo que no me da error, me da un warning (es un aviso, un "prestá atención a esto que te digo"). No significa que haya algo mal. 

El warning que te da dice: "warning: Matlab-style short-circuit operation performed for operator &". Eso significa que te avisa que en el if, o en el elseif el & va a funcionar como &&. Esto está definido así para Octave y ante eso podés hacer dos cosas, o configurar Octave para que ese warning no te aparezca más, o sustituir todos los & por &&, y los | por || (si los hubiese), así no aparece el warning para avisarte de lo que va a hacer.

Entonces, si hacés ese cambio (& por &&) te desaparecerán los warnings.

Si por el contrario, no querés cambiar el código y querés configurar Octave para que ese warning no aparezca más, poné en la ventana de comandos: 

>> warning("off", "Octave:possible-matlab-short-circuit-operator") 

A mi me funcionó.

Espero que esto aclare tus dudas. 
Lo más importante de todo lo que escribí es que no es lo mismo un warning que un error. Atención para la próxima.  

saludos atentos,

Eduardo