Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] problema con ruleta rusa con TAD colas en C

Estas en el tema de problema con ruleta rusa con TAD colas en C en el foro de C/C++ en Foros del Web. 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, ...
  #1 (permalink)  
Antiguo 01/06/2015, 15:27
Avatar de Alexhg42  
Fecha de Ingreso: febrero-2015
Mensajes: 33
Antigüedad: 9 años, 2 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;
}
  #2 (permalink)  
Antiguo 01/06/2015, 18:11
Avatar de Alexhg42  
Fecha de Ingreso: febrero-2015
Mensajes: 33
Antigüedad: 9 años, 2 meses
Puntos: 2
Respuesta: problema con ruleta rusa con TAD colas en C

en si el programa estaba bien, el unico problema es que iguale las variables vivos y muertos de forma
vivos = muertos = crearCola();
por lo que la memoria se dirigia entre si y las dos eran la misma variable solo con otro nombre pero representaban lo mismo
  #3 (permalink)  
Antiguo 16/06/2015, 18:17
 
Fecha de Ingreso: enero-2014
Mensajes: 60
Antigüedad: 10 años, 3 meses
Puntos: 1
Sonrisa Respuesta: problema con ruleta rusa con TAD colas en C

hola Alexhg42, estuve viendo el enunciado y me parecio divertido asi que he hecho el programa a mi manera, y es que si entra en una hoja prefiero hacerlo sin funciones innecesarias, siento no haber mirado que es lo que no va en el tuyo, pero por si te sirve algo del mio, te lo envio

Código c:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>//           ruleta rusa
  3.  
  4. typedef struct Nodo { int dato; struct Nodo * sig; } tipoNodo;
  5.  
  6. int main()
  7. {//----------------------------------------------------------- definiciones ---
  8.     int locos, vivos, salto, avanza;
  9.     tipoNodo *lista, *n_anterior, *n_trabajo;
  10. //-------------------------------------------------------- entrada de datos ---
  11.     printf("\nIntroduce el número de participantes\t");
  12.     scanf("%i",&locos);
  13.     printf("\nIntroduce el número de saltos\t");
  14.     scanf("%i",&salto);
  15. //-------------------------------------------------------- inicializaciones ---
  16.     avanza=salto;
  17.     vivos=locos;
  18.     lista=(tipoNodo*)malloc(locos*(sizeof(tipoNodo)));//..........creo el array
  19.     if(!lista){
  20.         printf("\nno hay memoria libre\n");
  21.         return 1;
  22.     }
  23.     n_anterior=lista;
  24.     for(int i=locos-1; 0<=i; i--){//....................... inicializo el array
  25.         lista[i].dato=i+1;
  26.         lista[i].sig=n_anterior;
  27.         n_anterior=&lista[i];
  28.     }
  29.     n_trabajo=lista;
  30.     n_anterior=&lista[locos-1];
  31. //---------------------------------------------------------------- programa ---
  32.     for(int i=1; i<locos; i++){                  //tiene que quedar uno
  33.         if(avanza>=vivos) avanza=salto%vivos;    //cuento sin vuleltas
  34.         for(int j=0; j<avanza; j++){             //paso de uno en uno
  35.             n_anterior=n_trabajo;
  36.             n_trabajo=n_trabajo->sig;
  37.         }
  38.         printf("\nha muerto el loco numero; %i ", n_trabajo->dato);
  39.         n_anterior->sig=n_trabajo->sig;         //se suicida
  40.         vivos--;
  41.         n_trabajo=n_trabajo->sig;               //el sig coge la pistola
  42.     }
  43. //------------------------------------------------ sobreviviente encontrado ---
  44.     printf("\n\nha sobrevivido el loco nº %i \n\n", n_trabajo->dato);
  45.     free(lista); lista=NULL;
  46.     return 0;
  47. }

tambien lo hice sin utilizar directamente la memoria dinamica es decir sin reservar memoria (ni malloc) ni liberarla (ni free).
  #4 (permalink)  
Antiguo 18/06/2015, 17:52
 
Fecha de Ingreso: enero-2014
Mensajes: 60
Antigüedad: 10 años, 3 meses
Puntos: 1
Busqueda Respuesta: problema con ruleta rusa con TAD colas en C

hola alexhg42, he revisado tu programa y lejos de funcionar hace aguas por muchos sitios
y te explico:

- trabajar con dos listas distintas que son la misma como bien has dicho es uno gordo

- la estructura del nodo y como la usas, con elementos como el array cola[TAM] ¿¿??

- el calculo de la frecuencia esta mal solo sirve en el primer conteo

- cuando encuentras un error los sacas por pantalla pero el programa continua con
las operaciones como si nada

- querer hacer un tipo de dato variable no tiene sentido y ademas hay sitios donde espera
un tipo_dato y envias un int o necesitas un int como tipo_dato

- con cada nodo que creas desperdicias una barbaridad de memoria y ademas limitas a TAM
el maximo de participantes cuando el limite deberia ser la memoria existente

- otro error grave es no liberar la memoria reservada

... no he querido mirarlo mas a fondo pues como ves para que este programa funcione
necesita algo mas que una retoque, almenos en mi opinion.

... realmente se muy poco de c pero si te puedo ayudar en algo lo intetare, suerte :)

Etiquetas: colas, int, numero, programa, struct
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 22:20.