代码之家  ›  专栏  ›  技术社区  ›  user9421447

打印出由星号组成的字母E-我的程序可以运行,但我不明白为什么

  •  1
  • user9421447  · 技术社区  · 7 年前

    我是一名初级程序员,正在学习Java课程简介。我们被指派编写一个程序,输出由5个向下的星号和3个横线组成的字母E,如下所示:

    *** 
    * 
    *** 
    * 
    *** 
    

    唯一的要求是使用嵌套循环和if语句来获得结果。下面是我的代码。它按预期工作,但我很难理解为什么。

    public class LetterE {
        public static void main(String args[]) {
    
            final int NUM_ACROSS = 3; 
            final int NUM_DOWN = 5;        
            int row; 
            int column; 
    
            for (row = 1; row <= NUM_DOWN; row++) {
                if (row == 1 || row == 3 || row == NUM_DOWN)
                    for (column = 1; column <= NUM_ACROSS; column++) {
                        if (column == 1 || column == NUM_ACROSS)
                            System.out.print("*");
                    }
                System.out.print("*");
                System.out.print(" ");
                System.out.println();
            }
            System.exit(0);
        }
    }
    

    基本上,我的问题来自于系统。出来打印报表。我不明白我的循环和打印语句之间的关系。例如,第一个print语句位于大括号内,取出它会导致输出错误。最重要的是,我不明白第一个大括号之外的其他打印语句是干什么的,为什么它们不能在大括号内。

    任何指导都将不胜感激。我尽了最大努力去理解这是怎么回事,但我已经坚持了一段时间了。

    非常感谢!

    3 回复  |  直到 7 年前
        1
  •  1
  •   Demindiro    7 年前
    final int NUM_ACROSS = 3;
    final int NUM_DOWN = 5;
    int row;
    int column;
    

    我假设您知道上述代码的作用,因此我不会对此进行详细说明。

    for (row = 1; row <= NUM_DOWN; row++) {
    

    这段代码意味着您需要在花括号内连续执行代码,只要 row <= NUM_DOWN 。但在此之前,我们分配 1 row (此语句只执行一次)。每次迭代(=花括号内代码的完整执行) row++ 将执行。

    所以我们从 row == 1 然后 row == 2 ,则, row == 3 。。。直到 row == 6 ,此时 row > NUM_DOWN 因为 NUM_DOWN == 5

    如果我们把我们得到的所有价值 一行 在列表中,列表将等于 {1,2,3,4,5,6} ,其中包含6个值。然而,由于 for 循环退出时 行==6 ,只有 6 - 1 == 5 迭代。

    继续:

    if (row == 1 || row == 3 || row == NUM_DOWN){
    

    基本上它的意思是:如果 行==1 行==3 row == 5 ,然后在花括号内执行代码。否则,跳过它。

    for (column = 1; column <= NUM_ACROSS; column++) {
    

    基本相同 对于 循环,但只是使用不同的变量。

    if (column == 1 || column == NUM_ACROSS)
    

    也与 if 上面的语句,但再次使用不同的参数。

    System.out.print("*");
    

    这将打印 * 字符一次发送到控制台 没有 换行符。

    在此之后将执行的打印语句将 追加 将另一个字符替换为已写入的字符,因此在第一次迭代后,您的输出将首先如下所示:

    *
    

    然后在第三个(第二个, column 等于2,所以 column == 1 || column == NUM_ACROSS 为false,因此不会执行内部代码):

    **
    

    然后退出循环,另一个 print 语句被执行。

    ***
    

    还附加了一个空格,但它不可见,因为。。。这是一个空格:P

    这个 println 功能本质上与 打印 但它还附加了 转义序列 \n 。这个转义序列称为换行符,就像在键盘上按enter键一样:它开始一个新行。

    在下一次迭代中,第一次迭代中的代码 如果 语句被完全跳过,所以我们直接跳到第二个 打印 作用现在,我们的输出如下所示:

    ***
    *
    

    如果我们重复该过程,我们将得到:

    ***
    *
    ***
    

    ***
    *
    ***
    *
    

    ***
    *
    ***
    *
    ***
    

    “优化”程序,因为这里实际上有很多冗余代码:

    int row; 
    int column;
    

    把它放在 对于 这样的陈述:

    for (int row = 1; row <= NUM_DOWN; row++) {
    

    它更短,可读性更强;)

    if(行==1 | |行==3 | |行==NUM\u向下){
    

    这有点奇怪,因为一方面,如果需要,声明NUM\u DOWN可以更容易地更改高度,但另一方面,必须编辑常量 1. 3 手动,然后任其一。 让我们采用更具适应性的方式:

    if (row == 1 || row == NUM_DOWN / 2 + 1 || row == NUM_DOWN) {
    

    整数总是向下舍入,所以 5 / 2 == 2 。当NUM\u DOWN为偶数时,字母可能看起来有点奇怪,但不管怎样。

    for (int column = 1; column <= NUM_ACROSS; column++)
        if (column == 1 || column == NUM_ACROSS)
    

    嗯,这只是一段奇怪的代码:我们最好从 column = 2 ( 2 因为我们将在下面打印另一个星号)并取消 如果 语句(将对值执行循环 2. 3. ,so 2元素合计--gt;2个星号)。

    System.out.print(" ");
    

    既然我们看不懂它,我们也可以把它全部删除

    System.out.println("*");
    

    再说一次,它更短,而且做的事情也差不多。

    System.exit(0);
    

    嗯。。。实际上并不需要它,因为您的程序默认返回0。

    最终程序如下所示:

    public class LetterE {
    
        public static void main(String args[]) {
    
            final int NUM_ACROSS = 3; 
            final int NUM_DOWN = 5;        
    
            for (int row = 1; row <= NUM_DOWN; row++) {
                if (row == 1 || row == NUM_DOWN / 2 + 1 || row == NUM_DOWN)
                    for (int column = 2; column <= NUM_ACROSS; column++)
                        System.out.print("*");
                System.out.println("*");
            }
        }
    }
    
        2
  •  0
  •   spdev    7 年前

    尝试以下代码。我将内环打印替换为“#”,只是想让您了解它的工作原理。。内部循环用于打印3行(顶部、中部和底部)所需的额外*信息。外部系统。默认情况下,我们在每一行和系统中都需要*输出。出来println将移至下一行。我在{}中移动了内部for循环,以使其更具可读性。

    public class LetterE {
        public static void main(String args[]) {
    
            final int NUM_ACROSS = 3; 
            final int NUM_DOWN = 5;        
            int row; 
            int column; 
    
            for (row = 1; row <= NUM_DOWN; row++) {
                if (row == 1 || row == 3 || row == NUM_DOWN){
                    for (column = 1; column <= NUM_ACROSS; column++) {
                        if (column == 1 || column == NUM_ACROSS)
                            System.out.print("L");
                    }
                }
                System.out.print("*");
                System.out.print(" ");
                System.out.println();
            }
            System.exit(0);
        }
    }
    
        3
  •  0
  •   Atequer Rahman    7 年前
    public class LetterE {
        public static void main(String[] args) {     
            int row; 
            int column; 
            for (row = 1; row <= 5; row++) { //final int NUM_DOWN = 5
                if (row == 1 || row == 3 || row == 5) {
                    for (column = 1; column <= 3; column++) {//final int NUM_ACROSS = 3
                        if (column == 1 || column == 3)
                            System.out.print("*");
                    }               
                }
                System.out.print("*");
                System.out.print("\n");      
            }
            System.exit(0);
        }
    }
    

    看看我的代码。 我已经为if循环添加了另一个括号,以便更方便地使用。

    以下代码打印1 * 用于5行。

    for (row = 1; row <= 5; row++) {
        System.out.print("*");
        System.out.print("\n"); 
    }
    
    output: 
    row1: 1  = *
    row2: 1  = *
    row3: 1  = *
    row4: 1  = *   
    row5: 1  = *
    

    在这个for循环中,还有一个带有if条件的for循环

    if (row == 1 || row == 3 || row == 5) {
        for (column = 1; column <= 3; column++) {//final int NUM_ACROSS = 3
            if (column == 1 || column == 3)
            System.out.print("*");
        }               
     }
    

    此循环打印另一个2 * 对于行 1,3,5 因此,总数 * 对于

    row1: 1 + 2 = ***
    row2: 1     = *
    row3: 1 + 2 = ***
    row4: 1     = *
    row5: 1 + 2 = ***
    

    希望它能帮助你理解。