空心菱形

今天做题练手,题目是空心菱形,一开始没什么思路,去网上找了找,发现很难找到讲的通透的,自己现在独立做出来了,记录一下,以备后用。

     *
    * *
   *   *
  *     *
 *       *
*         *
 *       *
  *     *
   *   *
    * *
     *

需求:使用循环语句打印一个10行左右的空心菱形出来。

思路

1平面的菱形,总体上还都是二维图形,二维图形就可以用双层for循环去打印出来

2这个空心菱形,要分成上下两个部分打印

3打印的时候,只需要打印左边空白的和中间空白以及*号就行。

4具体到每一行,实际就是前面的空白是一部分,后面的星号空白星号又是一部分。

这是我编码之前写的思路,看着写的浅显。后来发现里面最负责的是定位,也就是循环语句的边界,为什么要确定边界呢,后面再补充。

1、这种打印的语句,无非都是逐行扫描,一行一行的打印,每一行中的所有数据位,都可以用平面坐标系表示出来(x,y)。

非常类似于打印二维数组,想想二维数组是如何遍历打印的,双层for循环嵌套,但是这里略有不同,不同点在于,这里的“数组元素”是独立的,不是处于同一个数组,你需要一个一个去找规律,但是总体还是使用双层for循环嵌套。

2、具体到一行,你可以发现,如何把一行分割开,这样你就可以加一些条件去控制打印空格还是*星号了。

所以我观察了后发现,首先这个菱形是由两个三角形组成的,一个大一点,一个小一点,所以到时候可以分开去实现,降低复杂度。

3、先看上面的一个三角形,整体来看像是一个空白三角形和有边的三角形组合起来的,那么我的问题就变成了3个,1如何打印这个空三角形,2如何打印旁边的有边三角形,3如何在一行里实现2种三角形的内容。

这是思维逻辑,换成程序逻辑就是,如何在一个for循环(一行内容里)打印两类内容。

4、那么如何让行数和行里面的内容联系起来呢,那么在构思的时候就一定要让外层循环的计数器能够影响到内层循环,也就是内层循环的边界一定要和外界循环计数器有关系,这样就变成了一个存在已知变量,求代数表达式的过程了,具体找规律的过程就按下不表。

把源码贴出来,注释写的很详细了,关于循环边界需要动动脑子思考一下。

package com.chapter.four;
/**
 * 这是4.5 的范例 打印空心菱形
 * 需求打印一个10行的空心菱形(明明有11行啊,为什么都叫10行)
 * 1思路 平面的菱形,总体上还都是二维图形,二维图形就可以用双层for循环去打印出来
 * 2这个空心菱形,要分成上下两个部分打印
 * 3打印的时候,只需要打印左边空白的和中间空白以及*号就行。
 * 具体到每一行,实际就是前面的空白是一部分,后面的星号空白星号又是一部分。
 * @author huxingyue
 *
 */

class Diamond {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Diamond d = new Diamond();
        d.printHollowDiamond(100);
    }
