空心菱形

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

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

需求:使用循环语句打印一个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. PHP超全局变量$_SERVER

    $_SERVER 是一个包含了诸如头信息(header).路径(path).以及脚本位置(script locations)等等信息的数组.这个数组中的项目由 Web 服务器创建.不能保证每个服务器都 ...

  2. nopCommerce 3.9 大波浪系列 之 NUnit 配置调试环境

    官网:http://nunit.org/ GitHub:https://github.com/nunit 本文只介绍NUnit在VS中的配置使用,进一步学习 NUnit 请参考官方文档. nopCom ...

  3. Jmeter实现MD5加密

    Jmeter3.0以后的版本不再内置MD5加密函数,只能自己写了. 1.编码 package com.liuke.test; import java.security.MessageDigest; i ...

  4. CONSOLE_SCREEN_BUFFER_INFO 结构体

    CONSOLE_SCREEN_BUFFER_INFO结构体 来源:https://msdn.microsoft.com/en-us/library/ms682093(v=vs.85).aspx 作用 ...

  5. linux服务器部署jar包以及shell脚本的书写

    背景:记录在linux环境下部署jar程序的过程 1 部署过程记录 1.1 程序结构 这里的main函数就在DemRest2.java 文件中. 为了部署方便,要做到以下两点: 1 在导出的jar包中 ...

  6. 【SignalR学习系列】8. SignalR Hubs Api 详解(.Net C# 客户端)

    建立一个 SignalR 连接 var hubConnection = new HubConnection("http://www.contoso.com/"); IHubProx ...

  7. Linux系统运维工程该具备哪些素质

    记得在上高中时,物理老师总是会对我们一句话:"学习是件苦差事."工作后发现,其实做运维也是件苦差事.最为一名运维工程师,深知这一行的艰辛,但和IT行业其他职务一样,那就是付出的越多 ...

  8. Linux文件系统,ntfs分区显示只读文件系统,提示超级快损坏

    背景:某天当我打开自己的设备,突然发现ntfs分区无法写入任何文件,提示为只读文件系统,具体现象如下: 修复过程:排除权限问题,使用fsck进行修复无果后,使用e2fsck进行修复 显示超级快损坏,这 ...

  9. Android学习笔记-App初始启动界面实现

    android手机上的很多应用程序启动时都会先显示一个图片,作为该应用程序的开始,该图片转瞬即逝.这个图片一般都会用应用的图标,作为广告来用. 例如: 它的实现方式很简单,我们以一个测试APP为例,介 ...

  10. vue-cli的webpack模板项目配置文件分析

    由于最近在vue-cli生成的webpack模板项目的基础上写一个小东西,开发过程中需要改动到build和config里面一些相关的配置,所以刚好趁此机会将所有配置文件看一遍,理一理思路,也便于以后修 ...