Java-01 作答

第一部分:手撸你的第一个Java程序

1. 配置 Java 运行环境

使用 AdoptOpenJdk
选择 OpenJdk16 HotSpot 版本

2. Java 的基础语法与数据类型

3. 编写一个程序

查阅资料: Java 16 Api

Code:

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
29
30
import java.lang.Integer;
import java.util.HashMap;

public class FacSum{

private static HashMap<Integer, Integer> map = new HashMap<>();

public static void main(String[] args) {
if (args.length != 1) {
System.out.println("The program only takes one and only needs one argument.");
}
int target = Integer.parseInt(args[0]);
int sum = 0;
map.put(1, 1);
map.put(2, 2);
map.put(3, 6);
map.put(4, 24);
for (int i = 1; i <= target; i++) {
sum += fac(i);
}
System.out.println(sum);
}

private static int fac(int num) {
if (map.containsKey(num)) return map.get(num);
int fac = fac(num-1) * num;
map.put(num, fac);
return fac;
}
}

img


关于程序中的错误

  1. 类文件与源文件名不匹配且忘记导包 (我想念 idea 了)
  2. 非 static 方法与字段无法被 static 方法访问
  3. parse 拼写错误
  4. 在数组中,length 为字段并非方法(String 害人不浅)
  5. 传入给 Java 的参数数组并不包含它本身
    img
    img

第二部分:简单的计算器

使用 Intellij Idea
使用正则表达式进行字符串匹配与处理

关于正则
之前有略微了解但并未深入,这次借助各种资源帮助完成了正则表达式的编写:
regex101
Java 正则表达式 | 菜鸟教程
正则表达式的优化: Using alternation or character class for single character matching? - Stack Overflow

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
package io.github.jzyfc;

import java.io.*;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class SimpleCalculator {
public static void main(String[] args) throws IOException {
int first, second;
Matcher m;
String calc;
String result = "";
String ret;

// Read the data
System.out.println("请输入要计算的式子或选择保存上一次计算结果(输入s)");
Scanner scanner = new Scanner(System.in);
String newLine = scanner.nextLine();

// Initialize the regex
String pattern = "(\\d+) *([+\\-*/]) *(\\d+)";
Pattern p = Pattern.compile(pattern);

ret = readData();
if (!ret.equals("")) System.out.println("上次的计算结果为:"+ret);
while (!newLine.isEmpty()) {
if (newLine.equals("s")){
if (ret.equals("")) {
System.out.println("上次计算结果为空,请输入要计算的式子");
newLine = scanner.nextLine();
continue;
}
saveData(ret);
return;
}
m = p.matcher(newLine);
if (!m.matches()) {
System.out.println("错误的输入格式");
} else {
first = Integer.parseInt(m.group(1));
second = Integer.parseInt(m.group(3));
calc = m.group(2);
result = switch (calc) {
case "+" -> String.valueOf(first + second);
case "-" -> String.valueOf(first - second);
case "*" -> String.valueOf(first * second);
// calc can only be "/"
default -> first / second + "......" + first % second;
};
ret = String.format("%d%s%d=%s", first, calc, second, result);
System.out.println("计算结果为: " + ret);
}
newLine = scanner.nextLine();
}
}

private static void saveData(String s) throws IOException {
FileWriter fileWriter = new FileWriter("clacSave", false);
fileWriter.write(s);
fileWriter.flush();
fileWriter.close();
}

private static String readData(){
try {
return new BufferedReader(new FileReader("calcSave")).readLine();
} catch (IOException e) {
return "";
}
}
}


第三部分:计算结果存储

使用 FileReader, BufferedReader 与 FileWriter完成了数据的读写操作。
添加了两个方法以完成数据的读写。

遇到的问题

  1. 简单粗暴地处理 IOException 导致程序在无 calcSave 文件时读取数据出错, 后采用 try-catch 捕获异常
  2. 一开始采用正则解析 s 指令, 导致输入 s 之后程在读取数据时分组出错(不存在1、2、3组)。后采用 if 判断
  3. 文件均以 UTF-8 编码存储,导致最后程序乱码, 后添加编译器参数解决 img
    参考资料:CSDN