java-PTA题目集1~3的总结
一、前言
1、第一次题目集:本次题目集主要涉及到以下知识点:
a. 输入和输出:使用`java.util.Scanner`类从控制台读取输入,并使用`System.out.println()`输出结果。
b. 条件语句:使用`if-else`语句根据条件进行不同的执行路径选择。
c. 数据类型和变量:使用`double`和`float`数据类型来存储浮点数值,以及使用`int`数据类型来存储整数值。
d. 字符串操作:使用字符串的比较、拼接和截取操作。
e. 循环结构:使用`for`循环遍历字符串中的每个字符。
f. 数值计算和比较:进行数值计算,如加法、除法、乘法和平方根计算,并使用条件判断语句进行数值比较。
g. 异常处理:使用`try-catch`块来处理可能出现的异常情况,如输入格式错误。
本次题目集有9道题目,题目难度较易,属于初级入门级别的,比较轻松能完成。
2、第二次题目集:本次题目集主要涉及到以下知识点:
a. 输入和输出:使用`Scanner`类读取用户的输入,并使用`System.out.println`输出结果。
b. 字符串操作:使用`String`类的`split`方法将输入行拆分为字符串数组,使用`equals`方法比较字符串是否相等,使用正则表达式进行匹配。
c. 数据类型和转换:使用整型`int`来表示数字,使用`Integer.parseInt`将字符串转换为整数。
d. 控制流程:使用`while`循环来持续接收用户输入,使用`if`语句和条件判断来根据用户输入执行不同的操作,使用`break`语句退出循环。
e. 数据结构:使用`HashMap`来存储菜单中的菜品对象,使用数组来存储订单中的订单记录对象。
f. 对象和类:定义了`Dish`、`Menu`、`Record`和`Order`这几个类来表示菜品、菜单、订单记录和订单,利用类的属性和方法进行相关操作。
g. 方法调用:通过调用对象的方法来实现添加菜品、查找菜品、添加订单记录、删除订单记录和计算订单总价格等功能。
本次题目集有4道题目,题目难度较上一次有一定程度的提升,但咬咬牙还能完成。
3、第三次题目集:本次题目集主要涉及到以下知识点:
a. 输入和输出:使用`Scanner`类读取用户的输入,使用`System.out.println()`打印输出结果。
b. 数据类型和变量:使用不同的数据类型(`int`、`double`、`String`)声明和存储变量,以及进行基本的数值操作。
c. 控制流程:使用条件语句(`if-else`)判断日期的先后顺序,根据条件输出相应的信息。
d. 数组和集合:使用数组和集合类(`String[]`、`ArrayList`、`HashSet`)存储和操作多个数据。
e. 类和对象:定义一个类`Student`,创建对象并调用类的构造方法和方法,以及使用类的属性和访问器方法。
f. 字符串操作:使用字符串的替换和分割方法(`replaceAll()`、`split()`)对输入的文本进行处理。
g. 时间和日期处理:使用`java.time.LocalDate`、`java.time.format.DateTimeFormatter`和`java.time.temporal.ChronoUnit`类处理日期、计算日期间隔等操作。
h. 排序和比较:使用`Collections.sort()`和自定义的`Comparator`类对列表进行排序,根据条件进行比较。
本次题目集总共有7道题目,难度较前两次有明显提升,特别是菜单计价,明显很吃力,导致我未能完成QAQ。
二、设计与分析
1、题目集一
第一次题目集的题目对于有c语言基础的我们来说想必不难,上手也极快,这里就不放题目的类图而是快速分析啦。
7-1这是一个简单的Java程序,用于计算身体质量指数(BMI)并根据结果进行分类。
代码分析如下:
BMI计算和条件判断:
bmi = w / h / h;
if (w <= 0 || h <= 0 || w > 727 || h > 2.72) {
System.out.print("input out of range");
} else if (bmi < 18.5) {
System.out.print("thin");
} else if (bmi < 24) {
System.out.print("fit");
} else if (bmi < 28) {
System.out.print("overweight");
} else {
System.out.print("fat");
}
这段代码首先计算BMI的值,即将体重`w`除以身高`h`的平方,并将结果赋给变量`bmi`。然后,使用条件语句进行分类判断:
- 如果体重或身高小于等于0,或者体重超过727或身高超过2.72,输出"input out of range"。
- 否则,根据BMI值进行分类:
- 如果BMI小于18.5,输出"thin"。
- 如果BMI在18.5和24之间(不包括24),输出"fit"。
- 如果BMI在24和28之间(不包括28),输出"overweight"。
- 如果BMI大于等于28,输出"fat"。
这样,程序将根据用户输入的体重和身高计算BMI,并根据BMI的值进行相应的分类输出。
7-2这是一个简单的Java程序,用于将输入的体重和身高从英制单位(磅和英寸)转换为公制单位(千克和米)。
单位转换:
w = w / 0.45359237;
h = h / 0.0254;
这段代码将体重`w`除以0.45359237,将身高`h`除以0.0254,实现了从英制单位到公制单位的转换。经过这两行代码后,`w`和`h`分别表示以公制单位(千克和米)表示的体重和身高。
这样,程序将根据用户输入的英制单位的体重和身高,转换为公制单位的体重和身高,并以浮点数形式输出。
7-3这是一个简单的Java程序,用于从用户输入的十个整数中找出奇数并计算它们的总和。
循环和条件判断:
for (j = 0; j < 10; j++) { i = in.nextInt();
if (i % 2 != 0) sum += i; }
这段代码使用for循环从用户输入中读取十个整数,并进行判断。在每次循环迭代中,通过in.nextInt()获取用户输入的整数,并将其赋值给变量i。然后,使用条件判断if (i % 2 != 0)判断i是否为奇数(即不被2整除)。如果是奇数,则将其累加到变量sum中。
这样,程序将循环读取用户输入的十个整数,并找出其中的奇数,最后计算并输出奇数的总和。
7-4这是一个简单的Java程序,用于计算一项服务的费用和相关费用的百分比,并输出结果。
条件判断和费用计算:
if (cs == 1) {
if (fwr <= 90)
qs = pgj * 10000 * 0.01;
else if (fwr > 90 && fwr <= 144)
qs = pgj * 10000 * 0.015;
else if (fwr > 144)
qs = pgj * 10000 * 0.03;
} else {
qs = pgj * 10000 * 0.03;
}
这段代码根据条件进行费用计算。首先,判断cs的值是否等于1。如果等于1,则根据fwr的不同取值范围计算qs的值。如果fwr小于等于90,则qs为pgj * 10000 * 0.01;如果fwr大于90且小于等于144,则qs为pgj * 10000 * 0.015;如果fwr大于144,则qs为pgj * 10000 * 0.03。如果cs不等于1,则直接将qs赋值为pgj * 10000 * 0.03。
7-5这是一个简单的Java程序,用于根据用户输入的数字选择角色种族和职业,并输出相应的种族和职业名称。
条件判断和字符串赋值:
if (race == 1) {
Race = "人类";
} else if (race == 2) {
Race = "精灵";
} else if (race == 3) {
Race = "兽人";
} else if (race == 4) {
Race = "暗精灵";
} else {
System.out.print("Wrong Format");
return;
}
这段代码根据用户输入的`race`的值,判断角色的种族,并将相应的种族名称赋值给变量`Race`。如果`race`的值是1,将`Race`赋值为"人类";如果`race`的值是2,将`Race`赋值为"精灵";如果`race`的值是3,将`Race`赋值为"兽人";如果`race`的值是4,将`Race`赋值为"暗精灵"。如果`race`的值不在1到4的范围内,则输出"Wrong Format"并终止程序执行。
类似的条件判断和字符串赋值:
if (occupation == 1) {
Occupation = "战士";
} else if (occupation == 2) {
Occupation = "法师";
} else if (occupation == 3) {
Occupation = "射手";
} else {
System.out.print("Wrong Format");
return;
}
这段代码根据用户输入的`occupation`的值,判断角色的职业,并将相应的职业名称赋值给变量`Occupation`。如果`occupation`的值是1,将`Occupation`赋值为"战士";如果`occupation`的值是2,将`Occupation`赋值为"法师";如果`occupation`的值是3,将`Occupation`赋值为"射手"。如果`occupation`的值不在1到3的范围内,则输出"Wrong Format"并终止程序执行。
7-6这是一个简单的Java程序,用于根据输入的字符串判断并输出学生的相关信息。
代码分析如下:
字符串格式验证:
if (!check(str)) {
System.out.println("Wrong Format");
return;
}
这段代码调用`check`方法对输入的字符串进行格式验证。如果格式不正确,则输出"Wrong Format"并终止程序执行。
格式验证方法:
public static boolean check(String str) {
if (str.length() != 8)
return false;
if (str.substring(2,4).compareTo("01") == 0)
return true;
if (str.substring(2,4).compareTo("02") == 0)
return true;
if (str.substring(2,4).compareTo("03") == 0)
return true;
if (str.substring(2,4).compareTo("20") == 0)
return true;
return false;
}
这是一个用于验证字符串格式的方法。根据字符串的长度和特定的子字符串进行判断。如果长度不是8,或者子字符串不符合特定的条件,则返回`false`,否则返回`true`。
7-7这是一个简单的Java程序,用于使用牛顿迭代法计算一个数的平方根。
输入格式验证:
if (n < 0 || lastGuess <= 0) {
System.out.print("Wrong Format");
} else {
// 迭代计算平方根
}
这段代码对输入的值进行格式验证。如果`n`小于0或者`lastGuess`小于等于0,则输出"Wrong Format"并终止程序执行。否则,执行平方根的迭代计算。
平方根迭代计算:
nextGuess = (lastGuess + n / lastGuess) / 2;
while (Math.abs(nextGuess - lastGuess) > 0.00001) {
lastGuess = nextGuess;
nextGuess = (lastGuess + n / lastGuess) / 2;
}
这段代码使用牛顿迭代法计算平方根。通过迭代计算,每次更新`nextGuess`的值,直到`nextGuess`与`lastGuess`的差的绝对值小于0.00001时停止迭代。
7-8这是一个简单的Java程序,用于从输入的字符串中提取数字。
提取数字:
for (int i = 0; i < n; i++) {
if (date.charAt(i) == '0' || date.charAt(i) == '1') {
num += date.charAt(i);
} else if (date.charAt(i) == '-') {
if (date.charAt(i + 1) == '1') {
System.out.print(num);
return;
}
}
}
System.out.printf("Wrong Format");
这段代码通过遍历输入字符串的每个字符,判断字符是否为0或1。如果是0或1,将其添加到`num`字符串中。如果遇到字符为'-',并且紧接着的字符是'1',则输出提取的数字字符串`num`并终止程序执行。如果没有找到满足条件的情况,则输出"Wrong Format"。
7-9这是一个简单的Java程序,用于判断三个输入的数是否可以构成三角形,并确定其类型。
输入格式验证和三角形类型判断:
if (a < 1 || a > 200 || b < 1 || b > 200 || c < 1 || c > 200) {
System.out.print("Wrong Format");
return;
} else {
// 判断是否构成三角形及类型
}
这段代码对输入的值进行格式验证。如果任意一个输入的数小于1或大于200,则输出"Wrong Format"并终止程序执行。否则,执行判断是否构成三角形及其类型的逻辑。
判断三角形类型:
if (a + b > c && a + c > b && b + c > a) {
// 可以构成三角形
if (a == b && b == c)
System.out.println("Equilateral triangle");
else if (a * a + b * b - c * c < 0.000001 && a == b)
System.out.println("Isosceles right-angled triangle");
else if ((a == b && a != c) || (a == c && a != b) || (b == c && b != a))
System.out.println("Isosceles triangle");
else if (a * a + b * b - c * c < 0.000001)
System.out.println("Right-angled triangle");
else
System.out.println("General triangle");
} else {
// 不能构成三角形
System.out.println("Not a triangle");
}
这段代码首先判断三个数是否满足构成三角形的条件。如果满足条件,则根据边长关系判断三角形的类型,并输出相应的结果。如果不能构成三角形,则输出"Not a triangle"。
2、题目集二
7-1先放类图
在Main类中,我们首先创建了一个Menu对象和一个totalPrice变量来保存总价格。
接下来,我们创建了几个Dish对象,并使用menu.add(d)将它们添加到菜单中。这样,菜单中就包含了几个可供选择的菜品。
通过Scanner类,我们从用户输入中读取信息,直到用户输入"end"为止。
我们将读取的字符串使用空格分割成两部分,第一部分是菜品的名称,第二部分是份数。
接下来,我们使用一个循环来遍历菜单中的菜品,并找到与输入的菜品名称匹配的菜品。
如果找到匹配的菜品,我们通过调用getPrice方法计算所点菜品的价格,并将其添加到totalPrice中。
如果没有找到匹配的菜品,我们输出一条消息表示菜品不存在。
当用户输入"end"后,我们打印出总价格并结束程序。
在Dish类中,我们定义了菜品的名称和单价,并提供了一个getPrice方法来计算特定份数的菜品价格。
在Menu类中,我们定义了菜单的数据结构和操作方法。菜单通过一个Dish数组来存储菜品信息。add方法用于将菜品添加到菜单中,searchDish方法用于根据菜品名称查找菜品对象。
这段代码的核心是使用面向对象的思想,将菜品和菜单分别作为类进行定义,并通过对象之间的交互实现点餐和计算总价格的功能。
7-2这道题抽象起来了
先放类图
在Main类中,我们首先创建了一个Scanner对象来读取用户的输入。然后创建了一个菜单对象Menu和一个订单对象Order。
接下来,使用一个无限循环来不断接收用户的输入,直到用户输入了"end"为止。
在每次循环中,我们读取用户输入的一行数据,并将其按空格拆分为一个字符串数组。
如果第一个元素是数字,表示这是一个订单操作。我们根据数组长度和具体的操作进行相应的处理。如果是"delete"操作,我们根据订单号删除对应的订单记录;如果是添加订单操作,我们根据输入的信息创建订单记录,并输出相应的信息。
如果第一个元素不是数字,表示这是一个菜单操作。我们根据输入的菜名和价格创建一个菜品,并将其添加到菜单中。
循环结束后,我们输出订单的总价格。
在代码的后面部分,定义了Dish、Menu、Record和Order这几个类。
Dish类表示一个菜品,具有名称和价格属性。它还有一个根据规格类型计算价格的方法。
Menu类表示菜单,使用HashMap来存储菜品对象。它提供了根据菜名查找菜品的方法,并可以添加新的菜品到菜单中。
Record类表示订单记录,包含订单号、菜品对象、规格类型和数量等信息。它提供了计算该订单记录价格的方法。
Order类表示订单,使用一个数组来存储订单记录对象。它提供了添加订单记录、删除订单记录、查找订单记录和计算订单总价格的方法。
7-3先放类图
这段代码实现了一个日期计算程序,可以判断输入的日期是否合法,并计算日期之间的差值和其他相关信息。让我们逐行分析和解释代码的功能和实现细节。
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.time.LocalDate;
import java.util.Calendar;
import java.util.Scanner;
public class Main {
public static boolean judge(String s) {
// 判断日期是否合法的方法
// ...
}
public static void main(String[] args) throws Exception {
// 主函数
// ...
}
}
在`Main`类中,我们首先定义了一个名为`judge`的方法,用于判断日期是否合法。该方法的具体实现被省略了,可以假设它能够正确判断日期的合法性。
接下来,在`main`函数中,我们进行主要的逻辑处理。
Scanner scanner = new Scanner(System.in);
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Calendar calendar;
String nextDate = scanner.nextLine();
String firL = scanner.next();
String lasR = scanner.next();
我们使用`Scanner`类从标准输入读取用户输入的日期信息。`nextDate`表示用户输入的第一个日期,`firL`表示用户输入的第二个日期的起始值,`lasR`表示用户输入的第二个日期的结束值。
boolean isQ = judge(nextDate);
boolean isI = judge(firL);
boolean isT = judge(lasR);
我们调用`judge`方法判断输入的日期是否合法,并将结果保存在对应的布尔型变量中。
int[] nsa = new int[3];
int[] geoB = new int[3];
int[] ned = new int[3];
Date fdate = format.parse(firL);
Date sdate = format.parse(lasR);
calendar = Calendar.getInstance();
calendar.setTime(format.parse(nextDate));
int theDay = 0;
if (calendar.get(Calendar.DAY_OF_WEEK) == 1) {
theDay = 7;
} else {
theDay = calendar.get(Calendar.DAY_OF_WEEK) - 1;
}
int num = Math.abs((int) ((fdate.getTime() - sdate.getTime()) / (1000 * 3600 * 24)));
我们使用`SimpleDateFormat`类将日期字符串解析为`Date`对象,并使用`Calendar`类获取下一个日期输入的星期几。同时,我们计算了第二个日期与第一个日期的天数差值。
if (isQ == false) {
// 处理第一个日期不合法的情况
// ...
} else {
// 处理第一个日期合法的情况
// ...
}
根据第一个日期的合法性,我们分别处理不合法和合法的情况。
如果第一个日期不合法,我们输出相应的错误信息,并进一步判断第二个日期是否合法。如果第二个日期也不合法,我们输出错误信息。如果第二个日期合法,我们进行日期间的比较和计算,并输出相应的信息。
如果第一个日期合法,我们输出第一个日期的相关信息,并进一步
判断第二个日期是否合法。如果第二个日期不合法,我们输出错误信息。如果第二个日期合法,我们进行日期间的比较和计算,并输出相应的信息。
整个代码的实现逻辑比较复杂,涉及到日期的解析、判断、计算等操作。在处理日期相关的逻辑时,代码中使用了`SimpleDateFormat`、`Calendar`和`Date`等类来辅助处理日期和时间的操作。
7-4还是先放类图
在Main类中,我们首先创建了输入流读取器,并用它初始化了StreamTokenizer对象。这个对象可以帮助我们从输入流中解析出数值。
接下来,我们使用StreamTokenizer读取输入的整数值,这个值表示要计算的斐波那契数列的索引数量。
然后,我们创建了两个整数数组fn和sn,fn用于存储输入的斐波那契数列索引值,sn用于存储计算出的斐波那契数。
接着,我们使用循环读取输入的斐波那契数列索引值,并计算出最大的索引值。同时,我们通过预先定义的初始值初始化了sn数组的前5个元素。
接下来的循环中,我们使用动态规划的思想,根据已知的斐波那契数列值计算出剩余位置的斐波那契数。
最后,我们输出计算结果。
3、题目集三
7-1这次的菜单我已经有点力不从心了,在同学的帮助下分析一下这次的代码,先放类图
导入需要的类:
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Scanner;
这些是导入所需的Java类,用于实现输入输出、日期时间处理和集合操作等功能。
2. 定义Die类:
public class Die {
static Scanner scanner = new Scanner(System.in);
public static void main(String[] args) {
// ...
}
// ...
}
Die类是程序的入口点,包含了主函数`main`和一个静态的Scanner对象`scanner`。
3. 定义Menu类:
public static class Menu {
private List<Dish> dishes;
public Menu() {
dishes = new ArrayList<>();
}
public Dish searthDish(String name) {
// ...
}
public Dish addDish(String name, int price) {
// ...
}
}
Menu类表示菜单,包含了菜品列表和一些方法用于搜索菜品和添加菜品。
定义Dish类:
public static class Dish {
private String name;
private int price;
public Dish(String name, int price) {
this.name = name;
this.price = price;
}
public String getName() {
return name;
}
public int getPrice() {
return price;
}
}
Dish类表示菜品,包含了菜品的名称和价格。
定义Order类:
public static class Order {
private int tableNum;
private List<Record> records;
private Date date;
public Order(int tableNum, int year, int month, int day, int hour, int minute, int second) {
this.tableNum = tableNum;
records = new ArrayList<>();
Calendar calendar = Calendar.getInstance();
calendar.set(year, month - 1, day, hour, minute, second);
}
public void addARecord(int orderNum, Dish dish, int portion, int num) {
// ...
}
public Record findRecordByNum(int orderNum) {
// ...
}
public void delARecordByOrderNum(int orderNum) {
// ...
}
public int getTableNum() {
return tableNum;
}
public Date getDate() {
return date;
}
}
Order类表示订单,包含了订单的桌号、菜品记录列表和日期。它提供了添加记录、查找记录和删除记录的方法。
主函数`main`:
public static void main(String[] args) {
Menu menu = new Menu();
Order[] orders = new Order[100];
int orderIdx = 0;
while (scanner.hasNext()) {
String line = scanner.nextLine();
if (line.equals("end")) {
break;
}
String[] parts = line.split(" ");
if (parts[0].equals("table")) {
// ...
} else if (parts[1].equals("delete")) {
// ...
} else {
// ...
}
}
for (int i = 0; i < orderIdx; i++) {
System.out.println(orders[i].toString());
}
}
在主函数中,首先创建了一个Menu对象和一个大小为100的Order数组用于存储订单。`orderIdx`变量用于记录订单索引。
接下来,通过循环读取输入的命令,当输入为"end"时结束循环。根据命令的不同,执行相应的操作:
- 若命令以"table"开头,解析命令中的日期时间信息,并创建一个新的Order对象,将其存储在订单数组中。
- 若命令为"delete",解析命令中的订单号,并在当前订单中查找相应的记录,若存在则删除该记录。
- 否则,解析命令中的菜品名称、份数和订单号,并在当前订单中添加一条记录。
最后,通过循环打印订单数组中的订单信息。
这段代码主要实现了菜单管理和订单管理的基本功能。不过还存在一些问题,比如日期的处理没有正确赋值给Order对象的date属性,部分变量没有按照命名规范命名等。
7-2比较简单
在主函数中,首先创建了一个Scanner对象zs用于读取输入。然后通过zs.nextInt()读取一个整数n,表示接下来要输入的整数个数。
接下来,创建一个HashSet集合set,用于存储已经出现过的整数。
然后使用循环读取n个整数,并逐个判断是否已经存在于集合中。如果存在,则输出"YES"并返回(使用return语句结束程序)。否则,将当前整数添加到集合中。
循环结束后,如果没有找到重复的整数,则输出"NO"表示没有重复
7-3难度不大
在主函数中,首先创建了一个Scanner对象data用于读取输入。然后通过data.nextInt()读取一个整数n,表示接下来要输入的整数个数。
接下来,创建了一个ArrayList集合cf用于存储去重后的整数,并创建了一个HashSet集合cs用于判断是否已经存在于集合中。
然后使用循环读取n个整数,并逐个判断是否已经存在于HashSet集合中。如果不存在,则将其添加到HashSet集合和ArrayList集合中。
循环结束后,使用循环遍历ArrayList集合cf,并逐个输出其中的元素。同时在输出时,根据位置判断是否需要输出空格。
这段代码通过List和Set集合的组合,实现了对输入的一组整数进行去重并保留原始顺序的功能。可以用于去除重复的数字并输出去重后的结果。
7-4难度不大
在主函数中,首先创建了一个Scanner对象scanner用于读取输入。然后通过scanner.nextLine()读取一行字符串,即英文文本。
接下来,通过使用正则表达式和字符串操作对输入的文本进行处理,将标点符号替换为空格,并使用空格分割为单词数组。
然后创建了一个HashMap集合wordLengthMap,用于去重并存储单词及其对应的长度。
使用循环遍历单词数组,对每个单词进行判断,如果该单词不存在于wordLengthMap中,则将其添加到集合中,并同时存储其长度。
接下来,将wordLengthMap的键值对转换为ArrayList集合wordList,并使用自定义的Comparator实现对集合进行排序。排序规则是按照单词长度降序排列,如果长度相同则按照不区分大小写的字典序排列。
最后,通过循环遍历wordList,逐个输出单词。
这段代码实现了对输入的英文文本进行处理、去重、计算单词长度,并按照长度降序和字典序输出结果的功能。可以用于统计文本中出现的不重复单词,并按照一定规则排序输出。
7-5这段代码主要实现了学生信息的输入、创建对象以及输出学生信息的功能。通过使用构造方法和setter方法,可以将输入的学生信息设置到相应的学生对象中,并通过调用对象的print()方法进行输出。
放个类图吧
7-6较易
这段代码实现了将度分秒表示的角度转换为十进制度数的功能。用户通过输入度、分、秒的值,程序会计算出对应的十进制度数,并进行输出。
7-7需注意细节,难度不大
这段代码实现了比较两个日期的先后顺序,并计算它们之间的天数和周数间隔。
使用isBefore()和isAfter()方法判断两个日期的先后顺序,根据判断结果输出相应的信息。
使用ChronoUnit.DAYS.between()和ChronoUnit.WEEKS.between()方法计算两个日期之间的天数和周数间隔。然后,根据具体情况取绝对值,以确保输出的是正数。最后,将结果输出到控制台。
三、踩坑心得
作为一个Java的初学者,在编写这些代码时常常会遇到以下一些常见的坑:
1. 输入错误:在使用`Scanner`类获取用户输入时,需要确保输入的格式和数据类型与代码中的期望一致,否则可能会导致运行时错误或逻辑错误。
2. 数组和集合越界:在使用数组或集合时,需要注意索引的范围,避免越界访问。特别是在使用数组时,要确保数组的长度足够存储数据,以防止`IndexOutOfBoundsException`异常。
3. 对象引用空指针:在使用对象之前,要确保对象已经被实例化并赋予有效的引用,否则会导致空指针异常(`NullPointerException`)。需要注意对对象进行判空处理,避免空指针异常的发生。
4. 逻辑错误和条件判断:在编写条件语句时,要确保逻辑正确,包括条件的顺序、条件的组合和逻辑运算符的正确使用。要特别注意条件的边界情况和特殊情况,确保代码能正确处理各种情况。
5. 类和对象的使用:在创建和使用类和对象时,要注意类的构造方法、属性和方法的正确使用。特别是在使用类的方法和属性之前,要确保对象的状态正确,并且属性赋值和方法调用的顺序正确。
6. 字符串处理:在对字符串进行操作时,要注意字符串的不可变性,即字符串的值无法修改,每次操作都会创建一个新的字符串对象。因此,对于频繁的字符串操作,应该使用`StringBuilder`或`StringBuffer`类来提高效率。
7. 异常处理:在代码中可能会出现各种异常情况,如输入格式错误、文件读写失败等。需要学会使用`try-catch`语句块来捕获和处理异常,以保证程序的稳定性和可靠性。
8. 规范和风格:在编写代码时,要注意遵循编码规范和良好的编程风格,如使用有意义的变量名、适当的缩进和注释等。这有助于提高代码的可读性和可维护性。
这些是我作为初学者在编写Java代码时常见的一些问题和坑,通过不断的实践和学习,
或许可以逐渐克服这些问题,提高自己的编程能力。
四、主要困难以及改进建议
以下困难和解决方法有一些来自以前学长的分享,希望我能做到这些建议以提高自己的能力!
会遇到以下主要困难:
1. 理解面向对象编程(OOP)概念:面向对象编程是Java的核心特性,初学者可能会对类、对象、继承、多态等概念感到困惑。建议深入学习OOP的原理和概念,理解如何设计和组织类、对象之间的关系。
2. 理解和使用Java的核心库:Java提供了丰富的核心库,初学者可能会感到困惑和不熟悉如何使用这些库来解决实际问题。建议学习常用的类和库,如`java.util`、`java.io`等,并实践使用它们来解决实际问题。
3. 调试和错误处理:在编写代码时,难免会出现错误和异常情况。初学者可能会面临困惑和不知道如何调试和处理这些错误的情况。建议学习调试技巧,如使用调试器和日志记录工具,同时学习异常处理机制,正确地捕获和处理异常。
4. 面临复杂的问题和项目:在实践中,可能会遇到较复杂的问题或需要完成一个完整的项目,这可能会使初学者感到不知所措。建议逐步增加难度,从简单的问题开始解决,逐渐提升自己的能力,同时参与小规模的项目,积累经验和技能。
改进建议如下:
1. 深入学习基础知识:建立坚实的基础是非常重要的。学习Java的基本语法、数据类型、流程控制和常用类等知识,并进行练习和实践,加深对这些概念的理解和应用能力。
2. 多阅读和实践代码:阅读优秀的Java代码和项目可以帮助你学习和理解编码风格、设计模式和最佳实践。尝试阅读一些开源项目的源代码,并模仿它们的风格和结构来编写自己的代码。
3. 刻意练习和项目实践:通过解决编程问题和完成小规模项目来提高自己的编程能力。选择一些适合自己水平的练习题目或开发小项目,逐步提升自己的技能,并在实践中学习如何解决问题。
4. 寻求帮助和参与讨论:在学习过程中,遇到困难和问题时不要害怕寻求帮助。可以参加编程社区、论坛或加入学习小组,与其他初学者和经验丰富的开发者进行讨论和交流,共同进步。
5. 持续学习和扩展知识:Java是一门广泛应用的编程语言,持续学习和扩展自己的知识是非常重要的。关注最新的Java技术和趋势,了解Java生态系统中的其他相关技术和框架,不断提升自己的技术水平。
如以下是对菜单计价-3的一些改进:
以下是对提供的代码的一些改进建议:
输入处理:在主方法中,我使用`Scanner`来逐行读取输入,但没有进行错误处理。可以添加适当的错误检查和异常处理机制,以确保输入的正确性和稳定性。
集合初始化:在`Menu`类和`Order`类中,我使用了`ArrayList`来初始化集合。可以在声明时使用钻石操作符`<>`来避免重复写出类型参数。例如,`dishes = new ArrayList<>();`。
引用传递:在`Order`类的构造函数中,我没有将`calendar`的值赋给`date`成员变量。这是因为Java中的日期是通过引用传递的,所以需要使用`calendar.getTime()`获取日期对象,并将其赋给`date`。
五、总结
以下是对这三次的一个总结
1. 输入和输出:我学会了使用`Scanner`类从控制台读取输入数据,并使用`System.out.println`进行输出。
2. 数据结构:我学会了使用`Set`、`List`和`Map`等数据结构来处理和存储数据。这些数据结构在不同的情境下具有不同的优势,你需要根据实际需求选择适当的数据结构。
3. 循环和条件语句:我学会了使用`for`循环和`if-else`条件语句来实现程序的控制流程,包括遍历数据、判断条件和执行不同的操作。
4. 类和对象:我学会了创建类、定义属性和方法,以及使用类创建对象并操作对象的属性和方法。
5. 字符串处理:我学会了使用字符串操作的方法,如分割、替换和拼接字符串,以及比较字符串和提取子字符串。
需要进一步学习和研究的地方包括:
1. 异常处理:在给定的代码示例中,并未完全处理输入错误或无效数据的情况。学习如何使用`try-catch`块来捕获和处理异常,以提高程序的健壮性。
2. 输入验证和数据清洗:在实际开发中,输入数据的验证和清洗是非常重要的。你可以学习如何编写代码来验证用户输入的数据是否符合预期,并进行必要的清洗和转换。
3. 更多的数据结构和算法:除了示例中涉及到的数据结构,还有许多其他的数据结构和算法可供学习和探索。了解不同的数据结构和算法可以帮助你更高效地解决问题。
4. 面向对象编程原则:学习如何设计良好的类和对象,并遵循面向对象编程的原则,如封装、继承和多态。这将使你的代码更加可维护、可扩展和可重用。
5. 更多的Java核心概念和库:继续学习Java的核心概念,如继承、多态、接口、异常处理等,并了解常用的Java库和框架,如集合框架、IO操作、日期时间处理等。
总体而言,我已经掌握了一些Java编程的基础知识和技巧,但仍有许多内容需要进一步学习和研究。通过不断练习、阅读文档和参考优秀的代码示例,我可以不断提升自己的编程能力和解决问题的能力。
一些建议就是希望老师能谅解我有时候题目不能及时完善的完成,学习的进度和压力有点大,希望老师不要一直那么严肃。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具