#include #include #include #include using namespace std; const string FILE_NAME = "message.txt"; const size_t LETTERS = 26; const size_t TOP_COUNT = 10; // the bard const char TOP_LETTERS[TOP_COUNT] {'e','t','o','a','h','i','s','r','n','l'}; // dictioniary (wikipedia) //const char TOP_LETTERS[TOP_COUNT] {'e','s','i','a','r','n','t','o','l','c'}; // text (wikipedia) //const char TOP_LETTERS[TOP_COUNT] {'e','t','a','o','i','n','s','h','r','d'}; void ReadMessage(string & message); void FrequencyAnalysis(string message, int counts[LETTERS]); void PrintFrequencyTable(int counts[]); void Decode(string & message, int counts[]); size_t FindMax(int counts[]); void SubLetter(string message, string & newMessage, char letter, char replace); int main() { int counts[LETTERS]{}; string message; ReadMessage(message); cout << "The Message is: " << endl << endl; cout << message << endl; FrequencyAnalysis(message, counts); cout << "Frequency Analysis " << endl; PrintFrequencyTable(counts); cout << endl; Decode(message, counts); cout << "The decoded message is: " << endl << endl; cout << message << endl; cout << endl; return 0; } void ReadMessage(string & message){ ifstream messageFile; string line; message = ""; messageFile.open(FILE_NAME); getline(messageFile, line); while (messageFile) { message += line + '\n'; getline(messageFile, line); } messageFile.close(); } void PrintFrequencyTable(int counts[]){ size_t i; for(i=0;i<13;i++) { cout << setw(2) << static_cast(i+'a') << setw(5) << counts[i] << setw(5) << static_cast(i + 'a' + 13) << setw(5) << counts[i+13] << endl; } cout << endl; return; } size_t FindMax(int counts[]) { int max = 0; size_t maxPos = 0; size_t i; for(i = 0; i < LETTERS; i++) { if (counts[i] > max) { max = counts[i]; maxPos = i; } } return maxPos; } void SubLetter(string message, string & newMessage, char letter, char replace){ size_t i; for(i = 0; i < message.size(); i++) { if (static_cast(tolower(message[i]) == letter)) { if (isupper(message[i])) { newMessage[i] = static_cast(toupper(replace)); } else { newMessage[i] = replace; } } } return; } void Decode(string & message, int counts[]){ size_t pos; size_t i; char letter; string newMessage = message; for(i = 0; i< TOP_COUNT; i++) { pos = FindMax(counts); // so we don't use it again. counts[pos] = 0; letter = static_cast (pos + 'a'); cout << "Replacing " << letter << " with " << TOP_LETTERS[i] << endl; SubLetter(message, newMessage, letter, TOP_LETTERS[i]); } cout << endl; message = newMessage; return; } void FrequencyAnalysis(string message, int counts[LETTERS]){ size_t i; size_t offset; for (i = 0; i < message.size(); i++) { if (isalpha(message[i])) { offset = tolower(message[i]) - 'a'; counts[offset]++; } } return; }