我在完成这项家庭作业时遇到了麻烦,想要一些帮助。我不想只是解决方案,因为我想向他们学习。
我们正在使用循环进行字母金字塔。我似乎无法弄清楚如何将这些FOR循环放在一起,使其按照指示工作。
用户应输入一个字母(或其他出现错误的字符),然后程序将字母转换为大写字母(如果尚未输入)。转换为大写后,使用循环以便从字符“A”转到用户输入的任何内容,然后再返回“A”。一个例子如下。
我附上了我提出的代码,但程序的输出应如下所示,但这些行应该是空格。我刚添加它们用于间距:
输入单个字母(输入字母以显示金字塔):E
____A
___ABA
__ABCBA
_ABCDCBA
ABCDEDCBA
我的输出就是这样:
Please enter a single letter:
f
ABCDEFEDCBA
以下是代码:
import java.util.*; // For using Scanner class for input
public class LetterPyramid {
public static void main(String[] args) {
Scanner key = new Scanner(System.in);
System.out.println("Please enter a single letter:");
char input = key.next().charAt(0);
input = Character.toUpperCase(input);
if (!(Character.isLetter(input))) {
System.out.println("Error: Invalid letter: " + input);
} else {
for (int i = input; i < 'Z'; i++) {
System.out.print(" ");
}
}
for (char y = 'A'; y < input; y++) {
System.out.print(y);
if (y == input) {
System.out.println(y);
}
}
for (char x = input; x >= 'A'; x--) {
System.out.print(x);
}
System.out.println();
}
}
答案 0 :(得分:1)
因为你说你想学习......这里只是一个例子
对于我们要添加的每个字母:我们打印单词,然后在单词的中间添加新字母。是的,我们必须在中间复制这封信。在我的例子中,你通过保存半个字而不是保存整个单词来避免这种情况。
string word = "A";
for (int i = 'B'; i < input; i++) {
print word
print i
print inverse word
print newline
word = word + i
}
可能这就是你想要的......
编辑:我选择了为金字塔添加空格:在这些打印之前添加打印(input - i)
空格。
答案 1 :(得分:1)
我将你的程序剥离到正在运行的核心算法:打印树。
所以,这就是我想出来的,以及demo所以你可以看到它有效。
但首先是一个解释:
这使用名为char
的{{1}}变量来跟踪我们即将打印的当前中间字符。这很有用,因为我们可以创建middle
循环,该循环声明我们应该继续打印树,而当前while
字符小于或等于middle
字符。
我还使用input
计算第一行左侧需要的空格数。这是一个技巧,所以让我们看看这一行:
spaces
我们规范化空格数,使其范围从0到X,而不是65到(X + 65)。因此,对于int spaces = input - (int) 'A'; // Might be a better way to do w/o cast
的输入,A
将是spaces
,这是有道理的,因为如果输入只是0
,我们就不想打印任何空格。如果A
为input
,B
将为spaces
,因为我们会在第一行打印一个空格。
然后只需设置循环:
1
spaces
到A
middle
到middle - 1
最后,我们打印换行符,然后需要调整我们的标志。所以我们递减A
,因为我们只打印了一行输出,并递增spaces
,因为我们希望下一行的middle
字符是打印后的下一个字符。< / p>
这是评论的代码,我从中看到的更好,所以希望我已经解释得很好。如果您有任何疑问,请随时提出。
middle
如果输入 char middle = 'A'; int spaces = input - (int) 'A';
while( middle <= input) {
// Print the left side spaces
for( int i = 0; i < spaces; i++)
System.out.print(" ");
// Print the left side of the tree (including the middle)
for( char y = 'A'; y <= middle; y++)
System.out.print( y);
// Print the right side of the tree
for( char y = Character.toChars( middle - 1)[0]; y >= 'A'; y--)
System.out.print( y);
// Print the right side spaces
for (int i = 0; i < spaces; i++)
System.out.print(" ");
// Print a new line
System.out.println();
// Subtract 1 from the number of spaces we need
spaces--;
// Increment the middle character
middle++;
}
,则会生成:
F
答案 2 :(得分:0)
你真的很接近你想要的。您需要使用循环来调整A的起点和输出,然后是B,C,D,E,F等。
if ( ! ( Character.isAlphabetic( input ) ) ) {
System.out.println( "Error: Invalid letter: " + input );
} else {
for ( char n = 'A'; n <= input; n++ ) {
pyramid( n );
}
}
我试过这个,它对我有用。我没有更改循环中的任何代码,只是将其提取到方法中。
答案 3 :(得分:0)
嗯,你已经设法建立了金字塔的底部,这是一个良好的开端。接下来你需要做的是将3 for
个循环放在一个更大的for
循环中,从'A'
转到你的输入字符,然后在你较小的情况下使用它作为结束条件循环:
for(...) {
for (int i = input; i < 'Z'; i++) {
System.out.print(" ");
}
for (char y = 'A'; y < input; y++) {
System.out.print(y);
if (y == input) {
System.out.println(y);
}
}
for (char x = input; x >= 'A'; x--) {
System.out.print(x);
}
}
此外,负责空格的for
循环可能需要一些额外的工作,目前它还不能很好地工作。