Documento 479780

Anuncio
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
Descargar