Download Introducción a la programación Corrección Corrección : Factorial
Document related concepts
no text concepts found
Transcript
Corrección • Introducción a la programación Evaluar el siguiente programa para cada uno de los 3 casos que se indican (indica cual será el valor de x, y, z en cada uno de los 3 casos ) IF (x<5 OR y>2) AND z>3 THEN xß1 IF (z-y ) > 0 THEN zß0 ENDIF y ßy + z ELSE xß2 z ß y +z ENDIF Sergi Jordà Curso de postgrado “Programación Orientada al Multimedia” Institut Universitari de l’Audiovisual Universitat Pompeu Fabra a) x=4 y=1 z=4 b) x=4 y=5 z=4 c) x=1 y=3 z=1 Corrección : Factorial a) b) c) x y z ini 4 1 4 fin 1 1 0 ini 4 5 4 fin 1 5 0 ini 1 3 1 fin 2 3 4 Corrección : Factorial funcion factorial (n tipo entero) tipo entero var resultado tipo entero resultado ß 1 while n>= 1 do resultado ß resultado * n --que valor inicial debe tener resul? n ß n-1 end while devolver resultado end funcion funcion factorial (n tipo entero) tipo entero var resultado tipo entero resultado ß 1 while n>= 1 do resultado ß resultado * n – debe valer 1 n ß n-1 end while devolver resultado end funcion • • • • • Que sucede cuando n vale 1? El resultado es correcto (1) Que sucede cuando n vale 0? El resultado también es correcto (porque por definición, el factorial de 0 vale 1) Que sucede cuando n<0? El factorial de un número negativo no está definido, pero nuestra función devuelve 1 • Que sucede cuando n vale 1? El resultado es correcto (1) Que sucede cuando n vale 0? El resultado también es correcto (porque por definición, el factorial de 0 vale 1) Que sucede cuando n<0? El factorial de un número negativo no está definido, pero nuestra función devuelve 1 Corrección potencia Corrección : Factorial funcion factorial (n tipo entero) tipo entero var resultado tipo entero resultado ß 1 while n>= 1 do resultado ß resultado * n – debe valer 1 n ß n-1 end while devolver resultado end funcion funcion potencia (base tipo entero, expo tipo entero) tipo entero var resultado tipo entero resultado ß1 while expo>=1 do resultado ßresultado * base expo ß expo-1 end for devolver resultado end funcion • • • • Que sucede cuando n vale 1? El resultado es correcto (1) Que sucede cuando n vale 0? El resultado también es correcto (porque por definición, el factorial de 0 vale 1) Que sucede cuando n<0? El factorial de un número negativo no está definido, pero nuestra función devuelve 1 Escrito de esta forma, el resultado también es correcto cuando el exponente vale 1 ó 0 (por definición, cualquier número elevado a 0 vale 1). No lo es sin embargo cuando el exponente es negativo. En este último caso habría que hacer modificaciones 1 Introducción a las Matrices O vectores, tablas, arrays, arreglos … • Si una variable fuese un cajón, una matriz sería un armario de cajones • Este armario nos permitirá acceder a cada uno de sus cajones , indicando sencillamente el nombre del armario y el número del cajón • La utilidad principal de este tipo de datos es que permite ser utilizado con Tema 5 : Matrices facilidad en una estructura iterativa(e.g. for o while) • Supongamos que queremos un programa que pida al usuario 100 nombres por teclado • Si no existiesealgo como las matrices, el programa debería § Declarar 100 variables (e.g. nombre1, nombre2, …., nombre100) § Escribir 100 líneas del tipo: nombreX ß input_num • Con las matrices, podemos hacerlo de la forma: for i=1 to 100 do nombre[i] ß input_num end for Declaración de matrices • • La forma de declarar matrices varía mucho de un lenguaje a otro. En el siguiente ejemplo se muestra la que utilizaremos nosotros: var dias_mes[12] tipo entero La novedad es el 12 entre corchetes que indica que dias_mes es una matriz de 12 elementos Matrices : peculiaridades de los lenguajes • En algunos lenguajes (e.g. C, C++, Java, Javascript…), el primer elemento de una matriz es el 0 y no el 1. En estos casos, si la matriz tuviera 12 elementos, el último sería el 11 y no el 12, ya que en cualquier caso, al declarar una matriz, estamos indicando su tamaño, no el valor de su último índice… • Los símbolos [ ] pueden variar según el lenguaje (e.g. ( )) • Algunos lenguajes, permiten que al declarar una matriz se puedan escribir los valores de todos sus elementos, como por ejemplo: var dias_mes [12] tipo entero ß {31,28,31,30,31,30,31,31,30,31,30,31} Términos § dias_mes representa pues una matriz § dias_mes[i] (con i comprendido entre 1 y 12) representa un elemento de esta matriz § i (es decir la constante o variable que indica el elemento elegido) se denomina índice § 12 es (en este caso) el tamaño de la matriz La forma de escribir esto (que puede ser muy útil si la matriz no es muy grande) varía mucho de un lenguaje a otro • Algunos lenguajes no permiten utilizar operadores entre matrices , otros sí (por ejemplo sumar, restar, comparar… matrices). Nosotros no los utilizaremos. Es decir no trabajaremos con las matrices como una entidad propia, sinó con sus elementos… Matrices y funciones • También varía mucho de un lenguaje a otro, la forma en que las matrices se pasan como parámetros de las funciones § En algunos lenguajes (C, C++…), al pasar una matriz a una función, hay que pasarle también su tamaño, ya que de lo contrario la función no sabría como manejarla (no reconocería su “final”) funcion(dias_mes,12) § En otros lenguajes (Lingo, JavaScript , Java…) las matrices poseen una propiedad intrínseca que indica el número de elementos que la constituyen. Esta propiedad (lenght, elements…) se escribe tras el nombre de la matriz seguido de un punto (e.g. dias_mes.longitud que en nuestro caso valdría 12) • Aunque menos genérica, utilizaremos esta segunda opción ya que simplifica los algoritmos • Para indicar que un parámetro de una función es una matriz (y no una variable única), al declarar la función, añadiremos corchetes después del nombre del parámetro, como en el siguiente ejemplo: funcion nom_func(nom_matr[ ] tipo entero) tipo entero Ejemplos • Escribir una función que reciba una matriz de números reales y devuelva el máximo de todos ellos funcion maximo(numeros [] tipo real) tipo real var max tipo real var i tipo entero max ß 0 -- sería mejor max ß numeros[1] y podriamos comenzar en i=2 for i=1 to numeros.longitud do if max<numeros[i] then max ßnumeros[i] endif end for devolver max end funcion • Que habría que modificar para que en lugar del máximo, devolviera su índice o posición? NB. Obviamente, ésto es sólo un ejemplo. Las funciones pueden seguir recibiendo varios parámetros , de varios tipos , algunos de ellos matrices y otros no, y su retorno puede ser también de varios tipos … 2 Ejemplos Ejemplos • Escribir una función que reciba una matriz de números reales y devuelva el • Escribir una función que reciba una matriz de números reales y devuelva el funcion maximo(numeros [] tipo real) tipo real var max tipo real var i tipo entero max ß 0 -- sería mejor max ß numeros[1] y podriamos comenzar en i=2 for i=1 to numeros.longitud do if max<numeros[i] then max ßnumeros[i] endif end for devolver max end funcion funcion maximo(numeros [] tipo real) tipo entero var max tipo real , var pos_max tipo entero var i tipo entero max ß 0 for i=1 to numeros.longitud do if max<numeros[i] then max ßnumeros[i] , pos_max ß i endif end for devolver pos_max end funcion • Que habría que modificar para que en lugar del máximo, devolviera su • NB. Que hayamos puesto comas (,) para separar instrucciones en una máximo de todos ellos • índice o posición? Ejemplo: si la matriz fuese ventas[12], que representa las ventas en 12 meses, el segundo problema nos daría el número del mes, mientras que el primer problema nos daría el volumen de ventas de este mes en cuestión… Más ejercicios • • • Función que devuelve el promedio de una matriz de números reales Función que busca el número de apariciones de un determinado valor en una matriz (i.e. la función recibirá 2 parámetros: la matriz y el elemento a buscar y devolverá el número de apariciones) (si los valores fuesen 2,34,23,15,3,4,3,21 y buscasemos el número de “3”, devolvería un 2) Función (parecida a la anterior) que devuelve la posición de la primera aparición de este valor (en este caso devolvería 5 que es la posición del primer “3”). Si no aparece haremos que devuelva -1 máximo de todos ellos misma línea no significa que se pueda hacer en todos los lenguajes… Matrices de más de una dimensión • Si las matrices que hemos visto hasta ahora eran como armarios con cajones, una matriz de 2 dimensiones es como una hilera de armarios (con cajones en cada uno de ellos) • Por ejemplo, var notas[30][8] tipo real podría almacenar las notas que han obtenido 30 alumnos en 8 exámenes (sería como una hilera de 30 armarios, con 8 cajones c/u) notas[3][5] es la nota del 3er. alumno en el 5o. examen • Este concepto puede en realidad ampliarse a cualquier dimensión, aunque el uso de matrices de más dimensiones es menos frecuente Matrices de 2 ó 3 dimensiones : Ejemplo • • • • • Una imagen puede considerarse como una matriz de pixels de 2D Si cada pixel tiene 3 componentes (R,G,B), tenemos que en realidad una imagen puede considerarse como una matriz de 3D var imagen[800][600][3] tipo entero representaría una imagen en color (R,G,B) de 800x600 píxeles ([4] si tuviese canal alpha) Nosotros nunca programaremos algo así, pero esto se acerca a como maneja las imágenes un programa de tipo Photoshop Además el uso de matrices de varias dimensiones varía también mucho de un lenguaje a otro è No haremos ejercicios con este tipo de datos. Fin de la Introducción a la programación! 3