problema con este programa
Hola amigos. Tengo un programita echo en C++, muy sencillo y usando programación estructurada, con lo cual estoy seguro de que no tendreis problemas en ayudarme. Se trata de un jueguecito, en DOS, de adivinar claves.
El problema viene en que las líneas que vereis comentadas no hacen lo que tienen que hacer, es decir, no comparan los valores que tienen que comparar. Os coloco el código para que me ayudeis. Llevo dándole vueltas una semana y ya me siento algo tonto, la verdad.
#include <iostream>
#include <stdio.h>
#include <string>
#include <cstdlib>
#include <time.h>
void claveGen(int,int);
void claveGen(int *clave,int n)
{
int num;
bool esta_en_clave;
srand(time(NULL));
int j=0;
while(j<n)
{
num=rand()%9+1;
esta_en_clave=false;
for(int i=0;i<=j;i++)
{
if(num==clave[i])
{
esta_en_clave=true;
}
}
if(esta_en_clave==false)
{
clave[j]=num;
j++;
}
}
return;
}
void main()
{
char clave[4];
//claveGen(clave,4);
clave="1234";
char entrada[4]; //cadena de entrada de la clave
int i,j,k; //indices para el flujo
int intentos=5; //numero de intentos
int exitos=0,medios=0; //exitos son los numeros en posicion correcta
//medios son los numeros que existen pero estan mal puestos
bool correcto=false,repeticion=false,solo_numeros=true;
//correcto comprueba si la clave es correcta
//repeticion comprueba si hay repeticiones
//solo_numeros comprueba si solo hay numeros
do //mientras queden intentos...
{
do //pide la clave mientras no se ajuste a las especificaciones (4 digitos distintos)
{
solo_numeros=true;
repeticion=false;
cout << "Introduce la clave correctan";
gets(entrada);
for(k=0;k<strlen(entrada);k++)
{
if(!isdigit(entrada[k])) //comprueba si son realmente digitos
{
solo_numeros=false;
}
}
for(i=0;i<strlen(entrada);i++) //comprueba si hay repeticiones
//en la cadena introducida
{
for(j=i+1;j<strlen(entrada);j++)
{
if(entrada[i]==entrada[j] && i!=j)
{
repeticion=true;
}
}
}//
}while(strlen(entrada)!=4 ||entrada=="" || repeticion==true || solo_numeros==false);
for(i=0;i<4;i++) //para toda la longitud de la clave
{
for(j=0;j<strlen(entrada);j++) //comprueba los exitos y los medios
{
if(clave[i]==entrada[j] && i==j) //NO COMPARA!!!!
{
exitos++;
}
if(clave[i]==entrada[j] && i!=j) //
{
medios++;
}
}
}
for(i=0;i<=strlen(entrada);i++)
{
cout << entrada[i]; //muestra la clave introducida
}
cout << " - ";
for(j=1;j<=exitos;j++) //escribe los exitos
{
cout << " SI ";
}
for(j=1;j<=medios;j++) //escribe los medios
{
cout << " ?? ";
}
if(exitos==4) //si hay 4 exitos, gana
{
correcto=true;
intentos=0;
}else{ //si no, un intento menos
intentos--;
}
exitos=0; //reinicia los exitos y los medios para la siguiente entrada
medios=0;
}while(intentos>0);
if(correcto)
{
cout << "ACERTASTE!!!";
}else{
cout << "FALLASTE!!!" << 'n';
cout << "La clave era ";
for(i=0;i<4;i++)
{
cout << clave[i];
}
}
}
Gracias!!!!!
El problema viene en que las líneas que vereis comentadas no hacen lo que tienen que hacer, es decir, no comparan los valores que tienen que comparar. Os coloco el código para que me ayudeis. Llevo dándole vueltas una semana y ya me siento algo tonto, la verdad.
#include <iostream>
#include <stdio.h>
#include <string>
#include <cstdlib>
#include <time.h>
void claveGen(int,int);
void claveGen(int *clave,int n)
{
int num;
bool esta_en_clave;
srand(time(NULL));
int j=0;
while(j<n)
{
num=rand()%9+1;
esta_en_clave=false;
for(int i=0;i<=j;i++)
{
if(num==clave[i])
{
esta_en_clave=true;
}
}
if(esta_en_clave==false)
{
clave[j]=num;
j++;
}
}
return;
}
void main()
{
char clave[4];
//claveGen(clave,4);
clave="1234";
char entrada[4]; //cadena de entrada de la clave
int i,j,k; //indices para el flujo
int intentos=5; //numero de intentos
int exitos=0,medios=0; //exitos son los numeros en posicion correcta
//medios son los numeros que existen pero estan mal puestos
bool correcto=false,repeticion=false,solo_numeros=true;
//correcto comprueba si la clave es correcta
//repeticion comprueba si hay repeticiones
//solo_numeros comprueba si solo hay numeros
do //mientras queden intentos...
{
do //pide la clave mientras no se ajuste a las especificaciones (4 digitos distintos)
{
solo_numeros=true;
repeticion=false;
cout << "Introduce la clave correctan";
gets(entrada);
for(k=0;k<strlen(entrada);k++)
{
if(!isdigit(entrada[k])) //comprueba si son realmente digitos
{
solo_numeros=false;
}
}
for(i=0;i<strlen(entrada);i++) //comprueba si hay repeticiones
//en la cadena introducida
{
for(j=i+1;j<strlen(entrada);j++)
{
if(entrada[i]==entrada[j] && i!=j)
{
repeticion=true;
}
}
}//
}while(strlen(entrada)!=4 ||entrada=="" || repeticion==true || solo_numeros==false);
for(i=0;i<4;i++) //para toda la longitud de la clave
{
for(j=0;j<strlen(entrada);j++) //comprueba los exitos y los medios
{
if(clave[i]==entrada[j] && i==j) //NO COMPARA!!!!
{
exitos++;
}
if(clave[i]==entrada[j] && i!=j) //
{
medios++;
}
}
}
for(i=0;i<=strlen(entrada);i++)
{
cout << entrada[i]; //muestra la clave introducida
}
cout << " - ";
for(j=1;j<=exitos;j++) //escribe los exitos
{
cout << " SI ";
}
for(j=1;j<=medios;j++) //escribe los medios
{
cout << " ?? ";
}
if(exitos==4) //si hay 4 exitos, gana
{
correcto=true;
intentos=0;
}else{ //si no, un intento menos
intentos--;
}
exitos=0; //reinicia los exitos y los medios para la siguiente entrada
medios=0;
}while(intentos>0);
if(correcto)
{
cout << "ACERTASTE!!!";
}else{
cout << "FALLASTE!!!" << 'n';
cout << "La clave era ";
for(i=0;i<4;i++)
{
cout << clave[i];
}
}
}
Gracias!!!!!
Creo que encontré la solución a tu problema. Solo que como el compilador que uso no soporta C++, me tomé la libertad de reescribirlo en C. De cualquier forma pienso que la solución tiene que andarte también. Si te interesa avisame y te mando el fuente.
Saludos
Emmanuel.-
Saludos
Emmanuel.-
bueno so se mucho de c pero viendo tu programa veo la linea if(clave[i]==entrada[j] && i==j) //NO COMPARA!!!!
i y j son iguales de 0 a 4 luejo j es > 4 y el condicional nuca se cumple. vi el programa rapidamente espero que te ayude...
i y j son iguales de 0 a 4 luejo j es > 4 y el condicional nuca se cumple. vi el programa rapidamente espero que te ayude...
necesito un programa parecido al que tu utilizas,
con indices, que no sea muy complejo, que haga una busqueda sencilla por arboles.
con indices, que no sea muy complejo, que haga una busqueda sencilla por arboles.