clase 23: arreglos estáticos en c - web personal de ... · pdf filearchivos e incluso...
TRANSCRIPT
Estructuras de datos (Prof. Edgardo A. Franco)
1
Tema 10: Arreglos estáticos en C
M. en C. Edgardo Adrián Franco Martínez http://www.eafranco.com [email protected] @edfrancom edgardoadrianfrancom
Contenido • Introducción • Arreglos unidimensionales
• Lectura-escritura de elementos en arreglos unidimensionales
• Inicialización de un arreglo • Arreglos multidimensionales
• Inicialización de arreglos multidimensionales • Lectura-escritura de elementos de arreglos
multidimensionales • Envió de un arreglo a funciones en C (Paso de referencia)
• Tamaño de un arreglo • Función Sizeof
2
10 A
rreg
los e
stát
icos
en
C Al
gorit
mia
y p
rogr
amac
ión
estr
uctu
rada
Pr
of. E
dgar
do A
driá
n Fr
anco
Mar
tínez
Introducción • Un arreglo estático es una colección finita y
constante (que no cambia su tamaño) de elementos del mismo tipo.
• Un arreglo también es conocido como vector, matriz o array.
• Se pueden crear arreglos de cualquier tipo de dato en C, es decir, tipos de dato simple, estructurado, archivos e incluso de apuntadores.
3
10 A
rreg
los e
stát
icos
en
C Al
gorit
mia
y p
rogr
amac
ión
estr
uctu
rada
Pr
of. E
dgar
do A
driá
n Fr
anco
Mar
tínez
Arreglos unidimensionales • Se conocen dos tipos de arreglos: los unidimensionales
y los multidimensionales. Y al igual que otra variable primero se debe declarar antes de utilizarse.
• Sintaxis para declarar un arreglo unidimensional:
<tipo_de_dato> identificador[tam_arreglo]; • Cuando se declara un arreglo unidimensional o
multidimensional, se debe indicar el tamaño de dicho arreglo y este permanecerá constante durante el ciclo de vida del programa o de la función, es decir, no podrá cambiar su tamaño de manera dinámica. (Arreglos estáticos)
4
10 A
rreg
los e
stát
icos
en
C Al
gorit
mia
y p
rogr
amac
ión
estr
uctu
rada
Pr
of. E
dgar
do A
driá
n Fr
anco
Mar
tínez
Por ejemplo: int arreglo[ 10 ];
• Esta declaración hace que el compilador le indique
al sistema operativo que reserve espacio suficiente para almacenar 10 valores enteros.
• En estos casos, cuando se declara un arreglo el S.O. le asigna a dicho arreglo una porción consecutiva de memoria que es múltiplo del tamaño del tipo de dato con el que se declaro el arreglo.
5
10 A
rreg
los e
stát
icos
en
C Al
gorit
mia
y p
rogr
amac
ión
estr
uctu
rada
Pr
of. E
dgar
do A
driá
n Fr
anco
Mar
tínez
• int arreglo[ 10 ];
6
10 A
rreg
los e
stát
icos
en
C Al
gorit
mia
y p
rogr
amac
ión
estr
uctu
rada
Pr
of. E
dgar
do A
driá
n Fr
anco
Mar
tínez
Lectura-escritura de elementos en arreglos unidimensionales
• Cada ítem del arreglo se le denomina elemento del arreglo.
• Todos los elementos que constituyen un arreglo se numeran consecutivamente comenzando en 0 hasta n-1 donde: • 0: es el primer elemento del arreglo, • n-1: es el ultimo elemento del arreglo y • n: es el tamaño total del arreglo.
7
10 A
rreg
los e
stát
icos
en
C Al
gorit
mia
y p
rogr
amac
ión
estr
uctu
rada
Pr
of. E
dgar
do A
driá
n Fr
anco
Mar
tínez
• A los valores de 0 a n-1 se les denomina índices o subíndices del arreglo, es decir, un índice o subíndice nos ubica en una posición determinada dentro del arreglo y nos permite tener acceso directo al elemento de ese índice, para obtener su valor o para modificarlo,
• Por ejemplo:
Índice o subíndice del arreglo
Tamaño total del arreglo
Se obtiene el valor del elemento (10 + 1)
Se modifica el valor del elemento (25 + 1)
int arreglo[30]; int dato; dato = arreglo[10]; arreglo[25] = 2344;
8
10 A
rreg
los e
stát
icos
en
C Al
gorit
mia
y p
rogr
amac
ión
estr
uctu
rada
Pr
of. E
dgar
do A
driá
n Fr
anco
Mar
tínez
Inicialización de un arreglo • Al igual que una variable local, un arreglo puede estar
previamente inicializado antes de usarlo, caso contrario el arreglo contendrá datos basura.
• Existen diferentes formas de inicializar un arreglo: 1. int numeros[6] = { 10,20,30,40,50,60 }; 2. int numeros[] = { 10,20,30 }; 3. char cad[] = {‘h’,‘o’,‘l’,‘a’,‘\0’}; 4. char s[] = “hola";
• Cada elemento dentro de las llaves corresponde a un
elemento que se almacena en una localidad del arreglo. • Un caso especial es el de las comillas dobles ʺcadenasʺ, este
tipo de inicialización aplica solamente para arreglos de caracteres y también significa que se está inicializando dicho arreglo.
9
10 A
rreg
los e
stát
icos
en
C Al
gorit
mia
y p
rogr
amac
ión
estr
uctu
rada
Pr
of. E
dgar
do A
driá
n Fr
anco
Mar
tínez
• Ejemplos • Inicializar un arreglo de números aleatorios
• Inicializar un arreglo de con el abecedario
int i; for( i = 0, i < 6, i++ ) { numeros[i] = rand(); }
char i; int h = 0; for( i = ‘a’, i <= ‘z’, i++ ) { letras[h] = i; h++; }
10
10 A
rreg
los e
stát
icos
en
C Al
gorit
mia
y p
rogr
amac
ión
estr
uctu
rada
Pr
of. E
dgar
do A
driá
n Fr
anco
Mar
tínez
Arreglos multidimensionales • Los arreglos multidimensionales son los que tienen
más de una dimensión, los más usuales son los de dos dimensiones que también son conocidos como tablas o matrices.
11
10 A
rreg
los e
stát
icos
en
C Al
gorit
mia
y p
rogr
amac
ión
estr
uctu
rada
Pr
of. E
dgar
do A
driá
n Fr
anco
Mar
tínez
• Una arreglo de dos dimensiones tienen 2 índices que nos ayudan a ubicar un elemento dentro del arreglo.
12
10 A
rreg
los e
stát
icos
en
C Al
gorit
mia
y p
rogr
amac
ión
estr
uctu
rada
Pr
of. E
dgar
do A
driá
n Fr
anco
Mar
tínez
La sintaxis para la declaración de un arreglo de dos dimensiones seria:
<tipo_dato> identificador [tam_filas][tam_columnas];
• Por ejemplo:
int datos[3][3];
• Esta línea de código declara un arreglo en dos dimensiones de 3 X 3 elementos, es decir, este arreglo contendrá en su interior 9 elementos de tipo entero.
13
10 A
rreg
los e
stát
icos
en
C Al
gorit
mia
y p
rogr
amac
ión
estr
uctu
rada
Pr
of. E
dgar
do A
driá
n Fr
anco
Mar
tínez
Acceso arreglos multidimensionales • Para acceder a alguno de sus elementos se utilizan los
dos índices, es decir: datos[0][2] = 12; datos[2][0] = 0; datos[2][2] = 30;
• Un arreglo en dos dimensiones en realidad es un arreglo
de arreglos unidimensionales, es decir, cada elemento del un arreglo no es un valor entero, sino que cada elemento es un arreglo.
0 1 2
0 12
1
2 0 30 Los arreglos van de 0 hasta n-1, datos es un arreglo de 3 X 3 entonces datos[2][2] hace referencia al ultimo elemento del arreglo
14
10 A
rreg
los e
stát
icos
en
C Al
gorit
mia
y p
rogr
amac
ión
estr
uctu
rada
Pr
of. E
dgar
do A
driá
n Fr
anco
Mar
tínez
• Es decir: int datos[3][3];
Es un arreglo que contiene 3 arreglos de tres elementos cada uno.
datos[0]
datos[1]
datos[2]
datos[2][0]
datos[2][1]
datos[2][2]
15
10 A
rreg
los e
stát
icos
en
C Al
gorit
mia
y p
rogr
amac
ión
estr
uctu
rada
Pr
of. E
dgar
do A
driá
n Fr
anco
Mar
tínez
Inicialización de arreglos multidimensionales • Existen varia formas de inicializar un arreglo de dos
dimensiones: a) int datos[3][3] = { 1,2,3,4,5,6,7,8,9}; b) int datos[3][3] = { {1,2,3},{4,5,6},{7,8,9}}; c) int datos[3][3] = { {1,2,3}, {4,5,6}, {7,8,9}}; d) o finalmente con un ciclo anidado: for ( i = 0; i < 3; i++){ //i manipulara las filas for( j = 0; j < 3; j++){ //j las columnas datos[i][j] = rand()%30; //Se delimita los valores } //entre 0 y 30 }
Todas estas inicializaciones tienen el mismo efecto. 16
10 A
rreg
los e
stát
icos
en
C Al
gorit
mia
y p
rogr
amac
ión
estr
uctu
rada
Pr
of. E
dgar
do A
driá
n Fr
anco
Mar
tínez
Lectura-escritura de elementos de arreglos multidimensionales
• Para escribir o leer un elemento de un arreglo bidimensional siempre se va a requerir utilizar los dos índices con los cuales se declaro el arreglo.
• Para escribir en uno de ellos, obteniendo el valor
desde consola sería: int datos[3][3]; printf( "Escribe un dato entero: \n" ); scanf( "%d", &datos[1][2] ); printf( El dato capturado fue: %d , &datos[1][2] ); 17
10 A
rreg
los e
stát
icos
en
C Al
gorit
mia
y p
rogr
amac
ión
estr
uctu
rada
Pr
of. E
dgar
do A
driá
n Fr
anco
Mar
tínez
Mandar por referencia a una función un arreglo unidimensional o de dos dimensiones
• Para mandar por referencia un arreglo a una función se debe entender que el nombre del arreglo, es decir, el identificador que se le coloco al arreglo es un apuntador, por lo tanto para mandar un arreglo a una función se hace de la siguiente forma:
int arregloInt[10]; funcion( arregloInt ); . . . int funcion( int *ptr ){ ptr[0] = 123; ptr[1] = 7; }
Se manda el nombre arregloInt que es un apuntador que contiene la dirección del primer elemento dentro del arreglo.
La referencia del arregloInt se debe recibir con una variable apuntador del mismo tipo que fue declarado el arreglo. Hacen ya referencia
directamente a los elementos de arregloInt
18
10 A
rreg
los e
stát
icos
en
C Al
gorit
mia
y p
rogr
amac
ión
estr
uctu
rada
Pr
of. E
dgar
do A
driá
n Fr
anco
Mar
tínez
Mandar por referencia a una función un arreglo unidimensional o de dos dimensiones
• Para un arreglo de dos dimensiones sucede lo mismo, solo hay que tomar en cuenta que el nombre de arreglo multidimensional es un apuntador a apuntadores, es decir, el apuntador a apuntadores quedara definido dependiendo de la dimensión del arreglo, así para un arreglo de dos dimensiones:
int arreglo2D[5][10]; funcion(arreglo2D); . . . int funcion2( int (*ptr)[10] ){ ptr[5][8] = 1; ptr[9][6] = 7542; }
Se recibe con un apuntador a cadena ya que se trata de un arreglo de 2D y su nombre seria un apuntador a una cadena
Hacen ya referencia directamente a los elementos de arreglo2D
19
10 A
rreg
los e
stát
icos
en
C Al
gorit
mia
y p
rogr
amac
ión
estr
uctu
rada
Pr
of. E
dgar
do A
driá
n Fr
anco
Mar
tínez
Tamaño en bytes de un arreglo • Para obtener saber el tamaño de un arreglo, se
puede utilizar la función sizeof(), esta función nos devolverá el numero de bytes reservados para el arreglo completo.
• Por ejemplo: int arreglo[ 10 ]; int tamanio; tamanio = sizeof( arreglo );
20
10 A
rreg
los e
stát
icos
en
C Al
gorit
mia
y p
rogr
amac
ión
estr
uctu
rada
Pr
of. E
dgar
do A
driá
n Fr
anco
Mar
tínez
Función Sizeof ( ) • sizeof() también sirve para darnos el tamaño de un
tipo de dato en especifico o el tamaño de un elemento dentro del arreglo.
• Por ejemplo: int tamanio; double a = 3.1455; float b = 3.084; char c = ‘e’; tamanio = sizeof( a ); tamanio = sizeof( b ); tamanio = sizeof( c ); tamanio = sizeof( tamanio ); tamanio = sizeof( arreglo[1] );
21
10 A
rreg
los e
stát
icos
en
C Al
gorit
mia
y p
rogr
amac
ión
estr
uctu
rada
Pr
of. E
dgar
do A
driá
n Fr
anco
Mar
tínez