[英]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:在经过广泛讨论后让程序运行后,我们能够确定发布的代码包含以下错误:
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;cout << b
causes undefined behavior , because b
is not initialized (and might not even contain a null terminating character).cout << b
导致未定义行为,因为b
未初始化(甚至可能不包含空终止字符)。logic
, the line temp=b[l];
logic
,行temp=b[l];
should be b[l]=temp;
b[l]=temp;
. Rotor
variables r1
, r2
, r3
are passed to the function movement
by value, not by reference or pointer. Rotor
变量r1
、 r2
、 r3
通过值传递给函数movement
,而不是通过引用或指针。 That way, any changes to these variables will not affect the corresponding variables of the function main. 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
相反,将变量r1
、 r2
和r3
按值传递给函数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.