Tema 8 Vectores y Matrices

Contenidos 1. Vectores. 1.1. Declaración. 1.2. Inicialización. 1.3. Acceso a elementos. 1.4. Operaciones. 2. Cadenas de caracteres (vectores de caracteres). 2.1. Declaración, inicialización y acceso. 2.2. Funciones estándar para cadenas. 3. Matrices (vectores bidimensionales). 4. Vectores multidimensionales.

2

Vectores Un vector o array es un conjunto de datos homogéneos (del mismo tipo), agrupados de manera contigua y de acceso aleatorio. 2

-5

10

3

42

7

8

-34

6

15

Se pueden usar vectores de cualquier tipo de datos: int, long, float, double, char, etc.

En contraposición con los vectores están las estructuras (struct), que agrupan datos heterogéneos (de diferentes tipos). 3

Declaración de Vectores Para declarar un vector se debe especificar: El tipo de los elementos que lo forman. El nombre de la variable. El tamaño o número de elementos del vector.

Sintaxis: tipo nombre[tamaño];

Al declarar un vector se reserva en memoria el espacio necesario para almacenar todos sus elementos. Ejemplos: double alturas[10]; float notas[7]; int numeros[8]; char s[20];

4

Inicialización de Vectores Los elementos de un vector pueden inicializarse en su declaración. Para ello, se da una lista de constantes separadas por comas y delimitadas por llaves (pueden ser menos que el total de elementos del vector, con lo que sólo se inicializan los primeros elementos). Esta forma de inicializar sólo es posible en la declaración del vector. Ejemplos: double alturas[10] = {1.8, 1.6, 1.75, 1.45}; float notas[7] = {5.5, 9.4, 4.1, 3.2, 8.1}; int numeros[8] = {1, 2, 3, 4, 5, 6, 7, 8}; char s[20] = {'H', 'o', 'l', 'a', '\0'}; 5

Acceso a Elementos de Vectores Para acceder a un elemento de un vector se debe especificar el nombre del vector, seguido de la posición (el índice) que ocupa dicho elemento dentro del vector entre corchetes. x[0] x[1] x[2] x[3] x[4] x[5] x[6] x[7] x[8] x[9]

x:

2

-5

10

3

42

7

8

-34

6

15

El índice debe ser siempre una expresión entera. En C el índice de los elementos va desde 0 hasta N-1, siendo N el número de componentes (elementos) del vector. Ejemplos (para la declaración anterior): alturas[4] = 1.95; notas[5] = 8.75; numeros[0] = numeros[0] + 5; s[0] = '\0';/* Es lo mismo que hacer s[0] = 0; */ 6

Operaciones con Vectores En C no se permiten operaciones básicas con vectores completos, sino elemento a elemento. Los vectores pasados como argumento a funciones siempre se pasan por referencia. (¡Ojo! no sus elementos. Si se quiere pasar un único elemento por referencia hay que usar el &) Ejemplos: char s[20]; int n[10]; int f1(int v[20]); /* Recibe un vector de 20 enteros */ char f2(int v[]); /* Recibe un vector de enteros */ gets(s); /* Lectura de una cadena */ scanf("\n%c", &s[0]);/* Lectura de un carácter */ scanf("%d", &n[0]); /* Lectura de un número */ s[2] = f2( n );

Ejercicio: Escribir un programa que calcule la suma de dos vectores de N componentes tras haberlos leído por teclado.

7

Cadenas Una cadena no es más que un vector de caracteres. En C se sigue la convención de que las cadenas acaban con el carácter fin de cadena, que es el número cero, representado por '\0'. Declaración de cadenas char s[100], nombre[100], calle[41];

Inicialización de cadenas (sólo en la declaración) char saludo1[]="HOLA"; char saludo2[10]="HOLA"; char saludo3[10]={'H', 'O', 'L', 'A', '\0'};

Acceso a cadenas printf("%s\n", saludo1); s[0]='H';s[1]='O';s[2]='L';s[3]='A';s[4]='\0'; saludo1[1] = 'E'; printf("%c\n", saludo1[1]); 8

Funciones Estándar para Cadenas (Su declaración está en la cabecera string.h ) longitud = strlen(cadena); strlen devuelve la longitud de cadena (sin incluir el '\0'). strcpy(destino, origen); strcpy copia la cadena origen en la cadena destino. strcat(destino, origen); strcat añade la cadena origen a la cadena destino. resultado = strcmp(cadena1, cadena2); strcmp compara dos cadenas y devuelve un número que será

cero si son iguales, positivo si el primer carácter diferente es mayor (alfabéticamente) en cadena1 o negativo si este primer carácter es mayor en cadena2. 9

Matrices Una matriz es un vector bidimensional (un vector con dos dimensiones) (un vector de vectores). 1 2 3 4 5 6

B[0][0]

B[0][1]

B[0][2]

B[1][0]

B[1][1]

B[1][2]

Ejemplos: int A[2][2], B[2][3] = { {1,2,3} , {4,5,6} }; int C[2][3] = { 1, 2, 3, 4, 5, 6 }; int f1(int A[3][2]); /* Una matriz de 3x2 */ int f2(int A[][3]); /* Una matriz de ?x3 */ A[0][0] = 3 + B[0][2] + f2( C ); printf("Dame A(1,2): "); scanf("%d", &A[0][1]);

Ejercicio: Leer e imprimir una matriz de M× ×N elementos.

10

Matrices de Caracteres Una matriz de caracteres es un vector de vectores de caracteres, es decir un vector de cadenas. Ejemplos: char meses[12][11]={"Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"}; char nombres[100][50]; printf("Dame el primer nombre: "); gets(nombres[0]);

Ejercicio: Leer nombre y dos apellidos en una matriz de caracteres. 11

Vectores Multidimensionales Los vectores multidimensionales son vectores con más de una dimensión. Representan vectores de vectores o vectores de vectores de vectores o ... Ejemplos: int A[5][5]; float B[10][10][10]; int C[2][2][2] = {{{1,2},{3,4}}, {{5,6},{7,8}}}; int D[2][2][2] = {1,2,3,4,5,6,7,8}; int f1(int X[5][2][3][2]); int f3(int A[][2][3][2]); /* La primera dimensión no hace falta ponerla en la declaración de argumentos */ B[3][1][0] = C[0][0][0] + D[1][1][0]; scanf("%f", &B[9][9][9]); 12