java SE 用星号打印图形

今天突然想到了自己对for循环的理解,因为之前老师讲过九九乘法表的打印方法,自己却还没真的那么做过,就想着要做一下,顺便就把打印图形再复习一遍。

首先是打印一个九九乘法表

package demo0124;

/**
 * 一个九九乘法表
 * 
 * @author Feng 2018年1月24日下午12:24:15
 */
public class ChengFaTable {

    public static void main(String[] args) {
        // TODO 自动生成的方法存根
        for (int i = 1; i <= 9; i++) {

            for (int j = 1; j <= i; j++) {
                System.out.print(j + "*" + i + "=" + i * j + "\t");
            }
            System.out.println();
        }
    }

}

结果如图示:

这里写图片描述

接下来就是图形的问题了

关于这个,我把几乎所有的认识都放在了注释里边,觉得那样容易理解些。

package d;

public class Demo01 {
    public static void main(String[] args) {
        /**
         * 用*  打印出图形,使用for 循环嵌套来实现。
         * 有直角三角形,等腰三角形,菱形,平行四边形。
         * 
         * 首先来分析:
         *1、 for 循环嵌套时,有内层循环和外层循环,首先一定得明白,外层执行一次,内层执行一遍。
         *2、程序中打印字符是一行一行打印的。也就是需要在换行的地方多思考
         *3、*****
         *   ****
         *   ***
         *   **
         *   *
         *   这个图形的形成是怎样的,我们可以很明显就能看出来,第一行有5个* ,然后换行,再到第二行,*是少了一个的。
         *   可以把外层看做是  行数,而内层循环是列数,每一行的列数。
         *   这样就能好理解一些了。因为第3、4、5行都是逐层递减的。也就是内层的循环次数是在外层循环每执行一次的时候就减少一次。
         *   我们可以先确定行数,以上边这个直角三角形为例,它是外层循环5次,内层循环5次,只是内层每执行一次打印的*就少一个。
         * @author Feng
         * 2018年1月24日下午12:06:36
         */
        //直角三角形方法1
        for (int i = 0; i < 5; i++) {//用 i 来表示行数,外层是循环5次。
            //每打印完一行的*之后,换行并且i+1换到下一行,这里的j<5-i就表示在i从0到4递增的同时,j是从5到1的递减的
            //所以就能出现第一行5个*,第2行4个*,第三行3个*,一直到第5行是1个*,组合起来就刚好是一个直角三角形了。
            for (int j = 0; j < 5-i; j++) {//用j 来表示列数,内层也是5次。
                System.out.print("*");//在第i行打印*,*的个数由j确定。
            }
            System.out.println();//当内层循环完一圈之后,就换行,第一次是5个*就换行。
        }
        //直角三角形方法2
        for (int i = 0; i < 5; i++) {
            for (int j = i; j < 5; j++) {
                System.out.print("*");
            }
            System.out.println();
        }
        //尖朝上的直角三角形
        System.out.println("======================================");
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j <= i; j++) {
                System.out.print("*");

            }
            System.out.println();

        }

        System.out.println("======================================");
        //平行四边形,由尖朝上的直角三角形,空白的(我这里用2表示,当输出是" "的时候就能看出是个矩形,不过斜着来了一刀,也是尖朝下的。)
        //所以平行四边形是由3部分组成的,3个三角形,一个是空格组成的三角形
        /**
         *  *
         *  **
         *  ***
         *  ****
         *  *****
         *  2****
         *  22***
         *  222**
         *  2222*
         *  22222
         * 
         * 分析一下:平行四边形,用1个四行四列得到三角形在底下,5行5列的在上边
         * 这里的2是打印的空格的地方,其实就是上边那个尖朝上的三角形了。
         */
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j <= i; j++) {
                System.out.print("*");

            }
            System.out.println();

        }
        for (int i = 0; i < 5; i++) {//同样是外循环5次
            for (int j = 0; j <= i; j++) {//随着i的增加,j是从0到4的。
                System.out.print("2");//5行5列的空白。
            }
            for (int j = 0; j < (4 - i); j++) {//随着i从0到4的增加,j是从0到3的增加。
                System.out.print("*");//4行4列的*。
            }
            System.out.println();

        }
        System.out.println("======================================");
        //倒等腰三角
        /**
         * *******
         *  *****
         *   ***
         *    *
         *    
         * 同样是先打印个尖向上的空白三角形
         */
        for(int i = 0; i < 4 ; i++){//4行
            for(int j =0 ;j <= i; j++){//4列
                System.out.print("5");//空白区域是4行4列的三角形
            }
            for(int k = 0 ;k < (3-i)*2+1 ;k++){//随着i的增加,k的变化是  6+1,4+1,2+1,0+1
                //也就是说,第一行除了打印了1个空白之外,还有7个*,第二行是5个*,依次类推。
                System.out.print("*");
            }
            System.out.println();
        }
        System.out.println("======================================");
        //正等腰三角
        for(int i = 0; i < 4 ; i++){

            for(int j =0 ; j < 4-i;j ++ ){
                System.out.print(" ");
            }
            System.out.print("*");
            for(int k = 0 ;k <i*2;k++){
                System.out.print("*");
            }
            System.out.println();
        }
        System.out.println("======================================");
        //菱形的笨蛋方法
        //直接用2个等腰三角形拼起来。
        for(int i = 0; i < 4 ; i++){

            for(int j =0 ; j < 4-i;j ++ ){
                System.out.print(" ");
            }
            for(int k = 0 ;k <i*2+1;k++){
                System.out.print("*");
            }
            System.out.println();
        }
        for(int i = 0; i < 4 ; i++){
            for(int j =0 ;j <= i+1; j++){
                System.out.print(" ");
            }
            for(int k = 0 ;k <(7-2*i) ;k++){//把倒的等腰三角放在正的等腰三角形下边。
                System.out.print("*");
            }
            System.out.println();
        }
        System.out.println("======================================");
        //可以看到,直接拼是不行的,这样只能得到一个平行四边形。还得调整一下条件。
        for(int i = 0; i < 4 ; i++){

            for(int j =0 ; j < 4-i;j ++ ){
                System.out.print(" ");
            }
            for(int k = 0 ;k <i*2+1;k++){
                System.out.print("*");
            }
            System.out.println();
        }
        for(int i = 0; i < 4 ; i++){
            for(int j =0 ;j <= i+1; j++){
                System.out.print(" ");
            }
            for(int k = 0 ;k <(5-2*i) ;k++){//把倒的等腰三角放在正的等腰三角形下边。
                //这时的k变化是:4,3,1,所以就有下边那个3行的三角形。
                System.out.print("*");
            }
            System.out.println();
        }
    }

}

