月度归档:2018年12月

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

前面的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

 

相关文章

计算机介绍                                  从锦囊妙计想到的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

从锦囊妙计想到的21–函数参数法控制输出

前面18,19,20都在围绕图形输出进行说明, 本文仍然采用类似的方法进行说明。

为什么老是围绕字符输出进行说明?

1. 字符输出简单, 是计算机编程里面最简单的有输出的方法之一了

2. 字符图形输出是可以看到的, 这样程序编写的是否正确马上能看到

3. 通过不但修改您编写的称, 您可以体会程序中的各种情况

4. 最后程序输出是以后调试程序的必不可少的技能

本文的内容还是输出一个图形, 现在输出图形如下:

一。 分析图形特点

还是按照前面的文章的办法, 我们要分析一下这个图形输出的特点

如上图, 图形由多行组成, 因此最简单的办法, 是一行一行的输出

如下图

二。编写文档说明程序的实现方法

我们可以定义

函数f1输出  第一行,

函数f2输出 第二行,

。。。

函数f6输出  第六行。

最后需要一个主函数, 然后调用这些函数

如下:

main(){

f1();

f2();

f3();

f4();

f5();

f6();

}

先写完上面代码后,还需要写函数f1()的定义

f1(){

打印输出一个*

*

}

f2(){

打印输出2个**

**

}

...

f6(){

打印输出6个*

******

}

三。采用java语言进行软件开发

启动eclipse软件工具, 创建一个java项目, 创建一个类,这个是java必须的

如下图, 选择java project项目后, 在下面对话框中按照图示操作

选择完成 finish后, 请参照如下图进行操作

选择项目后, 然后,在src目录上选择右键点击, 然后在弹出的菜单上,选择new, 最后选择class项目,然后参照下图进行

如上图, 进行操作,强调两点: 1. 选择 public static void main的选项

2. 在类名哪里, 这里用汉语拼音方法命名类名, 并且每个拼音的首字母都是大写的, 这样能快速了解类名的含义

然后在main函数里面输入如下图代码:

特别注意上图中2处指向的地方, 这里是编辑自动检测出, 程序中存在的问题, 这里的问题是我们仅仅写了函数的调用, 而没有编写函数的实现。具体操作如下

类似的, 我们要定义f2()。。。。。 f6函数

代码如下:

public class ShuTuXing {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		f1();
		f2();
		f3();
		f4();
		f5();
		f6();
	}
	static void f1(){
	}
	static void f2(){
	}
	static void f3(){
	}
	static void f4(){
	}
	static void f5(){
	}
	static void f6(){
	}
}

上面是一个阶段性的代码编写过程, 在这个过程中我们编写了几个空的函数, 没有任何功能的函数。

下面是逐个从f1  到 f6实现各个函数。具体的过程如下:

编写f1的函数实现

编写完成f1的功能后, 我们马上要运行这个函数看看效果

请特别注意:

通常情况下, 我们写程序都可能有问题, 因此, 我们每编写一些代码就要检验一下, 看看是否正确, 若是不正确, 由于代码还很少, 因此可以方便修改!

如下图:

我们继续完成f2函数

如上图, 完成f2后的 执行结果

继续努力, 知道完成f6函数

完成后如下图:

参考代码如下:

public class ShuTuXing {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		f1();
		f2();
		f3();
		f4();
		f5();
		f6();
	}
	static void f1(){
		System.out.println("*");
	}
	static void f2(){
		System.out.println("**");
	}
	static void f3(){
		System.out.println("***");
	}
	static void f4(){
		System.out.println("****");
	}
	static void f5(){
		System.out.println("*****");
	}
	static void f6(){
		System.out.println("******");
	}
}

通过上面代码确实能实现相关的需求, 但是他不并好, 下面慢慢分析他完善它

四。 调整完善代码(参数化,减少函数数量)

上面的代码中, 几个函数的实现其实非常类似, 近似相同

是否可以把上面的代码优化为一个函数中, 然后通过函数参数来控制输出*

参数? 参数是什么, 就是在函数的定义中, 一个可以变化的量,这样可以大大提高函数的通用性

如上图, 通过在函数f中根据传入的参数, 采用if语句判断需要打印的*的个数, 然后进行处理

代码如下:

public class ShuTuXing2 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		f(1);
		f(2);
		f(3);
		f(4);
		f(5);
		f(6);
	}
	static void f(int count)
	{
		if(count == 1)
		{
			System.out.println("*");
		}
		if(count == 2)
		{
			System.out.println("**");
		}
		if(count == 3)
		{
			System.out.println("***");
		}
		if(count == 4)
		{
			System.out.println("****");
		}
		if(count == 5)
		{
			System.out.println("*****");
		}
		if(count == 6)
		{
			System.out.println("******");
		}
	}
}

上面代码可以输出相关图形

五。 循环语句减少重复代码

上面的办法中, 已经有效的减少了函数的数量, 但是在一个函数里面还有很多重复的代码, 要通过过多的if语句来输出*, 是否还有更好的办法。

通常采用循环语句来减少重复的工作, 参考代码如下:

public class ShuTuXing3 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		f(1);
		f(2);
		f(3);
		f(4);
		f(5);
		f(6);
	}
	static void f(int count)
	{
		for(int i = 0; i < count; i++)
		{
			System.out.print("*");
		}
		System.out.println("");
	}
}

如上面代码, 函数f中通过循环语句,进行输出, 有效减少了重复的代码

