一.首先先说一下我在写代码的时候遇到的一个问题:
这是在《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++) {
第二个问题打印这种菱形的方法
分步骤,可以看出我和书上例子的方法都是
- 先打印菱形上部分,总共size/2+1行
- 打印左上角空白
- 第一行打印边长size/2个空白
- 依次递减一个
- 打印星号和星号中间空白
- 星号和中间空白总共是2*i+1(i是行数,从0开始)
- 判断总数的第一个和最后一个输出星号
- 其他输出空白
- 打印左上角空白
- 打印菱形下部分,总共size/2行
- 打印右下角空白
- 第一行打印1个空白
- 依次递增一个
- 打印星号和星号中间空白
- 星号和中间空白总共是size – 2*i(i是行数,从1开始,两端都有空白)
- 判断总数的第一个和最后一个输出星号
- 其他输出空白
- 打印右下角空白
另外我在网上搜集了一些同样答应空心菱形的代码
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();
}
他的思想是当作每一行来对待:
- 先打印菱形上部分,总共hangshu/2+1行
- 第一行输出 yiban – 1 个空白(yiban = hangshu/2)
- 然后输出1个星号
- 然后输出空白 (k-2)*2+1 个空白 (k是行数,从1开始)
- 如果不是第一行输出1个星号
- 打印菱形下部分,总共size/2行
- 和上半部分的逻辑一致
- 区别在于第三部输出的空白是递减的,上半部分是递增
原来是这样