外观
第 1 章 程序入门:和机器人说的第一句话
阅读目标
- 了解为什么 Java 是 FTC 控制系统的首选语言。
- 能够独立编写、编译并运行一个最简单的 Java 程序。
- 理解 Java 程序的编译和执行流程。
- 掌握最常用的算术运算符。
欢迎来到 FTC Java 编程的世界!
你可能想问,我们为什么要学习 Java 呢?
想象一下,你想让机器人前进、后退、举起手臂,你该怎么告诉它呢?你不能直接对它说中文,因为它听不懂。机器人和它内部的计算机,只懂一种由“0”和“1”组成的语言。
而 Java,就是一种我们和计算机(以及机器人)之间沟通的“桥梁语言”。它既像我们平时说话的逻辑,容易理解,又可以被“翻译”成计算机能懂的指令。学习 Java,就是学习如何精确、无歧义地给机器人下达指令,让它成为你可靠的伙伴!
IMPORTANT
在 FTC 竞赛中,Java 是官方指定的编程语言,从机器人主控到我们编写的控制程序,整个体系都构建在 Java 之上。所以,掌握 Java 是我们迈向成功的第一步!
1.1 你的第一个 Java 程序:Hello, FTC!
在学习任何编程语言时,传统上我们做的第一件事,都是让电脑在屏幕上显示 “Hello, World!”。这就像是和这个新世界打的第一个招呼。今天,我们来跟 FTC 世界打个招呼!
1.1.1 编写你的第一个指令
下面就是一个最简单的 Java 程序。它的唯一任务,就是在控制台(一个用来显示程序输出信息的窗口)打印出 "Hello, FTC!"。
java
/**
* 这是一个 HelloWorld 程序,是每个程序员的起点。
* public class HelloWorld 定义了一个“类”,你可以把它想象成是这个程序蓝图的名字。
* 在 Java 中,所有的代码都必须放在一个类(class)里面。
* 重要:这个类名 HelloWorld 必须和你的文件名 HelloWorld.java 完全一样!
*/
public class HelloWorld {
/**
* 这是程序的主方法(main method),也是程序的唯一入口。
* 就像一个建筑的正门,程序会从这里开始执行里面的代码。
* public static void main(String[] args) 是固定写法,目前你只需要记住它。
*/
public static void main(String[] args) {
// 这行代码是真正执行动作的指令。
// System.out.println(...) 的作用就是在控制台打印出括号里用双引号括起来的文字,
// 然后移动到下一行,为下一次打印做准备。
System.out.println("Hello, FTC!");
}
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
1.1.2 程序是如何运行的?
你可能会好奇,我们写的 HelloWorld.java 文件,计算机是如何把它变成屏幕上的一行字的?这个过程分为两步:编译和运行。
编译 (Compile)
- 我们写的
.java文件(称为源文件)充满了人类可读的文字和符号。但是,计算机的中央处理器(CPU)并不直接认识这些。 - 我们需要一个叫做“编译器”(Compiler)的工具,它会把我们的
HelloWorld.java文件翻译成一种叫做“字节码”(Bytecode)的东西,并存为一个新的文件HelloWorld.class。 - 字节码不是给 CPU 看的,而是专门给 Java 虚拟机(JVM)看的。你可以把它想象成一种只有 JVM 能看懂的“中间语言”。
- 我们写的
运行 (Run)
- Java 最强大的地方在于它的“一次编译,到处运行”特性。这就要归功于 Java 虚拟机 (JVM)。
- JVM 是一个虚拟的电脑,它安装在我们的操作系统(比如 Windows、Android)之上。当我们运行程序时,实际上是启动了 JVM。
- JVM 会加载
.class字节码文件,然后把它解释成当前操作系统(比如机器人主控里的 Android 系统)的 CPU 能够理解的机器指令。 - 最后,JVM 会找到我们程序里约定的入口——
main方法,从这里开始执行里面的代码,于是System.out.println("Hello, FTC!");就被执行了,你在控制台上就看到了结果。
总结一下
整个流程是:程序员编写 .java 文件 -> 编译器编译成 .class 字节码文件 -> JVM 解释 .class 文件 -> 操作系统执行指令。
常见错误
- 文件名和类名不匹配: 如果你的文件保存为
MyProgram.java,那么代码里必须是public class MyProgram。两者大小写也必须完全一致! - 大小写搞混: Java 是一个对大小写非常敏感的语言。
System不能写成system,String也不能写成string。 - 遗漏分号
;: 在 Java 中,每个独立的指令结束时,都必须有一个英文分号。这就像我们写完一句话要加句号一样。 - 使用中文符号: 代码中所有的括号
()、花括号{}、双引号""和分号;都必须是英文半角符号。输入法一定要切换到英文状态!
想一想
- 问:
println和print有什么区别? - 答:
println是 "print line"(打印一行)的缩写,它会在打印完指定内容后自动换行。而print只会打印内容,光标会停留在内容的末尾,不会换行。你可以把上面代码中的println改成print试试看,观察一下有什么不同!
📝 小练习 1
题目: 请你创建一个新的 Java 程序,修改代码,让它在控制台打印出 “我的第一个FTC程序!”。
提示:
- 新建一个 Java 文件,例如
MyFirstFtcProgram.java。 - 记得把类名也改成
MyFirstFtcProgram。 - 修改
System.out.println()括号里的文字。
参考答案:
java
/**
* 练习题:创建一个程序来打印自定义的中文消息。
*/
public class MyFirstFtcProgram {
public static void main(String[] args) {
// 将 "Hello, FTC!" 替换成我们想要打印的任何内容。
System.out.println("我的第一个FTC程序!");
}
}1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
1.2 让机器人学会计算
程序除了能显示文字,更强大的地方在于它能进行计算。我们可以利用 Java 的算术运算符,让机器人为我们处理各种数学问题。
1.2.1 认识基本的算术运算符
| 类别 | 符号 | 示例 | 说明 |
|---|---|---|---|
| 加 | + | a + b | 数值相加或拼接字符串 |
| 减 | - | a - b | 数值相减 |
| 乘 | * | a * b | 数值相乘 |
| 除 | / | a / b | 整数相除,结果只保留整数部分 |
| 取模 | % | a % b | 计算除法的余数 |
代码示例:
java
/**
* 这个程序演示了 Java 中基本的算术运算。
*/
public class SimpleCalculator {
public static void main(String[] args) {
// 为了方便演示,我们先创建两个整数变量(可以想象成带标签的盒子)
// int a = 10; 的意思是:创建一个叫 a 的整数盒子,并把 10 放进去。
int a = 10;
int b = 3;
// 使用 "+" 运算符进行加法
System.out.println("a + b = " + (a + b)); // 输出 a + b = 13
// 使用 "-" 运算符进行减法
System.out.println("a - b = " + (a - b)); // 输出 a - b = 7
// 使用 "*" 运算符进行乘法
System.out.println("a * b = " + (a * b)); // 输出 a * b = 30
// 使用 "/" 运算符进行除法
// 注意!两个整数相除,结果也是整数,小数部分会被直接丢掉!
System.out.println("a / b = " + (a / b)); // 输出 a / b = 3, 而不是 3.333...
// 使用 "%" 运算符取模(取余数)
// 10 除以 3,商是 3,余数是 1
System.out.println("a % b = " + (a % b)); // 输出 a % b = 1
}
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
注意整数除法
- 整数除法的陷阱:
10 / 3在数学上约等于3.33,但在 Java 的整数运算中,结果是3。小数部分会被无情地舍弃,而不是四舍五入! - 除数不能为零:
a / 0或者a % 0是一个严重的数学错误,会导致你的程序立刻崩溃并报错 (ArithmeticException)!在控制机器人时要绝对避免这种情况。 - 忘记运算优先级: Java 和数学一样,遵循“先乘除(
*,/,%),后加减(+,-)”的规则。如果不确定,就用括号()把你希望先计算的部分括起来,例如(a + b) * c。
`取模 %` 有什么用?
- 问: 取模
%运算到底有什么用?看起来好像不常用。 - 答:
a % b非常有用!最常见的用途是判断奇偶性:一个数 % 2如果结果是0,说明它是偶数;如果是1,说明它是奇数。在FTC中,我们还可以用它来让机器人的动作呈现周期性变化,比如一个舵机在 3 个位置之间循环摆动。
📝 小练习 2
题目: 编写一个程序,让用户可以从键盘输入两个整数,然后程序计算并打印出这两个数字的加、减、乘、除、取模的结果。
如何从键盘读取用户输入?
我们需要一个叫 Scanner 的工具。使用它分为三步:
- 在文件的最顶端,
public class ...的上一行,写import java.util.Scanner;来导入这个工具。 - 在
main方法里,写Scanner sc = new Scanner(System.in);来创建一个Scanner的实例。 - 当需要读取一个整数时,写
int a = sc.nextInt();即可。程序会在这里暂停,等待用户输入一个数字并按回车。 如果是需要读取一个浮点数和字符串呢?则需要使用double a = sc.nextDouble();和String a = sc.nextLine();。
示例交互:
请输入第一个整数 a:
10
请输入第二个整数 b:
3
10 + 3 = 13
10 - 3 = 7
10 * 3 = 30
10 / 3 = 3
10 % 3 = 11
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
参考答案:
java
// 1. 导入 Scanner 工具
import java.util.Scanner;
/**
* 练习题:一个可以接收用户输入的交互式计算器。
*/
public class InteractiveCalculator {
public main(String[] args) {
// 2. 创建一个 Scanner 实例,让它可以读取键盘输入
Scanner sc = new Scanner(System.in);
System.out.println("请输入第一个整数 a:");
// 3. 读取用户输入的第一个整数,并存到变量 a 中
int a = sc.nextInt();
System.out.println("请输入第二个整数 b:");
// 4. 读取用户输入的第二个整数,并存到变量 b 中
int b = sc.nextInt();
// 打印所有运算结果
System.out.println(a + " + " + b + " = " + (a + b));
System.out.println(a + " - " + b + " = " + (a - b));
System.out.println(a + " * " + b + " = " + (a * b));
System.out.println(a + " / " + b + " = " + (a / b));
System.out.println(a + " % " + b + " = " + (a % b));
}
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
本章小结
- Java 是我们和 FTC 机器人沟通的官方语言,是编程学习的基础。
- 所有 Java 程序都有一个
main方法作为入口;我们使用System.out.println()来输出信息。 - Java 程序经历“编译”和“运行”两个阶段,JVM 是实现跨平台运行的关键。
- 我们学会了使用
+ - * / %这五个基本的算术运算符,这是所有复杂算法的基石。 - 通过
Scanner,我们的程序可以和用户进行交互,变得更加灵活。
