martes, 2 de septiembre de 2008

Clase Bolsa

Con los chicos de 6toB comenzamos a hacer una clase para un tipo abstracto llamado "BolsaSinOrden".

La idea es que sea una bolsa donde se puedan meter "cosas" que no admita repetidos (sin dar un error) y que cuando le "pida uno" me lo de, sin repetir y en un orden aleatorio (y sin fin, o sea que siempre le pueda pedir uno, y cuando me dio todos, vuelva a empezar).

Les dejo la primer version que tiene funcioonalidad para crear la bolsa, meter cosas y pedir cosas. Proximamente agregaremos quitar y otras funcionalidades. Para probarlo, pueden reemplazar el "\n" de los echos por "
" asi se ve lindo en el browser.

Gutes.




<?php

class BolsaSinOrden{
private $elems;
private $tam;
private $devueltos;


function __construct(){
$this->elems = array();
$this->devueltos = array();
$this->tam = 0;
}

/* Inserta un elemento sin repeticion.
* Recorro los elementos hasta ahora,
* si esta, salgo de la funcion
* si no, termina el foreach y lo agrega al
* final del array, solo por comodidad.
*/
public function ponerUno($e){
foreach ($this->elems as $elem){
if ($elem == $e)
return;
}
$this->elems[] = $e; // meto al final
$this->tam++; // se agranda la bolsa
}


/*
* Debe devolver de a uno los elementos de la bolsa,
* el orden debe ser aleatorio y no darme algo dos veces.
* Luego de darme uno, debe volver a ponerlo en la bolsa
* RECORDANDO que me lo devolvio
*/

public function dameUno(){
$aDevolver = rand(0, $this->tam -1);
if (!isset($this->devueltos[$aDevolver])){
$this->devueltos[$aDevolver] = 1;
return $this->elems[$aDevolver];
}else{
if (sizeof($this->devueltos) == $this->tam) {
$this->devueltos = array();
return $this->dameUno(); // podria no llmarse aca! pero lo dejo
}
return $this->dameUno();
}
}

public function imprimirBolsa(){
echo "{";
foreach ($this->elems as $e){
echo $e . " ";
}
echo "}";
}

}


/* PRUEBAS */

$miBolsa = new BolsaSinOrden();

$miBolsa->ponerUno(2);
$miBolsa->ponerUno(112);
$miBolsa->ponerUno(2222);
$miBolsa->ponerUno(2);
$miBolsa->ponerUno(2);
$miBolsa->ponerUno(2);
$miBolsa->ponerUno(2);
$miBolsa->ponerUno(2);
$miBolsa->ponerUno(515152);
$miBolsa->ponerUno(3535);
$miBolsa->ponerUno(2);
$miBolsa->ponerUno(2);

/* hasta aca la bolsa tiene: {2,112,2222,515152,3535}*/
$miBolsa->imprimirBolsa();

/* Obtengo las cosas en forma aleatoria, pero nunca se vacia!!!*/
echo "\n";
echo "me dio:" . $miBolsa->dameUno() ."\n";
echo "me dio:" . $miBolsa->dameUno() ."\n";
echo "me dio:" . $miBolsa->dameUno() ."\n";
echo "me dio:" . $miBolsa->dameUno() ."\n";
echo "me dio:" . $miBolsa->dameUno() ."\n";
echo "me dio:" . $miBolsa->dameUno() ."\n";
echo "me dio:" . $miBolsa->dameUno() ."\n";
echo "me dio:" . $miBolsa->dameUno() ."\n";


?>