Está en la página 1de 12

ÍNDICE

Introducción

2

¿Qué es un arreglo?

3

Tipos de arreglos

3

Definición de un vector y un arreglo de acuerdo a las especificaciones del lenguaje

4

ejemplo definición de un Vector

 

4

ejemplo definición de un Arreglo

4

 

4

¿Qué es un subíndice y cuántos se utilizan para un vector y un arreglo?

5

ejemplos

5

Definición del concepto: sizeof

 

6

ejemplo 1

6

ejemplo 2

6

6

Inicialización de vectores y arreglos

 

7

ejemplo 1: Inicialización

de

vectores ...................................................................................

7

ejemplo 2: Inicialización de arreglos multidimensionales

7

Paso de parámetros: Arreglos

 

7

 

7

Representación de cadenas de caracteres (gráfico)

8

Inicialización de cadenas de caracteres

 

9

ejemplos

9

Funciones de manejo de

9

Funciones más comunes

 

9

Referencias Bibliográficas .........................................................................................................12

Introducción

Los arreglos son estructuras de datos lineales, debido a que están ubicadas en localidades contiguas de memoria. El método que se utiliza para poder acceder a las localidades de memoria es la indexación, en otras palabras, las localidades pueden ser referenciadas al añadir un índice al identificador del arreglo. Como cualquier otra variable, el arreglo debe ser declarado antes de ser utilizado. A lo largo del trabajo encontraremos ejemplos que ilustran la forma en que el lenguaje de programación C declara e inicializa distintos tipos de arreglos. Es a través de los arreglos que nos introducimos al mundo de la arquitectura de computadores; los arreglos nos permite entender con más profundidad la forma en que la memoria se segmenta para procesar y almacenar los datos. El objetivo principal de esta tarea es el de familiarizarse con los conceptos relacionados al manejo de arreglos, utilizando C como lenguaje.

¿Qué es un arreglo?

Un arreglo o array, es una secuencia de datos del mismo tipo. Los datos se llaman elementos del array y se numeran consecutivamente 0, 1, 2, 3, etc. El tipo de elementos almacenados en el array puede ser cualquier tipo de dato de C, incluyendo estructuras definidas por el usuario. Normalmente el array se utiliza para almacenar tipos tales como char, int o float.

Tipos de arreglos

Existen tres tipos de arreglos:

Arreglos unidimensionales

Es un tipo de datos estructurado que está formado de una colección finita y ordenada de datos del mismo tipo. Es la estructura natural para modelar listas de elementos iguales. Están formados por un conjunto de elementos de un mismo tipo de datos que se almacenan bajo un mismo nombre, y se diferencian por la posición que tiene cada elemento dentro del arreglo de datos. Al declarar un arreglo, se debe inicializar sus elementos antes de utilizarlos. Para declarar un arreglo tiene que indicar su tipo, un nombre único y la cantidad de elementos

que va a contener.

Arreglos multidimensionales

Es un tipo de dato estructurado, que está compuesto por dimensiones. Para hacer referencia a cada componente del arreglo es necesario utilizar n índices, uno para cada dimensión. El término dimensión representa el número de índices

utilizados para referirse a un elemento particular en el arreglo. Los arreglos de más de una dimensión se llaman arreglos multidimensionales.

Arreglo con múltiple subíndices

Es la representación de tablas de valores, consistiendo de información arreglada en renglones y columnas. Para identificar un elemento particular de la tabla, deberemos de especificar dos subíndices; el primero identifica el renglón del elemento y el segundo identifica la columna del elemento. A los arreglos que requieren dos subíndices para identificar un elemento en particular se conocen

como arreglo de doble subíndice. Note que los arreglos de múltiples subíndices pueden tener más de dos subíndices. El estándar ANSI indica que un sistema ANSI C debe soportar por lo menos 12 subíndices de arreglo.

Definición de un

vector

y

un

especificaciones del lenguaje C.

arreglo

de

acuerdo

a

las

De acuerdo con el lenguaje C, los arreglos se declaran indicando el tamaño o longitud, nombre y tipo de dato. La sintaxis determinada es:

tipo nombreArray[numeroDeElementos];

ejemplo definición de un Vector

Los vectores son arreglos de una sola dimensión o unidimensionales

//opción 1. Se define un vector de enteros int V[5];

//opción 2. Vector de flotantes float vector[3];

ejemplo definición de un Arreglo

Los arreglos pueden ser unidimensionales o multidimensionales

//opción 1. Arreglo bidimensional o Matriz de 5 filas y 2 columnas int M[5][2];

//opción 2. Arreglo multidimensional contiene 3 planos o páginas 1 , 3 filas y 3 columnas char M[3][3][3];

Almacenamiento de Arreglos en memoria (Gráficos)

En C los enteros ocupan, normalmente, 2 bytes, de modo que un array de diez enteros ocupa 20 bytes de memoria. En la fig. 1 se muestra un esquema de un arreglo de enteros en memoria.

Un array de enteros se almacena en bytes consecutivos de memoria. Cada elemento utiliza dos bytes. Se accede a cada elemento del array mediante un índice que comienza en cero.

1 CONTENIDO DE LA LECCIÓN 19. Retrieved August 7, 2013, from

De manera similar, los arreglos multidimensionales manejan los espacios de memoria los cuales son accesibles mediante ya no uno sino dos o más índices dependiendo la cantidad de dimensiones que tenga el arreglo, además los elementos ya no están organizados de manera lineal. Por ejemplo la siguiente figura muestra un arreglo de dos dimensiones.

De manera similar, los arreglos multidimensionales manejan los espacios de memoria los cuales son accesibles mediante

¿Qué es un subíndice y cuántos se utilizan para un vector y un arreglo?

El índice de un array se denomina con frecuencia, subíndice del array. El término procede de las matemáticas, en las que un subíndice se utiliza para representar un elemento determinado. El método de numeración del elemento i-ésimo con el índice o subíndice i - 1 se denomina indexación basada en cero. Su uso tiene el efecto de que el índice de un elemento del array es siempre el mismo que el número de pasos desde el elemento inicial a[0] a ese elemento. Por ejemplo, a[3] está a 3 pasos o posiciones del elemento

a[0].

ejemplos

// subíndices en un arreglo unidimensional o vector int edad[5]; //Array edad contiene 5 elementos: el primero, edad[0] y el último, edad[4]

//Subíndices en un arreglo multidimensional int b[2][3]

*nota: se tendrán tantos subíndices como dimensiones

Definición del concepto: sizeof

sizeof es un operador que devuelve el número de bytes necesarios para contener un argumento. Si se usa sizeof para solicitar el tamaño de un array, esta función devuelve el número de bytes reservados para el array completo. 2

ejemplo 1

float b; char c; // Conocer el valor en bytes de cada una de las variables

printf(" el número de bytes de la variable b es %f", sizeof(b)); printf(" el número de bytes de la variable c es %d", sizeof(c));

resultado:

el número de bytes de la variable b es 4 el número de bytes de la variable c es 1

ejemplo 2

// se declara un arreglo de 100 elementos int edades[100];

// si se desea conocer el tamaño de array, se puede utilizar una sentencia similar a:

n = sizeof(edades);

como resultado n tomará el valor del tamaño del array completo, n = 200.

¿Cuántos ciclos de repetición requiere el procesamiento de arreglos?

Consideremos primero un arreglo unidimensional a[5]. Para poder procesar ese arreglo se necesita solamente un (1) ciclo de repetición que vaya iterando hasta que su límite superior sea menor que el tamaño del vector. En caso de que estemos utilizando arreglos de n dimensiones sea n = 2, entonces la cantidad de ciclos repetitivos, anidados, necesarios para recorrer cada posición sería igual a 2. Por lo tanto se necesitarán tantos ciclos como dimensiones.

2 (2005). sizeof C Code. Retrieved August 7, 2013, from http://www.pccl.demon.co.uk/C/sizeof.html.

Inicialización de vectores y arreglos

Los elementos de un arreglo pueden ser inicializados en la declaración del arreglo haciendo seguir a la declaración un signo de igual y una lista entre llaves de valores separados por comas.

