Java打印空心菱形的思考

一.首先先说一下我在写代码的时候遇到的一个问题:
这是在《Java从入门到精通》第三版83页中代码

package com.mingrisoft;

public class Diamond {
    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("");
        }
    }
}
输出的结果是:
我自己看了一遍代码,然后写出了:
public class Gess {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        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; j > i; 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 = 1; i < size/2+1; i++) {
            for (int j = 0; j < i; j++) {
                System.out.print(" ");
            }
            for (int j = 0; j < size-i; j++) {
                if (j==0 || j==size-2*i-1) {
                    System.out.print("*");
                }else{
                    System.out.print(" ");
                }
            }
            System.out.println();
        }
    }

}
效果是这样的:
可以看到有些许不同,我的下半部分的菱形多输出了一些空白.原因是
for (int j = 0; j < size-i; j++) {
这里改为
for (int j = 0; j < size-2*i; j++) {
第二个问题打印这种菱形的方法
分步骤,可以看出我和书上例子的方法都是
  1. 先打印菱形上部分,总共size/2+1行
    1. 打印左上角空白
      1. 第一行打印边长size/2个空白
      2. 依次递减一个
    2. 打印星号和星号中间空白
      1. 星号和中间空白总共是2*i+1(i是行数,从0开始)
      2. 判断总数的第一个和最后一个输出星号
    3. 其他输出空白
  2.  打印菱形下部分,总共size/2行
    1. 打印右下角空白
      1. 第一行打印1个空白
      2. 依次递增一个
    2. 打印星号和星号中间空白
      1. 星号和中间空白总共是size – 2*i(i是行数,从1开始,两端都有空白)
      2. 判断总数的第一个和最后一个输出星号
    3. 其他输出空白
另外我在网上搜集了一些同样答应空心菱形的代码
int hangshu = 11; 
int yiban = hangshu / 2 + 1; 
int yibanduo = hangshu / 2; 
System.out.println("空心菱形:"); 
for(int k = 1;k <= yiban;k++){ 
    for(int i = 1;i <= (yiban - k);i++){ 
        System.out.print(" "); 
    } 
    System.out.print("*"); 
    for(int i = 1;i <= ( (k - 2) * 2 + 1);i++){
        System.out.print(" "); 
    } 
    if(k != 1){
        System.out.print("*"); 
    } 
    System.out.println(); 
} 

for(int k = yibanduo;k >=1;k--){ 
    for(int i = 1;i <= (yiban - k);i++){ 
        System.out.print(" "); 
    } 
    System.out.print("*"); 
    for(int i = 1;i <= ( (k - 2) * 2 + 1);i++){ 
        System.out.print(" "); 
    } 
    if(k != 1){ 
        System.out.print("*");   
    } 
    System.out.println(); 
}
他的思想是当作每一行来对待:
  1. 先打印菱形上部分,总共hangshu/2+1行
    1. 第一行输出 yiban – 1 个空白(yiban = hangshu/2)
    2. 然后输出1个星号
    3. 然后输出空白 (k-2)*2+1 个空白 (k是行数,从1开始)
    4. 如果不是第一行输出1个星号
  2. 打印菱形下部分,总共size/2行
    1. 和上半部分的逻辑一致
    2. 区别在于第三部输出的空白是递减的,上半部分是递增

“Java打印空心菱形的思考”的一个回复

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据