以下是我的作业的链接:
用户输入和加密都很容易,但是我似乎无法解密加密。工作是输入一个字母,然后再输入十个字母(即加密),然后返回十个字母(即解密)。
我尝试弄乱for循环,但是我没有真正工作。
#include <iostream>
using namespace std;
int main()
{
char m; //Declare character
cin >> m; // Input Character
int ma = (int)m; // Convert character to integer
int c; // Declare ciphertext
for (int i=0; i<=10; i++) {
c = ma + i;
if (c > 122) {
c = 97;
}
}
char cc = char(c);
cout << " " << endl;
cout << "You ciphertext is:" << endl;
cout << cc << endl;
int cb = (int)cc;
//cb = cb - 10;
int nm;
for (int b = 0; b>=10; b++) {
nm = cb - b;
if (nm < 97) {
nm = 122;
}
}
char mb = (char)nm;
cout << "You message is" << endl;
cout << mb << endl;
}
这就是我的期望:当我输入“ a”时,密文应为“ k”,解密后的消息应为“ a”。
答案 0 :(得分:1)
您的“解密”循环永远不会执行:
for (int b = 0; b>=10; b++) {
此for循环说:从b
= 0开始,然后循环,只要它大于10。那么,0不大于10,所以没有循环。
要撤消第一个循环,您可能想要这样做:
for (int b = 0; b<=10; b++) {
顺便说一句,循环只重复相同的操作10次,因此您可以放下循环:
int OFFSET = 10;
int LOWER_LIMIT = (int)'a';
int UPPER_LIMIT = (int)'z';
int RANGE_LENGTH = UPPER_LIMIT - LOWER_LIMIT + 1;
// encrypt
c = ma + OFFSET;
if (c > UPPER_LIMIT) {
c -= RANGE_LENGTH;
}
// decrypt
nm = cb - OFFSET;
if (nm < LOWER_LIMIT) {
nm += RANGE_LENGTH;
}
答案 1 :(得分:0)
这是另一种解决方案。当您检查字符的ascii是否大于122时,您还必须执行一些数学运算。你不能只是说
if (c > 122) {
c = 97;
}
因为最后10个字符将全部转换为“ a”。
我认为加密/解密单个字符的一种更优雅的方法如下:
int main() {
char c; //Declare character
cin >> c; // Input Character
int ciphertext = c + 10;
if (ciphertext > 122)
ciphertext = ciphertext - 123 + 97;
cout << "You ciphertext is:" << (char)ciphertext << endl;
int deciphertext = ciphertext - 10;
if (deciphertext < 97)
deciphertext = 123 - (97 - deciphertext);
cout << "You original is:" << (char)deciphertext << endl;
}
请注意,如果char的ascii值超过上限,则将从字母“ a”开始计数。
答案 2 :(得分:0)
正如我在发言中所说
for (int i=0; i<=10; i++) {
c = ma + i;
if (c > 122) {
c = 97;
}
}
确实
{
int i = 10;
c = ma + i;
if (c > 122) {
c = 97;
}
}
因为重新分配了 c ,所以上一回合对当前没有影响,只有最后一个计数。
也
for (int b = 0; b>=10; b++) {
nm = cb - b;
if (nm < 97) {
nm = 122;
}
}
什么都不做,因为测试b>=10
立即为假 b 值为0
与这些错误无关,所使用的编码对于许多值均不可还原,并且对要编码的字符没有限制,它可以具有 char 支持的任何代码。
一种简单的编码和解码方式是对给定 Y ((X^Y)^Y) == X)
的任意 X 进行给定值的异或运算,因此方法相同进行编码和解码,在两种情况下都只需执行^Y
。
另一种可逆方式是在一个方向上滚动以进行编码,然后在相反方向上进行解码。警告滚动,而不是转移到不松动的位。
另一种方法是对交换一些位进行编码(例如,将较低的4位与较高的4位假定 char 至少为8位)进行编码,并进行相同的解码。 / p>
当然,您可以混合使用这些方式,而不是只使用其中一种。
当然,您可以使用一种不基于公式的方法,例如为每个字母确定一个字母来替换它(a-> Z,b-> 0等,然后反向解码)
有无数种编码/解码方式