Ver Mensaje Individual
  #1 (permalink)  
Antiguo 01/06/2015, 15:27
Avatar de Alexhg42
Alexhg42
 
Fecha de Ingreso: febrero-2015
Mensajes: 33
Antigüedad: 9 años, 10 meses
Puntos: 2
Pregunta 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;
}