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

Error al ejecutar programa mastermind.

Estas en el tema de Error al ejecutar programa mastermind. en el foro de C/C++ en Foros del Web. Hola compañeros, soy nuevo en el foro y también en la programación (apenas 1 mes) , espero poder aprender y ayudar en lo que pueda. ...
  #1 (permalink)  
Antiguo 03/11/2015, 05:51
 
Fecha de Ingreso: noviembre-2015
Mensajes: 3
Antigüedad: 8 años, 6 meses
Puntos: 0
Pregunta Error al ejecutar programa mastermind.

Hola compañeros, soy nuevo en el foro y también en la programación (apenas 1 mes) , espero poder aprender y ayudar en lo que pueda.

Mi problema es el siguiente: al ejecutar el programa mastermind, cuando introduzco el número y pulso "enter", me dice "mastermind.exe dejó de funcionar" y se finaliza.

No sé a que puede deberse la verdad, preferiría que no me diesen la solución sino más bien pistas o el bloque en el que se puede encontrar el problema. Como digo, mis conocimientos son muy básicos, solo he tocado esta librería y aún no he hecho funciones en C (solo sobre papel).

No he terminado la comparación de resultados porque incluso cuando introduzco el número correcto se sale, la terminaré cuando resuelva este problema primero.

Muchas gracias de antemano!!

Código:

Código:
#include<stdio.h>

int d1, d2, d3, d4, a1, a2, a3, a4, intentos=10, aciertos=0, posicion=0, num, resto;

int main(void){
	
	srand(time(NULL));
	//Genera digitos aleatorios diferentes entre si, el primero distinto de 0//
	a1=1+rand()%9;
	do{
		a2=rand()%10;
	}while(a2==a1);
	do{
		a3=rand()%10;
	}while(a3==a1||a3==a2);
	do{
		a4=rand()%10;
	}while(a4==a1||a4==a2||a4==a3);
	
	//notacion para saber el numero y comprobar resultados//
printf("%d%d%d%d\n\n", a1, a2, a3, a4);

	//inicializacion de variables, entrada de datos y descomposicion del numero para comparar digito por digito.//
	//Bucle hasta que me quede sin intentos o acierte los 4 digitos//
do{
	posicion=0;
	aciertos=0;
	
	printf("numero: ");
	scanf_s("%d", num);
	d1=num/1000;
	resto=num%1000;
	d2=resto/100;
	resto=resto%100;
	d3=resto/10;
	d4=resto%10;
	
	//comparacion de resultados//
	if(d1==a1&&d2==a2&&d3==a3&&d4==a4){
		posicion=4;
		aciertos=4;
	}
	if(d1==a2||d1==a3||d1==a4){
		aciertos++;
	}
	
	.
	.
	.
	
	
	printf(" te quedan %d intentos: ",intentos);
	printf("en posicion %d: ", posicion);
	printf("aciertos %d: ", aciertos);
	intentos--;		
}while(intentos<0&&posicion>4);
	
	
if(posicion==4){
	printf("has ganado!");
}		
	getch();
	return 0;
}
  #2 (permalink)  
Antiguo 03/11/2015, 06:18
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 7 meses
Puntos: 204
Respuesta: Error al ejecutar programa mastermind.

Bienvenido al foro.

Lo primero que deberías corregir es el tema de las variables globales. No es una buena idea poner todas las variables disponibles a nivel global, es una práctica que da muchísimos problemas. Es mejor que te acostumbres a declarar las variables dentro de las funciones.

Bueno, tu error:

Código C:
Ver original
  1. scanf_s("%d", num);

scanf_s necesita almacenar el valor introducido por teclado en num. Para que esto sea posible la función espera recibir un puntero... y tu le estás pasando la variable por valor. Esto hace que la función intente escribir en una posición arbitraria de la memoria y, como es de esperar, el sistema operativo mata tu programa por precaución.

¿Solución? Pasarle un puntero que es lo que espera:

Código C:
Ver original
  1. scanf_s("%d", &num);

Sugerencia: si la secuencia del juego la tratas como una cadena de caracteres en vez de como números conseguirás varias ventajas:
  • El primer elemento de la secuencia podrá ser un 0
  • No tendrás que separar los dígitos que componen cada elemento de la secuencia

Otro consejo: Cuando tu realizas una comparación se genera un entero que puede valer 0 o 1. Esto lo puedes aprovechar para calcular el número de aciertos de una forma un poco más elegante:

Código C:
Ver original
  1. aciertos = (d1==a1)+(d2==a2)+(d3==a3)+(d4==a4);

Y, por cierto, la variable "posicion" no es necesaria en absoluto. Se supone que has ganado si el número de aciertos es igual al número de elementos en la secuencia, en este caso 4... ahorrarte variables innecesarias mejora la calidad de tu código.

Un saludo.
  #3 (permalink)  
Antiguo 03/11/2015, 06:53
 
Fecha de Ingreso: noviembre-2015
Mensajes: 3
Antigüedad: 8 años, 6 meses
Puntos: 0
Respuesta: Error al ejecutar programa mastermind.

Muchísimas gracias, vaya fallo más tonto que he tenido >__< normalmente lo pongo, igualmente tu explicación me ha ayudado bastante, no sabía exactamente el por qué. Y sí, normalmente cuando trabajo sobre papel el algoritmo declaro variables en funciones, pero aún no he llegado en lenguaje C, gracias por el consejo!

Probaré a resolverlo también con caracteres, muy interesante el planteamiento, gracias!

Gracias también por la otra forma de calcular los aciertos, me ha gustado y me parece mucho más adecuada.

Lo de la variable "posicion" más que nada es porque diferencio entre acierto y posición, acierto es que el dígito está contenido en el número, y posicion es que el dígito es un acierto y está en la posición que le corresponde. Igual es un poco enrevesado y tampoco sirve de gran ayuda si no te dice cual es el que está en posición.

Le pegaré un repaso, lo terminaré para que funcione y lo subo otra vez a ver que tal jaja
Gracias por todo!!
  #4 (permalink)  
Antiguo 03/11/2015, 06:57
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 2 meses
Puntos: 3
Respuesta: Error al ejecutar programa mastermind.

Yo para quitar tanto do...while crearía un array con todos los valores posibles, luego usaría rand para obtener un índice que me dará ese valor del array, luego cojo el último valor del array y lo copio en el lugar del que ha salido y pongo en el último el carácter de fin de cadena, y por último decremento la variable que indica el largo del array. Con eso consigues que ningún valor se repita y te ahorras 4 do...while en tu código al menos.

Etiquetas: funcion, int, numero, programa
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 13:23.