1. ホーム
  2. java

[解決済み] javaでアスタリスク付きの半矢印を描くにはどうしたらいいですか?

2022-02-17 10:45:21

質問内容

私は初めてのjavaの授業で、アスタリスクを使って半矢印を描こうとしているところです。内側のループが*を描き、外側のループが矢印の高さと同じ回数だけ反復する入れ子ループを使用することになっています。私は、if-else、whileループ、forループを学びました。

これまでのところ、入力値である
矢印のベースの高さ: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("*");

出力される矢印の例。

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

解決方法は?

この問題では、繰り返すべき正確な回数がわかっているので、for-loopを使いたいと思うでしょう。これは、ユーザーが矢印の各パーツの大きさを入力しているからです。

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 型の値の境界内にとどまります)。