martes, septiembre 29, 2009

Qué es un array? (Vectores)

Definición: Un array es un grupo de variables agrupadas por un mismo nombre, las cuales son todas del mismo tipo (int, char, etc) diferenciandose entre si por su índice.

Estructura: tipo_de dato nombre [tamaño]

Ejemplos:

int horas[12];
char nombre[30];
float dinero[15];

Con estos ejemplos quizá vemos más clara la definición propuesta para un array pero quizá aún sigue siendo confuso lo de los índices.

Supongamos que definimos un array de la siguiente forma: int numeros[5];

Este array o vector, podriamos verlo gráficamente así:

En donde cada espacio o casilla corresponde a una variable y ya que tenemos que diferenciarlas usamos los índices que no son más que los números que nos determinan las pocisión de cada uno dentro del array (Para el caso del 0 al 4).

Reescribiendo el ejercicio visto en la sección anterior:

#include <stdio.h>
#include <stdlib.h>

int main()
{
int hora[12];
int a,total=0;
for (a=0;a<12;a++)
{
printf("Ingrese el total en la hora %i: ",a+1);
scanf("%i",&hora[a]);
total+=hora[a];
}
printf("Cierre del dia = %i\n",total);
system("pause");
return 0;
}

Como vemos, utilizando un simple bucle podemos arrastrar la totalidad de los indices e ir capturando y operando todos los datos de forma mucho más simple y ágil.

¿Pero que hubiera pasado si hubiese puesto un numero diferente 12 en la condición del for? Si hubiese sido un numero <0 es claro que el for jamas se ejecutaria y el resultado impreso sería 0. Si hubiese sido un número entre 0 y 11, dispondríamos únicamente de los índices que se alcanzaran a barrer con ayuda del bucle quedando algunos posiblemente sin uno. Y si hubiese sido mayor >=12....probemos a ver que pasa:

Supongamos que a los cálculos realizados con los datos ingresados, ahora tenemos que elaborar una tabla visualizando en pantalla no sólo el gran total sino los datos previamente ingresados

#include <stdio.h>
#include <stdlib.h>
int main()
{
int hora[12];
int a,total=0;
for (a=0;a<12;a++)
{
printf("Ingrese el total en la hora %i: ",a+1);
scanf("%i",&hora[a]);
total+=hora[a];
}
for (a=0;a<18;a++)
{
printf("Hora %i: %i\n",a+1,hora[a]);
}
printf("Cierre del dia = %i\n",total);
system("pause");
return 0;
}

Tras ejecutar el programa y capturar los datos a mi me aparece esto en pantalla


Si observamos los datos, de la hora 13 a 18 arroja información que jamás fue ingresada ni calculada. De hecho, así como estos datos aparecieron pudieron haber sido otros, ya que lo que estamos visualizando son los valores que se encontraban en las pocisiones de memoria que se encuentran justo después de las que se reservaron para el vector hora de 12 pocisiones. De seguro, si ustedes ejecutaran el código verían otros valores. Hay que tener mucho cuidado con esto, ya que al menos en este ejemplo tan solo estamos imprimiendo datos pero quizá el resultado sería distinto si los modificaramos...nuestro código no haría lo que esperamos, se bloquearía nuestro pc, se cerraría la aplicación, cualquier cosa.

Inicialización: Como vimos cuando definíamos variables, estas pueden ser inicializadas con valores predeterminados. Con los arrays pasa lo mismo y tenemos dos posibilidades

1) Que conozcamos la cantidad de datos a ingresar e igualmente sepamos con precisión el tamaño del array que contendrá tales datos

Ejemplos:

char vocales[5] = {'a','e','i','o','u'};
int numeros[10]={1,2,3,4,5,6,7,8,9,10};
float decimales[3]={1.1,2.2,3.3};

En caso de que ingresáramos menos elementos de los que puede tolerar el tamaño del array (Ej: a[5] y sólo ingresamos 2), las pocisiones restantes estarán reservadas para su uso pero estarán inicicializadas con datos "basura". En caso de intentar ingresar más datos de los que puede recibir el arreglo, de seguro el compilador que usemos nos generará errores

2) La segunda posibilidad es que no sepamos exactamente la cantidad de datos que vamos a manipular. Esto puede presentarse por múltiples razones como por ejemplo que la informacion a ingresarse sea fluctuante a lo largo del tiempo, como las horas en que llueve cada día en un mes especifico, o que sea tanta que simplemente nos costaría mucho contarla. Supongamos el siguiente ejemplo:

#include <stdio.h>
#include <stdlib.h>
int main()
{
int numeros[]={1,3,34,45,57,65,45,342,2,2,54,56,67,9,4,34,3,3,34,45,56,3,
2,1,12,345,456,567,678,4,345,3,2,1,3245,456,5467,5,4,4,2,324,23,54,5,456,4,2,
2,342,12,31,2,3,4,456,2,3,4,5,56,3,3,356,567,67,87,0,56,34,23,2,2,34,2,23,4};
int cant,a;
cant=(sizeof numeros)/(sizeof(int));
for(a=0;a<cant;a++)
{
printf("%i) %i\n",a+1,numeros[a]);
}
printf("\nSe imprimieron %i numeros\n\n",cant);
system("pause");
return 0;
}

Observamos en el ejemplo que el tamaño del array está vacío. Podría pensarse que esto es un error ya que contradice la estructura presentada de un vector enunciada al comienzo de este tema, pero no es así. Al inicializarse el array, nuestro compilador va asignando tanta memoria se necesite dependiendo de la cantidad de elementos que deseamos manipular. De esta forma, nuestro vector estará perfectamente definido e inicializado a pesar de que nosotros ignoremos inicialmente la cantidad de elementos.

Esta linea de código es vital en el ejemplo:

cant=(sizeof numeros)/(sizeof(int));

Si no recuerdas el uso de sizeof visto en secciones anteriores pincha el enlace. Con este calculo la cantidad de elementos y procedo a realizar acciones con esto. Gracias a la inicializacion de nuestro vector  de esta manera y la linea antes mencionada, nuestro código será dinámico siempre ya que independientemente de la cantidad de elementos que ingresemos en el vector, siempre funcionará perfectamente  

No hay comentarios.: