我是一名初学程序员,并参加了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语句位于花括号内,将其取出会导致输出错误。最重要的是,我不明白第一个大括号之外的其他印刷语句是什么,为什么它们不能在大括号内。
非常感谢任何指导。尽我最大努力了解这是如何运作的,但我现在已经坚持了一段时间。
非常感谢你!
答案 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 == 2
,row == 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 == 1
或row == 3
或row == 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
语句完全(循环将针对值if
和2
执行,因此总共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 = ***
希望它能帮助你理解。