12 arreglos estáticos en c - edgardo a. franco · mandar por referencia a una función un arreglo...

21
Estructuras de datos (Prof. Edgardo A. Franco) 1 Tema 12: Arreglos estáticos en C M. en C. Edgardo Adrián Franco Martínez http://www.eafranco.com [email protected] @edfrancom edgardoadrianfrancom

Upload: others

Post on 08-May-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 12 Arreglos estáticos en C - Edgardo A. Franco · Mandar por referencia a una función un arreglo unidimensional o de dos dimensiones •Para mandar por referencia un arreglo a una

Estructuras de datos (Prof. Edgardo A. Franco)

1

Tema 12: Arreglos estáticos en C

M. en C. Edgardo Adrián Franco Martínez http://[email protected]@edfrancom edgardoadrianfrancom

Page 2: 12 Arreglos estáticos en C - Edgardo A. Franco · Mandar por referencia a una función un arreglo unidimensional o de dos dimensiones •Para mandar por referencia un arreglo a una

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

12

Arr

eglo

s e

stát

ico

s en

CA

lgo

ritm

ia y

pro

gram

ació

n e

stru

ctu

rad

aP

rof.

Edga

rdo

Ad

rián

Fra

nco

Mar

tín

ez

Page 3: 12 Arreglos estáticos en C - Edgardo A. Franco · Mandar por referencia a una función un arreglo unidimensional o de dos dimensiones •Para mandar por referencia un arreglo a una

Introducción• Un arreglo estático es una colección finita yconstante (que no cambia su tamaño) de elementosdel mismo tipo.

• Un arreglo también es conocido como vector, matrizo array.

• Se pueden crear arreglos de cualquier tipo de datoen C, es decir, tipos de dato simple, estructurado,archivos e incluso de apuntadores.

3

12

Arr

eglo

s e

stát

ico

s en

CA

lgo

ritm

ia y

pro

gram

ació

n e

stru

ctu

rad

aP

rof.

Edga

rdo

Ad

rián

Fra

nco

Mar

tín

ez

Page 4: 12 Arreglos estáticos en C - Edgardo A. Franco · Mandar por referencia a una función un arreglo unidimensional o de dos dimensiones •Para mandar por referencia un arreglo a una

Arreglos unidimensionales• Se conocen dos tipos de arreglos: los unidimensionales

y los multidimensionales. Y al igual que otra variableprimero se debe declarar antes de utilizarse.

• Sintaxis para declarar un arreglo unidimensional:

<tipo_de_dato> identificador[tam_arreglo];

• Cuando se declara un arreglo unidimensional omultidimensional, se debe indicar el tamaño de dichoarreglo y este permanecerá constante durante el ciclo devida del programa o de la función, es decir, no podrácambiar su tamaño de manera dinámica. (Arreglosestáticos)

4

12

Arr

eglo

s e

stát

ico

s en

CA

lgo

ritm

ia y

pro

gram

ació

n e

stru

ctu

rad

aP

rof.

Edga

rdo

Ad

rián

Fra

nco

Mar

tín

ez

Page 5: 12 Arreglos estáticos en C - Edgardo A. Franco · Mandar por referencia a una función un arreglo unidimensional o de dos dimensiones •Para mandar por referencia un arreglo a una

Por ejemplo:

int arreglo[ 10 ];

• Esta declaración hace que el compilador le indiqueal sistema operativo que reserve espacio suficientepara almacenar 10 valores enteros.

• En estos casos, cuando se declara un arreglo el S.O.le asigna a dicho arreglo una porción consecutiva dememoria que es múltiplo del tamaño del tipo dedato con el que se declaro el arreglo.

5

12

Arr

eglo

s e

stát

ico

s en

CA

lgo

ritm

ia y

pro

gram

ació

n e

stru

ctu

rad

aP

rof.

Edga

rdo

Ad

rián

Fra

nco

Mar

tín

ez

Page 6: 12 Arreglos estáticos en C - Edgardo A. Franco · Mandar por referencia a una función un arreglo unidimensional o de dos dimensiones •Para mandar por referencia un arreglo a una

• int arreglo[ 10 ];

6

12

Arr

eglo

s e

stát

ico

s en

CA

lgo

ritm

ia y

pro

gram

ació

n e

stru

ctu

rad

aP

rof.

Edga

rdo

Ad

rián

Fra

nco

Mar

tín

ez

Page 7: 12 Arreglos estáticos en C - Edgardo A. Franco · Mandar por referencia a una función un arreglo unidimensional o de dos dimensiones •Para mandar por referencia un arreglo a una

Lectura-escritura de elementos en arreglos unidimensionales

• Cada ítem del arreglo se le denomina elemento delarreglo.

• Todos los elementos que constituyen un arreglo senumeran consecutivamente comenzando en 0 hastan-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

12

Arr

eglo

s e

stát

ico

s en

CA

lgo

ritm

ia y

pro

gram

ació

n e

stru

ctu

rad

aP

rof.

Edga

rdo

Ad

rián

Fra

nco

Mar

tín

