黑马程序员技术交流社区

标题: 键盘录入并打印正反三角形的问题,请大神看看能否简化 [打印本页]

作者: 一面    时间: 2016-4-18 00:45
标题: 键盘录入并打印正反三角形的问题,请大神看看能否简化
自学javaSE到一半,在某网站看到这样的题目,做出来感觉代码好像太长了。
请大神看看是否可以用简单的代码重新做出来。

另外若不重写的话,下面一长串?的部分感觉太复杂,只改动那部分有没有什么好方案?

先谢谢各位大神

/*
* 需求:打印正反两个三角形,中间三行省略。如下
*   ***************
*    *************
*     ***********
*      *********
*       *******
*       *******
*      *********
*     ***********
*    *************
*   ***************
* 要求:键盘录入第一行星星数
*/
import java.util.Scanner;
public class DaYin {
        public static void main(String[] args){
                Scanner sc = new Scanner(System.in);
                System.out.println("请输入第一行星星数:");
                int a = sc.nextInt();
               
                daYinFangFa(a);
        }
       
        public static void daYinFangFa(int a){
                //创建Stringbuilder对象用于字符串拼接
                StringBuilder sb = new StringBuilder();
               
                //把空格赋值给kong
                String kong = " ";
                //把星星赋值给xing
                String xing = "*";
               
                //定义变量s,用于for循环
                int s = 0;
               
                //定义 ci 用于记录每个三角形的行数,初始化0
                int ci = 0;
               
                //使用循环计算每个三角形的行数,用 ci 记录
                //因为三角形每行减两个*,可知省略的三行*数量只有两种情况:6,4,2和5,3,1。所以每个三角形*数最少的那行应该>6
                //a为第一行*数量,减去2*ci,就是每行*数。第一行ci初始为0,a-0=a  依次类推
                while(a - (2 * ci) > 6){
                                //如果星星数>6,次数+1
                                ci++;
                }
               
                //使用for循环遍历每一行。ci是每个三角形的行数,两个三角形行数就是ci*2
                for(int hang = 0;hang < ci * 2;hang++){
                       
                        //用if判断是上面的三角形还是下面的三角形
                        if(hang < ci){
                                //使用for拼接空格。
                                for(int k = 0;k < hang;k++){
                                        sb.append(kong);
                                }
                               
                                //使用for拼接*。
                                for(int x = 0;x < a - hang * 2;x++){
                                        sb.append(xing);
                                }
                                System.out.println(sb);
                                //清空字符串
                                sb.delete(0,sb.length());
                               
                        }else{
                                //下面三角形拼接空格。
                                for(int k = 0;k < ci - 1 - s;k++){
                                        sb.append(kong);
                                }
                               
                                //拼接*。
                                //这里的a - (ci * 2) + 2 + (s * 2) 意思是:
                                //a - (ci * 2) 第一行*数a,减去两个三角形总行数(ci*2),就等于省略的最多*那一行的*数量(结果是6或者5)。
                                // + 2  就是下面三角形第一行的*数量。
                                // + (s * 2) 表示每行增加的*数
                                //太复杂。有没有改进方法????????????????????????????????????????????
                                for(int x = 0;x < a - (ci * 2) + 2 + (s * 2);x++){
                                        sb.append(xing);
                                }
                                System.out.println(sb);
                                //清空字符串
                                sb.delete(0,sb.length());
                                s++;
                        }
                }
        }
}


作者: 女神之泪    时间: 2016-4-18 07:26
顶顶~~
作者: 一面    时间: 2016-4-19 15:53
顶顶~~~~




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