-1

さて、私はComp Programmingクラスのプログラムに取り組んでおり、行数を取得し、すべての行に2を追加してピラミッドを出力するプログラムを作成する必要があります. ビジュアルは次のようになります。行の入力が次の場合: 5

ご覧のとおり、入力は 5 でした。さて、* の数を 2 ずつ増やす方法がわかりません。これまでのコードは次のとおりです。

public static void pyramid(){

    System.out.println("Columns:");
    rows = input.nextInt();

    for(int s = 0; s <= rows; s++){

        for(){

        }
    }

}

最初の for ループの内部で別の for ループを開始しました。これを機能させるために必要になることがわかっているからです。私の質問は、2 * のすべての行を追加するにはどうすればよいかということです。

4

6 に答える 6

2

問題を見て反復的なアプローチを使用する場合(私が推奨するように)。探しているのは、ループ内のすべての int に正確に 3 を追加することではないことがわかります。

ピラミッドの半分を正しく理解することから始めましょう。これを行うには、単純なループが必要です。(これを Python で実行して、疑似コードのようにします):

def pyramid(rows):
    for row_num in range(1,rows+1):
        print '*' * row_num

これにより、5 に対して次の出力が得られます。

*
**
***
****
*****

私たちはそこまでの道のりを進んでいます。今実際に必要なのは、反対側のピラミッドの中央から始まる鏡像です。

まず、行番号の 2 倍より常に 1 少ないという事実を見れば、1 行あたりの星の数を計算できます。(1,3,5,7など)

これにより、次のコードが得られます。

def pyramid(rows):
    for row_num in range(1,rows+1):
        num_stars = (row_num * 2) - 1
        print '*' * num_stars

次の出力が生成されます。

*
***
*****
*******
*********

現在、欠けているのはアライメントだけです。各行が適切にインデントされるために必要なスペースの数を計算するために、パターンをもう一度見ることができます。この場合、線を中央に配置するには、行ごとに 1 ずつ減少する値だけ各線をオフセットする必要があるようです。

最初の行はその前に 4 つのスペースが必要であり、2 行目は 3 つというように始まります。行数そのもの。

このパターンから、出力をオフセットするために必要なスペースの数は、実際には行数からrow_numを引いたものに等しいことがわかります。これにより、次のコードが得られます。

def pyramid(rows):
    for row_num in range(1,rows+1):
        num_stars = (row_num * 2) - 1
        offset = rows - row_num
        print (' ' * offset) + ('*' * num_stars)

これで最終結果が得られます。

    *
   ***
  *****
 *******
*********

そして...完成です!

簡潔にするために、このコード例では Python を使用しました。低レベル言語を使用しているため、文字列を生成するために文字を乗算する機能はありません。

多くの人は「ネストされたループを書いてください」と言うでしょう。私は、高等言語に必要な機能を模倣する関数を作成するのが最善だと考えています。

文字列の乗算を実行する関数を作成できれば、同じコードを 2 回使用できます。

Python に文字列乗算が組み込まれていない場合は、次のような関数を簡単に作成できます。

def multiply_char(char,number_of_times):
    s = ''
    for i in range(number_of_times):
        s += char
    return s

これで、この割り当てでその関数を 2 回使用できるようになり、入れ子になったループ (関数呼び出しでは発生しない後で読みやすさを向上させる) を使用せずにコードをきれいに保つことができます。

頭の中でこれらの小さなプログラムを分解する方法は、良いコードを書くための戦いの半分です。先生は、あなたに問題を分析して、より小さな部分に分解させようとしています。何かを実行するコードから開始し、機能的に完了するまで反復することをお勧めします。

ハッピーコーディング!

于 2013-01-07T21:09:35.913 に答える
2

各行の * の数は2*s + 1ですよね? したがって、各ループ内でその数までループし、*毎回出力するだけで、計算は非常に簡単です。

また、* の各セットの前に正しい数のスペースを記述する必要がありますが、これも関数になりますs。いくつかの数字を試して、関数を理解できるかどうかを確認してください。関数が正しくなったら、メイン ループ内でその番号までループし、毎回スペースを追加します。

