2012-06-13 4 views
6

Я получил задание для своего класса C++ на прошлой неделе. Я думаю, что некоторые из вас посчитают это интересным! Мне удалось получить большую часть коды вниз, но я застрял и не могу понять это для жизни меня ... Ниже приведены рекомендации для процесса шифрования я должен поставить в код:Шифрование строки со стеком

сообщения отправителе вводит четырехбуквенное слово, CCCC и еще одно письмо с четырьмя буквами, XXXX.

Затем отправитель сообщения вводит сообщение для шифрования.

Программа сканирует сообщение один символ за один раз, и каждый символ не будет нажат в стеке, пока либо отсканированный символ в слове CCCC или конец сообщения является встречается.

Когда отсканированный символ один из символов в КЦИКЕ, печатно, что CHAR и продолжает не печатать и попы символов в верхней части стека до тех пор, как стек пусто или символа в верхней части стек является одним из символов в XXXX. Когда встретится конец сообщения , напечатайте символ в верхней части стека и продолжайте всплывать и печатайте с верхней части стека до тех пор, пока стек не станет пустым.

Вот подсказка: "ХОРОШО" "УДАЧИ", это "ЗВУЧИТ ПРОСТО МНЕ", или как ваша программа будет сказать: "OSDNOT EEM LPMIS SU"

Так что это фактическое назначение.

Что у меня возникли проблемы с это последний бит:

Когда конец сообщения встречается, печать символа в верхней части стека и продолжать поп и печать с верхней стека до тех пор, пока стек не станет пустым.

теперь вот код, который я до сих пор:

#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; 
} 

При компиляции, конечный результат дает мне «OSDNOT», который в приведенном примере моего профессора, так что я знаю «Я прохожу по правому пути .. Любая помощь будет замечательной, я даже не знаю, с чего начать изучать код.

+0

Дважды проверьте свои объявления для слов «word1» и «word2». – sblom

+0

Я не буду читать весь этот код, потому что уже поздно, и я устал, но то, что я сделаю для всех моих сложных домашних заданий в области компьютерных наук, - это: убедитесь, что вы печатаете все свои значения переменных, которые меняются на каждом шагу. Таким образом, вы можете увидеть, где проблема. –

+0

@sblom хмм, почему ты так говоришь? Это выглядит хорошо для меня – rcorrie

ответ

3

Вот скорректированный код. Вы неправильно кодировали алгоритм. Я прокомментировал изменения, внесенные мной в код. Прежде всего, вы не выталкивали элементы стека, когда вы сталкивались с символом, присутствующим в CCCC во время сканирования. Также в конце сканирования вы не очистили стек. Включить cstring вместо string. Как указано в комментариях, ваша декларация для word1 и word2 неверна.

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; 

PS: Лучше использовать std :: stack и std :: string.

+0

Работает отлично! Я понял, что это произошло, спасибо большое. Да, профессор учит нас о занятиях, и он использует это как способ научить его. Еще раз спасибо – rcorrie