ejemplo 1: Inicialización de vectores

float R[10] = {2, 32, 4.6, 2, 1, 0.5, 3, 8, 0, 12}; float S[] =
float
R[10]
=
{2,
32,
4.6,
2,
1,
0.5,
3,
8,
0,
12};
float S[] = {2, 32, 4.6, 2, 1, 0.5, 3, 8, 0, 12};

ejemplo 2: Inicialización de arreglos multidimensionales

float

b[2][3]

=

{{1,2,3},{3,4,5}};

float S[][] = {0}; //inicializa todo el arreglo con ceros

Paso de parámetros: Arreglos

Normalmente todos los parámetros de una función se reciben por valor, como pudimos aprender el semestre pasado. Con los vectores y las matrices ocurre algo especial, cuando una función recibe un vector por parámetro, es capaz de cambiar su contenido de manera permanente (se ve aún fuera de la función) 3 . Esto sucede ya que el nombre de un arreglo es en realidad la dirección del primer elemento del arreglo (puntero). C pasa automáticamente por referencia(dirección) los arreglos a funciones. El pasar arreglos por referencia tiene sentido por motivos de rendimiento. Si se pasan arreglos grandes por valor y de manera frecuente, como copias de cada elemento, esto requerirá demasiado tiempo y demasiado espacio de almacenamiento.

Paso por referencia: Código en C

#include <stdio.h> #define SIZE 100

void modificaArreglo(int [], int);

int main (int argc, char* argv[]){ int V[SIZE] = {0}; int i = 0, cant = 0;

printf("Direccion de memoria de V[]:%p\n",V); printf("Ingrese la cantidad de elementos con los cuales desea trabajar\n");

3 Programación en C/Vectores - Wikilibros - Wikilibros - Wikibooks. Retrieved August 8, 2013, from

scanf("%d",&cant);

for(i=0;i<cant;i++){

printf("Ingrese el valor %d)\n",i+1); scanf("%d",&V[i]);

}

for(i=0;i<cant;i++)

//antes de modificar

printf("Valor[%d]:%d\n",i+1,V[i]);

modificaArreglo(V,cant); printf("Se modifico el arreglo\n");

for(i=0;i<cant;i++)

printf("Valor[%d]:%d\n",i+1,V[i]);

system("PAUSE"); return 0;

}

//ingreso los valores

//llamada a la función

//después de modificar

void modificaArreglo(int B[],int cantidad){ //declaración del cuerpo de la función int i=0; //Comprobamos que efectivamente, B[] hace referencia a V[] printf("Direccion de memoria de B[]:%p\n",B);

for(i=0;i<cantidad;i++)

}

B[i]+=2;

Resultado

scanf("%d",&cant); for(i=0;i<cant;i++){ printf("Ingrese el valor %d)\n",i+1); scanf("%d",&V[i]); } for(i=0;i<cant;i++) //antes de modificar printf("Valor[%d]:%d\n",i+1,V[i]); modificaArreglo(V,cant); printf("Se modifico

Representación de cadenas de caracteres (gráfico)

En el lenguaje C a la agrupación de caracteres individuales tipo char que forman una secuencia ordenada los denominamos cadena de caracteres. Cuando creamos una cadena, esta se guarda en un arreglo tipo char, donde cada carácter ocupa un espacio dentro del arreglo. La longitud de una cadena de caracteres dependerá de la cantidad de caracteres que

la componen. Por ejemplo la palabra “luna”, compuesta por cuatro letras donde cada

letra es un carácter, podríamos decir que es una cadena de caracteres de longitud cuatro.

Gráficamente sería de la forma siguiente:

Gráficamente sería de la forma siguiente: Además del espacio reservado para la cadena se utiliza unam http://www.fing.edu.uy/tecnoinf/mvd/cursos/prinprog/material/teo/prinprog-teorico07.pdf . (2003). 17. Manejo de cadenas <string.h> Retrieved August 8, 2013, fro m http://www.fismat.umich.mx/mn1/manual/node18.html . 9 " id="pdf-obj-8-4" src="pdf-obj-8-4.jpg">

