2012-06-13 33 views
6

Tôi đã nhận được bài tập cho lớp C++ của mình tuần trước. Tôi nghĩ một số bạn sẽ thấy nó thú vị! Tôi quản lý để có được hầu hết các mã xuống nhưng tôi bị mắc kẹt và không thể con số này ra cho cuộc sống của tôi ... Dưới đây là những hướng dẫn cho quá trình mã hóa tôi phải đưa vào mã:Mã hóa một chuỗi có ngăn xếp

Thông điệp gửi nhập từ bốn chữ cái, CCCC và một chữ cái khác gồm bốn chữ cái, XXXX.

Người gửi thư sau đó nhập thông điệp được mã hóa.

Chương trình quét thư một lần một lần và mỗi ký tự được đẩy vào ngăn xếp cho đến khi hoặc ký tự được quét có trong từ CCCC hoặc kết thúc thư là gặp phải.

Khi nhân vật quét là một trong những ký tự ở CCCC, in ấn mà char và tiếp tục in và bật các ký tự ở phía trên cùng của ngăn xếp cho đến khi một trong hai ngăn xếp rỗng hoặc char ở phía trên cùng của ngăn xếp là một trong các ký tự trong XXXX. Khi kết thúc thông báo gặp phải, hãy in ký tự ở đầu ngăn xếp và tiếp tục bật và in từ đầu ngăn xếp cho đến khi ngăn xếp trống.

Dưới đây là một gợi ý: "TỐT" "LUCK", nó "âm thanh đơn giản TO ME", hoặc như chương trình của bạn sẽ nói: "OSDNOT EEM LPMIS SU"

Vì vậy, đó là nhiệm vụ thực tế.

Những gì tôi đang gặp rắc rối với là bit cuối cùng:

Khi kết thúc thông điệp đang gặp phải, in các nhân vật ở phía trên cùng của ngăn xếp và tiếp tục bật và in từ trên xuống của ngăn xếp cho đến khi ngăn xếp trống.

tại đây là đoạn code tôi có cho đến nay:

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

Khi biên soạn, sản lượng thức mang lại cho tôi "OSDNOT", đó là trong ví dụ được cung cấp bởi giáo sư của tôi, vì vậy tôi biết tôi đang đi đúng hướng .. Bất kỳ sự trợ giúp nào cũng tuyệt vời, tôi thậm chí không biết bắt đầu kiểm tra mã ở đâu.

+0

Kiểm tra lại các khai báo của bạn cho 'word1' và' word2'. – sblom

+0

Tôi sẽ không đọc hết mã này vì nó trễ và tôi mệt, nhưng những gì tôi làm cho tất cả các bài tập về Khoa học Máy tính phức tạp của mình là: đảm bảo rằng bạn đang in tất cả các giá trị biến đang thay đổi ở mọi bước. Bằng cách đó bạn có thể thấy được vấn đề nằm ở đâu. –

+0

@sblom hmm tại sao bạn lại nói vậy? Có vẻ ổn với tôi – rcorrie

Trả lời

3

Đây là mã được sửa. Bạn đã không viết đúng thuật toán. Tôi đã nhận xét những thay đổi tôi đã thực hiện trong mã. trước hết, bạn không bật ra các yếu tố của ngăn xếp khi bạn gặp phải một nhân vật hiện diện trong CCCC trong khi quét. Ngoài ra ở phần cuối của quá trình quét, bạn không làm trống ngăn xếp. Bao gồm cstring thay vì string. Như đã chỉ ra trong các ý kiến, tuyên bố của bạn cho word1 và word2 là không chính xác.

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: Sử dụng tốt hơn std :: stack and std :: string.

+0

Hoạt động hoàn hảo! Tôi đoán đó là những gì đã xảy ra, cảm ơn rất nhiều. Vâng, giáo sư đang dạy chúng tôi về các lớp và anh ấy sử dụng nó như một cách để dạy nó. Cảm ơn một lần nữa – rcorrie

Các vấn đề liên quan