Fundamentos de Informática Primero de Ingeniería Técnica Industrial Mecánica, Química, Electricidad y Electrónica Departamento de Tecnologías de la Información PRACTICA 6. VECTORES Y MATRICES. 1. Introducción. Los vectores y matrices son uno de los medios principales para el almacenamiento de los datos en un programa. En esta práctica veremos todos los conceptos relativos a la creación y manejo en C de vectores, matrices y cadenas de caracteres. 2. Conceptos nuevos. Los conceptos nuevos introducidos son: 1) 2) 3) 4) 5) Definición y manejo de vectores o arrays unidimensionales. Definición y manejo de matrices o tablas. Definición y manejo de cadenas de caracteres. Búsqueda de un elemento dentro de un vector. Búsqueda de un elemento dentro de una tabla. 3. Lenguaje C. Las nuevas características de C que ha aprendido y que necesita saber para la realización de la práctica son: 1) Definición y funcionamiento de vectores o arrays unidimensionales. 2) Definición y funcionamiento de matrices o tablas. 3) Definición y funcionamiento de cadenas de caracteres. 4. Entorno DevC++. La única funcionalidad nueva de DevC++ necesaria para esta práctica es saber cómo visualizar un vector en la ventana de depuración Watch. 5. Búsqueda en vectores y matrices. Como ya hemos comentado inicialmente, los vectores y matrices son uno de los medios principales mediante los cuales se almacenan los datos en un programa C. Debido a esta causa, existen operaciones fundamentales cuyo tratamiento es imprescindible conocer. Estas operaciones esenciales son la búsqueda de elementos y la ordenación. En este curso sólo se abordará la primera de ellas. Veremos cómo realizar una búsqueda en un vector y cómo realizar una búsqueda en una matriz. Fundamentos de Informática Primero de Ingeniería Técnica Industrial Mecánica, Química, Electricidad y Electrónica Departamento de Tecnologías de la Información 5.1. Búsqueda en un vector. La búsqueda de un elemento dentro de un vector se basa en ir recorriendo secuencialmente el vector, de una posición a la siguiente, comenzando en la primera posición del vector y deteniéndose únicamente cuando se encuentra el elemento buscado o bien cuando se alcanza el final del vector. El pseudocódigo asociado a lo anteriormente expuesto sería el siguiente: Inicio encontrado = 0 indice = 0 mientras (encontrado == 0) y (indice < ultimo) hacer si (Vector[indice] == elemento_buscado) entonces encontrado = 1 sino incrementar indice fin_mientras si (encontrado == 1) entonces Escribir “Elemento encontrado en posición” indice sino Escribir “Elemento no encontrado” Fin Observando el pseudocódigo anterior vemos que se utiliza una variable entera encontrado que indica si el elemento se encontró en la búsqueda. La variable encontrado se inicializa a 0 (falso) y se activa a 1 (verdadero) cuando se encuentra el elemento buscado. Se utiliza un operador and (en C &&), que permite evaluar las dos condiciones de terminación de la búsqueda: que el elemento se haya encontrado o que no haya más elementos (cuando el índice del vector excede al último valor válido del mismo). Cuando el bucle se termina, el elemento o bien se ha encontrado o bien no se ha encontrado. Si el elemento se ha encontrado, el valor de la variable encontrado será 1 y el valor de la variable indice será la posición del vector donde se encuentra el elemento buscado. Por el contrario, si el elemento no se ha encontrado el valor de la variable encontrado será 0. Fundamentos de Informática Primero de Ingeniería Técnica Industrial Mecánica, Química, Electricidad y Electrónica Departamento de Tecnologías de la Información 5.2. Búsqueda en una matriz. Utilizando un razonamiento análogo al expuesto en la sección anterior, la búsqueda de un elemento dentro de una matriz se basa en ir recorriendo secuencialmente la matriz. La única diferencia con el caso anterior es que ahora hay que recorrer filas y columnas comenzando en la primera fila y primera columna del vector y deteniéndose únicamente cuando se encuentra el elemento buscado o bien cuando se alcanza la última fila y la última columna. El pseudocódigo asociado a una búsqueda en una matriz bidimensional, sería el siguiente: Inicio encontrado = 0 indice_fila = 0 mientras (encontrado == 0) y (indice_fila < ultima_fila) hacer indice_columna = 0 mientras (encontrado == 0) y (indice_columna < ultima_columna) hacer si (Vector[indice_fila, indice_columna] == elemento_buscado) entonces encontrado = 1 sino incrementar indice_columna fin_mientras si (encontrado == 0) incrementar indice_fila fin_mientras si (encontrado==1) entonces Escribir “Elemento encontrado en posición” indice_fila “,” indice_columna sino Escribir “Elemento no encontrado” Fin La única diferencia con el código visto en la sección anterior es que en este caso son necesarios dos bucles anidados, uno para recorrer las filas y otro para recorrer las columnas. Fundamentos de Informática Primero de Ingeniería Técnica Industrial Mecánica, Química, Electricidad y Electrónica Departamento de Tecnologías de la Información 6. Ejercicios propuestos. A continuación se propone el enunciado de una serie de ejercicios que el alumno tiene que realizar antes de asistir a la sesión de prácticas, con el fin de presentar las dudas que hayan aparecido en la realización de los mismos durante la sesión de prácticas. 1) Escribir un programa que pida 10 números enteros por teclado y que imprima por pantalla: i. Cuántos de esos números son pares. ii. Cuál es el valor del número máximo. iii. Cuál es el valor del número mínimo. 2) Escribir un programa que lea un vector de 10 elementos. Deberá imprimir el mismo vector por pantalla pero invertido. Ejemplo: dado el vector 1 2 3 4 5 6 7 8 9 10 el programa debería imprimir 10 9 8 7 6 5 4 3 2 1. 3) Escribir un programa que lea 10 números por teclado. Luego lea dos más e indique si éstos están entre los anteriores. 4) Escribir un programa que lea una matriz de 3 filas y 3 columnas de valores enteros. A continuación, el programa debe pedir el número de una fila. El programa deberá devolver el máximo de esa fila. 5) Escribir un programa que lea un matriz de enteros de 2 filas y 4 columnas y muestre por pantalla la traspuesta a dicha matriz. Ejemplo: Entrada: 2 3 4 5 Salida 2 7 7 6 5 4 Æ 3 6 4 5 5 4 6) Escribir un programa que lea una matriz de números enteros y que devuelva la suma de los elementos positivos de la matriz y la suma de los elementos negativos. 7) Escribir un programa que lea una matriz de enteros de 4 filas y 4 columnas y a continuación intercambie la fila i con la fila j, siendo i y j dos valores introducidos por teclado. 8) Escribir un programa que lea una matriz de 4 filas y 3 columnas, la visualice por pantalla y a continuación encuentre el mayor y el menor elemento de la matriz y sus posiciones. 9) Escribir un programa que lea una frase y determine la frecuencia de aparición de cada vocal con respecto al total de caracteres de la frase. Fundamentos de Informática Primero de Ingeniería Técnica Industrial Mecánica, Química, Electricidad y Electrónica Departamento de Tecnologías de la Información 10) Escribe un programa que lea del teclado una cadena y muestre en la pantalla la cantidad de consonantes y de vocales que contiene. 11) Escribe un programa que lea del teclado una cadena y construya y muestre en la pantalla otra cadena en la que cada vocal haya sido reemplazada por un punto. 7. Ejercicios propuestos de un nivel de dificultad mayor Los ejercicios anteriores no presentaban una gran dificultad, en el sentido que la solución se consigue realizando una serie de pasos conocidos: inicialización de variables, uso de uno o varios bucles (anidados o no) y dentro de dichos bucles uso de sentencias condicionales if else para actualizar el valor de ciertas variables. Los siguientes ejercicios tienen una complejidad mayor a los propuestos anteriormente, en el sentido que la solución a simple vista no es tan obvia como los anteriores. Intente realizar los ejercicios siguientes. Encontrará que algunos son más difíciles de lo que parecen y que otros, en cambio, son más fáciles de lo que en un principio pensamos: 12) Escribir un programa que lea una frase y a continuación visualice cada palabra de la frase una debajo de otra, seguida cada palabra del número de letras que compone cada palabra. 13) Escribir un programa que lea una frase y sustituya todas las secuencias de dos o más blancos por un solo blanco y visualice la frase. 14) Una palabra es palíndroma si se puede leer igual de izquierda a derecha que de derecha a izquierda, por ejemplo: reconocer es palíndroma. Construye un programa que pida una palabra por teclado e imprima por pantalla si es o no palíndroma. 15) Un cuadrado mágico 3 x 3 es una matriz 3 x 3 formada por números del 1 al 9 donde la suma de sus filas, sus columnas y sus diagonales son idénticas. Crear un programa que permita introducir un cuadrado por teclado y determine si este cuadrado es mágico o no. El programa deberá comprobar que los números introducidos son correctos, es decir, están entre el 1 y el 9. 16) Se dice que una matriz tiene un punto de silla si alguna posición de la matriz es el menor valor de su fila y a la vez el mayor de su columna. Escribir un programa que tenga como entrada una matriz de números enteros y calcule la posición de un punto de silla (si es que existe). 8. La Frase. « Non pudeat, quae nescieris, te velle doceri: scire aliquid laus est, cupa est nil discere velle» “Pregunta sin reparos lo que quieras saber: más que ignorar, es malo no querer aprender” Marco Porcio Catón (234-149 a.C.)