import java.util.*;
public class BugFixes
{
public static void main(String[] args)
{
Scanner in = new Scanner(System.in);
altCaps("Computer Science");
}
static void altCaps(String hi)
{
String hi2 = hi;
int locate = 0;
for(int i = 0; i < hi2.length();i++)
{
if((Character.isLetter(hi2.charAt(locate))))
{
if(hi2.charAt(locate) % 2 == 0)
{
System.out.print(hi2.toLowerCase().charAt(locate));
locate++;
}
else if(hi2.charAt(locate) % 2 == 1)
{
System.out.print(hi2.toUpperCase().charAt(locate));
locate++;
}
}
else if(hi2.charAt(locate) == ' ')
{
System.out.print(" ");
locate++;
}
}
}
}
这是我目前实验室遇到的问题之一。我能够解决其他一些错误,但我似乎无法找到这个错误。
我的问题是为什么输出&#34; COMPUtER SCIEnCE&#34;?我不明白这里发生了什么,我现在已经看了一个小时。我的目标是输出&#34; CoMpUtEr ScIeNcE&#34;
我认为(hi2.charAt(locate)%2 == 0)反之亦然会在字符串中的偶数和奇数位置之间交替,但我相信我在某处犯了错误。我无法找到它。
使用BlueJ V3.1.7
1年高中计算机科学经验,目前就读于AP计算机科学
任何提示?
答案 0 :(得分:1)
不是真的。所以hi2.charAt(locate) % 2 == 0
实际上是在检查字符的整数值是奇数还是偶数,但是你想要实际检查索引是否是奇数,或者即使我说对了。换句话说:
hi2.charAt(2) % 2 == 0
检查m
是奇数还是偶数。但是,我想你想检查2
(索引)是奇数还是偶数。我想从这里可以很容易地假设你需要改变:
if(hi2.charAt(locate) % 2 == 0)
//...
else if(hi2.charAt(locate) % 2 == 1)
//...
到
if(locate % 2 == 0)
//...
else if(locate % 2 == 1)
//...
这并不能准确地为您提供所需的输出,但这只是根据您的意愿反转if
条件或身体的问题。此外,操作% 2
没有其他情况,这意味着您只能获得奇数或偶数索引,因此您可以通过以下方式简化代码:
if(locate % 2 == 0)
//...
else
//...
哪个读得更好。希望这有帮助!
答案 1 :(得分:1)
我强烈建议重构代码以减少重复调用,并使值检查成为可能(而不是比较功能评估)。
例如:
char currentCharacter = hi2.charAt(locate);
将替换函数调用的四个实例,并允许您检查实际值是什么(而不是您期望的值)。这可能会使您的错误更加明显。
假设以下值:
hi2 = "Computer Science";
locate = 0;
然后可能值得逐步完成评估。
0. hi2.charAt(locate) % 2 == 0
1. "Computer Science".charAt(0) % 2 == 0
2. 'C' % 2 == 0
3. 67 % 2 == 0
4. 1 == 0
5. false
根本问题在于,从不将您的值分配给变量,您永远不会花时间去理解其中的内容。通过将其分配给变量,您可以使用调试器检查该值。
通过检查值,我们可以看到您可能需要0
的mod,而不是'C'
,因此您可能想要
0. locate % 2 == 0
1. 0 % 2 == 0
2. 0 == 0
3. true
<强>加成强>
重构代码以减少重复,还会突出显示其他错误。例如,尝试以下操作:
assert "CoMpUtEr sCiEnCe".equals(BugFixes.altcaps("Computer Science"));
assert "CoMpUtEr-sCiEnCe 201".equals(BugFixes.altcaps("Computer-Science 201"));
KISS:删除不必要的逻辑可以减少出错的可能性。
答案 2 :(得分:0)
对于初学者,您不需要重新分配字符串或locate变量,或检查字符是否已经是字符。如果需要,只需使用迭代整数和参数。
其次,你要修改角色,而不是位置。
无论如何,简单的布尔切换比修改更容易理解。
void altCaps(String hi) {
boolean caps = true;
for (char ch : hi.toCharArray()) {
if (ch == ' ') {
System.out.print(ch);
}
else if (Character.isLetter(ch)) {
if (caps) System.out.print(Character.toUpperCase(ch));
else System.out.print(Character.toLowerCase(ch));
caps = !caps; // switch between upper and lower every character
}