上面代码中f函数中的重复代码已经没有了, 那么主函数还可以继续优化,参考代码如下

public class ShuTuXing5 {
	public static void main(String[] args) {
		for(int i = 1 ; i <= 6 ; i++)
		{
			f(i);
		}
	}
	static void f(int count)
	{
		for(int i = 0; i < count; i++)
		{
			System.out.print("*");
		}
		System.out.println("");
	}
}

 六。 给代码添加注释,方便阅读

上面代码是简单了, 但是很难让人看懂, 特别是时间长了, 可能会忘记, 因此需要给程序添加足够的说明, 就是注释!

参考代码如下:

/**

输出如下图形
*
**
***
****
*****
******

 */


public class ShuTuXing6 {

	// 主函数, 程序从这里开始执行
	public static void main(String[] args) {

		// 循环输出每一行
		for(int i = 1 ; i <= 6 ; i++)
		{
			// 调用行输出函数, 每行的*的数量, 由变量i决定
			f(i);
		}
	}

	/*
	 *
	 输出一行*
	 ***
	 其中*的数量, 有函数的参数 count决定
	 * */
	static void f(int count)
	{
		// 循环输出count个*
		for(int i = 0; i < count; i++)
		{
			System.out.print("*");
		}

		// 最后输出一个 换行符
		System.out.println("");
	}
}

 

 总结一下

1. 采用分析=》设计=》开发=》检验(测试)=》完善的过程  进行开发

2. 程序编写过程中, 采用 化整为  零的办法, 把一个 大的复杂的功能, 划分为若干个小的功能来处理

3. 依次编写每个小功能, 在编写小功能时, 可以变化为更小更小的功能

4. 逐个编写小功能, 每编写一个小功能后, 就运行一下程序检验一下功能是否正确

5. 汇总全部的功能, 然后不断检验功能是否满足了要求。

6. 不断优化完善程序, 知道代码合理完善

7. 代码要添加足够的 说明(注释), 为以后阅读方便

 

参考源代码:ShuChuSanJiaoXing

 

相关文章

计算机介绍                                  从锦囊妙计想到的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

流程图的绘制流程分享

近来一段时间,忙于整理业务流程图,期间,关于流程图的绘制方法和工具也与内部团队和外部做了心得交流,恰好,个人生活也牵涉在买房,婚礼,户口迁移等流程中。不知不觉,伴随着实践与反思,个人所得的系统知识趋于完整,今儿天气极好,坐在飘窗一隅,听着间或几声鸟鸣歌唱,偶尔瞥一眼窗外的遍地绿荫,真真觉得是个写点什么的日子。所以就整理成文,如果恰好对你有所帮助,那是真真好的。

真实整理的流程牵涉到公司未公布的计划,不好公开,所以在本文中会借助一个简单的案例替代(这个案例呢,也就是计划写本文前30分分钟才想到的,如有考虑不周,请各位见谅),但是仅传达概念和方法,倒也足够了。恩,甄環体告一段落,咱们开始吧。

224A61255-0

图1 用即时贴与白板做的简单流程图

本文会包含几块内容:

  1. 什么是流程图?流程图和其他图表(如线框图,概念图,架构图,用例图)有什么不同?
  2. 为什么需要流程图?
  3. 流程图的分类?
  4. 如何绘制流程图?
  5. 流程图绘制工具

视篇幅情况,会在行文时略加划分为系列,敬请关注并多多交流。

第一部分:什么是流程图?

1. 定义

了解一个事情,我习惯从它的定义开始。至于为什么,可以参见我之前的博客文章:点击查看

我们因为厌恶十年教育,厌恶背各种定理和定义,所以我发现生活中和工作中很多人都很讨厌给一个事情下定义以及去参考定义。所以你会发现很多人在一起争吵得不可开交,仔细去听,原来是鸡同鸭讲,根本不在一个频道上。对于一个事情的描述,没有一个共同的语言,没有所谓的术语。有定义很好办,你们共同引用一个定义,发现定义有问题,OK,去补充这个定义,并扩展到更多的人群。当然,任何事情过犹不及,我们相互提醒吧。

那什么是流程图呢?说文解字是一种了解定义的好方法。流程图=流程+图,如下图:

224AC227-1

图2 流程图的定义

流程:Flow,是指特定主体为了满足特定需求而进行的有特定逻辑关系的一系列操作过程,流程是自然而然就存在的。但是它可以不规范,可以不固定,可以充满问题。所以就会造成看似没有流程。前不久,团队每个人对接一个业务团队去调研流程,反馈给我的流程有一些缺失。询问时,负责人反馈给我的答复是:这一块业务他们没有流程。其实严格意义上讲,业务已经开展,不可能没有流程,只是说没有固定的流程或者你调研的对象也讲不清楚。

图:Chart 或者 Diagram, 是将基本固化有一定规律的流程进行显性化和书面化,从而有利于传播与沉淀、流程重组参考。

从定义可以看出,只要有事情和任务,流程就会有,但是并不是所有的流程都适合用流程图的方式去表现,适合用流程图去表现的流程是一定程度固定的有规律可循的,流程中的关键环节不会朝令夕改的。

2. 流程图与其他图表的对比

工作中我们还用到或听到很多其他类型的图表,比如交互设计师们经常说的线框图(Wireframes),信息架构图或站点地图(Site Map),,开发工程师们经常说的用例图(Use Case)或E-R图。这些不同的图表要表达的内容有何种差异呢?简单做个对比,如图:

