informÁtica (matlab) programas resueltos€¦ · informÁtica (matlab) programas resueltos -hechos...

42
Victoria Prieto (Vicky) INFORMÁTICA (MATLAB) Programas resueltos - Hechos en clase - Ejercicios resueltos - Programas de examen

Upload: others

Post on 18-Oct-2020

24 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: INFORMÁTICA (MATLAB) Programas resueltos€¦ · INFORMÁTICA (MATLAB) Programas resueltos -Hechos en clase -Ejercicios resueltos -Programas de examen . En este “libro” encontraréis

Victoria Prieto (Vicky)

INFORMÁTICA (MATLAB)

Programas resueltos

- Hechos en clase

- Ejercicios resueltos

- Programas de examen

Page 2: INFORMÁTICA (MATLAB) Programas resueltos€¦ · INFORMÁTICA (MATLAB) Programas resueltos -Hechos en clase -Ejercicios resueltos -Programas de examen . En este “libro” encontraréis

En este “libro” encontraréis una colección de aproximadamente 80

programas resueltos en MATLAB.

Entre ellos se encuentran todos los programas resueltos en clase por

el profesor en el curso 2015/16, además de los ejercicios de boletín

propuestos y otros ejercicios adicionales de examen, organizados por

orden alfabético (tal y como los encontré en mi carpeta).

Todos estos programas son los que hice de cara al examen, espero que

os sirvan para aprobar.

-Vicky-

Page 3: INFORMÁTICA (MATLAB) Programas resueltos€¦ · INFORMÁTICA (MATLAB) Programas resueltos -Hechos en clase -Ejercicios resueltos -Programas de examen . En este “libro” encontraréis

ALGORITMO DE INSERCIÓN

% Algoritmo de inserción

function algoritmo_insercion

v=[2 5 6 9 11 13];

x=input('x= ');

v=inserta(v,x);

disp(v);

end

function v=inserta(v,x)

L=length(v);

i=1;

% Búsqueda del punto de inserción

while i<=L && x>v(i) % Mientras no me salga del vector y comparamos con

el valor de x cada valor del vector

i=i+1;

end

% Desplazamos componentes remanentes una posición hacia abajo. Empezamos

% por el últmo valor

j=L;

while j>=i

v(j+1)=v(j);

j=j-1;

end

v(i)=x;

end

ALGORITMO DE BÚSQUEDA

%Algoritmo de búsqueda

function algoritmos_busqueda

v=[5 7 9 -2 8 6];

x=input('x= ');

r=busqueda_lineal_todos(v,x);

%r=posicion del elemento buscado en el vector v. =0 si no lo encuentra

disp(r);

end

function r=busqueda_lineal(v,x)

L=length(v);

r=0;

for i=1:L

if v(i)==x

r=i;

end

end

end

%Esta función busca un determinado valor dentro de un vector; si lo

%encuentra, r tomará el valor de la posición en la que se halla dicho

valor

%dentro del vector. En caso contrario, r seguirá siendo 0.

Page 4: INFORMÁTICA (MATLAB) Programas resueltos€¦ · INFORMÁTICA (MATLAB) Programas resueltos -Hechos en clase -Ejercicios resueltos -Programas de examen . En este “libro” encontraréis

function r=busqueda_lineal_todos(v,x)

%Devuelve en r un ector con todas las posiciones donde haya coincidencia.

%r=1 si no hay ninguna

L=length(v);

r=[];%vector vacío inicialmente

cont=1;

for i=1:L

if v(i)==x

%r=[r i]; %añadimos una componente más al vector (esta sería una

%forma de hacerlo)

r(cont)=i;

cont=cont+1; %Segunda forma de hacerlo

end

end

end

ANAGRAMA

%Ejercicio 3.5: Identificación de anagramas

function anagrama(cad1,cad2)

r=identificaSimbolo(cad1,cad2);

if r==1

disp('Es un anagrama');

else

disp('No es un anagrama');

end

end

function [r]=identificaSimbolo(cad1,cad2)

N=length(cad1);

M=length(cad2);

i=1;

j=1;

r=0; %Suponemos inicialmente que no hay coincidencia alguna

for i=1:N

for j=1:M

if cad1(i)==cad2(j)

r=1;

end

end

end

end

ÁREA DEL CÍRCULO

%Cálculo del área círculo

function area_circulo

r=input('Radio del círculo: ');

a=area(r);

fprintf('El área es %f\n',a);

end

function A=area(radio)

Page 5: INFORMÁTICA (MATLAB) Programas resueltos€¦ · INFORMÁTICA (MATLAB) Programas resueltos -Hechos en clase -Ejercicios resueltos -Programas de examen . En este “libro” encontraréis

A=3.1415*radio*radio;

end

BUSCA-CADENA

%Ejercicio 3.6: Búsqueda de una cadena dentro de otra

function [pos]=busca_cadena(buscada,texto)

N=length(texto);

M=length(buscada);

r=0;

cont=0;

i=1;

pos=[];

while i<=N && r==0

k=i;

for j=1:M

if buscada(j)==texto(i)

cont=cont+1;

pos=[pos,i];

end

if cont==M

r=1;

else

pos=[];

end

i=k+1;

end

end

BÚSQUEDA

% Búsqueda binaria

function busqueda_algoritmo

v=[5 -2 0 3 7 9 9];

x=input('x= ');

r=busqueda_binaria(v,x);

%r=posicion del elemento buscado en el vector v. =0 si no lo encuentra

disp(r);

end

function r=busqueda_binaria(v,x)

%Suponemos vector v ordenado de menor a mayor

L=length(v);

i=1;

j=L;

while i<=j %mientras i sea menor que j, el vector puede seguir

dividiendose

m=fix((i+j)/2); %fix permite truncar

if v(m)==x

r=m; %La hemos encontrado

i=j+1; %Para forzar salida del bucle

elseif v(m)>x

j=m-1; %Nos quedamos con la mitad izquierda de v

elseif v(m)<x

Page 6: INFORMÁTICA (MATLAB) Programas resueltos€¦ · INFORMÁTICA (MATLAB) Programas resueltos -Hechos en clase -Ejercicios resueltos -Programas de examen . En este “libro” encontraréis

i=m+1; %Nos quedamos con la mitad derecha de v

end

end

end

%si hubiera varios elementos iguales dentro del vector, habría que

refinar

%la búsqueda moviéndose a izquierda y derecha hasta encontrar dichos

%elementos

BÚSQUEDA BINARIA

% Búsqueda binaria

function algoritmos_busqueda

v=[5 7 9 -2 8 6];

x=input('x= ');

r=busqueda_binaria(v,x);

%r=posicion del elemento buscado en el vector v. =0 si no lo encuentra

disp(r);

end

function busqueda_binaria(v,x)

%Suponemos vector v ordenado de menor a mayor

L=length(v);

i=1;

j=L;

while i<=j %mientras i sea menor que j, el vector puede seguir

dividiendose

m=fix((i+j)/2); %fix permite truncar

if v(m)==x

r=m; %La hemos encontrado

i=j+1; %Para forzar salida del bucle

elseif v(m)>x

j=m-1; %Nos quedamos con la mitad izquierda de v

elseif v(m)<x

i=m+1; %Nos quedamos con la mitad derecha de v

end

end

end

BÚSQUEDA N-NÚMERO ENTERO

% Ejericio 1.9: contar cuantas veces aparece n entre 1 y 100

function aparicion_cifran

n=input('Introduzca cifra buscada: ');

%Hallamos el número de cifras

N=input('Introduzca valor límite: ');

contador=0;

for i=1:N

c=cont_n(i,n);%función que cuenta cuántas veces aparece n en un

vector

contador=contador+c;

end

disp(contador);

end

Page 7: INFORMÁTICA (MATLAB) Programas resueltos€¦ · INFORMÁTICA (MATLAB) Programas resueltos -Hechos en clase -Ejercicios resueltos -Programas de examen . En este “libro” encontraréis

