所以我试图扭转我目前制作的形状的输出。我想知道我应该扭转病情吗?我尝试改变变量“a”和“c”的值,最后我得到了一个无限循环。
class IRT {
public static void main(String[] args) {
int a = 2;
int b;
int c = 6;
do {
b = a - 1;
if (b != 0) {
do {
System.out.print("*");
b--;
} while (b >= 1);
}
b = 1;
do {
System.out.print(" ");
b++;
} while (b <= (c - a + 1));
System.out.println();
a++;
} while (a <= c);
}
}
XML CODE
My output What i'm trying to get
* *
** **
*** ***
**** ****
***** *****
答案 0 :(得分:2)
如果你想做的就是颠倒每一行的顺序(即首先打印空格,然后打印*
s),你只需要将顺序更改为两个内部while循环。
int a=2;
int b;
int c=6;
do{
b=1;
do{
System.out.print(" ");
b++;
}while(b <= (c - a + 1));
b = a - 1;
if (b!=0){
do{
System.out.print("*");
b--;
}while(b >= 1);
}
System.out.println();
a++;
} while(a <= c);
P.S。缩进代码使其更容易理解。
输出:
*
**
***
****
*****
答案 1 :(得分:0)
正如其他人已经指出的那样,你应该改变代码并给出有意义的名字。 更容易完全重写代码,我花了一些时间来简化代码并分享步骤:
<强> 1 强>
我用无限循环替换了do-while循环,因为它们难以阅读。我认为while(true)
break
和continue
语句(break label
)也是低级操作,它们的行为与有意义的goto
s相似。
int a = 2;
int b;
int c = 6;
while(true) {
b = a - 1;
if (b != 0) {
while(true) {
System.out.print("*");
b--;
if(b < 1) {
break;
}
}
}
b = 1;
while (true){
System.out.print(" ");
b++;
if(b > (c - a + 1)) {
break;
}
}
System.out.println();
a++;
if(a > c) {
break;
}
}
<强> 2 强>
我确定循环是最好的循环(后缀增量/减量(i++
/ i--
)是这个的标志。)
int a = 2;
int b;
int c = 6;
for (; a <= c; a++) {
b = a - 1;
if (b != 0) {
for (; b >= 1; b--) {
System.out.print("*");
}
}
b = 1;
for (; b <= c - a; b++) {
System.out.print(" ");
}
System.out.println();
}
第3:强>
我将临时使用的变量b
放到for循环init语句中,以阐明变量的生命周期及其实际用法。 c
永远不会改变,因此我将其视为常量参数。
final int c = 6;
for (int a = 2; a <= c; a++) {
if (a != 1) {
for (int b = a - 1; b >= 1; b--) {
System.out.print("*");
}
}
for (int b = 1; b <= c - a; b++) {
System.out.print(" ");
}
System.out.println();
}
<强> 4 强>
我做了很多的索引转换,并将计数方向反转到了计数;步骤3中的if(a != 1)
始终为真,因此删除了冗余的if分支。
旁注:
这样的意大利面条代码
形式for(int i = 0; i < n; i++)
(=计数i=0
直到n-1
,具有n
次迭代)的for循环可以作为简单模式应用。您可以在循环体(for(int i = 0; i < n;) { int index = i + offset; }
)或头部(for(int i = offset; i < n + offset; i++)
)中转换索引。您可以将计数方向反转 -for(int i = n - 1; i >= 0; i--)
(=计数i=n-1
降至0
,进行n
次迭代)。它们很有用,但请不要滥用它们 - 只使用带有索引转换的基本和反向for循环。不是像for(;;)
,for(int i=0, j=4; i<j && i%j==0; i++,j+=2)
或for(PrintStream out = System.out;;out.println("Hello World!")) break;
...
final int c = 5;
for (int a = 0; a < c; a++) {
for (int b = 0; b < a + 2; b++) {
System.out.print("*");
}
for (int b = 0; b < c - (a + 1); b++) {
System.out.print(" ");
}
System.out.println();
}
<强> 5 强>
您可能已经注意到我将final int c
更改为等于6
而不是5
。那是因为我发现它与行数和宽度有关,但只有一个单位更大。在这一步中,我为变量提供了有意义的名称,除了i
,因为这是一个临时计数器,用于将 n 次写入一个字符。
final int size = 5;
for (int row = 0; row < size; row++) {
for (int i = 0; i < size - (row + 1); i++) {
System.out.print(" ");
}
for (int i = 0; i < row + 2; i++) {
System.out.print("*");
}
System.out.println();
}
阅读第5步的代码并查看问题,我们会想到需要交换打印*
和的顺序。所以,最后是你的问题的答案:
final int size = 5;
for (int row = 0; row < size; row++) {
for (int i = 0; i < size - (row + 1); i++) {
System.out.print(" ");
}
for (int i = 0; i < row + 2; i++) {
System.out.print("*");
}
System.out.println();
}