//  打印空心菱形
    void printHollowDiamond(int size){
//      先取到行号
        int lineNum = 0;
        if( size%2 == 0){
        lineNum = size +1;//这是传进来要求的size,对于偶数情况的,变成奇数方便操作
        }
//      打印上半部分,就是打印前6行

        for(int n = 1;n <= lineNum/2+1;n++){
//          打印一行中前面的空白部分

            for(int m = lineNum/2;m > n-1;m--){
                System.out.print(" ");
            }
//          打印中间的星号和空白
            for(int k = 1;k < 2*n;k++){
                if(k==1||k == 2*n-1){//当在头和尾巴的时候打印星号
                    System.out.print("*");
                }else System.out.print(" ");
            }   

            System.out.println("");
        }
//      打印下半部分
        for(int n = 1;n < lineNum/2+1;n++){//打印行数
            for(int m = 1;m < n + 1;m++){//第一行只打印一个空格,
                System.out.print(" ");
            }
//          打印中间的星号和空白
            for(int k = 1; k < lineNum-2*n+1;k++){//半天没拐过来
                if(k == 1||k == lineNum-2*n){
                    System.out.print("*");
                }else System.out.print(" ");
            }

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

如果想打印实心菱形,只需要做一下小改动,和打印空心差不多,甚至简单很多。

Java温故而知新-空心菱形的更多相关文章

  1. Java打印空心菱形

    使用Java打印空心菱形 public static void main(String[] args) { int n = 5; //这里输出菱形的上半部分 for (int i = 1; i < ...

  2. java 打印空心菱形的两种实现

    第一种实现方式: //打印给定行数的空心菱形 public static void draw(int size){ if (size % 2 == 0) //如果是偶数行变为奇数 { size++; ...

  3. java输出空心菱形

    package com.zsh; import java.util.Scanner; public class Test08 { public static void main(String[] ar ...

  4. Java基础知识强化07:打印出空心菱形

    1.如图打印出空心菱形: 2.下面是逻辑实现代码: package himi.hebao04; import java.util.Scanner; public class TestDemo08 { ...

  5. Java 写三角形 空心三角形 菱形 空心菱形

    闲来无事,练习了一下Java基础中的循环语句.练习循环语句,当然少不了,用*打印出来三角形.空心三角形.菱形等这样的几何图形. 粗心大意,失误两次: 一.三角形 遇到一些小问题: 二.金字塔 由于三角 ...

  6. for循环输出空心菱形的形状【java】

    使用for循环语句输出以下“空心菱形”效果: * * * * * * * * * * * * * * * * 建议优先参考笔者的另一篇文章:<for循环输出菱形的形状[java]> 代码: ...

  7. java中打印实心菱形以及空心菱形的方法

    一.打印效果 二.实现代码汇总 为了方便初学者对代码的理解,建议熟练t1到t5为各种三角的打印,然后再进行菱形的打印实现. package circulationDemo; import java.u ...

  8. java杨辉三角和空心菱形(二维数组篇)

    一.杨辉三角 import java.util.Scanner; //导入包 public class Test7 { public static void main(String[]args){ S ...

  9. java在控制台输出空心正方形,菱形,空心菱形

     使用for和if打印一个空心正方形 /*思路:要想打印一个5x5的空心正方形,首先它的第一横行和最后一行都是填满的,需要全部遍历出来,第二三四行和只有左右两条边是出来的,中间部分为空的.因此在打印第 ...

随机推荐

  1. HTML5之placeholder属性以及如何更改placeholder属性中文字颜色

    今天在群里看到群友问了一个这样的问题,就是如何更改placeholder属性中文字的颜色,以前用过这属性,却是没更改过颜色,于是便试了试,中途遇到些问题,查找资料后特来总结一下. 熟悉HTML5的人应 ...

  2. 【SignalR学习系列】2. 第一个SignalR程序

    新建项目 1.使用VisualStudio 2015 新建一个Web项目 2.选择空模板 3.添加一个新的SignalR Hub Class (v2)类文件,并修改类名为ChatHub 4.修改Cha ...

  3. linux任务前后台执行

    Linux任务前后台的切换 Shell支持作用控制,有以下命令实现前后台切换: 1. command& 让进程在后台运行 2. jobs 查看后台运行的进程 3. fg %n 让后台运行的进程 ...

  4. Storm源码阅读之SpoutOutputCollector

    不得不说storm是一个特别棒的实时计算框架.为了对后文理解的方便,先说几个storm中的术语: Topology:拓扑图或者拓扑结构.在storm中它通过消息分组的分式连接Spout和Bolt节点定 ...

  5. LeetCode题解 343.Integer Break

    题目:Given a positive integer n, break it into the sum of at least two positive integers and maximize ...

  6. 9.Spark Streaming

    Spark Streaming 1 Why Apache Spark 2 关于Apache Spark 3 如何安装Apache Spark 4 Apache Spark的工作原理 5 spark弹性 ...

  7. Entity Framework Core 执行SQL语句和存储过程

    无论ORM有多么强大,总会出现一些特殊的情况,它无法满足我们的要求.在这篇文章中,我们介绍几种执行SQL的方法. 表结构 在具体内容开始之前,我们先简单说明一下要使用的表结构. public clas ...

  8. 朋友的发展--->对自己深深地激励。

    从4月5号来厦门开始实习到现在,也断断续续的跟着大佬开始实现需求了,就记录下自己这一段时间的想法吧,可能未来的自己看来会觉得挺可笑的,这个春招,说实话,自己挺失败的,为了求稳,来厦门这边面试美团,以至 ...

  9. HTML5——JSON的方法实现对象copy

    JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式.它基于 ECMAScript (w3c制定的js规范)的一个子集,采用完全独立于编程语言 ...

  10. Python爬虫从入门到放弃(二十一)之 Scrapy分布式部署

    按照上一篇文章中我们将代码放到远程主机是通过拷贝或者git的方式,但是如果考虑到我们又多台远程主机的情况,这种方式就比较麻烦,那有没有好用的方法呢?这里其实可以通过scrapyd,下面是这个scrap ...