【程序19】   
题目:打印出如下图案(菱形)   
     *   
    ***   
   *****   
  *******   
   *****   
    ***   
     *   
public class lianxi19 {
public static void main(String[] args) {
    int H = 7, W = 7;//高和宽必须是相等的奇数
    for(int i=0; i<(H+1) / 2; i++) {
     for(int j=0; j<W/2-i; j++) {
      System.out.print(" ");
     }
     for(int k=1; k<(i+1)*2; k++) {
      System.out.print('*');
     }
     System.out.println();
    }
    for(int i=1; i<=H/2; i++) {
     for(int j=1; j<=i; j++) {
      System.out.print(" ");
     }
     for(int k=1; k<=W-2*i; k++) {
      System.out.print('*');
     }
     System.out.println();
    }
}
}
我看见很多帖子的for循环初适量有的是1,有的是0,中间那个时而<,时而<=,弄得我非常混乱,全部变成0和<不好吗?如下:
public class LinXing {
public static void main(String[] args){
for(int i=0;i<4;i++){
for(int j=0;j<3-i;j++){
System.out.print(" ");
}
for(int j=0;j<i*2+1;j++){
System.out.print("*");
}
System.out.println();
}
for(int i=0;i<3;i++){
for(int j=0;j<i+1;j++){
System.out.print(" ");
}
for(int j=0;j<5-2*i;j++){
System.out.print("*");
}
System.out.println();
}
}

解决方案 »

  1.   


    public class Test1 {
        public static void main(String[] args) {
    int i = 11;//总层数,是个奇数
    int h = i/2;
    for(int n = 0;n<h+1;n++){
    int temp = 2*n+1;
    for(int j = 0;j<temp;j++){
    System.out.print("*");
    }
    System.out.println();
    }
    for(int n = h-1;n>=0;n--){
    int temp = 2*n+1;
    for(int j = 0;j<temp;j++){
    System.out.print("*");
    }
    System.out.println();
    }
    }
    }
      

  2.   

    原来在一个帖子中回复的,摘录下来希望对你有用:public class Test {    public static void main(String[] args) {
            printDiamond(7, true);
            System.out.println();
            printDiamond(7, false);
        }    /**
         * 输出菱形
         * @param line       菱形的行数
         * @param isSolid    是否为实心
         */
        private static void printDiamond(int line, boolean isSolid) {
            line = line % 2 == 0 ? line + 1 : line;
            for(int k = line / 2, i = -k; i <= k; i++) {
                for(int j = -k, m = k - Math.abs(i); j <= m; j++) {
                    boolean b;
                    if(isSolid) {
                        b = Math.abs(j) + Math.abs(i) > k;
                    } else {
                        b = Math.abs(j) + Math.abs(i) != k;                    
                    }
                    System.out.print(b ? " " : "*");
                }
                System.out.println();
            }
        }
    }分析如下:菱形是一个上下、左右对称的图形,行列可以按照下面的方式来进行循环    j=
        -3  -2  -1   0   1   2   3
    i= +---+---+---+---+
    -3 |   |   |   | * |
       +---+---+---+---+---+
    -2 |   |   | * | * | * |
       +---+---+---+---+---+---+
    -1 |   | * | * | * | * | * |
       +---+---+---+---+---+---+---+
     0 | * | * | * | * | * | * | * |
       +---+---+---+---+---+---+---+
     1 |   | * | * | * | * | * |
       +---+---+---+---+---+---+
     2 |   |   | * | * | * |
       +---+---+---+---+---+
     3 |   |   |   | * |
       +---+---+---+---+行数为 7,则 7/2 = 3,这个数值很有用处,暂且称为 K。i 和 j 的循环起始均为 -K,而 i 的终止循环为 K,j 的终止循环条件理应为 K,
    注意右边,我特意把它挖空了,因为右边的都是空格,为了优化程序就没有必要输
    出了,这样 j 的循环终止条件与 i 是有密切关系的,为 K - Math.abs(i),即:
    当 i = -1 时,K - Math.abs(i) = 2,因此 j 只要从 -3 循环到 2 就可以了。再看看 * 位置上的规律,注意最左边的 *,在 Math.abs(i) + Math.abs(j) > K 时
    输出的是空格,小于等于 K 时,输出的是 *。在 i = -2, j = -2 坐标上,Math.abs(i) + Math.abs(j) = 4,4 是大于 K 的,因此输出空格
    若 i = -2, j = -1 坐标上,Math.abs(i) + Math.abs(j) = 3,3 是不大于 K 的,因此输出 *如果需要的是空心菱心,只要把判断条件设为 Math.abs(i) + Math.abs(j) == K 时
    才输出 *,否则输出空格。因此,这样我们就利用于图形的对称性完成了菱形的输出。