JavaSE之绘制菱形

在JavaSE的算法练习中,绘制菱形是一个比较常见的案例。菱形效果如下图所示:

我们在解决算法问题时,通常情况下,先不要急于马上编码,而是要先观察,找出解决问题的关键所在。

在上图中,我们可以看到,菱形的行数与列数均可沿水平或垂直中轴线予以对折,故菱形的行数与列数均应为奇数;

菱形左上角的空格数量,从顶部至水平中轴线,依次递减,具体说来每行递减一个空格,直至水平中轴线处无空格;

菱形顶部与底部各有一个星号,顶部与底部之间(不含顶部与底部)的部分每行有两个星号,每行其余部分除了星号外均是空格,而且在菱形的上半部分,每行的星号为行起始处(列角标为0),以及列角标为该行次序的2倍数(起始为0,如:起始0行中的星号坐标为0行0列、0行2*0列,即一个星号;1行中的星号坐标为1行0列、1行2*1列,即两个星号;2行中的星号坐标为2行0列、2行2*2列,两个星号;以此类推);

菱形的上半部分沿水平中轴线对折,即可得到菱形的下半部分,从而完成菱形的绘制。

我们在做完上述的算法分析后,接下来通过编码实现菱形的绘制。请详见下述代码:

import java.util.Scanner;
/**
* 绘制菱形
* @author 李章勇
*
*/
public class Demo {
	
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);//创建一个键盘输入对象
		System.out.println("请输入一个整数:");//提示输入
		int size=sc.nextInt();//输入一个整数,并赋值给size变量
		sc.close();//关闭输入流
		if(size%2==0){//判断若不为奇数,则将其加1变为奇数
			size+=1;
		}
		//绘制菱形的上半部分
		for(int i=0;i<=size/2;i++){
			for(int j=size/2;j>i;j--){//菱形的上半部分的左上角处空格绘制
				System.out.print(" ");
			}
			
			for(int j=0;j<=2*i;j++){//菱形中星号与空格的绘制
				if(j==0 || j==2*i){
					System.out.print("*");
				}else{
					System.out.print(" ");
				}
			}
			System.out.println();//绘制好一行就换行
			
		}
		//开始绘制菱形的下半部分
		int k=0;
		for(int i=size/2+1;i<size;i++){
			k+=2;//由于是沿水平中轴线对折,故菱形的下半部分中,紧邻菱形水平中轴线的行,相当于其上两行的菱形行的对折,以此类推
			for(int j=0;j<i-size/2;j++){
				System.out.print(" ");
			}
			for(int j=0;j<=2*(i-k);j++){
				if(j==0 || j==2*(i-k)){
					System.out.print("*");
				}else{
					System.out.print(" ");
				}
			}
			System.out.println();
		}
	}
}

运行上述代码,显示效果如下:

   此外,还可以通过下述方法绘制菱形:

package com.itszt.test5;
/**
 * 绘制菱形,
 */
public class Test2 {
    public static void main(String[] args) {
        //绘制菱形,10,行列为奇数
        int n=10;
        if(n%2==0)
        {
            n+=1;
        }
        //上半部分,0--->n/2
        for(int i=0;i<=n/2;i++){
            for(int j=n/2;j>i;j--){
                System.out.print(" ");
            }
            for(int j=0;j<=2*i;j++){
                if(j==0 || j==2*i){
                    System.out.print("*");
                }else{
                    System.out.print(" ");
                }
            }
            System.out.println();
        }
        //下半部分
        for(int i=n/2-1;i>=0;i--){
            for(int j=i;j<n/2;j++){
                System.out.print(" ");
            }
            for(int j=0;j<=2*i;j++){
                if(j==0 || j==2*i){
                    System.out.print("*");
                }else{
                    System.out.print(" ");
                }
            }
            System.out.println();
        }

    }
}  
posted @ 2017-12-11 10:46  奔跑在梦想的道路上  阅读(819)  评论(0编辑  收藏  举报