2014-09-27 56 views
0

因此,我正在嘗試製作一個ROT13解碼器,而這正是我目前爲止所做的。只有一些字母改變,但我不知道爲什麼。我對編程非常陌生。我只是想弄清楚如何讀入文件,並寫入文件。到目前爲止,該部分的作品,但是它並沒有改變原始文件中的所有字母,只是其中的一部分。我真的很感激任何反饋。爲什麼我的程序只改變了一些字母

#include <iostream> 
#include <fstream> 
//the letters in the secretMessage file are "Lbh unir gb fgnl va funcr. Zl tenaqzbgure, fur fgnegrq jnyxvat svir zvyrf n qnl jura fur jnf 60. Fur’f 97 gbqnl naq jr qba’g xabj jurer gur uryy fur vf 
// 
// 
//and this is what it outputs to the decodedMessage file "Lbh haie gb fgal ia fhace. Ml geaadmbghee, fhe fgaeged jalkiag fiie milef a dal jhea fhe jaf 60. Fhe’f 97 gbdal aad je dba’g kabj jheee ghe hell fhe if. 

using namespace std; 


int main(){ 
    ofstream fout; 
    ifstream fin; 
    fin.open("secretMessage.txt"); 
    fout.open("decodedMessage.txt"); 


    char c = 0; 



    while (!fin.eof()){ 
     c = fin.get(); 
     if (c == 'a')c = 'n'; 
     if (c == 'b')c = 'o'; 
     if (c == 'c')c = 'p'; 
     if (c == 'd')c = 'q'; 
     if (c == 'e')c = 'r'; 
     if (c == 'f')c = 's'; 
     if (c == 'g')c = 't'; 
     if (c == 'h')c = 'u'; 
     if (c == 'i')c = 'v'; 
     if (c == 'j')c = 'w'; 
     if (c == 'k')c = 'x'; 
     if (c == 'l')c = 'y'; 
     if (c == 'm')c = 'z'; 
     if (c == 'n')c = 'a'; 
     if (c == 'o')c = 'b'; 
     if (c == 'p')c = 'c'; 
     if (c == 'q')c = 'd'; 
     if (c == 'r')c = 'e'; 
     if (c == 's')c = 'f'; 
     if (c == 't')c = 'g'; 
     if (c == 'u')c = 'h'; 
     if (c == 'v')c = 'i'; 
     if (c == 'w')c = 'j'; 
     if (c == 'x')c = 'k'; 
     if (c == 'y')c = 'l'; 
     if (c == 'z')c = 'm'; 


     if (c == 'A')c = 'N'; 
     if (c == 'B')c = 'O'; 
     if (c == 'C')c = 'P'; 
     if (c == 'D')c = 'Q'; 
     if (c == 'E')c = 'R'; 
     if (c == 'F')c = 'S'; 
     if (c == 'G')c = 'T'; 
     if (c == 'H')c = 'U'; 
     if (c == 'I')c = 'V'; 
     if (c == 'J')c = 'W'; 
     if (c == 'K')c = 'X'; 
     if (c == 'L')c = 'Y'; 
     if (c == 'M')c = 'Z'; 
     if (c == 'N')c = 'A'; 
     if (c == 'O')c = 'B'; 
     if (c == 'P')c = 'C'; 
     if (c == 'Q')c = 'D'; 
     if (c == 'R')c = 'E'; 
     if (c == 'S')c = 'F'; 
     if (c == 'T')c = 'G'; 
     if (c == 'U')c = 'H'; 
     if (c == 'V')c = 'I'; 
     if (c == 'W')c = 'J'; 
     if (c == 'X')c = 'K'; 
     if (c == 'Y')c = 'L'; 
     if (c == 'Z')c = 'M'; 
     cout << c; 
     if (!fin.eof())fout << c; 
    } 


    fin.close(); 
    fout.close(); 



    return 0; 
} 

回答

4

您示例中的大多數字母將翻轉兩次。您可能需要添加大量的「其他」命令或使用switch語句。

if (c == 'a')c = 'n'; 
else if (c == 'b')c = 'o'; 

有一個更好的數學方法;但我會把它作爲練習給讀者。

3

你有一個邏輯錯誤。如果以「a」開頭,則第一個IF將其變爲「n」,隨後的IF將其變回「a」。

看看switch聲明。

2

你不應該到處使用if條件,你有一個新的行中的每個人都會進行檢查。假設你的性格是l那麼你的if語句改變信y但還檢查了y的條件,使該字符被改回l。所以實際上你的代碼不是而是改變了一些字母,它改變了他們兩次

您應該能夠使用else if爲後續條目解決此問題,以便在其中一個條件成立時其他條目不會被檢查,或者您可以使用switch case

2

以ROT13編碼的單個字母。如果將它編碼兩次,則會再次得到原始字母,這使得對ROT13進行編碼和解碼幾乎相同。

現在以例如字母'a'爲例。什麼你在你的代碼上面做的是

if (c == 'a') c = 'n'; 
... 
if (c == 'n') c = 'a'; 

因此,對於上面的字母上半年(A至M),你編碼兩次,再次收到同樣的信。僅對字母的下半部分編碼只進行一次。

一種解決方法是改變你的語句像

if (c == 'a') { c = 'n'; continue; } 

這將跳過代碼的其餘部分匹配並continue下一個循環迭代的情況下。

相關問題