2012-06-13 10 views
6

Ho ricevuto un incarico per la mia classe C++ la scorsa settimana. Penso che alcuni di voi lo troveranno interessante! Sono riuscito a ottenere la maggior parte del codice di giù, ma mi sono bloccato e non riesco a capire questo fuori per la vita di me ... Di seguito sono le linee guida per il processo di criptazione devo mettere in codice:Crittografia di una stringa con stack

il mittente del messaggio immette una parola di quattro lettere, CCCC e un'altra parola di quattro lettere, XXXX.

Il mittente del messaggio immette quindi il messaggio da crittografare.

Il programma analizza il messaggio uno char alla volta e ciascun carattere viene spinto in una pila finché sia il carattere esaminato è nella parola CCCC o la fine del messaggio è incontrato.

Quando il carattere esaminato è uno dei caratteri in CCCC, di stampa che char e continuano stampare e pop i caratteri in cima alla pila fino a quando la pila è vuota o char nella parte superiore della stack è uno dei caratteri in XXXX. Quando viene rilevata la fine del messaggio , stampare il carattere nella parte superiore della pila e continuare a popare e stampare dalla cima della pila fino a quando la pila è vuota.

Ecco un suggerimento: "BUONA" "FORTUNA", essa "Sembra semplice A ME", o come vostro programma direbbe: "OSDNOT EEM LPMIS SU"

Quindi questo è l'incarico vero e proprio.

Quello che sto avendo difficoltà con è l'ultimo bit:

Quando viene rilevato alla fine del messaggio , stampare il carattere in cima allo stack e continuare a pop e stampare dall'alto della pila fino a quando la pila è vuota.

Ora qui è il codice che ho finora:

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

Quando compilato, il risultato finale mi dà "OSDNOT", che è nell'esempio fornito dal mio professore, quindi so che sto andando giù nella giusta direzione .. Qualsiasi aiuto sarebbe grande, non so nemmeno da dove cominciare a esaminare il codice.

+0

Controlla le dichiarazioni per 'word1' e' word2'. – sblom

+0

Non leggerò tutto questo codice perché è tardi e sono stanco, ma quello che farei per tutti i miei compiti complessi di Informatica è: assicurati di stampare tutti i valori delle variabili che stanno cambiando ad ogni passo. In questo modo puoi vedere dove si trova il problema. –

+0

@sblom hmm perché lo dici? Mi sta bene – rcorrie

risposta

3

Ecco il codice corretto. Non hai codificato correttamente l'algoritmo. Ho commentato le modifiche che ho apportato nel codice. Prima di tutto, non hai mostrato gli elementi dello stack quando hai incontrato un personaggio presente in CCCC durante la scansione. Inoltre, alla fine della scansione, non hai svuotato la pila. Includere cstring anziché string. Come indicato nei commenti, la tua dichiarazione per word1 e word2 non è corretta.

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: utilizzare meglio std :: stack e std :: string.

+0

Funziona perfettamente! Ho pensato che fosse quello che stava succedendo, grazie molte. Sì, il professore ci insegna le classi e usa questo come un modo per insegnarlo. Grazie ancora – rcorrie