简体   繁体   English

我写了一个 C++ 程序来模拟 Enigma 机器。我没有得到输出

[英]I wrote a C++ program that would simulate Enigma machine.I am not getting the output

This program works till getting a string, after that it does not encrypt it.这个程序一直工作到得到一个字符串,之后它不会加密它。 I am a beginner programmer who just started to code,kindly help me I suspect,the logic part of the code is not working我是一个刚开始编码的初学者程序员,请帮助我我怀疑,代码的逻辑部分不起作用

{
  void logic(int l,char a[],char b[],Rotor r1,Rotor r2,Rotor r3);
}

and for the cryptic text I used: https://nicerc.org/wp-content/uploads/2019/08/Enigma-Pringles-1.pdf对于我使用的神秘文本: https : //nicerc.org/wp-content/uploads/2019/08/Enigma-Pringles-1.pdf

Expected output:预期输出:

Enter the three Rotor arrangements(1/2/3):1 2 3
Enter the three Rotor position:a a a
Enter the String:r
The encrypted string is:n

Actual output:实际输出:

Enter the three Rotor arrangements(1/2/3):1 2 3
Enter the three Rotor position:a a a
Enter the String:r
The encrypted string is:

Code:代码:

#include<iostream>


using namespace std;
class Rotor
{
    public:
    char r[26][3];
    Rotor(int m,char ch);

};

void movement(Rotor r1,Rotor r2,Rotor r3,int l)
{
   //for rotor1
   int k,i;
   k=1;
   for(i=0;i<26;i++)
   {
       if (i==25)
       {
           r1.r[i][1]=r1.r[0][1];
       }
       else
       {
           r1.r[i][1]=r1.r[i+1-k][1];
           k=0;
       }
    //for rotor2
    if(l%26==0 && l!=0)
    {
        for(i=0;i<26;i++)
        {
            if(i==25)
            {
                r2.r[i][1]=r2.r[0][1];
            }
            else
            {
                r2.r[i][1]=r2.r[i+1][1];
            }

        }
    }
    //for rotor3
    if(l%676==0 && l!=0)
    {
        for(i=0;i<26;i++)
        {
            if(i==25)
            {
                r3.r[i][1]=r3.r[0][1];
            }
            else
            {
                r3.r[i][1]=r3.r[i+1][1];
            }

        }
    }


   }
}


void logic(int l,char a[],char b[],Rotor r1,Rotor r2,Rotor r3);

int main()
{
  int m,n,o;
  char ch1,ch2,ch3;
  cout<<"Enter the three Rotor arrangements(1/2/3):";
  cin>>m>>n>>o;
  cout<<"Enter the three Rotor position:";
  cin>>ch1>>ch2>>ch3;
  Rotor r1(m,ch1);
  Rotor r2(n,ch2);
  Rotor r3(o,ch3);
    int p;
  if(m<n && n<o)
  {
     p=1;
  }
  else if(m<o && o<n)
  {
     p=2;
  }
  else if(n<m && m<o)
  {
     p=3;
  }
  else if(n<o && o<m)
  {
     p=4;
  }
  else if(o<n && n<m)
  {
     p=5;
  }
   else if(o<m && m<n)
  {
     p=6;
  }
  char a[500],b[500];
cout<<"Enter the String:";
cin>>a;
int l;
for(l=0;a[l]!='\0';l++)
{
    if(p==1)
    {
        logic(l,a,b,r1,r2,r3);
        movement(r1,r2,r3,l);
    }
    else if(p==2)
    {
        logic(l,a,b,r1,r3,r2);
        movement(r1,r3,r2,l);
    }
     else if(p==3)
    {
        logic(l,a,b,r2,r1,r3);
        movement(r2,r1,r3,l);
    }
     else if(p==4)
    {
        logic(l,a,b,r2,r3,r1);
        movement(r2,r3,r1,l);
    }
     else if(p==5)
    {
        logic(l,a,b,r3,r2,r1);
        movement(r3,r2,r1,l);
    }
     else if(p==6)
    {
        logic(l,a,b,r3,r1,r2);
        movement(r3,r1,r2,l);
    }


}
cout<<b;



return 0;


}

