Создание полого прямоугольника в java с использованием сканера и вложенных циклов - PullRequest
0 голосов
/ 10 апреля 2020

Я очень застрял в этом, я создал программу в Java, чтобы сделать полый прямоугольник, но вместо этого я получил полный прямоугольник. Назначение заставляет нас создать новый класс java с именем 'Rectangle' и закодировать необходимый материал там, а затем вызвать класс и конструктор в основном коде. Я приложил свой код ниже. Я понимаю, что мой System.out.print кодируется для печати пустого пространства, я сделал это, потому что, когда у меня было это печатать мой 'drawChar', это выглядело возмутительно. Я просто хотел, чтобы это выглядело как прямоугольник, когда я просил о помощи.

Это мой класс прямоугольников:

public class Rectangle {
    private int width;
    private int height;
    private char drawChar;

    public Rectangle(int width,int height, char drawChar)
    {
        this.width = width;
        this.height=height;
        this.drawChar=drawChar;
    }


    public void printOutline()
    {
        for(int i=0; i<height; i++)
        {
            for(int j =0; j<width; j++)
            {
                System.out.print(drawChar);
                if(i==1||i>=height-1||j==0||j==width-1){
                    System.out.print(" ");
                }
                else{
                    System.out.print(" ");
                }
            }
            System.out.println();
        }
    }
}

и это основная программа:

public class Question1 {

    public static void main(String[] args) {
        Scanner keyboard = new Scanner(System.in);
        System.out.println("Enter a character: ");
        String input = keyboard.nextLine();
        char drawChar = '*';
        if(input.length() > 0 )
            drawChar = input.charAt(0);
        System.out.println("Please enter the width: ");
        int width = Integer.parseInt(keyboard.nextLine());

        System.out.println("Please enter the height: ");
        int height = Integer.parseInt(keyboard.nextLine());

        Rectangle rec = new Rectangle(width,height,drawChar);
        rec.printOutline();

    }
}

Это мой результат:

Enter a character: 
!
Please enter the width: 
5
Please enter the height: 
5
! ! ! ! ! 
! ! ! ! ! 
! ! ! ! ! 
! ! ! ! ! 
! ! ! ! ! 

Кроме того, вот задание:

 *
 * Write a Rectangle Class with three fields and has a constructor with three parameters,
 *   - integers: width and height
 *   - character: drawChar
 *   Write Setters and Getters (even though you won't use them)
 * The class will have a method called printOutline that prints a rectangle to the
 * console that is the outline based on the dimensions width and height.
 * The method will use the character drawChar as its outline character. The method
 * should use nested for loops to print the output.
 * (HINT: Try to get the output to print a full rectangle without the spaces in the middle,
 * then alter your code to just print the character on the outline - think about your nested for-loops and what
 * values should have a character print or a space print.)
 *
 * The main method will demonstrate this class by asking the user for width, height and
 * a draw character.
 * (HINT: use charAt(0) method to get character from input String)
 * It will call the constructor with these values and then
 * draw a rectangle outline to the console.
 * Input Validation: Do not allow the user to enter negative numbers for height and width.
 * Loop until they enter a positive value.
 *
 * Example Output 1:
 * Please enter a character for your drawing:
 * $
 * Please enter a positive integer width:
 * 4
 * Please enter a positive integer height:
 * 5
 *
 * $$$$
 * $  $
 * $  $
 * $  $
 * $$$$
 *
 * Example Output 2:
 * Please enter a character for your drawing:
 * !
 * Please enter a positive integer width:
 * -1
 * INVALID - enter a positive integer width:
 * 6
 * Please enter a positive integer height:
 * -8
 * INVALID - enter a positive integer height:
 * 10
 *
 * !!!!!!
 * !    !
 * !    !
 * !    !
 * !    !
 * !    !
 * !    !
 * !    !
 * !    !
 * !!!!!!
 *

обычно я просил бы указание от моего преподавателя, но из-за пандемии covid-19 c наш кампус закрыт, и инструкция была переведена в режим онлайн. Я пробовал различные решения безрезультатно. Любые предложения будут ценны.

1 Ответ

0 голосов
/ 10 апреля 2020

Я бы сначала занялся этим, разбивая проблему на шаги Вы знаете, что хотите, чтобы в первой строке печатались символы, равные ширине. Итак, начните с этого: печатайте символ итеративно, используя ваш for l oop (и fini sh с println):

// always start with a complete row
for (int i = 0; i < width; i ++) {
    System.out.print(drawChar);
}
    System.out.println();

Далее, вы знаете, что хотите, чтобы второй-второй последние строки выведите символ, за которым следуют пробелы, после которых следует символ:

// for next set of rows, only print first and last
for (int j = 1; j < height; j ++) {
    // print the first one
    System.out.print(drawChar);
    // print the spaces
    for (int k = 1; k < width - 1; k ++) {
        System.out.print(" ");
    }
    // print the last one
    System.out.print(drawChar);
    System.out.println();
}

Затем завершите sh, снова напечатав полный ряд (как вы делали для первого ряда).

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

// print conditionally, depending on row number
for (int i = 0; i < height; i ++) {
    // print a complete row if it's the first or last row
    if (i == 0 || i == height - 1) {
        for (int j = 0; j < width; j ++) {
            System.out.print(drawChar);
        }
        System.out.println();
    } 

Вы можете создать оттуда, чтобы обеспечить точное представление ваших условий. Я думаю, что в вашем условном выражении смешаны логины строк и столбцов c.

for (int i = 0; i < height; i ++) {
    for (int j = 0; j < width; j ++) {
        // if in the first or last row or first or last column, print character
        if(i == 0 || i == height - 1 || j == 0 || j == width - 1) {
            System.out.print(drawChar);
        } else {
            // otherwise print space
            System.out.print(" ");
        }
        // at end of row, start new line
        if (j == width - 1) {
            System.out.println();
        }
    }
}   
...