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

  categories:儿童计算机  author:

前面的18,19,20,21都在围绕图形输出的功能来进行说明一些事情, 为什么画了这么多时间来说明一个问题?

因为这个问题非常重要!  是输出吗?  当然不是, 而是一种思想:  总体看问题=》划分为若干的零散的部分=》每个零散的部分独立考虑=》零散的实现=》整体检验是否合适

总结一下就是, 不断的 总=》分=》总的一个   不断的重复的过程!

一个重要的事情, 至少要说3遍以上才会有印象, 更多次的训练才慢慢加深影像!

那么18中到底说的是什么? 18中有很多打印输出的内容!  确实是的, 因为我们要说明问题, 必须有一个实际的例子, 而最实用, 最简单的一些 可以看到的东西就是计算机的 输出了!  在比这个简单的不好找, 就算找到也未必比这个更实用! 因为我们后面写程序中会到处用到屏幕输出的!!!

在18中, 要了解到, 屏幕输出是 从左到右,从上到下,  在输出时就像一个流从左向右流动, 知道遇到换行符号, 会从上一行流到下一行的 左边, 然后在从左到右流动,一直进行, 知道屏幕满了, 会滚动屏幕。

当然在复杂的屏幕控制中,还有制表符, 符号的先回跳转等, 那些现在都用的很少了,初学者可以忽略!

然后说明了字符如何换行,  循环输出一个图形等

19中, 介绍了一下计算机的输入和输出系统, 既然说到了输出必不可少的 需要输入来对应, 那么有几种输入方法, 有哪些设备是输入设备, 哪些是输出设备。 在输入是为什么要回显!

在20中, 重点重新说明了计算机屏幕的坐标, 其实是换了一个角度来说明屏幕的流动和坐标的关系, 以及列举了例子来说明如何输出一个图形, 这样综合了18,19,20的内容。 然后提出了一个重构的概念, 其实还是离不开总分总的思想。 那么到底什么是总分总的思想或者方法? 其实就是把一个复杂问题(总)划分为若干简单问题(分), 划分为简单问题还要考虑他们整体上的联系和影响(因此还要合并起来在考虑)。 这个过程非常重要。 由于一个复杂的问题会很难一次性解决掉因此我们需要不断的重复因此就成了总=》分=》总=》分=》总。。。  这个过程就是重构!

之后再例子中,我们说明了一个流程图的绘制, 特别是在包括很多子函数的流程图中, 我们确实看到了,总分总的办法, 确实减少了流程图的绘制的复杂程度, 其实也就是减少了程序的复杂程度!

在21中, 重点是通过函数和函数的参数的办法来减少重复的工作(重复的函数定义), 然后在函数内部通过循环语句来减少重复的工作。另外, 在21中也显示了一个怎么通过总分方式写程序的方法, 不断定义空函数, 调用空函数, 然后一个个的补充这些空的函数, 在编写了若干代码后马上进行测试的一些方法。 通过这些方法,不断推进可以很容易进行代码的编写等。

好了回顾了前面的内容, 那么本节的内容是什么?还是输出一个图形。然后逐步细化的办法输出的图形!

一。 分析输出的内容

上图很显然同前面的图形类似, 但是还是有区别的, 区别在哪里? 这回*显示在右边, *前面有了空白! 那么空白如何输出??

如上图, 在新输出的内容中, 每一行包括了两种不同的内容, 一个红色矩形的空白区域, 一个是绿色区域的*字符

要分别输出这两种字符!

二。 编写程序实现说明

正常情况下, 对于简单的程序这个过程可以仅仅存在 与大脑中,就是思考一下

通常我们定义f1() 输出第一行, f2()输出第二行。。。。 f6输出第6行

在f1()中我们还可以继续定义子函数的子函数来实现。例如

f1空白()输出f1行的空白部分, f1星()输出*的部分,类似

f1空白,f2星(),。。。。。。等

最后一个主函数main(这个必须这么定义, 并且是必须固定格式的, 才能被调用到)

三。采用java实现上述的程序

启动easyeclipse软件, 创建java工程,创建类, 这些都省略了,自行补充, 参考图形和源代码进行, 最后会提供完整的项目

如上图, 编写了f1()函数的相关功能, 但是由于太过繁琐了, 后面的就不写了, 直接写可以算是经过优化的代码了!

目前这些没写完的参考代码如下:

package cn.iigrowing.java.study;
public class TuXingShuChu {
	public static void main(String[] args) {
		f1();
		f2();
		f3();
		f4();
		f5();
		f6();
	}
	// 输出第一行
	public static void f1(){
		f1kongBai();  // 输出空白
		f1Xing();     // 输出*
		System.out.println();  // 输出换行
	}
	// 输出第一行的 空白
	public static void f1kongBai()
	{
	}
	// 输出第一行的 *
	public static void f1Xing()
	{
	}
}

