Academia.eduAcademia.edu

Lenguajes de Programación

Lenguajes de Programación Guı́a docente ECTS Ingenierı́a Naval y Oceánica Escuela Técnica Superior de Ingenieros Navales Universidad Politécnica de Madrid A. Souto Iglesias, J.L. Bravo Trinidad L. González Gutiérrez, A. Cantón Pire 30 de septiembre de 2008 ....para mı́ una buena escuela serı́a una escuela distinta, una escuela que tuviese un principio según el cual todas sus normas estuviesen enfocadas a mantener a tantos estudiantes como sea posible durante el mayor tiempo dentro del sistema. Ası́, todo tendrı́a que estar dirigido a hacer que los estudiantes participasen, que se sintiesen identificados con la escuela, que tuviesen la sensación de estar haciendo las cosas bien. Para mı́ una buena escuela es una escuela que mantiene a todos los alumnos trabajando, comprometidos y con la sensación de que no van a fracasar. Stephen Ball. In teaching you philosophy I’m like a guide showing you how to find your way round London. I have to take you through the city from north to south, from east to west, from Euston to the embankment and from Piccadilly to the Marble Arch. After I have taken you many journeys through the city, in all sorts of directions, we shall have passed through any given street a number of times - each time traversing the street as part of a different journey. At the end of this you will know London; you will be able to find your way about like a Londoner. Of course, a good guide will take you through the more important streets more often than he takes you down side streets; a bad guide will do the opposite. In philosophy I’m a rather bad guide. L. Wittgenstein. Índice general Notación y abreviaturas 6 I 7 Aprender a programar, con MATLAB Introducción 0. Tutorial de MATLAB 0.1. Introducción . . . . . . . . . . . . . . 0.2. Conceptos básicos . . . . . . . . . . . 0.3. Manejo de vectores . . . . . . . . . . 0.4. Introducción al tratamiento de matrices 0.5. Resolución de sistemas lineales . . . . 0.6. Vectorización de operaciones . . . . . 0.7. Creación de gráficas . . . . . . . . . . 0.8. Conjuntos de órdenes . . . . . . . . . 0.9. MATLAB y números complejos . . . . 0.10. Matemáticas simbólicas con MATLAB 9 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1. Funciones y Condicionales 1.1. General . . . . . . . . . . . . . . . . . . . . . 1.2. Funciones y variables . . . . . . . . . . . . . . 1.3. Funciones con varios argumentos de entrada . 1.4. Estructura de control condicional if . . . . . . 1.5. Estructura de control condicional if-else . . . . 1.6. Función que llama a otra función . . . . . . . 1.7. Condicionales anidados. . . . . . . . . . . . . 1.8. Variante elseif en el condicional . . . . . . . . 1.9. Operadores lógicos . . . . . . . . . . . . . . . 1.10. Operadores de comparación: ¿son iguales? . . 1.11. Igualdad entre números reales: precisión y valor 1.12. Variables enteras y reales como argumentos . . 1.13. Variables contador y sumador . . . . . . . . . 1.14. Función parte entera . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 13 13 17 19 23 25 27 28 31 32 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . absoluto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 35 35 38 40 42 43 44 46 47 50 50 52 53 54 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2. Bucles 55 2.1. General . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 2.2. Bucles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 2.3. Bucles con incremento variable . . . . . . . . . . . . . . . . . . . . . . . . . 57 Pág. 3 Lenguajes de Programación: Guı́a ECTS 2.4. 2.5. 2.6. 2.7. 2.8. Bucles con otras operaciones . . . . . . . . . . . Bucles y relaciones de recurrencia . . . . . . . . . Bucles y condicionales . . . . . . . . . . . . . . . Uso de bucles para verificar una condición sobre un Bucles anidados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . conjunto. . . . . . . 3. Vectores 3.1. General . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2. Vectores como argumentos de funciones . . . . . . . . . . . 3.3. Funciones que llaman a funciones con argumentos vectores . 3.4. Cálculo de extremos . . . . . . . . . . . . . . . . . . . . . 3.5. Cálculo de posición de extremos . . . . . . . . . . . . . . . 3.6. Evaluación de un polinomio . . . . . . . . . . . . . . . . . 3.7. Función que devuelve un vector . . . . . . . . . . . . . . . 3.8. Funciones que reciben y devuelven vectores . . . . . . . . . 3.9. Construcción de vectores . . . . . . . . . . . . . . . . . . . 3.10. Vectores y bucles anidados . . . . . . . . . . . . . . . . . . 3.11. Funciones con salidas múltiples . . . . . . . . . . . . . . . II . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 58 60 62 63 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 65 65 66 67 69 70 73 75 77 78 80 Guı́a ECTS para estudiantes 83 1. Introducción 85 2. Datos generales 2.1. Temporalidad y carácter 2.2. Créditos LRU . . . . . . 2.3. Departamento . . . . . 2.4. Profesores . . . . . . . 2.5. Créditos ECTS . . . . . . . . . . . . . . . . . . . . . . . . . 3. Objetivos 3.1. General . . . . . . . . . . . . . 3.2. Objetivos generales: descripción 3.3. Prerrequisitos . . . . . . . . . 3.4. Otras asignaturas de las que LP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 87 87 87 87 88 . . . . . . . . . . . . . . . . . . . . . . . . . . . es prerrequisito . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 89 89 91 91 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4. Programa y Metodologı́a 93 4.1. Métodos docentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 4.2. Temario y estimación del tiempo de estudio . . . . . . . . . . . . . . . . . . . 94 5. Recursos 5.1. Guı́a . . . . . . . . . . . . . . . . . . 5.2. Tutorı́as . . . . . . . . . . . . . . . . 5.3. Tutorı́as virtuales . . . . . . . . . . . . 5.4. Página web - Plataforma de B-learning 5.5. Copias . . . . . . . . . . . . . . . . . 5.6. Centro de Cálculo . . . . . . . . . . . 5.7. Bibliografı́a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 97 97 97 97 98 98 98 Pág. 4 ÍNDICE GENERAL 6. Evaluación 6.1. General . . . . . . . . . . . 6.2. Evaluación tradicional . . . 6.3. Evaluación ECTS . . . . . 6.4. El examen . . . . . . . . . 6.5. Evaluación de los objetivos III Apéndices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 101 101 101 103 105 107 A. Ejemplos de Exámenes 109 B. Gestión del CC 117 C. Control de tiempos y ficha 123 D. Premio SENER 127 Indice alfabético 132 Pág. 5 Lenguajes de Programación: Guı́a ECTS Notación y abreviaturas AO aptdo. cap. DHOf DNI ECTS FHOf fig. G GATE I JEE LOU LP LRU MEC pág. PAS PF ref. TIC Aula de Ordenadores apartado capı́tulo para referirse a actividades a realizar dentro del horario oficial. para referirse al número del Documento Nacional de Identidad. sistema de créditos europeos. para referirse a actividades a realizar fuera del horario oficial. figura para referirse a actividades a realizar en grupo. Gabinete de Teleeducación. para referirse a actividades a realizar de modo individual. Jefatura de Estudios. Ley Orgánica d 6/2001 de Universidades. Lenguajes de Programación. Ley Orgánica 11/1983 de Reforma Universitaria. Ministerio de Educación y Ciencia. página. Personal de Administración y Servicios. Portafolio. referencia bibliográfica. Tecnologı́as de la información y la comunicación. Pág. 6 Parte I Aprender a programar, con MATLAB Pág. 7 Introducción De modo resumido, podemos decir que programar es “enseñarle” a un ordenador cómo se resuelve un determinado problema. Para poder enseñar a alguien, es necesario dos cosas: tener un lenguaje en común y conocer bien lo que se quiere enseñar. En esta primera parte nos ocupamos del primer problema (que es el más sencillo y el que responde a la definición de “programar”). El lenguaje que “hablan” los ordenadores es muy simple, por lo que el proceso de aprenderlo será rápido. El principal problema es descomponer ideas complejas en otras más simples para que podamos programarlas. Siguiendo el esquema anterior, hemos organizado cada unidad didáctica en un esquema conceptoejemplo-ejercicios/problemas. Normalmente se trabajan uno o dos conceptos de Programación en cada unidad didáctica (contadores y bucles “while”, por ejemplo), los cuales se introducen primero formalmente y después mediante un ejemplo, sobre el que se proponen una serie de ejercicios que nos permitan asimilar y madurar las ideas explicadas. Por cada concepto introducido se trabajan cuatro o cinco ejemplos. Se pretende que en cada uno de estos ejemplos aparezca un uso habitual del concepto introducido. Se trata de asimilar bloques con un sentido concreto, construidos con los elementos básicos de Programación. A menudo, en los cursos de Programación, se introducen sólo los elementos de Programación y se supone que el alumno aprenderá a integrarlos por sı́ mismo. Sin embargo, muchas aplicaciones de esos elementos son estándares en la programación (por ejemplo, el uso de contadores, un bucle “while” y un condicional para seleccionar determinados elementos de un vector, crear un vector mediante un contador, etc.) y una vez nos hemos familiarizado con ese uso conseguimos una mayor agilidad a la hora de programar. Las unidades didácticas que constituyen el curso son las siguientes: 0. Tutorial de MATLAB. 1. Funciones y Condicionales. 2. Bucles. 3. Vectores. El curso comienza con un tutorial en el que se usa MATLAB como una potente calculadora al principio para terminar dibujando curvas, y agrupando instrucciones en ficheros “script”, lo que permite introducir ideas importantes para más adelante crear funciones. Además, se aprovecha esta unidad 0 para insistir en conceptos básicos de manejo de las herramientas del sistema operativo, sobre todo la creación y gestión de carpetas, y la ubicación precisa de las mismas en el sistema de archivos del usuario, bien en un disco local o en la unidad de red del aula de ordenadores donde se trabaja. Pág. 9 Lenguajes de Programación: Guı́a ECTS El lenguaje elegido para la implementación de ejemplos y ejercicios es el lenguaje de comandos o ”script”de MATLAB (o su versión libre Octave). Esta elección se debió a varios motivos: 1. MATLAB es un entorno de cálculo que los estudiantes usarán a lo largo de la carrera y probablemente después en su vida profesional ya que dispone de herramientas especı́ficas (“toolboxes”) para muchos ámbitos. Aunque las competencias de manejo asociadas a esas herramientas especı́ficas no se trabajan en este curso, el que el estudiante se sienta al final cómodo con el entorno MATLAB le permitirá si es necesario asimilar su funcionamiento con mucha mayor facilidad que si empezase de cero con el programa. 2. MATLAB es un lenguaje completo; tiene todos los elementos de un lenguaje de programación, con una sintaxis similar al C pero con la simplicidad del BASIC. Comprobamos en cursos anteriores que al utilizar un lenguaje como C, los alumnos dedicaban la mayor parte del tiempo a la corrección de errores de sintaxis y a la declaración de variables, reserva de memoria, etc., teniendo poco tiempo para comprender el funcionamiento de las estructuras de datos o de control del flujo del programa. En este sentido, el lenguaje MATLAB se acerca al pseudocódigo usado en algunos cursos de Programación, pero con la ventaja de poder realmente ejecutar los códigos creados. La simplicidad de MATLAB a estos efectos es a veces causa de falta de rigor en la forma de abordar la Programación. Ası́ el hecho de que no haya tipado explı́cito de variables pudiendo la misma variable ser una matriz en una lı́nea del código y un escalar un poco más abajo, o de MATLAB se ocupe del la reserva dinámica de memoria de modo automático, nos alejan de un lenguaje más potente como C. Sin embargo y como comentábamos más arriba, eso permite centrarse en el manejo de estructuras de control para resolver problemas y desarrollar estrategias, creemos que esencial al principio. 3. MATLAB es un lenguaje interpretable: MATLAB traduce durante la ejecución las diferentes sentencias al lenguaje primario y básico de la máquina. Se paga el precio de necesitar MATLAB para ejecutar nuestros códigos pero se recibe la recompensa de no tener que compilar y enlazar nuestros códigos para después ejecutarlos. 4. MATLAB proporciona una interfaz que permite probar las funciones directamente sin necesidad de llamarlas desde un programa principal. Esto permite comprobar su funcionamiento de un modo sencillo e inmediato, y como comentamos más abajo, ha permitido una estructura del curso creemos que muy interesante para un curso de introducción a la Programación para no Informáticos. 5. Todo ello hace que sea muy sencillo empezar a generar códigos interesantes en MATLAB, algo a lo que se llega con mucho más esfuerzo en un lenguaje de Programación más riguroso como C. Una vez realizado este tutorial, hasta hace unos años empleábamos la organización curricular usual en un curso de Programación (comenzando por la entrada y salida y el programa ”Hola mundo”). Sin embargo, ahora usamos una estructura similar a la programación funcional, comenzando por el concepto de función y estudiando la entrada y salida casi al final. De este modo, en la unidad 1 se trabaja al principio sobre el concepto de función, introduciendo inmediatamente la estructura de control condicional, la cual permite construir funciones más complejas e interesantes. En la unidad 2 se trabaja con bucles, posibilitando la repetición de operaciones. Es una unidad Pág. 10 ardua, pues no se recurre todavı́a a vectores o matrices, donde los bucles surgen de modo natural. Aquı́ están los ejemplos más interesantes del curso, como el de comprobar si un número natural es primo. Si el estudiante se siente cómodo al final de esta unidad, el resto del curso será para él una progresión sencilla. Si no se siente cómodo todavı́a, tendrá ocasión de cubrir los vacı́os en las unidades siguientes. En la unidad 3 se introducen los vectores, pues ya se tienen las herramientas para manejarlos. Como comentábamos en el prólogo, no hemos pretendido escribir un compendio exhaustivo ni de Programación ni de MATLAB. Debido a ello la selección de unidades didácticas no es inocente sino que subyace la idea de mostrar únicamente los aspectos considerados esenciales para aprender a programar. Creemos que en ese sentido el libro es una aportación interesante ya que no hay en la literatura cursos de introducción a la Programación que se apoyen en MATLAB como lenguaje de referencia, y lo más parecido corresponde a cursos de MATLAB en los que en algún capı́tulo se tratan diferentes aspectos de la programación1 . En cuanto a compendios de MATLAB, recomendamos el sensacional trabajo de Guillem Borrell2 . 1 Gilat, A., MATLAB. Una introducción con ejemplos prácticos, Reverté, 2006, es un buen ejemplo de este tipo de libros 2 Borrell i Nogueras, G., Introducción Informal a MATLAB y OCTAVE. Disponible online en http://forja.rediris.es/ Pág. 11 Lenguajes de Programación: Guı́a ECTS Pág. 12 Unidad Didáctica 0 Tutorial de MATLAB 0.1. Introducción Presentamos un tutorial de MATLAB, una herramienta potentı́sima, casi estándar para cálculos en muchas ramas de la Ingenierı́a, y de uso razonablemente simple. En la asignatura de LP, utilizaremos el intérprete de comandos de MATLAB para que el estudiante se introduzca en el apasionante mundo de la programación de ordenadores. Este tutorial, en el que haremos una descripción de los elementos básicos de MATLAB, y que se realizará durante las primeras sesiones del curso de LP, tiene como objetivo que el estudiante se sienta cómodo con el programa y con el sistema de usuarios, carpetas y archivos del CC. Ası́, al final del tutorial será capaz de utilizar MATLAB como si fuese una calculadora potentı́sima, manejando sus elementos de cálculo en lı́nea de comandos, sin entrar en la programación de aplicaciones, a lo cual nos dedicaremos el resto del curso. 0.2. Conceptos básicos Para arrancar MATLAB, se procede como con cualquier programa Windows, o sea, Inicio, Programas, MATLAB, R2006a, MATLAB R2006a 1 , o con el correspondiente icono en el escritorio, que tiene como etiqueta MATLAB R2006a. Una vez arrancado, nos encontramos con algo similar a lo que se observa en la figura 1. En el espacio que denotamos como ventana de comandos en dicha figura aparece el cursor con el sı́mbolo (>>) o (EDU >>), indicando que se pueden introducir órdenes. De hecho, en este tutorial, cuando aparezca este sı́mbolo, se tiene que introducir por teclado la orden que aparece escrita a la derecha del mismo. Podeis, de momento, cerrar las otras ventanas que aparecen en la pantalla, para quedaros simplemente con la ventana de comandos. La utilización más básica de MATLAB es como calculadora 2 . Ası́, por ejemplo, para calcular cos(5) · 27.3 , se debe introducir 3 : >>cos(5)*2ˆ7.3 ans = 44.7013 1 A veces, durante el curso hay algunos problemas con las licencias y se usa la versión educacional, a la cual se accede con Inicio, Programas, Student MATLAB, o a través del icono q está en el escritorio 2 Funcionando de este modo, es similar a una calculadora programable, aunque bastante más versátil. 3 Los argumentos de las funciones trigonométricas siempre están en radianes. Pág. 13 Lenguajes de Programación: Guı́a ECTS Figura 1: Espacio de trabajo de MATLAB Pág. 14 UNIDAD DIDÁCTICA 0. TUTORIAL DE MATLAB MATLAB mantiene en memoria el último resultado. Caso de que ese cálculo no se asigne a ninguna variable, lo hace a una variable por defecto de nombre ans. Si queremos referirnos a ese resultado, lo haremos a través de la variable ans, y si no se asigna ese nuevo cálculo a ninguna variable, volverá a ser asignado a ans. >>log(ans) ans = 3.8000 En este momento cabrı́a preguntarnos si tratamos con un logaritmo decimal o con uno neperiano (natural). Para saberlo, pedimos ayuda acerca del comando log utilizando: >>help log LOG Natural logarithm. LOG(X) is the natural logarithm of the elements of X. Complex results are produced if X is not positive. See also LOG2, LOG10, EXP, LOGM. Aunque en la explicación que se obtiene al pedir “help”de las órdenes los comandos aparecen en mayúsculas, se deben usar en minúsculas. Por defecto, los resultados aparecen con 4 cifras decimales. Si se necesitara más precisión en los resultados, se puede utilizar la orden format long repitiendo los cálculos: >>format long Para recuperar una orden y ejecutarla otra vez o modificarla se usan la flechas arriba y abajo del cursor ⇑, ⇓. Presionemos ⇑ hasta recuperar la orden: >>cos(5)*2ˆ7.3 ans = 44.70132670851334 Ejercicio 0.1 Realizar la siguiente operación: 2.72.1 + log10 108.2. Ejercicio 0.2 Pedir ayuda de la orden exp. Ejercicio 0.3 Realizar la siguiente operación e2.7 2.1 +log 10 108.2 . El resultado del ejercicio anterior aparecerá como 2.3992e+004. La notación 2.3992+004, significa 2.3992 ∗ 104 o lo que es lo mismo 23992. Si necesitamos referirnos a determinados cálculos, se asignan a variables y ası́ se pueden recuperar después. El concepto de variable es crucial cuando se programa, como veremos durante todo el curso. Por ejemplo, podemos recuperar con ⇑ la orden cos(5) · 27.3 y asignar su valor a la variable x editando dicha orden. Luego podremos utilizarla para otros cálculos. Los nombres de las variables en MATLAB han de comenzar por una letra; además, no contendrán sı́mbolos que nos sean letras, números o el guión bajo (que está en la misma tecla que el signo menos). Pág. 15 Lenguajes de Programación: Guı́a ECTS >>x=cos(5)*2ˆ7.3 x = 44.70132670851334 >>y=log(x) y = 3.80000318145901 Ejercicio 0.4 Realizar la siguiente operación: 2.72.1 + log10 108.2 y asignarla a la variable x. Ejercicio 0.5 Realizar la siguiente operación: e2.7 2.1 +log 10 108.2 y asignarla a la variable t. Si queremos saber cuánto vale una variable, no tenemos más que escribirla en la lı́nea de comandos y pulsar Enter. >>y y = 3.80000318145901 Como es muy fácil recuperar órdenes previas podemos utilizar esta idea para simular los términos de una sucesión recurrente. Por ejemplo, xn+1 = cos(xn ) >>x=0.2 x = 0.20000000000000 >>x=cos(x) x = 0.98006657784124 >>x=cos(x) x = 0.55696725280964 >>x=cos(x) x = 0.84886216565827 >>x=cos(x) x = 0.66083755111662 >>x=cos(x) x = 0.78947843776687 >>x=cos(x) x = 0.70421571334199 Ejercicio 0.6 Repetir la operación anterior hasta que se estabilice el cuarto decimal de x de un paso al siguiente. Ejercicio 0.7 Cambiar el formato para que otra vez se vean sólo cuatro decimales. Ejercicio 0.8 Empezando por x = 100 repetir la operación x2 − 81 2x hasta que se converja en el cuarto decimal. ¿Qué relación hay entre el último x y 81? x=x− Pág. 16 UNIDAD DIDÁCTICA 0. TUTORIAL DE MATLAB Ejercicio 0.9 Definir A como en vuestro documento de identidad o pasaporte. Empezando por x = 100 repetir la operación x2 − A x=x− 2x hasta que se converja en el cuarto decimal. ¿A qué ha convergido la sucesión? 4 Es interesante comentar de este ejercicio que MATLAB distingue entre letras mayúsculas y minúsculas en los nombres de las variables. A veces es bueno apagar y encender la calculadora para borrar todo y empezar de nuevo. Esto se hace con la orden clear. Hay que tener cuidado al utilizarla, ya que borra todas las variables que estén en la memoria sin pedir confirmación. >>clear >>x ??? Undefined function or variable ’x’. Ejercicio 0.10 Preguntar el valor de A igual que acabamos de preguntar x. ¿Tiene sentido el resultado? 0.3. Manejo de vectores Para crear y almacenar en memoria un vector v que tenga como componentes v1 = 0, v2 = 2, v3 = 4, v4 = 6 y v5 = 8 podemos hacerlo componente a componente: >>v(1)=0 v = 0 >>v(2)=2 v = 0 >>v(3)=4 v = 0 >>v(4)=6 v = 0 >>v(5)=8 v = 0 2 2 4 2 4 6 2 4 6 8 Se puede también definir este vector especificando su primer elemento, un incremento y el último elemento. MATLAB rellenará paso a paso sus componentes. Ası́, podemos definir igualmente el vector v como una secuencia que empieza en 0, avanza de 2 en 2 y que termina en el 8: 4 Las calculadoras obtienen la raı́z cuadrada de un número mediante esta sucesión. Pág. 17 Lenguajes de Programación: Guı́a ECTS >> v = [0:2:8] v = 0 2 >> v v = 0 2 4 6 8 4 6 8 Si ponemos ; al final de una lı́nea de comandos, cuando pulsemos la tecla Enter para ejecutarla, se ejecutará pero no mostrará el resultado en pantalla (se anula el eco en pantalla). Esto es muy útil algunas veces: >> v = [0:2:8]; >> v v = 0 2 4 6 8 Podemos construir el vector v editando directamente entre los corchetes las componentes del vector v: >>v = [0 2 4 6 8]; >> v v = 0 2 4 6 8 Es fácil acceder al contenido de una posición del vector, por ejemplo la primera. >> v(1) ans = 0 O modificarla: >> v(1)=-3; >> v v = -3 2 4 6 8 O hacer operaciones entre componentes, v2 · v53 : >> v(2)*v(5)ˆ3 ans = 1024 Ejercicio 0.11 Calcular la suma de los elementos de v, elemento a elemento. Para trasponer un vector o una matriz se usa el apóstrofo, que es el acento que está en la misma tecla que el signo de interrogación “?”. >> v’ ans = -3 2 4 6 8 Pág. 18 UNIDAD DIDÁCTICA 0. TUTORIAL DE MATLAB Como hemos comentado, para recuperar una orden y ejecutarla otra vez o modificarla se usan la flechas arriba y abajo del cursor ⇑, ⇓. Presionemos ⇑ hasta recuperar la orden: >> v(1)=-3; Modifiquémosla para dejar el valor original >> v(1)=0; Al definir ese vector v de 5 componentes, en realidad lo que definimos es una matriz fila de cinco columnas, o sea, un matriz de 1 × 5. Esto se comprueba preguntando el tamaño de v con la sentencia size: >>size(v) ans = 1 5 que nos indica que v tiene una fila y 5 columnas. Ejercicio 0.12 Definir un nuevo vector que sea el traspuesto de v y aplicar a ese vector el comando size. ¿Es coherente el resultado? Ejercicio 0.13 Pedir ayuda sobre la función norm y aplicarla al vector v. 0.4. Introducción al tratamiento de matrices Haremos una introducción a la definición y manipulación de matrices. Se supone que se ha seguido la sección anterior y que se dispone de los conocimientos básicos sobre la definición y manipulación de vectores usando MATLAB. La definición de una matriz es muy similar a la de un vector. Para definir una matriz, se puede hacer dando sus filas separadas por un punto y coma (¡no olvidarse poner los espacios en blanco!): >> A = [ 1 2 3; 3 4 5; 6 7 8] A = 1 2 3 3 4 5 6 7 8 o definirla directamente fila a fila, que es más intuitivo: >> A = [ 1 3 6 A = 1 3 6 2 3 4 5 7 8] 2 4 7 3 5 8 Se puede modificar alguno de los elementos de la matriz A, accediendo a cualquiera de sus posiciones, por ejemplo: Pág. 19 Lenguajes de Programación: Guı́a ECTS >> A(2,2)=-9 A = 1 2 3 -9 6 7 3 5 8 Dejemos su valor original: >> A(2,2)=4; De igual modo, se la puede considerar como una fila de vectores columna: >> B = [ [1 2 3]’ [2 4 7]’ [3 5 8]’] B = 1 2 3 2 4 5 3 7 8 (Otra vez, es importante colocar los espacios en blanco.) Ejercicio 0.14 Sumar los elementos diagonales de la matriz A, refiriéndonos a ellos, elemento a elemento. Podemos sumar o restar matrices para tener otras matrices. >>C=A+B C = 2 5 9 4 8 14 6 10 16 Ejercicio 0.15 Definir la matriz D = 2B − A. También podemos multiplicarlas. >>C=A*B C = 14 26 44 31 57 96 37 69 117 Ejercicio 0.16 Definir la matriz D = B − A · B. Ejercicio 0.17 Definir la matriz C = AAt . Podemos definir algunos tipos especiales de matrices, como por ejemplo una matriz de 3 × 3 que tenga todos sus elementos nulos. >>I=zeros(3) I = 0 0 0 0 0 0 0 0 0 Pág. 20 UNIDAD DIDÁCTICA 0. TUTORIAL DE MATLAB Podemos modificar sus elementos diagonales para tener la matriz identidad. >>I(1,1)=1; >>I(2,2)=1; >>I(3,3)=1 I = 1 0 0 1 0 0 0 0 1 Ejercicio 0.18 Repetir el ejercicio 0.16 sacando factor común y utilizando la matriz identidad. Otra forma de definir la matriz identidad es a través de la función diag, que recibe un vector que convierte en diagonal de una matriz cuyos otros elementos son nulos. >>J=diag([1 1 1]) J = 1 0 0 0 1 0 0 0 1 Ejercicio 0.19 Definir una matriz D diagonal cuyos elementos sean −2, 1, 0.2 y −0.7. Ejercicio 0.20 Pedir ayuda de la función eye, y definir la matriz identidad de 10 × 10. Ejercicio 0.21 Repetir el ejercicio 0.16 sacando factor común y utilizando la función eye. 0.4.1. Definición de submatrices La definición de “subvectores” o submatrices es muy fácil. Si v es >> v = [0:2:8] v = 0 2 4 6 8 Podemos definir un vector e cuyas componentes sean las tres primeras componentes del vector v poniendo >> e=v(1:1:3) e = 0 2 4 donde el primer uno indica que vamos a tomar el primer elemento de v. El segundo número es el incremento de ı́ndices dentro de v y el último número marca el elemento final. Esta orden es equivalente a la siguiente >> e=v(1:3) e = 0 2 4 ya que cuando el incremento es la unidad, se puede suprimir. Pág. 21 Lenguajes de Programación: Guı́a ECTS Ejercicio 0.22 Adivinar cuál va a ser el resultado de las dos órdenes siguientes >> e=v(2:2:5) >> e=v(1:3:5) Como comentamos al principio, la notación usada por MATLAB sigue en lo posible la notación estándar de Álgebra Lineal que se asume conocida. Es muy sencillo multiplicar matrices y vectores, teniendo cuidado de que las dimensiones sean las adecuadas. >> A*v(1:3) ??? Error using == * Inner matrix dimensions must agree. >> A*v(1:3)’ ans = 16 28 46 Es importante acostumbrase a ver ese mensaje de error. Una vez que se empieza a trabajar con vectores y matrices, es sencillo olvidar los tamaños de los objetos que se han ido creando. Ejercicio 0.23 Utilizando el comando size, razona sobre los problemas en lo que se refiere a dimensiones en la multiplicación anterior. Se pueden extraer columnas o filas de una matriz. Si queremos, por ejemplo, que C sea la tercera fila de la matriz A: >> C=A(3,:) C = 6 7 8 O que C sea la segunda columna de la matriz B >>C=B(:,2) C = 2 4 7 O bien que D sea la submatriz cuadrada de orden dos inferior derecha de la matriz A. >> D=A(2:3,2:3) D = 4 5 7 8 Ejercicio 0.24 Definir una matriz de nombre D1 formada por la primera y tercera columnas de la matriz A. Una vez que se es capaz de crear y manipular una matriz, se pueden realizar muchas operaciones estándar. Por ejemplo, calcular su inversa. Hay que tener cuidado y no olvidar que las operaciones son cálculos numéricos realizados por ordenador. En el ejemplo, A no es una matriz regular, y sin embargo MATLAB devolverá su inversa, pues los errores de redondeo durante su cálculo convierten en invertible a dicha matriz. Pág. 22 UNIDAD DIDÁCTICA 0. TUTORIAL DE MATLAB >> inv(A) Warning: Matrix is close to singular or badly scaled. Results may be inaccurate. RCOND = 4.565062e-18 ans = 1.0e+15 * -2.7022 4.5036 -1.8014 5.4043 -9.0072 3.6029 -2.7022 4.5036 -1.8014 Con la matriz B sı́ que es posible calcular su inversa: >>inv(B) ans = -3.0000 -1.0000 2.0000 5.0000 -1.0000 -1.0000 -2.0000 1.0000 0 Ejercicio 0.25 Definir una matriz de nombre B1 como la inversa de B. Multiplicar B por B1 y razonar la coherencia del resultado. Hay que comentar que MATLAB distingue entre mayúsculas y minúsculas. Este puede ser el origen de algunas confusiones si se manejan algoritmos complejos. >> inv(a) ??? Undefined function or variable a. 0.5. Resolución de sistemas lineales También hay funciones para resolver sistemas lineales. Si Ax = b y queremos encontrar x, el modo más directo es simplemente invertir A, y luego premultiplicar por la inversa ambos lados. Sin embargo, hay medios mucho más eficientes y estables para resolver sistemas lineales pero nosotros de momento nos quedaremos con éste. Por ejemplo, el sistema lineal Bx = v con: >>v = [1 3 5]’ v = 1 3 5 >>B = [ [1 2 3]’ [2 4 7]’ [3 5 8]’]; se resuelve con: >> x = inv(B)*v x = 2 1 -1 Para comprobar: Pág. 23 Lenguajes de Programación: Guı́a ECTS >> B*x ans = 1 3 5 Ejercicio 0.26 Definir una matriz B2 = BB t . Ejercicio 0.27 Encontrar la solución del sistema lineal BB t x = v asignando esa solución al vector x. Ejercicio 0.28 Comprobar la solución obtenida realizando el cálculo BB T x − v. Podemos crear una matriz aumentada a partir de B y del término independiente y reducirla hasta convertir el sistema en uno equivalente triangular, efectuando las necesarias transformaciones elementales de fila >>BA=[B v] BA = 1 2 3 1 2 4 5 3 3 7 8 5 >>BA(2,:)=BA(2,:)-2*BA(1,:) BA = 1 2 3 1 0 0 -1 1 3 7 8 5 >>BA(3,:)=BA(3,:)-3*BA(1,:) BA = 1 2 3 1 0 0 -1 1 0 1 -1 2 La segunda fila tiene el elemento diagonal nulo, ası́ que hay que realizar una permutación de filas, premultiplicando por la identidad permutada: >>IP=[1 0 0;0 0 1;0 1 0]; >>BA=IP*BA BA = 1 0 0 2 1 0 3 -1 -1 1 2 1 Ahora ya es inmediato resolver este sistema por sustitución hacia atrás: Ejercicio 0.29 Definir una matriz H de 3 × 3 a partir de las tres primeras columnas de la matriz BA. Ejercicio 0.30 Definir un vector h utilizando la última columna de BA. Pág. 24 UNIDAD DIDÁCTICA 0. TUTORIAL DE MATLAB Ejercicio 0.31 Definir el vector z tal que Hz = h. ¿Es coherente el resultado? Ejercicio 0.32 Pedir ayuda de la función det utilizándola con la matriz B y de la función rank utilizándola con la matriz BA. Ejercicio 0.33 Calcular el determinante de la matriz H. 0.6. Vectorización de operaciones Ejercicio 0.34 Borrar la memoria porque vamos a empezar operaciones nuevas reutilizando nombres de variables ya usadas. Con MATLAB es sencillo crear vectores y matrices. La potencia de MATLAB nace de la facilidad con la que se pueden manipular estos vectores y matrices. Primero mostraremos cómo realizar operaciones sencillas, sumar, restar y multiplicar. Luego las combinaremos para mostrar que se pueden realizar operaciones complejar a partir de estas operaciones simples sin mucho esfuerzo. Primero definiremos dos vectores, los cuales sumaremos y restaremos: >> v = [1 2 3]’ v = 1 2 3 >> b = [2 4 6]’ b = 2 4 6 >> v+b ans = 3 6 9 >> v-b ans = -1 -2 -3 La multiplicación de vectores y matrices, igual que su suma, sigue las reglas estrictas del Álgebra Lineal. En el ejemplo anterior, los vectores son ambos vectores columna con tres elementos. No se puede sumar un vector fila con un vector columna. Se debe recordar que el número de columnas del primer operando debe ser igual al número de filas del segundo. >> v*b Error using == * Inner matrix dimensions must agree. >> v*b’ ans = Pág. 25 Lenguajes de Programación: Guı́a ECTS 2 4 6 >> v’*b ans = 28 4 8 12 6 12 18 MATLAB permite realizar las operaciones entre elementos de un vector o matriz de modo muy sencillo. Supongamos que queremos multiplicar, por ejemplo, cada elemento del vector v con su correspondiente elemento en el vector b. En otras palabras, supongamos que se quiere conocer v(1) ∗ b(1), v(2) ∗ b(2), y v(3) ∗ b(3). Serı́a estupendo poder usar directamente el sı́mbolo “∗” pues en realidad estamos haciendo una especie de multiplicación, pero como esta multiplicación tiene otro sentido, necesitamos algo diferente. Los programadores que crearon MATLAB decidieron usar el sı́mbolo “·∗” para realizar estas operaciones. De hecho, un punto delante de cualquier sı́mbolo significa que las operaciones se realizan elemento a elemento. >> v.*b ans = 2 8 18 >> v./b ans = 0.5000 0.5000 0.5000 Ejercicio 0.35 Definir un vector w tal que sus componentes sean las de v al cubo. Una vez que hemos abierto la puerta a operaciones no lineales, ¿por qué no ir hasta el final? Si aplicamos una función matemática predefinida a un vector, MATLAB nos devolverá un vector del mismo tamaño en el que cada elemento se obtiene aplicando la función al elemento correspondiente del vector original >> sin(v) ans = 0.8415 0.9093 0.1411 >> log(v) ans = 0 0.6931 1.0986 Saber manejar hábilmente estas funciones vectoriales es una de las ventajas de MATLAB. De este modo, se pueden definir operaciones sencillas que se pueden realizar fácil y rápidamente. En el siguiente ejemplo, se define un vector muy grande y lo manipulamos de este modo tan sencillo. Pág. 26 UNIDAD DIDÁCTICA 0. TUTORIAL DE MATLAB >> x = [0:0.1:100] x = Columns 1 through 7 0 0.1000 0.2000 0.3000 ...................... Columns 995 through 1001 99.4000 99.5000 99.6000 99.7000 >> y = sin(x).*x./(1+cos(x)); 0.4000 0.5000 0.6000 99.8000 99.9000 100.0000 Usando este tratamiento vectorial, se pueden generar gráficos de modo muy sencillo. Damos una muestra de esto que luego completaremos. >> plot(x,y) Ejercicio 0.36 Definir un vector t cuya primera componente sea −4, que tenga un incremento entre componentes de 0.05 y termine en el punto 1. Ejercicio 0.37 Definir un vector y a partir de cada componente del vector t recién definido 2 y = 5e−t + sin(10t) 0.7. Creación de gráficas En esta sección presentamos los comandos básicos para crear representaciones gráficas de funciones. Para mostrar el uso del comando plot, utilizaremos la función seno y su desarrollo en serie de Taylor5 en torno al cero con términos cúbicos, x − x3 /6. Para dibujar la gráfica, seleccionamos el paso del vector de muestreo x y sus valores primero y último >>h=0.1 >>xmin=-2; >>xmax=2; >>x=xmin:h:xmax; >>yseno=sin(x); >>ytaylor=x-x.ˆ3/6; Tras esto, tenemos en los vectores yseno e ytaylor los valores reales y los valores aproximados obtenidos del desarrollo limitado. Para compararlos, dibujamos los valores exactos superpuestos con los aproximados marcados por puntos verdes ‘o’. El comando plot se utiliza para generar gráficas en MATLAB. Admite una gran variedad de argumentos. Aquı́ sólo utilizaremos el rango y el formato, y la posibilidad de representar dos curvas en la misma gráfica. 5 Brook Taylor nació en 1685 en Inglaterra en el seno de una influyente y adinerada familia. Estudió en Cambridge y cuando se graduó ya habı́a escrito su primer artı́culo matemático de relevancia. Taylor participó activamente en las agrias disputas entre matemáticos británicos (“newtonianos”) y matemáticos europeos (“leibnitzianos”) sobre la adjudicación del descubrimiento del Cálculo Diferencial, llegando a formar parte del Comité que la Real Sociedad formó para dar fin a tal discusión. Aunque las aportaciones de Taylor a las matemáticas son profundas y variadas (entre otras, introdujo el cálculo en diferencias finitas, la integración por partes, desarrolló un método para encontrar soluciones singulares de ecuaciones diferenciales y sentó las bases de la geometrı́a descriptiva y proyectiva) su resultado más conocido es el Teorema de Taylor, que permite el desarrollo de funciones en series polinómicas. Sin embargo, no fue Taylor el primero en obtenerlo, James Gregory, Newton, Leibniz, Johann Bernoulli, y de Moivre habı́an ya descubierto independientemente variantes del mismo. Pág. 27 Lenguajes de Programación: Guı́a ECTS >>plot(x,yseno,’go’,x,ytaylor); La g se refiere al color verde (green), y la o significa que los puntos se van a marcar con un circulito. La tilde antes y después de go en el comando anterior es la que está en la tecla de la interrogación de cierre. Ejercicio 0.38 En la ventana en la que aparece la figura, seleccionar Edit, Copy Figure. Abrir un nuevo documento de Word y pegar la figura en ese documento. También es buena idea representar la función error: >>plot(x,abs(yseno-ytaylor),’mx’); Para que al final del fichero con todas las órdenes aparezca en pantalla el gráfico, una vez que éste ya ha sido ejecutado alguna vez, se utiliza la orden shg, que hace que la ventana del gráfico se convierta en la activa. Usemos este comando para utilizar el comando de petición de ayuda help que es muy útil también por sus referencias cruzadas a otros comandos. >> help shg SHG Show graph window. SHG brings the current figure window forward. Ejercicio 0.39 Pedir ayuda de los comandos grid y plot. Ejercicio 0.40 Dibujar la curva t, y del ejercicio 0.37. Ejercicio 0.41 Dibujar la curva t, y del ejercicio 0.37 con cruces rojas y con una retı́cula incorporada (grid). También se puede copiar este gráfico al portapapeles desde la ventana del gráfico, para después pegarlo en un documento Word por ejemplo, como ya vimos en el ejercicio 0.38. 0.8. Conjuntos de órdenes En esta sección explicaremos cómo reunir órdenes en ficheros ejecutables desde la lı́nea de comandos de MATLAB. A estos ficheros se les suele llamar scripts. Ello permite realizar operaciones más complejas, y facilita sus repeticiones. Para empezar a trabajar sobre esta parte del tutorial, lo primero que haremos es ejecutar clear para borrar las variables activas. Como ejemplo, consideramos el fichero correspondiente al dibujo de las gráficas de la sección 0.7. Para ejecutar los comandos del fichero se debe especificar el intervalo entre los valores de las abscisas en el muestreo. De este modo, se pueden construir infinidad de aproximaciones variando este parámetro. Primero hay que crear el fichero. El editor más conveniente es el que trae incorporado el propio MATLAB, aunque cualquier editor de texto es válido dado que la codificación de los archivos de comandos de MATLAB es el estándar ASCII como sucede habitualmente en los lenguajes de programación. El editor de MATLAB es muy simple y suficiente para este tipo de aplicaciones. A partir de la versión 5, viene incorporado al propio MATLAB y mejora de versión en versión. Los ficheros ejecutables de MATLAB, los M-files, deben tener la extensión “.m”. En este ejemplo crearemos un fichero de nombre tutorm.m. Para abrir el editor pinchamos en (File, New, M-file) y debemos ir escribiendo y/o copiando-pegando los comandos necesarios. Se debe tener en cuenta que cuando una sentencia comienza por %, es un comentario, y no se va a ejecutar. Por tanto, en este ejemplo, no es necesario reproducir esas lı́neas. Pág. 28 UNIDAD DIDÁCTICA 0. TUTORIAL DE MATLAB % file: tutorm.m % Seno y desarrollo del seno. % % Para ejecutarlo tienes que fijar el paso % h : intervalo entre las x % % El programa genera tres vectores, % x con las abscisas, yseno con % el seno evaluado en esas abscisas, % e ytaylor con el desarrollo % hasta el termino cubico del seno en torno al cero. % xmin=-2; xmax=2; x=xmin:h:xmax; yseno=sin(x); ytaylor=x-x.ˆ3/6; Una vez que se hayan introducido las sentencias, se guarda el fichero en la carpeta que creamos conveniente, aunque hay que comunicar a MATLAB la ruta en la que se encuentra para que MATLAB lo encuentre. Esto se puede hacer de varias maneras, dependiendo de la versión de MATLAB que estemos usando. En las versiones 6.5 y superiores se puede hacer modificando la carpeta-directorio activo en la caja correspondiente (ver figura 1); para volver a activar la vista inicial de MATLAB se procede como se indica en la figura 2. En versiones previas, se puede indicar la ruta del archivo en el path browser con el icono correspondiente, o desde el menú File con la opción Set Path. Por defecto, si se guarda en el directorio ..\matlab\bin, MATLAB lo encontrará 6 . Ahora se ha de volver a la ventana con la lı́nea de comando y se teclea en esta lı́nea el nombre del fichero quitando .m. En este caso tutorm. >>tutorm ??? Undefined function or variable ’h’. Error in ==> C:\MATLAB\bin\tut.m On line 13 ==> x=xmin:h:xmax; Si se se invoca el fichero sin haber definido primero la variable h, aparecerá un mensaje de error. Se deben definir todas las variables que no se definen en el propio script y que éste utiliza. >>h = 0.1; >>tutorm >>plot(x,yseno,’rx’,x,ytaylor) Una vez ejecutada esta instrucción deberá aparecer una ventana con una gráfica como la de la Figura 3. Cuando tecleamos tutorm en la lı́nea de comandos, MATLAB buscará en los directorios indicados en el path un fichero llamado tutorm.m. Una vez que lo encuentre lo leerá y ejecutará los comandos como si se hubiesen tecleado uno detrás de otro en la lı́nea de comandos. Si se desea ejecutar el programa otra vez pero con un paso diferente, hay que tener 6 Si se utiliza MATLAB en el centro de cálculo o laboratorio de una facultad o escuela, probablemente el usuario no tenga permiso de escritura en ese directorio y no pueda guardar ahı́ sus ficheros. En este caso, se pueden guardar en la carpeta que se desee que después se incorpora a la ruta de búsqueda (path), bien con el comando path o con el icono correspondiente. Pág. 29 Lenguajes de Programación: Guı́a ECTS Figura 2: Recuperar vista de la figura 1 cuidado. El programa sobreescribirá los vectores x, yseno e yatylor. Si se quieren guardar estos vectores hay que especificarlo, almacenándolos en nuevas variables. >>xp = x; >>ysenop = yseno; >>ytaylorp = ytaylor; Ahora podemos seleccionar un nuevo paso h y volver a ejecutar tutor. >>h = 0.01; >>tutorm Tenemos dos aproximaciones; la primera con un paso h de 0.1 que se almacena en los vectores xp, ysenop e ytaylorp y la segunda relativa a un paso de 0.01 que guardamos en los vectores x, yseno e ytaylor. Ejercicio 0.42 Calcular la dimensión que tienen que tener los vectores x y xp y confirmar el resultado utilizando la orden size. Ejercicio 0.43 Crear y ejecutar desde MATLAB un fichero que se llame BAIP.m con la secuencia de comandos siguiente: v = [1 3 5]’; B = [ [1 2 3]’ [2 4 7]’ [3 5 8]’]; BA=[B v] BA(2,:)=BA(2,:)-2*BA(1,:) BA(3,:)=BA(3,:)-3*BA(1,:) IP=[1 0 0;0 0 1;0 1 0]; BA=IP*BA Pág. 30 UNIDAD DIDÁCTICA 0. TUTORIAL DE MATLAB Figura 3: Gráfica correspondiente al ejemplo tutorm.m. Ejercicio 0.44 Pedir ayuda del comando pause e incorporarlo entre algunas lı́neas del ejercicio anterior para ver todos los pasos de la secuencia de comandos. Ejercicio 0.45 Crear y ejecutar desde MATLAB un fichero que se llame CURVATY.m con una secuencia de comandos que realicen las operaciones siguientes: 1. Borrar todas las variables activas de la memoria. 2. Definir un vector t cuya primera componente sea −4, que tenga un incremento entre componentes de 0.05 y termine en el punto 1. 3. Definir un vector y a partir de cada componente del vector t recién definido como: 2 y = 5e−t + sin(10t) 4. Dibujar la curva (t, y) con cruces rojas y con una retı́cula ( grid) incorporada. 0.9. MATLAB y números complejos MATLAB entiende la aritmética compleja y es perfectamente posible trabajar con números complejos. Podemos multiplicar dos números complejos como: >>(2+3*i)*(3-7*i) ans = 27.0000 - 5.0000i O dividirlos como: >>(2+3*i)*(3-7*i) ans = -0.2586 + 0.3966i Pág. 31 Lenguajes de Programación: Guı́a ECTS 0.10. Matemáticas simbólicas con MATLAB MATLAB dispone de herramientas para cálculo simbólico. Para ello es necesario instalar el Symbolic Math Toolbox, que es una especie de versión reducida de Maple, un programa de cálculo simbólico muy conocido. Aquı́ podemos usar esta caja de herramientas para resolver integrales y calcular determinantes de modo simbólico entre otras cosas. Lo primero que tenemos que hacer es definir una variable como susceptible de ser utilizada en cálculo simbólico: >>syms x Ahora podemos definir una función que dependa de x y cuya integral queramos calcular: >>f=cos(x)ˆ2; >>int(f) ans= 1/2*cos(x)*sin(x)+1/2*x Podemos también definir una matriz que dependa de x y de una nueva variable y: >>syms y >> A=[x y x-y 2 xˆ2 y -x -y 0] A = [ x, y, x-y] [ 2, xˆ2, y] [ -x, -y, 0] Y podemos calcular su determinante de modo simbólico: >> det(A) ans = -2*y*x+2*yˆ2+xˆ4-xˆ3*y Ejercicio 0.46 Calcular de modo simbólico la inversa de la matriz A. Podemos evaluar este determinante para valores reales de x e y asignando valores a esas variables y utilizando después la orden eval: >> x=2.41 x = 2.4100 >> y=-3.2 y = -3.2000 >> eval(det(A)) ans = 114.4301 En el momento en que hemos asignado valores a las variables, éstas dejan de ser sı́mbolos. Si queremos que vuelvan a serlo tenemos que hacerlo de modo explı́cito Pág. 32 UNIDAD DIDÁCTICA 0. TUTORIAL DE MATLAB >>syms x 2 Ejercicio 0.47 Definir una función f como e−x . Ejercicio 0.48 Pedir ayuda de la función diff y calcular la derivada de f . Evaluar esta derivada para x = −3.327. Ejercicio 0.49 Pedir ayuda de la función limit y calcular el lı́mite de f cuando x → ∞. Pág. 33 Lenguajes de Programación: Guı́a ECTS Pág. 34 Unidad Didáctica 1 Funciones y Condicionales 1.1. General Una vez que en el tutorial de la unidad 0 hemos usado MATLAB como una calculadora potente, pero al fin y al cabo una calculadora, ha llegado el momento de aprender a programar. En ese sentido, la unidad 1, dedicada al concepto de función y la estructura de control condicional, y la unidad 2, dedicada al estudio de los bucles, son las más importantes. Constituyen la base sobre la que se cimenta el resto del curso. En la unidad 1 se tratan principalmente las ideas de funciones, variables, argumentos de las funciones, asignación y la primera estructura de control del curso: el condicional. También se realiza primeramente una contextualización del curso desde la perspectiva de la historia de la Programación y sus fundamentos. 1.2. Funciones y variables La organización habitual de un curso de Programación supone que se comience por los tı́picos programas de entrada y salida, el programa “Hola mundo”. Sin embargo, en este curso que ahora comienza nos hemos decidido por una estructura similar a la programación funcional, comenzando por el concepto de función y estudiando la entrada y salida ya con el curso muy avanzado. La ventaja de este enfoque es que los alumnos comienzan por los conceptos fundamentales: funciones, estructuras de control y vectores. Como el aprendizaje es continuo, añadiendo sucesivamente nuevos conceptos y estructuras, conseguiremos que al final los alumnos estén más familiarizados con las estructuras esenciales de la Programación. Esto es posible porque MATLAB proporciona una interfaz estándar para las funciones y desde la lı́nea de comandos es posible ejecutarlas directamente. El entender las cosas desde la perspectiva funcional proporciona la posibilidad de asimilar desde el principio conceptos claves en Programación, como el de encapsulamiento de tareas, la división de tareas y su codificación en funciones, crucial cuando se abordan problemas grandes y se trabaja en equipo. También se trabajan ideas esenciales relativas a el diseño de funciones y a la reusabilidad de código ya escrito, visto ya como cajas negras que realizan determinadas tareas, y que servirá de base para construir nuevas funciones, etc... La que ahora presentamos es la función más sencilla que veremos durante el curso. Tiene un argumento de entrada, x y un argumento de salida y. Lo único que se hace es calcular una expresión matemática sencilla y asignar ese valor a y. % ud1_f1.m Pág. 35 Lenguajes de Programación: Guı́a ECTS % Una función sencilla % un argumento function y=ud1_f1(x) y=xˆ2-log(x); El sı́mbolo = en Programación es una asignación, no siendo por tanto simétrico; se asigna a lo que está a la izquierda del sı́mbolo igual lo que haya a la derecha del mismo, una vez realizadas las operaciones que estén especificadas en esa parte derecha. El nombre de la función, para evitar confusiones, debe coincidir con el nombre del archivo .m donde esta función se encuentra. Por tanto, como este primer ejemplo es la función ud1_f1, debemos guardarla en el archivo ud1_f1.m. La primera lı́nea comienza con la palabra reservada function lo cual es común a todas las funciones que veremos en el curso. Lo más interesante es entender a partir de este ejemplo cómo se pasan los argumentos desde la lı́nea de comandos hasta las funciones. Cuando invocamos esta función desde la lı́nea de comandos podrı́amos hacerlo del siguiente modo, obteniendo la siguiente respuesta: >> ud1_f1(5) ans = 23.3906 Cuando se pulsa Enter, tecla de retorno de carro, se carga en memoria RAM la función ud1_f1.m, y se crea espacio en memoria para la variable x. En ese espacio se coloca el valor 5. Se crea espacio también para y. Las variables x e y se llaman variables locales de la función; el adjetivo locales procede de que viven en el espacio de memoria de la función. Una vez hecho esto, el ordenador ejecuta las sentencias de la función (en este caso una sola) de arriba abajo. Durante esta ejecución se define la variable de salida y, en la cual al final de la misma está el resultado, 23.3906. Una vez terminada la ejecución se devuelve el control a la lı́nea de comandos, se asigna en este caso el resultado a la variable por defecto ans y se borra de la memoria RAM la función ud1 f11 . Podemos invocar a la función ud1_f1.m ahora del siguiente modo: >> t=5; >> z=ud1_f1(t) z = 23.3906 En ese caso, tendremos 4 variables x, y, z y t. Las variables x e y son locales de la función y las variables z y t viven en el espacio de memoria asignado a la ventana de comandos. Cuando se llama a la función, x copia el valor de t y cuando se termina la ejecución de la función es z la que copia el valor de la calculada y antes de que esta desaparezca (ver figura 1.1). La situación no cambia sustancialmente si invocamos a la función del siguiente modo: >> x=5; >> y=ud1_f1(x) y = 23.3906 Volvemos a tener 4 variables en memoria, x e y en el espacio de memoria de la ventana de comandos y x e y en el espacio de memoria de la función ud1_f1.m mientras ésta se ejecuta. 1 Esto no es exactamente ası́, pero esta es la imagen más adecuada para un principiante en Programación. Pág. 36 UNIDAD DIDÁCTICA 1. FUNCIONES Y CONDICIONALES Figura 1.1: Ejemplo ud1 f1.m. Uso de la memoria RAM De hecho, si cambiamos el valor de la x en el código de la función, la variable t del párrafo anterior y la variable x del espacio de memoria de la ventana de comandos no se ven afectadas. O sea que si cambiamos la función ud1_f1.m y la grabamos ahora como: function y=ud1_f1(x) x=2; y=xˆ2-log(x); Si la invocamos desde la lı́nea de comandos del siguiente modo, >> x=5; >> y=ud1_f1(x) y = 3.3069 >> x x = 5 el resultado no será correcto, pero x tampoco habrá cambiado su valor. Ello es ası́ porque la variable local x vive en la función. Al principio de la misma, copia el valor de la variable x del espacio de comandos, y aunque cambiemos la variable local en la función, la variable en el espacio de comandos no se ve afectada; están en mundos diferentes que sólo se comunican a través de la lı́nea de argumentos. Hagamos ahora algunos ejercicios para consolidar estas ideas: Ejercicio 1.1 Vamos a preparar el espacio donde vas a trabajar, dentro de la unidad de red Z. Si no lo has hecho ya, crea una carpeta que se llame CXXY Y donde XX son las dos últimas cifras del año en que empieza el curso y Y Y las dos últimas cifras del año en que termina. En el curso 2008-2009, la carpeta se llamarı́a C0809. Dentro de esa carpeta crea otra que se llame LP . Dentro de esta,crea una carpeta llamada ud1. Esta será tu carpeta de trabajo para todo slos ejemplos y ejercicios de la unidad 1. Pág. 37 Lenguajes de Programación: Guı́a ECTS Ejercicio 1.2 Edita manualmente la función ud1 f1 creando un archivo nuevo con el editor on desde la ventana de comandos (con File, New ), guárdala en tu carpeta de trabajo y ejecuta: >> >> >> >> ud1_f1(2.3) ud1_f1(0.1) ud1_f1(0) ud1_f1(-2.2) ¿Son correctos los resultados? ¿Qué errores o problemas da? Ejercicio 1.3 Crea una función que reciba el radio de un cı́rculo y devuelva su área. MATLAB conoce el valor de π, pide ayuda sobre pi para usarlo. Ejercicio 1.4 Prueba la función que has creado con un cı́rculo de radio la unidad. Deberı́a devolver π. Pruébala con 2; deberı́a devolver 4 ∗ π (puedes calcular ese valor con MATLAB). 1.3. Funciones con varios argumentos de entrada El siguiente paso es construir funciones en las que haya más de un argumento de entrada. Tenemos ası́ la siguiente, la cual calcula el área de un rectángulo. Si necesitamos más argumentos de entrada, simplemente los colocamos uno tras otro separados por comas dentro de los paréntesis a la derecha del nombre de la función. % ud1_farea % primera función con más de un argumento. % área del rectángulo de lados a y b function area=ud1_farea(a,b) area=a*b; Para invocarla, se nos ocurren estas tres posibilidades, aprovechando lo explicado en la sección 1.2: >> ud1_farea(2,3) ans = 6 >> x=3; >> y=5; >> ud1_farea(x,y) ans = 15 >> ud1_farea(x,4) ans = 12 En la primera, pasamos directamente dos números, los cuales son copiados por las variables locales a y b. En la segunda posibilidad pasamos dos variables correspondientes al espacio de memoria de la ventana de comandos, x e y, las cuales son copiadas igualmente por las variables locales de la rutina, a y b, a través de la lista de argumentos. Finalmente en la tercera, Pág. 38 UNIDAD DIDÁCTICA 1. FUNCIONES Y CONDICIONALES tenemos una combinación de las dos posibilidades anteriores. En el siguiente ejemplo los argumentos no conmutan entre sı́. Se trata de calcular el área de un polı́gono regular sabiendo el número de lados y el lado. En el cálculo de la apotema los dos argumentos no conmutan entre sı́. % ud1_fareapol.m % area de un polı́gono regular de n lados % primeras variables propias de la rutina, P,a, % las variables no conmutan pues juegan distinto papel function area=ud1_fareapol(l,n) P=n*l; % perı́metro a=l/(2*tan(pi/n)); area=P*a/2; Es la primera función en la que usamos variables locales a la función. Si invocamos esta función desde la ventana de comandos, y preguntamos después lo que valen esas variables locales, las cuales no pertenecen al espacio de memoria de la ventana de comandos tendremos el siguiente resultado: >> ud1_fareapol(3,4) ans = 9.0000 >> ud1_fareapol(4,3) ans = 6.9282 >> P ??? Undefined function or variable ’P’. >> a ??? Undefined function or variable ’a’. >> Los ejercicios correspondientes a estos ejemplos son los siguientes: Ejercicio 1.5 Edita manualmente las funciones ud1_farea y ud1_fareapol, guárdalas en tu carpeta de trabajo y pruébalas desde la ventana de comandos de MATLAB. Ejercicio 1.6 Crea una función que reciba la base y la altura de un triángulo y devuelva el área. Ejercicio 1.7 Crea una función que reciba la masa y la velocidad de un móvil y devuelva la energı́a cinética. Ejercicio 1.8 Consideramos la función function d=ud1_fprueba(a,b,c) b=c; a=b; d=a+b+c; Pág. 39 Lenguajes de Programación: Guı́a ECTS Sin ejecutar la función, ¿qué valor devolverá si invocamos desde MATLAB ud1 f prueba(1, 2, 3)? Razónalo primero y compruébalo después editando la función y ejecutando esa orden. Es la primera función que tiene más de dos argumentos. ¿Conmutan entre sı́ los argumentos de entrada? Ejercicio 1.9 Crea una función que reciba los tres coeficientes a, b, c, de un polinomio de segundo grado y devuelva la raı́z √ −b + b2 − 4ac . 2a Cuando se invoque la función, se elegirán los coeficientes para que la ecuación tenga raı́ces reales. Se recomienda usar una variable auxiliar D para definir el discriminante b2 − 4ac. ¿Conmutan entre sı́ los argumentos de entrada?. Para comprobar si tu código es correcto, usa los coeficientes del polinomio x2 − 7x + 12, que tiene como raı́ces 3 y 4. Ejercicio 1.10 Crea una función análoga para la otra raı́z, −b − √ b2 − 4ac . 2a Ejercicio 1.11 Crea una función que reciba dos alturas, h1 y h2 y una masa y devuelva la energı́a potencial perdida/ganada por el cuerpo al caer/subir de h1 a h2 . 1.4. Estructura de control condicional if Hasta ahora, todas las sentencias se han ejecutado de modo consecutivo, una detrás de la otra. No disponemos todavı́a de herramientas que permitan controlar de algún modo la ejecución o realizar operaciones más complejas con la información de entrada a la función. La primera de esas herramientas y una de las más importantes es el condicional y nos pone en la parrilla de salida del desarrollo de estrategias y algoritmos para resolver los problemas de los que un ordenador es capaz. Además, y no menos importante, se convierte en el primer mecanismo de provocación de vuestra capacidad de pensar y de articular un discurso complejo a partir de elementos mı́nimos, o sea, PROGRAMAR. La estructura condicional aparece en los lenguajes de programación normalmente mediante la palabra reservada if. En MATLAB lo hace de ese modo, tal como se indica en las siguientes lı́neas. function y=nombrefuncion(arg1,arg2,....) .... .... if cond .... .... end .... .... Pág. 40 UNIDAD DIDÁCTICA 1. FUNCIONES Y CONDICIONALES Por cond nos referimos a una condición lógica o combinación de ellas. Ası́, cond puede ser que una variable sea mayor que un determinado valor, igual, mayor o igual (>=) etc. En caso de que eso sea ası́, se ejecutarán las sentencias que están entre la sentencia del if y la primera sentencia end que se encuentre. Es importante para que los códigos sean legibles tabular o indentar las instrucciones correspondientes a una estructura de control 3 o 4 espacios (serán 4 en nuestros ejemplos), como hemos hecho con el puntead en el bloque if anterior. Uno de los ejemplos más sencillos que se pueden poner de esta estructura es el de una función que devuelva el mayor de dos números a, b supuestos distintos entre sı́. Se puede abordar este problema de varias maneras. La primera es mediante dos estructuras if, la primera controlando el caso de que a sea el mayor de los valores y la segunda controlando el caso de que el mayor sea b. % ud1_fmayorab % primer uso del condicional if % Devuelve el mayor de dos números a,b % a,b se supondrán diferentes function mayor=ud1_fmayorab(a,b) if a>b mayor=a; end % if b>a mayor=b; end En la segunda posibilidad se define la variable mayor por defecto como a. Ahora se comprueba si b es mayor que a, y si eso es cierto se define la variable mayor como b. % ud1_fmayorab0 % Devuelve el mayor de dos números a,b % a,b se supondrán diferentes function mayor=ud1_fmayorab0(a,b) mayor=a; if b>a mayor=b; end En la tercera variante se juega con la variable a calcular, dándole primero el valor a. Después se compara b con esa variable, y si en la comparación gana b, se actualiza el valor de mayor. % ud1_fmayorab0 % Devuelve el mayor de dos números a,b % a,b se supondrán diferentes function mayor=ud1_fmayorab1(a,b) mayor=a; if b>mayor mayor=b; end Los ejercicios correspondientes a este ejemplo son los siguientes: Pág. 41 Lenguajes de Programación: Guı́a ECTS Ejercicio 1.12 Abre la ventana principal de MATLAB, copia manualmente las funciones ud1_fmayorab, ud1_fmayorab0 y ud1_fmayorab1, guárdalas en tu carpeta de trabajo y pruébalas . Ejercicio 1.13 Crea una función que reciba un número r y devuelva el área del cı́rculo de radio r si r ≥ 0 y −1 en caso contrario. Ejercicio 1.14 Crea una función que reciba un valor x y devuelva el valor y de la función definida a trozos:  x + 1 x < −1 y= 1 − x2 x ≥ −1 Ejercicio 1.15 (Para valientes) Crea una función que reciba tres números a, b, c, que se supondrán diferentes entre si, y devuelva el mayor de los tres. 1.5. Estructura de control condicional if-else En el caso de que queramos que se ejecuten determinadas sentencias cuando cond sea falsa, deberemos complementar if con else. De este modo, si cond es cierta se ejecutará el primer bloque y si es falsa el segundo, como se muestra en el siguiente esquema: function y=nombrefuncion(arg1,arg2,....) .... .... if cond bloque1 else bloque2 end .... .... El ejemplo para ilustrar esta estructura es el correspondiente a la función que calcula el mayor de dos números supuestos distintos. Se comprueba si el primero es mayor que el segundo y si no es ası́, se toma el mayor como el segundo. % ud1_felseab % primer uso de la estructura if-else % Devuelve el mayor de dos números a,b % a,b se supondrán diferentes function mayor=ud1_felseab(a,b) if a>b mayor=a; else mayor=b; end Pág. 42 UNIDAD DIDÁCTICA 1. FUNCIONES Y CONDICIONALES Los ejercicios correspondientes a este ejemplo son los siguientes: Ejercicio 1.16 Edita manualmente la función ud1_felseab, modificando alguna de las anteriores, guárdala en tu carpeta de trabajo y pruébala. Adivina cuál será el resultado si pasas como argumentos dos números iguales. Ejercicio 1.17 Crea una función que reciba un número r y devuelva el área del cı́rculo de radio r si r ≥ 0 y −1 en caso contrario, utilizando la estructura if-else. Ejercicio 1.18 Crea una función que reciba un valor x y devuelva, utilizando la estructura if-else, el valor y de la función definida a trozos:  x + 1 x < −1 y= 1 − x2 x ≥ −1 1.6. Función que llama a otra función Una vez que con una función hemos resuelto un determinado problema y/o hemos agrupado una serie de tareas, esa función es muy cómodo verla como una caja negra que recibe unos argumentos de entrada y devuelve unos argumentos de salida (de momento uno sólo de salida). Vista de ese modo, es natural que sea llamada por otra función que la necesita como parte de la misma. La sintaxis de ello no ofrece ningún problema invocándose de modo análogo a como se invoca desde la lı́nea de comandos. En el siguiente ejemplo codificamos una función definida a trozos, similar a la del ejemplo 1.4, en la que el valor de uno de los trozos de la función se obtiene llamando a una función creada previamente, la ud1_f1.m. % ud1_ftrozos2 % primera funcion q llama a otra funcion % ud1_ftrozos2(x). Devuelve el valor de la función: % f(x)=x si x<1 % f(x)=xˆ2-ln(x) si x>=1 function y=ud1_ftrozos2(x) if x<1 y=x+1; else y=ud1_f1(x); end El concepto de llamar a una función desde otra es muy poderoso y es la base para tanto resolver grandes problemas como ser capaz de repartir la escritura de grandes códigos entre un equipo de programadores. Haremos uso abundante de esta técnica durante el curso y si el estudiante es hábil conseguirá simplificar la resolución de muchos ejercicios si hace buen uso de funciones ejemplo estudiadas en clase y de funciones codificadas al resolver otros ejercicios. Los ejercicios correspondientes a este ejemplo son los siguientes: Ejercicio 1.19 Edita manualmente la función ud1_ftrozos2, guárdala en tu carpeta de trabajo y pruébala. Pág. 43 Lenguajes de Programación: Guı́a ECTS >> >> >> >> ud1_ftrozos2(2.3) ud1_ftrozos2(1.1) ud1_ftrozos2(0) ud1_ftrozos2(0.9) ¿Son correctos los resultados? ¿Qué errores o problemas da? Ejercicio 1.20 Utilizando la función del área del rectángulo (ud1_farea), crea una función que reciba los dos lados de la base y la altura de una pirámide de base rectangular y devuelva su volumen (el volumen de la pirámide es 1/3 del área de la base por la altura). Ejercicio 1.21 Usando las funciones de los ejercicios 1.9 y 1.10, crea una función que reciba los tres coeficientes de un polinomio de segundo grado de raı́ces reales y devuelva el producto de las mismas (se elegirán los coeficientes para que ası́ sean). Prueba con varios polinomios (el producto de las dos raı́ces ha de ser c/a). Ejercicio 1.22 (Para los valientes). Crea una función que que reciba los tres coeficientes de un polinomio de grado 2, llame a la función del apartado anterior para calcular el producto de sus raı́ces y que cuando las raı́ces sean números complejos o cuando sea una raı́z doble, devuelva 0 en lugar del producto de las raı́ces. Para ver si las raı́ces con complejas o reales, puedes ver el signo del discriminante, b2 − 4ac. 1.7. Condicionales anidados. Las estructuras de control pueden contener dentro de sus bloques de instrucciones internos otras estructuras de control. Es habitual que dentro de un bucle hay condicionales, o que dentro del bloque de un condicional haya un bucle y también es habitual que dentro del bloque de un condicional haya otro condicional. Esto lo reflejamos en el siguiente esquema. function y=nombrefuncion(arg1,arg2,....) .... .... if cond bloque10 if cond1 bloque11 end bloque12 else bloque2 end .... .... Para mostrar el funcionamiento, planteamos un ejemplo muy interesante, devolver el signo de una variable entera n. Si n es estrictamente negativa el signo se toma como -1, si n es 0, el signo será 0, y si n es estrictamente positiva, el signo será 1. Por tanto, hay que gestionar tres posibilidades excluyentes, lo que abordaremos primero eliminando una de ellas frente a las otras dos y después las otras dos entre si. Pág. 44 UNIDAD DIDÁCTICA 1. FUNCIONES Y CONDICIONALES % ud1_fsigno % función que devuelve el signo de un número entero n % -1 si es negativo, 0 si es 0, 1 si es positivo. % primeros condicionales anidados. function signo=ud1_fsigno(n) if n<0 signo=-1; else if n==0 signo=0; else signo=1; end end Los ejercicios correspondientes a este ejemplo son los siguientes: Ejercicio 1.23 Edita manualmente la función ud1_fsigno, guárdala en tu carpeta de trabajo y pruébala, desde la ventana de comandos de MATLAB. Ejercicio 1.24 Se trata de construir una función que reciba una calificación (entre 0 y 10) y devuelva 0 si es suspenso (calificación estrictamente menor que 5), 1 si es aprobado (calificación mayor o igual que 5 y menor que 7), 2 si es notable (calificación mayor o igual que 7 y menor que 9), 3 si es sobresaliente (calificación mayor o igual que 9 y menor o igual que 10) y -1 si el argumento no está entre 0 y 10. No se podrán utilizar operadores lógicos. Ejercicio 1.25 Crea una función que reciba un valor x y devuelva el   sin(x) x y=  2 x + log(x) valor y de la función definida a trozos: x<0 0≤x<1 x≥1 No se podrán utilizar operadores lógicos. Ejercicio 1.26 Función q devuelva el salario semanal de un trabajador en función del coste hora, de las horas que ha trabajado y de un fijo de productividad que se cobra si se trabajan más de 30 horas. Si se trabajan más de 40 horas, las horas por encima de esas 40 se pagan un 50 % más caras (horas extras). No se podrán utilizar operadores lógicos. Ejercicio 1.27 Codifica la función f (x) = máx{ud1 f 1(x), 7 cos(6x)}. donde máx significa máximo. En la definición de ud1 f1 hay un logaritmo del argumento x implicado. Por tanto, cuando x sea menor o igual que cero, ese logaritmo no podrá ser evaluado y tomaremos como máximo la única función que está definida. No se podrán utilizar operadores lógicos. Pág. 45 Lenguajes de Programación: Guı́a ECTS 1.8. Variante elseif en el condicional Una variante bastante útil del condicional es la que permite abrir el abanico de posibilidades de ejecución a no sólo el verdadero o falso referido a una determinada condición. La idea es que si una condición es cierta se ejecuten unas sentencias, pero si esta es falsa, se compruebe una segunda condición y si esta es cierta, se ejecuten el correspondiente segundo grupo de sentencias, pero si la segunda condición es falsa, se pase a una tercera y ası́ sucesivamente. Finalmente, la orden terminará con una sentencia else cuyo bloque de instrucciones posterior se ejecutará si ninguna de las condiciones ha resultado cierta. Pretendemos reflejar esto con el siguiente esquema: function y=nombrefuncion(arg1,arg2,....) .... .... if cond1 bloque 1 elseif cond2 bloque 2 elseif cond3 bloque 3 elseif...... ..... else bloque n end .... .... Si la condición 1, cond1, es cierta, se ejecutará el bloque 1 de sentencias, y a posteriori se pasará directamente a las sentencias posteriores a la sentencia end. Si la condición 1 fuese falsa, se evaluarı́a la condición 2 y si está fuese cierta, se ejecutarı́a el bloque 2, pasando directamente a las sentencias posteriores a la sentencia end. Si ninguna de las condiciones fuese cierta, se pasarı́a directamente a la ejecución del bloque n. Vemos esta estructura con el siguiente ejemplo. Se trata de construir una función que reciba una calificación (entre 0 y 10) y devuelva 0 si es suspenso (calificación estrictamente menor que 5), 1 si es aprobado (calificación mayor o igual que 5 y menor que 7), 2 si es notable (calificación mayor o igual que 7 y menor que 9) y 3 si es sobresaliente (calificación mayor o igual que 9). Para codificar este ejemplo, lo primero que comprobamos es si la nota es menor que 5. Si no lo es, sólo comprobamos si es menor que 7, por que ya sabemos que va a ser mayor o igual que 5. Los demás casos son análogos. % ud1_fnotas % primera vez q usamos el elseif function clave=ud1_fnotas(nota) if nota<5 clave=0; elseif nota<7 clave=1; elseif nota<9 clave=2; Pág. 46 UNIDAD DIDÁCTICA 1. FUNCIONES Y CONDICIONALES else clave=3; end Los ejercicios correspondientes a este ejemplo son los siguientes: Ejercicio 1.28 Edita manualmente la función ud1_fnotas, guárdala en tu carpeta de trabajo y pruébala, desde la ventana de comandos de MATLAB. ¿Que ocurre si el valor del argumento no está entre 0 y 10? Ejercicio 1.29 Se trata de construir una función que reciba una calificación (entre 0 y 10) y devuelva 0 si es suspenso (calificación estrictamente menor que 5), 1 si es aprobado (calificación mayor o igual que 5 y menor que 7), 2 si es notable (calificación mayor o igual que 7 y menor que 9), 3 si es sobresaliente (calificación mayor o igual que 9 y menor o igual que 10) y -1 si el argumento no está entre 0 y 10. Se utilizará la variante elseif del condicional para realizar este ejercicio. Ejercicio 1.30 Crea una función que reciba un valor x y devuelva el   sin(x) x y=  2 x + log(x) valor y de la función definida a trozos: x<0 0≤x<1 x≥1 Se utilizará la variante elseif del condicional para realizar este ejercicio. Ejercicio 1.31 Función q devuelva el salario semanal de un trabajador en función del coste hora, de las horas que ha trabajado y de un fijo de productividad que se cobra si se trabajan más de 30 horas. Si se trabajan más de 40 horas, las horas por encima de esas 40 se pagan un 50 % más caras (horas extras). Se utilizará la variante elseif del condicional para realizar este ejercicio. Ejercicio 1.32 Codifica la función f (x) = máx{ud1 f 1(x), 7 cos(6x)}. donde máx significa máximo. En la definición de ud1 f1 hay un logaritmo del argumento x implicado. Por tanto, cuando x sea menor o igual que cero, ese logaritmo no podrá ser evaluado y tomaremos como máximo la única función que está definida. Se utilizará la variante elseif del condicional para realizar este ejercicio. 1.9. Operadores lógicos Si queremos construir condiciones algo más interesantes, necesitaremos combinar condiciones elementales mediante los operadores lógicos habituales, estudiados a menudo durante la etapa de la educación secundario. Necesitaremos saber escribir al menos los operadores Y lógico y el Ó lógico. Si se pretende construir una condición que mezcle varias condiciones se pueden usar paréntesis para establecer qué operaciones lógicas se hacen primero, de modo similar a como sucede con las operaciones aritméticas. Para el Y lógico se usa el sı́mbolo reservado &. En el siguiente ejemplo vemos como se utiliza este operador para construir una función que devuelva el mayor de tres números supuestos distintos. Si uno de los números es mayor lo será porque es al mismo tiempo mayor que uno y mayor que otro. Pág. 47 Lenguajes de Programación: Guı́a ECTS %% operadores logicos. function mayor=ud1_fmayor(a,b,c) if a>b & a>c mayor=a; end if b>a & b>c mayor=b; end if c>a & c>b mayor=c; end Otro operador interesante es el Ó lógico (inclusivo). Para éste se usa el sı́mbolo |, que se obtiene pulsando la tecla Alt Gr y la del 1. En los siguientes ejercicios veremos algún ejemplo de utilización de este operador. Ejercicio 1.33 Edita manualmente la función ud1_fmayor, guárdala en tu carpeta de trabajo y pruébala, desde la ventana de comandos de MATLAB. Ejercicio 1.34 Construye una función que reciba tres valores a, b y c (que se supondrán diferentes) y devuelva 1 si a es el mayor, 2 si b es el mayor, y 3 si lo es c. Ejercicio 1.35 Construye una función que reciba tres valores a, b y c devuelva el mayor si alguno de ellos es positivo y el menor en caso contrario. Ejercicio 1.36 Construye una función que reciba tres valores a, b y c (que se supondrán diferentes) y devuelva el mayor de ellos. No se podrán utilizar operadores lógicos, solo un bloque if-else y una llamada a la función ud1 fmayorab Ejercicio 1.37 ¿Cuál es el significado del argumento de salida de la siguiente función? function mayor=ud1_fmayortres(a,b,c) mayor=a; if b>mayor mayor=b; if c>mayor mayor=c; end end Ejercicio 1.38 ¿Qué devuelve la siguiente función? Pág. 48 UNIDAD DIDÁCTICA 1. FUNCIONES Y CONDICIONALES function y=ud1_prueba2(a,b,c) y=a+b+c; if a>b | c>b y=y-b; if a>c y=y-c; else y=y-a; end else y=b; end Trata de obtenerlo sin usar el ordenador y después compruébalo con algunos ejemplos. Ejercicio 1.39 Usando la función ud1 fmayor, construye una función que devuelva el máximo de cuatro valores. Ejercicio 1.40 (Para valientes) Idem con seis valores. Trata de hacerlo con un único if − else y utilizando dos veces la función del apartado 1.36. Ejercicio 1.41 (Para valientes) Idem con siete valores. Trata de hacerlo con el menor número posible de if − else (ninguno). Ejercicio 1.42 (Para valientes) ¿Qué errores hay en el siguiente programa? Se supone que la función deberı́a devolver la potencia del segmento definido por tres abscisas a, b, c, es decir, el producto de las longitudes de los dos segmentos que determinan. No se sabe cuál es la relación de orden entre los valores pero si fuesen crecientes, la potencia serı́a (b − a) ∗ (c − b). function pot=ud1_fpotencia(a,b,c) if a>b & a>c if b>c pot=(a-b)*(b-c) else pot=(a-c)*(c-b) end end if b>a & b>c if a>c pot=(b-a)*(a-c) else pot=(b-c)*(c-a) end else if a>b pot=(c-a)*(a-b) else pot=(c-b)*(b-a) end end Trata de hacerlo primero en papel para encontrar algunos errores y luego prueba con el ordenador. Prueba con (1, 2, 3), (3, 2, 1), (2, 1, 3), etc y con (1, 1, 2), (1, 2, 1), (2, 1, 1) y (1, 1, 1) (en estos cuatro últimos casos deberı́a dar 0). Pág. 49 Lenguajes de Programación: Guı́a ECTS 1.10. Operadores de comparación: ¿son iguales? La operación de comparar si dos valores enteros son iguales tiene una sintaxis especı́fica en MATLAB, colocando el sı́mbolo = de modo duplicado, ==. Cuando se trate de valores correspondientes a números reales, esta operación es más delicada y hablaremos de ella más adelante. En el siguiente ejemplo se muestra su uso para construir una función que indica si dos valores son iguales o no. % ud1_figuales % operador de comparacion para numeros enteros function chivato=ud1_figuales(m,n) if m==n chivato=1; else chivato=0; end La negación lógica se escribe en MATLAB anteponiendo al operador correspondiente el sı́mbolo ∼, el cual se obtiene pulsando las teclas AltGr y 4. Por tanto, el operador para comprobar si dos valores son distintos será ∼=. En los siguientes ejercicios veremos algún ejemplo de utilización de este operador. Ejercicio 1.43 Edita manualmente la función ud1_figuales, guárdala en tu carpeta de trabajo y pruébala, desde la ventana de comandos de MATLAB. Ejercicio 1.44 Construye una función que reciba tres números enteros a, b y c y devuelva 1 si son iguales entre si, y 0 en caso contrario. Ejercicio 1.45 Construye una función que reciba tres números enteros a, b y c y devuelva 1 si a 6= b, 2 si a = b y b 6= c y 3 si los tres valores son iguales. Ejercicio 1.46 Construye una función que reciba tres números enteros a, b y c y devuelva 2 si los tres son iguales entre si, 1 si dos de ellos son iguales entre si pero el tercero es diferente, y 0 si los tres son distintos. Ejercicio 1.47 Repetir el ejercicio 1.46 sin utilizar ni else, ni elseif. 1.11. Igualdad entre números reales: precisión y valor absoluto Entender cómo el ordenador almacena y trabaja con números con cifras decimales escapa al contenido de este libro. Sin embargo, dado que la memoria RAM es finita, en números racionales periódicos o en números irracionales, es fácil entender que será imposible almacenar las infinitas cifras que hay a la derecha del punto decimal. Además de estas dificultades de almacenamiento, está la dificultad conceptual relativa a la idea de igualdad entre números reales. Pág. 50 UNIDAD DIDÁCTICA 1. FUNCIONES Y CONDICIONALES La mejor respuesta es pensar que dos números reales (y en general dos objetos cualesquiera en la vida profesional) son iguales cuando las diferencias entre ellos sean tan pequeñas como lo requiera una determinada tarea. Ası́, dos sillas del mismo modelo son objetivamente distintas si las vemos con mucho cuidado, pero si no tienen ningún defecto, serán a todos los efectos iguales. Lo mismo sucede con los números reales. Diremos que dos números reales son iguales cuando el valor absoluto de su diferencia sea menor que un umbral de precisión determinado que dependerá del significado y utilidad de dichas cantidades. En el siguiente ejemplo observamos cómo se define ese umbral para comprobar si un triángulo es equilátero, isósceles, etc., y como se comprueba la igualdad de los lados recurriendo a la función valor absoluto, abs en MATLAB. % ud1_ftriangulos % recibe a, b y c, los lados de un triángulo % devuelve 3 si son los lados de un triángulo equilátero % devuelve 2 si son de un triángulo isósceles % devuelve 1 si son los lados de un triángulo escaleno % idea: cuando dos numeros reales son iguales, para % comprobarlo hay q definir una precisón-umbral. function tipo=ud1_ftriangulos(a,b,c) % Precisión con la que trabajamos. Todo número menor que % esa cantidad será cero para nosotros prec=(a+b+c)*1e-5; if abs(a-b)<prec & abs(b-c)<prec tipo=3; elseif abs(a-b)<prec | abs(a-c)<prec | abs(b-c)<prec tipo=2; else tipo=1; end Los ejercicios correspondientes a este ejemplo son los siguientes: Ejercicio 1.48 Entra en al carpeta Asignaturas\LP \Ejemplos. utilizando el enlace directo que tienes en el escritorio. Copia de ahı́ todos los ejemplos correspondientes a la unidad 1, aquellos ficheros cuyo nombre empieza por ud1 a tu propia carpeta ud1. Prueba la función ud1 ftriangulos. Ejercicio 1.49 Crea una función que reciba tres valores, a, b y c y devuelva 1 si pueden ser los lados de un triángulo (la suma de dos lados cualesquiera ha de ser mayor que el otro, es decir, a + b > c, a + c > b y b + c > a) y 0 en caso contrario. Ejercicio 1.50 Modifica el ejemplo ud1_ftriangulos para que reciba tres valores y devuelva 0 si no pueden ser los lados de un triángulo (usa la función creada en el apartado 1.49), 3 si es un triángulo equilátero, 2 si es isósceles y 1 si es escaleno. Ejercicio 1.51 Codifica el ud1_ftriangulos en una sola lı́nea usando la función ud1 ftriangulos y el ejercicio 1.49. Ejercicio 1.52 (Para valientes) Construye una función que reciba 4 números a, b, c, d, correspondientes a los lados consecutivos de un trapezoide, ası́ como la longitud de una las diagonales d1 y devuelva 1 si la figura es un cuadrado, 2 si es un rectángulo, 3 si es un trapecio y 4 si no es ninguna de estas posibilidades. Pág. 51 Lenguajes de Programación: Guı́a ECTS 1.12. Variables enteras y reales como argumentos Hasta ahora habı́amos utilizado variables que eran esencialmente o números enteros o números reales. En el siguiente ejemplo conviven ambos tipos como argumentos. La función recibe los valores correspondientes a las dimensiones principales de una determinada figura elemental (rectángulo, triángulo, cı́rculo, etc...) y recibe también un entero indicando el tipo de figura concreta a la que nos referimos de entre esa lista. La función devuelve el área de dicha figura. % ud1_fareafig % primera función que combina variables esencialmente diferentes, % una como tipo que funciona como un indicador de especie (número % entero) y otras (a,b) q funcionan como números reales. % ademas b a veces es inutil. % ud1_fareafig(tipo,a,b) devuelve el área de distintas figuras % Si tipo=1, devuelve el área del rectángulo de lados a y b % Si tipo=2, devuelve el área del cı́rculo de radio a % Si tipo=3, devuelve el área del triángulo de base a y altura b % Si tipo=4, devuelve el área del cuadrado de lado a % Si tipo=5, devuelve el área del triángulo equilátero de lado a % Si no es ninguno de los tipos anteriores, devuelve -1 function area=ud1_fareafig(tipo,a,b) if tipo==1 area=a*b; elseif tipo==2 area=pi*aˆ2; elseif tipo==3 area=a*b/2; elseif tipo==4 area=a*a; elseif tipo==5 area=a*a*sqrt(3)/4; else area=-1; end Los ejercicios correspondientes a este ejemplo son los siguientes: Ejercicio 1.53 Prueba la función ud1_fareafig, bien editándola manualmente o trayéndola de una carpeta determinada. Ejercicio 1.54 Modifica la función ud1_fareafig para que también calcule el área del rombo. Ejercicio 1.55 Codifica ud1_fareafig sin la orden else ni la elseif. Ejercicio 1.56 Construye una función que reciba un parámetro, raiz, y los coeficientes a, b y c de un polinomio de segundo grado. Devolverá la raı́z con el ’+’ en la fórmula si raiz es 1 y la raı́z con el ’-’ si raiz es 6= 1. Para calcular estas raı́ces llamaremos a las funciones 1.9 y 1.10. Para comprobar si tu código es correcto, usa los coeficientes del polinomio x2 − 7x + 12, que tiene como raı́ces 3 y 4. Ejercicio 1.57 Codifica una función que reciba los coeficientes de un polinomio de grado 2 y devuelva la suma de sus raı́ces, para lo cual usará del modo que corresponda la función del ejercicio 1.56. Para comprobar si tu código es correcto, usa los coeficientes del polinomio x2 − 7x + 12, que tiene como raı́ces 3 y 4. Ejercicio 1.58 Pág. 52 UNIDAD DIDÁCTICA 1. FUNCIONES Y CONDICIONALES (Para valientes) Sabiendo que una pulgada son 2.54 cm, que un pie son 12 pulgadas, y que una yarda son 3 pies se pide construir una función que reciba una cantidad, un número que indicará en qué sistema de medida está (0 para el sistema internacional (SI) y 6= 0 para el sistema inglés) y otro número que indicará en qué unidades está (1,2 o 6= 1, 2 según sea mm, cm o metros en SI y 1, 2 o 6= 1, 2 según sea pulgadas, pies o yardas en el sistema inglés). La función devolverá la magnitud convertida a metros si se ha recibido en el sistema inglés y convertida a pies si se ha recibido en el SI. 1.13. Variables contador y sumador Ya vimos que el operador = en MATLAB no tiene mucho que ver con lo que ese operador significa en Algebra. Su significado es de asignación. A la izquierda tendremos siempre una variable y a la derecha un expresión que puede combinar llamadas a funciones con operadores aritméticos y lógicos. El funcionamiento de la operación es que primero se evalúa la expresión a la derecha y el valor obtenido es asignado a la variable que está a la izquierda. Esto abre la puerta para operaciones que no tienen sentido matemático pero sı́ en Programación, como decir que i = i + 1. Lo que esto significa es que se evalúa la expresión i + 1 y se asigna su valor a i, con lo cual esta variable habrá incrementado su valor original en una unidad. En el siguiente ejemplo aplicamos esta idea para encontrar la suma de los positivos entre cuatro números. %% ud1_fsumapos %% primera variable sumadora (x=x+algo) %% suma de los positivos entre 4 números. function suma=ud1_fsumapos(a,b,c,d) suma = 0; if a>0 suma=suma+a; end if b>0 suma=suma+b; end if c>0 suma=suma+c; end if d>0 suma=suma+d; end Los ejercicios correspondientes a este ejemplo son los siguientes: Ejercicio 1.59 Prueba la función ud1_fsumapos Ejercicio 1.60 Construye una función que reciba 5 números a, b, c, d, y e y cuente cuántos son estrictamente positivos. Ejercicio 1.61 Construye una función que reciba 5 números x, y, z, t, y s y dos números a y b y devuelva la suma de aquellos números de entre esos 5 que son mayores e iguales que a y menores o iguales que b. Ejercicio 1.62 Construye una función que reciba 5 números a, b, c, d, y e y un número adicional positivo ref y devuelva la suma de aquellos valores que sean negativos pero que su valor absoluto sea mayor que ref . Por ejemplo, si los números son, -7, 12, 4, -3, -6 y ref vale 3.7, la suma serı́a -7-5-=-13. Pág. 53 Lenguajes de Programación: Guı́a ECTS 1.14. Función parte entera Hay una función propia de MATLAB que se usa en muchos códigos y que conviene citar. Es la función que extrae la parte entera, redondeando hacia −∞, de un número. Ası́, la parte entera de 3.45 es 3, y la de -4.32 es -5. En el siguiente ejemplo se usa este operador, floor, para comprobar si un número es o no entero. %% ud1_fesentero %% comprueba si un numero x es entero %% funcion parte entera function chivato=ud1_fesentero(x) parte_entera=floor(x); if x==parte_entera chivato=1; else chivato=0; end Los ejercicios correspondientes a este ejemplo son los siguientes: Ejercicio 1.63 Prueba la función ud1_fesentero. Ejercicio 1.64 Construye una función que reciba 4 números a, b, c, d y devuelva la suma de los que entre ellos son enteros. Ejercicio 1.65 Construye una función que reciba un número natural n y devuelva 0 si n es par y 1 si n es impar. Ejercicio 1.66 (Para valientes) Construye una función que reciba 4 números a, b, c, d y un número entero n y devuelva la suma de los que entre ellos son enteros y además múltiplos de n. Pág. 54 Unidad Didáctica 2 Bucles 2.1. General Como ya se indicó al comienzo de la unidad 1, esta segunda unidad contiene junto con la primera la mayorı́a de las herramientas que un alumno va a tener que utilizar a lo largo del curso. La unidad se centra en la estructura de control más importante, la que permite realizar repeticiones: los bucles. El bucle junto con los condicionales representan la base de la programación estructurada. 2.2. Bucles En muchos problemas de matemáticas se requiere repetir o iterar un mismo procedimiento. Es por ello que todos los lenguajes de programación contienen la posibilidad de crear bucles. Un bucle en programación es una sentencia que se realiza repetidas veces. Un bucle se utiliza para hacer un acción repetida sin tener que repetir varias veces el mismo código, lo que ahorra tiempo, deja el código más claro y facilita su modificación en el futuro. La variable entera que cuenta el número de veces que regula la evolución del bucle se conoce como ı́ndice del bucle. Durante este curso un bucle lo relacionaremos con el uso del comando WHILE. La gran ventaja de los bucles escritos mediante el uso de la sintaxis WHILE frente a otras formas de escribir un bucle radica en que el ı́ndice del bucle es una variable más del programa y su valor es controlado en todo momento por el programador. Con este tipo de bucles, el fin de la iteratividad viene determinado por una condición sobre una variable del programa que aparece a continuación del comando WHILE. El primer ejemplo ilustra uno de los usos más tı́picos de los bucles que sin lugar a dudas es la suma de un conjunto de elementos. El conjunto de elementos que se quieren sumar en este caso son los naturales de 1 a n. El ı́ndice i se inicializa por tanto a 1 y n es un argumento de la función. La condición de corte del proceso iterativo que requiere la estructura WHILE se ejecutará cuando el ı́ndice i sea mayor que n, en cualquier otro caso i se irá incrementando en una unidad y la variable suma se verá incrementada en el valor del propio ı́ndice i. De esta forma cuando el bucle se interrumpa la variable suma contendrá el valor resultante de la suma de los n primeros números naturales. %ud2_fsuma % Suma de todos los naturales entre 1 y n % primer bucle function suma=ud2_fsuma(n) suma=0; i=1; Pág. 55 Lenguajes de Programación: Guı́a ECTS while i<=n suma=suma+i; i=i+1; end Mediante los siguientes ejercicios se podrá afianzar el concepto de bucle. Ejercicio 2.1 Crea una carpeta llamada ud2 en Z : Copia en ella todos los ejemplos cuyo nombre empiece por ud2 , los cuales encontrarás en la carpeta: Asignaturas\LP \Ejemplos Añade la carpeta Z :\ud2 al path o Current Directory de MATLAB. Ejercicio 2.2 Prueba la función ud2 fsuma Ejercicio 2.3 Construye una función que reciba dos números naturales, m y n, con m < n, y devuelva la suma de los naturales entre m y n. Ejercicio 2.4 Idem sin usar bucles y llamando a la función ud2 fsuma. Ejercicio 2.5 Construye una función que reciba un número natural, n y devuelva sin(1) + sin(2) + . . . + sin(n − 1) + sin(n) n+1 Ejercicio 2.6 (Para valientes) Construye una función que reciba dos números, reales a, b, con a < b, un número natural n, calcule h = (b − a)/n y devuelva sin(a) + sin(a + h) + sin(a + 2h) + . . . + sin(a + (n − 1)h) + sin(b) , n+1 es decir, el valor medio aproximado del seno entre a y b, tomando n + 1 puntos para aproximarlo. También se puede ver como la posición vertical del centro de gravedad de la curva y = sin(x) entre a y b si la consideramos representada por esos n + 1 puntos. Ejercicio 2.7 (Para valientes) Construye una función que reciba dos números, reales a, b, con a < b, un número natural n, y calcule la posición vertical del centro de gravedad de la curva y = sin(x), considerada como una poligonal que se apoya en n + 1 puntos de esa curva cuyas abscisas están equiespaciadas entre a y b. Ejercicio 2.8 (Para valientes) Construye una función que reciba dos números, reales a, b, con a < b, un número natural n, y calcule el centro de gravedad del superficie definida por los rectángulos que tiene como base h = (b − a)/n y como altura sin(xi ), con xi = a + i ∗ h, 0 ≤ i < n. Pág. 56 UNIDAD DIDÁCTICA 2. BUCLES 2.3. Bucles con incremento variable El segundo ejemplo es una variante del caso anterior donde se desea que tan sólo se sumen los números pares. La primera diferencia estriba en que el primer valor que debe tomar el ı́ndice i debe ser 2 y la segunda es que el incremento del ı́ndice sea de dos unidades en vez de una. % ud2_fsumapares % Suma todos los numeros pares entre 1 y n function suma=ud2_fsumapares(n) suma=0; i=2; while i<=n suma=suma+i; i=i+2; end Los ejercicios correspondientes a este ejemplo son los siguientes: Ejercicio 2.9 Prueba la función ud2 fsumapares Ejercicio 2.10 Construye una función que reciba un número natural, n, y devuelva la suma de los impares entre 1 y n. Ejercicio 2.11 Construye una función que reciba un número natural, n, y devuelva la suma de los múltiplos de 3 entre 1 y n. Ejercicio 2.12 (Para valientes) Construye una función que reciba un número natural n y devuelva 0 si n es par y 1 si n es impar. No se podrá usar la orden f loor. 2.4. Bucles con otras operaciones Como podemos ver en el siguiente ejemplo, el uso de un bucle se puede extender al producto igual que a la suma. De esta forma si hacemos productos de números que son siempre el mismo en este caso x, estaremos hallando la potencia enésima de dicho número. % ud2_fpotencia % Calcula xˆn, repitiendo el producto. function pot=ud2_fpotencia(x,n) pot=1; i=1; while i<=n pot=x*pot; i=i+1; end Los ejercicios correspondientes a este ejemplo son los siguientes: Pág. 57 Lenguajes de Programación: Guı́a ECTS Ejercicio 2.13 Prueba la función ud2 fpotencia Ejercicio 2.14 Construye una función que reciba un número natural, n, y devuelva n! = 1 2 . . . (n − 1)n Ejercicio 2.15 ¿Qué devuelve la siguiente función? function y=ud2_fprueba(m,n,k) y=1; i=m; while i<=n y=y*i i=i+k; end Sin ejecutarla, trata de calcular qué devolverı́a ud2 f prueba(2, 15, 3). Compruébalo con MATLAB. Ejercicio 2.16 Construye una función que reciba un número x y un número natural, n, y devuelva x−n sin usar ∧ ni llamar a ud2 fpotencia. Ejercicio 2.17 Llamando a la función ud2 f potencia y la función que has creado en el ejercicio 2.16, construye una función que reciba un número x y un entero a y devuelva xa . Ejercicio 2.18 Construye una función que reciba x y n, calculando: X xi i para lo cual llamará a ud2 f potencia. 2.5. Bucles y relaciones de recurrencia Otra aplicación interesante de los bucles viene a partir del uso de las fórmulas de recurrencia, muy usadas en métodos numéricos y cálculo infinitesimal. El valor de una variable en un paso n depende de su valor en el paso anterior n − 1. El ı́ndice del bucle será capaz de ir avanzando con en número de pasos y de este modo ir actualizando el valor de x en cada uno de los mismos. Ver el siguiente ejemplo: % ud2_fnewton % Recibe a y n y devuelve el termino n-esimo % de la sucesion x_(i+1)=x_i-((x_i)ˆ2-81)/(2*x_i), siendo % a el primer termino, x_1=a % Relacion entre sucesiones y bucles. function x=ud2_fnewton(a,n) Pág. 58 UNIDAD DIDÁCTICA 2. BUCLES x=a; i=1; while i<=n-1 x=x-(xˆ2-81)/(2*x); i=i+1; end Los ejercicios correspondientes a este ejemplo son los siguientes: Ejercicio 2.19 Prueba la función ud2 fnewton con algunos valores y comprueba que los resultados son correctos. Ejercicio 2.20 Construye una función que reciba un número natural n y devuelva el término n-ésimo de la sucesión √ xi+1 = 2xi , x1 = 3.57, i ∈ N. ¿A qué valor converge la sucesión cuando n → ∞? Ejercicio 2.21 Construye una función que reciba un número natural n y devuelva kxn − xn−1 k, siendo xn y xn−1 los términos n y n − 1 de la sucesión del ejercicio 2.20. Se llamará a la función creada en dicho ejercicio. Ejercicio 2.22 Construye una función que reciba un número natural n y devuelva kxn − xn−1 k, siendo xn y xn−1 los términos n y n − 1 de la sucesión del ejercicio 2.20. No se podrá llamar a la función creada en dicho ejercicio y solo se podrá usar un bucle. Ejercicio 2.23 Construye una función que reciba un número natural n y devuelva el n-ésimo término de la sucesión de Fibonacci1 . xn+2 = xn + xn+1 , x1 = 1, x2 = 2. Ejercicio 2.24 Modifica el ejemplo 2.23 para que reciba un número natural n y dos números x1 y x2 y devuelva el término n-ésimo de la sucesión de Fibonacci. 1 Leonardo Pisano nació en 1170 probablemente en Pisa, en el seno de la familia Bonacci, de ahı́ su sobrenombre Fibonacci, por el que es generalmente conocido. Su padre fue representante de los mercaderes de la República de Pisa en el norte de África, en lo que es hoy el noroeste de Argelia. Allı́ creció y se educó Fibonacci. En los numerosos viajes en los que acompañó a su padre, Fibonacci aprendió las ventajas de los sistemas matemáticos utilizados en otras culturas. Hacia 1200 regresó a Pisa y recopiló en diversos libros lo aprendido en sus viajes añadiendo además notables contribuciones propias. Por ejemplo, en uno de sus libros introdujo el sistema decimal indo-arábigo, sistema de numeración posicional que usamos actualmente y extendió por Europa el uso del sistema árabe de numeración. En el mismo libro aparece la conocida sucesión de Fibonacci, 1, 1, 2, 3, 5, 8, 13, 21, 34,... (en la que cada término es suma de los dos anteriores) como solución al siguiente problema: Un hombre aisla un par de conejos en un corral. ¿Cuántos pares de conejos hay al cabo de un año si se supone que cada par de conejos engendra un nuevo par que a partir del segundo mes se hace fértil? Sin embargo, la mayor aportación matemática de Fibonacci se encuentra en el área de la Teorı́a de los Números, en la que, entre otros resultados destaca el estudio de métodos matemáticos para encontrar triples Pitagóricos, es decir, tres números naturales, m, n y k que verifican m2 + n2 = k 2 . Pág. 59 Lenguajes de Programación: Guı́a ECTS Ejercicio 2.25 (Para valientes) Construye una función que reciba tres números enteros p, q y r y devuelva 1 si r pertenece a la sucesión de Fibonacci iniciada por p y q y 0 en caso contrario (supondremos la sucesión monótona). Ejercicio 2.26 (Para valientes) Idem siendo p, q y r números reales (supondremos la sucesión monótona). Ejercicio 2.27 (Para valientes) El número π, se puede obtener mediante la fórmula π = 4 ∗ (1 − 1/3 + 1/5 − 1/7 + . . . + (−1)i 1 + . . .). 2∗i+1 Construye una función que reciba un número n y devuelva la aproximación de π mediante los n primeros sumandos de la expresión anterior (no hace falta utilizar ∧). 2.6. Bucles y condicionales A continuación se nos plantea la necesidad de contar los divisores de un número natural n. Para ello hay que combinar un bucle con un condicional, es decir hay que recorrer todos los potenciales candidatos a divisor que van desde 1 a n y entre ellos ver los que realmente son divisores de n. En caso de que verifiquen la condición la variable de conteo de divisores se incrementa en una unidad y en el caso opuesto no se altera. % ud2_fcuentadiv % ud2_fcuentadiv(n) cuenta los divisores de n % primer uso de mod function num=ud2_fcuentadiv(n) num=0; i=1; while i<=n if mod(n,i)==0 num=num+1; end i=i+1; end Los ejercicios correspondientes a este ejemplo son los siguientes: Ejercicio 2.28 Copia el ejemplo ud2 fcuentadiv a tu directorio. Pruébalo con algunos valores y comprueba que los resultados son correctos. Ejercicio 2.29 Construye una función que reciba un número natural n y devuelva 0 si n es par y 1 si n es impar. Se usará la orden mod. Ejercicio 2.30 Construye una función que reciba un número n, cuente los números que son pares y no son múltiplos de 3 entre 1 y n y devuelva ese valor. Pág. 60 UNIDAD DIDÁCTICA 2. BUCLES Ejercicio 2.31 Construye una función que reciba un número n, recorra los valores sin(1), sin(2), sin(3), . . . , sin(n), y devuelva el número de ellos que son positivos. Ejercicio 2.32 Construye una función que reciba un número n, recorra los valores sin(1), sin(2), sin(3), . . . , sin(n), y devuelva el producto de los que son positivos. Ejercicio 2.33 Construye una función que reciba un año y devuelva su siglo. Ejercicio 2.34 La siguiente función que recibe un número n y deberı́a devolver el número de valores entre 1 y n para los que sin es mayor que 1/2 menos para los que es menor que −1/2. Corrige los errores que tiene. function c=ud2_fprueba2(n) i=1; while i<=n if sin(i)>1/2 c=c+1; else c=c-1; end i=1+1; end Ejercicio 2.35 Construye una función que reciba dos números naturales m y n, y devuelva la cantidad de divisores comunes. Ejercicio 2.36 (Para valientes) Construye una función que reciba dos números naturales m y n, y devuelva su máximo común divisor. Ejercicio 2.37 (Para valientes) Construye una función que reciba dos números naturales m y n, y devuelva su mı́nimo común múltiplo. Ejercicio 2.38 (Para valientes) Construye una función que reciba 3 naturales m, n, p y devuelva una variable f lag tal que f lag = 1 si el mı́nimo de los máximos comunes divisores entre dos de estos números corresponde a la pareja m, n. f lag = 2 si es m, p y f lag = 3 si es n, p. Si por ejemplo m = 20, n = 30, p = 15, f lag valdrı́a 2. No se podrá llamar a 2.36. Ejercicio 2.39 (Para valientes) Construir una función que reciba un número natural y devuelva el número de ceros que hay en él (ası́, por ejemplo, en 304 hay un cero, en 30 hay un cero y en 115 no hay ningún cero). Para contar cuántas cifras tiene el número, podéis usar log10. Pág. 61 Lenguajes de Programación: Guı́a ECTS 2.7. Uso de bucles para verificar una condición sobre un conjunto. El ejemplo que se ilustra a continuación tan sólo devuelve un valor 1 o 0 en el caso de que el número que introducimos como argumento sea o no primo. Al igual que en el caso anterior el bucle nos vale para recorrer todos los posibles candidatos que pueden cumplir una condición, en este caso ser divisor del argumento numero. A diferencia del caso anterior basta con que la condición se cumpla una vez para que no haga falta continuar el bucle, y podamos asegurar que el número no es primo devolviendo por tanto un cero. % ud2_fesprimo % ud2_fesprimo(numero) devuelve 1 si numero es primo % y 0 si no lo es % orden break. function primo=ud2_fesprimo(numero) primo=1; i=2; while i<=sqrt(numero) if mod(numero,i)==0 primo=0; break; end i=i+1; end Los ejercicios correspondientes a este ejemplo son los siguientes: Ejercicio 2.40 Prueba la función ud2 fesprimo. Ejercicio 2.41 Construye una función que reciba un número natural n y devuelva su divisor más grande distinto de sı́ mismo. Ejercicio 2.42 Idem más pequeño y distinto de 1. Ejercicio 2.43 Construye una función que reciba dos enteros, m, n, con m < n y devuelva el menor número entero r entre m y n tal que sin(r) > 0 (se usará break). Se supondrá que existe solución. Por ejemplo, si m = 16 y n = 27 el resultado debe ser 19. Ejercicio 2.44 Idem sin break. Ejercicio 2.45 Construye una función que reciba un natural n y devuelva el mayor número entero positivo m < n tal que sin(m) < 0. (se usará break). Se supondrá que existe solución. Por ejemplo, si n = 29 el resultado ha de ser 25. Pág. 62 UNIDAD DIDÁCTICA 2. BUCLES Ejercicio 2.46 Idem sin break. Ejercicio 2.47 Utilizando la función ud2 f cuentadiv, construye una función que haga lo mismo que ud2 f esprimo. Ejercicio 2.48 Construir una función que reciba un número natural n y un valor prec, itere la sucesión √ xi+1 = 2xi , x1 = 8, 32, i ∈ N y si para algún 1 < i ≤ n, |xi − xi−1 | < prec, devuelva xi . Si no, devolverá xn . Ejercicio 2.49 Modificar la función creada en el ejercicio 2.23 para que reciba un número num, y devuelva el primer elemento xi de la sucesión de Fibonacci x1 = 1, x2 = 2, xi = xi−1 + xi−2 tal que xi sea mayor que num. Nota: Como en cada iteración sumamos más de 1, como mucho tendrı́amos que hacer n iteraciones. Ejercicio 2.50 Crea una función que reciba un número num, calcule los términos de la sucesión de Fibonacci x1 = 1, x2 = 2, xi = xi−1 + xi−2 menores que num y devuelva el número de ellos que son primos. Ejercicio 2.51 (Para valientes) Crea una función que reciba un número num y devuelva 1 si descompone en producto de dos primos y 0 si no es ası́. Por ejemplo, para num = 6 = 3 · 2 devolverá 1 y para num = 7 o num = 12 devolverá 0. Usa la función ud2 f esprimo para determinar si un número es primo o no. 2.8. Bucles anidados. Al igual que hemos visto que se pueden encontrar unos condicionales anidados dentro de otros, esto mismo ocurre con los bucles. En el ejemplo presentado a continuación vamos a contar la cantidad de números primos que hay menores o iguales que el argumento de entrada n sin contar con el 1, esto lo llevaremos a cabo mediante el ı́ndice i. Para ello planteamos un primer bucle donde i vaya desde 2 hasta n, y en cada uno de los casos realizamos un bucle interno sobre los posibles divisores de i que vienen representados por el ı́ndice j. Se deja al estudiante entender el porqué se limita el crecimiento del ı́ndice j hasta que sea menor o igual que la raı́z cuadrada de i. % ud2_fnprimos.m % ud2_fnprimos(n) devuelve el número de primos % menores o iguales que n. No contamos el 1 como primo. % primer doble bucle (bucles anidados) function p=ud2_fnprimos(n) i=2; p=0; while i<=n j=2; primo=1; while j<=sqrt(i) Pág. 63 Lenguajes de Programación: Guı́a ECTS if mod(i,j)==0 primo=0; %i no es primo break; end j=j+1; end if primo==1 p=p+1; end i=i+1; end Los ejercicios correspondientes a este ejemplo son los siguientes: Ejercicio 2.52 Prueba la función ud2 fnprimos Ejercicio 2.53 Construye una función que calcule el número de primos menores o iguales que un número n sin utilizar un doble bucle y llamando a ud2 fesprimo. Ejercicio 2.54 Construye una función que reciba dos naturales, m y n, con m < n y devuelva la suma de los números primos entre m y n. Ejercicio 2.55 Construye una función que calcule la suma de de los primos menores o iguales que un número n sin llamar a ud2 fesprimo. Ejercicio 2.56 Construye una función que reciba dos naturales, m y n, con m < n y devuelva el producto de los números primos entre m y n (sin llamar a ud2 fesprimo). Ejercicio 2.57 Construye una función que reciba 3 naturales, m, n, p, con m < n y calcule: m + m2 + · · · + mp + (m + 1) + (m + 1)2 + · · · + (m + 1)p + · · · + n + n2 + · · · + np Ejercicio 2.58 Construye una función que reciba dos naturales, m y n, con m < n y devuelva el mayor número primo entre m y n. (Para valientes) Hacerlo sin usar break. Ejercicio 2.59 Construye una función que reciba dos naturales, m y n, con m < n y devuelva el menor número primo entre m y n. (Para valientes) Hacerlo sin usar break. Ejercicio 2.60 (Para valientes) Construye una función que reciba dos naturales, m y n, con m < n y devuelva el mayor número primo entre m y n. No se podrá usar ud2 fesprimo. Pág. 64 Unidad Didáctica 3 Vectores 3.1. General La unidad 3 introduce un elemento fundamental en Programación: los vectores o “arrays”de datos. No hay apenas órdenes nuevas en esta unidad y nos concentramos en desarrollar algoritmos más interesantes, los cuales permiten resolver problemas más complejos y similares a los reales. Los vectores están muy relacionados con los bucles que hemos estudiado en la unidad 2 pues son los bucles los que nos permiten movernos con generalidad por los vectores. 3.2. Vectores como argumentos de funciones Este ejemplo es la primera función en la que se usa un vector. Además, ese vector es en si mismo el argumento de entrada de la función, lo cual no requiere ninguna sintaxis especı́fica. Como sabemos, desde que hicimos el tutorial (apéndice 0), podemos preguntar a un vector o a una matriz su tamaño. Para ello disponemos de la orden length. Esto no es en general ası́ si usamos otro lenguaje de programación, ya que en principio, además del vector, habrı́a que pasar como argumento un número natural correspondiente a su dimensión. En MATLAB no es necesario pero la primera lı́nea de la función es una asignación de ese valor a una nueva variable n que nos va a permitir montar el bucle para movernos por el vector. Para obtener la media tenemos que sumar todos los elementos del vector. Para ello, inicializamos a 0 la variable suma y mediante un bucle la vamos incrementando con los elementos del vector. Finalmente dividimos por su dimensión para tener la media. % ud3_fmedia.m % ud3_fmedia(v) recibe un vector v y % devuelve el valor medio de los elementos de v % Con esta funcion se introduce el uso de vectores function m=ud3_fmedia(v) n=length(v);% n es la dimensión o número de % elementos del vector suma=0; % Inicializamos la suma a 0 i=1; while i<=n suma=suma+v(i); % Sumamos el elemento i-esimo de v i=i+1; end m=suma/n; % Una vez sumados, hallamos la media Los ejercicios correspondientes a este ejemplo son los siguientes: Ejercicio 3.1 Pág. 65 Lenguajes de Programación: Guı́a ECTS Crea una carpeta llamada ud3 en Z : Copia en ella todos los ejemplos cuyo nombre empiece por ud3 , los cuales encontrarás en la carpeta: Asignaturas\LP \Ejemplos Añade la carpeta Z :\ud3 al path o Current Directory de MATLAB. Ejercicio 3.2 Prueba la función ud3 fmedia.m para diferentes vectores. Ejercicio 3.3 Crea una función que reciba un vector y devuelva la media de los cuadrados de los elementos del vector. ¿Coincidirá el resultado con la media al cuadrado? Ejercicio 3.4 Crea una función que reciba un vector y devuelva la media geométrica de los elementos del vector. √ La media geométrica de {a1 , . . . , an } es n a1 a2 . . . an . Ejercicio 3.5 Crea una función que reciba dos vectores y devuelva el producto escalar de los mismos. Esta función también se puede hacer sin utilizar bucles, como vimos en el tutorial. Se supondrá que los dos vectores tienen la misma dimensión. 3.3. Funciones que llaman a funciones con argumentos vectores Del mismo modo que en el ejemplo 1.6 estudiamos una función que llamaba a otra función, en este ejemplo vemos una función que recibe un vector y llama a otra función que recibe un vector, la que acabamos de estudiar, ud3 fmedia. La sintaxis no ofrece ninguna dificultad. % ud3_fvarianza.m % ud3_fvarianza(v) recibe un vector v y % devuelve la varianza de los valores contenidos en el vector v % Se llama a una función que recibe un vector (ud3_fmedia) function var=ud3_fvarianza(v) suma2=0; m=ud3_fmedia(v); n=length(v); i=1; while i<=n suma2=suma2+(v(i)-m)ˆ2; i=i+1; end var=suma2/(n-1); De esta función no haremos ningún ejercicio especı́fico, simplemente probar la función para diferentes vectores, comprobando el significado del concepto varianza1 . Tendremos ocasión de hacer abundantes ejemplos más adelante. Ejercicio 3.6 Prueba la función ud3 fvarianza.m para diferentes vectores. 1 Es una medida de como de semejantes son los elementos de un vector. Si son similares, la varianza es pequeña y si son muy diferentes, la varianza será grande. Pág. 66 UNIDAD DIDÁCTICA 3. VECTORES 3.4. Cálculo de extremos Los algoritmos de búsqueda de extremos son fundamentales en este curso y el más básico de todos ellos es el de encontrar el máximo de una serie o vector. Para ello, se supone que el máximo es el primero inicializando con ese valor una variable maxi que será la que almacene el máximo al final. A continuación se van barriendo los demás elementos y en el momento en que encontramos un valor mayor que el que tenemos como referencia, maxi, asignamos a maxi ese valor. % ud3_fmaximo.m % ud3_fmaximo(v) recibe un vector v y devuelve % la mayor de sus componentes % El algoritmo de busqueda de maximo es fundamental en el curso. function maxi=ud3_fmaximo(v) n=length(v); maxi=v(1); i=2; while i<=n if v(i)>maxi maxi=v(i); end i=i+1; end Es importante, muy importante, entender todos los detalles de este ejemplo. MATLAB dispone de una función que realiza esta misma tarea, max, pero ello no es óbice para estudiar el algoritmo, el cual es fundamental. Los ejercicios correspondientes a este ejemplo son especialmente interesantes reflejando la importancia del algoritmo explicado. Ejercicio 3.7 Prueba la función ud3 fmaximo.m para diferentes vectores. Ejercicio 3.8 Crea una función que reciba un vector y devuelva el mı́nimo de los elementos del vector. Ejercicio 3.9 Crea una función que reciba un vector de números naturales y devuelva el número de elementos del vector que sean múltiplos de tres. Ejercicio 3.10 Crea una función que reciba un vector v, cambie de signo todos los elementos del vector, calcule el máximo del nuevo vector y lo devuelva cambiado de signo. ¿Qué valor has obtenido? Ejercicio 3.11 Crea una función que reciba un vector y calcule la media de los elementos positivos del vector. En lugar de sumar todos los elementos, tendrás que comprobar si un elemento es positivo o no antes de sumarlo. Ejercicio 3.12 Crea una función que reciba un vector de números naturales y utilizando la función ud2 f esprimo, devuelva el número de elementos del vector que son primos. Pág. 67 Lenguajes de Programación: Guı́a ECTS Ejercicio 3.13 Idem sin if. Ejercicio 3.14 Crea una función que reciba un vector y que devuelva 1 si todos los elementos del vector son positivos y 0 en caso contrario. Ejercicio 3.15 Crea una función que reciba un vector de números naturales y utilizando la función ud2 f esprimo y sin utilizar if devuelva 1 si todos los elementos del vector son primos y 0 en caso contrario. Ejercicio 3.16 Codifica una función que reciba un vector de naturales v y devuelva el primer número primo que aparezca en el vector. Caso de que no haya ninguno, devolverá 0. Por ejemplo, si v = (9, 14, 11, 7, 12), la función devolverá 11. Ejercicio 3.17 Crea una función que reciba un vector v y devuelva el mı́nimo de las diferencias en valor absoluto entre un elemento de v y la media de v. Por ejemplo, si v = [3 2 1 7], la media vale 3.25 y la diferencia mı́nima es k3 − 3.25k = 0.25. Ejercicio 3.18 Crea una función que reciba un vector v y devuelva el valor del elemento de v que esté más cerca de la media. Por ejemplo, si v = [3 2 1 7], la media vale 3.25 y el elemento más proximo a la media es 3. Ejercicio 3.19 Crea una función que reciba un vector v y devuelva el ı́ndice del elemento de v que esté más cerca de la media. Por ejemplo, si v = [3 2 1 7], la media vale 3.25 y el elemento más proximo a la media es el 1. Cambiad de orden los elementos en este ejemplo para probar el código y comprobar que funciona en todas las circunstancias. Ejercicio 3.20 Crea una función que reciba un vector v y devuelva el mı́nimo de las diferencias entre un elemento de v y la media de v. Por ejemplo, si v = [3 2 1 7], la media vale 3.25 y la diferencia mı́nima es 1-3.25=-2.25. Ejercicio 3.21 Crea una función que reciba un vector v y devuelva el ı́ndice del elemento en el que se dé el mı́nimo de las diferencias entre un elemento de v y la media de v. Por ejemplo, si v = [3 2 1 7], la media vale 3.25 y la diferencia mı́nima es 1-3.25=-2.25. El ı́ndice del elemento cuyo valor es 1 es 3, pues ocupa la tercera posición en el vector. Ejercicio 3.22 ¿Qué valor devuelve la siguiente función (v es un vector de números naturales)? Pág. 68 UNIDAD DIDÁCTICA 3. VECTORES function y=ud3_fprueba(v) n=length(v); i=1; y=v(1); while i<=n if ud2_fesprimo(i)==1 & v(i)>y y=v(i); end i=i+1; end Ejercicio 3.23 (Para valientes) Crea una función que reciba un vector de naturales y devuelva 1 si todos los elementos son primos y 0 en caso contrario, sin usar if. 3.5. Cálculo de posición de extremos A veces no interesa tanto el valor del máximo como su posición en el vector. En esta función se juega con esa idea, de tal modo que se guarda posición cuando se supera la posición de referencia inicial (la primera). Es un algoritmo muy interesante y esencialmente más complicado y difı́cil de entender que el anterior. % ud3_fimax.m % ud3_fimax(v) recibe un vector v y devuelve % la posicion de la mayor de sus componentes function imax=ud3_fimax(v) n=length(v); imax=1; % Tomamos como maximo el primer elemento i=2; while i<=n if v(imax)<v(i) % Si encontramos un elemento mayor imax=i; % actualizamos el valor de la posicion end i=i+1; end % Al final imax contiene la posición de la mayor de las componentes Los ejercicios correspondientes a este ejemplo son también bastante interesantes. Ejercicio 3.24 Prueba la función ud3 fimax.m para diferentes vectores. Ejercicio 3.25 Crea una función que reciba un vector de naturales y devuelva el ı́ndice del primer número primo que aparezca en el vector. En caso de que no haya ninguno, devolverá 0. Ejercicio 3.26 Crea una función que reciba un vector de naturales y devuelva el ı́ndice del mayor primo que aparezca en el vector. En caso de que no haya ninguno, devolverá 0. Ejercicio 3.27 Pág. 69 Lenguajes de Programación: Guı́a ECTS La siguiente función recibe un vector y deberı́a devolver la mayor diferencia entre dos términos consecutivos (la diferencia de un elemento menos el anterior). Encuentra los errores. function y=ud3_fprueba3(v) n=length(v); y=0; while i<=n if abs(v(i)-v(i-1))>y y=v(i)-(v(i)-1); end end Pruébala con los vectores (1, 1, 1), (1, 2, 1), (1, 2, 4) y (4, 2, 1) (deberı́a devolver 0, 1, 2 y -1. 3.6. Evaluación de un polinomio El ejemplo correspondiente a esta sección ejemplifica el caso de una función que recibe escalares y vectores como argumentos de entrada. Se trata de evaluar un polinomio en un punto, devolviendo el valor obtenido. Tiene detalles interesantes que pasamos a comentar. El primero es el de la identificación de un polinomio de grado n con un vector de n + 1 componentes y por tanto, dimensión n + 1. Ası́, si tenemos el siguiente polinomio de grado n la representación habitual que de él se hace serı́a: a0 + a1 x + a2 x2 + · · · + an−1 xn−1 + an xn De este modo, este polinomio se identificarı́a de modo inmediato con el vector a. a = (a0 , a1 , · · · , an−1 , an ) Sin embargo, no podemos trasladar esto directamente a MATLAB pues la indexación de los vectores siempre empieza por la componente 1. Ello invita a repensar polinomio y vector del siguiente modo: a1 + a2 x + a3 x2 + · · · + an xn−1 + an+1 xn a = (a1 , a2 , · · · , an , an+1 ) Por tanto, el polinomio 2.5−3.7x2 +0.5x3 se corresponderı́a con el vector a = (2.5, 0.0, −3.7, 0.5). Como se puede observar, grado 3 pero dimensión 4. La forma más directa de construir una función que evaluase este polinomio a en un punto x serı́a function y=ud3_fevalua0(a,x) n=length(a)-1; y=a(1); i=2; while i<=n+1 y=y+a(i)*xˆ(i-1); i=i+1; end en la cual simplemente vamos incrementando la variable y en el sumando ai xi−1 , hasta que i sea n + 1. Para invocar esta función desde la lı́nea de comandos, evaluando el ejemplo anterior en x = 2 tendremos: Pág. 70 UNIDAD DIDÁCTICA 3. VECTORES >> ud3_fevalua0([2.5 0.0 -3.7 0.5],2) ans = -8.3000 Para comprobar, haremos las siguientes operaciones: >> 2.5+0.0*2-3.7*2ˆ2+0.5*2ˆ3 ans = -8.3000 Existe un algoritmo que evita el tener que calcular todas esas potencias ahorrando cierto tiempo. Se llama algoritmo de Horner2 En el algoritmo de Horner, el polinomio escribe del Figura 3.1: Zoetropo de Horner siguiente modo: a1 + x(a2 + x(a3 + x(a4 + · · · + x(an + xan+1 )))) Es como si el polinomio 2.5−3.7x2 +0.5x3 lo escribiésemos como 2.5+x(0.0+x(−3.7+x0.5)). Ello conduce a un algoritmo diferente en el que se empieza por el término de grado más alto y se va hacia abajo después. Con ello, en este ejemplo aprendemos a recorrer el vector utilizando un orden distinto al habitual y aprendemos también a desconectar la variable n de la dimensión del vector, algo que en general os cuesta mucho. % % % % % % ud3_fevalua.m ud3_fevalua(a,x), recibe un vector a de dimensión n+1 y un escalar x y devuelve el polinomio a(n+1)xˆn+...+a(2)x+a(1) evaluado en x, escribiendolo como x(...(x(x a(n+1)+ a(n))+a(n-1))...+a(2))+a(1) En este ejemplo, mostramos como recorrer los elementos de un vector en otro orden y trabajamos con n distinto de la dimension del vector function y=ud3_fevalua(a,x) n=length(a)-1; 2 William George Horner (Bristol, 1786, Bath, 1837), matemático inglés conocido por haber desarrollado métodos para resolver ecuaciones polinómicas y sobre todo por ser el inventor del zoetropo(fig. 3.1), artilugio que creaba la ilusión óptica de movimiento, y a partir del cual se evolucionó hasta la invención del cine. Pág. 71 Lenguajes de Programación: Guı́a ECTS y=a(n+1); i=n; while i>=1 y=x*y+a(i); i=i-1; end Los ejercicios correspondientes a este ejemplo son bastante interesantes. Ejercicio 3.28 Prueba la función ud3 fevalua.m. Ejercicio 3.29 Aproximación del seno. Para obtener un valor aproximado del seno de un ángulo α evaluamos el polinomio de Taylor: α3 α5 α7 α− + − 3! 5! 7! Usando la función ud3 f evalua.m, crea una función que reciba un valor de α y devuelva el valor del seno de α, calculado a partir de la fórmula anterior. Ejercicio 3.30 La siguiente función recibe un vector v y una posición i y devuelve la diferencia entre el primer y el elemento i-ésimo. ¿Es correcta? ¿Podrı́as hacerla más eficiente? function dif=ud3_fdiferencia(v,pos) n=length(v); i=1; while i<=n if i==pos dif=v(1)-v(i); end i=i+1; end Pista: No se deberı́a usar un bucle ni un condicional. Ejercicio 3.31 Crea una función que reciba dos vectores, el primero de los cuales serán los coeficientes de un polinomio p(x). La función devolverá 1 si en el segundo vector aparece una raı́z de p(x) y 0 en caso contrario. Utiliza ud3 f evalua.m para comprobar si un número es raı́z del polinomio o no. Ejercicio 3.32 Crea una función que reciba un vector t y un número x y evalué en x el polinomio (x − t1 )(x − t2 ) . . . (x − tn ), donde n es la dimensión del vector t. Es decir, evalúa en x el vector de coeficiente principal 1 cuyas raı́ces son los elementos de t. Ejercicio 3.33 Pág. 72 UNIDAD DIDÁCTICA 3. VECTORES Crea una función que reciba un vector de naturales v y un natural d y devuelva 1 si todos los elementos de v son divisibles por d y 0 en caso contrario. Ejercicio 3.34 Crea una función que reciba un número y un vector y devuelva el número de veces que aparece ese número en el vector. Ejercicio 3.35 (Para valientes) Usando la función creada en el apartado 3.34, construir una función que reciba un vector y devuelva el elemento que se repite más veces. Por ejemplo, en [0 1 2 1] devolverı́a 1. Ejercicio 3.36 (Para valientes) Crea una función que reciba α y un número n y devuelva el valor del seno en α aproximándolo por el polinomio de Taylor en 0 de grado n. 3.7. Función que devuelve un vector A menudo, la salida de nuestras funciones pueden ser también vectores. En MATLAB, la sintaxis no cambia con respecto a la de una variable escalar convencional. En este ejemplo, además ese vector se construye a partir de varios escalares, pues de lo que se trata es de construir un vector con los términos de la sucesión de Fibonacci, la cual ya estudiamos en el ejercicio 2.23. % ud3_fibo % ud3_fibo(x1,x2,n) devuelve los n primeros % terminos de la sucesion de Fibonacci % x_1=x1, x_2=x2, x_n=x_(n-1)+x_(n-2) % Por primera vez definimos una funcion que % devuelve un vector, y lo construimos con % argumentos de entrada escalares. function v=ud3_fibo(x1,x2,n) v(1)=x1; v(2)=x2; i=3; while i<=n v(i)=v(i-1)+v(i-2); i=i+1; end Los ejercicios correspondientes a este ejemplo son: Ejercicio 3.37 Prueba la función ud3 fibo.m. Ejercicio 3.38 Construye una función que reciba un número natural n y devuelva un vector v tal que sus componentes sean   1 i vi = 1 + , 1≤i≤n i Llama desde MATLAB a la función. ¿A qué tienden las componentes del vector resultado?. Ejercicio 3.39 Pág. 73 Lenguajes de Programación: Guı́a ECTS Construye una función que reciba un número natural n y devuelva un vector formado por los n primeros términos de la sucesión √ x1 = 2, 456, xi+1 = 2xi , i ∈ N Comprobar que converge a 2. Ejercicio 3.40 Crea una función que reciba dos valores, xmin, xmax, y el número de tramos n. La función calculará el valor xmax − xmin h= , n y devolverá un vector x de n+1 componentes que contenga los puntos entre xmin y xmax separados cada dos una distancia h. Ası́ pues, x1 = xmin, x2 = xmin + h, ..., xn+1 = xmin + nh = xmax. Ejercicio 3.41 (Para valientes) Construye una función que reciba un número natural y devuelva el vector formado por sus cifras. Ası́, si introducimos 1423, devolverá [1 4 2 3]. Ejercicio 3.42 (Para los más valientes) Criba de Eratóstenes. La manera más rápida de obtener todos los números primos menores que un número dado n es mediante la Criba de Eratóstenes. El procedimiento es el siguiente: se toman todos los números menores que n y se van eliminando de la lista los múltiplos de dos, los múltiplos de tres y ası́ sucesivamente hasta llegar a los múltiplos de la raı́z cuadrada de n. Ejercicio 3.43 Crea una función que reciba un número n y devuelva todos los números primos menores que n mediante la Criba de Eratóstenes. Como lista de números, usaremos un vector v de dimensión 100 que tenga en la posición i el número i y para marcar el número como eliminado, pondremos un 0 en dicha posición. √ Para mejorarlo, elimina los múltiplos de los números primos entre 2 y n en lugar de eliminar √ los múltiplos de todos los números entre 2 y n. Nótese que según vamos aplicando la criba de Eratóstenes vamos obteniendo los números primos, ası́ que podemos utilizar la información guardada en el vector para este caso. Ejercicio 3.44 Determina qué valor devolverá la siguiente función si v = (1, 3, 2, 5, 4). function y=ud3_fprueba2(v) n=length(v); i=1; y=1; while i<=n if v(i)>y y=i; end i=i+1; end Pág. 74 UNIDAD DIDÁCTICA 3. VECTORES 3.8. Funciones que reciben y devuelven vectores Cuando queramos por ejemplo una función que nos devuelva una curva evaluada en una serie de valores estructurados a su vez como un vector, deberemos tener la posibilidad de recibir un vector en la función y devolver otro vector. La sintaxis no ofrece ningún problema, pero conceptualmente hay que saber moverse a través del vector de partida y generar otro. Vamos a plantear primero un ejemplo sencillo en el que se trata simplemente de codificar una función que reciba un vector de abscisas x y devuelva un vector de ordenadas y tal que para cada abscisa xi , la ordenada correspondiente yi sea el máximo de las funciones seno y coseno evaluadas en xi . % ud3_fmaxsincos % ud3_fmax_vect(x) recibe un vector x y devuelve el vector % y tal que cada componente de y es el maximo de las % funciones seno y coseno evaluadas en cada componente de x % Primera función que recibe un vector y devuelve otro vector % function y=ud3_fmaxsincos(x) n=length(x); i=1; while i<=n if sin(x(i))>cos(x(i)) y(i)=sin(x(i)); else y(i)=cos(x(i)); end i=i+1; end Para probar esta función podemos ejecutar los siguientes comandos desde la ventana de comandos de MATLAB. >>x=0:0.01:8*pi; >>y=ud3_fmaxsincos(x); >>plot(x,y); Otra posibilidad sencilla pero también interesante es el de tener una función que reciba un vector y uno o varios escalares y devuelva otro vector. Presentamos este ejemplo en el que se trata simplemente de codificar una función que reciba un vector x y un escalar a. La función devolverá un vector y, tal que la componente yi de ese vector será 0 si la correspondiente xi es menor que a y 1 en caso contrario. % ud3_fmayormenor % ud3_fmayormenor(x,a) recibe un vector x y devuelve el % vector y tal que cada componente de y vale 0 o 1 % dependiendo de que la correspondiente de x sea menor % o mayor o igual que a % function y=ud3_fmenormayor(x,a) n=length(x); i=1; while i<=n if x(i)<a y(i)=0; else y(i)=1; end i=i+1; end Pág. 75 Lenguajes de Programación: Guı́a ECTS Presentamos un ejemplo más que tiene el interés de que llamamos a una función para ir calculando el valor de cada componente del vector resultado. Se trata de codificar una función que reciba un vector de naturales u y devolver un vector vprimos tal que cada componente de vprimos vale uno o cero en función de que la correspondiente componente de u sea o no prima. % % % % % ud3_fvprimos ud3_fvprimos(u) recibe un vector de naturales u y devuelve un vector vprimos tal que cada componente de vprimos vale uno o cero dependiendo de que la componente correspodiente de u sea o no prima. function vprimos=ud3_fvprimos(u) n=length(u); i=1; while i<=n vprimos(i)=ud2_fesprimo(u(i)); i=i+1; end En algunos casos, se puede utilizar la vectorización de operaciones explicada en el tutorial para evitar uno de los bucles en la función, pero en general eso no será posible. Los ejercicios correspondientes a este ejemplo son: Ejercicio 3.45 Prueba las funciones ud3 fmaxsincos.m, ud3 fmenormayor.m y ud3 fvprimos.m. Ejercicio 3.46 Crea una función que reciba un vector x y devuelva un vector y tal que yi = x2i − log(x2i + 1) (se podrı́a hacer sin while, vectorizando las operaciones). Ejercicio 3.47 Crea una función similar a la función ud3 fmaxsincos.m que calcule el máximo entre la función del ejercicio 3.46 y el seno. Dibuja la curva resultado de modo análogo a como se dibujó la de dicha función. Ejercicio 3.48 Crea una función que reciba un vector x y devuelva un vector y tal que para cada ı́ndice i, yi sea la aproximación de sin(xi ) dada por: yi = xi − x3i x5 x7 + i − i. 3! 5! 7! Se llamará a la función del ejercicio 3.29 del modo que convenga. Dibuja con MATLAB el seno y su aproximación por la función anterior en [−π/2, π/2], con al menos 1000 puntos. Ejercicio 3.49 Construye una función que reciba un vector de naturales, (m1 , m2 , . . . , mn ) y devuelva el vector de los factoriales, (m1 !, m2 !, . . . , mn !). Representa en una gráfica la función factorial entre 1 y 10 y la función exponencial entre 1 y 10. Para mejorar la gráfica, cambiamos la escala a logarı́tmica, es decir, aplicamos el logaritmo a cada una de las funciones. ¿Cuál de las dos funciones crece más rápido? Ejercicio 3.50 Pág. 76 UNIDAD DIDÁCTICA 3. VECTORES Crea una función que reciba un vector v y devuelva un vector con los elementos del vector v pero en orden inverso al original. Ejercicio 3.51 Crea una función que reciba un vector x y dos valores a y b, con a < b, y devuelva un vector y que es el original truncado entre a y b. Ejercicio 3.52 Crea una función que reciba un vector y devuelva los datos escalados entre cero y uno. Para ello determinaremos el valor mı́nimo del vector. Restamos ese valor al vector para que los datos comiencen en cero. Calculamos el máximo del nuevo vector y dividimos cada elemento del vector por dicho máximo. Al final tenemos que obtener un vector de números entre cero y uno, de modo que el menor sea cero y el mayor uno y las diferencias entre dos elementos del vector original y los correspondientes escalado sean proporcionales. Ejercicio 3.53 (Para valientes) Modifica la función anterior para que reciba un vector y dos valores a y b y devuelva el vector escalado entre a y b. 3.9. Construcción de vectores A menudo surgen problemas en los que a partir de un vector es necesario construir un nuevo vector que no tiene la misma dimensión que el original, situación esencialmente más sencilla que ya hemos contemplado en la sección 3.8. Además, al construir este nuevo vector a partir del original, a menudo no sabemos el tamaño o dimensión del vector resultante. La gestión de la memoria RAM en estos casos requerirı́a un cierto cuidado en muchos lenguajes de programación pero MATLAB lo maneja con mucha simplicidad. Ası́, a medida que vamos definiendo nuevas posiciones del vector, ese vector crece en tamaño y la memoria RAM que se necesita para él es gestionada de modo automático por MATLAB. Para ilustrar esta idea planteamos un ejemplo muy sencillo pero también muy bonito, y que además sugiere infinidad de ejercicios muy interesantes, los cuales aparecerán a lo largo del resto del curso. Se trata de una función que recibe un vector y devuelve otro vector que contiene únicamente las componentes positivas del vector original, colocadas en el mismo orden en el que están en éste. Para ir construyendo este segundo vector, de tal modo que cada componente vaya en la posición correcta, necesitamos un nuevo contador sólo de componentes positivas. A medida que ese contador se va incrementando, vamos colocando en cada posición el elemento correspondiente. El código completo de este ejemplo es el siguiente: % ud3_fpositivas % Recibe un vector v y devuelve otro vp con las componentes % positivas de v. Es la primera funcion que recibe un % vector y va construyendo otro de dimensión distinta % que el original function vp=ud3_fpositivas(v) n=length(v); ip=0; i=1; while i<=n if v(i)>=0 ip=ip+1; vp(ip)=v(i); end i=i+1; end Pág. 77 Lenguajes de Programación: Guı́a ECTS Los ejercicios correspondientes a este ejemplo especı́ficamente son los siguientes: Ejercicio 3.54 Prueba ud3 f positivas.m. Ejercicio 3.55 Crea una función que reciba un vector u de números naturales, un natural m y devuelva un vector v que contenga aquellos elementos de u que sean divisores de m. Por ejemplo, si u = (10, 7, 4, 5, 3) y m = 40, el resultado serı́a v = (10, 4, 5) Ejercicio 3.56 Crea una función que reciba un vector y devuelva un vector con los números primos que contiene. Ejercicio 3.57 Crea una función que reciba un número n y devuelva un vector con los números primos que sean divisores de n. 3.10. Vectores y bucles anidados A menudo, es necesario anidar bucles para resolver determinados problemas con vectores. Por ejemplo si tenemos dos vectores de números enteros y queremos saber cuantos elementos comunes tienen (supuestos todos distintos en cada uno de los vectores), tendremos que fijar un elemento del primer vector y barrer todos los del segundo mediante un bucle y ası́ sucesivamente con el segundo, tercero, etc., lo que requiere otro bucle exterior a ese. % ud3_figuales % numero de elementos iguales entre dos vectores. Se % supone que todos los elementos en cada vector son distintos. % primeros bucles anidados con vectores. % function iguales=ud3_figuales(u,v) i=1; iguales=0; m=length(u); n=length(v); while i<=m j=1; while j<=n if u(i)==v(j) iguales=iguales+1; end j=j+1; end i=i+1; end Los ejercicios correspondientes a este ejemplo, muy interesantes, son: Ejercicio 3.58 Prueba la función ud3 figuales. Ejercicio 3.59 Modifica la función ud3 figuales para que funcione con vectores de números reales. Pág. 78 UNIDAD DIDÁCTICA 3. VECTORES Ejercicio 3.60 Construye una función que reciba un vector v de naturales y devuelva 1 si tiene dos elementos iguales y 0 en caso contrario. Ejercicio 3.61 Construye una función que reciba un vector v de naturales y devuelva ninguna función y por tanto habrá que usar bucles anidados. P vi !. No se podrá llamar a Ejercicio 3.62 (Para valientes) Crea una función que reciba un vector de números naturales y sin utilizar la función ud2 fesprimo, devuelva el número de elementos del vector que son primos. Ejercicio 3.63 (Para valientes) Crea una función que reciba un vector de números naturales y sin utilizar la función ud2 fesprimo, devuelva el primer elemento de del vector que sea primo. Ejercicio 3.64 (Para valientes) Crea una función que reciba un vector de números naturales y sin utilizar la función ud2 fesprimo, calcule y devuelva la media de los elementos primos para lo cual llamará a su vez a la función ud3 fmedia. Ejercicio 3.65 (Para valientes) Crea una función que reciba un vector de números enteros y devuelva 1 si la suma de dos cualesquiera de sus elementos es igual a un tercero y cero en caso contrario. Por ejemplo, para v = [2, 7, 5] devolverı́a 1 y para [−1, 2, 5] devolverı́a 0. Ejercicio 3.66 (Para valientes) Construye una función que reciba un vector v de naturales y devuelva el número de veces que se repita el que más veces se repita. Ejercicio 3.67 (Para valientes) Construye una función que reciba un vector v de naturales y devuelva el mayor de los repetidos, sin llamar a ninguna función. Ejercicio 3.68 (Para valientes) Construye una función que reciba un vector v de naturales y devuelva el mayor de los repetidos, llamando a ud3 fmaximo Ejercicio 3.69 (Para valientes) Crea una función que reciba un vector x, un entero n y devuelva un vector y tal que para cada ı́ndice i, yi sea la aproximación de sin(xi ) dada por un polinomio de Taylor en el 0 de grado n.Se usará la función 3.36. Por ejemplo, si introducimos el vector x = (1.9, 2.5, 2.8) y n = 7, el vector devuelto será la el resultado de evaluar el polinomio x3 x5 x7 + − . 3! 5! 7! en los puntos (1.9, 2.5, 2.8), o sea devolverá el vector y = (0.9454, 0.5885, 0.3078). El seno toma en esas mismas abscisa los valores (0.9463, 0.5985, 0.3350). Recuerda que en la unidad 2 hay un ejercicio, el 2.14, para calcular el factorial. x− Ejercicio 3.70 (Para valientes) Idem pero la evaluación del polinomio en cada valor del vector x se realizará llamando a la función ud3 fevalua. Ejercicio 3.71 (Para valientes) Idem sin llamar a ninguna función. Pág. 79 Lenguajes de Programación: Guı́a ECTS 3.11. Funciones con salidas múltiples En esta sección se presentan funciones que tienen más de un argumento de salida. Es un tema que no plantea dificultad a los estudiantes y que permite hacer funciones más interesantes. En múltiples ocasiones es necesario obtener varios resultados en una misma función, para lo cual es necesario pasarlos todos como argumentos de salida. La sintaxis es muy sencilla, simplemente se agrupan todos los argumentos entre corchetes y separados por comas. El ejemplo más elemental que se nos ha ocurrido es el de resolver una ecuación de segundo grado, la cual siempre tendrá 2 soluciones, sean reales, complejas o una raı́z doble. MATLAB es capaz de trabajar directamente con complejos pero es un tema al que apenas hemos prestado atención y que escapa a los contenidos del curso. Por tanto, propondremos ejemplos de ecuaciones que tengan raı́ces reales. % ud3_fe2grado.m % devuelve las dos soluciones de axˆ2+bx+c=0 function [x1,x2]=ud4_fe2grado(a,b,c) x1=(-b-sqrt(b*b-4*a*c))/(2*a); x2=(-b+sqrt(b*b-4*a*c))/(2*a); Para invocar esta función desde la lı́nea de comandos, lo haremos del siguiente modo, por ejemplo: >> [r,s]=ud3_fe2grado(1,-3,2) r = 1 s = 2 Con lo que se asignan a las variables r y s las dos raı́ces 1 y 2 de la ecuación x2 − 3x + 2 = 0. Ejercicio 3.72 Copia ud3 f e2grado.m a tu directorio y pruébala. Ejercicio 3.73 Crea una función que reciba los coeficientes de una ecuación de segundo grado y devuelva la suma y el producto de las soluciones. Ejercicio 3.74 Crea una función que reciba los coeficientes de la ecuación ax4 + bx2 + c = 0, que resuelva utilizando √ y = x2 llamando para ello a ud3 f e2grado.m, que deshaga el cambio de variable mediante x = ± y y que devuelva las cuatro soluciones de la ecuación original. Ejercicio 3.75 Modifica la función ud3 f e2grado.m para que si las raı́ces son números imaginarios (el discriminante b2 − 4ac es negativo) devuelva r1 = 0, r2 = 0 y otra variable error = 1. Si no son números imaginarios devolverá las dos raı́ces en r1 y r2 y error = 0. Ejercicio 3.76 Pág. 80 UNIDAD DIDÁCTICA 3. VECTORES Crea una función que reciba un vector y devuelva el máximo y el mı́nimo de sus elementos, sin usar las funciones min y max. Ejercicio 3.77 Crea una función que reciba un vector y devuelva la posición del máximo y del mı́nimo de sus elementos. Ejercicio 3.78 Crea una función que reciba un vector y devuelva el máximo, el mı́nimo y sus posiciones. Ejercicio 3.79 Crea una función que reciba un vector u y devuelva dos vectores up y un con las componentes positivas y negativas del vector u respectivamente, colocadas en el mismo orden. Ejercicio 3.80 Crea una función que reciba un vector u de números naturales y devuelva un vector con los números primos que contiene y otro con los no primos. Ejercicio 3.81 Crea una función que reciba un número n y devuelva un vector con los números primos que sean divisores de n. Ejercicio 3.82 Crea una función que reciba un vector v y devuelva un vector w y un número error de modo que: 1. Si todos los elementos de v son estrictamente positivos, devolverá w(i) = Ln(v(i)), 1 ≤ i ≤ n y error = 0. 2. Si algún elemento es menor o igual que cero, devolverá w = v y error = 1. Ejercicio 3.83 Crea una función que reciba los tres lados de un triángulo y devuelva en una variable lado, 1 si es equilátero, 2 si es isósceles y 3 si es escaleno y en una variable angulo, 3 si es obtuso, 2 si es rectángulo y 1 si es agudo. (Para valientes) La función devolverá 0 en las dos variables si los valores introducidos no forman un triángulo. Pág. 81 Lenguajes de Programación: Guı́a ECTS Pág. 82 Parte II Guı́a ECTS para estudiantes Pág. 83 Capı́tulo 1 Introducción Uno de los objetivos de este libro es ser un soporte de la introducción de la metodologı́a basada en los créditos europeos ECTS1 en la asignatura, aprovechando esta oportunidad para transformar el modo en el que enseñamos Programación. Ası́, se pasa de un paradigma con una evaluación que obtiene información únicamente de un examen final, a una evaluación basada completamente en los procesos, incorporada a los mismos y mucho más rica. En esta parte del libro se pretende documentar con todo detalle esta metodologı́a de evaluación, para que el estudiante la conozca y se ubique en la misma. Con estos cambios pretendemos mantener al estudiante activo a lo largo de todo el curso, proponiéndole mecanismos de enganche a la asignatura de modo continuo, tratando, como dice Stephen Ball en la cita que nos ha inspirado, de mantener a todos los alumnos trabajando, comprometidos y con la sensación de que no van a fracasar. En esta parte del libro detallamos los objetivos y los relacionamos con las actividades realizadas a lo largo del mismo, indicando en qué medida creemos que dichas actividades contribuyen a la consecución de los objetivos, e indicando también el tiempo que estimamos es necesario para realizar dichas actividades. También destacamos los recursos que creemos son necesarios para realizar dichas actividades, para finalmente reflexionar sobre el tipo de evaluación que creemos adecuado para un curso de este tipo, discutiendo sus ventajas e inconvenientes, y razonando sobre el esfuerzo que es necesario para realizarla. Esperamos que esta guı́a resulte útil y que cumpla los objetivos que antes citamos y que nos han llevado a escribirla. Ahora es el momento de que los estudiantes comprueben si ha sido ası́ y de que sugieran las mejoras que consideren convenientes. 1 Los créditos LRU, los que se asocian a cada asignatura al hacer la matrı́cula, se establecen únicamente en función del número de sesiones presenciales; por cada 10 horas de clase, un crédito. Los créditos ECTS contabilizan no sólo las horas de clase sino que intentan definir el peso de la asignatura teniendo en cuenta el esfuerzo en tiempo que le cuesta aprobarla a un alumno medio. Este esfuerzo significa no solo asistir a las clases sino también un trabajo bien individual bien con los compañeros realizado fuera de las horas de clase. Pág. 85 Lenguajes de Programación: Guı́a ECTS Pág. 86 Capı́tulo 2 Datos generales 2.1. Temporalidad y carácter 2.1.1. Ciclo Primero 2.1.2. Curso Primero 2.1.3. Cuatrimestre Primero 2.1.4. Carácter Obligatoria 2.2. Créditos LRU 4.5 siendo 1.5 teóricos y 3.0 prácticos 2.3. Departamento Departamento de Enseñanzas Básicas de la Ingenierı́a Naval 2.4. Profesores Antonio Souto Iglesias, antonio.souto@upm.es Leo González Gutiérrez, leo.gonzalez@upm.es Alicia Cantón Pire, alicia.canton@upm.es Pág. 87 Lenguajes de Programación: Guı́a ECTS 2.5. Créditos ECTS Horas/semana Total horas 1 15 2 30 Total 45 Horas no presenciales Total horas Prácticas 41 Examen – 4 Total 45 Total 90 Horas presenciales Teorı́a Prácticas Pág. 88 Capı́tulo 3 Objetivos 3.1. General Para contextualizar la definición de objetivos, algunas de las titulaciones disponen de su libro blanco correspondiente, en el cual se especifican los perfiles profesionales a los que se orienta la titulación. En el caso de la titulación INO esto no ha sido ası́ hasta bien entrado 2005, momento en que apareción un libro blanco orientado a las nuevas titulaciones post-Bolonia1 . Aunque en el estudio de las competencias transversales, no se presta una atención particular en ese libro a la Informática, ésta es, junto con los idiomas modernos, señalada como la materia básica más importante, para lo cual se recurrió a un significativo número de encuestas entre profesionales en activo. De hecho en el plan de estudios genérico que se elabora en ese libro blanco, se da una importancia equivalente a la formación obligatoria en Informática a la que corresponde a este curso de Lenguajes de Programación. Hablaremos ası́ primero de unos objetivos generales de la asignatura, a través de una categorización de los mismos en conocimientos, capacidades y actitudes. A partir de estos objetivos generales diseñaremos una serie de actividades las cuales agruparemos en una secuencia de unidades didácticas, que cubrirán unos objetivos especı́ficos, y precisarán de unos determinados recursos. 3.2. Objetivos generales: descripción Como hemos comentado, agrupamos los objetivos generales en 3 categorı́as: 1. Conocimientos. Cubren los aspectos más teóricos de la formación. 2. Capacidades. Referidos a aplicaciones, cuestiones prácticas, habilidades.... muy en lı́nea con el concepto de competencias. 3. Actitudes. Se refieren a determinados valores o motivaciones que se trate de generar o potenciar en el estudiante. Conocimientos: 1 http://www.aneca.es/activin/docs/libroblanco naval def.pdf Pág. 89 Lenguajes de Programación: Guı́a ECTS CoA. Adquirir una formación elemental en Informática conociendo el ordenador como una herramienta de trabajo y conocer de modo básico su estructura y funcionamiento. CoB. Conocer los principales tipos de datos y estructuras de control de la programación declarativa y aprender su sintaxis en un lenguaje de programación concreto. Hemos elegido el lenguaje script de MATLAB porque es una herramienta estándar en Ingenierı́a y porque, al tener una sintaxis sencilla, permite profundizar en los elementos de programación. Capacidades: Realizar un programa de ordenador es un proceso que consta de 4 fases: especificación, diseño, codificación, validación/verificación. La primera, la especificación, consiste en definir las caracterı́sticas del sofware que se va a programar. Aunque es una etapa importante queda fuera del contenido de esta asignatura, al ser muy dependiente del tipo de problemas industriales o de gestión a resolver, y no proceder su estudio en un curso de introducción a la Prgramación. Las capacidades que queremos desarrollar son las necesarias para las otras tres etapas: CpA. Codificación. El alumno debe ser capaz de “traducir” algoritmos sencillos a código MATLAB. Este es un “requisito normal” en el sentido de que es un objetivo que necesariamente deberá alcanzarse para superar la asignatura. Serán en general códigos no muy complejos, de una, dos o tres acciones a lo sumo. CpB. Diseño. El alumno debe ser capaz de analizar un problema sencillo y elaborar un algoritmo que lo resuelva. Este es un “requisito innovador” en el sentido de que lo consideramos importante, pero no esencial para superar la asignatura. CpC. Validación. El alumno debe ser capaz de encontrar sus errores, entenderlos y corregirlos. Este es un “requisito esperado”: no se evalúa directamente, pero está implı́cito en la evaluación de los objetivos CpA y CpB. Actitudes: AcA. Conseguir una motivación en el alumno que le impulse a profundizar en la Informática como herramienta necesaria para su futuro académico y profesional. AcB. Trabajo en equipo. Hoy en dı́a casi ningún proyecto involucra a un único ingeniero. Por tanto, consideramos que saber trabajar en equipo es imprescindible y que se deben ir formando las actitudes necesarias a lo largo de todos los estudios. AcC. Actitud positiva ante los problemas. El afan de superación y la perseverancia son actitudes necesarias para un buen ingeniero. AcD. Mejora continua. El aprendizaje, sobre todo el que perdura, no es labor de un dı́a ni de una semana, sino que requiere constancia y esfuerzo. AcE. Autocrı́tica. El alumno debe ser capaz de reflexionar sobre sus capacidades, esfuerzo y proceso de aprendizaje para determinar en qué punto está y qué acciones debe tomar en el futuro. Pág. 90 CAPÍTULO 3. OBJETIVOS 3.3. Prerrequisitos LP es una asignatura del primer cuatrimestre del primer año, y por tanto los prerrequisitos se refieren únicamente a que el estudiante debe haber cursado y aprobado los estudios de educación secundaria. Por tanto, se le supone una formación básica en Matemáticas. Además se puede suponer que están cursando simultáneamente las asignaturas de Cálculo y Algebra I, y por tanto manejan con cierta soltura sucesiones, vectores y matrices. 3.4. Otras asignaturas de las que LP es prerrequisito En el plan de estudios vigente2 no se contempla la existencia de prerrequisitos en el sentido estricto. Sin embargo, es conveniente haber cursado y superado LP antes de matricularse de la asignatura Métodos Numéricos3 , y de las asignaturas optativas o de libre configuración “Leguajes de Programación II” y “Complementos de Informática”. Además, los lenguajes de programación son útiles para muchas otras asignaturas, que pueden incluir trabajos para los que se necesite MATLAB y algunos elementos de Programación. 2 Plan 2002 de Ingeniero Naval y Oceánico de la Universidad Politécnica de Madrid En realidad esto esta implı́cito en la estructura del plan de estudios vigente, dado que no es posible matricularse de ninguna asignatura de cuarto año si no se han aprobado todas las del primer año 3 Pág. 91 Lenguajes de Programación: Guı́a ECTS Pág. 92 Capı́tulo 4 Programa y Metodologı́a En esta sección describiremos todas las actividades que creemos necesarias para conseguir los objetivos descritos en 3.2. Agruparemos estas actividades en una serie de unidades didácticas para facilitar su descripción, organización y temporalización. 4.1. Métodos docentes 4.1.1. Parte teórica de las sesiones DHOf Todas las sesiones DHOf1 se impartirán en el Centro de Cálculo (CC). Durante la parte de exposición de teorı́a se introducirá cada uno de los temas ayudándose de ejemplos (ver parte I), utilizando la pizarra electrónica que proporciona la interfaz tablet del portátil. Además, se comentarán los problemas observados durante la parte más práctica de la clase y cómo evitarlos. Asimismo, al principio de cada sesión habrá un recordatorio de las sesiones previas utilizando el archivo que para cada grupo se guarda en el tablet PC. El objetivo de las clase teóricas es exponer los conceptos básicos y errores frecuentes a todos los alumnos a la vez, tratando de evitar repetirlos a cada uno por separado. 4.1.2. Parte práctica de las sesiones DHOf La parte práctica consistirá en la realización de ejercicios en el CC (ver parte I), con la supervisión de uno o varios profesores, dependiendo del número de alumnos y de la disponibilidad de docentes. Esta parte práctica, de acuerdo con la distribución de créditos, cubrirá dos terceras partes de la asignatura. Los alumnos se organizarán en parejas para que empleen la técnica de “pair programming” de la metodologı́a “extreme programming”. En cada pareja de programadores/alumnos, uno de ellos diseña el programa y el otro lo codifica (escribe el código) siguiendo las instrucciones del anterior, mientras trata de encontrar los fallos que pueda tener el diseño. Al terminar cada ejercicio se intercambian los papeles. El objetivo del “pair programming” es que el conocimiento esté igualmente repartido entre los miembros de la pareja, lo que es muy conveniente durante el examen individual y en general, al final del proceso de aprendizaje planteado en LP. Se potenciará el que los alumnos defiendan sus propios códigos proyectando los mismos en 1 DHOf por dentro del horario oficial Pág. 93 Lenguajes de Programación: Guı́a ECTS la pizarra electrónica. Ello es posible porque la carpeta Mis Documentos de cada máquina está compartida, y puede ser accedida desde el PC del profesor, proyectando desde éste, el ejercicio correspondiente. 4.2. Temario y estimación del tiempo de estudio 4.2.1. Temario Unidad 0. Introducción a MATLAB. Introducción al curso. Conceptos básicos del entorno MATLAB. Operaciones elementales. Variables. Actividades: Sesiones en el CC (4h). Repaso y estudio I2 FHOf3 (2h). Unidad 1. Funciones. Definición y uso de las funciones. Variables de entrada y salida. Condicionales. Funciones que llaman a otras funciones. Actividades: Sesiones en el CC (8h). Repaso y estudio I (0.5h). Completar los ejercicios que no ha dado tiempo en clase (I o G4 ) (2h aprox.). Unidad 2. Estructuras de Control. Bucles. Contadores. Bucles anidados. Actividades: Sesiones en el CC (11h). Repaso y estudio I (0.5h). Completar los ejercicios que no ha dado tiempo en clase (I o G) (3h aprox.). Unidad 3. Vectores. Definición de vector. Recorrido de un vector. Selección de ı́ndices. Funciones con vectores. Actividades: Sesiones en el CC (9h). Repaso y estudio I (0.5h). Completar los ejercicios que no ha dado tiempo en clase (I o G) (4h aprox.). 2 I por individual FHOf por fuera del horario oficial 4 G por en grupo 3 Pág. 94 CAPÍTULO 4. PROGRAMA Y METODOLOGÍA Actividades: Sesiones en el CC (7h). Repaso y estudio I (0.5h). Completar los ejercicios que no ha dado tiempo en clase (I o G) (5h aprox.). 4.2.2. Otras actividades Presentación del curso. (1h) Prueba de control por parejas. (2 o 3 horas) Repaso en la última semana. (3h en el CC + 2h (I o G) para completar ejercicios) Examen final. (2h de examen + 10h de repaso) Pág. 95 Lenguajes de Programación: Guı́a ECTS Pág. 96 Capı́tulo 5 Recursos 5.1. Guı́a El más importante de todos los recursos es esta Guı́a Docente. En ella, además de definir el contexto del curso de modo preciso se muestran los ejemplos y ejercicios correspondientes al mismo en la parte I. También se disponen de exámenes propuestos en otras convocatorias, el tutorial de MATLAB y diversa documentación importante para el alumno. 5.2. Tutorı́as Para los horarios y ubicación de las tutorı́as podéis consultar la página web de la escuela: http://www.etsin.upm.es/ Independientemente de esas horas, y dado que los tres profesores tienen dedicación completa, no tendrán inconveniente en resolver dudas a cualquier hora, salvo que tuviesen alguna urgencia puntual o no estuviesen en sus despachos. Algunas de estas tutorı́as podrı́an ser en algunos casos en el CC, lo cual se anunciará a lo largo del curso en clase, en la página web de la asignatura (5.4) o vı́a e-mail. 5.3. Tutorı́as virtuales Con la ficha que han rellenado los estudiantes al principio de curso se formará una lista de correo para informarles de asuntos relativos a la asignatura (publicación de notas, sesiones especiales de prácticas, ...). Los estudiantes pueden consultar sus dudas mandándolas a las direcciones de correo de los profesores, antonio.souto@upm.es, alicia.canton@upm.es, leo.gonzalez@upm.es. 5.4. Página web - Plataforma de B-learning La asignatura tiene vida paralela en la plataforma de B-learning del Gabinete de tele-educación de la UPM (GATE). El enlace web para la misma es: http://moodle.upm.es/titulaciones/oficiales/course/view.php?id=629 aunque se puede entrar a través de Politécnica Virtual en la web de la UPM. El curso 20072008 fue la primera edición de esta plataforma, la cual sustituye y supera a la página web de la Pág. 97 Lenguajes de Programación: Guı́a ECTS asignatura. En ella se irá colgando toda la información relativa a la asignatura, ası́ como calificaciones(la publicación de las mismas será anunciada por correo electrónico), documentación, ejercicios y se utilizará como tablón de anuncios. Se dispone además de un foro, la participación en el cual forma parte del item Participación de la evaluación de la asignatura. Para acceder a esta plataforma necesitais disponer de una dirección de correo electrónico de la UPM, la cual os es facilitada al matricularos. 5.5. Copias En copias estará disponible una versión completa encuadernada de esta guı́a docente. 5.6. Centro de Cálculo Los estudiantes pueden y deben usar el CC para estudiar LP, aunque han de respetar las normas(ver apéndice B). De vez en cuando, organizaremos sesiones de tutorı́as allı́ (sobre todo hacia el final del curso), para que el estudiante pregunte dudas mientras estudia. Para poder usar el CC hay que estar dado de alta como usuario (hablar con el personal del CC para este trámite y ver las normas en el apéndice B). 5.7. Bibliografı́a Los siguientes libros, de los cuales damos un pequeño comentario, los podéis encontrar en la biblioteca de la ETSIN: 1. Tı́tulo: MATLAB. Una introducción con ejemplos prácticos. Autores: Amos Gilat Editorial: Reverté Año: 2006 Excelente texto introductorio a MATLAB y a la Programación con MATLAB. Creemos que es el que mejor trata la parte de Programación, aunque el orden de los temas no es el mismo que el que seguimos en el curso. No obstante hay que tener en cuenta que en el libro se tratan comandos de MATLAB que no permitimos en clase, por ser muy especı́ficos y no estar disponibles en general en los lenguajes de programación. 2. Tı́tulo: Aprenda MATLAB 5.3 como si estuviera en primero. Autores: Javier Garcı́a de Jalón, José Ignacio Rodrı́guez, Alfonso Brazález Editorial: Escuela Superior de Ingenieros Industriales Año: 2001 Guı́a para aprender MATLAB paso a paso. Está pensada para estudiantes de primero y se puede seguir con facilidad. Aunque la parte de Programación es demasiado escueta, es interesante tenerla para utilizarla como ayuda cuando utilicemos el MATLAB para otras asignaturas. Se puede comprar en reprografı́a de la ETSII o descargar de Pág. 98 CAPÍTULO 5. RECURSOS http://mat21.etsii.upm.es/ayudainf/aprendainf/MATLAB53/matlab53.pdf 3. Tı́tulo: MATLAB, edición de estudiante. Versión 4 guı́a de usuario. Autores: The Math Works inc. Editorial: Prentice Hall Año: 1998 Manual de referencia para la versión de estudiante. Recoge todos los aspectos del programa e incluye ejemplos para cada uno. Es muy escueta en la parte de Programación. 4. Tı́tulo: MATLAB guide Autores: Desmond J. Higham, Nicolas J. Higham Editorial: Siam Año: 2000 Otra guı́a de referencia de MATLAB. Más técnica que las anteriores y un poco más extensa en el apartado de Programación. 5. Tı́tulo: Programing in MATLAB Autor: Marc E. Herniter Editorial: Thomson learning Año: 2001 Guı́a de programación con MATLAB. Contiene numerosos ejemplos y ejercicios. Es muy técnica, por lo que es más recomendable para profundizar en lo aprendido que como libro de texto. 6. Tı́tulo: Getting Started with MATLAB Autor: Rudra Pratap Editorial: Oxford University Press Año: 2002 Comentario: Otra guı́a de MATLAB. La parte de Programación está más detallada que en algunas de las otras guı́as y contiene algunos ejercicios. 7. Tı́tulo: Algoritmos en C++ Autor: Robert Sedgewick Editorial: Addison-Wesley Iberoamericana Año: 1995 Comentario: Otra guı́a de MATLAB. La parte de Programación está más detallada que en algunas de las otras guı́as y contiene algunos ejercicios. Pág. 99 Lenguajes de Programación: Guı́a ECTS Pág. 100 Capı́tulo 6 Evaluación 6.1. General La parte de evaluación del curso tiene como objetivo detectar si el estudiante ha conseguido los objetivos que se persiguen con la asignatura, los cuales hemos enumerado en el capı́tulo 3 de esta guı́a. En LP tratamos también que las propias actividades de evaluación contribuyan en sı́ mismas al proceso formativo. Para ello, el alumno podrá elegir entre dos modelos de evaluación, el tradicional, que se ha venido utilizando hasta ahora, y el modelo ECTS, que se deberá implantar en Europa en cumplimiento de la declaración de Bolonia y de lo que ésta ha implicado en la configuración del Espacio Europeo de la Educación Superior. Por otro lado, se ha establecido el Premio SENER a la mejor progresión durante el desarrollo de la asignatura LP con el objeto de motivar a los estudiantes que llegan a la titulación con unas notas medias de la educación secundaria bajas, ofreciéndoles la oportunidad de que una buena progresión respecto a la posición de partida suponga una recompensa económica, con repercusión pública y curricular. Las bases de este premio están descritas en el apéndice D. 6.2. Evaluación tradicional Consistirá en un examen final en el que se tratará de evaluar en qué grado se han alcanzado los objetivos descritos en 3.2. Los objetivos y estructura del examen están descritos en 6.4. Dado el carácter eminentemente práctico de la asignatura (3 de los 4.5 créditos de LP son prácticos) y el cambio importante que para un estudiante de primer año supone su entrada en la universidad, creemos que es necesario que sigan el curso de modo regular. En la planificación que se ha hecho del curso no se ha considerado adecuado establecer sesiones teóricas y prácticas especı́ficas, conviviendo ambos aspectos en casi todas ellas. Debido a ello, el criterio de superación de las prácticas será simplemente asistir a dos tercios (3/4.5) de las clases, para lo cual llevaremos un registro de asistencia. En las convocatorias extraordinarias de Junio y Septiembre solo se podrá optar a la evaluación tradicional. 6.3. Evaluación ECTS La calificación ECTS está desglosada a partir de la evaluación de las siguientes actividades: Pág. 101 Lenguajes de Programación: Guı́a ECTS 1. Trabajo en equipo: 35 %. En algunas de las sesiones se propondrá una prueba-control a realizar en pareja. Estos controles pretenden evaluar la dinámica del grupo (AcB) y que el alumno compruebe la evolución de los conocimientos (AcD). Los controles consistirán en la realización de unos ejercicios similares a los de las hojas del tema en curso (CoA, CoB, CpA y CpC). Los controles se deberán hacer en pareja, no pudiendo hacerlo en caso de que falte uno de sus integrantes. Estos exámenes no serán anunciados. Además, no se permitirá el acceso al aula a los estudiantes que lleguen más de 5 minutos tarde. 2. Examen final consistente en la resolución de una serie de problemas prácticos: 35 %. Los objetivos y estructura del examen están descritos en 6.4. 3. Participación activa en las clases: 15 %. El profesor valorará la participación (AcA) y la actitud positiva ante los problemas (AcC) a partir de la participación de los alumnos en clase: preguntas, salir a la pizarra, comentarios, etc. Se valorará que el alumno sea activo con hasta cinco puntos, es decir, que salga a explicar sus programas, comente los de los demás, pregunte lo que no quede claro, etc, y con otros cinco puntos la calidad de esa participación, es decir, que los programas sean interesantes y las explicaciones claras, que las preguntas sean interesantes y demuestren saber de lo que se está hablando, etc. Para que a los profesores les sea más fácil la evaluación de la participación, los alumnos deberá entregar una fotografı́a con su nombre y DNI en el reverso al comenzar el curso, junto con la ficha con el resto de sus datos personales y decisión de optar al premio SENER. Se realizarán y publicarán dos calificaciones, una cuando haya transcurrido la mitad del curso con efectos informativos, y la otra cuando haya transcurrido el curso completo. La nota será la correspondiente a la valoración final. 4. Otras actividades: 10 %. Las actividades que forman parte de este apartado corresponden a la valoración de las intervenciones en el foro de la plataforma de B-learning (ver secc. 5.4), las cuales permitirán valor objetivos relativos a conocimientos (CoB) y los objetivos actitudinales de actitud positiva y de mejora continua (AcC, AcD). Los comentarios y sugerencias sobre esta propia Guı́a ası́ como la corrección de erratas de la misma se considera parte de este item de evaluación. Además, y más importante, se propondrán actividades para realizar fuera de clase durante el curso, como por ejemplo que el estudiante proponga ejercicios similares a los del curso, los cuales serán resueltos o al menos intentados por parte del compañero de grupo. Con ello se pretenden evaluar los objetivos de capacidades relativos a diseño(CpB), codificación(CpA) y validación(CpC). Finalmente, dentro de este item se considerará también el llevar al dı́a la hoja de control y contabilización de tiempo y esfuerzo (objetivo AcD), la cual además ayuda al alumno a establecer si está realizando el esfuerzo recomendado por los profesores para seguir el curso (objetivo AcE). 5. Realización de la encuesta sobre la asignatura (3 %) y participación en el debate posterior (2 %). Esta encuesta será realizada una vez publicadas las notas de la asignatura. En el debate se mostrarán los resultados de la encuesta y se pedirá la opinión de los alumnos. Pág. 102 CAPÍTULO 6. EVALUACIÓN Estas dos notas se conservarán para las convocatorias de junio y septiembre a los que hayan suspendido. Se valorará de este modo también la la actitud positiva ante los problemas (AcC), la capacidad de autocrı́tica (AcE), ası́ como la de mejora continua (AcD). En caso de que un alumno complete los requisitos que le habilitan para seguir los dos métodos de evaluación (tradicional y ECTS), su nota final será la mayor de las dos calificaciones. 6.4. El examen 6.4.1. Tipo de examen El examen consistirá en la codificación en el Centro de Cálculo de una serie de ejercicios similares a los propuestos de modo continuo durante el curso y similares también a los que forman los exámenes por grupos. Se facilitan ejemplos de enunciados en el apéndice A. Estos exámenes se realizarán en clase en la última parte del curso. El código a entregar no debe tener errores y debe realizar las tareas correspondientes al correspondiente ejercicio. Se nombrarán los códigos correspondientes a cada ejercicio como f1.m, f2.m etc.... Las normas para escribir los códigos son las habituales con la que se trabaja en el curso y están explicadas en la sección 6.4.3. 6.4.2. Criterios de evaluación El examen individual tendrá ejercicios diversos, con los cuales evaluar la consecución de los tipos de objetivos CpA y CpB. Ası́, habrá ejercicios en los cuales se detallará un algoritmo que el alumno tendrá que codificar en MATLAB. En estos ejercicios no se esperan capacidades innovadoras y su puntuación acumulada será suficiente para aprobar el examen. Algunos de estos algoritmos tendrán cierta complejidad. También habrá ejercicios un poco más abiertos en los que el propio estudiante tenga que pensar y diseñar los algoritmos. Finalmente, reconocemos que de manera implı́cita estamos valorando CpC. Por ello, cuando proceda, proporcionaremos al alumno una serie de ejemplos que funcionarán como baterı́a de pruebas del código. 6.4.3. Normas del examen Normas para la realización de los ejercicios en los exámenes. 1. Las funciones se ubicarán en ficheros independientes, cuyo nombre coincidirá con el de la función a falta por supuesto de la extensión .m. 2. La función del ejercicio 1 se llamará f 1, la del ejercicio 2 se llamará f 2, y ası́ sucesivamente. ESTO ES IMPORTANTE!. No se llamarán ni examen1, ni examen f 1, etc... Los nombres han de ser f 1, f 2, etc... 3. El único material permitido es un bolı́grafo. No se permite el uso de ningún dispositivo de almacenamiento, incluidas memorias USB. Pág. 103 Lenguajes de Programación: Guı́a ECTS 4. Deberá estar escrito en MATLAB. No se permitirá usar funciones propias de MATLAB no estudiadas durante el curso, ni conceptos o estructuras correspondientes a ejemplos y unidades didácticas que todavı́a no se hayan explicado. No se permitirá el uso de la vectorización de operaciones explicada en el tutorial, ni la multiplicación directa de matrices. O sea, todas las operaciones hay que realizarlas siempre componente a componente cuando se trate con vectores. 5. Cuando en el enunciado se exija la utilización de una rutina estudiada en el curso o incluida en el enunciado, ésta no podrá ser modificada. Deberá ser usada tal y como está escrita en los apuntes o en el enunciado. Si crees que necesitas modificarla para poderla utilizar es que lo estás haciendo mal. 6. Las funciones se ubicarán en ficheros independientes, cuyo nombre coincidirá con el de la función a falta por supuesto de la extensión .m. La función del ejercicio 1 se llamará f 1, la del ejercicio 2 se llamará f 2, y ası́ sucesivamente. 7. En las funciones sólo se utilizarán aquellos argumentos de entrada y salida que se especifiquen en el enunciado. 8. La primera lı́nea de cada programa o función será un comentario con vuestros apellidos, nombres y el número de máquina en la que estáis. 9. Todos los ficheros estarán ubicados en la carpeta C : \examenes. 10. Se podrán usar todos los ejemplos (no ejercicios) que se han estudiado en el curso hasta el dı́a del examen, los cuales puedes encontrar en la carpeta correspondiente. 11. Se podrán crear funciones auxiliares (como una que calcule el factorial por ejemplo), si crees que te pueden simplificar el trabajo 12. Al terminar el examen, se cerrará la sesión pero NO se apagará el ordenador. 6.4.4. Publicación de calificaciones La publicación de calificaciones será únicamente online mientras estas calificaciones sean provisionales. Una vez definitivas, se redactará el acta correspondiente para pasarla a los servicios de Secretarı́a de la ETSIN. Se dispone en la web de la asignatura (ver 5.4) de una utilidad en la que introduciendo el DNI se puede ver la nota de la última convocatoria. Con ello conseguimos una privacidad relativa pero creemos que suficiente. 6.4.5. Revisión del examen En el enunciado de cada examen se anunciará una fecha aproximada de publicación de las notas y un dı́a y hora para la revisión de examen. Los estudiantes que deseen revisar su examen deberán comunicarlo, por email o por cualquier otro medio a los profesores. En la revisión se facilitará a cada estudiante su examen ası́ como una copia de las soluciones. Durante 60’ tendrá a los profesores de LP a su disposición para responder todas las dudas que considere pertinentes. Pág. 104 CAPÍTULO 6. EVALUACIÓN 6.5. Evaluación de los objetivos La siguiente tabla relaciona los objetivos generales de la asignatura, descritos en la sección 3.2, con los diferentes apartados de la evaluación ECTS descritos en 6.3. Es decir, resume qué se califica en cada ı́tem de la evaluación. CoA CoB CpA CpB CpC AcA AcB AcC AcD AcE Participación Examen x x x x x x x x x Otras act. Grupos x x x x x x x x x x Encuesta/debate x x x x x x x x x x Pág. 105 Lenguajes de Programación: Guı́a ECTS Pág. 106 Parte III Apéndices Pág. 107 Apéndice A Ejemplos de Exámenes Pág. 109 Examen final de Lenguajes de Programación. Febrero 2008 Escuela Técnica Superior de Ingenieros Navales Fecha aproximada de publicación de las notas: 29/02/2008 Dı́a y hora de la revisión: 03/03/2008, 12h30m Tiempo para esta parte : 85 minutos Puntuación: 10 puntos. Normas para la realización de los ejercicios en los exámenes. 1. Las funciones se ubicarán en ficheros independientes, cuyo nombre coincidirá con el de la función a falta por supuesto de la extensión .m. 2. La función del ejercicio 1 se llamará f 1, la del ejercicio 2 se llamará f 2, y ası́ sucesivamente. ESTO ES IMPORTANTE!. No se llamarán ni examen1, ni examen f 1, etc... Los nombres han de ser f 1, f 2, etc... 3. El único material permitido es un bolı́grafo. No se permite el uso de ningún dispositivo de almacenamiento, incluidas memorias USB. 4. Deberá estar escrito en MATLAB. No se permitirá usar funciones propias de MATLAB no estudiadas durante el curso, ni conceptos o estructuras correspondientes a ejemplos y unidades didácticas que todavı́a no se hayan explicado. No se permitirá el uso de la vectorización de operaciones explicada en el tutorial, ni la multiplicación directa de matrices. O sea, todas las operaciones hay que realizarlas siempre componente a componente cuando se trate con vectores. 5. Cuando en el enunciado se exija la utilización de una rutina estudiada en el curso o incluida en el enunciado, ésta no podrá ser modificada. Deberá ser usada tal y como está escrita en los apuntes o en el enunciado. Si crees que necesitas modificarla para poderla utilizar es que lo estás haciendo mal. 6. Las funciones se ubicarán en ficheros independientes, cuyo nombre coincidirá con el de la función a falta por supuesto de la extensión .m. La función del ejercicio 1 se llamará f 1, la del ejercicio 2 se llamará f 2, y ası́ sucesivamente. 7. En las funciones sólo se utilizarán aquellos argumentos de entrada y salida que se especifiquen en el enunciado. 8. La primera lı́nea de cada programa o función será un comentario con vuestros apellidos, nombres y el número de máquina en la que estáis. 9. Todos los ficheros estarán ubicados en la carpeta C : \examenes. 10. Se podrán usar todos los ejemplos (no ejercicios) que se han estudiado en el curso hasta el dı́a del examen, los cuales puedes encontrar en la carpeta correspondiente. 11. Se podrán crear funciones auxiliares (como una que calcule el factorial por ejemplo), si crees que te pueden simplificar el trabajo 12. Al terminar el examen, se cerrará la sesión pero NO se apagará el ordenador. Ejercicios. 1. Crea una función que reciba un vector v de números naturales y un natural m y nos devuelva el número de elementos de v que son múltiplos de m. Devolverá además el número de elementos de v que son múltiplos de m + 1. Por ejemplo, si v = (7, 6, 15, 8, 5) y m = 2, devolverı́a 2 y 2, porque el 6 y el 8 son múltiplos de 2, y el 6 y el 15 son múltiplos de 3 (2.5 puntos). 2. Construir una función que reciba un número n y devuelva un vector que contenga a todos los números mágicos menores o iguales que n. Se define un número mágico como aquel que es la suma de todos sus divisores salvo el mismo, por ejemplo el 6, cuyos divisores son 3, 2, 1 y 6 = 3 + 2 + 1, o el 28 = 14 + 7 + 4 + 2 + 1, o el 1, cuyo único divisor es el mismo. Por ejemplo, si n = 30, la función devolverá el vector [1 6 28] (2.5 puntos). 3. Crea una función que reciba un número natural n, un número real x y devuelva el polinomio de Mc-Laurin de de grado n de la función ex , evaluado en x. ex ∼ 1 + x + x2 x3 xn + + ··· + 2! 3! n! Para evaluar el polinomio de Mc-Laurin, se construirá éste componente a componente y se utilizará del modo adecuado la función ud3 f evalua. No se podrá usar la función propia de MATLAB f actorial para hacer el cálculo del factorial. La alternativa es o bien escribir una función aparte que calcule el factorial, o bien cualquier otra idea que se os ocurra. Por ejemplo, si n = 3 y x = 0.5, devolverı́a 1 + 0.5 + 0.52 /2 + 0.53 /6 = 1.6458, que es bastante similar a e0.5 = 1.6487. La función devolverá también la diferencia en valor absoluto entre ex y el polinomio citado evaluado en x. Por tanto, en este caso, devolverı́a también 0.0029 (2.5 puntos). 4. Codifica una función que reciba dos vectores u y v ordenados de modo creciente por hipótesis, que carecen de elementos comunes y de dimensiones m y n que son en general distintas. La función devolverá otro vector w construido a partir de todas las componentes de u y v, tales que el vector w también esté ordenado. No se podrá llamar a ninguna función. Por ejemplo, si u = (2, 4, 5, 9, 10) y v = (1, 3, 6, 8), el resultado será w = (1, 2, 3, 4, 5, 6, 8, 9, 10). Como comprobación adicional, si intercambiamos u y v en la llamada, el resultado tiene que ser el mismo (2.5 puntos). Ejercicios. Examen final de Lenguajes de Programación. Junio 2008 Escuela Técnica Superior de Ingenieros Navales Fecha aproximada de publicación de las notas: 30/06/2008 Dı́a y hora de la revisión: 03/07/2008, 19h30m Tiempo para esta parte : 85 minutos Puntuación: 10 puntos. 1. Crea una función que reciba un vector u de números positivos y devuelva un vector ue con los números enteros que contiene y otro ur con los no enteros, ası́ como sus respectivos mı́nimos me, mr. Por ejemplo, si u = (3, 20.3, 7, 5, 12.7, 13) el resultado ha de ser ue = (3, 7, 5, 13), un = (20.3, 12.7), me = 3 y mr = 12.7. Se podrá suponer que en el vector u siempre va a haber enteros y no enteros (2.5 puntos). 2. Crea una función que reciba un vector v de naturales y te devuelva 1 si la resta de dos cualesquiera de los números es igual a un tercero. Por ejemplo, si v = (3, 10, 7, 14, 6), la función devolverá un 1, pues 10 − 7 = 3. Sin embargo, si el vector es v = (3, 11, 7, 15, 6) la función devolverá 0. Se recomienda probar la función cambiando de orden los elementos del primer ejemplo (2.5 puntos). 3. Crea una función que reciba un vector p cuyas componentes asimilamos a los coeficientes de un polinomio del modo como se ha hecho en el curso. La función ha de recibir también un vector x de n números reales y devolverá el elemento del vector x que se encuentra más cerca de la media que resulta de que se evalúe el polinomio p en todos los elementos del vector x. Ası́, si p = [1 − 1 2] y x = [1.1 3.5 2.1 − 0.7], el resultado de evaluar el polinomio p en todos los puntos de x es un vector y = [2.3200 22.0000 7.7200 2.6800] cuya media vale 8.6800, siendo 2.1 el punto que más cerca tiene su valor de la media (2.5 puntos). 4. Construye una función que reciba dos números naturales p, q y devuelva el menor primo mayor que p y q que pertenezca a la sucesión de Fibonacci iniciada por p y q (2.5 puntos). No se tendrán en cuenta ni p ni q. La sucesión de Fibonacci se construye de tal modo que. xi = xi−1 + xi−2 , x1 = p, x2 = q, i > 2 Por ejemplo, si p = 1 y q = 3, la sucesión de Fibonacci estarı́a formada por 1, 3, 4, 7, ..., y el primer primo serı́a el 7. Si p = 4 y q = 5, tendrı́amos 4, 5, 9, 14, 23, ... y el primer primo serı́a el 23(2.5 puntos). Ejercicios. Examen final de Lenguajes de Programación. Sept 2008 Escuela Técnica Superior de Ingenieros Navales Fecha aproximada de publicación de las notas: 22/09/2008 Dı́a y hora de la revisión: 24/09/2008, 19h30m Tiempo : 90 minutos Puntuación: 10 puntos. Nombre: Número de PC: Firma: 1. Crea una función que reciba un vector v de naturales y te devuelva un vector vp formado por aquellas componentes de v que sean primas y otro vnp formado por aquellas componentes que no sean primas. Por ejemplo, si v = (3, 10, 7, 14, 6), la función devolverá un los vectores vp = (3, 7) y vnp = (10, 14, 6) (2.5 puntos). 2. Crea una función que reciba un vector p cuyas componentes asimilamos a los coeficientes de un polinomio del modo como se ha hecho en el curso. La función ha de recibir también un vector x de n números reales y devolverá el ı́ndice del elemento del vector x que se encuentra más cerca de la media que resulta de que se evalúe el polinomio p en todos los elementos del vector x. Ası́, si p = [1 − 1 2] y x = [1.1 3.5 2.1 − 0.7], el resultado de evaluar el polinomio p en todos los puntos de x es un vector y = [2.3200 22.0000 7.7200 2.6800] cuya media vale 8.6800, siendo 2.1 el punto que más cerca tiene su valor de la media, cuyo ı́ndice es 3, que ha de ser el único valor que finalmente devuelva la función (2.5 puntos). 3. Construye una función que reciba tres números naturales p, q y r. La función irá calculando términos de la sucesión de Fibonacci iniciada por p y q e irá comprobando si son múltiplos de p. En el momento en que hayamos encontrado r múltiplos de p la función terminará, devolviendo el término en que estemos de la sucesión de Fibonacci (2.5 puntos). No se tendrán en cuenta los valores p y q. La sucesión de Fibonacci se construye de tal modo que. xi = xi−1 + xi−2 , x1 = p, x2 = q, i > 2 Por ejemplo, si p = 3, q = 4 y r = 2, la sucesión de Fibonacci estarı́a formada por 3, 4, 7, 11, 18, 29, 47, 76, 123..... Como 18 y 123 son los dos primeros múltiplos de 3, el valor a devolver será 123 (2.5 puntos). Si p = 2, q = 1 y r = 3, la función devolverı́a en este caso 76, pues los tres primeros múltiplos de 2 serı́an 4, 18 y 76. 4. Crea una función que reciba un vector u de números naturales y otro vector v de números racionales positivos. La función devolverá 1 si existe alguna combinación de fracciones formadas por elementos del vector u tomados de dos en dos, que sea igual a algún elemento del vector v y 0 en caso contrario. Se definirá en la función una variable prec igual a la milésima parte de la suma de los elementos de u. Se considerará que dos números son iguales si su diferencia en valor absoluto es menor que prec. Por ejemplo, si u = (3, 20, 7, 5, 12, 13) y v = (2.98, 1.8571) el resultado ha de ser 1 pues prec = 0.06, y |13/7 − 1.8571| = 0.00004 < prec. Si ponemos como ejemplo el mismo u pero ahora v = (2.98, 1.2571) la respuesta ha de ser 0 (2.5 puntos). Lenguajes de Programación: Guı́a ECTS Pág. 116 Apéndice B Gestión del CC Pág. 117 ETSI NAVALES. CENTRO DE CÁLCULO USUARIO DEL DOMINIO CCALCULO ACCESO A LOS ORDENADORES DEL CENTRO DE CÁLCULO E.T.S.I NAVALES Cuando enciendas el ordenador aparecerá una máscara donde introducirás el usuario y la contraseña que se te ha facilitado, comprobando que la sesión se conecte a CCALCULO: Iniciaras una sesión con este aspecto: A tu izquierda encontrarás todos los accesos directos a los programas que están instalados. A la derecha aparecerán 3 accesos directos a 3 carpetas. A continuación explicamos en que consiste cada carpeta: ETSI NAVALES. CENTRO DE CÁLCULO USUARIO DEL DOMINIO CCALCULO CARPETA PERSONAL Esta carpeta es individual para cada usuario. Físicamente se encuentra en un servidor de la ETSI Navales. Esta carpeta tiene capacidad hasta 128MB.Siempre que te conectes a tu usuario aparecerán tus ficheros y los tendrás disponibles desde cualquier ordenador de la sala. Estos ficheros no los pueden ver los demás usuarios. Solo tú podrás acceder a esta carpeta. ASIGNATURAS Esta carpeta esta disponible para todos los usuarios. Aquí pondrán los profesores los trabajos y documentos que quieran compartir con vosotros. MIS DOCUMENTOS Esta carpeta físicamente se encuentra en el disco duro del ordenador en el que inicias sesión. Esta compartida para todos los ordenadores de la sala. Estos datos se pueden perder en cualquier momento, bien por ser borrados por otro usuario o por el personal de CdC en sus tareas de mantenimiento. Se recomienda que cada usuario borre sus ficheros de zonas compartidas (como los discos duros de los PC´s) una vez finalizada su sesion de trabajo. El CdC no se responsabiliza de mantener datos en zonas compartidas ni temporales y recomienda que cada usuario haga copia de seguridad de dichos datos, bien en su carpeta personal o en algún medio extraíble (memoria USB, disquette). Para una mayor seguridad, el usuario deberá cerrar la sesión una vez que termine de usar el ordenador (Menú de Inicio- Cerrar sesión). SOFTWARE DISPONIBLE EN CADA ORDENADOR • • • • • • • • • • • • • • • • • • • • • • • • • S.O: Windows XP Profesional SP2. Microsoft OFFICE 2003 Adobe Reader 7.0 Winrar 3.11 Internet Explorer 6. SP1. Firefox. Winamp 5.1: Lector de MP3 MathType 5.2 Microsoft Visio 2003 Microsoft Project 2003 Autocad 2005 Rhinoceros 3.0 Matlab 5.0 Matlab 2006 Visual C++ 6.0 Visual J ++ 6.0 Visual MSDN 6.0 Electronics Workbench PCTRAN-U2LP Ansys ED 5.5 MD_Solids 1.7 Maple 9 Chechenic Femap v8.3 DNV Nauticus ETSI NAVALES. CENTRO DE CÁLCULO USUARIO DEL DOMINIO CCALCULO En los ordenadores con conexión a Internet solo están instalados los 10 primeros programas de la lista. Además en la sala de Informática se permite la Navegación de las páginas: ETSI Navales, UPM; Aulaweb, Correo Alumnos, Centro de Cálculo. ACTUALIZACIONES DE SOFTWARE Se prevee al comienzo del curso 2007-08 actualizar a las siguientes versiones de software: • • • • • Microsoft OFFICE 2007 Professional Plus Microsoft Visio 2007 Microsoft Project 2007 Internet Explorer 7. Statgraphics Centurion XV ETSI NAVALES. CENTRO DE CÁLCULO USUARIO DEL DOMINIO CCALCULO DESCRIPCIÓN DEL CENTRO DE CÁLCULO www.centrocalculo.etsin.upm.es La función del Centro de Cálculo (CdC) es dar soporte a los alumnos y al personal de la ETSIN para la realización de trabajos orientados a fines docentes, formativos y de investigación propios de la Universidad. En él se imparten clases y se realizan exámenes. Se compone de 3 despachos para el personal informático y de 2 salas de Informática con equipos. Las salas son: • • Sala de Navegación por Internet. (consta de 10 puestos con capacidad para 20 alumnos) Sala de Informática. (consta de 50 puestos con capacidad para 100 alumnos) Los alumnos podrán utilizar estas dos salas, salvo cuando estén reservadas. Normalmente para dar clase, se reserva la mitad de la sala de Informática delimitándose por una mampara. Si el número de alumnos es grande, se reservará toda la sala de Informática. En épocas de exámenes, el CdC se reserva el derecho de cerrar el CdC el día anterior al exámen, para la reinstalación de los equipos. Existe en la entrada un tablón donde se expondrán las reservas para la docencia, exámenes, actividades programadas y las comunicaciones a los usuarios.También puedes encontrar esta información en la web www.centrocalculo.etsin.upm.es. Para dirigirse al personal responsable, se puede enviar un e-mail a centrodecalculo.navales@upm.es o utilizar el buzón de sugerencias (también está a la entrada del CdC) HORARIO El horario de las salas será de 8:30h a 21:30 horas de Lunes a Viernes los días lectivos. SERVICIO DE IMPRESIÓN La sala dispone de 1 Impresora Modelo OCE Varioprint 2040 que funciona con una tarjeta prepago que se puede adquirir en Gestión económica. No es Fotocopiadora. Se recomienda que una vez impresos los trabajos, se borren de la memoria de la impresora, ya que pueden ser impresos por otro usuario. NORMAS DE FUNCIONAMIENTO DE LAS AULAS DE INFORMÁTICA • • • Para utilizar las instalaciones del CdC el alumno tendrá que estar matriculado en la ETSI Navales o tener autorización expresa por parte del Centro. Todo usuario está obligado a identificarse ante el personal de CdC cuando éste lo solicite. El alumno solicitará a través de un cuestionario el usuario/contraseña con el que accederá a los ordenadores de las aulas. El usuario velará en la medida de lo posible por la seguridad de su cuenta. El CdC no se hace responsable de los perjuicios ocasionados al usuario por la acción de terceros. Queda extrictamente prohibida la utilización autorizada o no de una cuenta de usuario distinta a la propia. ETSI NAVALES. CENTRO DE CÁLCULO USUARIO DEL DOMINIO CCALCULO • • • • La utilización de los equipos informáticos se reservará exclusivamente para el soporte de las prácticas de asignaturas, navegación por Internet y el correspondiente aprendizaje de los distintos programas propios de la carrera. Deberá informarse al personal de Informática de cualquier deficiencia o funcionamiento anómalo que se observe. Se ruega por y para el beneficio de todos, que tanto los equipos y mobiliario, se manipulen y usen de forma correcta. NO SE PERMITE: • • • • • • • • • • • Fumar, introducir y consumir bebida o comida, Utilizar los equipos como videojuegos para cualquier fin lúdico. Utilizar el CdC como lugar de tertulia o de juego. Sentarse en las mesas. Ocupar los puestos con prendas de abrigo o mochilas. Reservar los ordenadores. Cambiar la configuración de software y hardware sin previa autorización del responsable de aula. Modificar la situación de cualquiera de los equipos o recursos del Aula sin previa autorización. Interferir en el trabajo de los demás usuarios. El acceso a los despachos del Centro a personal no asignado o no autorizado. Imprimir trabajos no relacionados con los fines docentes y formativos propios de la ETSI Navales/UPM. NORMAS DE NAVEGACIÓN POR INTERNET El uso del Servicio de Internet se realizará dentro de los fines docentes, formativos y de Investigación de la UPM. Se prohibe expresamente el uso de Internet para recibir o enviar material que resulte ofensivo, obsceno, difamatorio o susceptible de constituir delito. Por tanto, se prohibe visitar páginas web con contenidos pornográficos, páginas de contenido hacker en cualquiera de sus variantes, intercambio de material protegido con derechos de autor, etc.. También se prohibe su uso para cualquier fin lúdico o lucrativo por ejemplo paginas de juegos online, chatear, etc.. El personal del CdC ante cualquier incumplimiento de las Normas anteriormente expuestas se reserva el derecho de poder tomar la medidas oportunas como llamar al orden, cerrar sesión de usuario, deshabilitar cuenta o mandar desalojar el CdC. El personal se encuentra a vuestra disposición para cualquier aclaración o duda. Apéndice C Control de tiempos y ficha Pág. 123 ETSI NAVALES - UPM LENGUAJES DE PROGRAMACIÓN (LP) CURSO 2008-2009. FICHA PERSONAL - URGENTE!!!!!!!!!!!!! FOTO (pegadla por donde querais, en zonas blancas de esta ficha) APELLIDOS: NOMBRE: DNI O PASAPORTE: EMAIL (escríbelo con claridad!!!! y si estás matriculado, activa tu cuenta de correo UPM): GRUPO (A,B,C): ¿ES TU PRIMER AÑO EN LA ETSI NAVALES? TFO MOVIL: TFO FIJO: ¿TE GUSTARÍA OPTAR AL PREMIO SENER DE LP?: CASO DE QUE SÍ,¿CUÁL HA SIDO TU CALIFICACIÓN DE ACCESO A LA UNIVERSIDAD?: Y ADEMÁS FIRMA Y FECHA: ---------------------------------------------------Para efectos estadísticos, ¿te importaría decirme los siguientes datos? 1 Elección de primera opción: 2 Elección de segunda opción: 3 Elección de tercera opción: FICHA DE CONTROL DE TIEMPOS APELLIDOS: NOMBRE: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 16 17 16 Semana Fecha DHOf Acum InFHOf Acum 29/09/2008 0 0 06/10/2008 0 0 13/10/2008 0 0 20/10/2008 0 0 27/10/2008 0 0 03/11/2008 0 0 10/11/2008 0 0 17/11/2008 0 0 24/11/2008 0 0 01/12/2008 0 0 08/12/2008 0 0 15/12/2008 0 0 22/12/2008 0 0 29/12/2008 0 0 05/01/2009 0 0 12/01/2009 0 0 19/01/2009 0 0 26/01/2009 0 0 02/02/2009 0 0 09/02/2009 0 0 EqFHOf Acum 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Total 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Acum 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 La idea es que pongais las horas correspondientes a los tres bloques, llevando también el acumulado. La unidad mínima serán 0.5 horas, procediendo al redondeo cuando no sean valores exactos. Así, 50min se consignará como 1, y 1h17m se consignará como 1.5 Fecha: fecha en la que se ha rellenado la fila correspondiente. DHOf: por horas dentro del horario oficial como clases y exámenes. Acum: por horas acumuladas de cada categoría InFHOf: por horas de trabajo individual fuera del horario oficial EqFHOf: por horas de trabajo en equipo fuera del horario oficial Lenguajes de Programación: Guı́a ECTS Pág. 126 Apéndice D Premio SENER Pág. 127 PREMIO SENER A LA MEJOR PROGRESIÓN EN LA ASIGNATURA LENGUAJES DE PROGRAMACIÓN - Bases del premio 1 . Obj e t o de l pr e m io: El obj et o de est e prem io es recom pensar la m ej or progresión durant e el desarrollo de la asignat ura de Lenguaj es de Program ación de Prim er Curso de la t it ulación de I ngenieros Navales y Oceánicos, Plan 2002, de la Universidad Polit écnica de Madrid. De est e m odo se pret ende m ot ivar a los est udiant es que llegan a la t it ulación con unas not as m edias de Bachillerat o baj as, ofreciéndoles la oport unidad de que una buena progresión respect o a la posición de part ida suponga una recom pensa económ ica, con repercusión pública y curricular. Lo habit ual es que est os prem ios que pret enden servir para m ot ivar, no m ot iven a los que m ás lo necesit an, y t erm inen sim plem ent e por confirm ar la buena preparación y act it ud de ciert os est udiant es. En est e sent ido, est e prem io t iene m ás m at ices, pues son precisam ent e los " peores" est udiant es, los que part en de una posición m ás baj a, los que m ás pueden progresar, y los que por t ant o se conviert en en m ej ores candidat os para obt enerlo. SENER es la em presa líder en el sect or de las aplicaciones inform át icas para el m undo naval, y su fundación, la Fundación SENER, a part es iguales con el Depart am ent o Naval de SENER se han ofrecido a dot ar y dar nom bre a est e prem io. ETSI N cree que el prem io, dada su nat uraleza, lleva el m ej or nom bre posible, y es de agradecer la im plicación de SENER en el m ism o. 2 . Re qu isit os de los solicit a n t e s: Alum nos m at riculados en la asignat ura de Lenguaj es de Program ación de Prim er Curso de la t it ulación de I ngenieros Navales y Oceánicos, Plan 2002, de la Universidad Polit écnica de Madrid, que deseen opt ar al Prem io. 3 . Pr oce dim ie n t o de va lor a ción : Los alum nos est án organizados por grupos de 2 com ponent es durant e el desarrollo del curso, t rat ando de que los est udiant es adquieran hábit os de t rabaj o en equipo y se fam iliaricen con los problem as y vent aj as de est a form a de t rabaj o. De hecho, el m odus operandi de cada equipo t iene su repercusión en la evaluación ECTS que se viene desarrollando desde el curso 2005- 2006. Al final de est a evaluación, los com ponent es del grupo habrán obt enido una not a final. El barem o para fij ar la punt uación para el prem io pasa por rest ar, de cada una de las not as de cada uno de los 2 com ponent es, la not a m edia del 1/4 bachillerat o 1 . Así, si los est udiant es de un grupo obt uviesen un 7.5 y un 9.0 en la evaluación ECTS de Lenguaj es de Program ación y sus not as del bachillerat o fuesen 5.4 y 6.2 respect ivam ent e, su punt uación para el prem io será de ( 7.55.4) + ( 9.0- 6.2) = 4.9 punt os. La punt uación m áxim a será de 10 punt os, ( 105) + ( 10- 5) = 10, y la m ínim a de –20 punt os, ( 0- 10) + ( 0- 10) = - 20. El grupo ganador será aquel que m ayor punt uación t enga siguiendo est e barem o. Para el prem io se t endrá en cuent a únicam ent e la not a correspondient e a la evaluación ECTS y no la correspondient e a la evaluación convencional. La evaluación ECTS cont em pla diferent es ít em s a lo largo del curso ( ver Guía Docent e de la asignat ura) . Teniendo est o en cuent a se arbit rará una form a de seguim ient o consist ent e en la publicación de las not as de los diferent es grupos en 2 inst ant es del curso, ident ificando a los alum nos a t ravés de su DNI . Ello les perm it irá conocer su posición e im plicarse m ás en la part e final del curso, en la que se consigue la part e m ás im port ant e de la not a. Para ello, la Secret aría de la ETSI N facilit ará a los profesores una list a de alum nos m at riculados con una colum na correspondient e a las not as de acceso a la universidad de aquellos alum nos que deseen opt ar al Prem io, que previam ent e habrán firm ado su aut orización para que se facilit e dicho dat o de su expedient e. 4 . D ot a ción : La dot ación será de 1200€ a repart ir a part es iguales ent re los 2 com ponent es del grupo. Est a dot ación se increm ent ará cada año aplicando el I PC correspondient e. ETSI N em it irá un diplom a acredit at ivo, el cual cont endrá un suplem ent o al m ism o consist ent e en un hist ogram a de las not as con la punt uación de los diferent es grupos, para que quede const ancia de m odo cuant it at ivo del progreso del grupo ganador en t érm inos absolut os y relat ivos al rest o de grupos de ese año académ ico. La inform ación para dicho hist ogram a será facilit ada por el profesor responsable de la asignat ura. 5 . En t r e ga de pr e m ios: La ent rega de prem ios se realizará durant e la cerem onia de ent rega de diplom as a los nuevos egresados, y el abono de los prem ios se efect uará m ediant e cheque nom inat ivo de 600€ em it ido por la Fundación SENER para uno de los 1 Con not a m edia del Bachillerat o nos referim os a la Calificación definit iva de las Pruebas de Apt it ud de Acceso a la Universidad, la cual es a su vez la m edia de la not a m edia del Expedient e del alum no correspondient e al Bachillerat o propiam ent e dicho y la not a de la Select ividad. En aquellos casos en que este valor no esté correct am ent e definido por haber ingresado el est udiant e con bachillerat o ext ranj ero o por pruebas en las que ese parám et ro no sea relevant e, se considerará que su not a es la m edia de ent re t odos los est udiant es para las que sí lo sea. 2/4 com ponent es del grupo ganador y ot ro de la m ism a cant idad em it ido por el Depart am ent o Naval de SENER I ngeniería y Sist em as para el ot ro com ponent e del grupo ganador. Los fam iliares de prim er grado de los est udiant es prem iados, así com o 4 com pañeros a elegir por cada uno de ellos y el delegado de su clase durant e el curso correspondient e, est arán invit ados a est a cerem onia. Se invit ará a SENER y a Fundación SENER a que asist an y ent reguen direct am ent e el prem io a t ravés de alguna o algunas personas indicadas por ellos m ism os. 3/4 PREMIO SENER A LA MEJOR PROGRESIÓN EN LA ASIGNATURA LENGUAJES DE PROGRAMACIÓN - Curso 2007-2008- Ganadores: LUIS ARJONILLA GARCIA SERGIO IGLESIAS CHAPERO Histograma de puntuaciones de todos los grupos 1. 14 12 Número de grupos 10 8 6 4 2 0 -8 -6 -4 -2 0 2 4 6 Puntuación <= 1 La puntuación corresponde a la diferencia (suma de ambos componentes) entre la nota ECTS de la asignatura y la nota media del bachillerato. Índice alfabético abs, 50, 51 ASCII, 28 Ball, S., 1 contadores, 53 else, 42 elseif, 46 end, 41 ficheros ASCII, 28 floor, 54 function, 36 if, 40 if-else, 42 if-elseif, 46 if-end, 40 MATLAB cálculo simbólico, 32 carpeta activa, 29 ventana de comandos, 13 operadores lógicos, 47 Ó, 47 negación, 47 Y, 47 pi, 38 sumadores, 53 Taylor, Brook, 27 Wittgenstein, L., 1 Pág. 132