Ejercicio PHP: Grupos aleatorios de alumnos.

Pensemos en el siguiente caso:

Una sección tiene 29 alumnos, los cuales se clasifican en tres grupos: programadores, diseñadores gráficos y alumnos con experiencia en networking, se desea formar grupos multidisciplinarios, que deben estar formados por un alumno de cada categoría, y debe ser formado aleatóriamente.

Lo primero que podría venir a la mente es tener 10 grupos, 9 con tres miembros de cada categoría y 1 de dos miembros que no tendrían roles específicos, pero aquí surge un inconveniente, las categorías no tienen el mismo numero de alumnos, son 8 programadores, 16 diseñadores gráficos y 5 que se dedicaran a networking, tal como se puede ver en estos archivos de texto respectivamente: programacion, diseno y networking.

Una solución a este caso podría ser la siguiente:

Revisar cuantos grupos como máximo, tendrán miembros multidisciplinarios, en este caso seria de acuerdo a la categoría que tiene menos integrantes. Luego de acuerdo al numero máximo de grupos que tendrán sus miembros completos, sacar aleatóriamente miembros de cada categoría hasta completar los grupos que si tendrán roles específicos.

Al resto que no están incluidos en los grupos con roles específicos, se les debe tratar por igual, formando así grupos sin roles específicos, teniendo como grupo final a uno conformado por dos alumnos.

Por lo tanto, plasmando la solución a este caso, tendríamos 5 grupos con roles definidos, 4 grupos sin roles definidos y 1 grupo de dos miembros, también sin roles definidos.

Un script de la solución planteada es el siguiente:

<?php
//fuente de datos, lista de alumnos que estan en la particion /home
$grupo_1 = file(«programacion»);
$grupo_2 = file(«diseno»);
$grupo_3 = file(«networking»);

//cantidad de elementos
$num_grupo_1 = count($grupo_1); $num_grupo_2 = count($grupo_2);
$num_grupo_3 = count($grupo_3);
$total_alumnos = $num_grupo_1+$num_grupo_2+$num_grupo_3;

//impresion de listas iniciales y la cantidad de sus elementos
print «Listas Iniciales – $total_alumnos alumnos<table border=’1′>»;
print «<tr><th>Programacion – $num_grupo_1 alumnos</th></tr>»;
foreach ($grupo_1 as $valor){ print «<tr><td>$valor</td></tr>»; }
print «<tr><th>Diseno – $num_grupo_2 alumnos</th></tr>»;
foreach ($grupo_2 as $valor){ print «<tr><td>$valor</td></tr>»; }
print «<tr><th>Networking – $num_grupo_3 alumnos</th></tr>»;
foreach ($grupo_3 as $valor){ print «<tr><td>$valor</td></tr>»; }
print «</table>»;

//define el numero de grupos disponibles
$numero_grupos = $num_grupo_1;
if ($numero_grupos>=$num_grupo_2){ $numero_grupos = $num_grupo_2; }
if ($numero_grupos >= $num_grupo_3){ $numero_grupos = $num_grupo_3; }
print «El numero de grupos con integrantes con roles exactos es $numero_grupos<br/>»;

//tablas ordenadas aleatoriamente con integrantes exactos
print «Grupos ordenados aleatoriamente, los integrantes tienen un rol especifico»;
print «<table border=’1′>»;
print «<tr><th>#</th><th>Programacion</th><th>Diseno</th><th>Networking</th></tr>»;
$numero = $numero_grupos;
for ($i=$numero; $i>0; $i–){
$elemento = $numero-$i+1;
print «<tr>»;
print «<td>$elemento</td>»;
$claves_a = array_rand($grupo_1); print «<td>$grupo_1[$claves_a]</td>»; unset ($grupo_1[$claves_a]);
$claves_b = array_rand($grupo_2); print «<td>$grupo_2[$claves_b]</td>»; unset ($grupo_2[$claves_b]);
$claves_c = array_rand($grupo_3); print «<td>$grupo_3[$claves_c]</td>»; unset ($grupo_3[$claves_c]);
print «</tr>»;
}
print «</table>»;
//almacenamiento de los restantes en un nuevo arreglo
$restantes = array();
foreach ($grupo_1 as $valor){ $restantes[]=$valor; }
foreach ($grupo_2 as $valor){ $restantes[]=$valor; }
foreach ($grupo_3 as $valor){ $restantes[]=$valor; }

//impresion de grupos de alumnos restantes
print «Grupos ordenados aleatoriamente, no tienen roles especificos»;
print «<table border=’1′><tr>»;
$contador_cada_3 = 0; $num_grupo_r = count($restantes);
$numero_grupos++;
print «<td>$numero_grupos</td>»;
for ($i=$num_grupo_r; $i>0 ; $i–){
$claves_r = array_rand($restantes);
print «<td>$restantes[$claves_r]</td>»; unset ($restantes[$claves_r]);
++$contador_cada_3;
//$restantes debe tener elementos y se agrupan cada 4 alumnos.
if ($contador_cada_3==3 && count($restantes)){
$contador_cada_3 = 0;
print «</tr><tr>»; $numero_grupos++; print ‘<td>’.$numero_grupos.'</td>’;
}
}
print «</tr></table>»;

?>

Por la rapidez con que desarrollé el script (menos de 30 min) he omitido algunos detalles, que podrían hacer al resultado mas vistoso y ordenado. Me he enfocado en el resultado y en el buen funcionamiento del script.

Aquí esta el resultado

Espero haber sido explicativo con los comentarios en el código del programa en PHP, si existe alguna parte que no se entiende, coméntenla y con gusto les explicaré lo que hice. Por otro lado también pueden contribuir a mejorar la solución, todo proceso o solución se puede mejorar.

happy PHP coding 🙂

Anuncio publicitario

Publicado por Sergio Infante

Software Developer

Un comentario en “Ejercicio PHP: Grupos aleatorios de alumnos.

  1. Hola profesor… podria colgar el scrip para subir una imagen y mostrarlo. una duda como aria para implementar en my web site que solo se pueda ver en la url el index.php por mas que abra otras paginas y no las paginas a las que ingreso como ingresarcliente.php

    Me gusta

Deja una respuesta

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Salir /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

A %d blogueros les gusta esto: