Programas Informática
Programas Informática
Programas resueltos
- Hechos en clase
- Ejercicios resueltos
- Programas de examen
% 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.
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
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
function area_circulo
r=input('Radio del círculo: ');
a=area(r);
fprintf('El área es %f\n',a);
end
function A=area(radio)
A=3.1415*radio*radio;
end
BUSCA-CADENA
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
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
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
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
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
COMPARACIÓN ALGORITMOS
%La complejidad de este problema es mucho menor, tan solo tiene que
%realizar una iteración
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
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
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
DETERMINA 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
EJ. EULER I
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
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);
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;
yast=a*xast+b;
end
end
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
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
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
%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
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));
flag = 0;
end
k=k+1;
end
%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
%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
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 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
function ejemplo_edo_tiro_vertical_rozamiento
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
% 09/05/16
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);
v(j+)=aux;
end
end
i=i+1
end
% 09/05/16
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
%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.
ES PALINDROMO
function [r]=es_palindromo(cad)
cad_esp=sinEspacios(cad);
cad_may=mayusculas(cad_esp);
N=length(cad_may);
i=0;
j=N+1;
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
FACTORIAL N
producto=1;
factor=2;
n=input('n= ');
for factor=2:n
producto=producto*factor;
end
factorial=producto;
disp(factorial);
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
FIBONACCI (EJEMPLO I, 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
function n=enesima(n1,n2)
n=n1+n2;
end
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
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
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
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
function identificaSimbolo2(texto,simbolos)
N=length(texto);
M=length(simbolos);
i=1;
j=1;
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
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
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
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
end
MAYOR EDAD
% 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);
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
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
FACTORIAL DE UN NÚMERO
function factorial=mi_fact(n)
producto=1;
for factor=2:n
producto=producto*factor;
end
factorial=producto;
NORMA DE UN VECTOR
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
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
n=sqrt(s);
end
NÚMERO ABUNDANTE
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
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;
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
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;
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
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];
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
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
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
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);
end
disp(vect_bin);
end
PASA 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
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;
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;
end
end
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
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;
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
RENDIMIENTO (GREEDY)
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
STARS MATRIX
STARS MATRIX 2
SUMA LIMITADA
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
TÉRMINO GENERAL FIBONACCI
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