Además del espacio reservado para la cadena se utiliza una celda adicional en el arreglo para guardar un carácter especial en C que lleva por nombre terminador de cadena. Este carácter '\0' bien como lo dice su nombre, tiene la función de indicar donde termina la cadena de caracteres dentro del arreglo.

Inicialización de cadenas de caracteres

ejemplos inicialización

// (1) Un arreglo de caracteres puede ser inicializado utilizando una cadena

char string1[] = “primero”;

/* (2) La cadena primero contiene 7 caracteres más un caracter especial que indica la terminación de la cadena que es el „\0‟ o caracter nulo. Entonces primero consta de 8 caracteres, que es el tamaño del array string1*/

char string1[] = {„p‟, „r‟, „i‟, „m‟, „e‟, „r‟, „o‟, „\0‟}; 4

Funciones de manejo de cadenas

Todas las funciones para manejo de cadenas tienen su prototipo en:

#include

<string.h>

Funciones más comunes 5 char *strcpy(const char *dest, const char *orig) -- Copia la cadena de caracteres apuntada por orig (incluyendo el carácter terminador '\0') al vector apuntado por dest. Las cadenas no deben solaparse, y la de destino, debe ser suficientemente grande como para alojar la copia.

4 (2013). Teórico 07. Retrieved August 8, 2013, from

5 (2003). 17. Manejo de cadenas <string.h> Retrieved August 8, 2013, from

int strcmp(const char *s1, const char *s2) -- Compara las dos cadenas de

caracteres s1 ys2. Devuelve un entero menor, igual o mayor que cero si se encuentra que s1 es, respectivamente, menor que, igual a, o mayor que s2. char *strerror(int errnum) -- Devuelve un mensaje de error que corresponde a un

número de error. int strlen(const char *s) -- Calcula la longitud de la cadena de caracteres.

char *strncat(char *s1, const char *s2, size_t n) -- Agrega n caracteres de s2 a

s1.

int strncmp(const char *s1, char *s2, size_t n) -- Compara los primeros n caracteres de dos cadenas. char *strncpy(const char *s1, const char *s2, size_t n) -- Copia los primeros n caracteres de s2 a s1. strcasecmp(const char *s1, const char *s2) -- versión que ignora si son mayúsculas o minúsculas de strcmp(). strncasecmp(const char *s1, const char *s2, size_t n) -- versión insensible a mayúsculas o minúsculas de strncmp() que compara los primeros n caracteres de s1.

Búsqueda en cadenas

char *strchr(const char *s, int c) -- Devuelve un puntero a la primera ocurrencia del carácter c en la cadena de caracteres s. char *strrchr(const char *s, int c) -- Encuentra la última ocurrencia del caracter c en la cadena. char *strstr(const char *s1, const char *s2) -- Localiza la primera ocurrencia de la cadena s2 en la cadena s1.

char *strpbrk(const char *s1, const char *s2) -- Regresa un apuntador a la primera ocurrencia en la cadena s1 de cualquier carácter de la cadena s2, o un apuntador nulo si no hay un caracter de s2 que exista en s1. size_t strspn(const char *s1, const char *s2) -- Calcula la longitud del segmento inicial de s1 que consta únicamente de caracteres en s2. size_t strcspn(const char *s1, const char *s2) -- Regresa el número de caracteres al principio de s1 que no coinciden con s2. char *strtok(char *s1, const char *s2) -- Divide la cadena apuntada a s1 en una secuencia de ``tokens'', cada uno de ellos esta delimitado por uno o más caracteres de la cadena apuntada por s2.

Conclusiones

Referencias Bibliográficas

Obra de principal referencia:

Joyanes A., L., & Zahonero M., I. (2000). Programación en C: Metodología, algoritmos y estructura de datos. Madrid: Mc Graw Hill.

  • 1 CONTENIDO DE LA LECCIÓN 19. Retrieved August 7, 2013, from

  • 4 (2013). Teórico 07. Retrieved August 8, 2013, from

5

(2003).

17.

Manejo

de

cadenas

<string.h>

Retrieved

August

8,

2013,

from