• Viernes 8 de Noviembre de 2024, 19:04

Autor Tema:  Clave Secreta En C  (Leído 3312 veces)

Nevhazovat

  • Miembro activo
  • **
  • Mensajes: 39
    • Ver Perfil
Clave Secreta En C
« en: Miércoles 13 de Diciembre de 2006, 20:59 »
0
Hola.

Estoy haciendo un programa que acepta una clave secreta y evalúa la que el usuario teclea posteriormente, con un máximo de 5 intentos.

Este es el código.

Citar
#include <stdio.h>
#include <string.h>

void main(void)
{
   char clave [20], prueba [20];
   int comparacion, contador=0;

   printf ("Clave: ");
   gets(clave);
   printf ("\nRepite la clave: ");
   gets(prueba);

   comparacion=strcmp(clave, prueba);

   for (contador=0;contador<5;contador++)
   {
  if(comparacion)
  {
   printf ("\nLa clave es incorrecta.\nRepite la clave: ");
   gets(prueba);
   comparacion=strcmp(clave, prueba);
  }
  else
  {
   contador=5;
   printf ("\nLa clave es correcta.");
  }
   }
  if (contador==5)
  {
   printf("Ha superado los intentos permitidos");
  }
   getchar();
}

Lo que me gustaría saber es como hacer para que una vez introducida la comprobación de la clave, si esta es distinta de la original, me vaya diciendo los caracteres que están bien posicionados y si hay alguno que está desordenado pero que está en la clave original también lo indique. Vamos practicamente lo que hace el juego del Lingo.

Otra cosa que he intentado, y que no me sale, es que al introducir la clave original en lugar de mostrar los caracteres que se teclean, muestre asteriscos. Se que se utiliza getch() para que no imprima el caracter y putchar('*') para que me imprima el asterisco. Pero cuando ingreso la clave (digamos de 4 caracteres, por ejemplo) al pulsar intro me pone el 5º asterisco y, claro, luego al comprobar la contraseña no me funciona.

Lo dicho. Un poco de ayuda no viene mal.

Gracias por tomarse la molestia en leer este tocho.

Un saludo.

su -

  • Moderador
  • ******
  • Mensajes: 2349
    • Ver Perfil
Re: Clave Secreta En C
« Respuesta #1 en: Miércoles 13 de Diciembre de 2006, 22:27 »
0
La verdad es que no soy el mejor para responder esto, pero como ya sabes, por ahora es codigo no es seguro.
Para poner "*" o hacer que no salga nada cuando escribes algo en la terminal/consola tienes que trabajar con el STDIN y STDOUT como se habla aqui con stdio.h o Windows.h
Depronto quieras usar estandares POSIX/ANSI para que tu codigo sea mas portable
http://www.microsoft.com/technet/interopmi...u/sfuposix.mspx
*******PELIGRO LEE ESTO!!*******

There is no place like 127.0.0.1

Conecto luego existo, no conecto luego insisto.

robertogt

  • Miembro activo
  • **
  • Mensajes: 97
  • Nacionalidad: gt
    • Ver Perfil
    • http://robertux.wordpress.com
Re: Clave Secreta En C
« Respuesta #2 en: Miércoles 13 de Diciembre de 2006, 22:39 »
0
Una forma facil que miro facil para ver que caracteres están bien posicionados es ir recorriendo el vector donde esta guardada la clave, luego ese mismo contador que estás usando para ir recorriendo la cadena y comparandola con la clave, cada vez que haya una coincidencia guardás ese valor en otro vector de enteros, con esto vas a ir guardando la posicion de los caracteres que estén bien.

Citar
y si hay alguno que está desordenado pero que está en la clave original también lo indique.

Esto lo que podrias hacer es que cuando haya un coracter que no coincida con el caracter de la clave en su posicion, es irte a recorrer desde el principio la clave y si coincide ese caracter con cualquier caracter de la clave indicarlo, con una bandera.

Bueno es una forma facil de hacerlo, probablemente hayan otras más
Un dia sin sol es como, ya sabes, ... noche

Nevhazovat

  • Miembro activo
  • **
  • Mensajes: 39
    • Ver Perfil
Re: Clave Secreta En C
« Respuesta #3 en: Viernes 15 de Diciembre de 2006, 20:32 »
0
Bueno, me he decidido a hacerlo de otra manera. Pero como quiera que los errores o los fallos me persiguen allí donde quiera intentar algo nuevo, les posteo el nuevo código.  

