menu HCG_Sky's Blog
more_vert
chevron_right 首页 » 学习笔记,教程,随笔 » Java案例-金字塔
Java案例-金字塔
2021-11-07 | 学习笔记,教程,随笔 | 暂无评论 | 145 次阅读 | 1331字

九层妖塔?不!他可以是N层!一起来看看吧~

前言

开学几个星期了专业 Java 课终于有作业了哈哈哈。。。。。。。
作业需求是使用循环选择语句输出一个金字塔

说干就干,在宿舍用IDEA捣鼓了好一会(我菜),最终就实现了哈哈哈
下面我们来看看吧~


先找规律

每层金字塔前都是有相应的空格的,星号与星号之间也空一格

      *                //最顶层,第六层,星号前相应空了6个空格
     * *              //第五层,星号前相应空了5个空格
    * * *            //4个空格
   * * * *          //3个空格
  * * * * *        //2个空格
 * * * * * *      //1个空格

方法一:直接输出

 想要输出一个金字塔最简单粗暴的方式就是直接给它 print 出来,但是题目要求要用循环和选择语句,而且万一我想要1w层的金字塔呢,那不得累死哈哈哈,所以这种方法不可取

System.out.println("      *");
System.out.println("     * *");
System.out.println("    * * *");
System.out.println("   * * * *");
System.out.println("  * * * * *");
System.out.println(" * * * * * *");

方法二:利用循环、选择、嵌套

 刚刚的方法一用了6个输出语句,这里重复了六次的输出语句,我们用一个for循环来进行代替

for(int x = 0;x < layer;x++){            //layer就是我们需要的层数,这里我们用一个变量来表示
    System.out/println("      *");        //layer 英译:层
}

 问题又来了,直接执行6次输出语句是肯定不行的,因为每行的星星数和每行第一个星星前空的空格数都是不一样的,问题辣么多,我们得一个个来,先解决第一个星星前空的空格,通过观察我们发现每行第一个星星前空的空格数和当前所在层数是一样的,第6层就空6个,第五层就空5个......这样依次递减直到最底层1层,所以在这我们可以在刚刚我们写的循环里嵌套一个循环来解决这个问题

int times = layer;                        //定义一个随层数变化的times变量

for(int z = 0;z < times;z++){            //每层输出与层数相同的空格
    System.out.print(" ");
}

times--;                              //输出的空格数逐层递减
//以上是第二步的代码
==========================================================================
//以下将一二步合起来的代码
int times = layer;    

for(int x = 0;x < layer;x++){
    
    for(int z = 0;z < times;z++){
        System.out.print(" ");
    }
    times--;
}

 写到这里,我们已经解决了层数、空格的问题,剩下的就是输出星星啦!你会说“这个简单!用多一个循环进行输出就好啦!”,确实不错,那我们来试试把~

int n = 1;                        //因为塔的层数是从塔顶一层层输出的,每层的星星数逐层+1
                               //所以定义一个初始值为1的变量n(塔顶星星数是1)
for(int y = 1;y <= n;y++){
    System.out.println("*");
}

n++;                           //星星数逐层增加
//以上是第三步的代码
=======================================================================================
//以下将一二三步合起来的代码
int times = layer;
int n = 1;

for(int x = 0;x < layer;x++){
    
    for(int z = 0;z < times;z++){
        System.out.print(" ");
    }
    
    for(int y = 1;y <= n;y++){
        System.out.println("*");
    }
    times--;
    n++;
}

 既然所有需求都解决了那就给layer赋值来运行一下试试把,这里我们采用Scanner方法手动输入我们想要的层数,代码如下

Scanner layerdata = new Scanner(System.in);            //将我们输入的数值赋值给layer
System.out.print("请输入塔的层数:");
int layer = layerdata.nextInt();
//以上是layer赋值的代码
====================================================================================
//完整代码
import java.util.Scanner;                    //记得在类名外导包哦!
    
Scanner layerdata = new Scanner(System.in);
System.out.print("请输入塔的层数:");
int layer = layerdata.nextInt();