ez

Page 8: 12 Arreglos estáticos en C - Edgardo A. Franco · Mandar por referencia a una función un arreglo unidimensional o de dos dimensiones •Para mandar por referencia un arreglo a una

• A los valores de 0 a n-1 se les denomina índices osubíndices del arreglo, es decir, un índice osubíndice nos ubica en una posición determinadadentro del arreglo y nos permite tener accesodirecto al elemento de ese índice, para obtener suvalor 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

12

Arr

eglo

s e

stát

ico

s en

CA

lgo

ritm

ia y

pro

gram

ació

n e

stru

ctu

rad

aP

rof.

Edga

rdo

Ad

rián

Fra

nco

Mar

tín

ez

Page 9: 12 Arreglos estáticos en C - Edgardo A. Franco · Mandar por referencia a una función un arreglo unidimensional o de dos dimensiones •Para mandar por referencia un arreglo a una

Inicialización de un arreglo• Al igual que una variable local, un arreglo puede estar

previamente inicializado antes de usarlo, caso contrario elarreglo 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 unelemento que se almacena en una localidad del arreglo.

• Un caso especial es el de las comillas dobles ʺcadenasʺ, estetipo de inicialización aplica solamente para arreglos decaracteres y también significa que se está inicializando dichoarreglo.

9

12

Arr

eglo

s e

stát

ico

s en

CA

lgo

ritm

ia y

pro

gram

ació

n e

stru

ctu

rad

aP

rof.

Edga

rdo

Ad

rián

Fra

nco

Mar

tín

ez

Page 10: 12 Arreglos estáticos en C - Edgardo A. Franco · Mandar por referencia a una función un arreglo unidimensional o de dos dimensiones •Para mandar por referencia un arreglo a una

• 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

12

Arr

eglo

s e

stát

ico

s en

CA

lgo

ritm

ia y

pro

gram

ació

n e

stru

ctu

rad

aP

rof.

Edga

rdo

Ad

rián

Fra

nco

Mar

tín

ez

Page 11: 12 Arreglos estáticos en C - Edgardo A. Franco · Mandar por referencia a una función un arreglo unidimensional o de dos dimensiones •Para mandar por referencia un arreglo a una

Arreglos multidimensionales• Los arreglos multidimensionales son los que tienen

más de una dimensión, los más usuales son los dedos dimensiones que también son conocidos comotablas o matrices.

11

12

Arr

eglo

s e

stát

ico

s en

CA

lgo

ritm

ia y

pro

gram

ació

n e

stru

ctu

rad

aP

rof.

Edga

rdo

Ad

rián

Fra

nco

Mar

tín

ez

Page 12: 12 Arreglos estáticos en C - Edgardo A. Franco · Mandar por referencia a una función un arreglo unidimensional o de dos dimensiones •Para mandar por referencia un arreglo a una

• Una arreglo de dos dimensiones tienen 2 índices que nos ayudan a ubicar un elemento dentro del arreglo.

12

12

Arr

eglo

s e

stát

ico

s en

CA

lgo

ritm

ia y

pro

gram

ació

n e

stru

ctu

rad

aP

rof.

Edga

rdo

Ad

rián

Fra

nco

Mar

tín

ez

Page 13: 12 Arreglos estáticos en C - Edgardo A. Franco · Mandar por referencia a una función un arreglo unidimensional o de dos dimensiones •Para mandar por referencia un arreglo a una

La sintaxis para la declaración de un arreglo de dosdimensiones seria:

<tipo_dato> identificador [tam_filas][tam_columnas];

• Por ejemplo:

int datos[3][3];

• Esta línea de código declara un arreglo en dosdimensiones de 3 X 3 elementos, es decir, este arreglocontendrá en su interior 9 elementos de tipo entero.

13

12

Arr

eglo

s e

stát

ico

s en

CA

lgo

ritm

ia y

pro

gram

ació

n e

stru

ctu

rad

aP

rof.

Edga

rdo

Ad

rián

Fra

nco

Mar

tín

ez

Page 14: 12 Arreglos estáticos en C - Edgardo A. Franco · Mandar por referencia a una función un arreglo unidimensional o de dos dimensiones •Para mandar por referencia un arreglo a una

Acceso arreglos multidimensionales

• Para acceder a alguno de sus elementos se utilizan losdos índices, es decir:

datos[0][2] = 12;

datos[2][0] = 0;

datos[2][2] = 30;

• Un arreglo en dos dimensiones en realidad es un arreglode arreglos unidimensionales, es decir, cada elementodel un arreglo no es un valor entero, sino que cadaelemento es un arreglo.

0 1 2

0 12

1

2 0 30Los arreglos vande 0 hasta n-1, datos es un arreglode 3 X 3 entonces datos[2][2] hace referencia al ultimo elemento del arreglo

14

12

Arr

eglo

s e

stát

ico

s en

CA

lgo

ritm

ia y

pro

gram

ació

n e

stru

ctu

rad

aP

rof.

Edga

rdo

Ad

rián

Fra

nco

Mar

tín

ez

