2012-06-13 34 views
6

Recibí una asignación para mi clase de C++ la semana pasada. ¡Creo que algunos de ustedes lo encontrarán interesante! Logré obtener la mayor parte del código, pero estoy atascado y no puedo entender esto por mi vida ... A continuación se muestran las pautas para el proceso de encriptación que debo poner en el código:Cifrado de una cadena con una pila

El remitente del mensaje ingresa una palabra de cuatro letras, CCCC, y otra palabra de cuatro letras, XXXX.

El remitente del mensaje luego ingresa el mensaje para ser encriptado.

El programa analiza el mensaje con un carácter a la vez y cada Char es empujado en una pila hasta ya sea el carácter escaneado está en la palabra CCCC o al final del mensaje es encontrado.

Cuando el carácter analizado es uno de los caracteres de CCCC, la impresión que carbonizan y continúan para imprimir y hacer estallar los caracteres en la parte superior de la pila hasta que la pila está vacía o la carbón en la parte superior de la pila es uno de los caracteres en XXXX. Cuando se encuentra el final del mensaje , imprima el carácter en la parte superior de la pila y continúe mostrando e imprima desde la parte superior de la pila hasta que la pila esté vacía.

Aquí tiene una pista: "BUENA" "SUERTE", que "sonidos simples A MÍ", o como su programa diría: "OSDNOT EEM LPMIS SU"

Así que esa es la tarea real.

Lo que estoy teniendo problemas con es el último bit:

Cuando se encuentra al final del mensaje , imprimir el carácter en la parte superior de la pila y continuar para hacer estallar e imprimir desde la parte superior de la pila hasta que la pila esté vacía.

ahora aquí está el código que tengo hasta ahora:

#include <string> 
#include <iostream> 
using namespace std; 
class Stack 
{ 
    private: 
    char Chars[50]; 
    int top; 
    public: 
    int push(char); 
    char pop(); 
    bool isEmpty(); 
    bool isFull(); 
    Stack() 
    { 
     top = 0; 
    } 
}; 

int main() 
{ 
Stack theStack; 
    char word1[4]; 
    char word2[4]; 
    for(int i=0; i < 4; i++){ 
     word1[i] = ' '; 
     word2[i] = ' '; 
    } 
    char message[500]; 
    cout << "Please enter a 4 letter word: "; 
    cin >> word1; 
    while(word1[4] || !word1[3]) 
    { 
     cout << "Word must be 4 chars long. Try again: "; 
     cin >> word1; 
    } 
    cout << "Please enter another 4 letter word: "; 
    cin >> word2; 
    while(word2[4] || !word2[3]) 
    { 
     cout << "Word must be 4 chars long. Try again: "; 
     cin >> word2; 
    } 
    cout << "Please enter the phrase to be encrypted (50 chars max): "; 
    cin.ignore(1000, '\n'); 
    cin.getline(message,500); 
    int length = strlen(message); 
    int count = 0; 
    char finalMsg[length]; 
    //scanner 
    for(int i = 0; i < length; i++) 
    { 
     if(message[i] == word1[0] || 
     message[i] == word1[1] || 
     message[i] == word1[2] || 
     message[i] == word1[3]) 
     { 
     finalMsg[count] = message[i]; 
     count++; 
     if(message[i-1] != word2[0] || 
      message[i-1] != word2[1] || 
      message[i-1] != word2[2] || 
      message[i-1] != word2[3]) 
     { 
      finalMsg[count] = message[i-1]; 
      count++; 
     } 
     } 
     else 
     { 
     theStack.push(message[i]); 
     } 
    } 
    cout << finalMsg << endl; 
return 0; 
} 

int Stack::push(char data) 
{ 
    Chars[top] = data; 
    top++; 
return top; 
} 

char Stack::pop() 
{ 
    char ret = Chars[top-1]; 
    top--; 
return ret; 
} 

bool Stack::isEmpty() 
{ 
    if(top <= 0) 
     return true; 
    else return false; 
} 

bool Stack::isFull() 
{ 
    if(top >= 50) 
     return true; 
    else return false; 
} 

cuando se compila, el resultado final me da "OSDNOT", que es en el ejemplo proporcionado por mi profesor, así que sé que Estoy yendo por el camino correcto ... Cualquier ayuda sería genial, ni siquiera sé por dónde empezar a examinar el código.

+0

Vuelva a verificar sus declaraciones para 'word1' y' word2'. – sblom

+0

No voy a leer todo este código porque es tarde y estoy cansado, pero lo que haría por todas mis tareas complejas de Computer Science es: asegúrese de estar imprimiendo todos sus valores variables que están cambiando en cada paso. De esa forma puedes ver dónde yace el problema. –

+0

@sblom hmm ¿por qué dices eso? Me parece bien – rcorrie

Respuesta

3

Aquí está el código corregido. No codificaste el algoritmo correctamente. He comentado los cambios que he hecho en el código. en primer lugar, no sacó los elementos de la pila cuando encontró un carácter presente en CCCC durante el escaneo. También al final del escaneo, no has vaciado la pila. Incluir cstring en lugar de string. Como se señaló en los comentarios, su declaración para word1 y word2 es incorrecta.

char finalMsg[200]; 
    //scanner 
    for(int i = 0; i < length; i++) 
    { 
     if(message[i] == word1[0] || 
     message[i] == word1[1] || 
     message[i] == word1[2] || 
     message[i] == word1[3]) 
     { 
     finalMsg[count] = message[i]; 
     count++; 

     //pop out elements from the stack till it is empty or an character of XXXX is encountered 
     while(!theStack.isEmpty())  
     { 
      char tmp=theStack.pop(); 
      if(tmp==word2[0] || 
       tmp==word2[1] || 
       tmp==word2[2] || 
       tmp==word2[3]) 
       { 
        theStack.push(tmp); 
        break; 
       } 
      finalMsg[count++]=tmp; 
     } 

     } 
     else 
     { 
     theStack.push(message[i]); 
     } 
    } 

    //empty the stack 
    while(!theStack.isEmpty()) 
    { 
     finalMsg[count++]=theStack.pop(); 
    } 
    finalMsg[count++]=0; 
    cout << finalMsg << endl; 

PD: Mejor uso std :: stack y std :: string.

+0

¡Funciona a la perfección! Pensé que eso era lo que estaba pasando, muchas gracias. Sí, el profesor nos está enseñando sobre clases y lo está utilizando como una forma de enseñarlo. Gracias de nuevo – rcorrie