- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
用户可以通过选择 1 向左或 2 向右来选择向左或向右移动字母。左边工作正常,右边不行。现在它显示了完全相同的循环,但我已经用不同的方式更改了所有 +
和 -
符号,但最终总是得到奇怪的字符。如何让程序将字符向相反方向移动?如果用户输入 Hi
,且移位值为 1 并且方向为右,则 H
应变为 G
,而 i
应变为 k
,因为移位量应在每个字母之前增加 shiftValue
。另外,目前第一个字母没有改变,这不应该是这样的。
public static String rotate(String userString, int shiftValue, int shiftDirection) {
int myShift = 0;
shiftValue = shiftValue % 26 + 26;
StringBuilder encoded = new StringBuilder();
if (shiftDirection == 1) {
for (char i : userString.toCharArray()) {
if (Character.isLetter(i)) {
if (Character.isUpperCase(i)) {
encoded.append((char) ('A' + (i - 'A' + myShift) % 26));
} else {
encoded.append((char) ('a' + (i - 'a' + myShift) % 26));
}
} else {
encoded.append(i);
}
myShift = (myShift + shiftValue) % 26;
}
} else if (shiftDirection == 2) {
for (char i : userString.toCharArray()) {
if (Character.isLetter(i)) {
if (Character.isUpperCase(i)) {
encoded.append((char) ('A' + (i - 'A' + myShift) % 26));
} else {
encoded.append((char) ('a' + (i - 'a' + myShift) % 26));
}
} else {
encoded.append(i);
}
myShift = (myShift - shiftValue) % 26;
}
}
return encoded.toString();
}
最佳答案
在您的代码中,您在开始时将 myShift
设置为 0,并且在移动第一个字母时没有更改它。这就是为什么你的第一封信没有改变。
如果您要向前移动,请在实际旋转之前执行此操作:
int myShift = shiftValue % 26 + 26;
<小时/>
我已经在您上一个问题中回答了您的问题,Rotating a shift each time a letter is read .
您可以为 rotate
方法使用重载方法。
public static String rotate(String userString, int shiftValue, int shiftDirection) {
if (shiftDirection == 1) {
return rotate(userString, shiftValue);
}
else if (shiftDirection == 2) {
return rotate(userString, -shiftValue);
}
else {
return "This is not a valid way to shift your message.";
}
}
另一个rotate
方法是重复的代码:
public static String rotate(String userString, int shiftValue) {
StringBuilder encoded = new StringBuilder();
int myShift = shiftValue % 26 + 26;
for (char i : userString.toCharArray()) {
if (Character.isLetter(i)) {
if (Character.isUpperCase(i)) {
encoded.append((char) ('A' + (i - 'A' + myShift) % 26 ));
} else {
encoded.append((char) ('a' + (i - 'a' + myShift) % 26 ));
}
} else {
encoded.append(i);
}
myShift = (myShift + shiftValue) % 26;
}
return encoded.toString();
}
请注意,这两个方法具有相同的名称,但它们采用不同的参数。当你调用该方法时,使用这个方法。然后,您可以指定要以哪种方式转移消息,而不必担心更改重复代码中的符号。
还有另外两种方法可以实现此目的。
<小时/>首先,当shiftDirection == 2
时,您应该替换
encoded.append((char) ('A' + (i - 'A' + myShift) % 26));
与
encoded.append((char) ('A' + (i - 'A' - myShift) % 26));
所以当 shiftDirection == 2
时的最终结果应该是
for (char i : userString.toCharArray()) {
if (Character.isLetter(i)) {
if (Character.isUpperCase(i)) {
encoded.append((char) ('A' + (i - 'A' - myShift) % 26));
} else {
encoded.append((char) ('a' + (i - 'a' - myShift) % 26));
}
} else {
encoded.append(i);
}
myShift = (myShift + shiftValue) % 26;
}
<小时/>
其次,您可以通过在开始时将 myShift
设置为 -shiftValue
来向后移动方向,并保持其他所有内容相同。当 shiftDirection == 2
时的完整代码应该是
myShift = -shiftValue;
for (char i : userString.toCharArray()) {
if (Character.isLetter(i)) {
if (Character.isUpperCase(i)) {
encoded.append((char) ('A' + (i - 'A' + myShift) % 26));
} else {
encoded.append((char) ('a' + (i - 'a' + myShift) % 26));
}
} else {
encoded.append(i);
}
myShift = (myShift - shiftValue) % 26;
}
关于java - 改变 Java 中凯撒移位的方向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29829396/
我刚刚开始学习 C 语言类(class),并且遇到了命令行参数的问题。分配是这样的(还有更多,但这是开头有关命令行参数的部分): - 你的程序必须接受一个命令行参数,一个非负整数。 - 如果您的程序在
我需要检查命令行参数中是否有非数字字符。例如: ./problem 20x 应该打印出“不是数字”,因为它包含一个 x。我的代码似乎没有循环遍历命令行参数中的所有字符。 我基本上尝试了不同类型的循环,
这里我有从标准输入将字符流输入到数组中的代码。然后将该数组转换为二维数组。然后,它将该数组从行列顺序更改为列行顺序。然后它打印出创建凯撒移位加密的新数组。我遇到的问题是我的数组开始使用第二个用户输入的
我有点被这个问题困住了。当我运行程序时,由于某种原因,循环经过 z 的所有字母都不会打印。问题来自这个链接:http://docs.cs50.net/2016/x/ap/problems/caesar
我是一名优秀的程序员,十分优秀!