作者:Attect阅读:1522
发布/修定:2016-10-26 00:44/2018-03-29 19:21
本文内容禁止转载、引用!如有需要,请使用本页网址

第八节 这个计算器很高级

嗯~上节的“计算器”是不是很简单?有人说用真计算器就能实现那些简单计算。
但从本节开始,你就不能这么做了:D

本节主要内容为使用程序做大量重复操作。
当然你也可能需要重复学习多次才能理解。
五花肉:编程学习最好是边学边练,光看是不行的。

这也是利用计算机代替人脑或体力活动的最基础的前提。

一、{ }符号标记的代码块

每对大括号之间的内容是一个代码块。每个代码块都是一个整体,代码块之间只有完全不相交,或者是被完全包括的关系。
代码块的形状不一定是矩形
五花肉:也就是成块的代码

表示代码块意义的一些文字 {
    这是一块代码。
    有两行
}

表示代码块意义的一些文字 {这是另一块代码,只有一行}

家庭{
    这是一个家庭
    里面有几个成员
    父亲{
        我是父亲
        1223456789
    }
    
    母亲{
        我是母亲
        123456789
    }
    
    孩子{
        我是孩子
        没有连体婴儿这种情况!
    }
}

上面是三种代码块情况例子
伪代码格式,并不是真正能用的代码

五花肉:关于伪代码是什麽可以百度一下。

代码块中可以嵌套代码块,但不是无限嵌套的,特定意义的代码块里的嵌套有要求,在之后的学习里会逐渐了解。

有过编程经验的人关于左半大括号是放在行末还是换下一行的争议:可以根据个人习惯决定,开发环境默认是行末,本教程全部是放在行末。个人建议是如果你的屏幕高度小于60厘米时,最好还是放在行末,否则会带来屏幕浪费导致同屏代码量少的问题。未来课程中的左半小括号也是如此。

二、视频中的数学题

琪露诺的数学题

存在函数 f(x)=x+9
y=f(x)
求当x分别为1、3、5、7时,y的值

要求:使用程序解题时,x+9这个式子必须且只能出现一次

三、专业的翻译

本期只需要注意一点:在java中能承担数学函数作用的东西的名称叫做方法

五花肉:注意!如果并没有开发基础,那么下面的解释只需看一遍有个印象即可。


但如果你因为一些原因纠结为什么不统一叫做函数,下面是一些来自网上的解释的总结:
方法只存在面向对象的编程思维当中,因此如果你之前有接触过其它含有面向过程编程思维的编程语言,你会发觉视频中说的方法其实就是你知道的函数。也因此,两种叫法基本上就是编程思维里的叫法不一样。
Java完全面向对象,因此只有方法
C语言完全面向过程,因此只有函数
五花肉:如果不清楚面向过程和面向对象的区别并不必在此费力理解。只需要知道有这两种方式即可。


C++和PHP这类混合编程思维的语言里,面向过程部分代码是叫做方法,面向过程部分代码叫做函数
函数的单词是:function
方法的单词是:method
有的语言里写作function读作方法,晕不晕?
所以纠结这么多细节并没有什么作用,都是程序员的锅,这些都是人定的规则,计算机本身不区分这些,只是在网上查找答案时,关于安卓开发的疑问,如果需要搜索相关信息,都应该用方法这个名称。
五花肉:目前太过于纠结这种细节没什么卵用,只会对你的学习添加不必要的麻烦。

四、解题并翻译

标准数学步骤

解:由题可知,当x=1时
f(1)=1+9=10
当x=3时
f(3)=3+9=12
当x=5时
f(5)=5+9=14
当x=7时
f(7)=7+9=16

翻译:题目已知条件部分

f(x)=x+9

语句Java代码代码读法备注
存在函数f(x)int f(int x)定义方法f,需要一个整型参数x,结果为整型第一个int表示结果类型,f即为方法名称,括号里写需要的参数,参数也需要指明类型,且这个参数称为形式参数,简称形参。之所以确定是整型是由题目给的条件和结果推测得出
x+9x=x+9将x的值与9相加,得到的结果赋给x等号不念等于(计算机原理底层导致的叫法)

完整代码:

int f(int x){
    x=x+9;
    return x;
}

注意:

  1. 空格:int【空格】f(int【空格】x){....}

  2. 大括号必须成对出现

  3. 每句代码后面必须有一个分号

  4. 代码块中的代码使用一次Tab键缩进保持代码美观。可以一眼看出代码块的范围。默认情况下开发环境会自动帮你缩进保持美观。

多出的语句:return x;
在方法中,我们需要告知哪个东西是最终的结果,因此使用

return【空格】变量或值

来表示。
而这个被返回的结果则称为返回值
以下每行写法均正确(无视返回结果类型的举例,实际编写时需要确保返回的类型要和定义方法时最开始写的类型保持一致)

return x;
return result;
return 123;
return "text";
return;
return f(x);
return 1+2

方法返回结果类型不为void型时,方法最后执行语句必须是return语句,即最后必须指定一个结果。

执行return这一句代码后,这个方法代码块中剩下的代码在本次调用中将不被执行。即这次求出结果后就到这里为止,这个方法完成了使命。(在我们学习了逻辑分支以后会有更实际的应用和一些补充)

翻译:解题运算步骤

