public class Test
{
public static void main(String[] args)
{
printHollowRhombus(10);
}
public static void printHollowRhombus(int size)
{
if(size%2==0)
{
size++;
}
for(int i=0;i<size/2+1;i++)
{
for(int j=size/2+1;j>i+1;j--)
{
System.out.print(" ");
}
for(int j=0;j<2*i+1;j++)
{
if(j==0||j==2*i)
{
System.out.print("*");
}
else
{
System.out.print(" ");
}
}
System.out.println(" ");
}
for(int i=size/2+1;i<size;i++)
{
for(int j=0;j<i-size/2;j++)
{
System.out.print(" ");
}
for(int j=0;j<2*size-1-2*i;j++)
{
if(j==0||j==2*(size-i-1))
{
System.out.print("*");
}
else
{
System.out.print(" ");
}
}
System.out.println(" ");
}
}
}
练了几天,背下来了都,但还是不明白这几个for循环里的判断循环条件是怎么得来的,请高手帮忙解释下啊,万分感谢。比如这个for(int i=size/2+1;i<size;i++),里面的初始化值我也搞不懂怎么来的,帮忙解释下啊,谢谢。Java
{
public static void main(String[] args)
{
printHollowRhombus(10);
}
public static void printHollowRhombus(int size)
{
if(size%2==0)
{
size++;
}
for(int i=0;i<size/2+1;i++)
{
for(int j=size/2+1;j>i+1;j--)
{
System.out.print(" ");
}
for(int j=0;j<2*i+1;j++)
{
if(j==0||j==2*i)
{
System.out.print("*");
}
else
{
System.out.print(" ");
}
}
System.out.println(" ");
}
for(int i=size/2+1;i<size;i++)
{
for(int j=0;j<i-size/2;j++)
{
System.out.print(" ");
}
for(int j=0;j<2*size-1-2*i;j++)
{
if(j==0||j==2*(size-i-1))
{
System.out.print("*");
}
else
{
System.out.print(" ");
}
}
System.out.println(" ");
}
}
}
练了几天,背下来了都,但还是不明白这几个for循环里的判断循环条件是怎么得来的,请高手帮忙解释下啊,万分感谢。比如这个for(int i=size/2+1;i<size;i++),里面的初始化值我也搞不懂怎么来的,帮忙解释下啊,谢谢。Java
{
public static void main(String[] args)
{
printHollowRhombus(10);
}
public static void printHollowRhombus(int size)
{
if(size%2==0)
{
size++;
//传递的参数是10,那这个时候size的值是11;
}
for(int i=0;i<size/2+1;i++)
//指定菱形的上半部分行数。初始化i是0,i小于5+1即6,也就是0,1,2,3,4.5共6行。
{
for(int j=size/2+1;j>i+1;j--)
//打印左上角空格,初始化 j是11/2+1等于6,让j大于i的值加1即1,从6开始往下递减,也就是第一行空格是5行
//循环后第二行空格-1就是4行。
{
System.out.print(" ");
}
for(int j=0;j<2*i+1;j++)
//指定上半部分的列数,初始化j值为0,j小于2乘以i的值即0+1,(这个i的值会跟随外部for循环的i值改变)
//j<2*i+1,这里等于确定两个*号之间要空几个。
{
if(j==0||j==2*i)
//如果j等于0.或者j等于2乘以i的值,输出*。否则输出空格。貌似很关键。
//j==2*i,这里确定要在第几个位置输出*。也就是说在j<2*i+1这个条件循环到最后一个满足的条件时。
//输出*,然后跳出循环。j<2*i+1和j==2*i这个判断语句相关联。j==0和int j=0这个相关联。
//当i为0,进来满足第一个条件,输出*,再次在内部for循环里循环,条件不成立,跳出循环,回到外部for循环。
//当再次外部循环,i=1,j=0,第一个条件成立,输出*,再次内部循环,因为j< 3,所以第二次循环时,j=1,if语句里
//两个条件都不成立,输出空格,但内部for循环条件成立,当第三次内部for循环时j=2,满足if语句里的第二个
//条件,输出*,当再次外部循环时,j=3,条件不成立,跳出内部循环。再次从外部开始循环。
{
System.out.print("*");
}
else
{
System.out.print(" ");
}
}
System.out.println();
//当2个内部循环完毕,换行。
}
for(int i=size/2+1;i<size;i++)
//指定下半部分的行数,初始值为11除以2加1,即6,让i小于11,即下半部分有5行。6,7,8,9,10.
{
for(int j=0;j<i-size/2;j++)
//输出左下角空白。初始化j等于0,让i的值6减去size除以2的值5,等于1,也就是说有1个空白。
//当第一轮循环完毕,不满足条件,跳出这个循环,回到外部循环,然后又回到这个循环,i的值也改变了。
//第二轮循环就有2个空格。
{
System.out.print(" ");
}
for(int j=0;j<2*size-1-2*i;j++)
//指定下半部分的列数, 初始化j时0,让j小于2乘以size的值减去1行,(因为下半部分比上半部分少一行)
//减去2乘以i的值6,得到结果9,
{
if(j==0||j==2*(size-i-1))
//第二个参数结果是8.。前面的为真,后面的不运算,前面为假,后面的运算,都为假,输出空格,
//直到循环到j等于8时。满足了一个条件,输出*。这是下半部分的第一行。交界处开始。第一轮循环完毕。
//接着回到外部for循环,继续开始内部循环。当然i的值也就改变了。
{
System.out.print("*");
}
else
{
System.out.print(" ");
}
}
System.out.println();
//当2个内部循环完毕,换行。
}
}
}这是我个人的理解,但就是那个判断循环语句不知怎么来的,没思想啊,求解释。
2. 注释有些问题,注释应该在被注释代码的上面。
3. 背代码没任何意义。=========================
以上纯属个人建议,不喜勿喷
第一个循环画上面2个线 A B
第二个循环画下面2个线 C D无论ABCD 咋样,满足条件的打*,不满足的打空格 设每个点用 (行,列)表示A区打*的点 满足 (当前行,size/2+1-当前行) 大抵如此
B区打*的点 满足 (当前行,size+1-当前行)