• 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();
            }
    
        }
    }  
  • 相关阅读:
    OpenCV——花环生成函数
    机器学习 Regularization and model selection
    OpenCV——PS 滤镜算法之极坐标变换到平面坐标
    OpenCV——PS 滤镜算法之平面坐标到极坐标的变换
    PS 滤镜— — 万花筒效果
    OpenCV——高斯模糊与毛玻璃特效
    PS 滤镜— —扇形warp
    OpenCV——旋转模糊
    使用zlib实现gzip格式数据的压缩和解压
    PS 滤镜— —水波效果
  • 原文地址:https://www.cnblogs.com/lizhangyong/p/8021932.html
Copyright © 2020-2023  润新知