Я учусь в своем первом классе java и пытаюсь нарисовать половинную стрелку с помощью звездочек. Я должен использовать вложенный цикл, в котором внутренний цикл рисует * s, а внешний цикл повторяет количество раз, равное высоте основания стрелки. Я изучил 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("*");

Пример того, как может выглядеть стрелка вывода:

**
**
**
**
****
***
**
*
3
J Learning 8 Сен 2016 в 19:15

5 ответов

Лучший ответ

Для этой проблемы вам следует использовать циклы for, так как вы знаете точное количество раз, когда они должны повторяться. Вы знаете это, потому что пользователь вводит размер каждой части стрелки.

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)

1
Jakob Strobl 8 Сен 2016 в 17:17

Вам нужно сделать две вложенные петли. Внутренние циклы будут печатать символы в одну строку, а внешние циклы будут печатать несколько строк.

Это решение вашего вопроса с циклами 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
hal 8 Сен 2016 в 16:55

Можно использовать два для первого, чтобы напечатать количество строк с введенной шириной, введенной с помощью substring для определения объема печати *

Затем вторая печать для головки стрелки и уменьшение ширины стрелки

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));
1
Dev. Joel 8 Сен 2016 в 17:19

Я знаю, что это немного поздно, но я прохожу ту же задачу на zybooks (что, как оказалось, является лабораторной работой). Вышеупомянутый код, помеченный как решенный, верен, но есть несколько вещей, которые отсутствуют в коде, которые, как я думал, я бы разъяснил для всех. Ниже приведен код, который я использовал для прохождения 100%, и я прокомментирую области, которые необходимо изменить. Я также сделал отступы немного легче для чтения. Я надеюсь, что это поможет всем, кому нужен небольшой толчок в правильном направлении.

import java.util.Scanner; 

public class DrawHalfArrow {
   public static void main(String[] args) {
      Scanner scnr = new Scanner(System.in);
      int arrowBaseHeight = 0;
      int arrowBaseWidth  = 0;
      int arrowHeadWidth = 0;

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

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

/* The while loop below needed to be added for the user input to make sure
** that their input never exceeded that of the arrowHeadWidth */

  while (arrowHeadWidth <= arrowBaseWidth) {
     System.out.println("Enter arrow head width: ");
     arrowHeadWidth = scnr.nextInt();
  }

  String ast = "";
  for (int x = 1; x <= arrowBaseWidth; x++) {
     ast+= "*";
  }

/* Here 'i' needed to be intialized as an integer ('int'). Also the '=' needed
** to be added to i<= arrowBaseHeight */

  for (int i = 1; i <= arrowBaseHeight; ++i) { 
        System.out.println(ast);
  }
  int tempHeadWidth = arrowHeadWidth;
  for (int y =1; y <= arrowHeadWidth; y++) {
     for (int z = tempHeadWidth; z > 0; z--) {
        System.out.print("*");
     }
     tempHeadWidth -= 1;
     System.out.println();
  }

  return;
   }
}
0
RobertB922 24 Сен 2019 в 19:31

Мое полное решение, основанное на ответе @dev joels

import java.util.Scanner; 

public class DrawHalfArrow {
   public static void main(String[] args) {
      Scanner scnr = new Scanner(System.in);
      int arrowBaseHeight = 0;
      int arrowBaseWidth  = 0;
      int arrowHeadWidth = 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: ");

      while (arrowHeadWidth <= arrowBaseWidth) {
        System.out.println("Enter arrow head width: ");
        arrowHeadWidth = scnr.nextInt();
      }       

      for (int h = 0; h < arrowBaseHeight; ++h) {
         for(int w = 0; w < arrowBaseWidth; w++) 
            System.out.print("*");
        System.out.println();
      }

       for (int a = arrowHeadWidth; a > 0 ; a--) {
          for(int i = 0; i < a; i++)
             System.out.print("*");
         System.out.println();
       }
      return;
   }
}
0
Carlito Santiago 22 Мар 2020 в 03:17