224A632b-2

图3 流程图VS其他常用图表

如果要串到某一个项目来说,可以理解成:

用例图(Use Case):表现了一个角色在系统里要完成的活动是什么,比如用户这个角色与ATM取款机的交互过程中,用户需要完成的活动有存钱,取钱,查询等。而存钱这个活动再可以进一步细分为插卡,输入密码,输入金额,ATM吐钞,用户收款,退卡等活动。用例图可以不考虑用户动作的前后次序,而仅仅提取一些关键的动宾短语,映射出系统应该满足的功能点。常用用例图的人是产品经理和开发工程师。

流程图则表示用户每一个活动的前后次序,比如用户必须要先插入银行卡,才能够输入密码,且流程图必须直接表现出各种异常判断,比如当密码错误时,出现什么提示,密码输入错误超过多少次时,出现什么提示和动作。常用流程图的人是产品经理,设计师,或者任何需要讲述业务如何运作的人。

信息架构图,站点地图(Site Map):表现为了做一个这样的系统,功能与内容的展现层次是什么,比如用户一进去后,欢迎页面的导航如何设计,是否直接出现取款,存款,查询,或者还有别的导航?常用信息架构图的是设计师。但是常用组织架构图的是HR。

线框图(Wireframe):将具体每个界面的内容布局和权重表达出来,且标注出一些交互细节的设计,比如当密码错误后,如何提示下一步动作。常用线框图的人是设计师。

实体关系图(E-R图):则是数据库架构的工作,表示一个业务系统或场景中的实体时间的关系,比如储户与银行卡的关系是归属1对多,通过开卡事件产生关联。一般来讲,用矩形来表示实体,椭圆标识这个实体的属性,比如储户这个实体的属性有:姓,名,手机号码,住址等。而银行卡的属性有:开户行,开户名称,银行卡号等。

以上的这些图表各自都有领域的专家,我这里就不班门弄斧了。

那么流程图要体现出他的差异定义,要素是什么?总结出了流程图的6大要素,希望大家能够记住,这6个要素可以在以后的文章里不断回顾,你也可以拿来判断你所看到的流程图是否专业。

224AA4V-3

图4 流程图6大要素

  • 参与者:谁在这个流程中?可以是系统,可以是个打印机,更多的指什么角色——一般是有某种工种的人。比如客服同时有小A和小B两人,但是若他们的工作性质完全一样,那么在流程图里只需要写一个客服角色就可以了。
  • 活动:做了什么事,比如点餐,结帐等活动。
  • 次序:这些事情发生的前后顺序如何,哪个任务是其他任务的前置条件?比如客人不结帐,就不会产生送他优惠卡的活动。
  • 输入:每项活动开始取决于什么样的输入物或数据,比如做饭的师傅开始做菜时,需要拿到具体的点菜单。
  • 输出:每项活动结束后,会输入什么样的文档或数据传递给下一方,比如师傅做好菜后,如何让负责传菜的人知道菜已经做好?
  • 标准化:采用一套标准化的符号用以传递你的流程图,从而使受众更快明白。

关于流程图的标准化,并不是强制的,事实上,我们见过很多种类的流程图,只要能够传递明白任务和次序其实已经归类于流程图了。如下面的图:

224A64b9-4

但是若在一个公司的环境下,你的流程图的受众又非常多的话,采取标准化的符号会带来很多交流上的好处,总之你懂的。

第二部分:流程图的分类?

常见的流程图有业务流程图(Transaction Flow), 页面流程图(Page Flow)。

在工作中,作为UED,你可能会发现PD经常谈的是业务流程,而作为交互设计师,我们更多产出的是页面流程图。页面流程图和业务流程图到底有什么关系呢? 先有谁,其次再有谁呢?

先讲个故事:假设你的梦想是开个中高档的全国连锁餐馆,那么首先你想到的应该不是如何去选址,而是将为何要开连锁餐馆这件事情,以及你的定位,核心竞争力想清楚。是快餐,还是点餐,是连锁还是加盟?定位于社区还是繁华商圈?是川菜还是江浙海鲜?是面向中老年还是年轻人?是家庭主题还是动漫主题?竞争对手是谁?需要什么样的投资?可能的风险是什么?这些都想清楚了,问题都有答案了,所谓战略层要清晰了吧。然后假设你现在分析来分析去,与主要投资方决定了一个方向:面向年轻人的时尚动漫茶餐厅,连锁,但是先在杭州开始第一家,选址定位于年轻人约会,扫街的地域,比如风景区,著名商圈,电影院旁……那么,接下来呢?

接下来就是想办法让这些实现吧?那么需要做什么事情呢?选址?拉投资?搞装修?选餐饮菜单?雇佣员工?每一步怎么去做,时间点是什么?等等的任务拆解以及计划,就需要到战术层了。

这些事情的执行,总是需要请人的吧?先是核心团队分工去部署各项建设任务,当餐厅开设起来后,就需要组织稳定的运营团队,如服务、卫生、厨房、采购、人事等等,厨房里面还得分工,白案,热菜,冷菜等等吧?每个部门需要设置管理层以及汇报关系吧?所以你的组织结构就诞生了。

那具体每种角色是如何顺畅合作完成日常稳定的以及突发的各项任务呢?比如,当顾客上门时,谁去引导客人入座,谁去点菜,怎么将点菜的讯息迅速传递到厨房,并分发到酒水间、冷菜间、热菜间?并保证客人尽快能够吃到所点的菜?你必须要考虑各种人员的协作流程,优化效率,所以业务流程就出现了。

