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编程的基础知识和技巧,但仍有许多内容需要进一步学习和研究。通过不断练习、阅读文档和参考优秀的代码示例,我可以不断提升自己的编程能力和解决问题的能力。

一些建议就是希望老师能谅解我有时候题目不能及时完善的完成,学习的进度和压力有点大,希望老师不要一直那么严肃。

 

posted @   瞔雅  阅读(124)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示