语句Java语言备注
当x=1时
f(1)=1+9=10
y=f(1)1的值将会被代入参数x,在代码块里计算,f方法的最终结果赋予y
当x=3时
f(3)=3+9=12
y=f(3)同上
当x=5时
f(5)=5+9=14
y=f(5)同上
当x=7时
f(7)=7+9=16
y=f(7)同上

在视频中,每次y被赋予计算结果后,我们都要马上使用输出语句输出结果,否则在下次赋值后,原来的值将丢失。

五花肉:实际开发中也要记得输出,否则赋值后将丢失原值。

最佳完整翻译结果

视频中琪露诺退场后的部分代码
方法定义:

int f(int x){
    x=x+9;
    return x;
}

方法调用:

int y;
int x;
x=1;
y=f(x);
system.out.println(y);
x=3;
y=f(x);
system.out.println(y);
x=5;
y=f(x);
system.out.println(y);
x=7;
y=f(x);
system.out.println(y);

本节依然忽视system.out.println(y);的原理和使用的细节,只需要知道它会在上节提到的地方输出结果。

五、更多方法定义例子

简化上面的

return 后面可以直接跟表达式

int f(int x){
    return x+9;
}

方法中使用方法

前提是方法都定义了。定义的顺序无所谓。

int g(int x){
    x=f(x)+1;
    return x;
}

方法里可以自己调用自己,但处理不当将导致无限执行(很抱歉,xxx应用无响应,是否强制关闭?)

其它返回类型和参数类型

String sayNumber(double number){
    String say = "数字:" + number;
    return say;
}

六、实参和形参

全称为实际参数和形式参数

实际参数

int x=1;
f(x);
f(1);

这里的f(x)里的x以及f(1)里的1称为实际参数,拥有确切的值,并且实际存在。

形式参数

String example(String name,int length){
    return name+"的长度为"+length;
}

其中,小括号中的name以及length就是形式参数,意思是在这个方法中应该存在一个这样的东西,要用的时候必须有,虽然我现在不知道它的值是什么,但在运行时将会传入一个对应类型的值。

这个知识点,大学计算机相关专业必考 :D

五花肉:其实参数也是变量,没错,就是参变量。

七、无结果的方法

方法并不一定需要返回一个结果。比如琪露诺的跳跃方法,只是需要跳跃这个效果(详见EX关卡的EX1),并不需要求出什么结果。

void类型

void 类型即表示没有返回结果,用于不需要知道结果的方法的返回类型

你不能定义一个类型为void的变量

五花肉:没有返回值,就要声明为void类型——无类型。

使用return打断返回值类型为void的方法

前面有提到return后的语句不再执行。这里是同理的。
但是返回类型为void的方法不能有返回值,但这并不意味着不能使用return。
我们可以使用的是

return ;

即return后面紧跟分号结束(返回一个什么都没返回)。
当执行这一行后,这一方法的代码块中剩下的代码在本次调用中将不被执行。也是方法完成了使命,不再继续。
利用这个可以很方便的结束方法的执行,避免使用大量的分支逻辑语句嵌套。

八、方法中的变量可用范围

声明的变量不是到处都可以使用的,这里主要提与方法相关的

  1. 在方法中声明的变量,只能在这个方法里使用

  2. 定义方法中的形参,也是只能在这个方法里使用

  3. 不同方法中,因为变量不互通,因此可以在不同方法中存在同名变量,但它们却又不是同一个东西。

  4. 请注意用鼠标左键点击变量名称后,开发环境会改变同一范围内该变量文字的颜色背景让你更容易分辨。

关于变量范围目前只需要知道这些。

九、高级

这一点写的是学习到后期才需要关心的内容
而且后期还会再提
但也请留心一下,虽然你现在可能很无法理解

形参拷贝问题

只有传递的形参类型是基础类型时(类型名称被开发环境标为蓝色),传递的为拷贝。

说人话:你需要将一个U盘里的数据给另一个人处理。如果这个数据是基础类型,那么那个人会把你U盘里的东西复制到他U盘里做处理,否则他直接拿你的U盘去操作

注意:如果形参在方法内被重新赋值,这将不会导致调用方法时传递的实参被改变。

说人话:那个人在处理到一半时,拿出了一个新的U盘,用新的U盘处理数据,对原来U盘的数据不影响。

具体将在之后的课程讲解引用后有更详细的原理解释(即Java中没有指针,但其实除了基础变量类型,其它都是指针)。

五花肉:就是当形参类型为基础数据类型时候,你声明时候是在栈内存里弄了一块地方放它,而当你执行方法时候,它又会在栈内存弄一块新的地方存这个参数,然后执行方法,把结果再存入这个新的栈内存里。所以说传递的为拷贝。

方法中变量内存释放问题

你声明的每一个变量,初始化后(通常为赋值或实例化),都将占用内存空间。使用完毕后,我们应该对它进行释放,避免内存浪费。但在Java方法中,所有方法内部定义声明的变量以及形参的内容,若在别处没有任何东西指向它们,那么在一段时间后将会被自动释放。

说人话:你在一块地上盖了一个房子,这个房子完全就是你的,当你不要这个房子以后,这个房子过段时间后就会被大自然的神秘力量给弄消失,原来占的位置可以给别人再盖房子。但如果你是和别人合伙盖的房子,你们都是这个房子的主人,那么你不要这个房子以后,房子继续被保留给剩下的主人使用。
房子占的地:内存
房子:变量或形参

五花肉:就是在Java中就可以不用管这个释放这个事。