【问题标题】:Printing a rectangle - I want an additional print but I can't get it work打印一个矩形 - 我想要一个额外的打印,但我无法让它工作
【发布时间】:2017-05-06 03:05:33
【问题描述】:

为我制定了一项任务,让我学习 Java 编程,尤其是打印方面的知识。

例如,我们输入了8。然后我们必须得到一个由“+”组成的矩形作为输出,所以它看起来像这样:

++++++++
+      +
+      +
+      +
+      +
+      +
+      +
+      +
++++++++

下面的代码会做到这一点(如果你想让我解释,请告诉我,我会做到的):

public class Printest{
    public static void main(String[] args){

        int x = Integer.parseInt(args[0]);
        for(int i=0; i<x; i++){
            System.out.print("+");
        }
        System.out.println("");
        for(int i=0; i<x-1; i++){
            System.out.print("+");
            for(int j=0; j<x-2; j++){
                System.out.print(" ");
            }
            System.out.print("+");
            System.out.println("");
        }
        for(int j=0; j<x; j++){
            System.out.print("+");
        }
    }
}

但是现在我想添加一个附加功能,所以这个正方形里面有一个十字,我该怎么做?我试图添加一些 if 语句,但我总是最终移动矩形左右边缘..:/

我希望它看起来更精确:

+++++++++
+*     *+
+ *   * +
+  * *  +
+   *   +
+  * *  +
+ *   * +
+*     *+
+++++++++

你会怎么做? if 语句似乎不起作用,我觉得由于多个单独的 for 循环,无法在我的代码中实现它..?

顺便说一句,是否有更简单的方法来完成这项工作(只需打印矩形)?我认为我采取了一种非常复杂和低效的方式。我很想知道更简单的方法,如果它们不是更复杂的话:P

【问题讨论】:

  • 提示:两个for循环将第二行第二列的星号添加到矩形最后一行和最后一列之前的一个

标签: java for-loop printing syntax


【解决方案1】:

您需要找到十字/星角之间的关系。以这颗 5 号星为例。

  0 1 2 3 4
0 *       *
1   *   *
2     *
3   *   *
4 *       *

在从 (0,0) 到 (4,4) 的对角线交叉中,索引是相同的(在代码中这意味着 row == col)。

此外,您可以注意到,在 (0,4) 到 (4,0) 的对角线中,索引总和为 4,即 size - 1(在代码中为 row + col == size - 1)。

因此,在代码中,您需要循环遍历行,然后遍历列。每次都要检查是否满足上述条件。

对于+ 边框,只需检查rowcol 何时为0,以及何时等于size - 1

最后你先打印边框,所以十字的角不是*,而是+

代码:

class Main {
  public static void main(String[] args) {
    printCross(8); //Vertical size of rectangle/cross
  }

  public static void printCross(int size) {
    for (int row = 0; row < size; row++) {
      for (int col = 0; col < size; col++) {
        if (row == 0 || col == 0 || row == size - 1 || col == size - 1)
          System.out.print('+');
        else if (row == col || row + col == size - 1)
          System.out.print('*');
        else
          System.out.print(" ");
      }
      System.out.println();
    }
  }
}

试试here!

【讨论】:

  • 也非常感谢您的回答,试图理解它我认为你们都解决了相同/相似的问题:)
【解决方案2】:

顺便说一句,是否有更简单的方法来完成这项工作(只需打印矩形)?我认为我采取了一种非常复杂且效率低下的方式。

其实是的!您可以使用 2 个 for 循环来做到这一点:

public class RectangleWithShapesExample {
    public static void main(String[] args) {
        int number = 8;

        for (int i = 0; i < number; i++) {
            for (int j = 0; j < number; j++) {
                if (i == 0 || i == number - 1) {
                    System.out.print("+");
                } else {
                    if (j == 0 || j == number - 1) {
                        System.out.print("+");
                    } else {
                        System.out.print(" ");
                    }
                }
            }
            System.out.println("");
        }
    }
}

仅此一项,打印大小为 8 的矩形,然后,如果您添加此 else-if 语句:

else if (i == j || i == (number - j - 1)) {
    System.out.print("*");
} 

上面的第一个条件告诉您的程序打印* 对角线,如下所示:\(那个方向),第二个条件计算它以在另一个方向上打印它(/

您可以打印* 十字,所以,最终您的整个程序如下所示:

public class RectangleWithShapesExample {
    public static void main(String[] args) {
        int number = 9;

        for (int i = 0; i < number; i++) {
            for (int j = 0; j < number; j++) {
                if (i == 0 || i == number - 1) {
                    System.out.print("+");
                } else {
                    if (j == 0 || j == number - 1) {
                        System.out.print("+");
                    } else if (i == j || i == (number - j - 1)) {
                        System.out.print("*");
                    } else {
                        System.out.print(" ");
                    }
                }
            }
            System.out.println("");
        }
    }
}

它的输出是:

++++++++
+*    *+
+ *  * +
+  **  +
+  **  +
+ *  * +
+*    *+
++++++++

并且有 9 个元素:

+++++++++
+*     *+
+ *   * +
+  * *  +
+   *   +
+  * *  +
+ *   * +
+*     *+
+++++++++

作为建议,我建议您在变量中留出一点操作符号,以使您的代码更具可读性并使您的变量更具描述性(例如xnumber

【讨论】:

  • 非常感谢您的回答,我无法想象这些依次出现的 for 循环,让我试着画一下:D
  • 想象一下那些内部循环,就像你在棋盘中一样,你会经过一排,当你到达它的尽头时,你“跳”到下面的那一个并重新开始,都是一样的逻辑
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-01
  • 1970-01-01
  • 2021-02-04
  • 2020-06-04
  • 1970-01-01
相关资源
最近更新 更多