根据用户输入生成字母金字塔

时间:2012-07-02 12:28:50

标签: java nested-loops

我在完成这项家庭作业时遇到了麻烦,想要一些帮助。我不想只是解决方案,因为我想向他们学习。

我们正在使用循环进行字母金字塔。我似乎无法弄清楚如何将这些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();
    }
}

4 个答案:

答案 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,我们就不想打印任何空格。如果AinputB将为spaces,因为我们会在第一行打印一个空格。

然后只需设置循环:

  1. 打印左侧空格,范围从0到1
  2. 打印树的左侧,包括中间,范围从spacesA
  3. 打印树的右侧,范围从middlemiddle - 1
  4. 在第一行打印右侧空格相同的循环(这是不必要的,因为它在控制台中不可见)
  5. 最后,我们打印换行符,然后需要调整我们的标志。所以我们递减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循环可能需要一些额外的工作,目前它还不能很好地工作。