在JavaSE的算法练习中,绘制菱形是一个比较常见的案例。菱形效果如下图所示:

我们在解决算法问题时,通常情况下,先不要急于马上编码,而是要先观察,找出解决问题的关键所在。

在上图中,我们可以看到,菱形的行数与列数均可沿水平或垂直中轴线予以对折,故菱形的行数与列数均应为奇数;

菱形左上角的空格数量,从顶部至水平中轴线,依次递减,具体说来每行递减一个空格,直至水平中轴线处无空格;

菱形顶部与底部各有一个星号,顶部与底部之间(不含顶部与底部)的部分每行有两个星号,每行其余部分除了星号外均是空格,而且在菱形的上半部分,每行的星号为行起始处(列角标为0),以及列角标为该行次序的2倍数(起始为0,如:起始0行中的星号坐标为0行0列、0行2*0列,即一个星号;1行中的星号坐标为1行0列、1行2*1列,即两个星号;2行中的星号坐标为2行0列、2行2*2列,两个星号;以此类推);

菱形的上半部分沿水平中轴线对折,即可得到菱形的下半部分,从而完成菱形的绘制。

我们在做完上述的算法分析后,接下来通过编码实现菱形的绘制。请详见下述代码:

  1. import java.util.Scanner;
  2. /**
  3. * 绘制菱形
  4. * @author 李章勇
  5. *
  6. */
  7. public class Demo {
  8.  
  9. public static void main(String[] args) {
  10. Scanner sc=new Scanner(System.in);//创建一个键盘输入对象
  11. System.out.println("请输入一个整数:");//提示输入
  12. int size=sc.nextInt();//输入一个整数,并赋值给size变量
  13. sc.close();//关闭输入流
  14. if(size%2==0){//判断若不为奇数,则将其加1变为奇数
  15. size+=1;
  16. }
  17. //绘制菱形的上半部分
  18. for(int i=0;i<=size/2;i++){
  19. for(int j=size/2;j>i;j--){//菱形的上半部分的左上角处空格绘制
  20. System.out.print(" ");
  21. }
  22.  
  23. for(int j=0;j<=2*i;j++){//菱形中星号与空格的绘制
  24. if(j==0 || j==2*i){
  25. System.out.print("*");
  26. }else{
  27. System.out.print(" ");
  28. }
  29. }
  30. System.out.println();//绘制好一行就换行
  31.  
  32. }
  33. //开始绘制菱形的下半部分
  34. int k=0;
  35. for(int i=size/2+1;i<size;i++){
  36. k+=2;//由于是沿水平中轴线对折,故菱形的下半部分中,紧邻菱形水平中轴线的行,相当于其上两行的菱形行的对折,以此类推
  37. for(int j=0;j<i-size/2;j++){
  38. System.out.print(" ");
  39. }
  40. for(int j=0;j<=2*(i-k);j++){
  41. if(j==0 || j==2*(i-k)){
  42. System.out.print("*");
  43. }else{
  44. System.out.print(" ");
  45. }
  46. }
  47. System.out.println();
  48. }
  49. }
  50. }

运行上述代码,显示效果如下:

  此外,还可以通过下述方法绘制菱形:

  1. package com.itszt.test5;
  2. /**
  3. * 绘制菱形,
  4. */
  5. public class Test2 {
  6. public static void main(String[] args) {
  7. //绘制菱形,10,行列为奇数
  8. int n=10;
  9. if(n%2==0)
  10. {
  11. n+=1;
  12. }
  13. //上半部分,0--->n/2
  14. for(int i=0;i<=n/2;i++){
  15. for(int j=n/2;j>i;j--){
  16. System.out.print(" ");
  17. }
  18. for(int j=0;j<=2*i;j++){
  19. if(j==0 || j==2*i){
  20. System.out.print("*");
  21. }else{
  22. System.out.print(" ");
  23. }
  24. }
  25. System.out.println();
  26. }
  27. //下半部分
  28. for(int i=n/2-1;i>=0;i--){
  29. for(int j=i;j<n/2;j++){
  30. System.out.print(" ");
  31. }
  32. for(int j=0;j<=2*i;j++){
  33. if(j==0 || j==2*i){
  34. System.out.print("*");
  35. }else{
  36. System.out.print(" ");
  37. }
  38. }
  39. System.out.println();
  40. }
  41.  
  42. }
  43. }  