Rotor::Rotor(int m,char ch)  //constructor
{
    if(m==1)
    {
      char r[26][3]=
    {
      'a','c','b','d','c','e','d','a','e','b','f','g','g','i',
      'h','f','i','h','j','l','k','j','l','m','m','o','n','k',
      'o','r','p','n','q','t','r','u','s','p','t','q','u','w',
      'v','s','w','v','x','z','y','x','z','y'
    };
    int i,j,d;
    for(i=0;i<26;i++)
    {
        if(r[i][1]==ch)
        break;
    }
    for(j=0;j<26;j++)
    {
        d=(j+i)%26;
        r[j][1]=r[d][1];
    }

    }
    else if(m==2)
    {
       char r[26][3]=
    {
     'a','b','b','a','c','d','d','e','e','f','f','c','g','i',
      'h','g','i','h','j','l','k','m','l','j','m','k','n','o',
      'o','n','p','q','q','r','r','p','s','u','t','s','u','t',
      'v','y','w','z','x','v','y','w','z','x'
    };
    int i,j,d;
    for(i=0;i<26;i++)
    {
        if(r[i][1]==ch)
        break;
    }
    for(j=0;j<26;j++)
    {
        d=(j+i)%26;
        r[j][1]=r[d][1];
    }
    }
    else if(m==3)
    {
       char r[26][3]=
    {
      'a','d','b','a','c','b','d','g','e','h','f','c','g','e',
      'h','f','i','j','j','i','k','l','l','k','m','p','n','m',
      'o','n','p','o','q','s','r','t','s','q','t','r','u','x',
      'v','y','w','z','x','u','y','v','z','w'
    };
    int i,j,d;
    for(i=0;i<26;i++)
    {
        if(r[i][1]==ch)
        break;
    }
    for(j=0;j<26;j++)
    {
        d=(j+i)%26;
        r[j][1]=r[d][1];
    }

    }
}
void logic(int l,char a[],char b[],Rotor r1,Rotor r2,Rotor r3)
{
   char temp=a[l];
   switch(temp)//Rotor 1
   {
       case 'a':
           temp=r1.r[0][1];
           break;
       case 'b':
           temp=r1.r[1][1];
           break;
       case 'c':
           temp=r1.r[2][1];
           break;
       case 'd':
           temp=r1.r[3][1];
           break;
       case 'e':
           temp=r1.r[4][1];
           break;
       case 'f':
           temp=r1.r[5][1];
           break;
       case 'g':
           temp=r1.r[6][1];
           break;
       case 'h':
           temp=r1.r[7][1];
           break;
       case 'i':
           temp=r1.r[8][1];
           break;
       case 'j':
           temp=r1.r[9][1];
           break;
       case 'k':
           temp=r1.r[10][1];
           break;
       case 'l':
           temp=r1.r[11][1];
           break;
       case 'm':
           temp=r1.r[12][1];
           break;
       case 'n':
           temp=r1.r[13][1];
           break;
       case 'o':
           temp=r1.r[14][1];
           break;
       case 'p':
           temp=r1.r[15][1];
           break;
       case 'q':
           temp=r1.r[16][1];
           break;
       case 'r':
           temp=r1.r[17][1];
           break;
       case 's':
           temp=r1.r[18][1];
           break;
       case 't':
           temp=r1.r[19][1];
           break;
       case 'u':
           temp=r1.r[20][1];
           break;
       case 'v':
           temp=r1.r[21][1];
           break;
       case 'w':
           temp=r1.r[22][1];
           break;
       case 'x':
           temp=r1.r[23][1];
           break;
       case 'y':
           temp=r1.r[24][1];
           break;
       case 'z':
           temp=r1.r[25][1];
           break;
   }
   switch(temp)//Rotor 2
   {
       case 'a':
           temp=r2.r[0][1];
           break;
       case 'b':
           temp=r2.r[1][1];
           break;
       case 'c':
           temp=r2.r[2][1];
           break;
       case 'd':
           temp=r2.r[3][1];
           break;
       case 'e':
           temp=r2.r[4][1];
           break;
       case 'f':
           temp=r2.r[5][1];
           break;
       case 'g':
           temp=r2.r[6][1];
           break;
       case 'h':
           temp=r2.r[7][1];
           break;
       case 'i':
           temp=r2.r[8][1];
           break;
       case 'j':
           temp=r2.r[9][1];
           break;
       case 'k':
           temp=r2.r[10][1];
           break;
       case 'l':
           temp=r2.r[11][1];
           break;
       case 'm':
           temp=r2.r[12][1];
           break;
       case 'n':
           temp=r2.r[13][1];
           break;
       case 'o':
           temp=r2.r[14][1];
           break;
       case 'p':
           temp=r2.r[15][1];
           break;
       case 'q':
           temp=r2.r[16][1];
           break;
       case 'r':
           temp=r2.r[17][1];
           break;
       case 's':
           temp=r2.r[18][1];
           break;
       case 't':
           temp=r2.r[19][1];
           break;
       case 'u':
           temp=r2.r[20][1];
           break;
       case 'v':
           temp=r2.r[21][1];
           break;
       case 'w':
           temp=r2.r[22][1];
           break;
       case 'x':
           temp=r2.r[23][1];
           break;
       case 'y':
           temp=r2.r[24][1];
           break;
       case 'z':
           temp=r2.r[25][1];
           break;
   }
   switch(temp)//Rotor 3
   {
       case 'a':
           temp=r3.r[0][1];
           break;
       case 'b':
           temp=r3.r[1][1];
           break;
       case 'c':
           temp=r3.r[2][1];
           break;
       case 'd':
           temp=r3.r[3][1];
           break;
       case 'e':
           temp=r3.r[4][1];
           break;
       case 'f':
           temp=r3.r[5][1];
           break;
       case 'g':
           temp=r3.r[6][1];
           break;
       case 'h':
           temp=r3.r[7][1];
           break;
       case 'i':
           temp=r3.r[8][1];
           break;
       case 'j':
           temp=r3.r[9][1];
           break;
       case 'k':
           temp=r3.r[10][1];
           break;
       case 'l':
           temp=r3.r[11][1];
           break;
       case 'm':
           temp=r3.r[12][1];
           break;
       case 'n':
           temp=r3.r[13][1];
           break;
       case 'o':
           temp=r3.r[14][1];
           break;
       case 'p':
           temp=r3.r[15][1];
           break;
       case 'q':
           temp=r3.r[16][1];
           break;
       case 'r':
           temp=r3.r[17][1];
           break;
       case 's':
           temp=r3.r[18][1];
           break;
       case 't':
           temp=r3.r[19][1];
           break;
       case 'u':
           temp=r3.r[20][1];
           break;
       case 'v':
           temp=r3.r[21][1];
           break;
       case 'w':
           temp=r3.r[22][1];
           break;
       case 'x':
           temp=r3.r[23][1];
           break;
       case 'y':
           temp=r3.r[24][1];
           break;
       case 'z':
           temp=r3.r[25][1];
           break;
   }
   //REFLECTOR
   switch(temp)
   {

       case 'a':
           temp='e';
           break;
       case 'b':
           temp='d';
           break;
       case 'c':
           temp='h';
           break;
       case 'd':
           temp='b';
           break;
       case 'e':
           temp='a';
           break;
       case 'f':
           temp='i';
           break;
       case 'g':
           temp='l';
           break;
       case 'h':
           temp='c';
           break;
       case 'i':
           temp='f';
           break;
       case 'j':
           temp='m';
           break;
       case 'k':
           temp='o';
           break;
       case 'l':
           temp='g';
           break;
       case 'm':
           temp='j';
           break;
       case 'n':
           temp='s';
           break;
       case 'o':
           temp='k';
           break;
       case 'p':
           temp='r';
           break;
       case 'q':
           temp='u';
           break;
       case 'r':
           temp='p';
           break;
       case 's':
           temp='n';
           break;
       case 't':
           temp='w';
           break;
       case 'u':
           temp='q';
           break;
       case 'v':
           temp='y';
           break;
       case 'w':
           temp='t';
           break;
       case 'x':
           temp='z';
           break;
       case 'y':
           temp='v';
           break;
       case 'z':
           temp='x';
           break;
   }
    switch(temp)//Rotor 3
   {
       case 'a':
           temp=r3.r[0][1];
           break;
       case 'b':
           temp=r3.r[1][1];
           break;
       case 'c':
           temp=r3.r[2][1];
           break;
       case 'd':
           temp=r3.r[3][1];
           break;
       case 'e':
           temp=r3.r[4][1];
           break;
       case 'f':
           temp=r3.r[5][1];
           break;
       case 'g':
           temp=r3.r[6][1];
           break;
       case 'h':
           temp=r3.r[7][1];
           break;
       case 'i':
           temp=r3.r[8][1];
           break;
       case 'j':
           temp=r3.r[9][1];
           break;
       case 'k':
           temp=r3.r[10][1];
           break;
       case 'l':
           temp=r3.r[11][1];
           break;
       case 'm':
           temp=r3.r[12][1];
           break;
       case 'n':
           temp=r3.r[13][1];
           break;
       case 'o':
           temp=r3.r[14][1];
           break;
       case 'p':
           temp=r3.r[15][1];
           break;
       case 'q':
           temp=r3.r[16][1];
           break;
       case 'r':
           temp=r3.r[17][1];
           break;
       case 's':
           temp=r3.r[18][1];
           break;
       case 't':
           temp=r3.r[19][1];
           break;
       case 'u':
           temp=r3.r[20][1];
           break;
       case 'v':
           temp=r3.r[21][1];
           break;
       case 'w':
           temp=r3.r[22][1];
           break;
       case 'x':
           temp=r3.r[23][1];
           break;
       case 'y':
           temp=r3.r[24][1];
           break;
       case 'z':
           temp=r3.r[25][1];
           break;
   }
   switch(temp)//Rotor 2
   {
       case 'a':
           temp=r2.r[0][1];
           break;
       case 'b':
           temp=r2.r[1][1];
           break;
       case 'c':
           temp=r2.r[2][1];
           break;
       case 'd':
           temp=r2.r[3][1];
           break;
       case 'e':
           temp=r2.r[4][1];
           break;
       case 'f':
           temp=r2.r[5][1];
           break;
       case 'g':
           temp=r2.r[6][1];
           break;
       case 'h':
           temp=r2.r[7][1];
           break;
       case 'i':
           temp=r2.r[8][1];
           break;
       case 'j':
           temp=r2.r[9][1];
           break;
       case 'k':
           temp=r2.r[10][1];
           break;
       case 'l':
           temp=r2.r[11][1];
           break;
       case 'm':
           temp=r2.r[12][1];
           break;
       case 'n':
           temp=r2.r[13][1];
           break;
       case 'o':
           temp=r2.r[14][1];
           break;
       case 'p':
           temp=r2.r[15][1];
           break;
       case 'q':
           temp=r2.r[16][1];
           break;
       case 'r':
           temp=r2.r[17][1];
           break;
       case 's':
           temp=r2.r[18][1];
           break;
       case 't':
           temp=r2.r[19][1];
           break;
       case 'u':
           temp=r2.r[20][1];
           break;
       case 'v':
           temp=r2.r[21][1];
           break;
       case 'w':
           temp=r2.r[22][1];
           break;
       case 'x':
           temp=r2.r[23][1];
           break;
       case 'y':
           temp=r2.r[24][1];
           break;
       case 'z':
           temp=r2.r[25][1];
           break;
   }
   switch(temp)//Rotor 1
   {
       case 'a':
           temp=r1.r[0][1];
           break;
       case 'b':
           temp=r1.r[1][1];
           break;
       case 'c':
           temp=r1.r[2][1];
           break;
       case 'd':
           temp=r1.r[3][1];
           break;
       case 'e':
           temp=r1.r[4][1];
           break;
       case 'f':
           temp=r1.r[5][1];
           break;
       case 'g':
           temp=r1.r[6][1];
           break;
       case 'h':
           temp=r1.r[7][1];
           break;
       case 'i':
           temp=r1.r[8][1];
           break;
       case 'j':
           temp=r1.r[9][1];
           break;
       case 'k':
           temp=r1.r[10][1];
           break;
       case 'l':
           temp=r1.r[11][1];
           break;
       case 'm':
           temp=r1.r[12][1];
           break;
       case 'n':
           temp=r1.r[13][1];
           break;
       case 'o':
           temp=r1.r[14][1];
           break;
       case 'p':
           temp=r1.r[15][1];
           break;
       case 'q':
           temp=r1.r[16][1];
           break;
       case 'r':
           temp=r1.r[17][1];
           break;
       case 's':
           temp=r1.r[18][1];
           break;
       case 't':
           temp=r1.r[19][1];
           break;
       case 'u':
           temp=r1.r[20][1];
           break;
       case 'v':
           temp=r1.r[21][1];
           break;
       case 'w':
           temp=r1.r[22][1];
           break;
       case 'x':
           temp=r1.r[23][1];
           break;
       case 'y':
           temp=r1.r[24][1];
           break;
       case 'z':
           temp=r1.r[25][1];
           break;
   }
   temp=b[l];

}

