INFORMÁTICA (MATLAB) Programas resueltos - Hechos en clase - Ejercicios resueltos - Programas de examen Victoria Prieto (Vicky) 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- 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. 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) 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 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 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 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 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 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); 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); 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 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 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)); 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 %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 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); 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 %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; 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 % 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 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 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 %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; 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; 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 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 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 a=input('Introduce a: b=input('Introduce b: c=(a+b)/2; fprintf('media de a y de a y b '); '); 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 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 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; 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; 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]; 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 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); 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; 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 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; 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; 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 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 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 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