int times = layer;
int n = 1;

for(int x = 0;x < layer;x++){
    
    for(int z = 0;z < times;z++){
        System.out.print(" ");
    }
    
    for(int y = 1;y <= n;y++){
        System.out.println("*");
    }
    times--;
    n++;
}

 通过运行我们写的这段代码你会发现,问题又双叒叕来了,你会发现老子写半天这输出的是个什么玩意啊!

 这里就得提到了我们的printprintln,前者的输出是会跟着上一个输出内容的尾部的,后者的输出是换至下一行再进行输出,说这么多不如上代码是吧哈哈哈

System.out.println("*");
System.out.println("*");
System.out.println("*");

System.out.print("*");
System.out.print("*");
System.out.print("*");

//println的输出结果
*
*
*
    
//print的输出结果
***

 既然找到了问题的所在那我们就去解决它把!把println 改成print然后冲就完事了!

//完整代码
import java.util.Scanner;                    //记得在类名外导包哦!
    
Scanner layerdata = new Scanner(System.in);
System.out.print("请输入塔的层数:");
int layer = layerdata.nextInt();

int times = layer;
int n = 1;

for(int x = 0;x < layer;x++){
    
    for(int z = 0;z < times;z++){
        System.out.print(" ");
    }
    
    for(int y = 1;y <= n;y++){
        System.out.print("*");
    }
    times--;
    n++;
}

 果然事情没那么简单是吧哈哈哈哈,不过至少有那味了是不是

 既然有那味了,证明我们的方向没有错,现在看来我们就差空个行了,但是空行输出又会见鬼,怎么办呢?通过观察我们不难发现,只需要将每行的第一个星星进行空行输出就行了,所以这个时候我们就可以掏出我们的判断语句if了,代码如下

if(y == n){
    System.out.println("*");        //当循环去到输出最后一个星星时,进行换行输出
}else {
    System.out.print("* ");         //在去到最后一次之前每个星星之间空一格输出
}
//以上是判断输出方式的代码
====================================================================================
//完整代码
import java.util.Scanner;                    //记得在类名外导包哦!
    
Scanner layerdata = new Scanner(System.in);
System.out.print("请输入塔的层数:");
int layer = layerdata.nextInt();

int times = layer;
int n = 1;

for(int x = 0;x < layer;x++){
    
    for(int z = 0;z < times;z++){
        System.out.print(" ");
    }
    
    for(int y = 1;y <= n;y++){
        if(y == n){
            System.out.println("*");
        }else {
            System.out.print("* ");
        }
    }
    times--;
    n++;
}

 到这我们心心念念的金字塔就出现啦!!!

写在最后

 我写的这个方法可能(自信点,把可能去掉)不是那么的简洁高效,但也是在电脑前一点点琢磨出来的,希望各位和我一样初学Java的好兄弟也能沉下心来慢慢的体会,CV大法虽然好,但你真正学到了吗,自己研究过后再来看看别的大神的代码也不迟嘛,最后希望大家都能敲出自己心仪的代码!也希望好兄弟们作为一个未来程序员要有自己排查并解决问题的能力,记住!有了耐心和毅力,你就拥有一切!

直接运行的代码

↓代码要格式化,大家也不要例外哦↓
import java.util.Scanner;

public class jinzita{
    public static void main(String[] args){
        
        Scanner layerdata = new Scanner(System.in);
        System.out.print("请输入塔的层数:");
        int layer = layerdata.nextInt();

        int times = layer;
        int n = 1;

        for(int x = 0;x < layer;x++){
    
            for(int z = 0;z < times;z++){
                System.out.print(" ");
            }
    
            for(int y = 1;y <= n;y++){
                if(y == n){
                    System.out.println("*");
                }else {
                    System.out.print("* ");
                }
            }
            times--;
            n++;
        }    
    }
}

效果


废话少说

快去做作业吧哈哈
文章目录
发表评论
暂无评论
textsms
account_circle
email
link


七牛云 腾讯云 阿里云 百度统计 TrustAsia 安全签章 MySSL 安全签章