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 o array (que algunos autores traducen por "arreglo") es un conjunto de elementos, todos los cuales son del mismo tipo. Estos elementos tendrán todos el mismo nombre, y ocuparán un espacio contiguo en la memoria.
Por ejemplo, si queremos definir un grupo de números enteros, el tipo de datos que usaremos para declararlo será "int[]". Si sabemos desde el principio cuantos datos tenemos (por ejemplo 4), les reservaremos espacio con "= new int[4]", así
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].
Como ejemplo, vamos a definir un grupo de 5 números enteros y hallar su suma:
/*---------------------------*/ /* Ejemplo en C# nº 33: */ /* ejemplo33.cs */ /* */ /* Primer ejemplo de tablas */ /* */ /* Introduccion a C#, */ /* Nacho Cabanes */ /*---------------------------*/ using System; public class Ejemplo33 { public static void Main() { int[] numero = new int[5]; /* Un array de 5 números enteros */ int suma; /* Un entero que será la suma */ numero[0] = 200; /* Les damos valores */ numero[1] = 150; numero[2] = 100; numero[3] = -50; numero[4] = 300; suma = numero[0] + /* Y hallamos la suma */ numero[1] + numero[2] + numero[3] + numero[4]; Console.WriteLine("Su suma es {0}", suma); /* Nota: esta es la forma más ineficiente e incómoda */ /* Ya lo iremos mejorando */ } }
Ejercicios propuestos:
- Un programa que pida al usuario 4 números, los memorice (utilizando una tabla), calcule su media aritmética y la muestre en pantalla.
- Un programa que pida al usuario 5 números reales y luego los muestre en el orden contrario al que se introdujeron.
- Un programa que pida al usuario 10 números enteros y calcule (y muestre) cuál es el mayor de ellos.
4.1.2. Valor inicial de un array
Al igual que ocurría con las variables "normales", podemos dar valor a los elementos de una tabla al principio del programa. Será más cómodo que dar los valores uno por uno, como hemos hecho antes, pero sólo se podrá hacer si conocemos todos los valores. En este caso, los indicaremos todos entre llaves, separados por comas:
/*---------------------------*/ /* Ejemplo en C# nº 34: */ /* ejemplo34.cs */ /* */ /* Segundo ejemplo de */ /* tablas */ /* */ /* Introduccion a C#, */ /* Nacho Cabanes */ /*---------------------------*/ using System; public class Ejemplo34 { public static void Main() { int[] numero = /* Un array de 5 números enteros */ {200, 150, 100, -50, 300}; int suma; /* Un entero que será la suma */ suma = numero[0] + /* Y hallamos la suma */ numero[1] + numero[2] + numero[3] + numero[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 */ } }
Ejercicio propuesto:
- Un programa almacene en una tabla el número de días que tiene cada mes (supondremos 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.
- Un programa que almacene en una tabla el número de días que tiene cada mes (año no bisiesto), pida al usuario que le indique un mes (ej. 2 para febrero) y un día (ej. El 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).
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 = numero[0] + numero[1] + numero[2] + numero[3] + numero[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 */ for (i=0; i<=4; i++) /* Y hallamos la suma repetitiva */ suma += numero[i];
El fuente completo podría ser así:
/*---------------------------*/ /* Ejemplo en C# nº 35: */ /* ejemplo35.cs */ /* */ /* Tercer ejemplo de */ /* tablas */ /* */ /* Introduccion a C#, */ /* Nacho Cabanes */ /*---------------------------*/ using System; public class Ejemplo35 { public static void Main() { int[] numero = /* Un array de 5 números enteros */ {200, 150, 100, -50, 300}; int suma; /* Un entero que será la suma */ int i; /* Para recorrer los elementos */ suma = 0; /* Valor inicial de la suma */ for (i=0; i<=4; i++) /* Y hallamos la suma repetitiva */ suma += numero[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 está clara.
4.1.4. Datos repetitivos introducidos por el usuario
Si queremos que sea el usuario el que introduzca datos a un array, usaríamos otra estructura repetitiva ("for", por ejemplo) para pedírselos:
/*---------------------------*/ /* Ejemplo en C# nº 36: */ /* ejemplo36.cs */ /* */ /* Cuarto ejemplo de */ /* tablas */ /* */ /* Introduccion a C#, */ /* Nacho Cabanes */ /*---------------------------*/ using System; public class Ejemplo36 { public static void Main() { int[] numero = new int[5]; /* Un array de 5 números enteros */ int suma; /* Un entero que será la suma */ int i; /* Para recorrer los elementos */ for (i=0; i<=4; i++) /* Pedimos los datos */ { Console.Write("Introduce el dato numero {0}: ", i+1); numero[i] = Convert.ToInt32(Console.ReadLine()); } suma = 0; /* Valor inicial de la suma */ for (i=0; i<=4; i++) /* Y hallamos la suma repetitiva */ suma += numero[i]; Console.WriteLine("Su suma es {0}", suma); } }
Ejercicios propuestos:
- A partir del programa propuesto en 4.1.2, que almacenaba en una tabla el número de días que tiene cada mes, crear otro que pida al usuario que le indique la fecha, detallando el día (1 al 31) y el mes (1=enero, 12=diciembre), como respuesta muestre en pantalla el número de días que quedan hasta final de año.
- Crear un programa que pida al usuario 10 números y luego los muestre en orden inverso (del último al primero).
- Crear un programa que pida al usuario 10 números, calcule su media y luego muestre los que están por encima de la media.
- 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".
- Un programa que prepare espacio para 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.