ARRAYS Lenguajes de programación LPSI EUI UPM • Colección de datos del mismo tipo • Todos los elementos se almacenan en memoria consecutivamente • El tamaño de un array es fijo • Declaración: tipo nombre [dim] “dim” es la dimensión del array • El primer elemento es el de índice 0, los elementos van del 0 al dim-1 • El compilador no controla los límites del array en ejecución Lenguajes de programación LPSI EUI UPM int tabla[10]; char nombre[15], apell[50]; long double ctes[100]; • Acceso a los elementos mediante índices tabla[0] = 100; tabla[5] = 50; tabla[8/5+2] = 13; tabla[‘B’-’A’] = 71; tabla[10] = 0; ¡¡ MAL !! Lenguajes de programación LPSI EUI UPM • Inicialización: – En la declaración: int a[5] = {0, 0, 0, 0, 0}; float x[10] = {1.1, 2.2, 3.3}; char vocales[] = {‘a’, ‘e’, ‘i’, ‘o’, ‘u’}; long t[1000] = {0}; char nombre[15] = {‘ ‘}; Lenguajes de programación LPSI EUI UPM – En ejecución: int i, tabla[40]; char nombre[15], vocales[5]; for (i = 0; i < 40; i++) tabla[i] = 0; for (i = 0; i < 15; i++) nombre[i] = ‘ ‘; vocales[0] = ‘a’; …….. vocales[4] = ‘u’; Lenguajes de programación LPSI EUI UPM ARRAYS Y PUNTEROS • El nombre del array es también el puntero a la dirección del primer elemento. Es constante, no se puede modificar nunca. int tabla[10], *p; tabla == &tabla[0] p = tabla; Lenguajes de programación LPSI EUI UPM • Los elementos se pueden acceder mediante punteros int tabla[10] = {0}, *p; p = tabla; *p = 0; (tabla[0] = 0) Lenguajes de programación LPSI EUI UPM ARITMÉTICA DE PUNTEROS • Los punteros avanzan por el array independientemente del tamaño de los elementos. Si tipo tabla[100], *p = tabla, *q; p + n apunta al n-esimo elemento posterior al apuntado por p p–n apunta al n-esimo elemento anterior al apuntado por p q–p es el nº de elementos que hay entre p y q tabla <> &tabla[0] p + 3 <> &tabla[3] Lenguajes de programación LPSI EUI UPM int tabla[10] = {1,2,3,4,5,6,7,8,9,10}, *p = tabla; printf (“%d\n”, *p); p++; printf (“%d\n”, *p); p += 4; printf (“%d\n”, *p); printf (“%d\n”, p - tabla); p = tabla +9; printf (“%d\n”, *p); p--; printf (“%d\n”, *p); Lenguajes de programación LPSI EUI UPM *p++ se obtiene el valor apuntado por p y luego p pasa a apuntar al siguiente elemento (*p)++ se incrementa el valor apuntado por p y éste no cambia *++p p pasa a apuntar al siguiente elemento y luego se obtiene el valor de la nueva dirección Lenguajes de programación LPSI EUI UPM ARRAYS MULTIDIMENSIONALES • Declaración Tipo nombre [dim1][dim2]… • Acceso por índices nombre[ind1][ind2]… • Acceso por punteros *..**nombre * matriz[0][0] Lenguajes de programación LPSI EUI UPM main () { int tablero[8][8], i, j, *p; for (i = 0; i < 8; i++) for (j = 0; j < 8; j++) tablero[i][j] = 0; tablero [0][0] = 1; *(tablero[1]) = 2; **(tablero+2) = 3; p = &tablero[0]; for (i = 0; i < 8; i++) for (j = 0; j < 8; j++) *(tablero + i*8 +j) = 0; } Lenguajes de programación LPSI EUI UPM int matriz[2][3][2] = {{{4,2},{0,0},{3,9}}, {{3,5},{4,8},{9,6}}}; equivalente a int matriz[2][3][2] = {{4,2,0,0,3,9}, {3,5,4,8,9,6}}; equivalente a int matriz[2][3][2] = {4,2,0,0,3,9,3,5,4,8,9,6}; int matriz_2[ ][ ][ ] = {{{4,1,6},{4,8,9},{8,4,7}}, {{3,5,4},{8,9,6},{3,6,1}}, {{1,8,2},{2,2,2},{9,5,8}}}; Lenguajes de programación LPSI EUI UPM EJERCICIOS • Escribir un programa que lea matriz de 25x25 enteros e imprima por cada fila la media de sus elementos. • Escribir un programa que lea caracteres por teclado y vaya almacenando en un array de 30 elementos todas las vocales mayúsculas que aparezcan. El programa termina cuando se complete el array. Como resultado deberá mostrar por pantalla las vocales almacenadas y el porcentaje de vocales frente al total de caracteres leídos. Lenguajes de programación LPSI EUI UPM