空心菱形

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

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

需求:使用循环语句打印一个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. 前端模块化工具--webpack使用感受

    话说前头 webpack前段时间有听说一下,现在已经到了3.x的版本,自己没去接触.因为之前使用gulp来作为自己的项目构建工具.现在感觉gulp使用的趋势在减少.现在这段时间去接触了webpack, ...

  2. nopCommerce 3.9 大波浪系列 之 IWebHelper

    接口:Nop.Core.IWebHelper 实现:Nop.Core.WebHelper 测试:Nop.Core.Tests.WebHelperTests 简介:Web辅助类 功能:获取客户端IP地址 ...

  3. (转)Java compiler level does not match解决方法

    背景:工作中导入以前的项目,导出报Java compiler level does not match the versionof the installed Java project facet. ...

  4. (转)Java线程:新特征-线程池

    Java线程:新特征-线程池   Sun在Java5中,对Java线程的类库做了大量的扩展,其中线程池就是Java5的新特征之一,除了线程池之外,还有很多多线程相关的内容,为多线程的编程带来了极大便利 ...

  5. Hibernate--inverse属性与cascade属性

    转载:http://www.cnblogs.com/otomedaybreak/archive/2012/01/17/2324772.html Hibernate 集合映射中,经常会使用到" ...

  6. Linux(1)目录

    Linux目录 / :根目录, 一般只存放目录, 在Linux下只有一个根目录. 所有的东西都是从这里开始 /bin, /usr/bin :可执行的二进制文件目录, 如常用的ls, tar, mv, ...

  7. 【 js 基础 】【 源码学习 】backbone 源码阅读(一)

    最近看完了 backbone.js 的源码,这里对于源码的细节就不再赘述了,大家可以 star 我的源码阅读项目(https://github.com/JiayiLi/source-code-stud ...

  8. 24. leetcode 409. Longest Palindrome

    409. Longest Palindrome Given a string which consists of lowercase or uppercase letters, find the le ...

  9. 表达式求值(二叉树方法/C++语言描述)(三)

    二叉树方法求值对运算数处理的方法与栈方法求值不太相同,除了将字符串中的运算数转换为浮点类型外,还需要生成新的节点: void Calculator::dealWithNumber(char *& ...

  10. 机器学习实战 logistic回归 python代码

    # -*- coding: utf-8 -*- """ Created on Sun Aug 06 15:57:18 2017 @author: mdz "&q ...