黑马程序员技术交流社区

标题: 求简化代码,打印空心菱形的代码 [打印本页]

作者: ⋛⋋⊱⋋飞☠扬    时间: 2012-11-26 23:13
标题: 求简化代码,打印空心菱形的代码
本人初学者 需求是 根据用户输入的边长  在中间 掏出一个菱形  但是我发现我的代码 似乎很凌乱 很杂 求简化代码   加注释分析 谢谢大神们


import java.util.Scanner;//召唤大神。。。
class Demo         
{
        public static void main(String[] args)
        {
                System.out.print("输入边长=");
                Scanner in = new Scanner(System.in);// 新建一个大神。。
                int num = in.nextInt();// 存到了 num 中
                int n = num/2;//
                for (int x = 1; x<= 2*n+1; x++) {//必须得是奇数行才行。。。。。
                        System.out.print("* ");
                }
                for (int x = 1; x <= n; x++) {//
                System.out.print("\n");
                        for (int y = x; y <= n ; y++) {//自减
                                System.out.print("* ");
                        }
                        for (int y = 1;y <= 2*x-1 ; y++) {//中间的菱形空格
                                        System.out.print("  ");
                        }
                        for (int y = x; y <= n ; y++) {//自减
                                System.out.print("* ");
                        }
                }
                //下面的
                for (int x = 1; x <= n-1; x++) {
                System.out.print("\n");
                        for (int y = 1; y <=x+1 ; y++) {//自增 +1 是为了 第一行输出2次
                                System.out.print("* ");
                        }
                        for (int y = 2*n -3;y >= 2*x-1; y--) {
                                        System.out.print("  ");
                        }
                        for (int y = 1; y <= x+1 ; y++) {//同上
                                System.out.print("* ");
                        }
                }
                        System.out.print("\n");
                for (int x = 1; x<= 2*n+1; x++) {
                        System.out.print("* ");
                }

        }
}   
作者: 黑马-王宁    时间: 2012-11-27 13:14
思路:
设座标原点为   0,0
设菱长为   len
则纵轴横座标也是   len
则最大横座标及总行数都是len*2
那第i行的第一个实心点 x的横座标是 len-i的绝对值(len指纵轴横座标)
则第i行的第二个实心点 y 的横座标是 len+(len-x)   (len同上,x指x点的横座标)
循环判断第i行的每一个点是不是 x 或 y点,如果是,则输出 * ,否则输出汉字空格。
注意 len 为两个 * 之间的距离,所以三个* 是两个长度
  1. public class Test {   
  2. public   static   void   main(String[]   args)   {   
  3.    int   len=2;   //菱长   
  4.    String   outstr=" "; //输出   
  5.    int   i,j,x,y;   
  6.     for(i=0;i <=len*2;i++) {   
  7.   for(j=0;j <=len*2;j++) {   
  8.    x=len-i;   
  9.    x=x <0?-1*x:x;   
  10.    y=len+(len-x);   
  11.    outstr+=(j==x||j==y? "*": " ");   
  12.   }   
  13.     outstr+= "\n ";   
  14.     }   
  15.    System.out.println(outstr);
  16.    }
  17. }  
复制代码

作者: 余磊    时间: 2012-11-27 21:53
这代码NB!开始我也想了下,实在没啥好想法!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2