function c=cont_n(i,n)

v=zeros;

v=transf_vect(i); %Función que nos transforma el número i en un vector

N=length(v);

c=0;

for i=1:N

if n==v(i)

c=c+1;

end

end

end

function v=transf_vect(i)

m=10;

cont=1;

while fix(i/m)~=0

cont=cont+1;

m=m*10;

end

N=cont; %Dimensión del vector que queremos crear

m=(10^(N-1));

v=zeros;

j=0;

while m>=1

j=j+1;

if j<=N

v(j)=fix(i/m);

i=i-v(j)*m;

end

m=m/10;

end

end

CADENA GUIONES

%Función que, recibiendo una cadena de caracteres, recorre la cadena

%sustituyendo por guiones cada espacio en blanco

function rellenar_guiones

s=input('Cadena= ','s'); %se utiliza 's' para que pueda leer los

caracteres

re=rellena(s); %función que devuelve la cadena con guiones

fprintf('Cadena con guiones=%s\n',re); % el "%s" se usa para que devuelva

caracteres

end

function re=rellena(s)

N=length(s);

for i=1:N

if s(i)==32

re(i)=95;

else

re(i)=s(i);

end

end

end

Page 8: INFORMÁTICA (MATLAB) Programas resueltos€¦ · INFORMÁTICA (MATLAB) Programas resueltos -Hechos en clase -Ejercicios resueltos -Programas de examen . En este “libro” encontraréis

COMPARACIÓN ALGORITMOS

% comparación de tiempo de ejecución de dos algoritmos

N=1000;

% Algoritmo A: mostrar por pantalla número de 1 a N

for i=1:N %creamos el vector en el que cada componente coincide con su

posición

v(i)=i

end

for i=1:N

disp(v(i));

end

t1=toc;

%La complejidad del primero es mayor porque es como mínimo de 2N, pues

%hay realizar dos iteraciones

%Algoritmo B: Mostrar por pantalla número 1 a N

for i=1:N

disp (i);

end

t2=toc;

fprintf('Algoritmo A=%f seg\n', t1)

fprintf('Algoritmo B=%f seg\n', t2)

%La complejidad de este problema es mucho menor, tan solo tiene que

%realizar una iteración

COMPARACIÓN TRES VALORES

% Ejercicio 1.3: Determinar si hay valores iguales

a=input('Introduzca primer valor(a): ');

b=input('Introduzca segundo valor(b): ');

c=input('Introduzca tercer valor(c): ');

cont=0;

if a==b

cont=cont+1;

end

if a==c

cont=cont+1;

end

if b==c

cont=cont+1;

end

if cont>=2

disp('los tres son iguales');

elseif cont==1

disp('hay dos valores iguales');

elseif cont<1

disp('no hay valores iguales');

end

Page 9: INFORMÁTICA (MATLAB) Programas resueltos€¦ · INFORMÁTICA (MATLAB) Programas resueltos -Hechos en clase -Ejercicios resueltos -Programas de examen . En este “libro” encontraréis

CONTADOR DE EVENTOS (EJEMPLO VBLE. PERSISTENTE)

%Ejemplo de contador de eventos

function contador_eventos

for i=1:5 %llamadas consecutivas

c=contador; %contador no recibe parámetros

fprintf('llamada %d--c=%d\n',i,c);

end

end

function c=contador

persistent r;

if isempty(r); %si r no existe

r=0; %inicializamos r a cero

end

r=r+1;

c=r;

end

CONVERTIR A MAYÚSCULAS

% Pasar una cadena de caracteres a mayúsculas

function convertir_mayusculas

cad=input('Introduce cadena: ','s');

cadmay=mayusc(cad);

fprintf('Cadena en mayúsculas:%s\n',cadmay);

end

function cadmay=mayusc(cad);

N=length(cad);

for i=1:N

if cad(i)>='a'& cad(i)<='z'

cadmay(i)=cad(i)+'A'-'a';

else

cadmay(i)=cad(i);

end

end

end

CONTADOR DE PALABRAS

%Ejercicio 3.1: Cuenta el número de palabras en una frase

function [n]=cuenta_palabras(cad)

cad=input('Introduzca frase: ','s');

L=length(cad);

n=0;

for i=1:L

if cad(i)==' '

n=n+1;

end

end

n=n+1;

end

Page 10: INFORMÁTICA (MATLAB) Programas resueltos€¦ · INFORMÁTICA (MATLAB) Programas resueltos -Hechos en clase -Ejercicios resueltos -Programas de examen . En este “libro” encontraréis

DETERMINA TIPO DE TRIÁNGULO

%Ejercicio 2.8: Identificación del tipo de triángulo

function determina_triangulo

a=input('a= ');

b=input('b= ');

c=input('c= ');

%Comprobamos que es un triángulo

if (a+b)>c && (a+c)>b && (b+c)>a

%Comprobamos si es equilátero

if a==b && a==c

disp('Es un triángulo equilátero');

elseif a==b || a==c || b==c

disp('Es un triángulo isósceles');

else

disp('Es un triángulo escaleno');

end

else

disp('No es un triángulo');

end

end

DETERMINA SI ES PRIMO

% Determinar si un número es primo

n=input('Introduce n: ');

d=2;

while mod(n,d)~=0

d=d+1;

end

if d==n

disp('Es primo');

else

disp('No es primo');

end

ECUACIÓN DE SEGUNDO GRADO

% Ejercicio 1.4: Ecuación de segundo grado

a=input('Introduzca coeficiente a: ');

b=input('Introduzca coeficiente b: ');

c=input('Introduzca coeficiente c: ');

%calculamos el discriminante

d=b*b-4*a*c;

if d<0

disp('Soluciones complejas');

d=-d;

im=sqrt(d)/(2*a);

re=-b/(2*a);

fprintf('x1=%.2f\n+i*%.2f\n',re,im);

fprintf('x2=%.2f\n-i*%.2f\n',re,im);

else

x1=(-b+sqrt(d))/(2*a);

x2=(-b-sqrt(d))/(2*a);

Page 11: INFORMÁTICA (MATLAB) Programas resueltos€¦ · INFORMÁTICA (MATLAB) Programas resueltos -Hechos en clase -Ejercicios resueltos -Programas de examen . En este “libro” encontraréis

if x1==x2

disp('Solución doble');

fprintf('x=%.2f\n',x1);

elseif (x1==0 & x2==-0)|(x1==-0 & x2==0)

disp('Solución doble');

disp('x=0');

else

fprintf('x1=%.2f\n',x1);

fprintf('x2=%.2f\n',x2);

end

end

EJ. EULER I

% Integración numérica. Aproximación de integrales definidas por el

método de Euler

function ej_Euler_I

a=input('a= ');

b=input('b= ');

n=input('n= '); %Pedimos el número de intervalos

A=Euler_I(a,b,n);

disp(A);

end

%-----------------------------

function A=Euler_I(a,b,n)

a=0;

d=(b-a)/n;

A=0;

for k=0:n-1

A=A+d*f(a+d*k);

end

end

%----------------------------------

function y=f(x)

y=x^2;

end

%%%%Hacerlo también mediante el método de los trapecios

%%%%Hacer la combinación con la interpolación

EJ. EULER II (MÉTODO DE LOS TRAPECIOS)

% Integración numérica. Aproximación de integrales definidas por el

método de Euler con trapecios

function ej_Euler_II

a=input('a= ');

b=input('b= ');

n=input('n= '); %Pedimos el número de intervalos

A=Euler_I(a,b,n);

disp(A);

Page 12: INFORMÁTICA (MATLAB) Programas resueltos€¦ · INFORMÁTICA (MATLAB) Programas resueltos -Hechos en clase -Ejercicios resueltos -Programas de examen . En este “libro” encontraréis

end

%-----------------------------

function A=Euler_I(a,b,n)

a=0;

d=(b-a)/n;

A=0;

for k=0:n-1

