所以,我正在尝试制作一个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;
}
答案 0 :(得分:4)
示例中的大多数字母都会被翻转两次。您需要添加大量'else'命令或使用switch语句。
if (c == 'a')c = 'n';
else if (c == 'b')c = 'o';
有一种更好的数学方法;但我会把它作为练习留给读者。
答案 1 :(得分:3)
您有逻辑错误。如果你从&#34; a&#34;开始第一个IF将其转换为&#34; n&#34;然后IF将其转回&#34; a&#34;。
查看switch
声明。
答案 2 :(得分:2)
你不应该在任何地方使用if
条件,因为当你有一个新行时,将检查每个条件。假设您的字符为l
,那么您的if语句会将字母更改为y
,但也会检查y
的条件,以便将字符更改回l
。所以实际上你的代码不是不改变一些字母,它正在改变它们两次。
您应该能够使用else if
来解决后续条目,以便当一个为真时,其他的不会被检查,或者您可以使用switch case
。
答案 3 :(得分:2)
用ROT13中编码的单个字母。如果你对它进行两次编码,你最终会再次使用原始字母,这使得ROT13的编码和解码几乎相同。
现在以字母&#39; a&#39;为例。您在代码中执行的操作是
if (c == 'a') c = 'n';
...
if (c == 'n') c = 'a';
因此,对于上面字母的前半部分(a到m),您将重新编码两次,再次获得相同的字母。仅对于字母的下半部分,编码只进行一次。
对此的一个解决方案是将您的陈述更改为
if (c == 'a') { c = 'n'; continue; }
如果匹配则会跳过剩下的代码,而continue
会跳过下一个循环迭代。