从锦囊妙计想到的27–多次叠加操作绘制复杂图形

前面26介绍了采用应用中间一个辅助数组的办法, 来辅助缓存中间结果, 然后可以绘制复杂的图形, 今天继续这个话题, 看一个在略微复杂一点的输出

先看一下, 输出的图形

如上图, 若是输出这个图形不采用中间缓存的办法, 直接写, 要写大量的if语句, 并且没办法扩展

若是采用上面26中的方法, 就会简单很多

一。 功能分析

图中输出的图形可以为如下情况

如上图, 可以看到一共有3个图形, 最外面的*号构成的图形, 里面蓝色的由空白构成的三角形

最后是一个红色的小矩形。

这三图形叠加到一起构成了一个完整的图形

二。 实现方法研究

1. 采用主函数启动一个功能函数, 在功能函数里面传入必须的参数进行显示

这样当需要扩展时, 仅仅调整参数就可以扩大或者调整输出

2. 采用二维数组存储中间输出的结果

3. 采用一个专用函数输出最外层的带*的大矩形

4. 采用专用函数在中间的输出结果中输出空白函数的三角形

5.采用函数在前面的中间结果的基础上输出小的空白符号的矩形

6. 最后直接输出中间结果的最终结果到计算机屏幕

参考过程如下

main    {             调用  图形输出                }
                             ||
                            \  / 
                             \/
图形输出{
                      准备二维数组构成的缓存区
                             ||
                            \  / 
                             \/
                      输出最外层的带*的矩形到中间缓存(二维数组中)
                             ||
                            \  / 
                             \/
                      在中间缓存中输出空白图形组成的三角形
                             ||
                            \  / 
                             \/
                      在中间缓存中输出空白图形组成的小矩形
                             ||
                            \  / 
                             \/
                      最后整体将全部图形输出到计算机屏幕上
          }

三。 采用java代码实现上述的功能

1. 启动easyeclipse程序创建一个java的工程

2. 编写程序实现功能

具体代码参考:

public class SanTuXing {

	/**
	 * 输出三个图形叠加的效果
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		// 调用图形输出函数
		TuXing(11, 11);

	}
	/**
	 * 这个函数输出 要打印的图形
	 * @param x    图形的行数
	 * @param y    图形的列数
	 */
	public static void TuXing(int x, int y)
	{
		// 准备一个 临时的缓存区, 系统在初始时, 给每个元素一个默认值了
		char[][]  tmpTuXing = new char[x][y];

		// 输出最外面大的 * 的图形  到 临时缓冲区
		ShuDaDuXing(tmpTuXing, x, y);

		// 输出中间的三角形 到 临时缓冲区
		ShuSanJiaoXing(tmpTuXing, 2, 2, 6);

		// 输出小的矩形到  临时缓冲区
		ShuXiaoJuXing(tmpTuXing, 5, 2, 8, 2);

		// 最后输出全部的数据
		// 优先编写  最后输出的函数, 这样可以检验前面的代码的 正确与否
		ShuChuAll(tmpTuXing, 11, 11);
	}


	/**
	 * 输出中间的小矩形
	 * @param t     缓冲区
	 * @param left  矩形开始的左边
	 * @param top   矩形开始的 上面行数
	 * @param line  矩形有的行数
	 * @param count 矩形每行的个数(空白)
	 */
	public static void ShuXiaoJuXing(char[][] t, int left, int top, int line, int Count){
		for(int i = 0; i < line; i++)
		{
			ShuXiaoJuXingLine(t[i + top], left, Count);
		}
	}

	/**
	 * 输出小矩形的行
	 * @param t     行缓存
	 * @param left  左边开始的
	 * @param Count 每行的个数
	 */
	public static void ShuXiaoJuXingLine(char[] t, int left, int Count){
		for(int i = 0; i < Count; i++)
		{
			t[left + i] = ' ';
		}

	}

	/**
	 * 输出中间的三角形
	 * @param t   缓冲区
	 * @param left  三角形开始的 左边列数
	 * @param top   三级星开始的 上面行数
	 * @param line  三角形有的 行数
	 */
	public static void ShuSanJiaoXing(char[][] t, int left, int top, int line){

		// 输出没一行
		for(int i = 0; i < line; i++)
		{
			ShuSanJiaoXingLine(t[i + top], left, i+1);
		}
	}

	/**
	 * 输出三角形的一行
	 * @param t         行缓存
	 * @param left      开始的左边
	 * @param line      第几行, 其实就是这行的 空白的个数
	 */
	public static void ShuSanJiaoXingLine(char[] t, int left, int line){
		for(int i = 0; i < line; i++)
		{
			t[left + i ] = ' ';
		}
	}

	/**
	 * 输出大的 最外层的矩形
	 * @param t   临时缓冲区
	 * @param x   行数
	 * @param y   每行的  *的个数
	 */
	public static void ShuDaDuXing(char[][] t, int x, int y){
		for(int i = 0; i < x; i++)
		{
			ShuDaDuXingHang(t[i], y);
		}
	}

	/**
	 * 输出 一行的*
	 * @param t   行的缓存
	 * @param y   行的个数
	 */
	public static void ShuDaDuXingHang(char[] t,int y){
		for(int i = 0; i < y; i++)
		{
			t[i] = '*';
		}
	}

	/**
	 *
	 * 输出全部的 符号到计算机屏幕
	 * @param t   缓冲区
	 * @param x   行数
	 * @param y   每行的个数
	 */
	public static void ShuChuAll(char[][] t, int x, int y)
	{
		// 行循环
		for(int i = 0; i < x; i++)
		{
			// 列循环
			for(int j = 0; j < y; j++)
			{
				// 输出行里面的 一个列的数据
				System.out.print(t[i][j]);
			}
			// 这个行完成后, 打印一个换行符号
			System.out.println();
		}
	}

}

 

小结一下

从18开始, 到27, 一直在说图形的输出, 目标是产生直观的输出感觉, 感觉的产生是您写了代码

那么写这个程序的目标是 需要读者理解, 把一个复杂的问题, 划分为若干的简单问题, 然后逐个简单问题处理, 最后在把简单问题整合到一起, 他们共同完成 一个整体的任务。

在写程序中, 我们也一直是这么编写的, 大家参考视频看一下

另外, 今天开始, 其实从26开始, 我们引入了数组的概念, 其实也偷偷的引入了另外的一个东西!

是什么东西, 就是: 数据 和数据处理 或者数据操作

我们化整体为 零散, 然后分零散进行 操作或者完成, 这个过程中, 有一个共同的东西 就是数据

程序一开始就是围着数据的相关处理, 最开始是创建(一种处理), 数据的填充(填充为*), 数据变化(将一部分数据变为空白), 在数据在变换(讲一部分变为空白, 目标是产生小矩形), 最后数据输出(也可以任务是一种操作)

 

相关视频: 链接:https://pan.baidu.com/s/1-oWaw-kPqabYH7ijXCSsGg   提取码:j7av

 

相关文章

计算机介绍                                  从锦囊妙计想到的01

流程图(分支结构)介绍          从锦囊妙计想到的02

线程介绍                                     从锦囊妙计想到的03

循环结构介绍                             从锦囊妙计想到的05

流程线程总结                             从锦囊妙计想到的06

cpu和线程定义、开始               从锦囊妙计想到的07

分布式计算                                  从锦囊妙计想到的08

分布式中事件和计数                 从锦囊妙计想到的09

内容总结                                     从锦囊妙计想到的10

数据类型,变量简介                从锦囊妙计想到的11

函数和参数                                从锦囊妙计想到的12

用户交互与数据输入输出       从锦囊妙计想到的13

人机交互界面                            从锦囊妙计想到的15 

过程与对象                                从锦囊妙计想到的16

同步和异步                                从锦囊妙计想到的17

顺序打印                                    从锦囊妙计想到的18

数据输入输出                            从锦囊妙计想到的19

屏幕坐标和打印                        从锦囊妙计想到的20

java函数控制输出                     从锦囊妙计想到的21

逐步细化解决复杂问题           从锦囊妙计想到的22

java入门                                    从锦囊妙计想到的23

java复杂过程分析                   从锦囊妙计想到的25

中间辅助功能解决问题          从锦囊妙计想到的26

叠加操作输出复杂图形          从锦囊妙计想到的27

时间和空间                               从锦囊妙计想到的28

编写边测解决问题                  从锦囊妙计想到的29

让程序动起来                          从锦囊妙计想到的30

程序往复运动                           从锦囊妙计想到的31