人肉运营了一段时间,没有借助任何点餐系统,你发现也还可以。客人点菜时,服务员手抄写下客人的要求,因为有复印纸,所以服务员能够将副本送入厨房,同时写下餐桌号码。厨房规模较小,负责分配任务的员工看下菜单,分别往冷菜处的黑板上写下需要他们处理的,以及跑到热菜区的黑板上写下待处理的菜品,以及去酒水间报下品名即可。可是随着经营的扩大,以上的人肉方式出现了很多问题,首先,手抄效率太低,顾客频繁换菜,响应来不及,手抄出错,导致经常报错菜。厨房很混乱,不得不多招了几个人专门跑堂。而一旦顾客要加菜,撤菜就更麻烦了,需要找出他们当时点的菜,再进行人工的批注和修改,同时要修改厨房后端的各个黑板……

所以你们想要开发一套智能系统,取代很多人肉工作,你们请了系统开发团队,他们经过评估,判断从点菜开始,一直到传菜都可以用系统解决。手持终端,能够快速传递顾客点菜需求到打印机,打印系统能够根据顾客点菜的类型进行自动的分单打印,所以热菜间看到自己的热菜菜单,冷菜间看到自己的冷菜菜单,而酒水间看到酒店菜单。当他们准备完毕后,送出,传菜员可以根据菜名与打印出来的单据进行传菜并根据顾客的点菜小票进行核对。这套系统同时必须配备结算系统,将最终确认掉的菜单及消费价格传递到结算前台,收银员能够快速进行操作。

这套系统最终是需要展现出来的,那么手持终端的界面如何设计?服务员能够用更少的点击完成一个菜的点餐吗?结算中心的界面如何设计?

通过以上的故事,是不是更明白从战略、战术、业务流程图到页面流程图的关系了?总结下:

  • 先是有一个业务需求和业务目标,也即我们的愿景是什么?(战略)
  • 然后就诞生了我们需要分解出什么样的任务,如何执行战术?(战术)
  • 然后就诞生了需要架构什么部门,岗位去分工协作?(组织架构)
  • 然后就诞生了不同的部门在协作完成某件任务时的业务流程?(业务流程)
  • 业务流程基本稳定后,往往会考虑优化效率,所以会诞生出系统来支持流程,减少人肉环节,促进数据采集(系统愿景)
  • 为了设计这个系统,PD需要思考什么功能能够取代某个环节的人肉工作(功能需求,系统流程)
  • 不管是怎么样的功能最终都会以界面的方式呈现,设计师们会关注用户在系统里的任务流,行为路径,让用户完成任务更加高效愉悦。(页面流程)

当然,除了业务流程,系统流程,页面流程,还有数据流程被人关注。

我们平时工作中,还会经常听人谈到泳道图、任务流程图等等概念,究竟是神马关系呢?

224AA535-6

图5 流程图的分类

本文着重于上述流程中的“业务流程图”——并会分享如何绘制泳道图——也即是PD们最多使用,技术们最多参考,UED们最多看到的流程图。

本来在第四部分会对泳道图的图示以及绘制方法、原则做更详细的说明,但是看目前的篇幅情况,预计会放到下篇,所以先在这里简单说明下吧。

在工作中,我们经常能够看到两种业务流程图,从表现形式来看,一种很好区分,俗称为“泳道图”的它,在样子上也确实像个泳道,可以有横向的泳道,也会有纵向的泳道。泳道图在某些文档里会被称为“以活动为单位的流程图”,浮在泳道中的都是一个个活动。

224A64159-7

另外一种类型是以部门和岗位为单位的流程图,下图中的圆形就代表一个个部门或岗位。矩形代表活动。这种流程图关注事情如何完成的逻辑,但是在体现各个部门的责任上比较弱。如果是某个岗位的人来看,很难像泳道图那样一眼就能看到自己部门的职责和任务。所以现在用得比较少。

224AC439-8

再回过头来说泳道图,泳道图有几个关键点:两大维度,活动流转,流程要素。我们会在以后详解。

224A640J-9

第三部分:为什么需要业务流程图?

流程图可以提供一种简单扼要的“缩略俯瞰图”,帮助观众快速了解业务如何运转。它包含了几个关键词:谁,什么时候,在什么条件下,做了什么事情,输入什么,输出什么,输出给谁……

与系统流程不同,业务流程更关注于业务本身如何运作,讲的是业务故事,包含的是业务规则。而系统流程则是满足业务流程,实现部分流程或全部流程的信息化和系统化。

所以业务流程是所有环节的前置条件——软件需求分析,信息系统建设也会先进行业务流程的梳理。

下面表现了业务流程图是如何在三个主要场景中发挥作用的:

1. 员工培训

224A64516-10

图6 流程图的应用场景之一:培训

在此场景中:流程图能够提供一种快速了解业务如何运作的视图,通过业务流程图,新员工能够快速明白业务的最终目标是什么,中有哪些角色在参与以及他们的职责,以及彼此之间的联接。

除了培训新员工,在员工轮岗、调职场景中,员工也需要业务流程图参考,明白新的工作内容如何开展,以及自己所处的位置,自己的上游是谁,下游是谁,自己需要交付的工作内容是什么。

2. 流程优化与重组

224A62N4-11

图7 流程图的应用场景之二:流程优化

