Foros del Web » Programando para Internet » PHP »

resultados segun porcentajes

Estas en el tema de resultados segun porcentajes en el foro de PHP en Foros del Web. hola gente, toy haciendo un sistema para simular unas elecciones, es decir la gente vota a uno de cada partido y listo, tengo todo montado ...

  #1 (permalink)  
Antiguo 30/06/2011, 13:00
Avatar de rompeguesos  
Fecha de Ingreso: marzo-2009
Mensajes: 692
Antigüedad: 15 años, 1 mes
Puntos: 8
Información resultados segun porcentajes

hola gente, toy haciendo un sistema para simular unas elecciones, es decir la gente vota a uno de cada partido y listo, tengo todo montado perfectamente lo unico en lo que estoy estancado es en la cuenta final, es decir cuando toca mostrar los resultados finales y no se como hacerlo...

Mirad tienen que salir 21 personas de todas las votaciones de la gente, por ejemplo:

Partido a= 300 votos
Partido b= 250 votos
Partido c= 200 votos
Partido d= 150 votos

o los partidos que hubieran..

¿Como hago que me de el resultado de los 21 huecos segun los votos? por ejemplo:

Partido a= 7 personas
Partido b= 6 personas
Partido c= 5 personas
Partido d= 3 personas

:D Espero me entendais.. :D
  #2 (permalink)  
Antiguo 30/06/2011, 13:41
Avatar de rompeguesos  
Fecha de Ingreso: marzo-2009
Mensajes: 692
Antigüedad: 15 años, 1 mes
Puntos: 8
Respuesta: resultados segun porcentajes

Haber... os adelanto lo que acabo de conseguir... acabo de conseguir esto:

Código PHP:
<?php
$a 
300;
$b 250;
$c 150;

$pa = ($a 21) / ($a $b $c);
$pb = ($b 21) / ($a $b $c);
$pc = ($c 21) / ($a $b $c);

echo 
$pa." <br> ".$pb." <br> ".$pc;

?>
me da bien el resultado total es 21 pero el problema es que sale tambien con decimales, como evito que salga con decimales y siga dando 21?
  #3 (permalink)  
Antiguo 30/06/2011, 13:46
Avatar de Sourcegeek
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: $mex['B.C.'];
Mensajes: 1.816
Antigüedad: 14 años, 11 meses
Puntos: 322
Respuesta: resultados segun porcentajes

Puedes utilizar round() para que el numero se redondee

Saludos!
__________________
Buscas desarrollador web? Sourcegeek. Diseño web, Maquetación y Programación
¡Escribe bien! Esto es un foro, no un Facebook para que escribas con los pies
  #4 (permalink)  
Antiguo 30/06/2011, 13:47
Avatar de rompeguesos  
Fecha de Ingreso: marzo-2009
Mensajes: 692
Antigüedad: 15 años, 1 mes
Puntos: 8
Respuesta: resultados segun porcentajes

lo acabo de hacer pero se redondean como le da la gana... :D usando roun en esa cuenta que indico me da 22 :D como lo hago?
  #5 (permalink)  
Antiguo 30/06/2011, 13:48
 
Fecha de Ingreso: abril-2011
Mensajes: 1.342
Antigüedad: 13 años
Puntos: 344
Respuesta: resultados segun porcentajes

¿Qué método electoral estás simulando? Hay muchos, por ejemplo, en España se usa el método d'Hont.
  #6 (permalink)  
Antiguo 30/06/2011, 13:49
Avatar de rompeguesos  
Fecha de Ingreso: marzo-2009
Mensajes: 692
Antigüedad: 15 años, 1 mes
Puntos: 8
Respuesta: resultados segun porcentajes

pues si es uno de un pueblo de españa :D en el que hay 21 concejal en el ayuntamiento
  #7 (permalink)  
Antiguo 30/06/2011, 13:52
Avatar de Sourcegeek
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: $mex['B.C.'];
Mensajes: 1.816
Antigüedad: 14 años, 11 meses
Puntos: 322
Respuesta: resultados segun porcentajes

Ah, quieres que redondee hacia abajo?
Entonces usa floor()

Saludos!
__________________
Buscas desarrollador web? Sourcegeek. Diseño web, Maquetación y Programación
¡Escribe bien! Esto es un foro, no un Facebook para que escribas con los pies
  #8 (permalink)  
Antiguo 30/06/2011, 13:55
Avatar de rompeguesos  
Fecha de Ingreso: marzo-2009
Mensajes: 692
Antigüedad: 15 años, 1 mes
Puntos: 8
Respuesta: resultados segun porcentajes

o yo soy el tio mas tonto del planeta o ami como lo hago no me da... :D

Código PHP:
<?php
$a 
300;
$b 250;
$c 150;

