Lenguajes de Programación Arrays INGENIERÍA INFORMÁTICA Lenguajes de Programación E.P.S. PRÁCTICAS de Lenguaje C Curso 2002-2003 Tema: Estructuras de Datos I Prácticas Pág. 1 Lenguajes de Programación Arrays ESTRUCTURAS DE DATOS I: ARRAYS 1. Preparación previa y objetivos 1.1 Preparación Previa Editar + Compilar + Depurar errores Sintácticos y Semánticos Declarar variables con tipos simples y usarlas en expresiones simples Entrada/Salida reducida con printf y scanf Estructuras de Control Iniciación y motivación a la programación estructurada 1.2 Objetivos de la Sesión Primarias Conceptos básicos de estructura de datos Manipulación de vectores. Estructuras de datos simples: matrices Secundarias Introducción a los vectores de caracteres. Prácticas Pág. 2 Lenguajes de Programación Arrays 2. Arrays (o cadenas) Un array es una colección de variables del mismo tipo que se referencian mediante un único nombre. Internamente se almacenan en posiciones continuas de memoria. Cualquier elemento de este array puede ser accedido usando el nombre del array y unos números naturales (que comienzan en 0) denominados índices. Los arrays más comunes son los siguientes: Vector o Array Unidimensional. Utiliza 1 índice ( que denominaremos i ) el cual indica la posición del elemento: i posición [3] Matrix o Array Bidimensional. Usa 2 índices (i, j ) que indican, respectivamente, la fila (índice i ) y la columna ( índice j ) del elemento al que deseamos acceder : j posición [0][0] i posición [1][3] Volumen o array Tridimensional. Usa 3 índices ( i, j, k ) indicando, respectivamente, fila ( i ), columna ( j ) y capa ( k ) donde se almacena el elemento: k i j posición [0][2][1] IMPORTANTE !!!!!!! En C, todos los índices empiezan con CERO. Prácticas Pág. 3 Lenguajes de Programación Arrays 4. Arrays Unidimensionales: Vectores 4.1. Declaración La forma general de declarar un array unidimensional o vector es la siguiente: tipo nom_vector[tamaño]; donde, tipo, Es el tipo de variable base que forma el vector (por ejemplo: int, char, float) nom_vector, es el nombre del array. tamaño, es la longitud (=número de elementos) del vector. Un vector de caracteres se denomina cadena de caracteres o string. 4.2 Acceso a los elementos Se utiliza un índice único que indica la posición de la variable/elemento que se desea manipular. El índice comienza en cero y acaba en tamaño-1. Ejemplos: int Peces[3]; Esta línea de código crea un vector que se compone de tres valores enteros (Peces[0], Peces[1] y Peces[2]): Peces[0] Peces[2] Peces[1] float Barco[15]; double Gato [70]; /*Declaración de un vector de 15 floats*/ /*Declaración de un vector de 70 doubles*/ char MiNombre[51]; /*Declaración de una cadena/string*/ RECORDAD !!!!!!!! Los índices de los arrays comienzan en 0 y acaban en el tamaño del vector menos uno. Así el primer elemento de los ejemplos anteriores será Peces[0], Barco[0], Gato[0] y MiNombre[0] y el último Peces[2], Barco[14], Gato[69] y MiNombre[50] Prácticas Pág. 4 Lenguajes de Programación Arrays 4.3 Inicialización de los vectores Hay dos formas de inicializar un vector: 4.3.1 En el momento de la declaración La primera forma sería inicializar el vector en el momento en que se declara: tipo nom_vector[N] = {valor_1, ··· , valorN}; En este caso no es necesario indicar el tamaño del vector Ejemplo: int vect[ ] = {1,2,3,4,5}; 4.3.2 Inicializar cada elemento La segunda forma es asignar a cada elemento del vector un cierto valor dentro del programa: tipo nom_vector[N]; /* Declara un array formado por N elementos */ /* Inicializar el array */ nom_vector[1] = valor1; · nom_vector[N] = valorN; Ejemplo 1: Este programa declara, inicializa y muestra por pantalla un vector compuesto por tres elementos. #include <stdio.h> void main(void) { /* Declarar un vector (v) compuesto por 3 enteros.*/ int v [3]; /* Inicializar el vector asignando los valores explícitamente.*/ v[0] = 10; v[1] = 20; v[2] = 30; /* Mostrar por pantalla printf("Contenido printf("Contenido printf("Contenido } el contenido del del vector[0] => del vector[1] => del vector[2] => vector v.*/ %d\n",v[0]); %d\n",v[1]); %d\n",v[2]); Ejercicio 1 : Edita el programa del ejemplo 1 y depuradlo (debug) para descubrir los valores por defecto del vector v. Modifica el programa de forma que: (i) el vector v este compuesto por cuatro enteros, (ii) se inicialice el cuarto entero con el valor 40 y (iii) se muestre el valor de este curto vector por pantalla. (iv) Modificar el programa de forma que se le pregunte al usuario el valor de los cuatro miembros del vector. Prácticas Pág. 5 Lenguajes de Programación Arrays (Recuerda incluir el código de todos los programas que escribáis y/o modifiquéis con la memoria de la práctica) 4.4Acceso eficiente a los elementos de un vector Cuando el vector es grande, la manera más rápida de acceder a las diferentes variables/posiciones/elementos de un vector es mediante un bucle for usando el contador del bucle for como índice de la variable. Ejemplo 2: #include <stdio.h> void main(void) { int v [3]; /* Declarar un vector v compuesto por 3 enteros*/ int i; /* Entero que hace de índice/ /* Inicialización del vector asignando explícitamente los valores*/ v[0] = 10; v[1] = 20; v[2] = 30; /* Mostrar por pantalla el contenido del vector v usando un bucle.*/ for(i=0;i<3;i++) printf("Contenido de vector[%d] => %d\n",i,v[i]); } En el caso de usar un bucle para inicializar el vector, se ha de tener en cuenta que o bien se debe asignar el mismo valor a todas las posiciones del vector o se debe asignar a cada elemento el valor de una función del índice. tipo nom_vector[N]; /* Declarar un array de tamaño N */ int i; for(i=0;i<N;i++) { nom_vector[i] = Alguna_función_de_i; } Ejemplo 3: #include <stdio.h> void main(void) { Prácticas Pág. 6 Lenguajes de Programación Arrays int x[4]; /* Reservar un vector compuesto por 4 números enteros */ int t; for(t=0; t<4; t++) x[t]=t ; /* La asignamos su posición (t) */ } función identidad: a cada elemento le Ejercicio 2: Modifica el código del ejemplo 3 de forma que (i) el valor de cada posición del vector sea el doble del valor del índice y los valores asignados al vector se impriman por pantalla (usando un bucle for) Ejercicio 3: Modifica el programa del ejercicio 1 usando un bucle for para preguntar al usuario el valor a asignar a cada posición del vector. CUIDADO !!!!!!!!!!!!! C NO COMPRUEVA LOS LÍMITES de los arrays. Es posible pasar cualquier índice al array. Si el valor del índice es mayor que el tamaño del array menos 1, sobrescribiremos alguna otra variable con resultados potencialmente funestos. Por lo tanto aseguraros de que el valor del índice no es superior al tamaño del vector-1. Ejercicio 4: Escribir un programa en el cual: (i) se declare un vector “y” compuesto por tres floats, (ii) se inicialice con los valores: {1.0, 2.0, 3.0} y (iii) Escribir un bucle que visualice los valores del vector “y” de 0 hasta 4. Comenta los resultados. Ejercicio 5: Escribir un programa en el que (i) se emplee un vector compuesto por 5 enteros, (ii) el vector se inicialice usando valores tecleados por el usuario y (iii) mostrar por pantalla las posiciones pares del vector. Ejercicio 6: Este ejercicio es similar al anterior.(i) Crear tres vectores de tipo float de la longitud que queráis (pero que no sean muy grandes). (ii) Inicializar dos de los vectores usando valores tecleados por el usuario, (iii) llenar el tercer vector empleando la suma de los dos primeros vectores (elemento a elemento, esto es vecto3[0]=vector2[0]+vector1[0]) (iv) Mostrar el resultado por pantalla usando un formato razonable. 4.5 Cadenas de caracteres o strings. En C, una cadena se define como un vector de caracteres el último de los cuales es el carácter nulo: ‘\0’. Por lo tanto, para declarar cadenas es necesario que la longitud del vector sea un carácter más del máximo previsto. Por ejemplo, para declarar un vector frase que contenga una cadena de 10 caracteres, escribiremos: char frase[11]; Prácticas Pág. 7 Lenguajes de Programación Arrays Nótese que una cadena es, de hecho, un vector. Por lo tanto podemos inicializarla en el momento de la declaración Ejemplo: char cad[] = { ‘Q’,’u’,’e’,’ ’,’h’,’o’,’r’,’a’,’ ’,’e’,’s’,’?’,’\0’}; afortunadamente existe una forma más cómoda de definir cadenas usando una lista de caracteres entre dobles comillas. Por ejemplo: char cad[] = ”Que hora es?”; No es necesario añadir explícitamente el carácter nulo al final de la cadena, el compilador se encargará de hacerlo. Ejercicio 7: Añade estas cadenas al ejercicio 6 y úsalas de la forma que te parezca más conveniente "Introduce el valor del primer vector: " "Introduce el valor del segundo vector: " "El resultado es: "; Recueda que para mostrar una cadena por pantalla usando la orden printf se deben usar los caracteres de control %s 5. Arrays Bidimensionales o Matrices 5.1. Declaración La forma general de declarar una matriz es: tipo nom_matriz[num_filas][num_columnas]; donde, tipo, declara el tipo de variable base que forma la matriz. nom_matriz, nombre del array. num_filas, es el número de filas de la matriz. num_columnas, es el número de columnas de la matriz. Recordad que los índices empiezan en cero 0 !!!! Ejemplo: int mat[2][4]; /*declaración de una matriz entera de 2 filas y 4 columnas 5.2 Estructura de Matrices y acceso a sus elementos Prácticas Pág. 8 Lenguajes de Programación Arrays En la memoria del ordenador las matrices son vectores que contienen num_filas*num_columnas variables, como indica la figura 1-a. Conceptualmente podemos pensar en una matriz como un vector (las filas) de vectores de igual longitud (las columnas). 0 0 1 1 Fila 1 2 2 3 3 4 0 1 2 3 4 5 6 7 4 5 6 Fila 2 5 6 7 7 (a) Datos en Memoria (b) Agrupación en 2 filas (c)Objeto representado Figura 1. Estructura de una matriz 2*4 5.3 Inicialización y acceso eficiente a sus elementos De manera similar a los vectores, las matrices se pueden inicializar al ser declaradas o elemento a elemento. Así, la matriz de la figura 1 se podría inicializar como: Ejemplo: int mat[2][4]={{0,1,2,3},{4,5,6,7}}; O equivalentemente: //Fila 1 mat[0][0]=0; mat[0][1]=1; mat[0][2]=2; mat[0][3]=3; Prácticas Pág. 9 Lenguajes de Programación Arrays //Fila 2 mat[1][0]=4; mat[1][1]=5; mat[1][2]=6; mat[1][3]=7; Para acceder eficientemente a esta estructura se necesitan dos bucles for anidados. El siguiente ejemplo ilustra esta situación: Ejemplo 4: #include <stdio.h> void main(void) { /* Declarar una matriz de 2 filas y 3 columnas e inicializarla en el momento de la declaración*/. int matriz[2][3] = {{10, 20, 30}, {11, 21, 31}}; /* Declarar dos enteros que utilizaremos como índices.*/ int fila; int columna; /* Bucle para mostrar por pantalla los elementos de la matriz.*/ for(fila = 0; fila < 2; fila++) { for(columna = 0; columna < 3; columna++) printf("%5d",matriz[fila][columna]); printf("\n\n"); } } Ejercicio 8 Editar y ejecutar el código anterior: Redefinir la variable matriz de forma que tenga una fila más conteniendo los valores 12, 22, 32. Modifica los bucles para visualizar la nueva matriz y ejecuta el programa. Ejercicio 9: Define una matriz entera 3*4 (de nombre mat) e inicializarla elemento a elemento empleando los siguientes valores: 0 5 15 1 6 16 2 7 17 3 8 18 (i) Mostrar la matriz por pantalla.(ii) Modificar el código de forma que se impriman solo las dos primeras columnas por pantalla. Ejercicio 10 : Modifica el programa anterior de forma que la matriz se inicialice usando la función mat[ i ] [ j ] = 5*i+j; Prácticas Pág. 10 Lenguajes de Programación Arrays Mostrar el resultado por pantalla. Ejercicio 11 : Escribir un programa que cree una matriz cuadrada ( num_filas = num_columnas) de dimensión 3x3, Inicializa la matriz usando valores tecleados por el usuario e imprimir los elementos de la diagonal. Ejercicio 12: Crear dos vectores llamados sum_filas y prod_columns y rellenadlos usando la suma de las filas y el producto de las columnas de la matriz del ejercicio 9. Para rellenar sum_filas usa un bucle for y para rellenar prod_columns usa un bucle while Prácticas Pág. 11 Lenguajes de Programación Arrays 6. Arrays multidimensionales La filosofía de los arrays multidimensionales es la misma que la de los arrays ya introducidos. Esto es, para acceder a cualquier elemento se necesita el nombre del array y un conjunto de índices. La forma general de declarar un array multidimensional es: tipo nom_del_array[dim1][dim2]...[dimN]; donde, tipo, es el tipo de variable base que forma el array. nom_del_array, es el nombre del array. dim1, es la dimensión de la primera coordenada. dim2, es la dimensión de la segunda coordenada. · · · dimN, es la dimensión de la N-ésima coordenada. Ejemplo: Volumen. En 3 dimensiones, podemos considerar que tenemos N matrices consecutivas, esto es, un vector de matrices. Al variar el tercer índice, cambiamos de matriz, y los primeros dos índice nos permiten movernos a través de la matriz. float Arr[I][J][N]; con I,J,N > 1, produce un vector formado por N matrices de I filas y J columnas que podemos visualizar como: Arr[i][j][0] Arr[i][j][1] Arr[i][j][2] Ejercicio 13:Escribir un programa que (i) emplee el array: float Arr[2][2][3] de forma que el valor de cada elemento indique su capa (valor del último índice), (ii) Prácticas Pág. 12 Lenguajes de Programación Arrays pregunte al usuario que matriz (capa) desea visualizar y (iii) que visualice esta matriz por pantalla. Prácticas Pág. 13 Lenguajes de Programación Arrays Agradecimientos: Esta práctica está basada en las prácticas de Ingeniería informática realizadas por el Dept. Informàtica, Escola Tècnica Superior d'Enginyeria, Universitat Autònoma de Barcelona Prácticas Pág. 14