Duda N00b de como separar una serie de casos

Iniciado por AlucardDracula, 15 Diciembre 2013, 11:57 AM

0 Miembros y 3 Visitantes están viendo este tema.

AlucardDracula

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  :)


ivancea96

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.

AlucardDracula

Cita de: 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.

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?

ivancea96

Aquí corregí el código:

Código (cpp) [Seleccionar]
#include <iostream>
#include <vector>

using namespace std;

const int MAX = 'z' - 'a' + 1;

int cript(const vector<char>& Dic, char c) {

    for (int i = 0; i < MAX; ++i)
        if (c == Dic[i]) return i;

    return 0;

}

int main() {

    vector<char> Dic(MAX);

    while (true) {
        cout << "Ponga el diccionario:" << endl << " - ";
        for (int i = 0; i < MAX; ++i) cin >> Dic[i];
        int cas;
        cout << "Ponga numero de lineas:" << endl << " - ";
        cin >> cas;

        for (int i = 0; i < cas; ++i) {

            string c;

            cin >> c;
                for(int j=0; j<c.length(); j++)
                    if (c[j] == '_') cout << " ";
                    else {
                        int k = cript(Dic, c[j]);
                        cout << char(k+ 'a');
                }

            cout << endl;
        }
        cout << endl;
    }
}


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.

AlucardDracula

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

ivancea96

Bueno, y una recomendación personal: Ya que es C++, aprobecha y usa las strings xd
No te obligo jaja, pero puedes evitar fallos.

AlucardDracula

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?

ivancea96

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)

AlucardDracula

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: