Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: AlucardDracula en 15 Diciembre 2013, 11:57 am



Título: Duda N00b de como separar una serie de casos
Publicado por: AlucardDracula en 15 Diciembre 2013, 11:57 am
Bueno antes de todo decir que soy bastante nuevo en esto de la programación pero me esta gustando  ;D

Y sobre el problema, lo que quiero hacer es un pequeño y simple programa de criptografia en el que la entrada seria consistiria en una secuencia de casos separada con una linia en blanco:
Cada caso tendria 3 partes:

· Una linia con una traducción de 26 caracteres diferentes seguidos (todos diferentes de ' ' y '_' ). Que corresponderian a 'a', 'b' ... 'z'.
· Un natural positivo  n en una linia
·  n linias de texto criptografiado.

Ya tengo hecha la esencia del problema que es que te lo traduzca correctamente, el problema lo tengo en el formato de las salidas me salen todas pegadas. He intentado poner couts << endl; pero para que no me los leyera  :huh:

Una imagen con los formatos de entrada/salida:
http://gyazo.com/7fe40419fa513770e86aba884d0089cb.png

Y mi codigo:
http://pastebin.com/yf02Z7tN

PD: Soy nuevo en el foro por lo que si he hecho algo mal, avisadmelo  :)


Título: Re: Duda N00b de como separar una serie de casos
Publicado por: AlucardDracula en 15 Diciembre 2013, 21:03 pm
Nadie?  :huh:


Título: Re: Duda N00b de como separar una serie de casos
Publicado por: ivancea96 en 15 Diciembre 2013, 21:39 pm
En la imagen, no me explicas nada. Son 1 o 2 entradas diferentes?

Has probado a poner cout << endl << endl;? Quizás es lo que buscas.



PD:Se dice linea, no linia. Por favor, revisa lo que escribiste antes de postear, tienes muchas faltas. Usa signos de puntuación por favor.


Título: Re: Duda N00b de como separar una serie de casos
Publicado por: AlucardDracula en 16 Diciembre 2013, 15:57 pm
En la imagen, no me explicas nada. Son 1 o 2 entradas diferentes?

Has probado a poner cout << endl << endl;? Quizás es lo que buscas.



PD:Se dice linea, no linia. Por favor, revisa lo que escribiste antes de postear, tienes muchas faltas. Usa signos de puntuación por favor.

Pueden entrar tantas entradas como el usuario quiera. Osea cada vez que entre un diccionario, el vector con los 26 caracteres  le seguirá el numero de lineas y luego cada linea con el texto a traducir. Luego de traducirlas se puede ingresar otro diccionario y continuar el proceso. Si ya no se quieren ingresar más diccionarios se interrumpe el programa.

Acabo de probar lo del doble endl pero sigue sin funcionar, lo que me acabo de dar cuenta es que nunca pasa de la primera linea que tiene que traducir, es decir, nunca sale del while, se queda esperando por eso que no me funcionaban los couts. ¿Alguna idea de como podría hacer para poner la condición para decirle que ya ha acabado una linea y que debe recibir la siguiente?


Título: Re: Duda N00b de como separar una serie de casos
Publicado por: ivancea96 en 16 Diciembre 2013, 19:00 pm
Aquí corregí el código:

Código
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. using namespace std;
  5.  
  6. const int MAX = 'z' - 'a' + 1;
  7.  
  8. int cript(const vector<char>& Dic, char c) {
  9.  
  10.    for (int i = 0; i < MAX; ++i)
  11.        if (c == Dic[i]) return i;
  12.  
  13.    return 0;
  14.  
  15. }
  16.  
  17. int main() {
  18.  
  19.    vector<char> Dic(MAX);
  20.  
  21.    while (true) {
  22.        cout << "Ponga el diccionario:" << endl << " - ";
  23.        for (int i = 0; i < MAX; ++i) cin >> Dic[i];
  24.        int cas;
  25.        cout << "Ponga numero de lineas:" << endl << " - ";
  26.        cin >> cas;
  27.  
  28.        for (int i = 0; i < cas; ++i) {
  29.  
  30.            string c;
  31.  
  32.            cin >> c;
  33.                for(int j=0; j<c.length(); j++)
  34.                    if (c[j] == '_') cout << " ";
  35.                    else {
  36.                        int k = cript(Dic, c[j]);
  37.                        cout << char(k+ 'a');
  38.                }
  39.  
  40.            cout << endl;
  41.        }
  42.        cout << endl;
  43.    }
  44. }

Puse un par de couts explicando lo que pid een cada caso. Ahora te explico:

Tenías un "while(cin << c)". Eso hacía que no saliera del ciclo, y continuaba pidiendo caracteres.
Te convertí 'c' e un string, y lo cambié un poco.

Tenías 1 fallo, que erradicaba en un uso obligado de otro:

Tenías: "for(int i=1;i<MAX;i++) ..."
Por ese motivo, tenias que poner "while(cin >> c[0])" Ese '0' se evita ponerlo, si le I del for la inicializas en 0. Ademásde cambiar eso, podrías quitar el while, o dejarlo como lo puse yo, para que pida infinitamente. (O lo que tu quieras)

En fin, creo que eso es todo. Suerte.


Título: Re: Duda N00b de como separar una serie de casos
Publicado por: AlucardDracula en 16 Diciembre 2013, 19:45 pm
Muchas gracias, no sabia que se podría hacer eso del While(true)   :laugh:  y sobre mi código inicializaba esa variable a 1 era para tener un equivalente al while(true) que me has indicado, es decir, "mientras pueda escribir la primera posición del vector([0]) empieza el bucle"  y como ya tenia leída esta posición empezaba el for con el 1.
Ahora me funciona todo correctamente  :xD Muchas gracias


Título: Re: Duda N00b de como separar una serie de casos
Publicado por: ivancea96 en 16 Diciembre 2013, 19:50 pm
Bueno, y una recomendación personal: Ya que es C++, aprobecha y usa las strings xd
No te obligo jaja, pero puedes evitar fallos.


Título: Re: Duda N00b de como separar una serie de casos
Publicado por: AlucardDracula en 16 Diciembre 2013, 21:06 pm
Una última duda tonta. He estado haciendo unos cuenta programas en c++ utilizando strings(no se me había ocurrido utilizarlos para este problema  :P) pero en ninguno he utilizado la librería #include <string> y los programas me funcionaban correctamente. ¿Cuando tengo que incluirla?


Título: Re: Duda N00b de como separar una serie de casos
Publicado por: ivancea96 en 16 Diciembre 2013, 21:08 pm
La String está definida en la librería estandar si no me equivoco.

Las funciones del tipo "strcat()" y cosas así, sí necesitan la <string>. (strcat es un ejemplo, pero bueno, no se si ese precisamente lo es jaja)


Título: Re: Duda N00b de como separar una serie de casos
Publicado por: AlucardDracula en 16 Diciembre 2013, 21:29 pm
Bueno creo que aun no he llegado a usar esas cosas. :P De momento solo he usado concatenación, acceder a una posición del string... vamos lo simple  :laugh:


Título: Re: Duda N00b de como separar una serie de casos
Publicado por: ivancea96 en 16 Diciembre 2013, 21:32 pm
A parte de todas las funciones y operadores que tiene una string, a grandes rasgos, una string es un array de char. (char[]).


Título: Re: Duda N00b de como separar una serie de casos
Publicado por: ivancea96 en 16 Diciembre 2013, 22:14 pm
Por cierto, si quieres simplificarlo todo, como tienes un vector<char>, podrías cambiarlo a string.
Bueno, lo digo, porque no soy de suar vectores xd