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

解决方案 »

  1.   

    public class Ceshi
    {
     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.   

    1. 把printHollowRhombus(int size)方法里的size设小一点的值(比如5),for循环里的size用5代替,用笔在纸上画出打印的图,在对照代码一点点的看,应该比较容易理解了。
    2. 注释有些问题,注释应该在被注释代码的上面。
    3. 背代码没任何意义。=========================
    以上纯属个人建议,不喜勿喷
      

  3.   

    SIZE是你这个菱形的高度(行数)
      

  4.   

    简单说:一定要是奇数,因为要取中点作为中点。
    第一个循环画上面2个线 A B
    第二个循环画下面2个线 C D无论ABCD 咋样,满足条件的打*,不满足的打空格 设每个点用 (行,列)表示A区打*的点 满足 (当前行,size/2+1-当前行) 大抵如此
    B区打*的点 满足 (当前行,size+1-当前行)
     
      

  5.   

    size就是你的菱形最大宽度吧,可以多试试几个值,看看打印效果,有助理解~