请特别注意,上面的代码仅仅是我了说明 软件开发过程是 从总体, 慢慢优化而来的过程, 特别写的一个特别麻烦的版本,但是我也是有点烦了, 因此没完成这个版本, 大家明白意思就好。

后面直接给出一个合适的版本。

如下图, 优化后的一个版本如下:

参考代码如下:

package cn.iigrowing.java.study;
public class TuXingShuChu2 {
	public static void main(String[] args) {
		f1(); // 输出第一行
		f2(); // 输出第二行
		f3(); // 输出第三行
		f4(); // 输出第四行
		f5(); // 输出第五行
		f6(); // 输出第六行
	}
	// 输出第一行
	public static void f1(){
		kongbai(5);  // 输出空白
		xing(1);     // 输出*
		System.out.println();  // 输出换行
	}
	public static void f2(){
		kongbai(4);  // 输出空白
		xing(2);     // 输出*
		System.out.println();  // 输出换行
	}
	public static void f3(){
		kongbai(3);  // 输出空白
		xing(3);     // 输出*
		System.out.println();  // 输出换行
	}

	public static void f4(){
		kongbai(2);  // 输出空白
		xing(4);     // 输出*
		System.out.println();  // 输出换行
	}

	public static void f5(){
		kongbai(1);  // 输出空白
		xing(5);     // 输出*
		System.out.println();  // 输出换行
	}

	public static void f6(){
		kongbai(0);  // 输出空白
		xing(6);     // 输出*
		System.out.println();  // 输出换行
	}
	// 输出一行 空白
	public static void kongbai(int count)
	{
		for(int i = 0; i < count; i++){
			System.out.print(" ");
		}
	}
	// 输出一行*
	public static void xing(int count)
	{
		for(int i = 0; i < count; i++){
			System.out.print("*");
		}
	}
}

上面代码初步完成相关的图形功能但是仍然有可以优化的地方。

四。 优化调整代码逻辑

从上面的代码中可以发现

从上图中我们了解到, 各个数的和相等, 都是每一行的字符个数,包括空白。

因此我们是否可以把 f1  。。。 f6概况成一个函数, 如下代码

参考代码如下:

package cn.iigrowing.java.study;
public class TuXingShuChu3 {
	public static void main(String[] args) {
		ShuLine(1, 6); // 输出第一行
		ShuLine(2, 6); // 输出第二行
		ShuLine(3, 6); // 输出第三行
		ShuLine(4, 6); // 输出第四行
		ShuLine(5, 6); // 输出第五行
		ShuLine(6, 6); // 输出第六行
	}

	/**
	 * 输出一行
	 * line  行号, 例如第一行,   一个星,  其余5个是 空白
	 * lineTotalCount  一行总计的 字符的个数, 包括空白和星
	 */
	public static void ShuLine(int line, int lineTotalCount){
		kongbai(lineTotalCount - line);  // 输出空白
		xing(line);     // 输出*
		System.out.println();  // 输出换行
	}
	// 输出一行 空白
	public static void kongbai(int count)
	{
		for(int i = 0; i < count; i++){
			System.out.print(" ");
		}
	}
	// 输出一行*
	public static void xing(int count)
	{
		for(int i = 0; i < count; i++){
			System.out.print("*");
		}
	}
}

五。再次优化为实用版本

上面代码已经很精简了, 那么时候还有更好的版本?

如下在优化一下, 看看是否比刚才更好了

参考代码如下:

package cn.iigrowing.java.study;
public class TuXingShuChu6 {
	public static void main(String[] args) {
		final int lineTotalCount = 6;   // 定义一个  每行的最多字符数, 同时也是 行数,
		for(int i = 1; i <= lineTotalCount; i++)
		{
			ShuLine(i, lineTotalCount); // 输出第 i 行
		}
	}
	/**
	 * 输出一行
	 * line  行号, 例如第一行,   一个星,  其余5个是 空白
	 * lineTotalCount  一行总计的 字符的个数, 包括空白和星
	 */
	public static void ShuLine(int line, int lineTotalCount){
		kongbai(lineTotalCount - line);  // 输出空白
		xing(line);     // 输出*
		System.out.println();  // 输出换行
	}
	// 输出一行 空白
	public static void kongbai(int count)
	{
		for(int i = 0; i < count; i++){
			System.out.print(" ");
		}
	}
	// 输出一行*
	public static void xing(int count)
	{
		for(int i = 0; i < count; i++){
			System.out.print("*");
		}
	}
}

扩展一下, 若是要输出100行的 三角行?

如上图, 仅仅需要修改一下 定义, 就可以完成, 不用编写任何其他额外函数。

若是采用最前面的定义函数的办法, 就要重新写非常多的代码了。

六。 程序的流程图

程序的参考流程如下:

程序的源代码如下:KongBaiTuXingShuChu

 



快乐成长 每天进步一点点      京ICP备18032580号-1