Hack x Crack - Comunidad de Seguridad informática

Programación => C / C++ => Mensaje iniciado por: Blacdk en Julio 16, 2014, 03:49:47 am

Título: Reto basico
Publicado por: Blacdk en Julio 16, 2014, 03:49:47 am
Hola a todos navegando por la web me encontre este ejercicio bastante basico de por si, aunque muy util para aquellos que estan comenzando con eso de la programacion, y bueno por dejar un regalito por brindarme tanto conocimiento, la idea es que vayan publicando soluciones con eso podemos ayudarlos y aprender juntos un saludo y les dejo el problemilla ;).

El programa debe tener un menú en el cuál se pueda seleccionar Codificación o Cesar.
La solución debe usar funciones muy basicas y arreglos.

Opción 1.
CODIFICACIÓN
El objetivo de este programa es que al digitar una palabra por teclado me la devuelva codificada y de forma
inversa, de la siguiente forma.
Se crean dos tablas, una debe contener las equivalencias de caracteres del alfabeto (29), y en otra la
equivalente con números (10)

Nota: pueden ser menos caracteres alfabéticos, si no tiene en cuenta ñ, ll, rr, ch
Ejemplo
¡ # $ % &
/ ( ) = ¿
¿ , . [ ]
{ } + - \
* _ ! @ >
<
A B C D
E F G H
I J

