C++ 跳过;如果;某些输入中的语句
因此,我做了一个程序,以朱利叶斯·凯萨(Julius Cesar)的方式对输入进行加密(给所有字母加上一个常量) 该程序似乎工作正常,直到它达到z+6的障碍,在这一点上,它开始关闭将使字母表循环的if语句 我只是不明白为什么当它达到那个点时会停止工作 这是我的代码:C++ 跳过;如果;某些输入中的语句,c++,if-statement,C++,If Statement,因此,我做了一个程序,以朱利叶斯·凯萨(Julius Cesar)的方式对输入进行加密(给所有字母加上一个常量) 该程序似乎工作正常,直到它达到z+6的障碍,在这一点上,它开始关闭将使字母表循环的if语句 我只是不明白为什么当它达到那个点时会停止工作 这是我的代码: #include <iostream> using namespace std; char encoded(char c, int k) { k %= 26; //too big numbers! c
#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;
}
}
#包括
使用名称空间std;
字符编码(字符c,整数k){
k%=26;//数字太大了!
c+=k;//加密
如果(c>‘z’)
c=c-'z'+'a'-1;//循环字母表
c=c-'a'+'a';//大写
返回c;
}
int main(){
int k;
而(cin>>k){
字符c;
而(cin>>c和c!='。){
如果('a'代码中的问题是溢出。数据类型char
可能在-128到127之间(取决于体系结构)。ASCII代码'z'是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;
}
char编码(char c,int k){
常数int len='z'+1-'a';
如果(c>='a'&&c您的问题写得很糟糕。您必须阅读整个代码,才能看到您仅针对a
和z
之间的字母调用该函数
您可能会将加密的字母转换为大写,但不会对已经是大写的字母进行加密,这似乎非常可疑
检查main
(停止条件除外)内的范围而不是encoded
函数内的范围是一种非常糟糕的设计。如果在某个时候,您意识到您应该也转换大写字母,那么您必须修改main
和encoded
函数
此外,它使函数encoded
很难重用,因为在调用它之前,您总是需要执行一系列if
这是一个伪代码,用于说明在encoded
函数中应该执行的操作:
- 若字母是小写的,那个么先将其改为大写(这样输入中的大写字母也会被编码)
- 如果字母是大写字母,则适当地进行旋转(已在其他答案和注释中详细解释;您只需删除大写转换)
- 如果字母是
\u
,则将其替换为空格
- 否则,将按原样返回字符
- 从
main
函数中删除,并在while
语句块中进行测试
为了便于阅读,最好使用make_upper
函数,甚至可以使用rotate(char ch,int k)
函数
其中一个原因,我不提供代码是因为它可能是一个家庭作业,您必须在其中付出一些努力。请更具体地说明“达到z+6
障碍”的含义。具体来说,输入、预期输出和实际输出是什么?这可能是一个溢出问题。请尝试使用无符号字符
。尝试查看大写和小写字母的ASCII编码。然后在纸上跟踪代码中的一些值。小写字母末尾的值(如“z”)接近(有符号)char变量中可以保存的最大值。我怀疑c+=k
可能溢出。您应该使用调试器,一次执行一条语句。观察变量中的值,以验证它们是否在范围内且正确。