java题目集1~3的总结性Blog
一、前言
经历前三次java题目集的话,应该也算是相对了解了java这门语言了,因为有了c语言的基础在里面,所以一部分基础的语法部分就理解来说的话不算是很困难,但从面向过程到面向对象的一个思想观念的改变让我有些不适应。如果把编写代码比作下棋的话,那么面向过程就是一步一步的下棋,想到什么写什么,所以写起来就感觉很顺畅,有种一气呵成的感觉;但面向对象是以功能来划分问题,而不是以步骤解决,就需要多费一点脑筋了,但面向对象的话,代码结构会更加清晰,而且代码重用率高,相较于面向过程而言后期修改会更加方便。总之就是很厉害的感觉。
这三次的题目也是在逐渐锻炼一种面向对象的能力,第一次的作业,可能是考虑到刚入门的原因,题目并不是很难(虽然我还是有没写出来的,但我相信大部分同学肯定都写出来了),一共有9题,第一次的作业就让我们忘记它吧,因为从第二次作业开始,就会出现无法忘记的题目,我的梦魇,菜单计价系列题目,即题目集2的7-1、7-2以及题目集3的7-1。难度我就不做评价了,我不好评价了,只能说懂得都懂,不懂的我也不好多说。其他的题目难度都似乎都在这一系列的题目难度下黯然失色。
二、设计与分析
第一次的题目的话都是比较基础的,感觉也没有很能体现面向对象的地方,而且也由于是刚接触面向对象,所以在完成其实也没有运用很多面向对象的思想,基本就是使用c的思想,然后换成了java的语法来完成,所以就赘述了。

接下来就是梦到开始,第二次题目集了。先把又爱又恨的菜单计价程序放在一边,简单讲下7-3和7-4。

首先是7-3,就和它的名字一样,是关于日期类的基本使用的。类是java中一个重要的概念。类是一个模板,它描述一类对象的行为和状态。类的定义在我看来有些复杂,我也不能很好的理解,所以我暂时将这里的日期类理解为一种工具。在对日期类不了解的情况下,我看见这道题基本是一脸懵逼的。这道题也让我知道的类的作用之大。

7-4的话也是有一个测试点一直没过,在问了同学之后发现同学是使用了一个BufferedReader来替换掉Scanner才解决掉运行超时的问题的,很神奇好吧,只能说。学不明白看啥都像魔法。后来去查了一下,结果也没很整明白,但测试点过了。我先写着吧,说不定以后回头看的时候就能整明白了。


接下来就有请重量级登场7-1,梦的序章,菜单计价系统一

代码分析图


菜单计价系统一系列的题目其实我是蛮喜欢的(大概,很好的体现出了java面对对象这一特性,除了写不来以外都很完美。
题目主要是围绕以下几个类来进行的
菜品类:对应菜谱上一道菜的信息。
Dish {
String name;//菜品名称
int unit_price; //单价
int getPrice(int portion)//计算菜品价格的方法,输入参数是点菜的份额(输入数据只能是1/2/3,代表小/中/大份)
}
菜谱类:对应菜谱,包含饭店提供的所有菜的信息。
Menu {
Dish[] dishs ;//菜品数组,保存所有菜品信息
Dish searthDish(String dishName)//根据菜名在菜谱中查找菜品信息,返回Dish对象。
}
点菜记录类:保存订单上的一道菜品记录
Record {
Dish d;//菜品
int portion;//份额(1/2/3代表小/中/大份)
int getPrice()//计价,计算本条记录的价格
}
订单类:保存用户点的所有菜的信息。
Order {
Record[] records;//保存订单上每一道的记录
int getTotalPrice()//计算订单的总价
Record addARecord(String dishName,int portion)
//添加一条菜品信息到订单中。
}
题目要求很明确,分工和功能方面都很明确。
至于7-2以及题目集3的7-1 都是再次基础上添加了几个功能。
三、采坑心得
第三次作业集的7-7虽然不是很难的题目但我还是存在一些错误。
以下为7-7题目
从键盘输入两个日期,格式如:2022-06-18。判断两个日期的先后,并输出它们之间间隔的天数、周数(不足一周按0计算)。
预备知识:通过查询Java API文档,了解Scanner类中nextLine()等方法、String类中split()等方法、Integer类中parseInt()等方法的用法,了解LocalDate类中of()、isAfter()、isBefore()、until()等方法的使用规则,了解ChronoUnit类中DAYS、WEEKS、MONTHS等单位的用法。
输入格式:
输入两行,每行输入一个日期,日期格式如:2022-06-18
输出格式:
第一行输出:第一个日期比第二个日期更早(晚)
第二行输出:两个日期间隔XX天
第三行输出:两个日期间隔XX周
以下为源代码
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.time.temporal.ChronoUnit;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
LocalDate date1 = null;
LocalDate date2 = null;
boolean validInput = false;
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-M-d");
while (!validInput) {
String dateStr1 = sc.nextLine();
String dateStr2 = sc.nextLine();
try {
date1 = LocalDate.parse(dateStr1, formatter);
date2 = LocalDate.parse(dateStr2, formatter);
validInput = true;
} catch (DateTimeParseException e) {
}
}
if (date1.isBefore(date2)) {
System.out.println("第一个日期比第二个日期更早");
} else {
System.out.println("第一个日期比第二个日期更晚");
}
long days = Math.abs(date1.until(date2, ChronoUnit.DAYS));
long weeks = days / 7;
System.out.println("两个日期间隔" + days + "天");
System.out.println("两个日期间隔" + weeks + "周");
}
}
题目的输入样例有俩种格式,这就导致了直接使用相关时间类函数时会出现错误。
根据查询资料使用DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-M-d");来调整格式。