Page 15: 12 Arreglos estáticos en C - Edgardo A. Franco · Mandar por referencia a una función un arreglo unidimensional o de dos dimensiones •Para mandar por referencia un arreglo a una

• Es decir:int datos[3][3];

Es un arreglo que contiene 3 arreglos de treselementos cada uno.

datos[0]

datos[1]

datos[2]

datos[2][0]

datos[2][1]

datos[2][2]

15

12

Arr

eglo

s e

stát

ico

s en

CA

lgo

ritm

ia y

pro

gram

ació

n e

stru

ctu

rad

aP

rof.

Edga

rdo

Ad

rián

Fra

nco

Mar

tín

ez

Page 16: 12 Arreglos estáticos en C - Edgardo A. Franco · Mandar por referencia a una función un arreglo unidimensional o de dos dimensiones •Para mandar por referencia un arreglo a una

Inicialización de arreglos multidimensionales

• Existen varia formas de inicializar un arreglo de dosdimensiones:

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

12

Arr

eglo

s e

stát

ico

s en

CA

lgo

ritm

ia y

pro

gram

ació

n e

stru

ctu

rad

aP

rof.

Edga

rdo

Ad

rián

Fra

nco

Mar

tín

ez

Page 17: 12 Arreglos estáticos en C - Edgardo A. Franco · Mandar por referencia a una función un arreglo unidimensional o de dos dimensiones •Para mandar por referencia un arreglo a una

Lectura-escritura de elementos de arreglos multidimensionales

• Para escribir o leer un elemento de un arreglobidimensional siempre se va a requerir utilizar losdos índices con los cuales se declaro el arreglo.

• Para escribir en uno de ellos, obteniendo el valordesde 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

12

Arr

eglo

s e

stát

ico

s en

CA

lgo

ritm

ia y

pro

gram

ació

n e

stru

ctu

rad

aP

rof.

Edga

rdo

Ad

rián

Fra

nco

Mar

tín

ez

Page 18: 12 Arreglos estáticos en C - Edgardo A. Franco · Mandar por referencia a una función un arreglo unidimensional o de dos dimensiones •Para mandar por referencia un arreglo a una

Mandar por referencia a una función un arreglo unidimensional o de dos dimensiones

• Para mandar por referencia un arreglo a una función sedebe entender que el nombre del arreglo, es decir, elidentificador que se le coloco al arreglo es un apuntador,por lo tanto para mandar un arreglo a una función sehace de la siguiente forma:

int arregloInt[10];

funcion( arregloInt );

.

.

.

int funcion( int *ptr ){

ptr[0] = 123;

ptr[1] = 7;

}

Se manda el nombre arregloIntque es un apuntador que contiene la dirección del primerelemento dentro del arreglo.

La referencia del arregloInt se debe recibir con una variable apuntador del mismo tipo que fuedeclarado el arreglo.Hacen ya referencia

directamente a loselementos de arregloInt

18

12

Arr

eglo

s e

stát

ico

s en

CA

lgo

ritm

ia y

pro

gram

ació

n e

stru

ctu

rad

aP

rof.

Edga

rdo

Ad

rián

Fra

nco

Mar

tín

ez

Page 19: 12 Arreglos estáticos en C - Edgardo A. Franco · Mandar por referencia a una función un arreglo unidimensional o de dos dimensiones •Para mandar por referencia un arreglo a una

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 arreglomultidimensional es un apuntador a apuntadores, esdecir, el apuntador a apuntadores quedara definidodependiendo de la dimensión del arreglo, así para unarreglo 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 cadenaya que se trata de un arreglo de 2Dy su nombre seria un apuntador a una cadena

Hacen ya referencia directamente a loselementos de arreglo2D

19

12

Arr

eglo

s e

stát

ico

s en

CA

lgo

ritm

ia y

pro

gram

ació

n e

stru

ctu

rad

aP

rof.

Edga

rdo

Ad

rián

Fra

nco

Mar

tín

ez

Page 20: 12 Arreglos estáticos en C - Edgardo A. Franco · Mandar por referencia a una función un arreglo unidimensional o de dos dimensiones •Para mandar por referencia un arreglo a una

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ónnos devolverá el numero de bytes reservados para elarreglo completo.

• Por ejemplo:

int arreglo[ 10 ];

int tamanio;

tamanio = sizeof( arreglo );

20

12

Arr

eglo

s e

stát

ico

s en

CA

lgo

ritm

ia y

pro

gram

ació

n e

stru

ctu

rad

aP

rof.

Edga

rdo

Ad

rián

Fra

nco

Mar

tín

ez

Page 21: 12 Arreglos estáticos en C - Edgardo A. Franco · Mandar por referencia a una función un arreglo unidimensional o de dos dimensiones •Para mandar por referencia un arreglo a una

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 elementodentro 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

12

Arr

eglo

s e

stát

ico

s en

CA

lgo

ritm

ia y

pro

gram

ació

n e

stru

ctu

rad

aP

rof.

Edga

rdo

Ad

rián

Fra

nco

Mar

tín

ez