JAVA博客作业

                                                                                                                                          前言

通过对前三次题目集的学习,我有以下心得:

1.三次题目集的知识点我觉得有这些(1):输入语句的使用。

                  (2):java中多个if()判断语句的使用。

                (3):java中的if()和else语句的嵌套使用,这在第一次作业的7-7中用到了该方法来判断三角形的类型。

                  (3):java中的四则运算。

                  (4):java中的for()循环语句的使用。

                (5):java中的switch()语句的使用。

                (6):java中的一些对字符串处理的方法,例如:a.substring(0,2),该方法的作用是将字符串a中的第一二位的字符提取出来。

                                       c.equals(s),该方法是对字符串进行比对的方法,如果字符串c与字符串s相等,则返回true,否则返回false。

                                         a.charAt(i),该方法是对字符串提取的作用,它可以将字符串a中的第i为提取出来。

                 (7):在第一次作业的7-8中,我发现原来java中的浮点数据会有误差,在完成作业的时候应该考虑到精度问题。并且还学会了java中的一中数学处理方法,Math.abs(),该                                                    方法是对括号内的数进行取绝对值的处理。

                (8):在第二次作业中的第一和第二题中我学会了对一道很复杂的题目进行面对对象的程序设计,并且明白面对对象的程序设计与面对过程的程序设计直接的差别。

                (9):在第二次作业的第三题我学会了如何通过基年法来判断该天是周几和通过基年法计算两个日期之间相差的天数。

                (10):java中的分割字符串的方法a.split(" "),该方法的作用是将字符串a按空格进行分割。

                (11):java中的Arrays.sort(),该方法是将括号内的数进行排序处理。

                (12):java中对数据进行封装(private)

                (13)含参构造和无参构造。

三次作业的题量还好,主要是第二次作业的第一二三题的题量比较大,在写第二次作业的第三题时,当我花了一晚上的时间把它写到输出样例和题目上一样时,我很高兴,可结果是全错,因为还要检测输入样例,当时我就一下子没了继续做下去的动力了。还有就是第三次作业的第一题的题量也比较大,我花了两天时间去写,可是没能完成。可能对于我这样刚刚开始学java的人来说确实挺困难的,因为以c语言都是用面向过程来写题目,现在想要将写题思路转变成面向对象确实有点不适应。

难度的话也还好,第二次作业的第就一二题难,其次就是第三次作业的第一题难,如何就是第二次作业的第三题,因为它测试点很多,如何又加上要判断输入,加在一块,这一题就有点难度了。其他的题目在有c语言基础的情况下还是蛮简单的。

 

                                    设计与分析 

 

第一次作业7-1:输入身高和体重,然后我就定义了一个变量BMI=体重(以千克为单位)除以身高(以米为单位)的平方。然后根据题目给的BMI的范围输出相应的结果。

第一次作业7-2:我设计的比较简单,就是常规的输入,然后计算。

第一次作业7-3:一个for循环里加一个判断奇数的条件,如果是奇数,则相加,最后输出奇数之和。

第一次作业7-4:输入四个数据,分别代表第几次购房(整数),房款(整数/单位万元),评估价(整数/单位万元),房屋面积(浮点数/单位平方米)。然后根据条件求出契税、印花税、交易费、测绘费。

第一次作业7-5:输入两个整数,第一个数代表种族,第二个数代表角色,两个switch()语句判断输入的数,然后输出即可。

第一次作业7-6:首先我会判断输入的数是否合法,如果合法,则再将其分割,如果第三四为是01则输出材料学院,如果第三四为是02输出机械学院,如果第三四为是03输出外语学院,如果第三四为是20输出软件学院;然后输出班级和学号。

第一次作业7-7:我的设计非常简单,首先输入三个数据,然后判断,如果合法则进行三角形的判断,然后不和法,则输出“Wrong Format”。三角形的判断设计也非常简单根据我们所学的数学知识一些三角形所具有的特殊性质来判断就好了。然后输出是什么三角形,

第一次作业7-8:首先判断一些输入是否合法,如果不合法则输出“Wrong Format”,如果输入合法则直接根据题目要求先计算,我是把计算放在了一个while循环里面,如果nextGuess和lastGuess的差值小于0.00001则直接跳出循环。然后输出lastGuess。

