domingo, 6 de mayo de 2018

Array I: Unidimensionales


Hola estimados lectores y seguidores de este curso básico de Programación; antes de dar inicio al tema que atenderá este capítulo estudiemos la siguiente situación: Supongamos que hacemos un programa que se encarga de solicitar las notas de un estudiante universitario durante un semestre para almacenarlas y luego obtener su promedio en ese período académico. Agreguemos, además, que la cantidad de cátedras cursadas por los estudiantes son las mismas (cuestión que sabemos, en la práctica, no es necesariamente cierto).
 
Lo primero que se nos ocurre es crear las variables; aquí nos encontramos que debemos crear una cierta cantidad de ellas, pero cuántas el enunciado no nos lo dice. Para no complicarnos tanto al principio digamos que son 7 calificaciones. Esto nos obliga a crear la misma cantidad de variables para solicitar la información al usuario, guardarlas y luego manipularlas con el objeto de obtener el promedio. Perfecto, hecho.

Ahora extendamos esa suposición a algo más real. Tenemos el mismo programa que realizar, pero ahora no conocemos cuantas calificaciones ingresará el usuario y en vez del registro de un semestre se requiere de todas las cátedras que ha cursado durante la carrera; lo que nos obliga a crear n cantidad de variables (las cuáles no sabemos).

Si de por sí tener 7 variables de la mismas característica (notas) es impráctico y engorroso, lo es más si se deben crear 100 -y quizás me quede corto- para almacenar una cantidad de datos que desconocemos (imagínense como quedará la declaración de variables de este programa).

Arreglos Unidimensionales

Para estos casos existe una estructura de datos se ajusta perfectamente, estos son los Arreglos (Arrays en inglés). Los arreglos son estructuras de almancenamiento de datos similares a las variables que permiten reunir en ella varios datos de la mismas características. Por ejemplo, en el caso anterior que tenemos 7 calificaciones, en vez de crear siete variables (posiblemente nota1, nota2, ..., nota7) crearemos un arreglo llamado notas con siete posiciones de memorias. ¿Esto parece confuso? Veamos gráficamente su estructura para comprenderlo mejor.


 En la imagen anterior tenemos la estructura de un arreglo, cuyas particularidades son:
  • Es una Arreglo cuyo tamaño es 5, es decir, tiene 5 posiciones de memorias para almacenar esa cantidad de datos.
  • Poseen unos índice que sirven para ubicarnos dentro del arreglo y manipular un dato en específico.
  • En C++ los índices inician en 0, por eso razón es que vemos que para un arreglo de tamaño 5 los índices van de 0 a 4. Esto es muy importante tenerlo presente ya que si lo obviamos más adelante puede darnos un dolor de cabeza al momento de recorrer dichos arreglos.
Si lo vemos de otra forma, esta estructura es como cuando hacemos una cola para comprar. Todos tenemos una posición (índices) y en cada posición hay una persona cuya información es diferente (dato), pero el objeto a evaluar son lo mismo: personas (a menos que pongas a tu mascota hacer cola).

Bien, ya conocemos su estructura, ahora cómo la usamos. La forma de declarar un arreglo es de la siguiente forma:

[tipo de dato] nombre_del_arreglo [tamaño del arreglo] (= {dato1, dato2,...,datoN} valor (opcional));

Estudiemos esta sintáxis: 
  • Al igual que las variables, en los arreglos hay que definir el tipo de dato (int, float, char) y el identificador que tendrá (nombre del arreglo).
  • Se debe indicar el tamaño del arreglo, esto es, decir cuántos datos almacenará. En C++ es obligatorio que al momento de declarar el arreglo se indique su tamaño. En otros lenguajes como Python se puede dejar en blanco y luego se le dice que tamaño será. 
  • Como opcional se puede inicializar la variable indicando entre llaves { } los datos que tendrá. Lo común es que no se inicialice y carguen los datos con valores que se generan dentro del programa.
Ahora creo que estamos listo para ver un pequeño ejemplo:
 
#include <stdlib.h>
#include <iostream>
using namespace std;

int main (){
   int arreglo [3] = {1, 8, 10};

   arreglo [2] = 4;

   cout << "Ingrese un numero para modificar el valor del arreglo en la posicion 0";
   cin >> arreglo[0];
   cout << "El valor del arreglo en la posicion 0 es: " << arreglo [0];

   return 0;
} 

