Lenguaje C: Tema 4.
VECTORES
Vectores
TEMA 4.
VECTORES (ARRAYS)
1. INTRODUCCIÓN
2. ARRAYS UNIDIMENSIONALES
3. ARRAYS MULTIDIMENSIONALES. MATRICES.
4. PASO DE ARRAYS A FUNCIONES
5. INICIALIZACIÓN DE ARRAYS
6. OPERACIONES SOBRE ARRAYS
7. CADENAS DE CARACTERES (STRINGS)
Ampliación de Programación 1
Lenguaje C: 1. Introducción
Vectores
9 Los tipos de datos vistos hasta ahora se denominan escalares o
elementales
8 Las variables de estos tipos pueden tomar valores simples (un número
entero, un número real, un carácter)
9 Un vector es un tipo de datos constituido por un número fijo de
componentes del mismo tipo, llamado tipo base
8 Ejemplo: las notas de un alumno durante un curso se pueden guardar en un
vector de números reales
8 Es una estructura de acceso aleatorio: cada componente puede ser accedida
arbitrariamente
9 Los vectores pueden ser unidimensionales o multidimensionales
9 En los lenguajes de programación los vectores se suelen llamar arrays
Ampliación de Programación 2
1
Lenguaje C: 2. Arrays unidimensionales
Vectores
9 Sintaxis de la declaración de un array unidimensional en C
tipoBase nombreArray[expresionConstante];
9 Ejemplo: un array unidimensional de 5 enteros, llamado vector
int vector[5];
8 Con la declaración del vector anterior, se dispone de espacio en memoria
central para almacenar 5 valores enteros, referenciados con el nombre vector
Ampliación de Programación 3
Lenguaje C: 2. Arrays unidimensionales
Vectores
9 Para acceder a cada componente del array se escribe el nombre seguido
de la posición o índice, entre corchetes, de esa componente dentro del
vector
8 Se debe tener en cuenta que los índices comienzan en 0
8 Ejemplo: dada la declaración
int vector[5];
los índices del vector van de 0 a 4:
0 1 2 3 4 Índices
vector 3 4 1 4 7
vector[0] vector[1] vector[2] vector[3] vector[4]
Ampliación de Programación 4
2
Lenguaje C: 2. Arrays unidimensionales
Vectores
9 Ejemplo: lectura y escritura de un array de enteros
void main(void)
{
int v[10]; // array de 10 enteros
int i;
for (i=0; i<10; i++)
{
printf(“Valor %d: ”, i);
scanf(“%d”, &v[i]);
}
printf(“Valores leidos:\n”);
for (i=0; i<10; i++)
printf(“Componente %d: %d\n”, i, v[i]);
}
Ampliación de Programación 5
Lenguaje C: 3. Arrays multidimensionales
Vectores
9 Un array multidimensional se define de forma análoga a los
unidimensionales, separando cada uno de los índices por un par de
corchetes
9 Sintaxis de la declaración:
tipoBase nombreArray[constante1][constante2] ... [constanteN];
9 Ejemplo: declaración de un array bidimensional de 3x3 elementos
(matriz) de números reales:
float matriz[3][3];
8 El primer índice corresponde a las filas de la matriz y el segundo a las columnas
8 Para acceder a la componente (i,j):
matriz[i][j];
Ampliación de Programación 6
3
Lenguaje C: 3. Arrays multidimensionales
Vectores
9 Ejemplo: lectura y escritura de una matriz 3x3
#include <stdio.h>
#define NUMFILAS 3 // escribimos la matriz por filas
#define NUMCOLUMNAS 4
for (i=0; i<NUMFILAS; i++)
void main(void) {
{ // escribimos la fila i
float m[NUMFILAS][NUMCOLUMNAS]; for (j=0; j<NUMCOLUMNAS; j++)
int i,j; {
printf(“%.3f”, m[i][j]);
// leemos la matriz por filas }
for (i=0; i<NUMFILAS; i++) printf(“\n”);
{ }
// leemos la fila i }
for (j=0; j<NUMCOLUMNAS; j++)
{
printf(“Elemento (%d,%d): “,i,j);
scanf(“%f”, &m[i][j]);
}
}
Ampliación de Programación 7
Lenguaje C: 4. Paso de Arrays a funciones.
Vectores
9 Para declarar que una función recibe un array como parámetro, se debe declarar
el parámetro como un array del tipo base adecuado
8 Si el array es unidimensional, no es necesario especificar el tamaño del mismo
(corchetes vacíos).
8 Si el array es multidimensional, se debe especificar el tamaño de todas las
dimensiones, excepto el de la primera, que se puede dejar vacío.
9 En la llamada a la función que espera un array como parámetro, el nombre del
mismo debe aparecer solo, sin corchetes ni índices
8 De esa forma, se permite que el array completo sea pasado como parámetro a la
función.
9 Los arrays se pasan por dirección: al pasar un array como parámetro no se hace
una copia para la función de los valores de los elementos del array
8 El nombre de un array representa la dirección de memoria donde se encuentra la
primera componente del mismo, y a partir de esta dirección se accede a todas las
componentes .
Ampliación de Programación 8
4
Lenguaje C: 4. Paso de arrays a funciones
Vectores
9 Ejemplo: arrays unidimensionales
void AsignarVector(int destino[], int origen[])
#include <stdio.h> {
int i;
#define TAM 5
for (i=0; i<TAM; i++)
void LeerVector(int v[]) destino[i] = origen[i];
{ }
int i;
void main(void)
for (i=0; i<TAM; i++) {
scanf(“%d”, &v[i]); int v1[TAM], v2[TAM];
}
printf(“Introducir el vector 1: “);
void EscribirVector(int v[]) LeerVector(v1);
{ AsignarVector(v2,v1);
int i; printf(“Vector 2: “);
EscribirVector(v2);
for (i=0; i<TAM; i++) }
printf(“%d ”, v[i]);
}
Ampliación de Programación 9
Lenguaje C: 4. Paso de arrays a funciones
Vectores
9 Ejemplos: arrays bidimensionales void EscribirMatriz(float m[][NUMCOLUMNAS])
{
#include <stdio.h>
for (i=0; i<NUMFILAS; i++)
#define NUMFILAS 3 {
#define NUMCOLUMNAS 4 // escribimos la fila i
for (j=0; j<NUMCOLUMNAS; j++)
{
void LeerMatriz(float m[][NUMCOLUMNAS]) printf(“%.3f”, m[i][j]);
{ }
int i,j; printf(“\n”);
}
for (i=0; i<NUMFILAS; i++) }
{
// leemos la fila i void main(void)
for (j=0; j<NUMCOLUMNAS; j++) {
{ float matriz[NUMFILAS][NUMCOLUMNAS];
printf(“Elemento (%d,%d): “,i,j);
scanf(“%f”, &m[i][j]); LeerMatriz(matriz);
} EscribirMatriz(matriz);
} }
}
Ampliación de Programación 10
5
Lenguaje C: 5. Inicialización de arrays
Vectores
9 Se puede asignar valores iniciales a las componentes de un array en la
declaración
8 En la inicialización se puede omitir el tamaño del array
9 Ejemplo: inicialización de un array unidimensional
int v[5] = {7, -5, 0, 4, 1 };
int v[] = {7, -5, 0, 4, 1 }; // Equivalente a la anterior
9 Ejemplo: inicialización de un array bidimensional
int m[2][3] = {9, 0, -1, 3, 4, 7 };
int m[][3] = {9, 0, -1, 3, 4, 7 };
⎛ 9 0 − 1⎞
m = ⎜⎜ ⎟⎟
⎝3 4 7⎠
Ampliación de Programación 11
Lenguaje C: 6. Operaciones sobre arrays
Vectores
9 En C no existen funciones estándar para el manejo de arrays generales:
por ejemplo no existen funciones para leer, sumar, multiplicar o escribir
dos vectores
9 Las distintas operaciones sobre arrays se han de efectuar elemento a
elemento usando sentencias de iteración
9 La programación de estas operaciones se suele hacer con funciones
9 Las operaciones de manipulación de arrays más frecuentes son las
siguientes:
8 Lectura, escritura, asignación
8 Comparación
8 Búsqueda de un elemento dentro de un vector
8 Ordenación
Ampliación de Programación 12
6
Lenguaje C: 7. Cadenas de caracteres
Vectores
9 Una cadena de caracteres es un array unidimensional de caracteres
terminado con el carácter nulo (‘\0’)
8 Este carácter nulo se utiliza para indicar el fin de la cadena y no aparece
cuando se muestra en pantalla
9 Una constante de este tipo se expresa escribiendo la cadena de
caracteres entre comillas (“”)
8 Ejemplo: “hola”
8 Las cadenas de caracteres se pueden inicializar igual que cualquier otro
array
char cad[5] = “hola”; DECLARACIONES EQUIVALENTES
char cad[5] = { ’h’, ’o’ , ’l’, ’a’, ’\0’ };
8 Nótese la diferencia entre las constantes de tipo carácter (‘a’) y las
constantes de tipo cadena (“a”). La cadena “a” está formada por dos
caracteres: ‘a’ y ‘\0’
Ampliación de Programación 13
Lenguaje C: 7. Cadenas de caracteres
Vectores
9 Una cadena de n caracteres necesita un array de n+1 elementos, puesto
que hay que añadir el carácter ‘\0’ que indica el fin de la cadena
“hola” h o l a \0
9 En la inicialización se puede omitir el tamaño del array:
char cad[] = “hola”;
9 Existen numerosas funciones de librería en C para el tratamiento de
cadenas, cuyos prototipos se encuentran en <string.h>
9 Para la lectura y escritura de cadenas con printf y scanf, se utiliza el
formato %s
Ampliación de Programación 14
7
Lenguaje C: 7. Cadenas de caracteres
Vectores
9 Ejemplo: función que extrae una subcadena
9 Ejemplo: función que
de la cadena a desde la posición p hasta
calcula la longitud de una
p+q, y la copia en la cadena b
cadena
void SubCad(char a[],char b[],
int LongitudCad(char cad[])
unsigned p, unsigned q)
{
{
int i;
int i, longa;
i=0;
longa = LongitudCad(a);
while (cad[i] != ‘\0’)
i = p;
i++;
while ( (i<p+q) && (i<=longa) )
{
return(i);
b[i-p] = a[i];
}
i++;
}
b[i-p] = ‘\0’; /* marca de fin de cadena */
}
Ampliación de Programación 15
Lenguaje C: 7. Cadenas de caracteres
Vectores
9 Ejemplo: función que comprueba si dos cadenas son iguales
int CadenasIguales(char a[], char b[])
{
/* devuelve verdadero si las cadenas a y b son iguales,
falso en caso contrario */
int iguales, longitud, i;
iguales = 1; // verdadero
longitud = LongitudCad(a);
if (longitud != LongitudCad(b))
iguales = 0; // falso
else
{
for (i=0; i<longitud && iguales; i++)
if (a[i] != b[i])
iguales = 0; // falso
}
return(iguales);
}
Ampliación de Programación 16