01/06/2015, 15:27
|
| | | Fecha de Ingreso: febrero-2015
Mensajes: 33
Antigüedad: 9 años, 10 meses Puntos: 2 | |
problema con ruleta rusa con TAD colas en C Tengo un problema con mi programa, dice asi: Cita: Se tiene el siguiente "juego" de suicidios en mesa: n personas, numeradas de 1 a n, están sentadas en circulo. Empezando por la persona 1, se pasa un revolver. Despues de m pasadas, la persona que tiene el arma se suicida, se quita el cuerpo y el juego continua con la persona que estaba despues del muerto. El ultimo sobreviviente queda despues de n-1 disparos. Asi, si m=0 y n=5, los jugadores son muertos en orden y el jugador 5 sobrevive. si m=1 y n=5, el orden de las muertes es 2, 4, 1, 5. Hacer un programa que resuelva este juego para valores generales de m y n El problema que tengo es en la función "llenarMuertes", el programa se cicla y no veo el problema.
Mi programa esta asi:
archivo: cola.h
Código:
#include <stdio.h>
#include <stdlib.h>
#define TAM 100
#define TRUE 1
#define FALSE 0
typedef int tipo_dato;
#ifndef _cola_
#define _cola_
typedef struct{
tipo_dato cola[TAM];
int ultimo, primero;
int tamano;
} COLA;
typedef COLA *cola;
cola crearCola();
void encolar(cola c, tipo_dato elemento);
tipo_dato desencolar(cola c);
int esVacia(cola c);
tipo_dato primero(cola c);
#endif
archivo: cola.c
Código:
#include "cola.h"
int pedirFrecuencia(int personas){
int fr;
printf("Ingrese la frecuencia de muertes: ");
scanf("%d",&fr);
while(fr>personas){
fr=fr-personas;
}
return fr;
}
void llenarVivos(cola v, int p){
int i;
printf("Jugadores: ");
for(i=0; i<p; i++){
encolar( v, i+1 );
printf("%d ", i+1);
}
printf("\n");
}
void llenarMuertos(cola v, cola m, int fr, int par){
int i = 0;
int p;
while(v->tamano != 1){
if(i>fr){
i = i-fr;
}
if(i==fr){
encolar(m, desencolar(v));
printf("%d Murio! :( \n", i);
i=0;
} else {
encolar(v, desencolar(v));
printf("%d No murio! \n", i);
i++;
}
printf("\n%d",v->tamano);
}
}
void mostrarColas(cola v, cola m){
while(esVacia(v) != TRUE){
printf("\n\nGanador: %d", desencolar(v));
}
printf("\n\nMuertes: ");
while(esVacia(m) != TRUE){
printf(" %d", desencolar(m));
}
printf("\n");
}
int pedirPersonas(){
int tamano;
printf("Ingrese el numero de participantes:");
scanf("%d",&tamano);
return tamano;
}
cola crearCola(){
cola c = (cola)malloc(sizeof(COLA));
if(c==NULL) error(3);
c->ultimo = 0;
c->primero = 0;
c->tamano = 0;
return c;
}
void encolar(cola c, tipo_dato elemento){
if(c->tamano == TAM){
error(2);
}
else{
c->cola[c->ultimo] = elemento;
c->ultimo = sig(c->ultimo);
c->tamano = c->tamano+1;
//printf("encolo: %c", elemento);
}
}
tipo_dato desencolar(cola c){
if(c->tamano == 0){
error(1);
}
else{
tipo_dato e = c->cola[c->primero];
c->primero = sig(c->primero);
c->tamano = c->tamano-1;
return e;
}
}
int esVacia(cola c){
if(c->tamano == 0){
return TRUE;
}else{
return FALSE;
}
}
tipo_dato primero(cola c){
if(c->tamano = 0){
error(1);
}
else{
tipo_dato e=c->cola[c->primero];
return e;
}
}
int sig(int i){
int s = (i+1)%TAM;
return s;
}
int error(int id){
switch(id){
case 1: printf("\nLa cola esta vacia");
break;
case 2: printf("\nLa cola esta llena");
break;
case 3: printf("\nNo hay memoria suficiente");
break;
case 4: printf("\nEse genero no existe!");
break;
}
}
archivo: main.c
Código:
#include "cola.c"
int main(){
cola vivos, muertos;
vivos = muertos = crearCola();
int participantes = pedirPersonas();
//Hay n-1 disparos
int frecuencia = pedirFrecuencia(participantes); //0: todos; 1: uno si y uno no; 2: uno si, dos no; (...)
printf("fr: %d", frecuencia);
llenarVivos(vivos, participantes);
llenarMuertos(vivos, muertos, frecuencia, participantes);
mostrarColas(vivos, muertos);
return 0;
}
|