代码分析图

然后就是第三次作业的7-4

以下为题目源代码
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
str = str.replaceAll("[,.]", " ");
String[] str1 = str.split(" ");
for (int i = 0; i < str1.length - 1; i++) {
for (int j = 0; j < str1.length - 1 - i; j++) {
if (bijiao(str1[j], str1[j + 1])) {
StringBuilder temp = new StringBuilder(str1[j]);
str1[j] = str1[j + 1];
str1[j + 1] = temp.toString();
}
}
}
for (int i = 0; i < str1.length-1; i++) {
System.out.println(str1[i]);
}
}
public static boolean bijiao(String a, String b) {
if (a.length() < b.length()) {
return true;
} else if (a.length() == b.length()) {
for (int i = 0; i < a.length(); i++) {
char ac = a.charAt(i);
char bc = b.charAt(i);
if (ac >= 'a' && ac <= 'z') {
ac -= 32;
}
if (bc >= 'a' && bc <= 'z') {
bc -= 32;
}
if (ac > bc) {
return true;
} else if (ac < bc) {
return false;
}
}
}
return false;
}
}
在进行输入样例测试的时候,多次输出样例a与I位置相反,在调试相同长度比较的同时忘记了“无视大小写”这一重要条件,导致我这道题目卡了多个小时。而后通过添加一个判断大小写并根据ASCII值的计算来进行大小写数值的相对统一,再进行比较来完成“无视大小写”这一条件。

代码分析图

四、主要困难以及改进建议
困难太多了,以至于一时间找不出主要困难,真要说的话困难是类的设计和相应的引用吧,关于菜单计价系统的类的大概已经设计好了,但我在具体设计和使用的时候还是会出现很多问题,比如类之间冲突和引用失效的情况。这也直接的导致了我菜单计价系列题目的后续几题未成功完成,后续添加的类总是会与先前的类产生一定的冲突,感觉不能很好的放在一起使用。
改进建议的话有以下几点。
1、还是要多使用面向对象的思维来解决问题,有的时候还是下意识的使用面向过程,导致部分类过长或是主函数过于复杂。
2、多标注注释,对无论是其他人阅读自己的代码,还是自己对自己的代码进行修改都有好处。
3、if else以及循环语句最好少用,会使代码复杂度大幅度提升。
4、可以多使用java中自带的函数,多数可以使自己编写代码的效率大幅度提升。
五、总结
总的来说这三次练习还是学到了很多东西,虽然入门java的过程不是很顺利,但也是很开心能够学习这样一门语言,并可以用这种语言完成一些简单的功能,虽然有的功能暂时用不上,但成功运行的时候还是有一种成就感的。关于面向对象的思维锻炼方面,以及类的设计方面我也都需要多加练习,有的时候类与类之间的互动总能把我的思维搞乱。老师的上课我觉得还是非常风趣幽默的,有时候上的好好的总能给我整的绷不住笑出声来,所以我还是很有兴趣继续学习Java的(如果平常作业能稍微简单一点,少一点的话就更好了)。

浙公网安备 33010602011771号