所以我做了一个程序,以Julius Ceasar的方式加密输入(将所有字母添加为常数)。
该程序似乎工作正常,直到达到z + 6障碍,此时它开始关闭将使字母变为圆形的if语句。
我无法理解为什么它会在达到这一点时停止工作。
这是我的代码:
#include <iostream>
using namespace std;
char encoded(char c, int k) {
k %= 26; //too big numbers!
c += k; //encrypt
if (c > 'z')
c = c-'z'+ 'a' -1; //circular alphabet
c = c - 'a' +'A'; //uppercase
return c;
}
int main () {
int k;
while (cin >> k) {
char c;
while (cin >> c and c != '.') {
if ('a' <= c and c <= 'z')
cout << encoded(c,k);
else if (c == '_')
cout << ' ';
else
cout << c;
}
cout << endl;
}
}
如果有人能给我一些关于发生了什么的线索,我会非常感激。
答案 0 :(得分:1)
您的问题写得不好。必须阅读整个代码,才能看到您仅针对a
和z
之间的字母调用该函数。
您似乎很怀疑将加密的字母转换为大写,但不会对已经为大写的字母进行加密。
检查main
内部(停止条件除外)而不是encoded
函数内部的范围是非常糟糕的设计。如果某个时候您意识到自己也应该转换大写字母,那么就必须同时修改main
和encoded
函数。
此外,它使函数encoded
难以重用,因为在调用它之前,您总是需要做一堆if
。
这是您在encoded
函数中应该执行的操作的伪代码:
_
,请用空格替换main
函数中删除并在while
语句块中进行测试。出于可读性考虑,最好有一个make_upper
函数,甚至还有一个rotate(char ch, int k)
函数。
之所以我不提供代码,是因为它可能是一项家庭作业,您必须付出一些努力。
答案 1 :(得分:0)
代码中的问题是您遇到了溢出问题。数据类型char
的范围可能从-128到127(取决于体系结构)。 &#39; z&#39;的ASCII码是122,所以122 + 6不是128,它是-128。
你可以解决它:
char encoded(char c, int k) {
const int len = 'z'+1-'a';
int ch = (int)c + k%len; //encrypt
if (ch > 'z')
ch = ch - len; //circular alphabet
ch = ch - 'a' +'A'; //uppercase
return (char)ch;
}
我更喜欢这个解决方案: 将您的角色转换为0到小于26的数字进行编码并将其转换回角色。
char encoded(char c, int k) {
const int len = 'z'+1-'a';
if ( c >= 'a' && c <= 'z' )
c = (c-'a' + k) % len + 'A'; // + 'A' because of toupper ( +'a' keep lower)
return c;
}