After getting the program to work after an extensive disucssion, we were able to determine that the posted code contains the following bugs:在经过广泛讨论后让程序运行后,我们能够确定发布的代码包含以下错误:

  1. In the constructor Rotor::Rotor , a local variable r is declared, which then shadows the member variable r .在构造函数Rotor::Rotor ,声明了一个局部变量r ,然后它隐藏了成员变量r This means that the constructor does not initialize its member variable in any way;这意味着构造函数不会以任何方式初始化其成员变量; it only initializes its local variable.它只初始化它的局部变量。 This was not intended.这不是故意的。 Also, the array has 26 * 3 elements, which is 78. However, only 52 of these elements are being initialized.此外,该数组有 26 * 3 个元素,即 78 个。但是,这些元素中只有 52 个被初始化。
  2. As pointed out by someone else in the comments section, the line cout << b causes undefined behavior , because b is not initialized (and might not even contain a null terminating character).正如其他人在评论部分指出的那样,行cout << b导致未定义行为,因为b未初始化(甚至可能不包含空终止字符)。
  3. In the function logic , the line temp=b[l];在函数logic ,行temp=b[l]; should be b[l]=temp;应该是b[l]=temp; . .
  4. The Rotor variables r1 , r2 , r3 are passed to the function movement by value, not by reference or pointer. Rotor变量r1r2r3通过值传递给函数movement ,而不是通过引用或指针。 That way, any changes to these variables will not affect the corresponding variables of the function main.这样,对这些变量的任何更改都不会影响函数 main 的相应变量。 However, it was intended that they should be affected.然而,他们的意图是受到影响。 Therefore, they should be passed by reference or by pointer instead.因此,它们应该通过引用或指针传递。

In contrast to the function movement , it is acceptable to pass the variables r1 , r2 and r3 to the function logic by value, because the functions does not modify these variables.与函数movement相反,将变量r1r2r3按值传递给函数logic是可以接受的,因为函数不会修改这些变量。 However, passing these variables by value is highly inefficient, since these variables each have a size of 78 bytes, so 234 bytes in total.然而,按值传递这些变量是非常低效的,因为这些变量每个都有 78 个字节的大小,所以总共 234 个字节。 That means that these 234 bytes must be copied every time the function logic is called.这意味着每次调用函数logic都必须复制这 234 个字节。 This copying would not be necessary if these variables were passed by reference or by pointer.如果这些变量是通过引用或指针传递的,则不需要这种复制。 Therefore, I would recommend passing these variables by const reference or const pointer instead.因此,我建议改为通过const引用或const指针传递这些变量。 This still ensures that the original variables are not modified, while not requiring a copy to be made.这仍然确保原始变量不会被修改,同时不需要进行复制。

Also, the excessively long switch statements in the function logic are unnecessary.此外,函数logic中过长的switch语句也是不必要的。 The first switch statement can be simplified to the following:第一个switch语句可以简化为以下内容:

temp = r1.r[temp-'a'][1];

This trick only works if the characters are stored consecutively in the character set.这个技巧只有在字符连续存储在字符集中时才有效。 This is the case with ASCII and most other character sets. ASCII 和大多数其他字符集就是这种情况。 However, I believe that the C++ standard itself does not require that the characters be stored consecutively in the character table.但是,我认为 C++ 标准本身并不要求字符连续存储在字符表中。 But virtually all platforms do this.但几乎所有平台都这样做。 So it is rather safe to use this trick.所以使用这个技巧是相当安全的。

Also, the "REFLECTOR" switch statement can be shortened to the following two lines:此外,“REFLECTOR”开关语句可以缩短为以下两行:

const char reflector_map[] = "edhbailcfmogjskrupnwqytzvx";
temp = reflector_map[temp-'a'];

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 我在 C++ 程序中没有得到正确的输出? - I am not getting the proper output in C++ program? 使用DEV-C ++编译器的C ++,我编写了一个将摄氏温度转换为华氏温度的程序,但方程式不断出错 - C++ using DEV-C++ compiler and I wrote a program to convert from Celsius to Fahrenheit but I keep getting error in equation C ++:我没有得到正确的输出(菜鸟问题) - c++: I am not getting the right output (Noob Question) 我的C ++程序出现错误 - I am getting errors in my C++ program 我的“ Hello World” C ++程序出现5个错误 - I am getting 5 errors in my “hello world” C++ program 我在 c++ 程序中遇到 bad_alloc 错误 - I am getting bad_alloc error in c++ program 我没有得到想要的 output 反向数字代码 C++ - I am not getting desired output in reverse a number code in C++ 如何模拟我使用Windows套接字在C ++中编写的客户端服务器应用程序? - How to simulate a client server application I wrote in c++ using windows sockets? 我如何确保在我的 C++ 程序中所需的头文件安装在用户的机器上? - How would I make sure that the needed headers required in my C++ program are installed on the user's machine? 为什么我没有获得所需程序的输出? - why i am not getting the output for the required program?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM