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

时间:2018-03-14 00:05:45

标签: java nested-loops

我是一名初学程序员,并参加了Java类的介绍。我们被分配编写了一个程序,输出由星号组成的字母E,下面有5个向下和3个,如下所示:

*** 
* 
*** 
* 
*** 

唯一的要求是使用嵌套循环和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);
    }
}

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

非常感谢任何指导。尽我最大努力了解这是如何运作的,但我现在已经坚持了一段时间。

非常感谢你!

3 个答案:

答案 0 :(得分:1)

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 == 2row == 3 ......开始row == 6,此时row > NUM_DOWN,因为NUM_DOWN == 5 }。

如果我们将row的所有值放在列表中,则列表将等于{1,2,3,4,5,6},其中包含6个值。但是,由于在for时退出row == 6循环,因此只有6 - 1 == 5次迭代。

继续前进:

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

基本上它意味着:如果row == 1row == 3row == 5,则执行大括号内的代码。否则,跳过它。

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

基本上与其他for循环相同,但只是使用不同的变量。

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

也与上面的if语句相同,但同样具有不同的参数。

System.out.print("*");

这会将*字符打印​​一次到控制台而不用换行符(=基本上输入)。

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

*

然后它会在第三个之后看起来像这样(在第二个中,column等于2,所以column == 1 || column == NUM_ACROSS为假,因此内部代码不会被执行):

**

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

***

还附加了一个空格,但它不可见,因为......好吧,它是一个空格:P

println函数与print基本相同,但它还会附加转义序列 \n。这个转义序列称为换行符,就像在键盘上按下Enter键一样:它开始换行。

下一次迭代,第一个if语句中的代码被完全跳过,因此我们直接跳到第二个print函数。现在我们的输出如下:

***
*

如果我们重复这个过程,我们会得到:

***
*
***

***
*
***
*

***
*
***
*
***

优化&#34;优化&#34;该程序,因为这里实际上有很多冗余代码:

int row; 
int column;

将它放在for语句中,如下所示:

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

它更短,更具可读性;)

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

这个有点奇怪,因为一方面,如果你愿意,声明NUM_DOWN可以更容易地改变高度,但另一方面,你必须编辑常量1和{{1然后以任何方式手动。 让我们采用更具适应性的方式:

3

整数总是向下舍入,因此if (row == 1 || row == NUM_DOWN / 2 + 1 || row == NUM_DOWN) { 。当NUM_DOWN为偶数时,这封信可能看起来有些奇怪,但无论如何。

5 / 2 == 2

嗯,这只是代码的一个奇怪部分:我们最好从for (int column = 1; column <= NUM_ACROSS; column++) if (column == 1 || column == NUM_ACROSS) column = 2开始,因为我们将在下面打印另一个星号)并废弃2语句完全(循环将针对值if2执行,因此总共2个元素 - > 2个星号)。

3

由于我们无法阅读,我们也可以完全删除它

System.out.print(" ");

同样,它更短,而且几乎可以做同样的事情。

System.out.println("*");

嗯...这不是真的需要,因为你的程序默认返回0。

最终的计划如下:

System.exit(0);

答案 1 :(得分:0)

尝试以下代码。我将内圈打印替换为&#39;#&#39;只是为了让你了解它是如何工作的。内部循环是为3行(顶部,中间和底部)打印所需的额外*。外部System.out默认情况下我们需要*在每一行,System.out.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);
    }
}

答案 2 :(得分:0)

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循环添加了另一个括号,以便于您使用。

以下代码为5行打印1 *

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循环中,有另一个for循环,if条件

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("*");
    }               
 }

此循环为行 1,3,5 打印另外2 * 因此,

的总数为*
row1: 1 + 2 = ***
row2: 1     = *
row3: 1 + 2 = ***
row4: 1     = *
row5: 1 + 2 = ***

希望它能帮助你理解。