Você está na página 1de 11

Arreglos

En clase ya conocimos algunos tipos bsicos como por ejemplo los tipos char, int y float. El lenguaje C++ permite, adems, construir estructuras ms complejas a partir de estos tipos bsicos. Una de las construcciones que podemos definir son los arreglos.

Arreglo: Coleccin ordenada de elementos de un mismo tipo. Ordenada significa que cada elemento tiene una ubicacin determinada dentro del arreglo y debemos conocerla para accederlo.

Sintaxis:

Definicin de un arreglo:

<tipo> nombre_variable[longitud];

Con esto diremos que nombre_variable es un arreglo de longitud elementos del tipo <tipo>. Cabe destacar que longitud debe ser cualquier expresin entera constante mayor que cero.

Asignacin de un arreglo:

nombre_variable[ndice] = expresin del tipo <tipo>

Esta instruccin asigna el valor asociado de la expresin a la posicin ndice del arreglo nombre_variable. El ndice debe ser una expresin del tipo entero en el rango [0, longitud1]. Cabe destacar que C++ no chequea que el valor de la expresin sea menor a longitud, simplemente asigna el valor a esa posicin de memoria como si formara parte del arreglo, pisando, de esta manera, otros datos que no forman parte del mismo, con lo que finalmente el programa no funciona correctamente.

Acceso al contenido de un arreglo:

nombre_variable[ndice] es valor del tipo <tipo> que puede ser asignado a una variable, o pasado como parmetro, imprimirlo, etc. Aqu tambin vale la aclaracin de que el ndice debe estar dentro del rango de definicin del arreglo, C++ no chequear que esto sea cierto y devolver lo contenido en la posicin de memoria correspondiente a un arreglo de mayor longitud, el dato obtenido de esta manera es basura.

Ejemplo:

int a[5]; // Definicin de un arreglo de 5 posiciones

void main() { int i; // Pedimos el ingreso de 5 nmeros for(i=0; i<4; i++) { cout << Ingrese el elemento Nro: << i <<endl; cin >> a[i]; } // Los imprimimos imprimir(a,5); } //No olvidar que los arreglos van de 0 a longitud-1

void imprimir(int b[], int tamano) { int i;

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

{ cout << Nro: << i << <<b[i]<<endl; }

Notar que el parmetro b de la funcin imprimir es un arreglo, pero no se indica la longitud del mismo. Esto no es necesario ya que solo especificamos que recibiremos un arreglo sin importar su longitud (en este caso particular su longitud viene indicada en tamano). De esta manera la funcin imprimir funciona para arreglos de cualquier longitud.

Diferencias con GOFER:


En Gofer tenemos como tipo bsico al tipo lista. Este tambin tipo agrupa de forma ordenada elementos de un mismo tipo, pero existen varias diferencias importantes. Los arreglos en C++ son estticos, es decir una vez definido su tamao, este no crece ni decrece. Las listas de Gofer son dinmicas ya que su tamao puede variar indefinidamente. En Gofer cuando agregamos un elemento a la lista obtenemos una nueva lista con todos los elementos corridos a la posicin siguiente, en los arreglos solo asignamos valores a sus posiciones y cada uno de estos quedan en su posicin, una asignacin en la posicin i no afecta a otra posicin j si i es distinto de j.

Pasaje de parmetros

En Gofer cuando pasamos parmetros a las funciones lo nico que podemos hacer es operar con ellos para generar el resultado de la funcin, estos parmetros no se ven afectados ya que simplemente son expresiones del tipo de la aridad de la funcin.

En C++ existen diferentes posibilidades en el pasaje de parmetros, ya que estos pueden ser pasados por Valor o Copia o por Referencia, y cada uno tiene caractersticas diferentes.

Pasaje por Valor o Copia


Al declarar un parmetro por Valor, cuando la funcin es invocada, el valor del parmetro es copiado al entorno de la funcin, creando una nueva variable en el mismo. De esta forma la variable puede ser operada (cambiada) sin que esto afecte el valor de la variable en el entorno de la funcin llamadora. Este es el procedimiento que se asemeja al funcionamiento en Gofer. De una manera grfica, quizs se entienda mejor la idea:

Funcin llamadora

Funcin llamada

Pasaje por Referencia


Al declarar un parmetro por Referencia, cuando la funcin es invocada, el parmetro es referenciado por la variable de la funcin. De esta forma cada vez que utilizamos la variable declarada en realidad estamos utilizando la variable de la funcin llamadora. Esta forma de pasaje de parmetros abre una nueva posibilidad de comunicacin entre funciones (se puede devolver resultados no solo como el resultado de la funcin), pero debe ser utilizada con cuidado, ya que es muy fcil introducir errores en el programa.

Funcin llamadora

Funcin llamada

Pasaje por Referencia constante


El parmetro es una referencia a la variable de la funcin llamadora, pero esta variable no puede ser modificada. De esta manera se logra un efecto similar al pasaje por Valor pero sin necesidad de hacer una copia. La razn de utilizar este tipo de pasaje de parmetros es la eficiencia, es ms eficiente referenciar una variable que copiarla, siempre y cuando la variable sea de un tamao considerable, por ejemplo no tiene sentido utilizar este tipo de pasaje de parmetros para enteros, pero s para un arreglo de una gran dimensin. Con respecto a esto, cuando se declara una arreglo como parmetro de una funcin, aunque uno no aclare en el cdigo, el arreglo es pasado por referencia (como en el ejemplo de la funcin imprimir un poco ms arriba).

Ejemplo
Tenemos el siguiente programa:

void main() { float a = 10, b = 20, c ; cout << a << b ; c = suma(a,b) cout << A+B= << c; cout << A es << a; }

Caso 1) Pasaje por Valor o Copia

float suma(float a, float b) { a = a + b; return (a);

Veamos que sucede cuando ejecutamos el programa:

float a = 10, b = 20, c ;

a = 10 b = 20 c = ?

c = suma(a,b) Entramos a suma

a = 10 b = 20 c = ? asuma = 10 bsuma = 20

a = a + b;

a = 10 b = 20 c = ? asuma = 30 bsuma = 20

return (a); Desaparecen asuma y bsuma

a = 10 b = 20 c = 30

Como vemos en este caso los parmetros no se ven afectados ya que suma realiza copias de ayb

Caso 2) Pasaje por Referencia

Cambiemos la declaracin de suma declarando a a como referencia

float suma(float & a, float b)

Veamos que sucede cuando ejecutamos el programa:

float a = 10, b = 20, c ;

a = 10 b = 20 c = ?

c = suma(a,b) Entramos a suma

a = 10 b = 20 c = ? asuma = aref bsuma = 20

a = a + b;

a = 30 b = 20 c = ? asuma = aref bsuma = 20

return (a); Desaparecen asuma y bsuma

a = 30 b = 20 c = 30

Como vemos en este caso el parmetro a se ve afectado ya que suma utiliza una referencia aa

Caso 2) Pasaje por Referencia Constante

Cambiemos la declaracin de suma declarando a a como referencia constante

float suma(const float & a, float b)

En este caso el compilador devolver un error en la lnea

a = a + b;

ya que se esta intentando modificar una referencia con

Você também pode gostar