JavaSE之绘制菱形的更多相关文章

  1. OpenGL的几何变换[转]

    OpenGL的几何变换 1.实验目的: 理解掌握一个OpenGL程序平移.旋转.缩放变换的方法. 2.实验内容: (1)阅读实验原理,运行示范实验代码,掌握OpenGL程序平移.旋转.缩放变换的方法: ...

  2. (生活)Photoshop入门(不定时更新)

    我可能是想找个工作以外的事情做一下. 目标:我要自学网PhotoShop商业修图. 笔记: .图层 .1总结: 1.1.1图层就好像画画的一张纸,但是每一层又互不影响. 1.1.2图层蒙版(覆盖一层玻 ...

  3. 实验3 OpenGL几何变换

    转自:http://www.cnblogs.com/opengl/archive/2012/10/30/2747130.html 1.实验目的: 理解掌握一个OpenGL程序平移.旋转.缩放变换的方法 ...

  4. VC2008中如何为MFC应用程序添加和删除消息响应函数

    最近重温<MFC Windows应用程序设计>第二版这本书,里面的代码全部是使用VC6.0写的,我Win7下安装的是VS2008开发环境. VC2008下添加和删除常见的消息响应函数有两种 ...

  5. Word2010制作倒福字

    原文: https://www.toutiao.com/i6489772955797553677/ 选择"插入"选项卡,"插图"功能组,"形状&quo ...

  6. 摘记 史上最强大的40多个纯CSS绘制的图形(一)

    今天在国外的网站上看到了很多看似简单却又非常强大的纯CSS绘制的图形,里面有最简单的矩形.圆形和三角形,也有各种常见的多边形,甚至是阴阳太极和网站小图标,真的非常强大,分享给大家. Square(正方 ...

  7. 史上最强大的40多个纯CSS绘制的图形

    Square(正方形) #square { width: 100px; height: 100px; background: red; } Rectangle(矩形) #rectangle { wid ...

  8. 40多个纯CSS绘制的图形

    本文由码农网 – 陈少华原创,转载请看清文末的转载要求. 今天在国外的网站上看到了很多看似简单却又非常强大的纯CSS绘制的图形,里面有最简单的矩形.圆形和三角形,也有各种常见的多边形,甚至是阴阳太极和 ...

  9. 用css3绘制你需要的几何图形

    1.圆形 示例: 思路:给任何正方形元素设置一个足够大的 border-radius ,就可以把它变成一个圆形.代码如下: html: <div class="size example ...

随机推荐

  1. Java基础总结--方法(函数)

    ---函数的作用---实现特定功能的代码--是一种代码重用的方式---函数的格式---访问修饰符 返回值类型 函数名(参数列表){语句:} 参数列表包含参数的类型和参数名(参数列表要注意顺序)---关 ...

  2. LeetCode 238. Product of Array Except Self (去除自己的数组之积)

    Given an array of n integers where n > 1, nums, return an array output such that output[i] is equ ...

  3. LeetCode 63. Unique Path II(所有不同路径之二)

    Follow up for "Unique Paths": Now consider if some obstacles are added to the grids. How m ...

  4. python中openpyxl的用法【安装,以及一些基本的操作】

    概述 Openpyxl是python中简单易用的操作excel电子表格的一个模块.接下来呢,跟博主一起学习一下吧  ----_<_>_---- 首先先清楚一些excel的基本概念: 在op ...

  5. 解决IDEA Struts2 web.xml问题

    用IDEA整合SSH时,在web.xml中配置Struts2核心过滤器--"<filter-class>org.apache.struts2.dispatcher.ng.filt ...

  6. Java基础笔记6

    OOP(Object Oriented Programmer) 面向对象编程     面向对象编程的语言:JAVA,C#,PHP,ASP 用途:把现实中的任何对象描述成java语言. java面向对象 ...

  7. Java微信公众平台开发_02_启用服务器配置

    源码将在晚上上传到 github 一.准备阶段 需要准备事项: 1.一个能在公网上访问的项目: 见:[  Java微信公众平台开发_01_本地服务器映射外网  ] 2.一个微信公众平台账号: 去注册: ...

  8. 关于mysql的临时表并行的问题

    mysql的临时表并行是没问题的 以为临时表是基于会话的 1.因为在mysql里面每个会话的sessionid 不一样 2.其实就是会话级别的临时表  DB2里面有会话级别 全局级别的临时表,Orac ...

  9. 理解typename的两个含义

    理解typename的两个含义 问题:在下面的 template declarations(模板声明)中 class 和 typename 有什么不同? template<class T> ...

  10. 多项式求和,素数判定 HDU2011.2012

    HDU 2011:多项式求和 Description 多项式的描述如下: 1 - 1/2 + 1/3 - 1/4 + 1/5 - 1/6 + ... 现在请你求出该多项式的前n项的和.   Input ...