Uno de los fallos es que si meto como clave los 4 numeros iguales (p.e 1111) y luego en la comprobación se acierta, me saca que hay ¡¡¡12 desordenados!!!  ¿Qué hacer para corregir esto?

¿Cómo puedo limitar los intentos a 5?
¿Y para imprimir **** en lugar de los números en este código?

Código va.

Código: Text
  1. #include &#60;stdio.h&#62;
  2. #define N 4
  3.  
  4. int error (char cadena[N]) {
  5.   int i, j;
  6.   for (i=0; i&#60;N; i++) {
  7.  
  8.    //CARACTERES ERRONEOS
  9.    if ((cadena[i]!='1') && (cadena[i]!='2') && (cadena[i]!='3') &&
  10.   (cadena[i]!='4') && (cadena[i]!='5') && (cadena[i]!='6') && (cadena[i]!='7')
  11.   && (cadena[i]!='8') && (cadena[i]!='9') && (cadena[i]!='0')) {
  12.     printf(&#34;Caracteres erroneos.&#092;n&#34;);
  13.     printf(&#34;Intentalo otra vez.&#092;n&#34;);
  14.     return 1;
  15.    }
  16.   }
  17.     return 0;
  18. }
  19. int desordenados_ (char propuesta[N], char clave[N]) {
  20.   int i, j, desordenados=0;
  21.   for (i=0; i&#60;N; i++)
  22.    for (j=0; j&#60;N; j++)
  23.       if (clave[i]==propuesta[j] && i!=j)
  24.   desordenados++;
  25.   if (desordenados) printf(&#34;Hay %d numeros desordenados.&#092;n&#34;, desordenados++);
  26.   else printf(&#34;Ningun numero pertenece a la clave.&#092;n&#34;);
  27.   return desordenados;
  28. }
  29.  
  30. int aciertos_ (char propuesta[N], char clave[N]) {
  31.   int i, aciertos=0;
  32.   for (i=0; i&#60;N; i++)
  33.    if (clave[i]==propuesta[i])
  34.     aciertos++;
  35.   if (aciertos) printf(&#34;Hay %d aciertos.&#092;n&#34;, aciertos);
  36.   else printf(&#34;No hay aciertos.&#092;n&#34;);
  37.   return aciertos;
  38. }
  39.  
  40. int main() {
  41.   char cl[N+1], pr[N+1];
  42.   int i, aciertos, desordenados;
  43.  
  44.   do {
  45.    printf(&#34;Escribe la clave que se ha de adivinar (4 digitos): &#34;);
  46.    gets(cl);
  47.   } while (error(cl));
  48.   printf(&#34;&#092;n&#092;n&#34;);
  49.  
  50.   while (aciertos!=4) {
  51.   do {    
  52.    printf(&#34;&#092;n¿Cual crees que es la clave? &#34;);
  53.    gets(pr);
  54.   } while (error(pr));
  55.     desordenados=desordenados_(pr, cl);
  56.    aciertos=aciertos_(pr, cl);
  57.   }
  58.  
  59.   if (aciertos==4) printf(&#34;&#092;nAcertaste!&#092;n&#34;);
  60.   return 0;
  61. }
  62.  

su -

  • Moderador
  • ******
  • Mensajes: 2349
    • Ver Perfil
Re: Clave Secreta En C
« Respuesta #4 en: Sábado 16 de Diciembre de 2006, 02:22 »
0
Este codigo NO funciona pero depronto te da una idea (nada raro que sea todo un desastre)
Código: Text
  1. /***************************************************
  2.  * clave insegura de digitos                       *
  3.  * no usar esto en programas que requieran de algo *
  4.  * serio.                                          *
  5.  * creado por su - &#60;www.solocodigo.com&#62;            *
  6.  ***************************************************
  7.  */
  8.  
  9. #include &#60;stdio.h&#62;
  10. #include &#60;stdlib.h&#62;
  11.  
  12. int main ()
  13. {
  14.   int  vez, aciertos, desordenados;
  15.   for (vez = 0; vez &#60; 4; vez++) {
  16.     int entrante = 0;
  17.     printf( &#34;Escribe la clave de 4 digitos: &#34;);
  18.     scanf( &#34;%i&#34;,&entrante);
  19.     /*aqui comparas los valores ASCII pero no se como es en C*/
  20.     if((ord entrante) &#60; 48 && (ord entrante) &#62; 57)
  21.       printf ( &#34;Solo se puenden numeros.&#092;n&#34; );
  22.       goto END;
  23.     switch ( entrante )
  24.     {
  25.       case 1:
  26.         printf( &#34;Es 1&#092;n&#34; );
  27.   break;
  28.       case 2:
  29.         printf( &#34;Es 2&#092;n&#34; );
  30.   break;
  31.       case 3:
  32.         printf( &#34;Es 3&#092;n&#34; );
  33.   break;
  34.       case 4:
  35.         printf( &#34;Es 4&#092;n&#34; );
  36.   break;
  37.       case 5:
  38.         printf( &#34;Es 5&#092;n&#34; );
  39.   break;
  40.       case 7:
  41.         printf( &#34;Es 7&#092;n&#34; );
  42.   break;
  43.       case 8:
  44.         printf( &#34;Es 8&#092;n&#34; );
  45.   break;
  46.       case 9:
  47.         printf( &#34;Es 9&#092;n&#34; );
  48.   break;
  49.       case 0:
  50.         printf( &#34;Es 0&#092;n&#34; );
  51.   break;
  52.       default:
  53.         printf( &#34;Entra un numero por favor (0-9)&#092;n&#34; );
  54.   break;
  55.     }
  56.     END:
  57.     system( &#34;sleep 0.5&#34; );
  58.   }
  59. }
  60.  
  61.  
*******PELIGRO LEE ESTO!!*******

There is no place like 127.0.0.1

Conecto luego existo, no conecto luego insisto.

Nevhazovat

  • Miembro activo
  • **
  • Mensajes: 39
    • Ver Perfil
Re: Clave Secreta En C
« Respuesta #5 en: Sábado 16 de Diciembre de 2006, 02:31 »
0
Hola.

No se a que te refieres con lo de comparar los valores ASCII.

su -

  • Moderador
  • ******
  • Mensajes: 2349
    • Ver Perfil
Re: Clave Secreta En C
« Respuesta #6 en: Sábado 16 de Diciembre de 2006, 02:40 »
0
Si, lo que pasa es que cuando haces un scanf (si no estoy mal) el valor no es un numero, si no un numeral.
La idea es compararlo segun su valor, si este no es de 48-57 es porque no es un numero (lo que ingreso el usuario) y asi no habria problema en la parte de switch y el loop.
*******PELIGRO LEE ESTO!!*******

There is no place like 127.0.0.1

Conecto luego existo, no conecto luego insisto.

Nevhazovat

  • Miembro activo
  • **
  • Mensajes: 39
    • Ver Perfil
Re: Clave Secreta En C
« Respuesta #7 en: Sábado 16 de Diciembre de 2006, 03:41 »
0
Bufff, ni idea de eso. Debe haber otra forma.

su -

  • Moderador
  • ******
  • Mensajes: 2349
    • Ver Perfil
Re: Clave Secreta En C
« Respuesta #8 en: Sábado 16 de Diciembre de 2006, 15:08 »
0
Cita de: "Nevhazovat"
Bufff, ni idea de eso. Debe haber otra forma.
Siempre hay otra forma de hacer las cosas (por eso me gusta Perl  :whistling:  ) entonces intenta usar if y comprar cada numeral (quitando lo de switch ).
Tambien puedes seguir con el codigo que puse y usar isdigit()
*******PELIGRO LEE ESTO!!*******

There is no place like 127.0.0.1

Conecto luego existo, no conecto luego insisto.

Nevhazovat

  • Miembro activo
  • **
  • Mensajes: 39
    • Ver Perfil
Re: Clave Secreta En C
« Respuesta #9 en: Lunes 18 de Diciembre de 2006, 18:56 »
0
¿Nadie sabe como hacerlo?

su -

  • Moderador
  • ******
  • Mensajes: 2349
    • Ver Perfil
Re: Clave Secreta En C
« Respuesta #10 en: Lunes 18 de Diciembre de 2006, 20:09 »
0
Cita de: "Nevhazovat"
¿Nadie sabe como hacerlo?
Ya no te dije?
 :huh:
*******PELIGRO LEE ESTO!!*******

There is no place like 127.0.0.1

Conecto luego existo, no conecto luego insisto.