Вы находитесь на странице: 1из 21

27/10/2014

E.T.S.
RELACIÓN DE EJERCICIOS DE
INGENIEROS
INDUSTRIALES PROGRAMACIÓN EN MATLAB

Informática – 1er Curso de Grado en Ingeniería Industrial


INTRODUCCIÓN

El documento contiene una amplia relación de ejercicios de programación estructurada, incluyendo


algunas soluciones comentadas. Se recomienda encarecidamente no consultar las soluciones hasta haber
trabajado cada ejercicio a conciencia.

Este manual no hace hincapié en las posibilidades de MATLAB en aspectos tales como la programación
orientada a objetos, las módulos (toolboxes) específicos de distintas ramas de la ciencia y la ingeniería o
las peculiaridades del lenguaje de programación M, sino que trata de ser una base común a cualquier
lenguaje de programación estructurada y de profundizar en el diseño de algoritmos para resolver
problemas matemáticos. No se trata de realizar diseño de software, sino algoritmos para resolver
problemas.

La programación requiere de paciencia y constancia en la mayor parte de los casos, ya que al principio el
avance es muy lento. No desesperéis.

NOMBRE DE LAS FUNCIONES

Como regla para homogeneizar los nombres de las funciones, y salvo que se especifique lo contrario en
el enunciado, se recomienda que éstas se nombren del siguiente modo: Como regla, cada función o
fichero de comandos debe nombrarse como funcionXX, siendo XX el número del ejercicio. En el caso
de que haya varios apartados, el nombre del fichero será funcionXXY, donde Y será el apartado (a, b,
c, etc.).

DIFICULTAD

Cada ejercicio tiene una indicación con el nivel de dificultad:

• () Básico: ejercicios de calentamiento para ir entendiendo conceptos (generalmente vistos en


clase).
• (*) Fácil: ejercicios de aplicación de los conceptos básicos con baja dificultad algorítmica o que
han sido/serán vistos en clase.
• (**) Normal: ejercicios algo más avanzados pero con algoritmos que son variaciones de los
explicados en clase.
• (***) Difícil: ejercicios de pensar. Hay que buscar un algoritmo diferente a los de clase.
• (****) Especial: fuera del alcance de la asignatura. Sólo para gente interesada en programar.

AYUDA

Cuando se recomienda utilizar una función de MATLAB, es imprescindible hacer uso del comando help
en la ventana de comandos, o de la ayuda de la barra de menús. Por ejemplo, para saber cómo usar la
función disp deberíais teclear:

>> help disp


DISP Display array.
DISP(X) displays the array, without printing the array name. In
all other ways it's the same as leaving the semicolon off an
expression except that empty arrays don't display.

If X is a string, the text is displayed.

See also int2str, num2str, sprintf, rats, format.

Overloaded methods:
...
ERRORES EN LOS ARGUMENTOS DE ENTRADA

En todos los ejercicios (excepto en los ficheros de comandos), con independencia de si está
específicamente escrito o no en el enunciado, habrá que comprobar la corrección de los argumentos de
entrada para evitar que se produzcan errores en tiempo de ejecución. Si no se especifica ninguna acción
a tomar, se deberá mostrar un mensaje de error y salir sin hacer cálculos.

Aunque esto no es crítico en MATLAB, ya que gestiona dichos errores de una manera excelente, en otros
lenguajes de programación (JAVA, C…) se convierte en algo vital.

Tipos de manejo de errores:

• Mostrar mensaje de error


• Devolver un código de error
• Dar un valor por defecto
• Comprobar condiciones de los argumentos de entrada

ROBUSTEZ

Cuando se introduzcan datos por teclado (mediante la función input de MATLAB) se deberá realizar una
lectura robusta de los mismos. Por ejemplo, en el ejercicio 10, cuando se solicita que la introducción de
la opción sea robusta, implica que se debe leer un número y que este debe estar dentro del rango de
opciones permitido. Si no es así, se vuelve a solicitar. Ejemplo:

>> funcion07
----Menu----
1. Saludo
2. Pregunta
3. Exclamacion
4. Piropo
5. Despedida
Elija una frase del menu (1-5): 7
----Menu----
1. Saludo
2. Pregunta
3. Exclamacion
4. Piropo
5. Despedida
Elija una frase del menu (1-5): 1
Hola, amigo

¿BUCLE FOR O BUCLE WHILE?

Una pregunta muy interesante. En general, utilizaremos bucles for cuando el número de repeticiones
esté claramente definido por algún parámetro o constante, y el bucle while cuando dependa del
cumplimiento de una condición que no está determinada por el número de repeticiones.

FUNCIONES PROPIAS DE MATLAB

Muchos de los ejercicios propuestos en este documento pueden resolverse directamente utilizando una
función de MATLAB. Sin embargo, la idea de los mismos es aprender a programar qué es lo que hay
debajo.

INICIALIZACIÓN

Es conveniente, siempre que sea posible, definir los tamaños de los vectores y matrices que se utilicen
antes de usarlos. Esto acelera la ejecución de los programas ya que la memoria sólo se tiene que reservar
una vez. Si no lo hacemos, no se producirá ningún error, pero probablemente nos saltará un ‘warning’
avisando del problema.

CÓDIGO DE COLORES DE LOS EJERCICIOS

Algunos ejercicios están coloreados. En azul os iré poniendo los que hacemos en clase de prácticas, en
verde los que se dejen propuestos en clase de prácticas y en marrón los que se han puesto en exámenes
anteriores.

© Francisco Ramos, 2013


FICHEROS DE COMANDOS (SCRIPTS)

1. () Escribir un fichero de comandos que imprima por pantalla la frase ‘Hola, mundo’. Consejo: utilizar la
función disp() de MATLAB para mostrar mensajes y resultados por pantalla. También se puede utilizar
la función fprintf().

2. () Escribir un fichero de comandos que muestre por pantalla las operaciones de suma, resta, multiplicación
y división de dos datos reales definidos dentro del fichero de comandos.

3. () Escribir un fichero de comandos que pregunte el precio de una serie de frutas (peras, naranjas y
manzanas) y las cantidades que se van a comprar de cada una, y muestre por pantalla el precio total de la
compra.

4. () Escribir un fichero de comandos que permita transformar los grados Fahrenheit en Celsius y muestre
el resultado por pantalla. El valor a transformar se debe pedir al usuario mediante la función input() de
MATLAB.

5. () Escribir un fichero de comandos que pregunte la masa de un cuerpo y la distancia a la que se encuentra
del sol y calcule cuál es la fuerza de atracción gravitacional entre ambos. Nota: la masa del sol es de
1,989·1030 kg.

6. (*) Un isótopo radioactivo de un elemento es una forma del elemento que no es estable, sino que decae

radioactiva en el instante = 0, entonces la cantidad de sustancia presente al cabo de un tiempo t viene


espontáneamente con el tiempo de manera exponencial. Si es la cantidad inicial de una sustancia

dada por = , donde es la constante de descomposición. Este fenómeno se puede utilizar


para determinar la edad de un fósil de un ser vivo basándonos en la cantidad de Carbono 14 (C14) que
posee. Puesto que el C14 se mantiene más o menos constante en un ser vivo, y suponiendo dicha cantidad
conocida, se puede determinar el tiempo que hace que murió el ser vivo.

Escriba un programa que lea el porcentaje de C14 restante en una muestra, utilizando la función input(),

= 1,2097 · 10 años ; utilice la función exp() o log() de MATLAB para el cálculo.


calcule la antigüedad de dicha muestra, e imprima el resultado por pantalla con las unidades adecuadas.
Notas:

= , , = , ,
=! − + − + −
7. (*) La distancia entre dos puntos y en un sistema de coordenadas
cartesiano de tres dimensiones viene dada por la ecuación .

Ejemplo: = −3,2,5 , = 3, −6, −5 = 14.1421.


Escriba un programa para calcular la distancia entre dos puntos cualesquiera introducidos por el usuario.

alimentación de voltaje )* y con resistencia interna +* a una carga de resistencia equivalente +, , que se
8. (**) Escribir un fichero de comandos que calcule la máxima transferencia de potencia de una fuente de

supone conectada en serie a +* .

La manera más correcta de hacer esto sería calcular el máximo de la función (a mano), e implementar
dicho cálculo dentro de la función. Otra posibilidad consiste en representar la potencia de la carga , en
función de +, (con la función plot() de MATLAB) y ver manualmente dónde está el máximo.
MANEJO DE SENTENCIAS DE DECISIÓN (IF-ELSE, IF-ELSEIF-ELSE, SWITCH-CASE)

9. () Escribir un fichero de comandos que muestre por pantalla un menú general con 5 posibles opciones a
elegir una por el usuario. Una vez elegida la opción se imprimirá por pantalla un mensaje característico
de dicha opción. Si la opción no es válida se mostrará un mensaje informando de ello. Consejo: Se
recomienda el uso de la estructura switch-case.

10. () Escribir un fichero de comandos que modifique el ejercicio anterior para que la elección del menú se
realice de manera robusta. Pista: Utilice para ello un bucle while.

11. (*) Escribir un fichero de comandos que permita transformar los grados Celsius en Fahrenheit y viceversa
y muestre el resultado por pantalla. El programa mostrará un menú con tres opciones: Pasar Celsius a
Fahrenheit, Pasar Fahrenheit a Celsius y Salir del programa. Mientras que el usuario no seleccione la
última opción, el programa deberá volver al menú inicial.

12. (**) Escribir una función que calcule las soluciones de una ecuación de segundo grado. Los coeficientes
de la ecuación se facilitarán como tres argumentos de entrada: a, b y c. Estudie los distintos casos que
pueden aparecer: soluciones degeneradas, una solución o dos soluciones (real doble, reales simples,
complejas conjugadas).
MANEJO DE BUCLES (FOR, WHILE)

13. () Escribir una función que calcule el factorial de un número n que se pasa como argumento de entrada y
devuelva el resultado como argumento de salida. Si el argumento de entrada n no fuera válido, el
programa debe salir del método devolviendo un -1 como código de error.

. . . .
14. (*) Escribir una función que, recibiendo como argumento de entrada dos números enteros y positivos, n
y m, calcule el número combinatorio - 0, sabiendo que . ≥ /, - 0 = - 0 = 1 y que - 0 =
2!
/ 0 . / 4! 2 4 !
.
Pista: Haciendo uso de la función del ejercicio anterior, es inmediato realizar el cálculo.

15. (**) Escribir una función que, recibiendo como argumento de entrada un número entero y positivo n,
devuelva solamente el término n-ésimo de la serie de Fibonacci sin utilizar vectores. Pista: Necesitará
definir tres variables de tipo escalar.

16. (*½) Entre otras muchas propiedades de la serie de Fibonacci, la división de un término de la serie entre
el anterior tiende a un número conocido como “la divina proporción” cuando la longitud de la serie tiende
a infinito. Se pide escribir una función que recibiendo como argumento de entrada la longitud de la serie
de Fibonacci devuelva la aproximación de la “divina proporción” para esa longitud de la serie.

17. (***) Repetir el ejercicio anterior utilizando como argumento de entrada un valor de tolerancia. El valor
de la divina proporción se considerará calculado con una aproximación satisfactoria cuando la diferencia
entre el término n y el n-1 sea menor que dicha tolerancia. La función devolverá el valor calculado así
como el valor de truncamiento n. Consejo: utilizar un bucle while para comprobar la condición.

18. (*½) Se pide escribir el código de varias funciones que calculen el valor de un conjunto de funciones
definidas mediante su desarrollo en series de potencias. Dichas funciones recibirán el punto de evaluación
de la función, x, que será un número real, y el orden de truncamiento de la serie, n, que será entero. Las
funciones a calcular son:

a. La exponencial ex, que viene dada por la expresión:

6
5
=1+ + + + +⋯ , −∞ < <∞
1! 2! 3! 4!

b. El seno sin(x), que viene dado por el desarrollo:

6 < =
sin = − + − +⋯ , −∞ < <∞
3! 5! 7!

c. El coseno cos(x), que viene dado por el desarrollo:

?
cos =1− + − +⋯ , −∞ < <∞
2! 4! 6!

Nota: Si el orden de truncamiento no fuera válido, el argumento de salida valdrá -2.0.

19. (***) Repetir el ejercicio anterior utilizando como argumento de entrada un valor de tolerancia. El valor
de la función se considerará calculado cuando la diferencia entre el término n y el n-1 sea menor que
dicha tolerancia. Las funciones devolverán el valor calculado así como el valor de truncamiento n.

20. (***) Escribir un procedimiento que proporcione el desglose en billetes y monedas de una cantidad exacta
de euros que se pasará como argumento de entrada al mismo. Considérese que los billetes existentes son
de 500, 200, 100, 50, 20, 10 y 5 €, y las monedas de 1 y 2 €. Por ejemplo, si deseamos conocer el desglose
de 1433 €, el procedimiento mostrará por pantalla el siguiente resultado:
2 billetes de 500 euros
2 billetes de 200 euros
1 billete de 20 euros
1 billete de 10 euros
1 moneda de 2 euros
1 moneda de 1 euro

Observar que la palabra (billete y/o moneda) concuerda en número con la cantidad de billetes (o
monedas) y que si no hay piezas de un determinado tipo (en el ejemplo, de 5 euros), no muestra el
mensaje correspondiente.

Notas: En caso de que la cantidad de euros introducida no sea mayor que cero, la función saldrá sin hacer
nada. Se recomienda utilizar un vector de constantes con los posibles valores de los billetes para
aprovechar el uso de bucles.

21. (***) En la siguiente figura se muestra un “rectángulo áureo” que consta de dos rectángulos, uno grande
y otro pequeño, cuya proporción en superficies es igual a la constante conocida con el nombre de la
“divina proporción”, denotada por la letra griega ϕ.

Para calcular la proporción entre las superficies de los


rectángulos se procederá a lanzar n “dardos” aleatorios,
todos dentro del rectángulo grande, y se contarán como
aciertos los que hayan caído dentro del rectángulo
pequeño, de manera que:

S grande n
ϕ= ∝
S pequeño naciertos

Se pide escribir el código fuente de una función que


recibiendo como argumento de entrada el número de
dardos total a tirar n, devuelva la aproximación de la “divina
proporción” para ese número de dardos, según el método
explicado con anterioridad.

22. (***) Escribir un fichero de comandos que, introduciendo por teclado un número entero, represente por
pantalla su equivalente en el sistema binario. Si el número es negativo, se deberá escribir el
correspondiente signo menos antes del número.

23. (**½) Se pide realizar una función que evalúe un polinomio en un punto. La función recibirá como
argumentos de entrada un vector de coeficientes, c, en orden decreciente de potencias de la variable
independiente, de manera que el último elemento del vector corresponda con el término independiente,
y el valor de la variable independiente, x, en que hay que evaluar el polinomio.

24. (***½) Se pide realizar una función que, recibiendo como argumento de entrada los 4 coeficientes de una
ecuación de tercer grado, encuentre una de las soluciones de la función mediante el método de la
bisección. Se deberá primero realizar una etapa de tanteo para encontrar dos valores iniciales que
cumplan el teorema de Bolzano (usando la función rand() de MATLAB).
FIGURAS

25. Se pide escribir el código de varios procedimientos con los nombres que figuran en la siguiente tabla.
Éstos reciben como argumento de entrada un número entero n correspondiente al lado de las figuras de
asteriscos que dibujan:

trirect1 (*½) triinv1 (*½) tridoble1 (**)


n = 4 * n = 4 **** n = 4 *
** *** **
*** ** ***
**** * ****
***
**
*
trirect2 (*½) triinv2 (*½) tridoble2(**)
n = 4 * n = 4 **** n = 4 *
** *** **
*** ** ***
**** * ****
***
**
*
triequi(**) triequiinv(**) rombo (**½)
n = 4 * n = 4 ******* n = 4 *
*** ***** ***
***** *** *****
******* * *******
*****
***
*

En el caso de que el número que se pasa como argumento a la función no sea positivo, la función saldrá
sin hacer nada.

26. (* después de hacer los anteriores) Realizar procedimientos análogos a los del ejercicio anterior, pero que
impriman por pantalla las mismas figuras sin los asteriscos interiores (sólo los bordes).

trirect1 (*½) triinv1 (*½) tridoble1 (**)


n = 4 * n = 4 **** n = 4 *
** * * **
* * ** * *
**** * * *
* *
**
*
trirect2 (*½) triinv2 (*½) tridoble2(**)
n = 4 * n = 4 **** n = 4 *
** * * **
* * ** * *
**** * * *
* *
**
*
triequi(**) triequiinv(**) rombo (**½)
n = 4 * n = 4 ******* n = 4 *
* * * * * *
* * * * * *
******* * * *
* *
* *
*
27. (***) Realizar una función que imprima por pantalla la estrella de David de tamaño n (estrella de seis
puntas que aparece en la bandera de Israel).

28. (*½) Escribir una función que dibuje un tablero de ajedrez. Representando las casillas blancas mediante
“B” y las casillas negras mediante “N”. Se recuerda que en un tablero de ajedrez, la esquina inferior
derecha (y por tanto la superior izquierda también) debe ser blanca.

29. (*½) Escribir una función que pidiendo por teclado la posición inicial de la torre, represente un tablero de
ajedrez con “B” y “N”, mostrando la posición de la torre y sus posibles movimientos con “*”.

30. (**) Escribir una función que pidiendo por teclado la posición inicial del alfil, represente un tablero de
ajedrez con “B” y “N”, mostrando la posición del alfil y sus posibles movimientos con “*”.

31. (**)Escribir una función que pidiendo por teclado la posición inicial de la dama, represente un tablero de
ajedrez con “B” y “N”, mostrando la posición de la dama y sus posibles movimientos con “*”.

32. (**½) Escribir una función que pidiendo por teclado la posición inicial del rey, represente un tablero de
ajedrez con “B” y “N”, mostrando la posición del rey y sus posibles movimientos con “*”.

33. (***) Escribir una función que pidiendo por teclado la posición inicial del caballo, represente un tablero
de ajedrez con “B” y “N”, mostrando la posición del caballo y sus posibles movimientos con “*”.
MANEJO DE VECTORES

34. Escribir funciones que, recibiendo como argumento de entrada un vector de números reales, devuelvan:

a. () La componente de máximo valor.


b. () La componente de mínimo valor.
c. (*) La media del vector.
d. (**) La moda de un vector.

35. (*) Escribir una función que recibiendo como argumento de entrada un vector de números enteros v y un
número entero n, devuelva el número de veces que está n contenida en el vector v.

36. (*) Escribir una función que recibiendo como argumento de entrada un vector de enteros v, devuelva el
vector normalizado.

Nota: Para normalizar un vector, se dividen todas las componentes del vector por el módulo del mismo.
El módulo de un vector es igual a la raíz cuadrada de la suma de las componentes al cuadrado del vector.

37. (*½) Escribir una función que recibiendo como argumento de entrada dos vectores reales, devuelva el
producto escalar de dichos vectores.

38. (*) Escribir una función que, recibiendo como argumento de entrada un número entero y positivo n,
devuelva un vector con los n primeros términos de la serie de Fibonacci. Los dos primeros términos de la
serie de Fibonacci son iguales a 1 y los restantes igual a la suma de los dos anteriores. Pista: Valore el caso
n=1 como un caso particular.

39. (*½) Escribir una función que recibiendo como argumento de entrada un número entero n, devuelva un
vector que contenga los n primeros términos de la siguiente serie:

x0=1
x1=-6
x2=4
...
xi=xi-1-xi-2-xi-3, i=3,...n-1;

40. (**) Escribir una función que reciba un vector de números reales, v, como argumento de entrada y
determine cuál de todos ellos es el más cercano al primero de los elementos del vector y devuelva su
posición, p, dentro del vector.

Ejemplo: v = (2, 6, 4, 1 y 10) -> p = 3

(El número más cercano al primero (2) es el cuarto (1))

Nota: En caso de que el vector no tenga al menos dos componentes, el método devolverá un -1.

41. (**½) Escribir una función que recibiendo como argumento de entrada un vector de número enteros
devuelva otro vector de la misma dimensión con las componentes ordenadas de menor a mayor.

Ejemplo: Entrada 10 2 −1 5 Salida: −1 2 5 10

42. (**) Escribir una función que reciba como entrada un número entero positivo distinto de 1 y genere, a
partir de él una secuencia de números cuyo primer elemento es el que se pasa como argumento al método
y que sigue estas reglas:

• Si el último número es par, el siguiente resulta de dividir éste por la mitad.


• Si el último número es impar, el siguiente resulta de multiplicarlo por 3 y añadirle 1.
El proceso se repetirá hasta que el número generado sea igual a 1. Toda la secuencia se devolverá en
forma de vector.

43. (**) La media móvil de n elementos de un vector, v, se define como otro vector, mm, que contiene en
cada posición la media de n de los elementos de v contados desde dicha posición. Realice una función de
MATLAB llamada mi_media_movil() que, recibiendo como parámetros de entrada un vector, v, y un
número de elementos n, devuelva el vector, mm, que contenga la media móvil de n elementos de v.