$pa floor(($a 21) / ($a $b $c));
$pb floor(($b 21) / ($a $b $c));
$pc floor(($c 21) / ($a $b $c));

echo 
$pa." <br> ".$pb." <br> ".$pc;

?>
me da 9,7,4 total 20... :( :D
  #9 (permalink)  
Antiguo 30/06/2011, 14:06
Avatar de Sourcegeek
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: $mex['B.C.'];
Mensajes: 1.816
Antigüedad: 14 años, 11 meses
Puntos: 322
Respuesta: resultados segun porcentajes

Decías que el resultado total da 21 pero con decimales, tu pregunta fue como hacerle que simplemente salga 21.
El floor lo tienes que poner en el resultado total para que te lo redondee hacia abajo y salga 21 cerrados.

Saludos!
__________________
Buscas desarrollador web? Sourcegeek. Diseño web, Maquetación y Programación
¡Escribe bien! Esto es un foro, no un Facebook para que escribas con los pies
  #10 (permalink)  
Antiguo 30/06/2011, 14:37
Avatar de rompeguesos  
Fecha de Ingreso: marzo-2009
Mensajes: 692
Antigüedad: 15 años, 1 mes
Puntos: 8
Respuesta: resultados segun porcentajes

si pero el resultado que la lo saco yo de los resultados obtenidos ;) 9+7.5+4.5= 21 ;)
  #11 (permalink)  
Antiguo 30/06/2011, 14:37
 
Fecha de Ingreso: abril-2011
Mensajes: 1.342
Antigüedad: 13 años
Puntos: 344
Respuesta: resultados segun porcentajes

[EDITO]

El método d'Hondt:

Código PHP:
Ver original
  1. $concejales = array("Partido1" => 0,"Partido2" => 0,"Partido3" => 0);
  2. $votos = array("Partido1" => 30000,"Partido2" => 20000, "Partido3" => 10000);
  3. $votos_parciales= $votos;
  4. $numero_conc = 21;
  5. $mayor = "Partido1";
  6. for($i=0;$i<21;$i++){
  7.  foreach($votos_parciales as $key => $value)
  8.   $mayor = $votos_parciales[$mayor] > $value ? $mayor : $key;
  9.   $concejales[$mayor]++;  
  10.   $votos_parciales[$mayor]=floor($votos[$mayor]/($concejales[$mayor]+1));
  11. }
  12.  
  13.  foreach($concejales as $key => $value)
  14.  {
  15.  echo "El partido ".$key." tiene ".$value." concejales<br />";
  16.  }

No sé si habrá alguna formula directa, pero así funciona.

Última edición por alexg88; 30/06/2011 a las 14:57
  #12 (permalink)  
Antiguo 30/06/2011, 15:00
Avatar de rompeguesos  
Fecha de Ingreso: marzo-2009
Mensajes: 692
Antigüedad: 15 años, 1 mes
Puntos: 8
Respuesta: resultados segun porcentajes

$mayor se refiere al partido en la alcaldia actualmente no?
  #13 (permalink)  
Antiguo 30/06/2011, 15:09
 
Fecha de Ingreso: abril-2011
Mensajes: 1.342
Antigüedad: 13 años
Puntos: 344
Respuesta: resultados segun porcentajes

No, $mayor puede ser cualquier de los partidos, es para inicializar la variable.

Hay un pequeño fallo, que en vez de poner 21 en el bucle for, tiene que ser $numero_conc
  #14 (permalink)  
Antiguo 30/06/2011, 15:22
Avatar de rompeguesos  
Fecha de Ingreso: marzo-2009
Mensajes: 692
Antigüedad: 15 años, 1 mes
Puntos: 8
Respuesta: resultados segun porcentajes

vale lo acabo de modificar.. y parece que va correctamente y ahora una ultima duda... :P como se meten los datos de modo dinamico? hago la consulta pero no se como meterla en el array
  #15 (permalink)  
Antiguo 30/06/2011, 15:30
 
Fecha de Ingreso: abril-2011
Mensajes: 1.342
Antigüedad: 13 años
Puntos: 344
Respuesta: resultados segun porcentajes

Pongo otro método que también funciona y lo hace mediante una serie de formulas que he encontrado en esta página de Wikipedia: http://es.wikipedia.org/wiki/M%C3%A9...el_resto_mayor

