6

先週、C++ クラスの課題を受け取りました。面白いと思う方もいらっしゃると思います!私はコードのほとんどをダウンさせることができましたが、私は立ち往生していて、私の人生のためにこれを理解することはできません.以下は、コードに入れなければならない暗号化プロセスのガイドラインです:

メッセージ送信者は、4 文字の単語CCCCと別の 4 文字の単語 XXXXを入力します。

次に、メッセージの送信者は、暗号化するメッセージを入力します。プログラムは一度に 1 文字ずつメッセージをスキャンし、スキャンされた文字が単語CCCCに入るまで、またはメッセージの終わりに到達

するまで、各文字がスタックにプッシュされます。 スキャンした文字がCCCCの文字の 1 つである場合、その文字を出力し、スタックが空になるか、スタックの一番上の文字が CCCC の文字の 1 つになるまで、スタックの一番上にある文字の出力とポップを続けます。XXXX

. メッセージの終わりに到達したら、スタックの一番上に文字を出力し、スタックが空になるまで、スタックの一番上からポップして出力し続けます。

ここにヒントがあります: " GOOD " " LUCK "、それは " SOUNDS SIMPLE TO ME "、またはあなたのプログラムが言うように: " 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 」が最終出力に表示されるので、正しい道を進んでいることがわかります。コードを調べます。

4

1 に答える 1

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を使用することをお勧めします。

于 2012-06-13T04:15:04.287 に答える