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  

sábado, septiembre 26, 2009

Arrays en C

Hasta el momento hemos estudiado los diferentes tipos de variables, la forma para almacenar valores en ellas y diferentes maneras de manipularlas...sin embargo, ¿qué ocurre cuando tenemos que realizar operaciones con demasiados valores?: Con lo visto hasta ahora el proceso sería declarar tantas variables como datos tengamos que manipular, pero esto puede ser un proceso tedioso y puede prestarse fácilmente para confusiones.

Supongamos que tenemos una tienda que permanece abierta 12 horas al día y necesitamos crear un programa en el que hora a hora ingresemos el valor de las ventas y sea capaz de presentarnos un consolidado total al final del dia. Un programa que podría servir para el caso es el siguiente

#include <stdio.h>
#include <stdlib.h>
int main()
{
int hora1, hora2, hora3, hora4, hora5, hora6, hora7, hora8, hora9, hora10, hora11, hora12;
int total;
printf("Ingrese el total en la hora1: ");
scanf("%i",&hora1);
printf("Ingrese el total en la hora2: ");
scanf("%i",&hora2);
printf("Ingrese el total en la hora3: ");
scanf("%i",&hora3);
......
......
......
printf("Ingrese el total en la hora12: ");
scanf("%i",&hora12);
total=hora1+hora2+hora3+hora4+hora5+hora6+hora7+hora8+hora9+hora10+hora11+hora12;
printf("Cierre del dia = %i",total);
system("pause");
return 0;
}

Nota: No compilar ya que generará errores

Como vemos, tendremos un programa larguísimo que aunque sirve no resulta práctico teniendo presente la cantidad de variables que están en uso y la posibilidad que existe de confundirlas.

Qué es un array? (Vectores)
Arrays Bidimensionales (Matrices)

viernes, septiembre 25, 2009

Lápiz - Paint - Allegro

Enunciado: Crear una aplicación que simule la herramienta lápiz de Paint. Debe poderse limpiar la pantalla y cambiar el color del lápiz

Posible Solución: Lápiz - Paint - Allegro
 
Importante: Es necesario tener instalada la libreria allegro para poder compilar el código