@ = 6, 9, 9, 8, 8, 8, 8, 7, 5, 10 , . = 4 → // = 8.00, 8.50, 8.25, 8.00, 7.75, 7.00, 7.50


Ejemplos:

@ = 6, 9, 9, 8, 8, 7, 5, 6 , . = 8 → // = 7.25
Nota: Si sólo se recibe el vector, v, se calculará por defecto la media móvil de 5 elementos. Si no se recibe
ningún argumento de entrada, o si n no es un valor válido, se mostrará el correspondiente mensaje de

@ = 6, 9, 9, 8, 8, 5, 10 → // = 8.00, 7.80, 8.00


error. Ejemplos:

@ = 6, 9, 9, 8, 8, 7, 5, 6 , . = −4 → CCDC

44. (**) Realice las siguientes funciones relacionadas con los números primos:

a. Recibe como entrada un número entero n y devuelve un vector con los n primeros números
primos, empezando en el 1.

b. Recibe como entrada un número entero n y devuelve un vector con los números primos que
existan entre 1 y n, ordenados de menor a mayor.

c. Recibe como entrada un número entero n y devuelve un vector con los números primos que
existan entre 1 y n, ordenados de mayor a menor.

d. Recibe como entrada dos números enteros n y m y devuelve el menor de los números primos
existentes en el intervalo [n,m]. Si no hubiese ningún número primo, se devolverá un -1.

e. Recibe como entrada dos números enteros n y m y devuelve el mayor de los números primos
existentes en el intervalo [n,m]. Si no hubiese ningún número primo, se devolverá un -1.

f. Recibe como entrada dos números enteros n y m y devuelve un vector que contenga todos los
números primos existentes en el intervalo [n,m]. Si no hubiese ningún número primo, se
devolverá un -1.

Si en los métodos a, b o c la entrada no es mayor que 1, el método devolverá un -1. Si en los métodos d,
e o f alguna de las entradas (n y m) no es positiva, o m no es mayor que n, el método devolverá un -1.

45. Escribir una función que, recibiendo como entrada un vector de números enteros, devuelva:

a. (**) Un entero que diga cuántos números distintos aparecen en el vector.

b. (**) Un vector conteniendo los números distintos que aparecen en el vector.

c. (**½) Una matriz con dos columnas. La primera contendrá el anterior vector (números
distintos que aparecen en el vector), mientras que la segunda indicará cuántas veces aparece
cada número en el vector.

46. Escribir las siguientes funciones que:

a. (**) Calcule el mínimo común múltiplo de dos números enteros que se pasarán como
argumentos de entrada y lo devuelva como argumento de salida.
b. (**) Calcule el máximo común divisor de dos números enteros que se pasarán como
argumentos de entrada y lo devuelva como argumento de salida.

c. (***) Calcule la descomposición en factores simples de un número entero positivo n que se


recibe como argumento de entrada y almacene dichos factores en un vector que se devolverá
como argumento de salida.

d. (***) Calcule el mínimo común múltiplo de otros dos números enteros haciendo uso de su
descomposición en factores simples.

e. (***) Calcule el máximo común divisor de otros dos números enteros haciendo uso de su
descomposición en factores simples.

47. (**½) Escribir una función que recibiendo como argumento de entrada un número real x y un número
entero n, devuelva un vector de tipo char que contenga la conversión en binario de x con n bits de
precisión (incluyendo la coma). Si el número x recibido fuera negativo, se deberá representar el
equivalente binario de su módulo absoluto. Si n fuera no positivo, el método deberá devolver ‘0’.

48.
MANEJO DE MATRICES

49. () Escribir funciones que:

a. Recibiendo como entrada un número n, devuelva la matriz identidad de dicho tamaño.


b. Recibiendo como entrada un vector, devuelva una matriz con los elementos de dicho vector en
su diagonal principal.

50. () Realizar una clase con un método que reciba como argumento una matriz entera y devuelva la traza del
vector.

Nota: la traza de una matriz es igual a la suma de los elementos de su diagonal principal.

51. (*) Escribir una función que, recibiendo como argumento de entrada un número entero n, devuelva una
matriz cuadrada de dimensión n con la siguiente forma:

1 0 1 0 ⋯ 0
0 1 0 1 ⋯ 1
G L
1 0 1 0 ⋯ 0
F
F0 K
1 0 1 ⋯ 0K
⋮ ⋮ ⋮ ⋮ ⋱ ⋮
E1 0 1 0 ⋯ 1J

Nota: La dimensión de la matriz n debe ser siempre par, si no lo fuera la función deberá devolver un -1.

52. (**½) Escribir una función que recibiendo como argumento de entrada un número entero n devuelva una
matriz, M, de dimensión n×n que contenga de forma ordenada los n*n primeros términos de la serie de
Fibonacci.

1 1 2 3
1 1 5 8 13 21
Ejemplos:
.=2→M=- 0 .=4→M=N O
2 3 34 55 89 144
233 377 610 987

53. (**) Escribir una función que reciba un número entero n como argumento de entrada y devuelva la matriz
de Vandermonde de dimensión nxn.

54. (**) Escribir una función que recibiendo como argumento de entrada una matriz entera y un vector
entero, devuelva la multiplicación de la matriz por el vector.

55. (***) Escribir una función que multiplique dos matrices de números enteros sin utilizar el operador de
multiplicación matricial de MATLAB. Las matrices se pasarán como argumentos de entrada al método, y
éste deberá comprobar la coherencia de las dimensiones antes de realizar la operación.

56. (**) Escribir una función que tomando como argumento de entrada un número entero devuelva una
matriz triangular superior de dimensión n×n que tenga la siguiente forma:

Ej: n=4. Ej: n=9.

1 2 3 4 5 6 7 8 9
1 2 3 4  
  0 1 2 3 4 5 6 7 8
0 1 2 3 0
0 0 1 2 3 4 5 6 7
0 1 2  
  0 0 0 1 2 3 4 5 6
0 0 0 1 
 0 0 0 0 1 2 3 4 5 

0 0 0 0 0 1 2 3 4
 
0 0 0 0 0 0 1 2 3
0 0 0 0 0 0 0 1 2
 
0 0 0 0 0 0 0 0 1 
57. (**) Escribir una función que tomando como argumento de entrada un número entero n devuelva una
matriz triangular inferior de dimensión n×n que tenga la siguiente forma:

Ej: n=4 Ej: n=9

9 0 0 0 0 0 0 0 0
 
4 0 0 0 8 9 0 0 0 0 0 0 0
 
3 4 0 0 7 8 9 0 0 0 0 0 0
2  
3 4 0 6 7 8 9 0 0 0 0 0
 
1 2 3 4  5

 6 7 8 9 0 0 0 0 
4 5 6 7 8 9 0 0 0
 
3 4 5 6 7 8 9 0 0
2 3 4 5 6 7 8 9 0
 1 
2 3 4 5 6 7 8 9 

58. (**) Escribir una función que tomando como argumentos de entrada un número entero para la posición
en filas y otro para la posición columnas sobre una matriz de dimensión 8×8, devuelva la matriz de 8×8
donde cada elemento de la matriz sea la distancia (en filas + columnas) de dicha posición a la posición
inicial:

Ej: fila=1, columna=3. Ej: fila=7, columna=5.

2 1 0 1 2 3 4 5 10 9 8 7 6 7 8 9
   
3 2 1 2 3 4 5 6 9 8 7 6 5 6 7 8
4 3 2 3 4 5 6 7 8 7 6 5 4 5 6 7
   
5 4 3 4 5 6 7 8 7 6 5 4 3 4 5 6
  6
6 5 4 5 6 7 8 9
 5 4 3 2 3 4 5 
7 6 5 6 7 8 9 10  5 4 3 2 1 2 3 4
   
8 7 6 7 8 9 10 11 4 3 2 1 0 1 2 3
9 10 11 12  5 4 3 2 1 2 3 4 
 8 7 8 9 

59. (**) Escribir una función que contenga un método que recibiendo como argumento de entrada la posición
inicial en filas y columnas devuelva una matriz de caracteres de dimensión 8×8 como la de la estructura
del siguiente ejemplo:

f f f e f f f f
 
f f e d e f f f
f e d c d e f f
Ejemplo: fila= 5, columna = 4:  e d c b c d e f
d c b a b c d e

 
e d c b c d e f
f e d c d e f f
f 
 f e d e f f f 

Si el método recibiera como argumento de entrada una posición inicial fuera de la matriz, deberá devolver
una ‘x’.

60. (***) Escribir una función que recibiendo como argumento de entrada una posición en filas y columnas
sobre una matriz de dimensión 10×10 devuelva la siguiente matriz de caracteres:

u u u
o o o o o o o
 
u u u
o i i i i i o
Ejemplo: filas=4, columnas=6 u u u
o i e e e i o
 
u u u
o i e a e i o
u u u 
o i e e e i o

u u u
o i i i i i o
 
u u o o o o o o
u o
u u u u u u u u u u
 
u u u u u u u u u u
u u u u u u u u u u 

Si la posición inicial recibida en forma de fila y columna no estuviera dentro del tablero, el método deberá
devolver una ‘x’.

61. (**) Escribir una función que recibiendo como argumento de entrada un número entero y positivo n,
devuelva una matriz de tamaño nxn conteniendo las n primeras filas del triángulo de tartaglia debajo de
la diagonal principal.

1 0 0 0 0 0
Ejemplo: n=7 1

1 1 0 0 0 0
G L
1 1
1 2 1 0 0 0
P=F K
1 2 1
F1 3 3 1 0 0K
1 3 3 1
1 4 6 4 1 0
1 4 6 4 1
1 5 10 10 5 1 E1 5 10 10 5 1J
M

62. (**½) Escribir una función que, tomando como entrada una matriz de números reales, devuelva un vector
con la posición en filas y columnas del elemento de la matriz más cercano a cero. En caso de que haya
más de un elemento que cumpla dicha característica, se devolverán las posiciones de todos ellos.

63. (**) Escribir una función que recibiendo como argumento de entrada un número entero n y un número
real x, devuelva una matriz real de dimensión n×n que siga la estructura de los siguientes ejemplos:

Ej: n=4, x=0.2 n=3, x=-1.1

 0.2 0.4 0.6 0.8   − 1.1 − 2.2 − 3.3 


   
 − 0.4 0.2 0.4 0.6   2.2 − 1.1 − 2.2 
 − 0.6 − 0.4 0.2  3.3 2.2 − 1.1 
0.4  
 
 − 0.8 − 0.6 − 0.4 0.2 

Si el método recibiera como argumento de entrada un valor de n no positivo, deberá devolver un -1.0.

64. Forma matricial: (*) Forma escalar: (**½) Escribir una función que reciba como argumento de entrada dos
matrices y devuelva como argumento de salida una matriz que esté formadas por cajas en la diagonal de
las otras dos matrices:

 2 5 − 4   2 5 − 4 0 0
   
Ejemplo:  9 7 8   9 7 8 0 0
 1 0 14  ⇒  1 0 14 0 0 
   
 0 0 0 2 3
 2 3  
 
 1 5   0 0 0 1 5 

65. Escribir funciones que:

a. (*) Reciba como argumento de entrada una matriz de números enteros y devuelva su simétrica
respecto de la horizontal.
b. (*) Reciba como argumento de entrada una matriz de números enteros y devuelva su simétrica
respecto de la vertical.
c. (*) Reciba como argumento de entrada una matriz de números enteros y devuelva su simétrica
respecto de la diagonal.
d. (*½) Reciba como argumento de entrada una matriz de números enteros y devuelva su simétrica
respecto de la contradiagonal.
e. (**) Reciba como argumento de entrada una matriz de números enteros y la devuelva girada 90º
en el sentido de las agujas del reloj.
f. (**) Reciba como argumento de entrada una matriz de números enteros y la devuelva girada
180º en el sentido de las agujas del reloj.
g. (**) Reciba como argumento de entrada una matriz de números enteros y la devuelva girada
270º en el sentido de las agujas del reloj.

66. (**½) Realizar una función que obtenga la ‘matriz integral’ de una matriz numérica, A, dada como
argumento de entrada. Cada elemento de una matriz integral es la suma de los elementos de la matriz
original que están por encima y a la izquierda de esa posición.

Ejemplos:

0 0 0 0
1 2 3
0 1 3 6
Q = R4 5 0S → T = N O
0 5 12 15
1 2 1
0 6 15 19
0 0 0
−2 1
Q=- 0 → T = R0 −2 −1S
7 5
0 5 11

Nota: En caso de no recibirse argumento de entrada se generará un error. Si el argumento de entrada A,


fuese un vector, se devolverá un solo elemento con la suma de los componentes del vector. Ejemplo:

@= 7 1 1 5 5 3 7 → T = 29

67. (**) Realizar una función que reciba dos argumentos de entrada (A, una matriz de números enteros, y n,
un número natural), y calcule el histograma de la matriz A. El histograma de una matriz se define como
un vector con la frecuencia relativa de cada uno de los diferentes números que hay en ella. Se supondrá
que los posibles números que se pueden encontrar en la matriz son números enteros entre 1 y n
(argumento de entrada).

Ejemplos:

1 3 2
Q = R3 5 3S , . = 5 → ℎ = 2/9 1/9 3/9 1/9 2/9
4 1 5
1 6 1
2 1 6
Q=N O , . = 7 → ℎ = 5/12 3/12 0 1/12 0 3/12 0
1 2 6
4 2 1

Nota: Si falta algún argumento de entrada, se generará un error. Si A contiene valores que no estén entre
1 y n, se generará otro error distinto.

68. (**) Realizar una función que, recibiendo como argumento de entrada una matriz A, devuelva dos
argumentos de salida, correspondientes a las filas y las columnas de la posición desde la que se ‘ven’ más
ceros. Los ceros que se ‘ven’ desde una determinada posición corresponden a los que hay en la misma fila
o columna que dicha posición (exceptuando a ella misma).

Ejemplos:

1 2 0 2
2 14 0 1
Q=N O → W = 4; Y = 3
1 0 0 3
0 5 3 1

Nota: Si la función no recibe argumentos de entrada se generará un error. Si la matriz de entrada A no


tiene ningún cero, se devolverá la posición (-1,-1) y se saldrá de la función sin efectuar cálculos.
69. (**½) Escribir una función que recibiendo como argumento de entrada una matriz de números enteros,
devuelva otra matriz de números enteros de la misma dimensión que la anterior con sus elementos
ordenados de mayor a menor por filas (de izquierda a derecha y de arriba hacia abajo).

Ejemplos:

10 6 7 −5 −1 0
0 8 3 1 1 2
Q=N O→Q=N O
−5 2 −1 3 4 6
4 1 1 7 8 10

70. Escribir las siguientes funciones:

a. (**) Dadas una matriz de números reales y una posición en filas y columnas, extrae la matriz de
3x3 que rodea al número que se encuentra en dicha posición y la devuelve como argumento de
salida.
b. (**½) Dadas una matriz de números enteros y una posición en filas y columnas, extrae los
elementos que rodean a dicha posición y los coloca por filas dentro de un vector, (excluyendo al
propio número), comenzando por la esquina superior izquierda y terminando en la inferior
derecha, que devolverá como argumento de salida.

Si la matriz no es, al menos, de tamaño 3x3, o si la posición en filas y columnas no está en la parte interna
de la matriz (es decir, que no debe estar tampoco en el borde), el método devolverá un -1.

c. (***) Exactamente igual al método del apartado a) salvo porque se debe permitir extraer
submatrices incluso en los bordes de la matriz. En caso de que la posición elegida esté en el
borde, los elementos que no existen se rellenarán con ceros en la submatriz.

71. (***½) Escribir una función que recibiendo como argumento de entrada una matriz A y un vector b de
números reales resuelva el sistema de ecuaciones Ax=b mediante el método de eliminación gaussiana.
MANEJO DE CADENAS DE CARACTERES

Nota: Para realizar los ejercicios de manejo de cadenas de caracteres en JAVA se tendrán en cuenta
los siguientes datos:
• El tipo char se trata internamente como un entero de 8 bits a efectos de conversión
automática de tipos. Los 127 primeros caracteres se correspondes con los del código ASCII.
• Los códigos numéricos que representan los caracteres alfanuméricos son consecutivos,
comenzando en:
o Mayúsculas:
‘A’ = 65 (41 en hexadecimal)
‘Z’ = 90 (5A en hexadecimal)
o Minúsculas:
‘a’ = 97 (61 en hexadecimal)
‘z’ = 122 (7A en hexadecimal)
o Números:
‘0’ = 48 (30 en hexadecimal)
‘9’ = 57 (39 en hexadecimal)

72. (*½) Escribir un fichero de comandos que lea desde teclado (con la función input) un verbo y lo muestre
por pantalla conjugado en presente de indicativo. Si la cadena de caracteres de entrada no fuese un verbo
(y solamente un verbo), se imprimirá un mensaje de error.

Nota: Existen tres conjugaciones –ar, -er, -ir. Se supondrá que los verbos introducidos son regulares.

73. Escribir funciones que:

a. (*½) Reciba como argumento de entrada una frase y la devuelva convertida por completo a
mayúsculas.
b. (*½) Reciba como argumento de entrada una frase y la devuelva convertida por completo a
minúsculas.

Nota: Sólo se deben transformar las letras.

74. (**½) Uno de los métodos de encriptación más simples que existen consiste en “desplazar” un mensaje
un valor fijo de posiciones (este valor se conoce como ‘llave’) en el alfabeto. Así por ejemplo, la palabra
MATLAB desplazada una posición (llave = 1) se convierte en NBUMBC. Escribir funciones que:

a. Recibiendo como argumento de entrada una frase y un valor entero (la ‘llave’) devuelva la frase
encriptada.
b. Recibiendo como argumento de entrada una frase encriptada y un valor entero (la ‘llave’ de
encriptación), devuelva la frase desencriptada.

En el proceso de encriptación/desencriptación sólo se modificarán las letras, no modificándose los


espacios o signos de puntuación. Las letras deben quedarse dentro del rango de las letras (si a ‘Z’ le
sumamos dos, debe dar ‘B’). Si la llave no fuese un número positivo, el método generará un mensaje
de error. Deberá tener en cuenta la posibilidad de que la llave sea muy grande.

75. (*½) Para comprobar que el proceso de encriptado ha sido correcto, realice un fichero de comandos en el
cual se pida una cadena de texto al usuario, se encripte usando una llave que se pedirá también al usuario,
se muestre por pantalla la frase encriptada, y se desencripte a continuación mostrando por pantalla el
resultado final (que debe ser igual a la frase introducida por teclado).

76. Escribir las siguientes funciones:

a. (*½) Recibe como argumento de entrada una cadena de caracteres y la devuelve invertida.
b. (**) Recibe como argumento de entrada una palabra (vector de caracteres sin espacios ni signos
de puntuación) y dice si ésta es un palíndromo o no.
c. (**½) Recibe como entrada una frase y dice si ésta es un palíndromo o no.

En caso de que el vector de caracteres introducido sea palíndromo, las funciones devolverán un 1. Si no
lo son, devolverán un 0.

Nota: Una frase es un palíndromo si se lee igual de izquierda a derecha que de derecha a izquierda. Los
caracteres de espacio en blanco y signos de puntuación no se tendrán en cuenta a la hora de la
comprobación.

77. Escribir las siguientes funciones:

a. (**) Recibe como argumento de entrada dos cadenas de caracteres y muestra el índice del
carácter de la primera cadena, en el que empieza, por primera vez, la segunda cadena. Si la
segunda cadena de caracteres no está contenida en la primera, se devolverá un -2.
b. (**½) Recibe como argumento de entrada dos cadenas de caracteres y devuelva el número de
veces que aparece la segunda cadena contenida dentro de la primera, así como un vector con las
posiciones en las que se ha encontrado.

Nota: Si el segundo vector de caracteres es más largo que el primero se devolverá un -1.
EJERCICIOS AVANZADOS

78. (***½) Realizar una función que rellene en espiral una matriz cuadrada de tamaño nxn con números
enteros en orden creciente.

79. (***½) Escribir una función que calcule la inversa de una matriz que se recibe como argumento de entrada
mediante el método de eliminación gaussiana.

80. (****) Realizar una función que dibuje un círculo de radio r (argumento de entrada) con asteriscos.

81. (****) Realizar una función que haga la peregrinación del caballo por un tablero de ajedrez. La
peregrinación del caballo consiste en desplazar un caballo por un tablero de ajedrez de manera que pase
por todas las casillas sin repetir ninguna en el camino.

82. (****) Realizar una función que consiga colocar 8 damas en un tablero de ajedrez sin que ninguna de ellas
se mate con otra.

83. (****) Realizar una función que consiga colocar 5 damas en un tablero de ajedrez de modo que todo el
tablero esté amenazado.

84. (****) Realizar una función que calcule el determinante de una matriz de orden n mediante la definición
de determinante (desarrollo por adjuntos). Nota: es recomendable realizar esta función de modo
recursivo.

Вам также может понравиться