第一次作业7-9:这道题我的设计也非常简单,输入我是按照字符串来输入的,首先一个for循环,然后用字符串处理方法是s.charat()从左到右依次提取字符,最后那个结束标志“-1”我是用if(ch=='-'&&a.charAt(i+1)=='1')来判断的,如果是,则break跳出循环,如果不是则进行下一步,if(ch=='1'||ch=='0')如果符合要求,则输出该字符。

第二次作业第7-1:在这一题当中,我一共设计了4个类,分别是

 

//菜品类:对应菜谱上一道菜的信息。
class Dish {}

 

//菜谱类:对应菜谱,包含饭店提供的所有菜的信息。
class Menu {}

//点菜记录类:保存订单上的一道菜品记录
class Record {}

//订单类:保存用户点的所有菜的信息。
class Order {}

 

菜品类中的代码如下:

 

class Dish {
String name="";//菜品名称
int unit_price; //菜品单价
int price=0;

int getPrice(int portion)//计算菜品价格的方法,输入参数是点菜的份额(输入数据只能是1/2/3,代表小/中/大份)portion为形参
{
switch(portion){//根据份额的不同乘的数也不同
case 1:price=unit_price;break;//小份原价
case 2:price=(int)(unit_price*1.5+0.5);break;中份乘1.5
case 3:price=unit_price*2;break;大份乘2.
}
return price;//该方法返回价钱。
}
}

 

菜谱类中的代码如下:

 

class Menu {
Dish[] dishs =new Dish[20];//菜品数组,保存所有菜品信息
int i=0;
Dish searthDish(String dishName)//根据菜名在菜谱中查找菜品信息,返回Dish对象。
{
dishs[0]=new Dish();//dish[0]为Dish类里的对象
dishs[1]=new Dish();//......
dishs[2]=new Dish();//......
dishs[3]=new Dish();//......

//菜谱中每样菜的名字和原价
dishs[0].name="西红柿炒蛋";dishs[0].unit_price=15;
dishs[1].name="清炒土豆丝";dishs[1].unit_price=12;
dishs[2].name="麻婆豆腐";dishs[2].unit_price=12;
dishs[3].name="油淋生菜";dishs[3].unit_price=9;
for(i=0;i<4;i++)
{
if(dishName.equals(dishs[i].name))//用户输入的菜在菜谱中进行查找
{return dishs[i];}//找到了返回dish类的对象
}
return null;//没找到返回null
}
}

 

点菜记录类中的代码如下:

 

//点菜记录类:保存订单上的一道菜品记录
class Record {
Dish d=new Dish();//d为Dish类里的对象
int portion;//份额(1/2/3代表小/中/大份)
int getPrice()//计价,计算本条记录的价格
{
return d.getPrice(portion);//portion为实参
}//计算订单上一道菜的价格
}

订单类中的代码如下:

class Order {
Record[] records=new Record[20];//保存订单上每一道的记录
int j=0;
Record addARecord(String dishName,int portion)
//添加一条菜品信息到订单中。
{
Record r=new Record();//r为Record类里的一个对象
r.d.name=dishName;
r.portion=portion;
j++;//每添加一条订单j+1
return r;//返回Record类对像
}
int getTotalPrice()//计算订单的总价
{
int i=0;
int sum=0;
for(i=0;i<j;i++)
{
sum=sum+records[i].getPrice();
}
return sum;//返回总价
}
}

 

但是很无奈,这次作业的7-2我没能完成,这让我非常后悔当初没有及时的完成这次作业,下次我努力完成作业,尽量在结束的前一天就完成此次作业。

第二次作业7-3:这个作业我没有进行输入判定。首先,我的输入也是按照字符串的格式来进行输入的,然后用substring()来进行字符串的分割,然后用到一个Integer.parseInt()方法,将字符串转换成数字在进行运算,因为字符串里的数字如果不进行类型转换的话就进行四则运算的话是会报错的。然后我立了三个flag,分别代表第一个年份是否是闰年,第二个年份是否是闰年,以及第三个年是否是闰年。判断输入的第一个日期当年第几天,当月第几天,当周第几天.,当年的第几天很好判断,将月份的日期和天数相加即可,判断当周的第几周我采用的是基年法来进行判断,方法如下:

 

//计算第一个日期总天数
int p,totalDaya=0;
for(p=1900;p<year1;p++){
if((p%4==0&&p%100!=0)||p%400==0)//闰年+366天
totalDaya=totalDaya+366;
else//平年加365天
totalDaya=totalDaya+365;
}
int totalDaya1=totalDaya;
for(int i=1;i<month1;i++)
{
switch(i){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:totalDaya1=totalDaya1+31;break;//1月,3月,5月,7月,8月,10月,12月加31天
case 4:
case 6:
case 9:
case 11:totalDaya1=totalDaya1+30;break;//4月,6月,9月,11月加30天
case 2:
if(t==1)//闰年二月加29天
totalDaya1=totalDaya1+29;
else//平年二月加28天
totalDaya1=totalDaya1+28;break;
}
}
totalDaya1=totalDaya1+day1;
int totalDaya1cha=totalDaya1-totalDaya;
System.out.print(yeara+"-"+montha+"-"+daya+"是当年第"+totalDaya1cha+"天,"+"当月第"+day1+"天,");
//输出第二个信息
int week=totalDaya1%7;
switch(week){//输出当周第几周。
case 0:System.out.println("当周第7天");break;//余0输出当周第7天
case 1:System.out.println("当周第1天");break;//余1输出当周第1天
case 2:System.out.println("当周第2天");break;//余2输出当周第2天
case 3:System.out.println("当周第3天");break;//余3输出当周第3天
case 4:System.out.println("当周第4天");break;//余4输出当周第4天
case 5:System.out.println("当周第5天");break;//余5输出当周第5天
case 6:System.out.println("当周第6天");break;//余6输出当周第6天
}

可是这一题我一分都没有,就因为我没有进行输入判定,等我要写之后时间已经不够了。

 

第三次作业7-1:由于前面的菜谱系类的题目做得非常不好,导致基础不扎实,对于类的设计也非常生疏,又由于我是先把后面的题目写完再去写7-1的,最后就只剩下2天时间给我写第一题,又要上课,又要写别的作业,导致我后面由于时间不够导致没能写出这道题。不过我会好好吸取教训,下次留多一点时间给那些难度较大的题目,这样我就会有跟多的时间去思考这道题该然后写。

第三次作业7-2:这道题我选择了数组,先将输入的数据存放再数组中,然后用一个排序方法Arrays.sort()这个方法会将括号里数组按从小到大的顺序排序,然后用一个fou循环,如果这个数的后一个数与它相同则输出YES,否则输出NO。

第三次作业7-3:同样,这一题我也是先将一个输入的数存放在一个数组中,然后再创建一个数组,这个数组全部初始化为0.思路就是将第一个数组的数作为第二个数组的下标,如果第二个数组的这个元素为0,则将他输出,然后使这个元素加一,这样,当第一个数组的相同数作为第二个数组的下标时,这个元素就不是0了,于是不用将它输出,注意最后一个数后面没有空格。

第三次作业7-4:首先将输入的字符串按空格分割,并存放到一个数组b中去

for(int i=0;i<b.length;i++)
{
c=b[i].length();//求每个元素的长度
if(b[i].charAt(c-1)=='.'||b[i].charAt(c-1)==',')//因为有的单词后面跟了“,”或者“.”所以要将最后的“,”和“.”去掉。
b[i]=b[i].substring(0,c-1);//去掉最后的“,”和“.”。
}

然后我自定义了一个方法

static class LengthComparator implements Comparator<String>
{
public int compare(String first, String second) {
int x= second.length()- first.length();
if(x!=0)//
return x;
else
return first.compareToIgnoreCase(second);//如果X>0
}
}

这个方法的作用是将分割好的单词进行排序。

最后将数组b输出即可。

第三次作业7-5:这道题就是用含参构造和无参构造来进行写,含参构造中,直接将参数赋值给类的属性就可以了,二无参构造就得用四个方法将每个方法里的参数赋值给类的属性就可以了。

第三次作业7-6:这是一道非常简单的题目,根据题目所给的公式进行运算就可以了。

第三次作业7-7:这道题也是用到很简单的题,我同样用的也是基年法算总天数然后比较就可以了。

 

                                  踩坑心得

 

1.第一次作业中我遇到得坑有7-4,7-5,7-7,7-8,7-9题,7-4中

 

 

测试点5和11我一直过不去,最后我才明白原来题目中的那个边界值我看错了,然后在我改过来之后,成功过了这一题。

 

7-6中:我有一个非法输入的测试点过不去,后面才知道8位数的学号第一为可以为0,于是我改进算法,最后成功了

7-7中:那个等腰直角三角形的判断比较坑,因为等腰直角三角形的斜边是直角边的根号2倍,这个根号2就存在精度问题。可以用一个这样的方法来判断:(a==b)&&((Math.abs(a*a+b*b-c*c))<0.1)||(b==c)&&(Math.abs(c*c+b*b-a*a))<0.1||(a==c)&&(Math.abs(a*a+c*c-b*b))<0.1。这样就可以解决精度问题了。

7-8中,有一个坑就是这个“nextGuess和lastGuess的差值小于0.00001时认为两者几乎相同”,这里一定要注意精度问题。

7-9中:一开始我一直有个测试点是非零返回,然后在我请教了同学之后才发现原来是我的一个循环没有结束,在我改进之后也成功过了。

第二次作业中我该提的坑在前面都提完了,就是在最后一题7-4中有一个测试点我一直过不去,弄了好久也没解决。

第三次作业中的坑我好像就是在7-6中踩到了,因为题目要保留6位小数嘛,一开始我用String x=String format(%.6f,y)来将y保留到小数点后6位,结果我发现这样非常麻烦,于是我最后用了这个方法来保留6位小数System.out.printf("%.6f",e)。

                                   主要困难

这三次作业当中的主要困难还是有关类的设计,我对类的设计还不是很熟悉,目前还停留在了c语言面向过程设计的地方,这导致我每次做题目时我都想用面向过程的方法来写题目,可是小题目还好,可是到了大题目的话我就有点稀里糊涂了,摸不着方向,不知道该从何先手。尤其点菜类那三道大题,我是一点头绪都没有。

                                    改进建议

在以后的写作业过程中,要多习惯使用面向对象的方法来解题,不应该老是想着用面向过程的方法来写题目。

                                 总结

学到了什么:

(1):输入语句的使用。

                  (2):java中多个if()判断语句的使用。

                (3):java中的if()和else语句的嵌套使用,这在第一次作业的7-7中用到了该方法来判断三角形的类型。

                  (3):java中的四则运算。

                  (4):java中的for()循环语句的使用。

                (5):java中的switch()语句的使用。

                (6):java中的一些对字符串处理的方法,例如:a.substring(0,2),该方法的作用是将字符串a中的第一二位的字符提取出来。

                                       c.equals(s),该方法是对字符串进行比对的方法,如果字符串c与字符串s相等,则返回true,否则返回false。

                                         a.charAt(i),该方法是对字符串提取的作用,它可以将字符串a中的第i为提取出来。

                 (7):在第一次作业的7-8中,我发现原来java中的浮点数据会有误差,在完成作业的时候应该考虑到精度问题。并且还学会了java中的一中数学处理方法,Math.abs(),该                                                    方法是对括号内的数进行取绝对值的处理。

                (8):在第二次作业中的第一和第二题中我学会了对一道很复杂的题目进行面对对象的程序设计,并且明白面对对象的程序设计与面对过程的程序设计直接的差别。

                (9):在第二次作业的第三题我学会了如何通过基年法来判断该天是周几和通过基年法计算两个日期之间相差的天数。

                (10):java中的分割字符串的方法a.split(" "),该方法的作用是将字符串a按空格进行分割。

                (11):java中的Arrays.sort(),该方法是将括号内的数进行排序处理。

                (12):java中对数据进行封装(private)

                (13)含参构造和无参构造。

建议:我希望老师在课堂上能和我们一起写一些代码,将我们带入到写代码中去,这样就很有利于我们对面向对象这一方法的理解,而不是一直给我们灌输面向对象思想,这种对象很抽象,就算你举了春游的例子来帮助我们理解,可是看到的东西是要比听到的东西好很多的,所以我希望老师在课堂上能够加一下写代码的环节。谢谢老师!

作业的话我希望老师能够给多点时间,我看有一些班级的老师给他们的时间比我们多多了,就比如第二次作业:有的班比我们晚交了4天。我希望老师多给我们一些时间去写。说不定多给几天时间,有些有思路了的同学就能够写出来了,我好几次都是有一些思路的时候结果就是题目马上要截至了,我完不成了。

实验的话我也希望老师能够讲解一些,而不是直接将实验甩给我们让我们自己思考,这对于我们这些基础比较差的同学来说真的很吃力。

 

希望老师能够看到我的建议,也希望老师在看到我的建议之后能够有所改变,谢谢老师!

posted @ 2023-04-01 22:46  zjxnb  阅读(16)  评论(0)    收藏  举报