在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(); } } }