Código PHP:
Ver original
  1. $votos = array("Partido1" => 30000,"Partido2" => 20000, "Partido3" => 10000);
  2.  $numero_conc = 23;
  3.  $escaños = array();
  4.  $restos = array();
  5.  $total_escaños = 0;
  6.  $cociente = round(array_sum($votos)/$numero_conc);
  7.  foreach($votos as $key => $value){
  8.   $escaños[$key] = floor($value/$cociente);
  9.   $restos[$key] = $value - $cociente*$escaños[$key];
  10.  $total_escaños += $escaños[$key];
  11.  }
  12.   arsort($restos);
  13.  
  14.  $restos = array_slice($restos,0,$numero_conc-$total_escaños);
  15.  
  16.  foreach($restos as $key => $value){  
  17.    $escaños[$key]++;
  18.  }
  19.  
  20.  foreach($escaños as $key => $value)
  21.  {
  22.  echo "El partido ".$key." tiene ".$value." concejales<br />";
  23.  }

Lo de como meter los datos, depende de como tengas hecho el formulario.
  #16 (permalink)  
Antiguo 30/06/2011, 15:33
Avatar de rompeguesos  
Fecha de Ingreso: marzo-2009
Mensajes: 692
Antigüedad: 15 años, 1 mes
Puntos: 8
Respuesta: resultados segun porcentajes

no, los datos estan en base de datos ya, tanto el nombre de los partidos como los votos recibidos :D
  #17 (permalink)  
Antiguo 30/06/2011, 15:37
 
Fecha de Ingreso: abril-2011
Mensajes: 1.342
Antigüedad: 13 años
Puntos: 344
Respuesta: resultados segun porcentajes

Pues entonces es casi trivial.

Supongamos que tienes una tabla votos con los campos nombre_partido y n_votos:

Código PHP:
Ver original
  1. $query = "SELECT * FROM votos";
  2. $resultado = mysql_query($query);
  3.  
  4. while ($fila = mysql_fetch_assoc($result)){
  5. $votos[$result['nombre_partido']] = $result['votos']
  6. }
  #18 (permalink)  
Antiguo 30/06/2011, 15:58
Avatar de rompeguesos  
Fecha de Ingreso: marzo-2009
Mensajes: 692
Antigüedad: 15 años, 1 mes
Puntos: 8
Respuesta: resultados segun porcentajes

es correcto asi?

Código PHP:
<?php

  $documentroot
=$_SERVER['DOCUMENT_ROOT'];
  require(
"".$documentroot."/includes/seguridad.php");
  
conectar_base_datos();
  
$query "SELECT * FROM partidospoliticos";
$result mysql_query($query);
 
while (
$fila mysql_fetch_assoc($result)){
$votos[$result['nombre_partido']] = $result['n_votos'];

$numero_conc 21;
 
$escaños = array();
 
$restos = array();
 
$total_escaños 0;
 
$cociente round(array_sum($votos)/$numero_conc);
 foreach(
$votos as $key => $value){
  
$escaños[$key] = floor($value/$cociente);
  
$restos[$key] = $value $cociente*$escaños[$key];
 
$total_escaños += $escaños[$key];
 }
  
arsort($restos); 
 
 
$restos array_slice($restos,0,$numero_conc-$total_escaños);
 
 foreach(
$restos as $key => $value){   
   
$escaños[$key]++;
 }
 
 foreach(
$escaños as $key => $value)
 {
 echo 
"El partido ".$key." tiene ".$value." concejales<br />";
 }

}
esque dice... Warning: Division by zero in D:... on line 21
El partido tiene 1 concejales

por 5 veces :D
  #19 (permalink)  
Antiguo 30/06/2011, 16:05
 
Fecha de Ingreso: abril-2011
Mensajes: 1.342
Antigüedad: 13 años
Puntos: 344
Respuesta: resultados segun porcentajes

¿Has cambiado el nombre de tus campos por los que había puesto yo? Porque siguen teniendo el mismo nombre: $votos[$result['nombre_partido']] = $result['n_votos']; .

Ahí tienes que poner los campos correspondientes de tu tabla.

Si no es por eso, dime en que línea te da el error (pero dime la línea escrita, no el número porque puede cambiar).
  #20 (permalink)  
Antiguo 30/06/2011, 16:08
Avatar de rompeguesos  
Fecha de Ingreso: marzo-2009
Mensajes: 692
Antigüedad: 15 años, 1 mes
Puntos: 8
Respuesta: resultados segun porcentajes

si lo tengo cambiado pero sigue dando el mismo error la linea es esta:

$escaños[$key] = floor($value/$cociente);

por cierto los campos de mi tabla son: nombrepartidopolitico y n_votos ;) lo tengo asi bien puesto en el codigo aunque en el expuesto no aparezca ;)
  #21 (permalink)  
Antiguo 30/06/2011, 16:13
 
Fecha de Ingreso: abril-2011
Mensajes: 1.342
Antigüedad: 13 años
Puntos: 344
Respuesta: resultados segun porcentajes

Pon var_dump($votos) antes de la secuencia que da error y dime que te devuelve exactamente.
  #22 (permalink)  
