Java三次大作业blog
一.前言:
1)第一次题目集:
知识点:
@初步了解java语言的的语法和“一切皆类”的特点,学会使用Scanner.out来表示标准输出设备,用Scanner.in来表示标准输入设备,并用Scanner类从控制台获取输入,调用next()、nextDouble()、nextInt()方法来读取String值、Double值、Int值。
@清晰认知各种数据类型的范围和数值操作符。
@学会使用String类的charAt()方法,定位字符位置,返回字符串对象的指定索引(下标)位置的元素(注意:字符串索引从0开始)。基本格式为String.name.chatAt(index)。学会使用String类的length()方法,其基本格式为String.name.length()。学会使用String类的equals()方法,其基本格式为String.name.equails(“字符或字符串”)。学会使用String类的substring()方法,substring是用来截取字符串的,根据参数的个数不同,方法含义也不同,substring(0,2)这个只含开头不含结尾,因此截取是截取两个字符,从第一个到第二个字符,不包含第三个;substring(2)这个表示截掉前两个,得到后边的新字符串。学会使用Math类,Math 类封装了常用的数学运算,提供了基本的数学操作,如指数、对数、平方根和三角函数等。Math 类位于 java.lang 包,它的构造方法是 private 的,因此无法创建 Math 类的对象,并且 Math 类中的所有方法都是类方法,可以直接通过类名来调用它们,例如Math.E Math.PI之类的。
题量:一共九道题,题量不大。
难度:较为简单,是最基础的知识。难度在于需要自学去了解java中各种方法。
2)第二次题目集:
知识点:
@进一步加强对java“面向对象,一切皆类”的特点的理解,对java语言语法进一步了解,熟练写出正确代码。
@学会使用ArrayList(动态数组),ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素。ArrayList 类位于 java.util 包中,使用前需要引入它,通过 import java.util.ArrayList引入ArrayList 类,并用 ArrayList<E> objectName =new ArrayList<>()对其进行初始化,E: 泛型数据类型,用于设置 objectName 的数据类型,只能为引用数据类型。同时,我们也可以使用add()方法添加元素到 ArrayList、使用remove()方法删除元素、使用 set()方法修改元素、使用get()方法访问元素、使用size()方法计算数组内元素个数,并且遍历数组有三种方式:for循环遍历、for-each遍历、迭代器遍历。
@学会使用String中split( )函数用来切割str字符串,返回一个ndarray类型的数据,对输入字符进行处理,同时知道如何用Java 中用于将字符串转换为整数的方法integer.parseint(String s),它是 Integer 类中的静态方法。
@了解类与对象的关系,学会创建类并通过对象正确引用类中的属性与方法。
@知道java-日期类的基本使用方法,了解DateTimeFormatter、LocalDate.parse(date,formatter) ChronoUnit.DAYS.between(date1, date2)用法,DateTimeFormatter是在Java 8中引入的一个格式化器,用于打印和解析日期时间对象,DateTimeFormatter使用用户定义的格式(如 "yyyy-MMM-dd hh:mm:ss")或使用预定义的常数(如ISO_LOCAL_DATE_TIME)来格式化日期时间。一个DateTimeFormatter可以用所需的Locale、Chronology、ZoneId和DecimalStyle创建。DateTimeFormatter通过使用其ofPattern方法被实例化为一个日期时间格式字符串。
@学会如何使用动态规划。
题量:一共四题,题量不大。
难度:对我而言题目难度较大。
3)第三次题目集:
知识点:
@更深层次的认识java中类与对象的创建和关系。
@学会使用哈希表,哈希表(Hash Table)是一种数据结构,我们可以通过import java.util.HashSet;导入HashSet类,通过Set储存输入整数,循环遍历输入的每个整数并添加到set中;如果遇到相同的则用set.remove();删除;HashSet<Integer> set = new HashSet<>();创建了一个 HashSet 对象,HashSet<Integer>表示这个HashSet对象中存储的是一个整数类型的数据。添加元素用set.add(kk)。
@学会利用import java.io.*;快读提升读取速度,然后用StreamTokenizer input = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in))); input.nextToken();进行快读。
@学会用String中split()对所输入的字符进行多次切割,例如String[] words = str.split("[\\s,\\.]+"); //按空格、逗号、句号切分字符串。
@学会使用TreeSet去重并排。TreeSet是一个有序集合,它扩展了AbstractSet类并实现了NavigableSet接口。它存储唯一的元素而不保留元素的插入顺序它按升序对元素进行排序但不是线程安全的。
@学会使用private对对象属性进行私有,对代码进行封装。再通过自定义的方法从中获取或修改数据,值得一提的是,我们还需要学会使用this关键字访问自身方法及成员变量。
@学习如何用import java.text.DecimalFormat;导入DecimalFormat类,用DecimalFormat`格式化数字,并将小数点后不带0的浮点数输出。`#`表示可选的数字,不足时不会补0。`0`表示必须存在的数字,不足时会补0。`########`表示允许最多8个数字的浮点数。如DecimalFormat df = new DecimalFormat("#.########");String output = df.format(mi);System.out.print(output);对相应数据进行操作。
@知道如何对日期进行格式转换,利用利用ChronoUnit类计算两个时间的天数间隔。例如用DateTimeFormatter da=DateTimeFormatter.ofPattern("yyyy-MM-dd"); 修改日期格式,了解LocalDate类中of()、isAfter()、isBefore()、until()等方法的使用规则,了解ChronoUnit类中DAYS、WEEKS、MONTHS等单位的用法。
题量:一共有7道题目,提数比上次多,但也不是特别多。
难度:难度大,未知的知识点多,需要主动去网上寻找资源自主学习。
二.设计和分析:
菜单计价程序-1代码如下:
import java.util.Scanner;
/*
*主方法
*/
public class Main{
public static void main(String[] args){
Scanner input=new Scanner(System.in);
Menu menu=new Menu();int s=0;int mon=0;
while(true)//循环读取订单
{
String str=input.nextLine();//输入
if(str.equals("end"))
break;
else
{
String[] stt=str.split(" ");//对输入字符处理
String dishName=stt[0];//菜品名
int portion=Integer.parseInt(stt[1]);//份额
Dish dish=menu.searthDish(dishName);//查找菜品
if(dish!=null)
{int price=dish.getPrice(portion);mon=price;}//计算价格
else
{System.out.println(dishName+" "+"does not exist");mon=0;}
}
s+=mon;
}
System.out.println(s);
}
}
class Menu{
Dish[] dishs; //菜品数组,保存所有菜品信息;
Menu(){
dishs=new Dish[]{new Dish("西红柿炒蛋",15),new Dish("清炒土豆丝",12),new Dish("麻婆豆腐",12),new Dish("油淋生菜",9)};
}//菜单初始化;
Dish searthDish(String dishName){//根据菜名在菜谱中查找菜品信息,返回Dish对象。
for(Dish dish:dishs){
if(dish.name.equals(dishName)){
return dish;
}
}
return null;
}
}
class Dish{
String name;//菜品名称
int unit_price;
Dish(String name,int unit_price){
this.name=name;
this.unit_price=unit_price;
}
int getPrice(int portion){//计算菜品价格的方法,输入参数是点菜的份额(输入数据只能是1/2/3,代表小/中/大份)
double price=0;
int money=0;
switch(portion){
case 1:price=unit_price*1.0;break;
case 2:price=unit_price*1.5;break;
case 3:price=unit_price*2;break;
default:break;
}
money=(int)(price+0.5);//如果计算出现小数,按四舍五入的规则进行处理。
return money;//返回计算结果
}
}

如下是powerDesigner的相应类图和SourceMonitor的生成报表内容:



通过上面的类图和计算平均复杂度的表格我们知道我所写的代码还存在很大的缺陷,平均复杂度过高,不符合java语言的低复杂度的特点,同时还有一部分是面向过程写出来的,可见对如何创建类与对象以及处理好类与类之间的关系还有较大欠缺。为此,我还要继续努力,争取写出更完善的代码。而由于这个原因,导致我后面的7-2很难复用这段代码,使得我7-2、7-3都得不到满分,无法达到预期要求。
三.踩坑心得:在7-7 判断三角形类型中,判断是否为等腰直角三角形时我们要使用a*a+b*b-c*c<0.0000001,因为我们输入的时候不能输入根号,所以我们只能用一个极小的数去近似,因为这个我也花了很长时间去发现。

在7-1 菜单计价程序-1中,因为我一直没有明白类与类之间的关系,所以花了很长时间也没有写出像样的代码,之后随着学习的深入,可算艰难地写出了两个类,另外两个类只好用面向过程的方式写了出来,说到底还是类与类之间的关系没有弄明白。7-2也没有完全写出来,只试过了部分测试点,7-3就更难了,就只过几个测试点。

在7-3 去掉重复的数据中我由于几个测试点一直显示运行超时卡了好多时候,之后通过在网络上寻找提升运行速度的方法,终于知道应该使用快读的方法对数据进行读取,提升运行速度。下面是部分代码截图:

在7-4 单词统计与排序中,由于输入的句子有句号、逗号和空格,要对其进行多次分割,一开始我对split()方法了解不够全面,并不知道可以同时用多个字符对句子进行分割,后来通过csdn平台才了解到可以这样做。之后通过学习知道先使用TreeSet进行去重排序更加方便实现目的。

在7-6GPS测绘中度分秒转换中由于输入的数字是浮点型的,当输入的浮点型小于六位小数时,输出不做小数点限制,后面会多了0,限制时又会丢失精度,所以我在网上找了好多方法,最后找到了DecimalFormat df = new DecimalFormat("#.########");`DecimalFormat`用于格式化数字,并将小数点后不带0的浮点数输出。`#`表示可选的数字,不足时不会补0。`0`表示必须存在的数字,不足时会补0。`########`表示允许最多8个数字的浮点数。

在7-7判断两个日期的先后,计算间隔天数、周数中由于输入格式的问题,如2022-6-8不符合格式,所以我想很久决定用DateTimeFormatter da=DateTimeFormatter.ofPattern("yyyy-M-d");对输入数据进行格式化。

四.主要困难以及改进建议:我主要困难就是对java中类与对象联系认识不清晰,总感觉有一个地方不懂,以至于所写的代码一直无法成功编译,不知道如何正确的通过对象正确使用类的方法与属性,特别是当使用数组的时候,就更是一头雾水,虽然我将java书看了一大半,但是最后还是无法成功写出来。再一个比较大的问题就是对java中好多现成的类认识不够,好多更好的更高效的方法其实可以快速解决问题但是由于事先不知道以至于花费太多时间。
五.总结:这三次的题目我受益很深,对Java“一切皆类,面向对象”的特点有了更深层次的理解,懂得如何创建类与对象同时,我也明白了合理利用网络资源自学的重要性,通过这三次的大作业,我学到了好多String中的方法,知道如何对输入的日期进行相应的处理以及格式化,如何使用哈希表、动态数组、对程序进行封装等。值得一提的是,我发现学习面向对象语言时,我们必须要沉下心来,因为java中有很多类是可以更加方便地帮助我们解决问题,我们需要耐心的去寻找这类资源并学习,不能一味求快,急于求成,否则这样会事半功倍,严重可能会打消我们学习积极性。最后,经过这几个星期的学习,我发现我学的并不扎实,未来我还需要加倍努力,对不足之处加以弥补。
对于课程的教学,我希望老师能够多多地对之前的题目进行更仔细的讲解,其实第一次对于点菜的题目我就有好多疑问,但是却无法描述出来,我不知道我的代码到底是哪里不妥,就是运行不出正确结果,可能是某个特别关键的点认识不足,以至于到现在我还不能写出好的代码,我想应该就是我对面向对象这种思路有不明白之处或者是不知道如何正确处理类与类之间的关系所导致。
另外,我想让老师更多的站在我们学生本身的角度来看待作业难度并与学生多多地交流,可能老师觉得简单的题目对于我们来说真的特别困难,如果老师能主动地与学生有更多的交流就能更好地知道我们到底在哪里问题,从而使我们能更好 的掌握java语言。
浙公网安备 33010602011771号