Necesitas almacenar mil números enteros. ¿Realmente desea declarar int a, b, c... hasta z y luego continuar? No. Eso es tedioso y propenso a errores. En su lugar, utiliza una matriz.
Una matriz es una colección de valores del mismo tipo. Los empaqueta en un solo bloque de memoria. En C, lo declaras así:
int un[5];
Eso es todo. Cinco números enteros. Listo para partir.
Por qué las matrices C comienzan en cero
Aquí está el truco que hace tropezar a los principiantes. Las matrices C tienen indexación cero.
Si declaras int a[5], tienes cinco espacios. Pero están numerados 0, 1, 2, 3 y 4. No hay “a [5]”. Si intentas acceder a a[5], estás leyendo memoria que no pertenece a tu matriz. C no te detendrá. Simplemente te dará basura o fallará. Esta es una característica, no un error. Es rápido. También es peligroso.
Se accede a los elementos mediante corchetes. a[0] es el primer elemento. a[4] es el último.
Generando números aleatorios en C
Construyamos algo útil. Crearemos un programa que genere 10 números aleatorios y los ordene.
Primero, necesitas los números. La biblioteca estándar de C tiene rand(), pero veamos una implementación clásica para comprender la mecánica. Este código utiliza un generador congruente lineal, un método del libro K&R C.
Observe la línea #define MAX 10. Esto crea una constante. Las constantes se escriben en mayúsculas por convención. Los hace destacar. Declaras la matriz int a[MAX] fuera de la función main. Esto la convierte en una variable global. Existe en todas partes del programa.
La variable rand_seed también es global. Comienza en 10. Debido a que la semilla es fija, los números “aleatorios” son en realidad los mismos cada vez que ejecuta el programa. Si desea una verdadera aleatoriedad, la sembraría con la hora del sistema. Por ahora, la coherencia es buena para la depuración.
Comprender la clasificación de burbujas
Ahora viene la parte difícil. Clasificación.
Usaremos clasificación por burbujas. Es el algoritmo de clasificación más simple. También es el más lento. Pero te enseña cómo interactúan los bucles y las matrices.
Agregue este código a su función principal, reemplazando el comentario sobre “más cosas”:
¿Qué está pasando aquí?
El bucle exterior ejecuta MAX-1 veces. El bucle interior se ejecuta menos veces en cada pasada. ¿Por qué? Porque los números más grandes “burbujean” hasta el final de la matriz con cada pasada. No es necesario que los revises nuevamente.
Dentro del bucle interno, comparamos a[y] con a[y+1]. Si el izquierdo es más grande, los intercambiamos. Usamos una variable temporal t para mantener el valor mientras movemos las piezas.
“La única manera fácil de comprender realmente lo que hace este código es ejecutarlo a mano”.
Toma un trozo de papel. Dibuja cinco cajas. Pon números en ellos. Ejecute el código línea por línea. Mueve los números. Verás que los números grandes se hunden hasta el fondo. Los pequeños flotan. Es visual. Es mecánico.
Errores comunes en matrices C
C no te toma la mano. Te caerás del borde.
- Sin verificación de rango. Si accede a
a[10]en una matriz de tamaño 10, C no gritará. Leerá cualquier memoria que esté a continuación. Esto genera errores sutiles que son difíciles de encontrar. - Las llamadas a funciones necesitan paréntesis. Debes escribir
x = rand();. Si escribex = rand;, está asignando la dirección de memoria de la función ax. No el resultado. Se compila. Se rompe.
Prueba esto
No te limites a leer. Código.
- Cambie el bucle que llena la matriz a una sola línea. ¿Puedes hacerlo?
- Mueva la lógica de clasificación de burbujas a su propia función. Llámelo
void bubble_sort(). Mueva las variablesx,yytdentro de esa función. Se vuelven locales. La matrizaes global, por lo que no es necesario pasarla. - Cambie
rand_seeda valores diferentes. Observe el cambio de salida.
Las matrices son fundamentales. Son los componentes básicos de las estructuras de datos. Domínelos y el resto de C se volverá más claro. Ignore el índice cero y pasará horas depurando un fallo que ocurrió hace tres pasos.






























