Rincón Matemático

Disciplinas relacionadas y temas generales => Computación e Informática => Mensaje iniciado por: Trapezoide en 15 Marzo, 2014, 11:35 am

Título: Par/Impar Matlab
Publicado por: Trapezoide en 15 Marzo, 2014, 11:35 am
Hola,

Tengo una duda con este algoritmo de Matlab para comprobar si un número es par o impar.


N=input('Introduce un numero para comprobar si es par\n');
contador=0;
resto=rem(N,2);
if resto==0
    contador=1;
end

if contador==1
    disp('El numero que has introducido es par');
else
    disp('El numero que has introducido es impar');
end



¿Para qué sirve "\n" que está al final de N=input('Introduce un numero para comprobar si es par\n')?
¿Para qué se utiliza ";" al final de las sentencias?
¿Para el resto de división entera se usa siempre el comando "rem" o también "mod"?
¿Cómo se hace para que al ejecutar el algoritmo éste vuelva a dar la opción de introducir número automáticamente?
Título: Re: Par/Impar Matlab
Publicado por: argentinator en 15 Marzo, 2014, 12:05 pm
¿Para qué sirve "\n" que está al final de N=input('Introduce un numero para comprobar si es par\n')?

Equivale a un "caracter salto de línea".
Es uno de los caracteres no imprimibles reconocidos por muchos lenguajes o entornos de programación.
Tienen su origen en el lenguaje C.
Matlab copia muchas cosas del lenguaje C, aunque la sintaxis de las estructuras de control y funciones es diferente.


Citar
¿Para qué se utiliza ";" al final de las sentencias?

Es una regla de sintaxis del lenguaje "MatLab".
Cuando hay varias sentencias, sirve para marcar el fin de cada instrucción.
A veces evita confusiones.
Y a veces puede servir, posiblemente, como "punto de secuencia" (terminar las operaciones pendientes en memoria antes del ; antes de seguir con las demás acciones).

Citar
¿Para el resto de división entera se usa siempre el comando "rem" o también "mod"?

La función REM() funciona mejor al estilo de la operación de cálculo de restos de algunos lenguajes de programación, que no coincide con el módulo en sentido matemático.
En cambio MOD() se utiliza en el mismo sentido que el "módulo" en sentido de "relaciones de congruencia" de la matemática.

Para números positivos ambas dan el mismo resultado.
Las diferencias se notan con números negativos.
Tendrías que experimentar con algunos ejemplos para entender lo que está ocurriendo.

Ahora no tengo instalado Matlab, pero entiendo que MOD() debiera dar siempre valores no negativos, entre 0 y el divisor.

Citar
¿Cómo se hace para que al ejecutar el algoritmo éste vuelva a dar la opción de introducir número automáticamente?

Tendrías que encerrar todo el programa en una estructura de control "while", que produce repeticiones mientras se cumple alguna condición.

while(true)
    // Todo tu programa
end

El problema es que ahora con eso se repetirá "para siempre".
Lo puedes cortar con Control C,
o bien poner en la condición de control de "while" una condición más elaborada.

Esto es parte de otra discusión.
Título: Re: Par/Impar Matlab
Publicado por: elcristo en 15 Marzo, 2014, 12:09 pm
Hola.

\n es salto de línea. Es como se pone el "intro" en el texto en matlab.

Si no pones ; lo que hace el programa al pasar por ese punto es escribirlo. Por ejemplo, si quitases los ; al ejecutarlo te aparecería:
Mensaje de inicio
contador
0
resto
Lo que salga.
Si es 0:
contador
1
Mensaje de salida.

Poniendo los ; evitas que aparezca "contador", "resto", "contador".


rem y mod son muy parecidos, la diferencia es que rem mantiene el signo de la división mientras que mod pone el signo del divisor. Con mod siempre te saldrán números positivos porque divides entre "2", con rem depende de N si es positivo o negativo. Pero para este programa en concreto te da igual usar uno que otro.


Que se ejecute automáticamente no sería una buena idea, porque no podrías pararlo. Estarías hasta que tú o el ordenador os aburráis de ver si un número es par o impar, y créeme, tú te cansarás antes que él.
Si lo que quieres es ejecutarlo más veces, llámalo de nuevo.

Saludos.
Título: Re: Par/Impar Matlab
Publicado por: argentinator en 15 Marzo, 2014, 12:13 pm
Es verdad.

Había olvidado que en MatLab el ; tiene un sentido distinto,
que es como apuntó elcristo.

MatLab genera un "eco" a la consola de cada sentencia que ejecuta.
Si uno quiere evitar este "eco", agrega un ; al final de la instrucción.
Esto conviene porque la mayor parte de la información que va generando el programa no necesitamos saberla,
y además enviar información a pantalla consume muchos más recursos de la máquina que los meros cálculos.
En programas complicados se nota la diferencia.

Por otro lado, si el programa no funciona bien, y uno quiere depurarlo, visualizando los cálculos intermedios,
basta quitar el ; al final de una sentencia, y listo.

Un saludo.
Título: Re: Par/Impar Matlab
Publicado por: argentinator en 15 Marzo, 2014, 12:14 pm
http://nf.nci.org.au/facilities/software/Matlab/techdoc/ref/mod.html (http://nf.nci.org.au/facilities/software/Matlab/techdoc/ref/mod.html)
Título: Re: Par/Impar Matlab
Publicado por: Trapezoide en 15 Marzo, 2014, 12:33 pm
Muchas gracias argentinator y elcristo.

Con "al ejecutar el algoritmo éste vuelva a dar la opción de introducir número automáticamente" me refería a:
1-Le das un número al algoritmo para que compruebe si es par o impar.
2-Al pulsar la tecla intro y ejecutarlo, el programa no sólo te da la solución, sino que escribe otra línea además de esa con otra frase: 'Introduce numero para comprobar si es par o impar'). Ya ha sido ejecutado, pero ahora le introduces otro número y te vuelve a dar la solución con la opción de insertar un número nuevo. No sé si me explico.

Al nivel que tenemos ahora mismo en programación (par/impar ;D) como para utilizar bucles infinitos.

Que se ejecute automáticamente no sería una buena idea, porque no podrías pararlo. Estarías hasta que tú o el ordenador os aburráis de ver si un número es par o impar, y créeme, tú te cansarás antes que él.

Con esto he soltado una carcajada, me ha hecho mucha gracia.
Título: Re: Par/Impar Matlab
Publicado por: argentinator en 15 Marzo, 2014, 01:07 pm
Si no es con un while, entonces no sé qué es lo que estás tratando de hacer.
Para repetir tareas se usa el while, o bien el for (si sabes exactamente cuántas veces se repetirá la tarea).
Título: Re: Par/Impar Matlab
Publicado por: elcristo en 15 Marzo, 2014, 01:09 pm
A ver si entiendo lo que quieres.
¿Quieres que el algoritmo lo que haga es decirte si un número es par o impar y después de decírtelo quieres que te dé la opción de escoger si quieres introducir otro número para decirte si es par o impar?

Vamos, que quieres un esclavo calculador de pares.

Lo que puedes hacer es introducir una condición al final.
Es decir, cuando termine, después del último end, pones otro input, que diga, '¿Quieres introducir otro número? Si es sí, escribe 1, si no, escribe 0'. Entonces tu pones 1 o 0, si escribes 1, mediante un if, llamas nuevamente al algoritmo y si escribes 0 pues no pasa nada.
Título: Re: Par/Impar Matlab
Publicado por: Trapezoide en 16 Marzo, 2014, 12:03 am
Hola,

Me ha costado pero al final lo he conseguido. En realidad se puede decir que lo único nuevo es el bucle for i=0:50, como ha dicho argentinator.

clear
clc

N=input('Introduce un número para comprobar si es par\n');
contador=0;
resto=mod(N,2);
if resto==0
    contador=1;
end

if contador==1
    disp('El número que has introducido es par');
else
    disp('El numero que has introducido es impar');
end
for i=0:50
N=input('¿Deseas introducir otro número?');
contador=0;
resto=mod(N,2);
if resto==0
    contador=1;
end

if contador==1
    disp('El numero que has introducido es par');
else
    disp('El numero que has introducido es impar');
end
end


Lo que puedes hacer es introducir una condición al final.
Es decir, cuando termine, después del último end, pones otro input, que diga, '¿Quieres introducir otro número? Si es sí, escribe 1, si no, escribe 0'. Entonces tu pones 1 o 0, si escribes 1, mediante un if, llamas nuevamente al algoritmo y si escribes 0 pues no pasa nada. 

Con el bucle if no he conseguido sacarlo, en parte también porque no quería tener que escribir 0 o 1, sino poder insertar número tras número más "rápidamente".

Vamos, que quieres un esclavo calculador de pares.
WTF!

De nuevo, muchas gracias.

Un saludo
Título: Re: Par/Impar Matlab
Publicado por: elcristo en 16 Marzo, 2014, 12:27 am
Bueno, si esto es lo que quieres, entonces bien. Por si lo necesitas para otro caso:

function [x ] = parnopar(N)
N=N;
contador=0;
resto=mod(N,2);
if resto==0
    contador=1;
end

if contador==1
    x='El número que has introducido es par';
else
    x='El numero que has introducido es impar';
end

S=input('¿Desea introducir otro número? Si-1, No-0');
if S == 1
    [x ]=parnopar(N);
end


Si no estoy errado, creas esa función, y cuando lo ejecutes automáticamente debería estar pidiéndote números hasta que escribas 0 al final.

Saludos.
Título: Re: Par/Impar Matlab
Publicado por: Trapezoide en 16 Marzo, 2014, 12:42 am
El programa me dice: "Assignment to 'N' might be unnecessary" y no me deja ejecutarlo.

Pero con lo que me has explicado ya veo cómo se realizaría el ejercicio.
Título: Re: Par/Impar Matlab
Publicado por: Trapezoide en 16 Marzo, 2014, 08:11 pm
Hola,

He visto la manera de hacerlo sin tener que limitar el número de veces que se ejecuta el algoritmo con un bucle finito for i=0:50 (o escribiendo un número muy grande en lugar de 50), y es usando el comando while (bucle infinito), como también había dicho argentinator.

clear
clc

N=input('Introduce un número para comprobar si es par o impar\n');
contador=0;
resto=mod(N,2);
if resto==0
    contador=1;
end

if contador==1
    disp('El número que has introducido es PAR');
else
    disp('El numero que has introducido es IMPAR');
end

k=1;
while k==1
    N=input('Introduce un número para comprobar si es par o impar\n');
contador=0;
resto=mod(N,2);
if resto==0
    contador=1;
end

if contador==1
    disp('El numero que has introducido es PAR');
else
    disp('El numero que has introducido es IMPAR');
end
end


Con este mismo while he conseguido hacerlo como me decía elcristo, esta vez dando la opción de seguir ejecutando el programa si tecleas 1 o pararlo si tecleas 0.

clear
clc

N=input('Introduce un número para comprobar si es par o impar\n');
contador=0;
resto=mod(N,2);
if resto==0
    contador=1;
end

if contador==1
    disp('El número que has introducido es PAR');
else
    disp('El numero que has introducido es IMPAR');
end

k=input('¿Deseas introducir otro número? SÍ=Teclea 1, NO=Teclea 0\n');
while k==1
    N=input('Introduce un número para comprobar si es par o impar\n');
contador=0;
resto=mod(N,2);
if resto==0
    contador=1;
end

if contador==1
    disp('El numero que has introducido es PAR');
else
    disp('El numero que has introducido es IMPAR');
end
k=input('¿Deseas introducir otro número? SÍ=Teclea 1, NO=Teclea 0\n');
end
for k=0
    clc
    disp('Elige otro algoritmo')
end


Saludos.