业务流程重组(Business Process Reengineering)的存在可以明确反驳:存在即合理。事实上,存在的业务流程并未是合理的,有可能是参与的多个角色习惯了某种做法,有可能是变革尚未影响到末端的操作,也有可能缺乏对于运行中的业务流程问题的洞察以及强有力的变革推动——因为要推动业务流程变革,不是某个部门的事情,而是需要流程中各个部门的通力配合。

更多时候,业务流程优化是自上而下的,但是老板们未必对实际运作的业务流程那么心知肚明,业务流程图能够很好去表现这个“运作模型”。通过看业务流程图,找关键节点的人访问,能够直接切入:为什么要这么做,为什么不这么做?从而探索出更深层次的问题,而不是问:你们现在怎么做?

通过调研,分析业务流程图,引入更多角色,能够分析出目前业务流程的问题:缺失,重复,风险,效率等等。从而制定相应的优化方案。

3. 信息化的基础  

224ABN8-12

图8 流程图的应用场景之三:信息化基础

正如上文所述的餐馆梦想的案例,信息系统的一项任务就是解放员工的手脚,取代一些重复的人力劳动工作。系统上了之后,不是说业务流程不需要而是经过了一些调整,其中某个参与者变成了系统,或手持设备,或打印机而已。

那么在做系统的功能设计和系统流程设计时,是不是必须先要了解目前业务是如何运作的呢?从而更好分析分析,更好说明系统在什么环节取代了什么类型的人肉工作?

所以我们看到的PRD往往也会先以业务流程图开始说明,而叙述一个系统建设的好处时,也可以用以前的业务流程与系统上了之后的业务流程进行对比。根据分析,将愿景中的新的业务流程图背后需要系统的功能点撰写清楚。

第四部分:如何绘制业务流程图?

首先绘制业务流程图本身有没有流程?一定是有的。在软件工程学里听说一句话叫:万物皆对象。那么在流程学里,万事皆流程。吃饭难道没流程吗?就吃饭的动作而言,就有流程:拿筷子——夹菜——入口——咀嚼——吞咽。

有不少同学在这一部份很快想会问一个问题:Heidi,请介绍画流程图的工具吧?

我个人是工具派,从不否认人工欲善其事,必先利其器的道理。好的工具本身就是一名好的老师,除了技能,也能够教会我们一些理论与理念,这些理念也是“器”中很重要的一部分。其次才是具体的工具应用技能。所以我并不建议直接跳转到工具应用。对于初学者而言,笔与纸永远是最好的入门工具,因为你无需和任何一个陌生的软件较劲。

那么,绘制业务流程图有没有可遵循的流程呢?我建议可以从下面4步着手。

1. 调研

如何快速了解业务运作真相?有没有调研的技巧放送?

2. 梳理与呈现

  • 能否快速将调研得到的文字和问题,快速转化为业务流程图?
  • 业务流程图的标准图示是什么?
  • 怎么评价一个业务流程图的好与坏?

3. 评审与确认——能否真正让业务流程图反映现实中的业务?

4. 归档维护——流程不断变更,业务流程图如何快速响应?

这些将会在下篇《业务流程图的绘制流程分享(二)》详解。

第五部分:绘制工具?

如果不搞工具研讨会的话,这部分比较简单。

Windows

线下工具大家常用的就是下面三个:

小的流程图用用PPT就够了,完了就导出图片或截图。交互设计师们因为常用axure绘制线框图,所以也不必为了流程图去学习新的工具,完全可以用axure的flow控件完成简单的业务流程图的制作。而PD们则常用微软的visio。

224A610D-13

此外,特别推荐一个软件:SmartDraw。

我最近的流程图都是用SmartDraw绘制的,你可以下载一个免费版本体验下。这个工具不仅仅是为了流程图而设计的,几乎上包罗万象:线框图,流程图,E-R图,UML ,韦恩图,甚至甘特图,脑图……没有像很多人推荐就是因为他太庞大了,尤其是里面的模版。大家体验下:

224AAW0-14

Mac电脑

自然要推荐omniGraffle., 绘制出来的任何图表不知为何总会觉得很美……

当然,这个软件是可以去www.macx.cn下载免费版的……

但是不管windows还是mac,除了线下的工具,还有更多线上的选择:

不过貌似我们对线上工具普遍来说都不太放心,是对服务器,网速,还有对GFW不放心吧。

1.  https://cacoo.com/

224A64R6-15

这个是界面做得最好看的一个工具。我用它来绘制过概念图(Concept map)。如下图即是用以上的工具画的。

224AC4V-16

2. http://creately.com/

224A61356-17

3.www.lucidchart.com

224AAb8-18

来源: http://www.woshipm.com/pmd/3864.html

从锦囊妙计想到的20–在计算机屏幕打印输出

前面, 18和19都是围绕计算机屏幕的输出和输入进行的, 本文在进一步说明一下, 主要围绕编写应用程序进行说明

一。 计算机屏幕的坐标

默认的计算机屏幕的坐标情况如下:

通常情况下, 计算机屏幕没有 格着

真正的情况如下:

有了上述事实后, 我们好分析如下程序的编写

二。编写程序在屏幕输出上述的用“*”组成的矩形

一) 分析一下

1. 首先是要在计算机屏幕上输出字符, 并且字符有要求

既然在屏幕上输出, 那么就需要到  System.out

2. 输出的图形由多行组成

3. 每个行由多个字符组成

因此基于上面我们就可以进行如下工作

二) 谋划如何进行

基于上面的系统分析情况计划进行如下

如上图, 采用一行一行的方式进行打印, 然后没行依次打印字符, 最后打印换行字符

三)。 实现代码

如下图

上图是程序执行结果,和部分代码  参考代码: OutputJx

改进代码实现

上述代码最大问题, 就是output1   ~  output11   一共11个函数, 但是他们都是相同的, 因此没有必要重复

改进代码如下:

看图可以知道, 就定义一共函数, 调用11次 就可以完成相关情况

简化处理了!

package cn.iigrowing.java.study;
public class OutputJx2 {
	public static void main(String[] args) {
		output1();
		output1();
		output1();
		output1();
		output1();
		output1();
		output1();
		output1();
		output1();
		output1();
		output1();
	}

	public static void output1()
	{
		// 输出*
		System.out.print("*");
		System.out.print("*");
		System.out.print("*");
		System.out.print("*");
		System.out.print("*");
		System.out.print("*");
		System.out.print("*");
		System.out.print("*");
		System.out.print("*");
		System.out.print("*");
		System.out.print("*");

		// 输出换行
		System.out.print("\n");
	}
}

 

上面是这个形式下的代码供参考。

五)。 更进一步简化

上面代码中, 还有一个部分可以进行简化

就是主函数你么的重复11次调用, 是否可以简化一下。  目前11次调用还可以接受, 若是100次如何? 1000次如何,因此重复的事情用循环是最好的办法。

采用如下图的代码

具体的代码如下

---

package cn.iigrowing.java.study;

public class OutputJx3 {
	public static void main(String[] args) {

		for (int i = 0; i < 11; i++) {
			output1();
		}
	}

	public static void output1() {
		// 输出*
		System.out.print("*");
		System.out.print("*");
		System.out.print("*");
		System.out.print("*");
		System.out.print("*");
		System.out.print("*");
		System.out.print("*");
		System.out.print("*");
		System.out.print("*");
		System.out.print("*");
		System.out.print("*");

		// 输出换行
		System.out.print("\n");
	}
}

--

上面程序的流程情况可以为如下:

如上图, 是这个函数参考的流程图, 可以帮助我们理解这个程序的工作过程

六)。在进一步优化子函数

上面程序中, 子函数里面还有很多 重复的语句, 我们可以进一步优化子函数

如下图

相关代码如下:

package cn.iigrowing.java.study;
public class OutputJx5 {
	public static void main(String[] args) {

		for (int i = 0; i < 11; i++) {
			output1();
		}
	}

	public static void output1() {
		// 输出*
		for(int i = 0; i < 11; i++){
			System.out.print("*");
		}

		// 输出换行
		System.out.print("\n");
	}
}

参考流程如下:

上面图形是供参考的流程图

七)。 扩展程序

上面是一个渐进的程序改进过程, 下面是一个更麻烦的程序输出如下

下面的程序的目标是 输出 1000行的 *, 每行 有11个*

如何写这个程序?

若是一行行的输出, 就要1000行的输出函数, 当然更麻烦的定义1000个函数, 不可接受。

采用最后一个版本的程序我们可以改造如下:

代码如下:

package cn.iigrowing.java.study;
public class OutputJx6 {
	public static void main(String[] args) {

		for (int i = 0; i < 1000; i++) {
			output1();
		}
	}

	public static void output1() {
		// 输出*
		for(int i = 0; i < 11; i++){
			System.out.print("*");
		}

		// 输出换行
		System.out.print("\n");
	}
}

 

三。 程序编写过程分析

到了现在, 我们从刚刚开始弄这个程序到现在, 经历了大概这么几个过程

分析这个程序的功能(分析)(有哪些功能, 大致过程) =》  研究如何做这个东西(这个过程仅仅是停留在脑袋里面, 或者绘制一些图表,等)(设计) =》 开始写代码 =》 测试代码执行情况 =》 研究代码是否需要改造=》改造=》测试=》在改造=》在测试 。。。。  =》结束

上面大致的过程就是一个程序的大致过程。

1. 一个程序 大致经过   分析 =》 设计 = 》 开发=》 测试

2. 一个程序在开发等过程中 有很多次的  改造优化过程, 这个过程 通常叫做  重构!!

3. 代码即使完成了, 将来也会发生各种各样的修改等工作,因此程序简洁 方便, 便于更改也是非常重要的!

最后思考一下, 下面的图形如何输出

学完了本文, 考虑一下, 上面的程序如何实现?

本文用到的源代码: c11

 

相关文章

计算机介绍                                  从锦囊妙计想到的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

从锦囊妙计想到的19–计算机输出和输入

前面的第18说明的计算机的输入和输出等一下事情, 然后举列了打印一个图形, 后来回头看了一下, 感觉说的不太清楚, 因此在那在补充一下, 同时在介绍点其他的东西

一。 计算机的输入和输出工作

一个计算机总要有输入的, 否则没办法接受用户的命令, 也要有输出的, 否则没办法告诉用户 结果是什么! 如下图:

如上图, 计算机中的键盘是典型的输入设备, 鼠标也是典型的输入设备

这个是键盘

这个是鼠标

如下图的几个设备都是输入设备, 功能类似鼠标

一般笔记本上比较多。

二。 输入的回显

一般情况下, 人们在操作电脑进行输入时, 很有可能会发生错误, 主要是键盘比较小, 或是鼠标有时候不灵敏等,因此我们如何知道我们输入的数据是正确的?

