以下为个人学习笔记和习题整理
课程:零基础学Java语言-浙江大学-翁恺 @ 中国大学MOOC
https://www.icourse163.org/course/ZJU-1001541001
课堂笔记
函数
// 定义一个求和函数
public static void sum(int a, int b) {
int i;
int sum=0;
for ( i=a; i<=b; i++ ) {
sum += i;
}
System.out.println(a+"到"b+"的和是"+sum);
}
public static void main(String[] args) {
// 调用函数
sum(1,10);
sum(20,30);
sum(35,45);
}
定义函数
- 函数是一块代码,接收零个或多个参数,做一件事情,并返回零个或一个值,用来形成可重复使用的代码。
- 可以先想象成数学中的函数:
y=f(x)
- Java的函数必须定义在类的内部,成为类的成员。
public static <返回值类型> <方法名称>(<参数表>) {
<方法体>
}
-
返回类型:是这个函数运行结束时要返回给调用者的数据的类型,函数可以返回基本数据类型、对象或者void。返回void表示这个函数不返回任何值。
-
函数名称:是一个Java名字,一样要遵循和变量一样的命名规则。
-
参数表:是0个或1个或多个参数定义,用逗号
,
分隔。 -
在这个阶段,我们要在所有的函数的返回类型前面加上关键字
static
。static
表示这个函数属于这个类,而不属于这个类的任何对象,因此我们才可以不制造这个类的对象,而直接从main()
函数中调用它。
调用函数
函数名(参数值);
()
起到了表示函数调用的重要作用- 即使没有参数也需要
()
- 如果函数有参数,调用函数时必须传递给它数量、类型正确的值
- 可以传递给函数的值是表达式的结果,包括
- 字面量
- 变量
- 函数的返回值
- 计算的结果
函数返回
- 函数知道每一次是哪里调用它,函数结束的时候会返回到正确的地方。
从函数中返回值
return;
return 表达式;
return
停止函数的执行,并送回一个值- 一个函数里可以出现多个
return
语句,但是保持单一出口是好的做法。
public static int max(int a, int b) {
int ret;
if(a>b) {
ret = a;//出口一
} else {
ret = b;//出口二
}
return ret;//出口三
}
- 可以赋值给变量
- 可以再传递给函数
- 甚至可以丢弃
- 有的时候要的是副作用
int a = 5;
int b = 6;
int c;
c = max(10,12);
c = max(a,b);
c = max(c,23);
c = max(max(c,a),5);
System.out.println(max(a,b));
max(12,13);
没有返回值的函数
void 函数名(参数表)
- 不能使用带值的return
- 可以没有return
- 调用的时候不能做返回值赋值
参数传递
类型不匹配
- 当函数期望的参数类型比调用函数时给的值的类型宽的时候,编译器能悄悄替你把类型转换好
自动
char
→int
→double
- 当函数期望的参数类型比调用函数时给的值的类型窄的时候,需要你写强制类型转换
手动
(int)5.0
- 当函数期望的参数类型与调用函数时给的值的类型之间无法转换的时候,报错!
传值
- Java语言在调用函数时,永远只能传值给函数
- 每个函数都有自己的变量空间,参数也位于这个独立的空间中,和其它函数没有关系
本地变量
-
概念
- 函数每次运行,都产生一个独立的变量空间,在这个空间中的变量,是函数的这次运行所独有的,称作本地变量
- 定义在函数内部的变量,就是本地变量
- 参数也是本地变量
-
变量的生存期和作用域
- 生存期:什么时候这个变量开始出现,到什么时候它消亡
- 作用域:在(代码的)什么范围内可以访问这个变量(这个变量可以起作用)
- 对于本地变量,这两个问题的答案是统一的:大括号内——块
-
规则
- 本地变量是定义在块内的
- 它可以是定义在函数的块内
- 也可以是定义在语句的块内
- 甚至可以随便拉一对大括号来定义变量
- 程序运行加入这个块之前,其中的变量不存在,离开这个块,其中的变量就消失了
- 块外面定义的变量在里面仍然有效
- 不能在一个块内定义同名的变量,也不能定义块外面定义过的变量
- 本地变量不会被默认初始化
- 参数在进入函数的时候就被初始化了
- 本地变量是定义在块内的
int main()
{
int scp1;//scp1出现了
{ //scp1还是存在的
int scp2; //scp2出现了
{//scp1与scp2都还是存在的
int scp3;//scp1、scp2、scp3都存在
}
//scp3不存在了
//scp1与scp2还存在
}
//scp2不存在了
//scp1还存在
}
编程题
题目1. 分解质因数(5分)
-
题目内容
每个非素数(合数)都可以写成几个素数(也可称为质数)相乘的形式,这几个素数就都叫做这个合数的质因数。比如,6可以被分解为2x3,而24可以被分解为2x2x2x3。现在,你的程序要读入一个[2,100000]范围内的整数,然后输出它的质因数分解式;当读到的就是素数时,输出它本身。
-
输入格式
一个整数,范围在[2,100000]内。 -
输出格式
形如:
n=axbxcxd
或
n=n
所有的符号之间都没有空格,x是小写字母x。 -
输入样例
18 -
输出样例
18=2x3x3
解题代码
import java.util.Scanner;
public class Main {
// 判断是否为素数的函数
public static boolean isPrime(int i) {
for(int j = 2; j < i; j++) {
if( i % j == 0) {
return false;
}
}
return true;
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int number = in.nextInt();
String comma = "";
System.out.print(number + "=");
for (int i = 2; i <= number; i++) { // 遍历小于输入值的整数
while (number % i == 0) { // 如果number能被i整除
if ( isPrime(i) ) { // 且i为素数
System.out.print(comma + i); // 输出
comma = "x";
number /= i;
}
}
}
}
}
题目2. 完数(5分)
-
题目内容
一个正整数的因子是所有可以整除它的正整数。而一个数如果恰好等于除它本身外的因子之和,这个数就称为完数。例如6=1+2+3(6的因子是1,2,3)。现在,你要写一个程序,读入两个正整数n和m(1<=n<m<1000),输出[n,m]范围内所有的完数。
提示:可以写一个函数来判断某个数是否是完数。
-
输入格式
两个正整数,以空格分隔。 -
输出格式
其间所有的完数,以空格分隔,最后一个数字后面没有空格。如果没有,则输出一个空行。 -
输入样例
1 10 -
输出样例
6
解题代码
import java.util.Scanner;
public class Main {
// 判断是否为完数的函数
public static boolean isPerfect(int i) {
int sum = 0;
for(int j = 1; j < i; j++) {
if( i % j == 0) {
sum += j;
}
}
return sum == i;
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int m = in.nextInt();
String comma = "";
for (int i = 1; i >= n && i <= m; i++) {
if ( isPerfect(i) ) {
System.out.print(comma + i);
comma = " ";
}
}
}
}