Antiguo 30/06/2011, 16:16
Avatar de rompeguesos  
Fecha de Ingreso: marzo-2009
Mensajes: 692
Antigüedad: 15 años, 1 mes
Puntos: 8
Respuesta: resultados segun porcentajes

esto : array(1) { [""]=> NULL }
  #23 (permalink)  
Antiguo 30/06/2011, 16:19
 
Fecha de Ingreso: abril-2011
Mensajes: 1.342
Antigüedad: 13 años
Puntos: 344
Respuesta: resultados segun porcentajes

Menudo fallo he tenido. En la sentencia donde rellenas el array de votos es con la variable $fila, no con $result

Código PHP:
Ver original
  1. while ($fila = mysql_fetch_assoc($result)){
  2. $votos[$fila['nombre_partido']] = $fila['n_votos'];
  #24 (permalink)  
Antiguo 30/06/2011, 16:25
Avatar de rompeguesos  
Fecha de Ingreso: marzo-2009
Mensajes: 692
Antigüedad: 15 años, 1 mes
Puntos: 8
Respuesta: resultados segun porcentajes

jajaja tio ahora me sale una locura.. :D muestra ya los nombres de los partidos pero sale una locura :D mira el ejemplo: http://nuevomundo.coriaweb.es/politica/exemple.php
  #25 (permalink)  
Antiguo 30/06/2011, 16:28
 
Fecha de Ingreso: abril-2011
Mensajes: 1.342
Antigüedad: 13 años
Puntos: 344
Respuesta: resultados segun porcentajes

Muestrame ahora el contenido de var_dump($votos)
  #26 (permalink)  
Antiguo 30/06/2011, 16:29
Avatar de rompeguesos  
Fecha de Ingreso: marzo-2009
Mensajes: 692
Antigüedad: 15 años, 1 mes
Puntos: 8
Respuesta: resultados segun porcentajes

mira echale un vistazo al enlace ;)
  #27 (permalink)  
Antiguo 30/06/2011, 16:32
 
Fecha de Ingreso: abril-2011
Mensajes: 1.342
Antigüedad: 13 años
Puntos: 344
Respuesta: resultados segun porcentajes

¿El número de votos lo tienes puesto como string en la base de datos?

Si es así, tendrás que convertirlo a entero al pasarlo al array.
  #28 (permalink)  
Antiguo 30/06/2011, 16:33
Avatar de rompeguesos  
Fecha de Ingreso: marzo-2009
Mensajes: 692
Antigüedad: 15 años, 1 mes
Puntos: 8
Respuesta: resultados segun porcentajes

el campo en la base de datos es int, a eso te refieres?
  #29 (permalink)  
Antiguo 30/06/2011, 16:39
 
Fecha de Ingreso: abril-2011
Mensajes: 1.342
Antigüedad: 13 años
Puntos: 344
Respuesta: resultados segun porcentajes

Pon el código completo para verlo, tal cual.

Lo que habrá que hacer es convertir el valor de los votos de string a entero porque es verdad que devuelve todos los datos como si fuesen cadenas y eso obviamente es el problema.
  #30 (permalink)  
Antiguo 30/06/2011, 16:40
Avatar de rompeguesos  
Fecha de Ingreso: marzo-2009
Mensajes: 692
Antigüedad: 15 años, 1 mes
Puntos: 8
Respuesta: resultados segun porcentajes

mira el enlace que te pase ;) ya sale bien pero el caso es que ya he puesto resultados en la base de datos de los votos estando a 0 sigue saliendo el error de division, este es el codigo:

Código PHP:
<?php

  $documentroot
=$_SERVER['DOCUMENT_ROOT'];
  require(
"".$documentroot."/includes/seguridad.php");
  
conectar_base_datos();
  
$query "SELECT * FROM partidospoliticos";
$result mysql_query($query);
 
while (
$fila mysql_fetch_assoc($result)){
$votos[$fila['nombrepartidopolitico']] = $fila['n_votos'];

$numero_conc 21;
 
$escaños = array();
 
$restos = array();
 
$total_escaños 0;
 
$cociente round(array_sum($votos)/$numero_conc);
 foreach(
$votos as $key => $value){
  
$escaños[$key] = floor($value/$cociente);
  
$restos[$key] = $value $cociente*$escaños[$key];
 
$total_escaños += $escaños[$key];
 }
  
arsort($restos); 
 
 
$restos array_slice($restos,0,$numero_conc-$total_escaños);



foreach(
$restos as $key => $value){   
   
$escaños[$key]++;
 }
 
 foreach(
$escaños as $key => $value)
 {
 echo 
"El partido ".$key." tiene ".$value." concejales<br />";
 }
 
 
?>

Etiquetas: porcentajes, resultados
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:23.