因此通常情况下, 计算机会把您在键盘的输入的数据显示到计算机屏幕上, 这样您就可以立即发现您的输入是否正确了, 正确您继续输入下一个, 错误了, 您可以返回去修改信息, 然后在输入下一个数据。

鼠标也类似, 鼠标在屏幕上有一个指针式的东西, 移动鼠标时, 指针也移动因此您就知道您在哪里了, 然后您就可以进行左键或者右键了。

下面做一个实验

点击windows的开始菜单, 如下图:

如上图, 点击1处的开始菜单,  然后在点击2处的运行

参照上图, 会弹出一个黑色的  cmd命令提示符窗口

如上图, 当弹出黑色窗口后, 您可以 在键盘输入12asdf, 这样, 您就可以看到屏幕上有了“12asdf”字符显示出来。

您看, 您在键盘输入了字符, 然后,显示器就自动输出了!

下面看一下鼠标

如上图, 鼠标移动, 指针就移动, 并且随着到了不同位置, 显示不同的 形状

三。程序里面进行输入和输出

上面说了什么是输入和输出, 那么程序如何使用输入和输出设备。为了使用输入输出设备我们需要给输入设备起个名称, 否则谁知道你在叫谁呀!

那么在给输入设备起名前, 我们需要给电脑起个名称, 否则谁知道你在叫那个电脑的输入设备。

因此我们给 我们自己的电脑起个名称叫做  System, 这个名称在java里面是这么叫的, 其他语言中有不同的表示方法。

另外这个名称 System仅仅代表自己的计算机, 就是您程序所在的计算机。

那么计算机下面的

输入设备是什么?  java里面是  Sysem.in 这个是输入设备,

类似的System.out 这个是输出设备, 一般代表显示器(其实一般是控制台窗口)

另外,还有一个 System.err 也是个输出设备, 但是这个设备仅仅是输出错误信息的。

一)输出功能

下面我们看一下, 输出设备都有哪些功能可以提供给我们用

从上图中,我们可以确定看到,System.out主要功能就是 print,printf, println

区别:

print这个类别的输出是在计算机屏幕打印东西, 但是有什么就打印什么, 比不告诉他换行, 他就不换行

println 这个输出类别 是, 你告诉他输出什么就输出什么, 最后他自作多情, 在帮您换行

最后printf这个是带有一个格式化字符串的功能, 这个功能强大, 但是一般用的不多, 将来您明白您在做什么自然明白他是什么功能了。

另外, System.out还有一些别的功能, 这里不多说了, 将来您水平到一定程度搜索一些文档自然知道了。

二)输入功能

参考如下图

System.in的输入命令, 主要就是 read的函数, 但是就三个函数, 通常都不太好用, 因此我们这么使用

import java.util.Scanner;
public class TestScanner {
public static void main(String[] args) {

//创建Scanner对象
//System.in表示标准化输出,也就是键盘输出
Scanner   sc = new Scanner(System.in);
//利用hasNextXXX()判断是否还有下一输入项
while (sc.hasNext()) {
//利用nextXXX()方法输出内容
String str = sc.next();
System.out.println(str);
}
}
}

如上面代码, 我们采用了 Scanner进行输入运行情况如下:

另外, System.in.read获得输入的方法如下

方法一:使用System.in.read()获取键盘输入,此方法只能一个字符一个字符的获取,获取到的变量类型为int,需要通过类型转换获取到自己期望的类型。该方法也会接收回车符(13)、换行符(10)。