对了,差点忘记附上截图了。
这里写图片描述
这里写图片描述
还有就是

打印输入行数的等腰三角形和菱形

/**
         * 等腰三角形
         * 输入行数,然后打印所输入行数的三角形。
         * 
         * 思考:
         * 8888888
         * 888888*
         * 88888***
         * 8888*****
         * 888*******
         * 88*********
         * 8***********
         * 
         * 这里的8,到时候就是空白区域
         * 
         * 
         */
        @SuppressWarnings("resource")
        Scanner input = new Scanner(System.in);
        System.out.println("请输入你所需要打印的三角形的行数:");
        int row1 = input.nextInt();//行数
        for(int i = 0; i < row1+1 ;i++){//外层循环控制行数
            for(int k = row1+1 -i ;k >0 ;k--){//6行就是7行空白,当i等于0的时候,k是行数,而且每次换行之后就把空白个数减去1。
                System.out.print("8");
            }
            for(int j = 1; j <= 2*i-1 ;j++){//当i等于0,j是小于等于
                System.out.print("*");
            }
            System.out.println();
        }
        System.out.println("===============================");
        //打印输入行数的菱形
        //将打印输入行数的三角形修改一下。
        System.out.println("请输入你要打印的菱形的行数:");
        //这里用的是上半个三角形的行数。
        @SuppressWarnings("unused")
        int row2 = input.nextInt();
        //上边部分是将打印三角形的代码拷贝一下。
        //可以看到,菱形如果是两个三角形兑着的话,就是奇数行。
        /**
         * 8***************
         * 88*************
         * 888***********
         * 8888*********
         * 88888*******
         * 888888*****
         * 8888888***
         * 88888888*
         * 888888888
         * 
         * 还有可能要将这下边的最上面一行去掉。
         */
        if(row2%2!=0){

            for(int i = 0; i < (row2/2)+1+1 ;i++){//外层循环控制行数
                for(int k = row2/2+2 -i ;k >0 ;k--){
                    System.out.print("8");
                }
                for(int j = 1; j <= 2*i-1 ;j++){
                    System.out.print("*");
                }
                System.out.println();
            }
            for(int i =0;i < row2/2+1;i++){
                for(int k = 0;k <= i+1;k++){//i从0开始,row2是行数,k是打印空白的列数
                    System.out.print("9");
                }
                for (int j = 0; j <= (row2/2+1-i)*2-4 ; j++) {
                    System.out.print("*");
                }
                System.out.println();
            }
        }else{
            System.out.println("菱形行数不能为偶数!");
            System.out.println("正在退出");
            System.exit(0);
        }

这里写图片描述
行啦,我的砖就抛到这儿了,哪位帅哥靓妹有好的想法可以交流哦~
记得留言哦。
这里写图片描述
这最后的图是我修改之前的打印菱形,它的缺点是输入的是菱形上半边的比较大的那个三角形的行数。并不是菱形的行数,所以试了老半天,最后出现的结果就是把这个行数除以2加上1,这样算的就是菱形的行数了。基本就是照着倒三角形的模样修修改改,主要改的就是条件了,其他地方仍然拿来用就行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章