空心菱形

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

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

需求:使用循环语句打印一个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. Android - 电池状态

    为了解决电池图标的问题,顺带看了看电池信息的获取方法 :自己写了一个小栗子,来验证一下效果 电池的信息,一般都在BatteryManager里面,信息是用广播发出的.我们更新信息需要一个广播接收器 注 ...

  2. C++第四篇--重载_指针_引用

    C++第四篇--重载_指针_引用 1. 基础知识 重载:函数名相同,根据参数不同(类型.数量.顺序不同)调用同名函数 指针和引用:引用就是别名,引用时必须初始化,引用你定义的变量. int a; in ...

  3. RxSwift 系列(一) -- Observables

    为什么使用RxSwift? 我们编写的代码绝大多数都涉及对外部事件的响应.当用户点击操作时,我们需要编写一个@IBAction事件来响应.我们需要观察通知,以检测键盘何时改变位置.当网络请求响应数据时 ...

  4. JavaScript-DOM编程的一些常用属性

    一.Document常见属性 document.title // 设置文档标题等价于HTML的title标签 document.bgColor // 设置页面背景色 document.fgColor ...

  5. Java使用拦截器的两种方式

    拦截器是个好东西,之前用到过,现在记录一下,供以后参考使用! 其一,使用org.aspectj.lang.annotation.Aspect 先上代码: package com.test.interc ...

  6. UWP中使用Composition API实现吸顶(2)

    在上一篇中我们讨论了不涉及Pivot的吸顶操作,但是一般来说,吸顶的部分都是Pivot的Header,所以在此我们将讨论关于Pivot多个Item关联同一个Header的情况. 老样子,先做一个简单的 ...

  7. UWP中使用Composition API实现吸顶(1)

    前几天需要在UWP中实现吸顶,就在网上找了一些文章: 吸顶大法 -- UWP中的工具栏吸顶的实现方式之一 在UWP中页面滑动导航栏置顶 发现前人的实现方式大多是控制ListViewBase的Heade ...

  8. (转)Java线程:新特征-条件变量

    Java线程:新特征-条件变量   条件变量是Java5线程中很重要的一个概念,顾名思义,条件变量就是表示条件的一种变量.但是必须说明,这里的条件是没有实际含义的,仅仅是个标记而已,并且条件的含义往往 ...

  9. HDOJ2003-求绝对值

    Problem Description 求实数的绝对值.   Input 输入数据有多组,每组占一行,每行包含一个实数.   Output 对于每组输入数据,输出它的绝对值,要求每组数据输出一行,结果 ...

  10. 【HTML】table元素

    1.最简单的table <table> <tr> <th></th> </tr> <tr> <td></td& ...