Codificación:
Texto digitado por el usuario: Programa2014
Salida: {+](+¡.¡CABE

Decodificación:
Texto digitado por el usuario:
{+](+¡.¡CABE Salida: Programa2014
Título: Re:Reto basico
Publicado por: YuKth en Julio 16, 2014, 05:18:13 am
una ves me mandaron a hacer algo asi en la uni, solo que cada letra le correspondia una serie de signos estaticos   :P
Título: Re:Reto basico
Publicado por: stakewinner00 en Julio 16, 2014, 03:37:50 pm
De momento dejo mi code, lo hice rápido así que aun se podría optimizar bastante y además no soporta mayúsculas de momento, pero funciona. Por cierto, es obligatorio que este en dos tablas (los números en una y las letras en otra)? yo lo puse todo en una string que ya viene a ser un arreglo de chars.

Código: C++
  1. #include <iostream>
  2. #include <string>
  3. //g++ main.cpp -o main -std=c++11
  4. using namespace std;
  5.  
  6. const string c {"~#$%&/()=?|,.[]{}+-'*[email protected]><ABCDEFGHIJ"};
  7. const string p {"abcdefghijklmnopqrstuvwxyz1234567890"};
  8.  
  9. void codificar()
  10. {
  11. string x;
  12. cin>>x;
  13. for(auto t : x)
  14.    {
  15.       for(int j=0;j<p.size();j++)
  16.       {      
  17.          if(t==p[j]) cout << c[j];
  18.       }
  19.    }
  20. }
  21.  
  22. void descodificar()
  23. {
  24. string x;
  25. cin>>x;
  26. for(auto t : x)
  27.    {
  28.       for(int j=0;j<p.size();j++)
  29.       {      
  30.          if(t==c[j]) cout << p[j];
  31.       }
  32.    }
  33. }
  34.  
  35.  
  36. int main()
  37. {
  38.    cout << "1.Codificar\n2.Descodificar\n";
  39.    if (cin.get() == '1' )
  40.    {
  41.       cout << "TEXTO A CODIFICAR: ";
  42.       codificar();
  43.       return 0;
  44.    }
  45.    cout << "TEXTO A DESCODIFICAR: ";
  46.    descodificar();
  47. }
Título: Re:Reto basico
Publicado por: Caballoporvena en Octubre 12, 2014, 01:54:40 pm
Me han enviado el mismo ejercicio en la UnI :D
Título: Re:Reto basico
Publicado por: Krakakanok en Octubre 12, 2014, 02:08:08 pm
spoiler spoiler xDD

Saludos.
Título: Re:Reto basico
Publicado por: Roy341 en Octubre 24, 2014, 09:14:16 pm
Aqui tambien va mi code:

Código: C
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define TAM 36
  4.  
  5.  
  6. int menu(char x);
  7. void Codificar(const char alfabeto[], int tam1, const char alfabetoCodificado[], int tam2);
  8. void Decodificar(const char alfabeto[], int tam1, const char alfabetoCodificado[], int tam2);
  9.  
  10.  
  11. int main(void)
  12. {
  13.     const char alfabeto[TAM] = {"abcdefghijklmnopqrstuvwxyz1234567890"};
  14.     const char alfabetoCodificado[TAM] = {"¡#$%&/()=¿?,.[]{}+-\\*[email protected]><ABCDEFGHIJ"};
  15.     char x;
  16.  
  17.     while((x = menu(x)) != 3)
  18.     {
  19.  
  20.       switch(x)
  21.       {
  22.           case 1:
  23.           {
  24.               system("cls");
  25.               Codificar(alfabeto, TAM, alfabetoCodificado, TAM);
  26.               break;
  27.           }
  28.           case 2:
  29.           {
  30.               system("cls");
  31.               Decodificar(alfabeto, TAM, alfabetoCodificado, TAM);
  32.               break;
  33.           }
  34.           default:
  35.           {
  36.              printf("La opcion elegida no existe\n");
  37.              system("PAUSE");
  38.           }
  39.  
  40.       }
  41.  
  42.       /*limpiar el buffer si es necesario*/
  43.       if (x != '\n' && x != EOF)
  44.       while ((x = getchar()) != '\n' && x != EOF);
  45.       system("cls");
  46.  
  47.     }
  48.     return 0;
  49. }
  50.  
  51.  
  52. int menu(char x)
  53. {
  54.     printf("1 -Codificar\n");
  55.     printf("2 -Decodificar\n");
  56.     printf("3 -Salir\n\n");
  57.  
  58.     printf("Opcion: ");
  59.     scanf("%c", &x);
  60.  
  61.     if(isdigit(x) > 0)
  62.     {
  63.         x = atoi(&x);
  64.     }
  65.  
  66.     return x;
  67. }
  68.  
  69. void Codificar(const char alfabeto[], int tam1, const char alfabetoCodificado[], int tam2)
  70. {
  71.     int i;
  72.     int j;
  73.     int v = 0;
  74.     char textoDecodificado[20] = {""};
  75.     char textocodificado[20] = {""};
  76.     printf("Inserte la palabra a codificar:\n");
  77.     printf("\nPalabra: ");
  78.     scanf("%s", textoDecodificado);
  79.  
  80.     for(i = 0; textoDecodificado[i] != '\0'; i++)
  81.     {
  82.         for(j = 0; j < TAM; j++)
  83.         {
  84.             if(tolower(textoDecodificado[i]) == alfabeto[j])
  85.             {
  86.                 textocodificado[i] = alfabetoCodificado[j];
  87.                 v = 1;
  88.                 break;
  89.             }
  90.         }
  91.  
  92.         if(v == 0)
  93.         {
  94.             textocodificado[i] = textoDecodificado[i];
  95.         }
  96.         v = 0;
  97.     }
  98.  
  99.     printf("\nCodificacion: %s\n\n", textocodificado);
  100.     system("PAUSE");
  101.  
  102. }
  103.  
  104. void Decodificar(const char alfabeto[], int tam1, const char alfabetoCodificado[], int tam2)
  105. {
  106.     int i;
  107.     int j;
  108.     int v = 0;
  109.     char textoCodificado[20] = {""};
  110.     char textodecodificado[20] = {""};
  111.     printf("Inserte la palabra a decodificar:\n");
  112.     printf("\nPalabra codificada: ");
  113.     scanf("%s", textoCodificado);
  114.  
  115.     for(i = 0;  textoCodificado[i] != '\0'; i++)
  116.     {
  117.         for(j = 0; j < TAM; j++)
  118.         {
  119.             if(textoCodificado[i] == alfabetoCodificado[j])
  120.             {
  121.                 textodecodificado[i] = alfabeto[j];
  122.                 v = 1;
  123.                 break;
  124.             }
  125.         }
  126.  
  127.         if(v == 0)
  128.         {
  129.             textodecodificado[i] = textoCodificado[i];
  130.         }
  131.         v = 0;
  132.     }
  133.  
  134.     printf("\nDecodificacion: %s\n", textodecodificado);
  135.     system("PAUSE");
  136. }
  137.  
Título: Re:Reto basico
Publicado por: Mithos en Noviembre 13, 2014, 12:48:39 am
Qué raro tu código stakewinner, me marca error en la declaración de las cadenas, no había visto una declaración así, al igual que tampoco sabía que la palabra reservada auto se podía utilizar de esa manera, pero igual que la declaración de la cadena tampoco me compila, cuál es la explicación?

Un saludo...
Título: Re:Reto basico
Publicado por: stakewinner00 en Noviembre 13, 2014, 04:58:14 pm
@Mithos

Sabiendo que alguien vendría con ese comentario cuando publique el code añadí "//g++ main.cpp -o main -std=c++11" si te fijas el "-std=c++11" básicamente le dice el compilador que estándar seguir y en este caso le digo que use el estándar del C++11 que añade los bucles for con los ":" (dos puntos) la variable auto para usarse de esa forma y las declaraciones con {} entre otras cosas.

El bucle for de C++11 esta optimizado para recorrer posiciones de un array, vector, o lo que sea. Las declaraciones con {} son más restrictivas, por ejemplo puedes compilar int a = 1.3; (a valdrá 1) pero si intentas compilar int a {1.3} dará un error ya que 1.3 no es un int sino float.

La variable auto es interesante para tener un código más flexible, como lo evalúa en tiempo de compilación no pierde velocidad en el run-time. En este caso quizás era algo inútil pero lo hace más didáctico.

También hace falta decir que no todos los compiladores soportan totalmente C++11 pero estas dos cosas que use de C++11 si que lo soportan prácticamente todos.

Saludos
Título: Re:Reto basico
Publicado por: Mithos en Noviembre 15, 2014, 12:50:26 am
Oh!, ya veo, pues te ha quedado bastante bonito el código, la verdad en ningún libro había leído antes que se pudiera hacer todo eso. Gracias por publicarlo, de lo contrario no sé cómo o hasta cuándo me enteraría de ello jeje...