2

この宿題の割り当てに問題があり、サポートが必要です。私は解決策から学びたいので、解決策だけを望んでいません。

ループを使用してレターピラミッドを実行しています。これらのFORループを組み合わせて、指示どおりに機能させる方法がわからないようです。

ユーザーは文字(またはエラーを与える他の文字)を入力する必要があり、プログラムは文字を大文字に変換します(まだ入力されていない場合)。大文字に変換した後、ループを使用して、文字「A」からユーザーが入力したものに移動し、再び「A」に戻ります。例を以下に示します。

思いついたコードを添付しましたが、プログラムの出力は以下のようになりますが、行はスペースになっているはずです。間隔を空けるために追加しました。

1文字を入力してください(ピラミッドを表示するにはアルファベットを入力してください):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

4 に答える 4

1

あなたがsthを学びたいと言ったので...ここにほんの一例があります

文字ごとに追加する必要があります。単語を印刷してから、単語の途中に新しい文字を追加します。そして、はい、真ん中に文字を複製する必要があります。私の例では、単語全体を保存するのではなく、単語の半分を保存することでこれを回避します。

string word = "A";

for (int i = 'B'; i < input; i++) {
  print word
  print i
  print inverse word
  print newline

  word = word + i
}

おそらくそれはあなたが望んでいたものです...

編集:私はそれがピラミッドであるスペースを追加するためにフロゴットします:(input - i)それらのプリントの前にプリントスペースを追加するだけです。

于 2012-07-02T12:43:29.727 に答える
1

私はあなたのプログラムを、機能しているコアアルゴリズムであるツリーの印刷に分解しました。

それで、これが私が思いついたものであり、デモが機能していることを確認できます。

しかし、最初に、説明:

これは、名前がchar付けられた変数を使用しmiddleて、印刷しようとしている現在の中間文字が何であるかを追跡します。これは、現在の文字がその文字以下であるwhile間、ツリーを印刷し続ける必要があることを示すループを作成できるので便利です。middleinput

また、最初の行の左側に必要なスペースの数を。で計算しますspaces。これはちょっとしたトリックなので、次の行を見てみましょう。

int spaces = input - (int) 'A'; // Might be a better way to do w/o cast

スペースの数を正規化して、65から(X + 65)ではなく0からXの範囲にします。したがって、の入力のA場合、spacesはになります0。これは、入力が。の場合はスペースを出力したくないため、意味がありますAinputだったらB、最初の行に1つのスペースを印刷spacesするので、になります。1

次に、ループを設定するだけです。

  1. 0からの範囲の左側のスペースを印刷しますspaces
  2. ツリーの左側(中央を含む)をAからmiddle
  3. からの範囲で、ツリーの右側を印刷しmiddle - 1ますA
  4. 最初は同じループで右側のスペースを印刷します(コンソールには表示されないため、これは不要です)。

最後に、改行を出力してから、フラグを調整する必要があります。したがって、出力の行を印刷したのでデクリメントし、次の行の文字を印刷した文字の次の文字にしたいのでspacesインクリメントします。middlemiddle

これがコメントされたコードです。これは私が見ることからよりよく学ぶので、うまくいけば十分に説明できました。ご不明な点がございましたら、お気軽にお問い合わせください。

    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、これは以下を生成します:

     A     
    ABA    
   ABCBA   
  ABCDCBA  
 ABCDEDCBA 
ABCDEFEDCBA
于 2012-07-02T13:13:10.940 に答える
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 );
      }
    }

私はこれを試しました、そしてそれは私のために働きました。ループ内のコードは変更せず、メソッドに抽出しただけです。

于 2012-07-02T12:46:36.230 に答える
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スペースを担当するループはおそらく追加の作業が必要ですが、現時点ではうまく機能していません。

于 2012-07-02T12:57:45.180 に答える