于 2013-01-07T20:42:14.147 に答える
1

ここにいくつかのヒントがあります:

行の場合は、スペースnで始める必要があります。(n - 1)これらのスペースを単純なネストされたループで自分で出力するか、 を使用Arrays.fill(chars, '0')して に渡すことができる文字の配列を作成しますnew String()。を使用substring()して、各反復で 1 つのスペースを削除できます。

1つから始める必要があります*。後続の行については、 a を使用する方が効率的ですが、そのまま行うことができます。s = s + "**"StringBuffer

FWIW、これは今のところ私が思いつくことができる最高のものです:

static void pyramid(int n) {

    // create first line
    StringBuffer out = new StringBuffer(2 * n + 1);
    for (int i = 0; i < n - 1; ++i) {
        out.append(' ');
    }
    out.append('*');

    // repeatedly remove a space and add two stars
    while (n-- > 0) {
        System.out.println(out);
        out.deleteCharAt(0);
        out.append("**");
    }
};
于 2013-01-07T20:45:49.430 に答える
1

このタスクを実行するには、ネストされた 2 つのループが必要です。最初のものは、現在の行に必要な星の数を数えます。印刷スペース内のループ (「見栄えの良いツリー」を作成するため) と星の印刷

public static void pyramid(int numberOfRows){

    int curentAmountOfStars = 1; // first row has one star
    for(int i = 0; i < numberOfRows; i++){

        for(int j=0; j<numberOfRows-i-1;j++){ // this for prints spaces
            System.out.print(" ");
        }

        for(int j= curentAmountOfStars; j>0; j--){ //this one prints stars
            System.out.print("*");
        }
        System.out.println(); //go to new row
        curentAmountOfStars += 2; // increase amount of stars
    }

}

その結果、あなたは美しい木を手に入れました!

      *
     ***
    *****
   *******
  *********
 ***********
************* 
于 2013-01-07T20:45:50.463 に答える
0

これを行うにはいくつかの方法があります

  1. ループ内で、累積変数に 2 を加算します。
  2. 行に応じて長さの式を導出して、その変数の値全体を計算します。

最初の方法を使用する可能性がありますが、2 番目の方法は、将来の作業ではるかに堅牢になる可能性がはるかに高くなります。このプログラムにはおそらく将来性があまりないので (CS 101 タイプの宿題でよくある問題です)、1 番を選ぶと思います。

int numAsterisks = 1;
for (row = 0; ...) {
  doStuff();
  numAsterisks += 2;
}

2番目の方法は、各行に2つ追加していることを認識することです

numAsterisks = 2*row + 1;

最後の手法の主な利点は、過度の要因によって numAsterisks の中間値の 1 つが台無しになったとしても、numAsterisks の後続の値が間違っていないことです。それほど有利ではないのは、numAsterisks の中間値を格納する必要がないことです。そのため、より高速に実行されるコードが得られる可能性もあります (プロファイリングだけが確かなことを知ることができます)。

于 2013-01-07T20:53:18.943 に答える
-1

あなたがこれをどのように試みているかはわかりますが、おそらく while ループの方が簡単で、文字列操作を使用して必要に応じて各行を作成するだけです。

   public static void pyramid(){
        line=1;
        i=1;
        while(line <= 5){
                      System.out.println("*"*i);
                      i +=2;
                      line +=1;
                     }
    }

また、「星を3つ増やす」という意味かどうかはわかりませんが、行ごとの星の数が(1,4,7,10)になるか、num + 2、num + 5、numのように3ずつ加速するという意味ですか+8 (1,3,8,16) のように。

2番目の方法でやりたい場合は、これでうまくいくはずです。

public static void pyramid(){
            line=1;
            i=1;
            a=3;
            while(line <= 5){
                          System.out.println("*"*i);
                          i += 2+a*(i-1);
                          line +=1;
                         }
        }
于 2013-01-07T20:41:22.483 に答える