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

Recorrido de arrays

Estas en el tema de Recorrido de arrays en el foro de C/C++ en Foros del Web. Hola a todos :) ! Estoy haciendo una práctica que consiste en el juego Mastermind. Lo que tengo que hacer es ver si los colores ...
  #1 (permalink)  
Antiguo 24/07/2014, 04:03
Avatar de anggiebs  
Fecha de Ingreso: julio-2014
Ubicación: Madrid
Mensajes: 35
Antigüedad: 9 años, 9 meses
Puntos: 0
Pregunta Recorrido de arrays

Hola a todos :) !

Estoy haciendo una práctica que consiste en el juego Mastermind.

Lo que tengo que hacer es ver si los colores que tengo en el array tCodigo jugada coinciden con los elementos del array tCodigo secreto y si el elemento en la posición i coincide en ambos, poner a true esta posición en un array de booleanos que he llamado tArrayBool aux .

Es decir, si [I]jugada[i ]== secreto[i] entonces aux=true;

Hasta ahí bien pero luego tengo que comparar si el color que tengo en jugada[j] está en algún otro sitio del array tCodigo secreto por eso sé que tengo que usar un for para recorrer el array tCodigo jugada y para cada color comprobar con un while si está el color en el array tCodigo secreto y sin haber sido usada antes en el array de booleanos pero sé que me falta algo ...

Espero puedan ayudarme .
Gracias :)

---------------------------------------------------------------------------
Código:
void comprobarColores(tCodigo secreto,tCodigo jugada,int &colocadas,int &descolocadas,int &intentos){

//Array de booleanos lo inicializo a false.
	tArrayBool aux={false};	

	for(int i=0; i<FICHAS_JUGADA; i++){
       /* Compruebo si los elementos de tCodigo secreto y tCodigo jugada son     el      mismo y estan en la misma posicion. */
		if(jugada[i] == secreto[i]){
			aux[i]= true;
		}
	}
	
	for(int j=0; j<FICHAS_JUGADA; j++){
/* Si el elemento del array tCodigo jugada está en una posicion distinta en el array tCodigo secreto */
		while((jugada[j] == secreto[j+1]) && aux[j]!= true){ /* <--- Sé que algo de está mal... */
			aux[j]=true;
		}
	}

}
  #2 (permalink)  
Antiguo 24/07/2014, 06:41
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: Recorrido de arrays

Ese ciclo while parece nunca cambiar la condicion que chequea.
j deberia cambiar pero no ocurre.

Sugiero tener 2 variables, una "fija", antes de ese ciclo, otra que varíe en el ciclo.
La variable "fija" cambia después de ejecutar el ciclo.
Algo asi como

Código pseudo:
Ver original
  1. i = 0
  2. for ( j = 0; j < N; ++j ) {
  3.      // comparar  a [i] y  a[j] cuando i != j
  4. }
  5. i++

o alguna variante del mismo tema.
__________________
Visita mi perfil en LinkedIn

Última edición por CalgaryCorpus; 24/07/2014 a las 08:22
  #3 (permalink)  
Antiguo 24/07/2014, 11:32
Avatar de anggiebs  
Fecha de Ingreso: julio-2014
Ubicación: Madrid
Mensajes: 35
Antigüedad: 9 años, 9 meses
Puntos: 0
Respuesta: Recorrido de arrays

Gracias CalgaryCorpus, sé que lo que he puesto en el while muy probablemente me llevaría a un bucle infinito pero es que dudaba desde el principio en la condición que tenía que escribir allí.

Voy a probar tu idea que para mí tiene mucho sentido ,gracias :) !
  #4 (permalink)  
Antiguo 25/07/2014, 08:10
 
Fecha de Ingreso: junio-2014
Mensajes: 144
Antigüedad: 9 años, 10 meses
Puntos: 1
Respuesta: Recorrido de arrays

Hola, entiendo que quieres buscar desde el array jugada la posición en el array secreto de elementos que sean iguales. Pero con i diferente de j pues eso revisaste la igualdad de elementos antes.

Suponiendo que FICHAS_JUGADAS es el tamaño del array quedaría así:

int size = FICHAS_JUGADAS; //es que es muy largo el nombre xD
for (int i = 0; i < size ; i++){
for (int j = 0; j < size; j++){

if ( i != j && jugada[i] == secreto[j]){

// aqui poner lo que quieras, i es el a jugada y j es la posición de secreto donde los elementos son iguales.
}
}
}

Dime si te he entendido bien.

saludos.
  #5 (permalink)  
Antiguo 25/07/2014, 12:53
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: Recorrido de arrays

Puesto que comparar a[i] y a[j] es lo mismo que comparar a[j] con a[i], en el fondo hay que considerar que se está comparando todo 2 veces.

Una posible optimización, para evitar comparaciones superfluas es comenzar el segundo indice desde 1 mas que el indice primario.

Algo como ..

Código pseudo:
Ver original
  1. for( i = 0; i < size; ++i ) {
  2.      for( j = i+1; j < size; ++j ) {
  3.           // comparar a[i] y a[j].
  4.           // i y j nunca son iguales, no es necesario chequearlo
  5.      }
  6. }
__________________
Visita mi perfil en LinkedIn
  #6 (permalink)  
Antiguo 25/07/2014, 16:10
 
Fecha de Ingreso: junio-2014
Mensajes: 144
Antigüedad: 9 años, 10 meses
Puntos: 1
Respuesta: Recorrido de arrays

Cita:
Iniciado por CalgaryCorpus Ver Mensaje
Puesto que comparar a[i] y a[j] es lo mismo que comparar a[j] con a[i], en el fondo hay que considerar que se está comparando todo 2 veces.

Una posible optimización, para evitar comparaciones superfluas es comenzar el segundo indice desde 1 mas que el indice primario.

Algo como ..

Código pseudo:
Ver original
  1. for( i = 0; i < size; ++i ) {
  2.      for( j = i+1; j < size; ++j ) {
  3.           // comparar a[i] y a[j].
  4.           // i y j nunca son iguales, no es necesario chequearlo
  5.      }
  6. }
Hola, esto se usa para organizar un array, se llama método de la burbuja. Pero no es lo que necesita, pues necesita encontrar la posición. Mira imagínate que hay dos arrary a y b. Y que a[3] == b[1], en este caso lo que propones no podría detectar que en el elemento de a en la posición 3 es igual que el elemento 1 de b.

Saludos.
  #7 (permalink)  
Antiguo 26/07/2014, 09:02
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: Recorrido de arrays

dmorill, tienes razon que el codigo no funcionaria para 2 arreglos. Solo funciona para comparaciones de un mismo arreglo aunque no es solo para ordenar.
__________________
Visita mi perfil en LinkedIn

Última edición por CalgaryCorpus; 26/07/2014 a las 14:03
  #8 (permalink)  
Antiguo 29/07/2014, 05:13
Avatar de anggiebs  
Fecha de Ingreso: julio-2014
Ubicación: Madrid
Mensajes: 35
Antigüedad: 9 años, 9 meses
Puntos: 0
Respuesta: Recorrido de arrays

Hola chicos :) ,siento tardar en responder .
He leído lo que han escrito y el problema es que parece que no me toma en cuenta el array de booleanos (tArrayBool aux).
Lo que me piden es que si el elemento que está en el array tCodigo jugada está en una posición distinta del array tCodigo secreto,marque a true la misma posición del array tCodigo secreto en el tArrayBool aux y que de acuerdo a esta comprobación,podré omitir el revisar los siguientes elementos del array tCodigo jugada con esta posición del array tCodigo secreto porque ya he encontrado su "pareja" y está a true en tArrayBool aux.

Esto lo he puesto así,sin embargo,al compilarlo no me reconoce por que por ejemplo :
Codigo secreto es: 4 4 4 1
Codigo del usuario escribo: 4 5 5 5
Resultado me dice: 1 está en su sitio, 2 en un sitio distinto
cuando lo que debería decirme es: 1 está en su sitio ,0 en un sitio distinto
(porque los 4 que están en la misma posición se marcan a true en el array de booleanos y ya no me tiene porqué comparar esa posición con las demás,en este caso, me compara con la 2da y 3era posición del array tCodigo secreto y por eso me dice que hay 2 en un sitio distinto .)

Esto ya me está cansando :( ,me agobio :( ....pero aparte de eso, espero haberme explicado y sino ,pregúntenme :)

----------------------------------------------------------------------

Sólo pondré la función que compara los elementos que están en distinta posición porque lo otro si que lo hace bien :) .

Código C++:
Ver original
  1. void comprobarColores(tCodigo secreto,tCodigo jugada,int &colocadas,int &descolocadas,...){
  2.  
  3. //Array de booleanos para marcar los aciertos sean colocados o descolocados,lo inicializo a false.
  4. tArrayBool aux={false};
  5. int j=0;
  6.  
  7. [...]
  8.  
  9. for(int j=0; j<size;){ //Le he puesto size para gusto de dmorill :D
  10.         for(int k=0; k< size; k++){
  11.             while((aux[k] != true) && (jugada[j]== secreto[k])){    //Algo hace mal aquí <--
  12.                 aux[k]= true;
  13.                 descolocadas++;
  14.             }
  15.         }j++;
  16.     }
  17. }

Etiquetas: arrays, c++, recorrido
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 15:51.