"Soy presidente de la República Islámica de Irán... irán y no volverán... es que si no lo digo reviento. Jeje" - Joaquín Reyes de Ahmadineyad
Estructuras de datos
Bueno, ahora vamos a dejar un poco las instrucciones a la máquina para ver cómo podemos organizar los datos con los que vamos a trabajar. Hasta ahora sólo hemos visto una forma, con variables. En esta lección intentaré que comprendáis dos más: los vectores (o arrays como los llaman los yankis) y los structs (que no sé como demonios se llama en cristiano).
Un vector es una variable múltiple de un tipo determinado. Si recordáis la metáfora que usamos para describir una variable (el cajón), un vector es como un armario con varios cajones seguidos del mismo tipo. Veamos un ejemplo:
Código: Seleccionar todo
#include <stdio.h>
int main(int argc, char* argv[])
{
int i, j = 0, k = 0;
// Dos vectores de 10 enteros cada uno
int pares[10];
int impares[10];
// Recorremos los números desde el 1 hasta el 20 (ambos inclusive)
for (i=1; i<=20; i++)
// Si el número es par
if(i%2 == 0)
// Lo metemos en el vector de pares, en la posición j y avanzamos a la siguiente posición del vector
pares[j++] = i;
else
// Si no, lo metemos en el vector de impares, en la posición k y avanzamos a la siguiente posición del vector
impares[k++] = i;
// Imprimimos el vector de pares
for (i=0; i<10; i++)
printf("%d ", pares[i]);
printf("\n");
// Imprimimos el vector de impares
for (i=0; i<10; i++)
printf("%d ", impares[i]);
printf("\n");
return 0;
}
Un cosa muy importante a tener en cuenta para los vectores es que siempre empiezan por 0, es decir, el primer elemento de un vector ejemplo[100] es ejemplo[0] y el último es ejemplo[99] (lo que hace 100 elementos). Ahora veréis también que los famosos char[] son efectivamente vectores de caracteres
Pasando al tema de los structs, se podría decir que son muy parecidos a los vectores, salvo que esta vez los elementos pueden ser de distinto tipo, y no se accede a ellos por índice (usando [n]), sino por nombre. Veamos un ejemplo:
Código: Seleccionar todo
#include <stdio.h>
#include <string.h>
// Defino una estructura del tipo tPersonaje
struct tPersonaje
{
char nombre[80];
unsigned int level;
int hp;
unsigned int mp;
unsigned int xp;
};
int main(int argc, char* argv[])
{
// Declaro una variable del tipo tPersonaje definida más arriba
struct tPersonaje personaje;
// Para acceder a los registros de la estructura, se usa el .
personaje.level = 40000;
personaje.hp = 32520;
personaje.mp = 32520;
personaje.xp = 45500;
// Para copiar una cadena de caracteres en otra, se usa strcpy (ojo con los tamaños)
// Aquí copio "m0skit0" a personaje.nombre
strcpy(personaje.nombre, "m0skit0");
// Imprimimos el personaje
printf("Personaje principal:\n");
printf("Nombre: %s\n", personaje.nombre);
printf("Nivel: %d\n", personaje.level);
printf("Puntos de experiencia: %d\n", personaje.xp);
printf("Vida: %d\n", personaje.hp);
printf("Magia: %d\n", personaje.mp);
return 0;
}
Como veis, primero hemos creado un nuevo tipo de datos, en este caso tPersonaje. Ahora podemos declarar variables que sean de este tipo, igual que hacemos con int o char* . Creamos una variable personaje con el tipo tPersonaje y le vamos asignando los valores. No importa que la definición del struct esté dentro o fuera de main(), aunque generalmente se prefiere fuera, por razones que entenderéis más adelante cuando hablemos de funciones y del alcance de las declaraciones.
Espero os haya quedado claro, si no, ya sabéis, a preguntar
Y para los que no tengáis ninguna duda, a ver estos retos:
- Optimizar el ejemplo dado sobre vectores.
- Dado un vector de 50 números enteros, obtener el mayor, el menor, la media y la moda (el número que más veces se repite). Obtener también en qué posición se hayan los cuatro
- Dado el mismo vector que el reto anterior, ordenarlo de menor a mayor y de mayor a menor.
- Crear un programa que implemente una agenda telefónica con un máximo de 20 entradas, siendo cada entrada el nombre, el número de teléfono y las veces que se ha accedido a dicha entrada. Se debe permitir al usuario introducir una nueva entrada (en caso de que queden entradas vacías disponibles), modificar una entrada y borrar una entrada existente.
¡Suerte!
Descarga en PDF (cortesía de Dark Pallacus)
<< Anterior Siguiente >>