import java.io.IOException;
public class Demo1 {
    public static void main(String[] args) {
        try {
            System.out.print("Enter a char :");
            while(true){
                char val = (char)System.in.read();
                if(val == 13 || val == 10){
//                  byte b = (byte)val;
//                  System.out.println(b);
                }else{
                    System.out.println("Your char is :" + val + "\r");
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

很麻烦!

再次还可以这么用BufferedReader

使用BufferedReader类的readLine方法从控制台接收一个字符串。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Demo2 {
    public static void main(String[] args) {
        BufferedReader bufferedReader = null;
        try {
            bufferedReader = new BufferedReader(new InputStreamReader(System.in));
            while(true){
                System.out.print("Enter a String :");
                String val = bufferedReader.readLine();
                System.out.println("Your String is :" + val + "\r");
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally{
            if(bufferedReader != null){
                try {
                    bufferedReader.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                bufferedReader = null;
            }
        }
    }
}

下面是另外更丰富键盘输入的例子:

import java.util.Scanner;
public class Demo4 {
    public static void main(String[] args) {
        Scanner sc = null;
        try {
             sc = new Scanner(System.in); 
             System.out.println("请输入您的年龄:"); 
             int age = sc.nextInt(); 
             System.out.println("请输入您的姓名:"); 
             String name = sc.nextLine(); 
             System.out.println("请输入您的体重(kg):"); 
             float salary = sc.nextFloat(); 
             System.out.println("您的个人信息如下:"); 
             System.out.println("姓名:"+name+"\n"+"年龄:"+age+"\n"+"体重:"+salary); 
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if(sc != null){
                sc.close();
                sc = null;
            }
        }
    }
}

 

 

最后, 也可以用下面的Console输入方法输入数据,  (注:该种方法不能在eclipse中使用)

import java.io.Console;
import java.io.PrintWriter;

public class TestConsole {
    public static void main(String[] args) {
        
        Console cons = System.console();
        if (cons != null) {
            
            PrintWriter printWriter = cons.writer();
            printWriter.write("input:");
            cons.flush();
            String str1 = cons.readLine();
            cons.format("%s", str1);
        }
    }
} 

上面的这些输入足够用了, 毕竟目前, 大部分程序都是图形界面的程序, 在图形界面中, 有更好的用户输入输出交互方法

更多的输入输出设备

下面是一些输入和输出设备, 了解一下!

一) 输入设备

计算机的 输入设备按功能可分为下列几类:
● 字符输入设备:键盘;
● 光学阅读设备:光学标记阅读机、光学字符阅读机;
● 图形输入设备:鼠标器、操纵杆、光笔;
● 图像输入设备:数码像机、扫描仪、传真机;
● 模拟输入设备:语言模数转换识别系统。
(如光电纸带输入器、卡片输入器、光学字符读出器、磁带输入装备、汉字输入装备、鼠标等)将数据、程序和控制信息送入计算机内。

二)输出设备

显示器
黑白显示器


显示器(Display)又称监视器,是实现人机对话的主要工具.它既可以显示键盘输入的命令或数据,也可以显示计算机数据处理的结果.
常用的显示器主要有两种类型。一种是CRT(Cath-odeRayTube,阴极射线管)显示器,用於一般的台式微机;另一种是液晶(LiquidCrystalDisplay,简称LCD)显示器,用於便携式微机.下面主要介绍CRT显示器.按颜色区分,可以分为单色(黑白)显示器和彩色显示器.
彩色显示器又称图形显示器.它有两种基本工作方式:字符方式和图形方式.在字符方式下,显示内容以标准字符为单位,字符的字形由点阵构成,字符点阵存放在字形发生器中.在图形方式下,显示内容以像素为单位,屏幕上的每个点(像素)均可由程序控制其亮度和颜色,因此能显示出较高质量的图形或图像.
显示器的分辨率分为高中低三种.分辨率的指标是用屏幕上每行的像素数与每帧(每个屏幕画面)行数的乘积表示的.乘积越大,也就是像素点越小,数量越多,分辨率就越高,图形就越清晰美观

(1)CGA(ColourGraphicAdapter)彩色图形适配器,俗称CGA卡,适用於低分辨率的彩色和单色显示器.它支持的显示方式为:
字符方式下,40列×25行,80列×25行,4色或2色.
图形方式下,320×200,4色;640×200,2色.
(2)EGA(EnhancedGraphicAdapter)增强型图形适配器,俗称EGA卡,适用於中分辨率的彩色图形显示器.它支持的显示方式为:字符方式下,80×25列,256色 图形方式下,640×350,16色
超级EGA卡,支持800×600,16色.
(3)VGA(VideoGraphicArray)视频图形阵列,
液晶显示器


液晶显示器
俗称VGA卡,适用於高分辨率的彩色图形显示器.标准的分辨率为640×480,256色。使用的多是增强型的VGA卡,比如SuperVGA卡等,分辨率为800×600,1024×768等,256种颜色.
(4)中文显示器适配器
中国在开发汉字系统过程中,研制了一些支持汉字的显示器适配器,比如GW-104卡、CEGA卡、CVGA卡等,解决了汉字的快速显示问题.

 

----

打印机
打印机(Printer)是将计算机的处理结果打印在纸张上的输出设备.人们常把显示器的输出称为软拷贝,把打印机的输出称为硬拷贝.将计算机输出数据转换成印刷字体的设备。从使用角度看可分为两类。一类具有键盘输入功能,速度较慢,但与计算机有对话能力。它价格低廉,除计算机和终端常用外,通信系统也把它用作常规设备。另一类没有键盘输入功能。这类打印机又可分为条式打印机、窄行式打印机、串行打印机、行式打印机和页式打印机等。按照物理结构,打印机又可分为击打式和非击打式两类。


打印机分类
按传输方式,可以分为一次打印一个字符的字符打印机、一次打印一行的行式打印机和一次打印一页的页式打印机.
按工作机构,可以分为击打式打印机和非击打式印字机.其中击打式又分为字模式打印机和点阵式打印机.非击打式又分为喷墨印字机、激光印字机、热敏印字机和静电印字机.

 

绘图机
自动绘图机是直接由电子计算机或数字信号控制,用以自动输出各种图形、图像和字符的绘图设备。可采用联机或脱机的工作方式。是计算机辅助制图和计算机辅助设计中广泛使用的一种外围设备。常见的按绘图方式分为跟踪式绘图机(如笔式绘图机)和扫描式绘图机(如静电扫描绘图机、激光扫描绘图机、喷墨式扫描绘图机)等。按机械结构分为滚筒式(鼓式)绘图机和平台式绘图机两大类。数控绘图机的传动方式有钢丝或钢带传动;有滚珠丝杠或齿轮齿条传动;有电机传动,如采用开环控制方式的直线步进电机和采用闭环控制的伺服电机等。绘图仪能按照人们要求自动绘制图形的设备。它可将计算机的输出信息以图形的形式输出。主要可绘制各种管理图表和统计图、大地测量图、建筑设计图、电路布线图、各种机械图与计算机辅助设计图等。最常用的是X-Y绘图仪。现代的绘图仪已具有智能化的功能,它自身带有微处理器,可以使用绘图命令,具有直线和字符演算处理以及自检测等功能。这种绘图仪一般还可选配多种与计算机连接的标准接口。