Cita:
El problema que tengo es en la función "llenarMuertes", el programa se cicla y no veo el problema.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
Mi programa esta asi:
archivo: cola.h
Código:
archivo: cola.c#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
Código:
archivo: main.c#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; } }
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; }