2016-09-08 16 views
3

私は最初のJavaクラスにあり、アスタリスクを使って半分の矢印を描こうとしています。内部ループが* sを描画し、外側ループが矢印ベースの高さに等しい回数を反復するネストループを使用するはずです。私はif-else、whileループ、forループを学んだ。Javaでアスタリスクを使用して半角矢印を描くにはどうすればよいですか?

これまでのところ、私は正しく
矢印ベースの高さの入力値の矢印を描くことができた:5
矢印底幅:2
矢印ヘッド幅:4

私が追加しよう外部ループとしてのwhileループ、プログラムはタイムアウトします。私は迷っている。

私が使用する必要がある次の入力は2、3、4です。私のコードは、ベースの右(2)の高さを取得しますが、幅は取得しません。

私が必要とする最後の入力は、3、3、7です。私のコードでは、まったくそのようなことはありません。これは私がこれまで持っていたものです。

幅を正しく取得するにはどのようなループを使用する必要がありますか?出力矢印が見えるかもしれませんどのように

Scanner scnr = new Scanner(System.in); 
    int arrowBaseHeight = 0; 
    int arrowBaseWidth = 0; 
    int arrowHeadWidth = 0; 
    int i = 0; 

    System.out.println("Enter arrow base height: "); 
    arrowBaseHeight = scnr.nextInt(); 

    System.out.println("Enter arrow base width: "); 
    arrowBaseWidth = scnr.nextInt(); 

    System.out.println("Enter arrow head width: "); 
    arrowHeadWidth = scnr.nextInt(); 


    for (i = 1; i <= arrowBaseHeight; ++i) { 
     // Draw arrow base (height = 3, width = 2) 
     System.out.println("**"); 
    } 

    // Draw arrow head (width = 4) 
    System.out.println("****"); 
    System.out.println("***"); 
    System.out.println("**"); 
    System.out.println("*"); 

例:

** 
** 
** 
** 
**** 
*** 
** 
* 
+0

入力に矢印の任意のサイズをユーザーに許可しますが、あなたがしようとしているものを私たちに示すことができました描く?インデントの4つのスペースでフォーマットします。 –

+0

最後に出力文を見ると、次のようなものになると思います。http://pastebin.com/raw/hKu1Hxmp –

+0

ありがとうございました!これは、ユーザーの入力数に応じて、出力がどのように表示されるかです。 –

答えて

1

この問題では、繰り返す必要がある正確な回数を知っているので、for-loopsを使用することをお勧めします。これは、ユーザーが矢印の各部分のサイズを入力するためです。

Scanner scnr = new Scanner(System.in); 

int arrowBaseHeight = 0; 
int arrowBaseWidth = 0; 
int arrowHeadWidth = 0; 
int i = 0; 

System.out.println("Enter arrow base height: "); 
arrowBaseHeight = scnr.nextInt(); 

System.out.println("Enter arrow base width: "); 
arrowBaseWidth = scnr.nextInt(); 

System.out.println("Enter arrow head width: "); 
arrowHeadWidth = scnr.nextInt(); 

//Your code above | Below is the modified code 

String ast = ""; //String ast will contain how many asterisk we want for the base width; 

for (int x = 1; x <= arrowBaseWidth; x++) //Loop forms the base width of the arrow 
{ 
    ast += "*"; //This adds as many asterisks as we need to make the base width. SO if they enter 4, we get 4 *; 
} 


for (i = 1; i < arrowBaseHeight; ++i) 
{ 
    System.out.println(ast); //Prints out the base width, which is now a String object 
} 

int tempHeadWidth = arrowHeadWidth; //Added this tempHeadWidth variable since we will be modifying it directly and 
            //we don't want to modify the original data and variable (it will cause problems if we do. 

for (int y = 1; y <= arrowHeadWidth; y++) 
{ 
    for(int z = tempHeadWidth; z > 0; z--) //This loop prints the amount of asterisks we need per line in the arrowHead 
    { 
     System.out.print("*"); 
    } 
    // Once the loop above is finished, the rest of the code will execute in the main for-loop and then scheck if it will run again. 
    tempHeadWidth -= 1; //So we are lowering the tempHeadWidth by one so the next time it enters 
         //the nested (2nd) for loop it will be one asterisk smaller 

    System.out.println(); //This makes a new line to keep adding more stars for the next row 
} 

(当然のint型の値界に滞在しながら)このメソッドは、あなたの質問がうまく言葉で表現され

+0

ありがとう!これは過去数日間、多くのストレスを引き起こしています。あなたの説明は素晴らしかったです。私が変えなければならなかったことの1つは、

1

は、次の2つのネストされたループを行う必要があります。内側のループは1行に印字し、外側のループは複数行印字します。

これは 'for'ループでのご質問の解決方法です。

//printing arrow base 
for (int h = 0; h < arrowBaseHeight; ++h) 
{ 
    //printing single line - every line is the same 
    for(int w = 0; w < arrowBaseWidth; w++) 
    System.out.print("*"); 
    //finishing line 
    System.out.println(); 
} 

//printing arrow head 
//starting with provided width and decreasing it with every iteration 
for (int a = arrowHeadWidth; a > 0 ; a--) 
{ 
    //printing single line - now every line is different 
    //you have to count how many asterisks you are printing 
    for(int i = 0; i < a; i++) 
    System.out.print("*"); 
    //finishing line 
    System.out.println(); 
} 

ループに角括弧を使用する必要はありません。ループに括弧を使用する必要はありません。例えば:

for(int i = 0; i < a; i++) 
    System.out.print("*"); 

は、と等価である:

for(int i = 0; i < a; i++) 
{ 
    System.out.print("*"); 
} 
+1

あなたのコードに説明を投げて(インデントを修正する)ことができます。彼らはJavaを学んでいるので、コードをシャベルすることはそれらに恩恵を受けるつもりはないとの質問は –

1

入力幅と行の数を印刷する最初の*

印刷量をキャプチャする substring方法を使用して入力するための2つを使用することができ

矢印の先頭の2番目の印刷で矢印の幅を小さくする

for (int i = 0;i < arrowBaseHeight; i++) 
//when there is more than one instruction within a structure can be written without {} 
    System.out.println("*************************".substring(0, arrowBaseWidth)); 

System.out.println(""); 
for (int i = arrowHeadWidth; i>=0; i-=1) // head 
    System.out.println("*************************".substring(0, i)); 
関連する問題