Tutorial de programación en C para Linux parte 27 – Matriz de estructuras
En esta serie de tutoriales de programación en C que estamos llevando a cabo, hemos hablado últimamente de las estructuras. Ya hemos cubierto los fundamentos de las estructuras, cómo se pueden utilizar las estructuras con las funciones, así como el concepto de punteros a estructuras.
Ahora, ampliando el concepto de estructuras, hablaremos de cómo crear una matriz de estructuras con ejemplos fáciles de entender.
Matriz de estructuras en el lenguaje de programación C
Empecemos. Aquí tenemos una estructura sencilla llamada ‘detalles_de_alumno’ que, como puedes ver, se puede utilizar para almacenar el número de la lista y las notas de los alumnos:
struct student_details{
int roll_no;
int marks;
};
Ahora, supongamos que hay 5 estudiantes en total, y el requisito es aceptar la entrada del usuario sobre los detalles de estos estudiantes. Entonces una forma de escribir el código para esto es:
#include <stdio.h>
struct student_details{
int roll_no;
int marks;
};
int main()
{
struct student_details obj1;
struct student_details obj2;
struct student_details obj3;
struct student_details obj4;
struct student_details obj5;
...
...
...
O puede ser algo así:
#include <stdio.h>
struct student_details{
int roll_no;
int marks;
};
int main()
{
struct student_details obj1, obj2, obj3, obj4, obj5;
...
...
...
Ahora bien, no hay ningún problema si sigues los enfoques mencionados. La única preocupación que surge es si estos enfoques son escalables. Es decir, qué pasa si en lugar de 5, necesitas crear, digamos, 50 objetos o instancias. En ese caso, seguir estos enfoques hará definitivamente mucho más compleja la escritura y el mantenimiento del código.
Entonces, ¿hay una solución? Pues sí. Una forma mejor es crear un array de estructura ‘student_details’. He aquí cómo hacerlo:
struct student_details obj[5];
A continuación se muestra un programa completo que utiliza este array de estructura:
#include <stdio.h>
struct student_details{
int roll_no;
int marks;
};
int main()
{
struct student_details obj[5];
int i;
for(i=0;i<5;i++)
{
printf("\n Enter roll number: ");
scanf("%d", &(obj[i].roll_no));
printf("\n Enter marks (out of 100): ");
scanf("%d", &(obj[i].marks));
}
printf("\n Here's the data you've entered::");
for(i=0;i<5;i++)
{
printf("\n Roll number: %d", (obj[i].roll_no));
printf("-- Marks: %d", (obj[i].marks));
}
return 0;
}
Aquí hemos utilizado la estructura ‘detalles_del_alumno’ de la que hemos hablado antes, y hemos creado una matriz de 5 objetos de su tipo. A continuación, el programa pide al usuario que introduzca el número de la lista de alumnos y las notas de uno en uno. La información correspondiente a cada alumno se almacena en cada instancia de la estructura array. Y finalmente, la información almacenada se imprime como salida para el usuario.
Este es el resultado en mi caso:
Enter roll number: 1
Enter marks (out of 100): 67
Enter roll number: 2
Enter marks (out of 100): 73
Enter roll number: 3
Enter marks (out of 100): 56
Enter roll number: 4
Enter marks (out of 100): 52
Enter roll number: 5
Enter marks (out of 100): 85
Here's the data you've entered::
Roll number: 1-- Marks: 67
Roll number: 2-- Marks: 73
Roll number: 3-- Marks: 56
Roll number: 4-- Marks: 52
Roll number: 5-- Marks: 85
Utilizando este enfoque, puedes escalar fácilmente tu programa. Esto significa que, incluso si hay 50 estudiantes cuya información debe almacenarse e imprimirse, sólo tienes que aumentar el tamaño del array a 50, y hacer muy pocos cambios relacionados. El resto del código sigue siendo el mismo. Así que, en pocas palabras, puedes manejar la escalabilidad fácilmente al utilizar arrays en comparación con los enfoques que hemos discutido al principio del tutorial.
Conclusión
En este tutorial, hemos tratado el concepto básico de las matrices de estructuras. Utilizando ejemplos fáciles de entender, hemos discutido por qué es importante una matriz de estructuras, cuándo usarla y cómo usarla. Te aconsejamos que pruebes los ejemplos de este tutorial en tu máquina. Y en caso de cualquier duda o consulta, deja un comentario abajo.