A=A+d*(f(a+d*k)+f(a+(k+1)*d))/2;

end

end

%----------------------------------

function y=f(x)

y=x^2;

end

EJ. INTERPOLACIÓN

%Interpolación lineal

function ej_interpolacion

%Datos del problema

x=[0 1 2 3 4];

y=[-1 3 4 2 6];

%Pedimos punto a interpolar

xast=input('xast= ');

[yast,ok]=interpola(x,y,xast); %La variable ok nos dirá si ha sido o no

posible realizar la interpolación; si xast está fuera del intervalo no se

calculará yast

if ok==1 %Si se ha realizado la interpolación con éxito

fprintf('yast=%.2f\n',yast);

plot(x,y,'k',xast,yast,'r.');

else

disp('xast fuera de rango');

end

end

%------------------------------

function [yast,ok]=interpola(x,y,xast)

%Primero comprobamos que xast está dentro del intervalo. Como el rango

nos lo dan ordenado, solo habra que ver que esté entre x1 y x2

N=length(x); %Nro de parejas de valores x,y

if xast<x(1) || xast>x(N) % Si se sale del rango

ok=0;

yast=0;

else %Si xast está dentro del rango, interpolamos

ok=1;

%Buscar el intervalo donde está xast

i=1;

while x(i)<xast

i=i+1;

end

a=(y(i-1)-y(i))/(x(i-1)-x(i));

b=y(i)-x(i)*a;

Page 13: INFORMÁTICA (MATLAB) Programas resueltos€¦ · INFORMÁTICA (MATLAB) Programas resueltos -Hechos en clase -Ejercicios resueltos -Programas de examen . En este “libro” encontraréis

yast=a*xast+b;

end

end

EJ. MÍNIMOS CUADRADOS

%Ejemplo mínimos cuadrados

function ej_minimos_cuadrados

%Datos de ejemplo (aproximadamente sobre y=2*x+1)

x=[0 1 2 3 4 5];

y=[0.8 3.2 4.7 6.9 9.3 11.6];

%Calculamos coeficientes de regresión

[a,b]=min_cuad(x,y);

%Representación gráfica

plot(x,y,'k.',[x(1) X(N)],[a*x(1)+b,a*x(N)+b],'b')

end

%-----------------------------

function min_cuad(x,y)

N=length(x);

%Cálculo de sumatorios

sxk=0;

syk=0;

sxkyk=0;

sxk2=0;

for k=1:N

sxk=sxk+x(k);

syk=syk+y(k);

sxkyk=sxkyk+x(k)*y(k);

sxk2=sxk2+x(k)*x(k);

end

%Se calculan los coeficientes usando los sumatorios calculados y

aplicando las fórmulas correspondientes

a=(N*sxkyk-sxk*syk)/(N*sxk2-sxk*sxk);

b=(syk-a*sxk)/N;

end

EJEMPLO EDO

%Ejemplo ingtegración de EDOs:

%Problema: dx(t)/dt=-2*x(t); x(0)=1

function ejemplo_edo

tfinal=input('tfinal '); %Instante de tiempo en el que queremos finalizar

la simulación

h=input('h= ');

[t,x]= Euler_II(tfinal,h);%Deberá devolver dos vectores, el del tiempo y

el de x

plot(t,x); %Gráfica

end

%-----------------------

function [t,x]=Euler_II(tfinal,h)

%Condiciones iniciales

Page 14: INFORMÁTICA (MATLAB) Programas resueltos€¦ · INFORMÁTICA (MATLAB) Programas resueltos -Hechos en clase -Ejercicios resueltos -Programas de examen . En este “libro” encontraréis

t(1)=0; %Consideramos que el vector de tiempo comienza en 0

x(1)=1; %Condición inical en x(0), en MATLAB no podemos poner x(0) porque

no hay componente 0 de un vector

k=1;

while t(k)<tfinal

x(k+1)=x(k)+h*(-2*x(k));

t(k+1)=t(k)+h;

k=k+1;

end

end

EJEMPLO EDO PROYECTIL

%Ejemplo EDO Euler: proyectil que cae al suelo en vertical

%F=m*a

%-mg=m*(d^2x(t))/dt^2

%d^2x(t)/dt^2=-g

%x(0)=0

%dx(t)/dt)=vo=10 m/s en t=0

%Este problema no se puede plantear como el de la taza de café, ya que es

%de segundo orden, sino que habrá que plantearlo como un sistema de dos

%ecuaciones de primer orden

%----> dv(t)/dt=-g && dx(t)/dt=v(t)

%----> condiciones iniciales: x(0)=0; v(0)=vo;

%Ejemplo integración : proyectil que cae sin rozamiento

function ejemplo_edo_proyectil

tfinal=input('tfinal '); %Instante de tiempo en el que queremos finalizar

la simulación

h=input('h= ');

x=input('T0= ');

[t,T]= Euler_II(tfinal,h,T0);%Deberá devolver dos vectores, el del tiempo

y el de x

plot(t,T); %Gráfica

end

%-----------------------

function [t,x]=Euler_II(tfinal,h)

%Condiciones iniciales

t(1)=0; %Consideramos que el vector de tiempo comienza en 0

x(1)=0; %Condición inical en x(0), en MATLAB no podemos poner x(0) porque

no hay componente 0 de un vector

v(0)=10; %(m/s) Velocidad inicial

k=1;

flag=0;

while t(k)<tfinal

v(k+1)=v(k)+h*(-9.81)

x(k+1)=x(k)+h*(v(k));

t(k+1)=t(k)+h;

% Si queremos guardar tiempo hasta que T<40ºC

if flag == 1 && x(k)<=40

fprintf('T=40º en t=%f\n',t(k));

Page 15: INFORMÁTICA (MATLAB) Programas resueltos€¦ · INFORMÁTICA (MATLAB) Programas resueltos -Hechos en clase -Ejercicios resueltos -Programas de examen . En este “libro” encontraréis

flag = 0;

end

k=k+1;

end

EJEMPLO EDO TAZA DE CAFÉ

%Enfriamiento taza de café

%dT(t)/dt=ka(Ta-T(t))

%Condiciones iniciales: T(0)=60ºC Da igual ºC que K, se mide la

diferencia

%Ta=25ºC

function ejemplo_edo_taza_cafe

tfinal=input('tfinal '); %Instante de tiempo en el que queremos finalizar

la simulación

h=input('h= ');

T0=input('T0= ');

[t,T]= Euler_II(tfinal,h,T0);%Deberá devolver dos vectores, el del tiempo

y el de x

plot(t,T); %Gráfica

end

%-----------------------

function [t,x]=Euler_II(tfinal,h)

%Parámetros del problema

Ta=25; %Temperatura ambiente

ka=0.02; %Constante de transferencia de calor

%Condiciones iniciales

t(1)=0; %Consideramos que el vector de tiempo comienza en 0

x(1)=T0; %Condición inical en x(0), en MATLAB no podemos poner x(0)

porque no hay componente 0 de un vector

k=1;

flag=0;

while t(k)<tfinal

x(k+1)=x(k)+h*(ka*(Ta-x(k)));

t(k+1)=t(k)+h;

% Si queremos guardar tiempo hasta que T<40ºC

if flag == 1 && x(k)<=40

fprintf('T=40º en t=%f\n',t(k));

flag = 0;

end

k=k+1;

end

EJEMPLO EDO TIRO VERTICAL

%Ejemplo EDO Euler: proyectil que cae al suelo en vertical

%F=m*a

%-mg=m*(d^2x(t))/dt^2

%d^2x(t)/dt^2=-g

%x(0)=0

%dx(t)/dt)=vo=10 m/s en t=0

%Este problema no se puede plantear como el de la taza de café, ya que es

Page 16: INFORMÁTICA (MATLAB) Programas resueltos€¦ · INFORMÁTICA (MATLAB) Programas resueltos -Hechos en clase -Ejercicios resueltos -Programas de examen . En este “libro” encontraréis

%de segundo orden, sino que habrá que plantearlo como un sistema de dos

%ecuaciones de primer orden

%----> dv(t)/dt=-g && dx(t)/dt=v(t)

%----> condiciones iniciales: x(0)=0; v(0)=vo;

%Ejemplo integración : proyectil que cae sin rozamiento

function ejemplo_edo_tiro_vertical

tfinal=input('tfinal '); %Instante de tiempo en el que queremos finalizar

la simulación

h=input('h= ');

[t,x]= Euler_II(tfinal,h);%Deberá devolver dos vectores, el del tiempo y

el de x

plot(t,T); %Gráfica

end

%-----------------------

function [t,x]=Euler_II(tfinal,h)

%Condiciones iniciales

t(1)=0; %Consideramos que el vector de tiempo comienza en 0

x(1)=0; %Condición inical en x(0), en MATLAB no podemos poner x(0) porque

no hay componente 0 de un vector

v(0)=10; %(m/s) Velocidad inicial

k=1;

flag=0;

% while t(k)<tfinal

while x(k)>=0 %Si tenemos otras condiciones que nos hagan parar antes

v(k+1)=v(k)+h*(-9.81)

x(k+1)=x(k)+h*(v(k));

t(k+1)=t(k)+h;

k=k+1;

end

EJEMPLO EDO TIRO VERTICAL ROZAMIENTO

%Ejemplo EDO Euler: proyectil que cae al suelo en vertical con rozamiento

%F=m*a

%-mg=m*(d^2x(t))/dt^2

%d^2x(t)/dt^2=-g

%x(0)=0

%(dx(t)/dt)=vo=10 m/s en t=0

%Este problema no se puede plantear como el de la taza de café, ya que es

%de segundo orden, sino que habrá que plantearlo como un sistema de dos

%ecuaciones de primer orden

%----> dv(t)/dt=-g-kf/m*v(t)*|v(t)| && dx(t)/dt=v(t)

%----> condiciones iniciales: x(0)=0; v(0)=vo;

%Ejemplo integración : proyectil que cae sin rozamiento

function ejemplo_edo_tiro_vertical_rozamiento

Page 17: INFORMÁTICA (MATLAB) Programas resueltos€¦ · INFORMÁTICA (MATLAB) Programas resueltos -Hechos en clase -Ejercicios resueltos -Programas de examen . En este “libro” encontraréis

tfinal=input('tfinal '); %Instante de tiempo en el que queremos finalizar

la simulación

h=input('h= ');

[t,x]= Euler_II(tfinal,h);%Deberá devolver dos vectores, el del tiempo y

el de x

plot(t,T); %Gráfica

end

%-----------------------

function [t,x]=Euler_II(tfinal,h)

%Condiciones iniciales

t(1)=0; %Consideramos que el vector de tiempo comienza en 0

x(1)=0; %Condición inical en x(0), en MATLAB no podemos poner x(0) porque

no hay componente 0 de un vector

v(0)=10; %(m/s) Velocidad inicial

k=1;

flag=0;

% while t(k)<tfinal

while x(k)>=0 %Si tenemos otras condiciones que nos hagan parar antes

v(k+1)=v(k)+h*(-9.81-0.5/5*v(k)*abs(v(k))

x(k+1)=x(k)+h*(v(k));

t(k+1)=t(k)+h;

end

k=k+1;

end

EJEMPLO ORDENACIÓN BURBUJA

% 09/05/16

%Ordenación burbuja (Bubble sort)

%[4,-1,3,2], se comparan dos elementos y se ve si están en orden o no, en

%el ultimo caso, se reordena; se repite con todas las parejas posibles.

%Tras una primera pasada, el primer elemento coincidirá con el más

pequeño.

%Se hacen tantas pasadas -1 como elementos tenga el vector

%PASADA 1: n-1 comparaciones// PASADA 2: n-2 comparaciones// En cada

pasada

%realizamos una iteración menos

%Ordenación por el método de la burbuja

function ejemplo_ordenacion_burbuja

v=[4 -1 3 2];

v=ordena_burbuja(v);

disp(v);

end

function v=ordena_burbuja(v)

n=length(v);

i=1;

while i<=n-1 %Realizamos n-1 pasadas

for j-1:-1:i

if v(j)>v(j+1) %Si están fuera de orden

aux=v(j); %los intercambiamos

v(j)=v(j+1);

Page 18: INFORMÁTICA (MATLAB) Programas resueltos€¦ · INFORMÁTICA (MATLAB) Programas resueltos -Hechos en clase -Ejercicios resueltos -Programas de examen . En este “libro” encontraréis

v(j+)=aux;

end

end

i=i+1

end

EJEMPLO ORDENACIÓN BURBUJA II

% 09/05/16

%Ordenación burbuja (Bubble sort)

%[4,-1,3,2], se comparan dos elementos y se ve si están en orden o no, en

%el ultimo caso, se reordena; se repite con todas las parejas posibles.

%Tras una primera pasada, el primer elemento coincidirá con el más

pequeño.

%Se hacen tantas pasadas -1 como elementos tenga el vector

%PASADA 1: n-1 comparaciones// PASADA 2: n-2 comparaciones// En cada

pasada

%realizamos una iteración menos

%Ordenación por el método de la burbuja

function ejemplo_ordenacion_burbuja

%v=[4 -1 3 2];

v=randi([-10 10],1,10); %valores aleatorios para un vector de 10

componentes

v=ordena_burbuja(v);

disp(v);

end

function v=ordena_burbuja(v)

n=length(v);

i=1;

fin=1;%Reduce el número de iteraciones respecto al

ejemplo_ordenacion_burbuja

while i<=n-1 %Realizamos n-1 pasadas

fin=0; %Si se produce algún intercambio se volverá a poner en 1

for j=(n-1):-1:i

if v(j)>v(j+1) %Si están fuera de orden

aux=v(j); %los intercambiamos

v(j)=v(j+1);

v(j+1)=aux;

fin=1; % En caso de que haya un intercambio en la pasada nro

i,ponemos fin a 1

end

end

i=i+1;

end

end

EJEMPLO QUICKSORT

%09/05/16

%Quick sort

Page 19: INFORMÁTICA (MATLAB) Programas resueltos€¦ · INFORMÁTICA (MATLAB) Programas resueltos -Hechos en clase -Ejercicios resueltos -Programas de examen . En este “libro” encontraréis

%v=[2 5 3 6 -1 8 4]

%pivote=v((i+j)/2); se comparan los valores del vector con el pivote,

%intercambiando si sus valores no están en el orden correcto.

% ATENCIÓN: floor redondea al entero más pequequeño y fix tan solo

trunca,

% la diferencia se observa en números negativos

%Ordenación QuickSort

function ejemplo_Quicksort

v=[2 5 3 6 -1 8 4];

L=length(v);

v=quicksort(v,1,L);

disp(v);

end

function v=quicksort(v,inicio,fin) %Función recursiva que ordena vector v

entre componente inicio y fin

i=inicio;

j=fin;

pos_pivote=fix((i+j)/2);

pivote=v(pos_pivote);

while i<=j

% Buscamos componentes mayores que el pivote a su izquierda

while v(i)<pivote

i=i+1;

end

% Buscamos componentes menores que el pivote a su derecha

while v(j)>pivote

j=j-1;

end

%Intercambiamos componentes i y j

if i<=j

aux=v(i);

v(i)=v(j);

v(j)=aux;

i=i+1;

j=j-1;

end

end

if inicio<j %Si la mitad inferior mide 2 o más componentes

v=quicksort(v,inicio,j); %Ordeno mitad inferior del vector

end

if i<fin %Si la mitad superior mide 2 o más componentes

v=quicksort(v,i,fin); %Ordeno mitad superior del vector

end

end

ES PALINDROMO

%Ejercicio 3.2: Determina si una cadena es palíndromo

function [r]=es_palindromo(cad)

cad_esp=sinEspacios(cad);

cad_may=mayusculas(cad_esp);

N=length(cad_may);

i=0;

j=N+1;

Page 20: INFORMÁTICA (MATLAB) Programas resueltos€¦ · INFORMÁTICA (MATLAB) Programas resueltos -Hechos en clase -Ejercicios resueltos -Programas de examen . En este “libro” encontraréis

r=1;

while i<=j

i=i+1;

j=j-1;

if cad_may(i)~=cad_may(j);

r=0;

break

end

end

if r==1

disp('Es palíndromo');

else

disp('No es palíndromo');

end

end

function cad_esp=sinEspacios(cad)

N=length(cad);

k=0;

for i=1:N

if cad(i)~=' '

k=k+1;

cad_esp(k)=cad(i);

end

end

end

function cad_mayusc=mayusculas(cad)

N=length(cad);

for i=1:N

if cad(i)<='z' && cad(i)>='a'

cad_mayusc(i)=cad(i)+'A'-'a';

else

cad_mayusc(i)=cad(i);

end

end

end

ES PERFECTO

function [r]=esperfecto(n)

n=input('Introduzca n: ');

sum=0;

for i=1:n-1

if mod(n,i)==0

sum=sum+i;

end

end

if sum==n

r=1;

else

r=0;

end

end

Page 21: INFORMÁTICA (MATLAB) Programas resueltos€¦ · INFORMÁTICA (MATLAB) Programas resueltos -Hechos en clase -Ejercicios resueltos -Programas de examen . En este “libro” encontraréis

FACTORIAL N

% Ejercicio 1.11: Factorial de n

n=input('Introduzca número: ');

fact=1;

for i=1:n

fact=fact*i;

end

disp(fact);

FACTORIAL N (SIN FUNCIONES)

% Factorial de un número n (sin funciones)

producto=1;

factor=2;

n=input('n= ');

for factor=2:n

producto=producto*factor;

end

factorial=producto;

disp(factorial);

FIBONACCI(EJEMPLO VBLES. PERSISTENTES)

%Ejercicio2.7: Sucesión de Fibonacci con cálculo de enesima mediante

fórmula

function t=fib_pers(n1,n2)

n=1;

m=input('Final de la sucesión: ');

while n<=m

fprintf('%d\n',n);

n=enesima(m);

end

end

function n=enesima(m)

a=(1+sqrt(5))/2;

b=(1-sqrt(5))/2;

pota=pot(a,m);

potb=pot(b,m);

n=(1/sqrt(5))*(pota-potb);

end

function [r]=pot(x,m)

r=1;

for i=1:m

r=r*x;

end

disp(r)

end

Page 22: INFORMÁTICA (MATLAB) Programas resueltos€¦ · INFORMÁTICA (MATLAB) Programas resueltos -Hechos en clase -Ejercicios resueltos -Programas de examen . En este “libro” encontraréis

FIBONACCI (EJEMPLO I, SIN FUNCIONES)

%Ejercicio 2.7: Sucesión de Fibonacci sin funciones

function v=Fibonacci_ejercicio2

N=input('Introduzca límite de la sucesión: ');

anmdos=0;

anmuno=1;

an=1;

for i=1:N

v(i)=an;

an=anmuno+anmdos;

disp(an);

anmdos=anmuno;

anmuno=an;

end

end

FIBONACCI (EJEMPLO II, VBLES. LOCALES)

%Sucesión de Fibonacci con variables locales

function t=fib(n1,n2)

n=1; %inicialización de a(n)

m=input('Introducir fin de la sucesión: ');

n2=0; %inicialización de a(n-2)

n1=1; %inicialización de a(n-1)

while n<=m

fprintf('%d\n',n);

n=enesima(n1,n2); %cálculo del término enésimo

n2=n1;

n1=n;

end

end

function n=enesima(n1,n2)

n=n1+n2;

end

GOLDBACH

%Ejercicio 2.4: Conjetura de Goldbach

function goldbach

n=input('Introduzca número entero par mayor que dos: ');

v=[];

for i=1:n

m=n-i;

r=es_primo(m);

if r==1

q=es_primo(i);

if q==1

v(1)=m;

v(2)=i;

end

end

Page 23: INFORMÁTICA (MATLAB) Programas resueltos€¦ · INFORMÁTICA (MATLAB) Programas resueltos -Hechos en clase -Ejercicios resueltos -Programas de examen . En este “libro” encontraréis

end

disp(v);

end

function [r]=es_primo(x)

r=1;

d=2;

while r==1 && d<x

if mod(x,d)==0

r=0; %En cuanto encuentra un valor por el cual es divisible

"deja de ser primo"

end

d=d+1;

end

end

GOLDBACH PRO

function goldbach_pro

%Esta función de Goldbach calcula todas las combinaciones posibles de

%números primos, cortesía de Adri

n=input('Introduzca número par mayor que dos: ');

k=0;

v=zeros;

for i=2:n

r=es_primo(i);

if r==1

k=k+1;

v(k)=i;

end

end

%Creamos otro vector que esté dado la vuelta idéntico al anterior

N=length(v);

for k=1:N

for j=N:-1:1

w(j)=v(k);

end

end

goldbach=lista_goldbach(w,v,n);

disp(goldbach);

end

function [goldbach]=lista_goldbach(w,v,n)

%Sumamos componente a componente para comprobar si dan el resultado n

N=length(v);

k=0;

goldbach=[];

for i=1:N

for j=i:N

if [v(i)+w(j)]==n

k=k+1;

goldbach(k,:)=[goldbach;[v(i) w(j)];

end

end

end

Page 24: INFORMÁTICA (MATLAB) Programas resueltos€¦ · INFORMÁTICA (MATLAB) Programas resueltos -Hechos en clase -Ejercicios resueltos -Programas de examen . En este “libro” encontraréis

function [r]=es_primo(x)

r=1;

for i=2:n

if mod(x,i)==0

r=0;

break

end

end

end

IDENTIFICA SÍMBOLO

%Ejercicio 3.3: Identificación de símbolos en un texto

function identificaSimbolo(texto,simbolos)

N=length(texto);

M=length(simbolos);

i=1;

j=1;

while i<=M

cont=0;

pos=[];

while j<=N

if texto(j)==simbolos(i)

cont=cont+1;

pos=[pos,j];

end

j=j+1;

end

if cont==0

fprintf('Símbolo %s no aparece\n',simbolos(i));

else

n=length(pos);

for k=1:n

fprintf('Símbolo %s aparece en la posición

%d\n',simbolos(i),pos(k)); %Este algoritmo proporciona todas las

posiciones en las que se encuentra

end

end

j=1;

i=i+1;

end

end

IDENTIFICA SÍMBOLO 2

%Ejercicio 3.4: Identificador de símbolos en una cadena de texto.

Devuelve

%1 si está el símbolo en la cadena y 0 en caso contrario

function identificaSimbolo2(texto,simbolos)

N=length(texto);

M=length(simbolos);

i=1;

j=1;

Page 25: INFORMÁTICA (MATLAB) Programas resueltos€¦ · INFORMÁTICA (MATLAB) Programas resueltos -Hechos en clase -Ejercicios resueltos -Programas de examen . En este “libro” encontraréis

r=1; %Suponemos inicialmente que no hay coincidencia alguna

for i=1:N

for j=1:M

if texto(i)==simbolos(j)

r=0;

end

end

end

end

disp(r);

end

INVIERTE CADENA

% Programa que lee una cadena y la devuelve invertida

function invierta_cadena

s=input('Cadena= ','s');

si=invertir(s);

fprintf('Cadena invertida=%s\n',si);

end

function si=invertir(s);

N=length(s);

j=N;

for i=1:N

si(j)=(s(i));

j=j-1;

end

end

LISTA DIVISIBLES 2 Y NO 3

% Ejercicio 1.5: Listado de números divisibles por 2 y no por 3

n=input('Introduzca n: ');

x=0;

for i=1:n

x=x+1;

if mod(x,2)==0

if mod(x,3)~=0

disp(x);

end

end

end

LISTA PRIMOS

%Mostrar lista de números primos entre 0 y 100

n=2;

cont=1;

while cont<100

d=2;

while mod(n,d)~=0

d=d+1;

Page 26: INFORMÁTICA (MATLAB) Programas resueltos€¦ · INFORMÁTICA (MATLAB) Programas resueltos -Hechos en clase -Ejercicios resueltos -Programas de examen . En este “libro” encontraréis

end

cont=cont+1;

if d==n

fprintf('%d\n',n);

end

n=n+1;

end

LISTADO NÚMEROS ABUNDANTES

%Ejercicio 1.16: Listado de números abundantes

N=input('Introduzca valor límite: ');

for n=1:N

sumat=0;

for i=1:n-1

if mod(n,i)==0

sumat=sumat+i;

end

end

if sumat>n

disp(n);;

end

end

LISTADO NÚMEROS PERFECTOS

%Ejercicio 2.3: Números perfectos

function listado_num_perf

N=input('Introduzca límite del listado: ');

n=0;

cont=0;

while cont<N

n=n+1;

r=esperfecto(n);

if r==1

disp(n);

cont=cont+1;

end

end

end

function [r]=esperfecto(n)

sum=0;

for i=1:n-1

if mod(n,i)==0

sum=sum+i;

end

end

if sum==n

r=1;

else

r=0;

end

Page 27: INFORMÁTICA (MATLAB) Programas resueltos€¦ · INFORMÁTICA (MATLAB) Programas resueltos -Hechos en clase -Ejercicios resueltos -Programas de examen . En este “libro” encontraréis

end

MÍNIMO, MÁXIMO Y MEDIA DE UN VECTOR

%Ejercicio 2.1: Min,Max y media de un vector

v=input('Introduzca vector: ');

N=length(v);

v_max=v(1);

v_min=v(1);

sum=0;

for k=1:N

if v(k)>v_max

v_max=v(k);

end

if v(k)<v_min

v_min=v(k);

end

sum=sum+v(k);

end

med=sum/N;

fprintf('El valor máximo es %d\n',v_max);

fprintf('El valor mínimo es %d\n',v_min);

fprintf('La media de las componentes es %.2f\n',med);

MAYOR EDAD

% Ejercicio 1.2: Identificador de edades

x=input('Introduzca edad: ');

if x<18

disp('Menor de edad');

elseif x>=18 && x<65

disp('Mayor de edad');

else

disp('Jubilado');

end

MÍNIMO COMÚN MÚLTIPLO

%Ejercicio 1.17.1: Mínimo común múltiplo

x=input('Introduzca primer número: ');

y=input('Introduzca segundo número: ');

min=1;

if x>y

p=x;

else

p=y;

end

for i=2:p

n=1;

m=1;

while mod(x,i)==0

n=n*i;

end

Page 28: INFORMÁTICA (MATLAB) Programas resueltos€¦ · INFORMÁTICA (MATLAB) Programas resueltos -Hechos en clase -Ejercicios resueltos -Programas de examen . En este “libro” encontraréis

while mod (y,i)==0

m=m*i;

end

if m>n

min=m*min;

else

min=n*min;

end

end

disp(min);

MEDIA DE DOS NÚMEROS

% Cálculo de la media de a y b

a=input('Introduce a: ');

b=input('Introduce b: ');

c=(a+b)/2;

fprintf('media de a y b = %d\n',c);

MEDIA DE DOS NÚMEROS EN VALOR ABSOLUTO

%Ejercicio 1.1: Media de dos números en valor absoluto

function media_abs=media_abs(x,y)

x=input('Introduzca primer número: ');

y=input('Introduzca segundo número: ');

media=(x+y)/2;

media_abs=val_abs(media);

fprintf('La media es %.1f\n',media_abs);

end

function r=val_abs(x)

if x<0

r=-x;

else

r=x;

end

end

MEDIA ARITMÉTICA DE LAS COMPONENTES DE UN VECTOR

% Media aritmética de las componentes de un vector

function m=media_vect(v)

v=input('v= ');

n=length(v);

sumat=0;

for cont=1:n

sumat=v(cont)+sumat;

end

media=sumat/n;

fprintf('La media de las componentes es %d\n',media);

end

Page 29: INFORMÁTICA (MATLAB) Programas resueltos€¦ · INFORMÁTICA (MATLAB) Programas resueltos -Hechos en clase -Ejercicios resueltos -Programas de examen . En este “libro” encontraréis

FACTORIAL DE UN NÚMERO

% Factorial de un número n (con funciones)

function factorial=mi_fact(n)

producto=1;

for factor=2:n

producto=producto*factor;

end

factorial=producto;

NORMA DE UN VECTOR

%Cálculo de la norma de un vector

function norma_vector

v=[1 2 3];

n=norma(v); %pasamos vector v a función norma

fprintf('|v|=%f\n',n);

end

function n=norma(v)

N=length(v); %tamaño del vector

s=0;

for i=1:N %recorremos las componentes del vector

s=s+v(i)*v(i);

end

n=sqrt(s); %raíz cuadrada

end

NORMA DE UN VECTOR PEDIDO ELEMENTO A ELEMENTO (EJEMPLO VBLES. GLOBALES)

%Norma del vector pedido elemento a elemento

function norma_vector

global N

N=input('Dimensión del vector: ');

v=vector;

n=norma(v);

fprintf('|v|=%f\n',n);

end

function v=vector

global N

for i=1:N

v(i)=input(sprintf('v(%d)= ',i));

end

fprintf('%f\n',v);

end

function n=norma(v);

global N

s=0;

for i=1:N;

s=s+v(i)*v(i);

end

Page 30: INFORMÁTICA (MATLAB) Programas resueltos€¦ · INFORMÁTICA (MATLAB) Programas resueltos -Hechos en clase -Ejercicios resueltos -Programas de examen . En este “libro” encontraréis

n=sqrt(s);

end

NÚMERO ABUNDANTE

%Ejercicio 1.15: Determinar si un número es abundante

n=input('Introduzca número: ');

sumat=0;

for i=1:n-1

if mod(n,i)==0

sumat=sumat+i;

end

end

if sumat>n

disp('Es un número abundante');

else

disp('No es un número abundante');

end

NÚMERO COMBINATORIO (PARTE 1)

% Ejercicio 1.12(parte 1): número combinatorio

function num_combp1

n=input('n=');

m=input('m=');

if n>=m

n_fact=factorial(n);

nm_fact=factorial(n-m);

m_fact=factorial(m);

num_comb=n_fact/(nm_fact*m_fact);

end

fprintf('(n m)=%d\n',num_comb);

end

function fact=factorial(x);

fact=1;

for i=1:x

fact=fact*i;

end

end

OBJETO ÓPTIMO

%Ejercicio 4.1: Algoritmo Greedy

function objeto_optimo(OBJ,moch,Pmax)

%Calculamos el rendimiento de todas las filas

rend = rendimiento(OBJ);

M = length(rend);

N = length(moch);

max = zeros;

k = 1;

sum_moch = 0;

Page 31: INFORMÁTICA (MATLAB) Programas resueltos€¦ · INFORMÁTICA (MATLAB) Programas resueltos -Hechos en clase -Ejercicios resueltos -Programas de examen . En este “libro” encontraréis

a = 0;

%Creamos un vector max que tiene las posiciones de las filas de la matriz

%ordenadas de mayor a menor rendimiento correspondiente

rend_max = rend(1);

for i = 1:M

k=i;

while rend_max <= rend(k)

rend_max = rend (k);

k=k+1;

end

max(i) = k - 1;

end

%Creamos la variable sum_moch

for j = 1:N

p = moch(j);

sum_moch = sum_moch + OBJ(p,1);

end

% Buscamos el la fila de OBJ que tenga máximo rendimiento sin superar

Pmax

if Pmax == sum_moch

disp('No caben más objetos en la mochila');

else

s = 1;

while Pmax > sum_moch

a = max(s)

sum_moch = sum_moch + OBJ (a,1);

s = s+1;

end

fprintf ('El objeto de mayor relación valor/peso que cabe en la

mochila es %d\n',a);

end

end

function [rend] = rendimiento(OBJ)

[m,~]=size(OBJ);

rend=zeros;

for i=1:m

rend (i) = OBJ(i,2)/OBJ(i,1);

end

end

ORDENA

function [v]=ordena(v)

v=[4 -1 3 2];

v=ordenacionBurbuja(v);

disp(v);

end

function [v]=ordenacionBurbuja(v)

n=length(v);

fin=1;

i=1;

Page 32: INFORMÁTICA (MATLAB) Programas resueltos€¦ · INFORMÁTICA (MATLAB) Programas resueltos -Hechos en clase -Ejercicios resueltos -Programas de examen . En este “libro” encontraréis

while fin==1 && i<=n-1

fin=0;

for j=n-1:-1:i

if v(j)>v(j+1)

aux=v(j);

v(j)=v(j+1);

v(j+1)=aux;

fin=1;

end

end

i=i+1;

end

end

ORDENACIÓN INSERTA

% Algoritmo de ordenación por inserción

function ordenacion_insercion

v=[2 -3 4 -1 9];

v=ordena_insercion(v);

disp(v);

end

function vo=ordena_insercion(v)

L=length(v);

vo=[]; %Vector solución inicialmente vacío

%Vamos insertando cada componenente de v en vo mediante la función

inserta

for i=1:L

v=inserta(vo,v(i));

end

end

function v=inserta(v,x)

L=length(v);

i=1;

% Búsqueda del punto de inserción

while i<=L && x>v(i) % Mientras no me salga del vector y comparamos con

el valor de x cada valor del vector

i=i+1;

end

% Desplazamos componentes remanentes una posición hacia abajo. Empezamos

% por el últmo valor

j=L;

while j>=i

v(j+1)=v(j);

j=j-1;

end

v(i)=x;

end

ORDENACIÓN INSERCIÓN 2

function ordenacion_insercion2

v=[2 -3 4 -1 9];

Page 33: INFORMÁTICA (MATLAB) Programas resueltos€¦ · INFORMÁTICA (MATLAB) Programas resueltos -Hechos en clase -Ejercicios resueltos -Programas de examen . En este “libro” encontraréis

v=ordena_insercion_directa(v);

disp(v);

end

function v=ordena_insercion_directa(v)

%Ordenación por insdrción sin necesidad de vector auxiliar

L=length(v);

for i=2:L

j=i;

aux=v(i);

while j>i && aux<v(j-1)

v(j)=v(j-1);

j=j-1;

end

v(j)=aux;

end

end

%COMPROBAR CUAL ES EL FALLO POR EL CUAL NO ME ORDENA EL VECTOR!!!!!

PALÍNDROMO

%Determinar si una columna de texto es palíndromo

function palindromo

cad=input('Introduce cadena: ','s');

r=espalindromo(cad);

%r=1 si es palíndromo y r=0 si no lo es

if r==1

disp('Es palíndromo');

else

disp('No es palíndromo');

end

end

function r=espalindromo(cad);

N=length(cad);

i=1;

j=N;

r=1; %supongamos que es palíndromo

while i<=j

if cad(i)~=cad(j)

r=0;

end

i=i+1;

j=j-1;

end

end

PALÍNDROMO MAYÚSCULAS

%Determinar si una columna de texto es palíndromo

Page 34: INFORMÁTICA (MATLAB) Programas resueltos€¦ · INFORMÁTICA (MATLAB) Programas resueltos -Hechos en clase -Ejercicios resueltos -Programas de examen . En este “libro” encontraréis

function palindromo

cad=input('Introduce cadena: ','s');

cadmay=mayusc(cad);

r=espalindromo(cadmay);

%r=1 si es palíndromo y r=0 si no lo es

if r==1

disp('Es palíndromo');

else

disp('No es palíndromo');

end

end

function cadmay=mayusc(cad);

N=length(cad);

for i=1:N

if cad(i)>='a'& cad(i)<='z'

cadmay(i)=cad(i)+'A'-'a';

else

cadmay(i)=cad(i);

end

end

end

function r=espalindromo(cadmay);

N=length(cadmay);

i=1;

j=N;

r=1; %supongamos que es palíndromo

while i<=j

if cadmay(i)~=cadmay(j)

r=0;

end

i=i+1;

j=j-1;

end

end

PASA A BINARIO

%Ejercicio 2.6: Representar un número en base 2

function pasaBinario

n=input('Introduzca número en base decimal: ');

d=2;

k=0;

while n>0

k=k+1;

bin(k)=mod(n,d);

n=fix(n/d);

end

N=length(bin);

k=0;

for i=N:-1:1

k=k+1;

vect_bin(i)=bin(k);

Page 35: INFORMÁTICA (MATLAB) Programas resueltos€¦ · INFORMÁTICA (MATLAB) Programas resueltos -Hechos en clase -Ejercicios resueltos -Programas de examen . En este “libro” encontraréis

end

disp(vect_bin);

end

PASA HEXADECIMAL

%Ejercicio 2.6: Representar un número en base hexadecimal

function pasaHexadecimal

n=input('Introduzca número en base decimal: ');

d=16;

k=0;

hexa='';

while n>0

k=k+1;

aux=mod(n,d);

n=fix(n/d);

if aux>9

aux='A'+aux-10;

else

aux = '0'+aux;

end

hexa(k)=aux;

end

N=length(hexa);

k=0;

for i=N:-1:1

k=k+1;

vect_hexa(i)=hexa(k);

end

disp(char(vect_hexa))

end

PRIMOS GEMELOS

%Ejercicio 2.5: Listado de números primos gemelos

function lista_gemelos

n=input('Introduzca valor límite: ');

i=1;

w=[];

for P1=1:n

for P2=1:n

r=pgemelos(P1,P2);

if r==1

t=esPar(i);

if t==0 %Si la posición no es par, entonces se introduce en

la matriz de primos gemelos

matrix_primos(i,1)=P1;

matrix_primos(i,2)=P2;

end

i=i+1;

end

end

P2=1;

Page 36: INFORMÁTICA (MATLAB) Programas resueltos€¦ · INFORMÁTICA (MATLAB) Programas resueltos -Hechos en clase -Ejercicios resueltos -Programas de examen . En este “libro” encontraréis

end

[M N]=size(matrix_primos);

i=0;

for k=1:M

if matrix_primos(k,:)~=[0 0]

i=i+1;

matrix_gem(i,:) = matrix_primos(k,:);

end

end

disp(matrix_gem);

end

function [r]=pgemelos(x,y)

n=es_primo(x);

m=es_primo(y);

if n==1 && m==1 && x~=1 && y~=1%Comprobamos que ambos números son primos.

Añadimos la condición de que sean distintos a 1 ya que según la info

buscada el 1 no se incluye

res=x-y;

dist=vabs(res);

else

dist=0;

end

if dist==2

r=1;

else

r=0;

end

end

function [t]=esPar(i)

if mod(i,2)==0

t=1;

else

t=0;

end

end

function [r]=vabs(x)

if x<0

r=-x;

else

r=x;

end

end

function [r]=es_primo(x)

r=1;

d=2;

while r==1 && d<x

if mod(x,d)==0

r=0; %En cuanto encuentra un valor por el cual es divisible

"deja de ser primo"

end

d=d+1;

Page 37: INFORMÁTICA (MATLAB) Programas resueltos€¦ · INFORMÁTICA (MATLAB) Programas resueltos -Hechos en clase -Ejercicios resueltos -Programas de examen . En este “libro” encontraréis

end

end

POTENCIA (EJEMPLO VBLES. PERSISTENTES)

function pot(3)

persistent pot

if isempty (pot)

pot=1;

end

persistent m

if isempty(m)

m=0;

end

for i=1:m

pot=pot*x;

end

end

POTENCIA DE X ELEVADO A Y

% Potencia de x elevado a y

function z=potenciap(x,y) %función para elevar x a la y

pot=x;

for i=2:y

pot=pot*x;

end

fprintf('%d\n elevado a %d\n es %d\n', x,y,pot);

end

PUNTOS DE SILLA

%Ejercicio 2.9: Identificación de puntos de silla

function pto_silla

M=input('Introduzca matriz: ');

pos_fila=busqueda_max_fila(M);

pos_col=busqueda_max_colum(M);

pos=[pos_fila;pos_col];

ptos_silla=busquedaPtosSilla(pos);

disp(ptos_silla);

end

function ptos_silla=busquedaPtosSilla(pos)

[m, ~]=size(pos);

ptos_silla=[];

a=0;

for i=1:m

v=pos(i,:);

for k=(i+1):m

if v==pos(k,:)

a=a+1;

ptos_silla(a,:)=v;

Page 38: INFORMÁTICA (MATLAB) Programas resueltos€¦ · INFORMÁTICA (MATLAB) Programas resueltos -Hechos en clase -Ejercicios resueltos -Programas de examen . En este “libro” encontraréis

end

end

end

end

function [matrix_pos1]=busqueda_max_fila(M)

[m, n]=size(M);

for j=1:m

max_fila=1;

for k=1:n

%Identificamos el elemento de mayor valor de cada fila

if M(j,k)>=max_fila

max_fila=M(j,k);

matrix_pos1(j,:)=[j,k];

end

end

end

end

function [matrix_pos2]=busqueda_max_colum(M)

[m, n]=size(M);

for k=1:n

max_col=1;

for j=1:m

%Identificamos el elemento de mayor valor de cada columna

if M(j,k)>=max_col

max_col=M(j,k);

matrix_pos2(k,:)=[j,k];

end

end

end

end

RECTÁNGULO DE ÁREA MÁXIMA Y PERÍMETRO LIMITADO

% Ejercicio 1.7: Rectángulo de área máxima y perímetro limitado (lados

% enteros)

Pmax=90;

while mod(Pmax,4)~=0

Pmax=Pmax-1;

end

L1=Pmax/4;

L2=L1;

P=L1*L2;

amax=L1*L2;

L1max=1;

L2max=1;

while P<=Pmax

L1=L1+1;

L2=L2-1;

a=L1*L2;

if a>amax

amax=a;

L1max=L1;

L2max=L2;

Page 39: INFORMÁTICA (MATLAB) Programas resueltos€¦ · INFORMÁTICA (MATLAB) Programas resueltos -Hechos en clase -Ejercicios resueltos -Programas de examen . En este “libro” encontraréis

end

end

fprintf('L1=%d\n',L1);

fprintf('L2=%d\n',L2);

RENDIMIENTO (GREEDY)

%Ejercicio 4.1: Algoritmo Greedy

function [rend] = rendimiento(OBJ)

[m,~]=size(OBJ);

rend=zeros;

for i=1:m

rend (i) = OBJ(i,2)/OBJ(i,1);

end

end

function [i]=obj_optimo(OBJ,moch,Pmax)

%Creamos un vector ordenado de mayor a menor valor

rend = rendimiento(OBJ);

N = length(rend);

rend_max = rend(1);

k = 1;

max=zeros;

for i = 1:N

if rend(i) > rend_max

rend_max = rend(i);

max(k) = rend(i);

k = k+1;

end

end

%Calculamos la suma de todos los pesos de los elementos que ya están en

la

%mochila; suponemos que el vector moch nos da la posición de cada objeto

%dentro de la matriz OBJ

L = length(moch);

sum_moch=0;

for k = 1:L

i = moch(k);

sum_moch = sum_moch + OBJ (i,1);

end

%Con cada componente, por orden, comprobamos si cabe en la mochila, hasta

%que así sea

if Pmax==sum_moch

disp('No caben más objetos en la mochila');

end

while Pmax < sum_moch

for i = 1:N

sum_moch = sum_moch + max(i);

end

end

fprintf('El objeto de mayor relación valor/peso que cabe en la mochila

está en la fila %d\n',i);

end

Page 40: INFORMÁTICA (MATLAB) Programas resueltos€¦ · INFORMÁTICA (MATLAB) Programas resueltos -Hechos en clase -Ejercicios resueltos -Programas de examen . En este “libro” encontraréis

STARS MATRIX

% Ejercicio 1.13: Escribir matriz de asteriscos

n=input('Introducir número de asteriscos: ');

x='*';

y=' ';

while n>=1

for i=1:n

fprintf('%c',x);

end

n=n-1;

fprintf('%c\n',y);

end

STARS MATRIX 2

% Ejercicio 1.14: Figura de asteriscos (2)

n=input('Introducir el número de columnas (impar) de la figura: ');

m=input('Introducir el número de filas de la figura: ');

n=n-1;

m=m-1;

i=0;

j=n;

x='*';

y=' ';

k=1;

while k<=n

for m=i:j

fprintf('%s',x);

end

i=i+1;

j=j-1;

k=k+1;

fprintf('%s\n',y);

for p=1:i

fprintf('%s',y);

end

end

SUMA DE LOS COEFICIENTES DE UN NÚMERO

% Ejericio 1.8: Suma de los coeficientes de un número

n=input('Introduzca número: ');

m=10;

cont=1;

while fix(n/m)~=0

cont=cont+1;

m=m*10;

end

N=cont; %Dimensión del vector que queremos crear

m=(10^(N-1));

v=zeros;

i=0;

while m>=1

Page 41: INFORMÁTICA (MATLAB) Programas resueltos€¦ · INFORMÁTICA (MATLAB) Programas resueltos -Hechos en clase -Ejercicios resueltos -Programas de examen . En este “libro” encontraréis

i=i+1;

if i<=N

v(i)=fix(n/m);

n=n-v(i)*m;

end

m=m/10;

end

disp(v);

sum=0;

for i=1:N

sum=sum+v(i);

end

disp(sum);

SUMA LIMITADA

% Ejercicio 1.6: Límite de suma de números

n=input('Introduzca valor límite: ');

suma=0;

while suma<=n

x=input('Introduzca número entero: ');

suma=suma+x;

end

SUMA DE LAS POTENCIAS ENÉSIMAS

% Ejercicio 1.10: Suma de de las potencias enésimas

function sumat_pot

x=input('x=');

n=input('n=');

sumat_pot=sumatorio(x,n);

end

function sumat_pot=sumatorio(x,n)

sumat_pot=1; % Corresponde a x^0

for i=1:n

pot=potencia(x,i);

sumat_pot=sumat_pot+pot;

end

end

function pot=potencia(x,n)

pot=1;

for k=1:n

pot=pot*x;

end

end

Page 42: INFORMÁTICA (MATLAB) Programas resueltos€¦ · INFORMÁTICA (MATLAB) Programas resueltos -Hechos en clase -Ejercicios resueltos -Programas de examen . En este “libro” encontraréis

TÉRMINO GENERAL FIBONACCI

%Ejercicio 2.7: Fibonacci usando la fórmula

function n=termino_general_fibonacci(x)

n=4;

a=(1+sqrt(5))/2;

b=(1-sqrt(5))/2;

A=pot(a,n);

B=pot(b,n);

n=(1/(sqrt(5))*(A-B));

end

function A=pot(a,n)

A=1;

for i=1:n

A=A*a;

end

end

VARIOS

function [cad] = varios(n)

cad=input('cad= ','s');

N=length(cad);

for i=1:N

%comprobamos si es impar

if mod(i,2)~=0 %Si i es impar, se transforma en mayúscula

cad(i)=cad(i)+'A'-'a';

else

cad(i)=cad(i);

end

end

end