Arreglos en C

Ya que conocemos ciclos, podemos entrar a Arreglos, comenzaremos por definir lo que son: Un arreglo es una “formación rectangular” de datos del mismo tipo, esta puede ser unidimensional, conocido comunmente como Vector, o multi-dimensional, conocido como Matriz -de nxnxnxnx…xn dimensiones-, y todos estos datos almacenados bajo un mismo identificador, un mismo nombre, accedidos a través de índices, igual que lo hacemos “a lápiz” con las matrices.

Comencemos con “cómo declarar un arreglo”, lo cual es sencillo:
tipo_dato identificador[Tamaño1][Tamaño2]…[TamañoDeLaDimensiónN]

Al igual que los datos reglares, necesitas decir de qué tipo va a ser, y entre corchetes identificar el tamaño que tiene ese arreglo, un solo par de corchetes nos entrega una matriz unidimensional (vector), dos pares, una matriz de nxn, y suscesivamente, cada par de corchetes no entrega una dimensión con su tamaño. Un ejemplo rápido:

Click en la imagen para Ampliar

Como se puede ver, ambos métodos nos dan “la misma salida”, como se pude, ver, los ciclos pueden ser muy útiles para arreglos. El índice del arreglo nos da acceso a sus datos, a través del mismo nombre. Ese ejemplo es tonto, no sirve de mucho, solo nos muestra cómo se declara algo simple y cómo se imprime, ahora, veremos otro tipo de declaración y cómo llenar los arreglos con un ciclo:

Click en la imagen para Ampliar

Se pueden ver 2 cosas, 1)Nos tira un Warning por usar el for de esa manera, dice que falta el tercer agumento, el i++ o cosas así, mi profesor nos decía “Somos ingenieros, no nos asustamos por un warning”, aunque no sean ingenieros, no se espanten;2)La basura. Así le llamamos a eso “raro” que nos aparece en el índice 0 del arreglo antes de que grabemos en él datos ayudados del for.

La basura es un fenómeno asociado a la memoria ram. Como sabemos, cuando declaramos una variable, estamos reservando “espacio” en la memoria ram para utilizarlo nosotros. En un arreglo, se busca crear “n” espacios de memoria contiguos, esto es, unidos el uno al otro -conscecuentes en el órden de memorira-, entonces, ¿por qué aparece? Porque a no ser que lo indiquemos en nuestro software, es común que se quede en ram lo último que se grabó en ella hasta que otro programa reserva ese espacio de memoria y reemplaza los datos que había por otros, para su uso particular.

¿Cómo podemos evitarla? Teniendo cuidado con lo que hacemos, en general, no había hecho eso de “imprimir una variable antes de inicializarla”, porque pasan cosas extrañas, si hacemos un arreglo, NO debemos pasarnos de los límites del mismo, si tiene 10 espacios, el número máximo del índice el 9, va de 0 a n-1, no debemos ocupar índices negativos, esto es especialmente dirigido a cuando programamos de manera interactiva, preguntando datos al usuario, ya que este puede colocar datos que provoquen errores, toca al programador solventarlos antes de que ocurran.

Vamos con otro ejemplo y más formas de declarar arreglos:

Click en la imagen para Ampliar

Nos manda algunos Warnings, los ignoramos; a veces nos conviene analizar una cadena de caracteres, pero si la pedimos al usuario, no sabesmos cuánto mide, a pesar de que le demos, digamos, 100 espacios posibles, 100 chars reservados para obtenerla del teclado, a veces solo ocupamos 80, 60, pues strlen es una función de la biblioteca stdio.h, que nos da la medida de la cadena de chars que le demos, solo funciona con chars.

Ahora, como se puede ver, no es necesario declarar el tamaño del arreglo si lo estamos inicializando en ese precismo momento, así como que es posible declararlo de un tamaño específico cuando primero pedimos el tamaño y luego declaramos el arreglo a ese tamaño.

Ahora, lo difícil de explicar, la matriz. Como se ve, la declaré “por renglones”, en este caso, se nota la relación directa entre la declaración y cómo se ve en la impresión, pero falta explicar la lógica que implica el uso de los 2 Fors, si no estás familiarizado con el manejo de matrices, ahí hay un problema, trataré de explicarlo con una imagen:

Click en la imagen para Ampliar

En la imagen podemos apreciar cómo es la matriz, es de 2×2, si lo vemos como nos lo enseñan lápiz, en eso de “mxn”, queda como una matriz cuadrada, donde m = n, m es el número de renglones y n es el número de columnas. Se aprecian en color rojo las “coordenadas” de los datos de acuerdo a los índices que manejamos para los Arreglos en C, o sea, el primero es 0 y el último es n-1 donde n es el tamaño del mismo Cuando imprimimos matrices con 2 ciclos for anidados, a mí me gusta hacerlo de esta forma, imprimiendo “por renglón”, ahora analicemos lo que ocurre con la i y la j, con otra imagen:

Click en la Imagen para Ampliar

Un poco chueco porque lo hize con TuxPaint -software infantil-, está el esquema de cómo funciona esto. Tenemos 2 Ciclos, llamémoslos ‘i’ y ‘j’ por los contadores que utilizamos para ellos, respectivamente en órden de ejecución y aparición. Comenzando por entrar en el Ciclo i, este índice queda en 0, la siguiente instrucción nos dice “da un salto de línea” -olvidemos adornos-, lo da e inmediatamente pasa a otro ciclo, el Ciclo j, que tiene la orden de imprimir un vector el vector con índices [i][j], en ese momento, como vemos en la tabla, i vale 0, j vale 0, se imprime el valor 1 -coordenadas 0,0 o bien, índice [0][0]-, pero como el Ciclo j nos pide hacer dos veces las cosas, i vale 0 mientras que j aumenta a 1, e imprime el valor 2 -coordenadas 0,1 o bien, índice [0][1].

Al cumplirse la condición, se sale del ciclo j, si recordamos, el ciclo i es lo que estábamos ejecutando antes de entrar a j, ya no hay instrucciones, entonces i se incrementa en 1 y se vuelve a empezar.

i vale 1 en ese momento, se crea el salto de línea y se pasa al ciclo j, el ciclo j pone a j el valor de 0 -nuevamente- y se imprime el vector con índices [i][j], se imprime el valor de 3 -coordenadas 1,0 o bien, índices [1][0]-. El ciclo se repite, aumentando el valor de j en una unidad, entonces, i vale 1, j vale 1, y se imprime el valor de 4 -coordenadas 1,1 o bien, índices [1][1]-. Se acaba el ciclo j, se devuelve el control a i, nuevamente, pero este ya cumplió su condición de parada y no requiere iniciar de nuevo. Entonces, sale del ciclo i y se encuentra con la instrucción getchar(); y al final el ‘return’, con lo que finaliza el programa.

Un libro decía que bien podíamos pensar en una matriz como “Un vector de vectores”, si lo analizan, la idea es simple, si han trabajado con matrices a lápiz, de verdad que no tendrán problemas,  si no, pues estaría bien investigar un poco, pues se pueden a llegar a ocupar bastante. Lo que está haciendo falta al tutorial son ejemplos, tal vez.

Más por decir de los arreglos

Ahora, ya parecermos entender por qué cuando queríamos guardar una línea de texto colocábamos algo así como linea[100]; para declararla. Ahora, vemos que cada elemento por sí mismo es una variable, y que como cuálquier variable común, podemos imprirla con printf o guardar datos en ella con scanf, la ventaja es que gracias a los índices, podemos hacer muchas más operaciones que con variables comunes, podemos decidir, hasta cierto punto, cuántas variables queremos con el programa ya en ejecución, lo que nos permite generalizar muchísimas operaciones. ¿Como cuáles? Diré que por una tarea y algo de curiosidad, hice un programa que Multiplica Matrices, las que sean, del orden que sea, nxn. Otro ejemplo es el de las calificaciones, alumnos, etc. programas donde necesitamos hacer operaciones “conocidas” pero en un nivel de generalización mucho más alto que si solo declaramos variable1, variable 2, variable3.

Pronto, una entrega con ejercicios -o varias- para demostrar aplicaciones :). saludos.

Anuncios

~ por wkats en enero 3, 2012.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

 
A %d blogueros les gusta esto: