AnteriorPosterior

4.1. Conceptos básicos sobre arrays

  Curso: Programación en C# (2015), por Nacho Cabanes

4. Arrays, estructuras y cadenas de texto

4.1. Conceptos básicos sobre arrays o tablas

4.1.1. Definición de un array y acceso a los datos

Una tabla, vector, matriz o array (que algunos autores traducen por "arreglo") es un conjunto de elementos, todos los cuales son del mismo tipo, y a los que accederemos usando el mismo nombre.

Por ejemplo, si queremos definir un grupo de números enteros, el tipo de datos que usaremos para declararlo será "int []":

int[] ejemplo;

Cuando sepamos cuantos datos vamos a guardar (por ejemplo 4), podremos reservar espacio con la orden "new", así:

ejemplo = new int[4];

Si sabemos el tamaño desde el principio, podemos reservar espacio a la vez que declaramos la variable:

int[] ejemplo = new int[4];

Podemos acceder a cada uno de los valores individuales indicando su nombre (ejemplo) y el número de elemento que nos interesa, pero con una precaución: se empieza a numerar desde 0, así que en el caso anterior tendríamos 4 elementos, que serían ejemplo[0], ejemplo[1], ejemplo[2], ejemplo[3]. Por tanto, podríamos dar el valor 15 al primer elemento de nuestro array así:

ejemplo[0] = 15;

Habitualmente, como un array representa un conjunto de números, utilizaremos nombres en plural, como en

int[] datos = new int[100];

Como ejemplo, vamos a definir un grupo de 5 números enteros y hallar su suma:

// Ejemplo_04_01_01a.cs
// Primer ejemplo de tablas (arrays)
// Introducción a C#, por Nacho Cabanes
 
using System;
 
public class Ejemplo_04_01_01a
{
    public static void Main()
    {
 
        int[] numeros = new int[5];  // Un array de 5 números enteros
        int suma;                    // Un entero que será la suma
 
        numeros[0] = 200;            // Les damos valores
        numeros[1] = 150;
        numeros[2] = 100;
        numeros[3] = -50;
        numeros[4] = 300;
        suma = numeros[0] +          // Y calculamos la suma
            numeros[1] + numeros[2] + numeros[3] + numeros[4];
        Console.WriteLine("Su suma es {0}", suma);
        // Nota: esta es la forma más ineficiente e incómoda
        // Lo mejoraremos...
    }
}
 

Ejercicios propuestos:

Ejercicio propuesto 4.1.1.1: Un programa que pida al usuario 4 números, los memorice (utilizando un array), calcule su media aritmética y después muestre en pantalla la media y los datos tecleados.
Ejercicio propuesto 4.1.1.2: Un programa que pida al usuario 5 números reales (pista: necesitarás un array de "float") y luego los muestre en el orden contrario al que se introdujeron.

4.1.2. Valor inicial de un array

Al igual que ocurría con las variables "normales", podemos dar valor inicial a los elementos de una tabla al principio del programa, si conocemos todos su valores. En este caso, los indicaremos todos entre llaves, separados por comas:

// Ejemplo_04_01_02a.cs
// Segundo ejemplo de tablas: valores iniciales con []
// Introducción a C#, por Nacho Cabanes
 
using System;
 
public class Ejemplo_04_01_02a
{
    public static void Main()
    {
        int[] numeros =            // Un array de 5 números enteros
            {200, 150, 100, -50, 300};
        int suma;                  // Un entero que será su suma
 
        suma = numeros[0] +        // Hallamos la suma
            numeros[1] + numeros[2] + numeros[3] + numeros[4];
        Console.WriteLine("Su suma es {0}", suma);
        // Nota: esta forma es algo menos engorrosa, pero todavía no
        // está bien hecho.  Lo seguiremos mejorando.
    }
}
 

Nota: el formato completo para la declaración de un array con valores iniciales es éste. incluyendo tanto la orden "new" como los valores entre llaves:

int[] numeros = new int[5] {200, 150, 100, -50, 300};

Pero, como se ve en el ejemplo anterior, casi siempre se podrá abreviar, y no será necesario usar "new" junto con el tamaño, ya que el compilador lo puede deducir al analizar el contenido del array:

int[] numeros = {200, 150, 100, -50, 300};

Ejercicios propuestos:

Ejercicio propuesto 4.1.2.1: Un programa que almacene en una tabla el número de días que tiene cada mes (su¬pon-dremos que es un año no bisiesto), pida al usuario que le indique un mes (1=enero, 12=diciembre) y muestre en pantalla el número de días que tiene ese mes.

4.1.3. Recorriendo los elementos de una tabla

Es de esperar que exista una forma más cómoda de acceder a varios elementos de un array, sin tener siempre que repetirlos todos, como hemos hecho en

suma = numeros[0] + numeros[1] + numeros[2] + numeros[3] + numeros[4];

El "truco" consistirá en emplear cualquiera de las estructuras repetitivas que ya hemos visto (while, do..while, for), por ejemplo así:

    suma = 0;                  // Valor inicial de la suma: 0
    for (int i=0; i<=4; i++)   // Y calculamos la suma repetitiva
        suma += numeros[i];
 

El fuente completo podría ser así:

// Ejemplo_04_01_03a.cs
// Tercer ejemplo de tablas: valores iniciales con llaves
// y recorrido con "for"
// Introducción a C#, por Nacho Cabanes
 
using System;
 
public class Ejemplo_04_01_03a
{
    public static void Main()
    {
        int[] numeros =            // Un array de 5 números enteros
            {200, 150, 100, -50, 300};
        int suma;                  // Un entero que será su suma
 
        suma = 0;                  // Valor inicial de la suma: 0
        for (int i=0; i<=4; i++)   // Y calculamos la suma repetitiva
            suma += numeros[i];
 
        Console.WriteLine("Su suma es {0}", suma);
    }
}
 

En este caso, que sólo sumábamos 5 números, no hemos escrito mucho menos, pero si trabajásemos con 100, 500 o 1000 números, la ganancia en comodidad sí que sería evidente.

Lógicamente, también podemos pedir los datos al usuario de forma repetitiva, usando un "for", "while" o "do..while":

// Ejemplo_04_01_03b.cs
// Cuarto ejemplo de tablas: introducir datos repetitvos
// Introducción a C#, por Nacho Cabanes
 
using System;
 
public class Ejemplo_04_01_03b
{
    public static void Main()
    {
 
        int[] numeros = new int[5];
        int suma;
 
        for (int i=0; i<=4; i++)   // Pedimos los datos
        {
            Console.Write("Introduce el dato numero {0}: ", i+1);
            numeros[i] = Convert.ToInt32(Console.ReadLine());
        }
 
        suma = 0;            // Y calculamos la suma
        for (int i=0; i<=4; i++)
            suma += numeros[i];
 
        Console.WriteLine("Su suma es {0}", suma);
    }
}
 

Ejercicios propuestos:

Ejercicio propuesto 4.1.3.1: Crea un programa que pida al usuario 6 números enteros cortos y luego los muestre en orden inverso (pista: usa un array para almacenarlos y "for" para mostrarlos).
Ejercicio propuesto 4.1.3.2: Crea un programa que pregunte al usuario cuántos números enteros va a introducir (por ejemplo, 10), le pida todos esos números, los guarde en un array y finalmente calcule y muestre la media de esos números.
Ejercicio propuesto 4.1.3.3: Un programa que pida al usuario 10 reales de doble precisión, calcule su media y luego muestre los que están por encima de la media.
Ejercicio propuesto 4.1.3.4: Un programa que almacene en una tabla el número de días que tiene cada mes (de un año no bisiesto), pida al usuario que le indique un mes (ej. 2 para febrero) y un día (ej. el día 15) y diga qué número de día es dentro del año (por ejemplo, el 15 de febrero sería el día número 46, el 31 de diciembre sería el día 365).
Ejercicio propuesto 4.1.3.5: A partir del ejercicio anterior, crea otro que pida al usuario que le indique la fecha, formada por día (1 al 31) y el mes (1=enero, 12=diciembre), y como respuesta muestre en pantalla el número de días que quedan hasta final de año.
Ejercicio propuesto 4.1.3.6: Un programa que pida 10 nombres y los memorice (pista: esta vez se trata de un array de "string"). Después deberá pedir que se teclee un nombre y dirá si se encuentra o no entre los 10 que se han tecleado antes. Volverá a pedir otro nombre y a decir si se encuentra entre ellos, y así sucesivamente hasta que se teclee "fin".
Ejercicio propuesto 4.1.3.7: Un programa que prepare espacio para guardar un máximo de 100 nombres. El usuario deberá ir introduciendo un nombre cada vez, hasta que se pulse Intro sin teclear nada, momento en el que dejarán de pedirse más nombres y se mostrará en pantalla la lista de los nombres que se han introducido.
Ejercicio propuesto 4.1.3.8: Un programa que reserve espacio para un vector de 3 componentes, pida al usuario valores para dichas componentes (por ejemplo [2, -5, 7]) y muestre su módulo (raíz cuadrada de la suma de sus componentes al cuadrado).
Ejercicio propuesto 4.1.3.9: Un programa que reserve espacio para dos vectores de 3 componentes, pida al usuario sus valores y calcule la suma de ambos vectores (su primera componente será x1+y1, la segunda será x2+y2 y así sucesivamente).
Ejercicio propuesto 4.1.3.10: Un programa que reserve espacio para dos vectores de 3 componentes, pida al usuario sus valores y calcule su producto escalar (x1?y1+ x2?y2+x3?y3).
Ejercicio propuesto 4.1.3.11: Un programa que pida al usuario 4 números enteros y calcule (y muestre) cuál es el mayor de ellos. Nota: para calcular el mayor valor de un array, hay que comparar cada uno de los valores que tiene almacenados el array con el que hasta ese momento es el máximo provisional. El valor inicial de este máximo provisional no debería ser cero (porque el resultado sería incorrecto si todos los números son negativos), sino el primer elemento del array.

Actualizado el: 25-11-2014 10:47

AnteriorPosterior