2014-09-27 3 views
0

그래서 ROT13decoder를 만들려고 노력 중이며, 지금까지 내가 가지고있는 것입니다. 글자 중 일부만 변경되며 이유는 확실하지 않습니다. 나는 프로그래밍에 초보 다. 나는 파일을 읽고 파일을 쓰는 방법을 알아 내려고 노력하고있다. 지금까지는 그 부분이 작동하지만 네, 원본 파일의 모든 문자를 변경하지는 않으며 그 중 일부는 변경되지 않습니다. 나는 어떤 의견이라도 정말로 바르게 평가할 것이다.내 프로그램이 일부 문자 만 변경하는 이유

#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

예제의 대부분의 글자는 두 번 뒤집니다. "else"명령을 많이 추가하거나 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'; 

그래서, 당신은 두 번 인코딩 다시 같은 편지를 받고있어 (m에). 문자의 아래쪽 절반에 대해서만 인코딩이 한 번만 수행됩니다. 이것에

하나의 해결책은 다음 루프 반복과 일치하고 continue의 경우 코드의 나머지 부분을 건너 뛸 것

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

이런 일에 문을 변경하는 것입니다.

관련 문제