Analicemos este ejemplo:
  • Se crea un arreglo tipo entero de tres posiciones y de inicializa con tres valores. Fíjense que la sintaxis corresponde a la propuesta de arriba.
  • En la siguiente línea se cambia el valor del arreglo en la posición 2, es decir en valor 10 cambia por 4. Esta es la manera en la que se asigna un dato.
  • En las dos siguientes instrucciones se muestra un texto solicitando un nuevo dato para el arreglo en la posición 0 y con cin se captura por teclado y asigna a dicho arreglo en la posición 0 (cin >>arreglo [0]).
  • Posteriormente se muestra dato del arreglo en la posición 0.
En el ejemplo anterior vimos, inicialización de variable con valores iniciales; inserción de datos en un arreglo, tanto por un valor asignado como por captura por teclado, y muestra de un dato. Fíjense también que para indicar la posición en un arreglo colocamos un número que corresponde al índice. También es posible indicar la posición por asociación, esto es indicar a través de una variable el índice. Veamos de qué hablo.
#include <stdlib.h>
#include <iostream>
using namespace std;

int main (){
   int arreglo [3] = {1, 8, 10};
   int i = 2; j = 0;

   arreglo [i] = 4;

   cout << "Ingrese un numero para modificar el valor del arreglo en la posicion 0";
   cin >> arreglo[j];
   cout << "El valor del arreglo en la posicion 0 es: " << arreglo [j];

   return 0;
} 

Este ejercicio es similar al anterior, con la diferencia que ahora se indica la posición de los índices mediante la asociación de las variables i y j. Listo, qué les parece si complicamos un poco más los ejercicios para esta vez utilizar la sentencia de repetición for en el recorrido de los arreglos.

Propongo hacer el programa del enunciado con la cual iniciamos este artículo. Vamos a solicitar al usuario las n cantidad de calificaciones y obtener su promedio. Previamente se le debe pedir al estudiante que nos indique cuántas notas ingresará. Iniciemos:

#include <stdlib.h>
#include <iostream>
using namespace std;

int main (){
   int tam, suma = 0, prom;

   cout << "Indique la cantidad de notas que ingresará ";
   cin >> tam;

   int notas [tam];

   //Carga de Datos
   for (int i = 0; i < tam; i++){
      cout << "Ingrese una calificación :";
      cin >> notas[i];
   }
   //Calculo del Promedio
   for (int i = 0; i < tam; i++){
      suma = suma + notas[i];
   }
   prom = suma / tam;
   cout << "Tu promedio es: " << prom;

   return 0;
} 

Veamos:
  • En esta ocasión antes de crear el arreglo inicializamos tres variables tam, suma y prom. La variable tam la usaremos para capturar la cantidad de notas que ingresará el estudiante, suma para almacenar la sumatoria de la nota y prom para el promedio.
  • Una vez que el usuario indica cuantas calificaciones ingresará se crea el arreglo a través de la asociación con la variable tam
  • Posteriormente se utiliza la estructura de repertición for para recorrer el arreglo y asignar las notas que el usuario ingresará por teclado. En el for indicamos la variable que será de cambio la i la que, a su vez, será la asociación del índice del arreglo; por ejemplo, cuando i = 0, se apuntará al arreglo en la posición 0 (notas[i]). En el mismo for se dice que se repetirá la acción mientras la condición de i < tam se cumpla y luego i aumentará en uno (i++) al llegar al final del for.
  • Una configuración similar del for se utiliza para obtener el promedio. Se recorre el arreglo y en cada posición se realiza una sumatoria (suma = suma + notas[i]). Nota: Es importante que para las sumatoria se inicialice la variable que acumulará el dato en 0. En este caso, la variable suma se inicializó así suma = 0.
  • Por último, fuera del for, se obtiene el promedio y se muestra el dato.
Este ejercicio, apesar de ser sencillo, es suficiente para entender cómo funcionan los arreglos y cómo se recorren para manipular sus datos. Es requerido que lo analicen y si tienen algún inconveniente no duden en comentar.
Con esto concluimos esta primera parte de arreglos. Como su título lo indica son arreglos unidimensionales, es decir de una dimensión. En el siguiente capítulo estudiaremos los arreglos multidimensionales, también conocidos como vectores.

0 comentarios:

Publicar un comentario