Blog作业01

一、前言

前三周,总共做了三次习题。第一次的题目主要侧重于考察一些基础知识,包括选择,循环,一维数组,和排序等一系列简单的知识,题目相对简单,所以题量较大,一共有八道题目,唯一有难度的是java函数的应用,和java书写规范的问题。第二次题目集主要是对类和对象的初步考察,题目集数量适中,总共是五道题,难点主要集中在第四题和第五题,对类的初步理解。第三次题目集主要是对类和对象的深入考察,考察构造函数的应用,和对getter和setter的应用,题量相对较少,但题目难度较大,难点主要集中在第三题,对一元多项式求导。

二、设计与分析 

1.题目集01

本次作业较为简单,主要要求掌握java的一些基础知识和一些java经常用的函数,题目整体不难,但是需要认真仔细的做,有很多细节需要注意,打代码也一定要认真仔细。本题目集主要的难点集中在

7-8 判断三角形类型

题目要求输入三角形的三边,并且对三边有一个确定的范围,因此一定会有一个关于范围的判断,其次,拿到这道题,首先想到三角形有哪些类型,能够组成三角行的条件又有哪些,输入的三边输出又有几种情况。本题我将三角形的三边放在了一个名为chang的数组里,并将三边的可能行分成三种情况,其中当三边满足勾股定理的时候,又有“等腰直角”和“直角”这两种情况。其中最重要的是,对三边进行排序。

代码如下:

 

import java.util.Scanner;
import java.util.Arrays;
public class Main
{
public static void main(String[] args) {
double[] chang = new double[3];
Scanner input = new Scanner(System.in);
for (int i = 0; i < chang.length; i++)
{
chang[i] = input.nextDouble();
}
Arrays.sort(chang);
if(chang[0]>=1&&chang[0]<=200&&chang[1]>=1&&chang[1]<=200&&chang[2]>=1&&chang[2]<=200)
{
if(chang[0] + chang[1] > chang[2])
{
if((int)(chang[2]*chang[2]) == (int)(chang[1]*chang[1]) + (int)(chang[0]*chang[0]))
{
if(chang[2] == chang[1] || chang[2] == chang[0] || chang[1] == chang[0])
{
System.out.println("Isosceles right-angled triangle");
}
else
{
System.out.println("Right-angled triangle");
}
}
else if(chang[0] == chang[1] && chang[1]== chang[2])
{
System.out.println("Equilateral triangle");
}
else if(chang[2] == chang[1] || chang[2] == chang[0] || chang[1] == chang[0])
{
System.out.println("Isosceles triangle");
}
else
{
System.out.println("General triangle");
}
}
else
{
System.out.println("Not a triangle");
}

}
else
{
System.out.println("Wrong Format");
}
}
}

 

2.题目集02

本次题目集比题目集01稍微有一点难度,但总体来说还是相对简单,本次作业是对类与对象的初步考察,但题目大多还是用基础知识解决。本次主要的难点在7-4和7-5,但7-1对我来说,也有一些难度。

7-1 IP地址转换

拿到这道题的时候,考虑的方面有很多,包括二进制向十进制的转换方法,如何将32位的二进制码分成八位的四组,范围的判断,和整数的整合。本题我先到的利用数组将32位数字进行划分,再分别对分成的四个数组进行相应的运算。

代码如下:

import java.util.Scanner;

public class main3{
public static void main(String[] args) {

Scanner input =new Scanner(System.in);
int s1 = 0,s2 = 0,s3 = 0;int s4 = 0;
int a1 = 0,b1 = 0,c1 = 0,d1 = 0;
int m = 0;
String[] s = new String[32];
for(int i = 0; i < 32; i++)
{
s[i] = input.toString();
}
String[] a = new String[8];
String[] b = new String[8];
String[] c = new String[8];
String[] d = new String[8];
for(int i = 0;i < 8;i++) {
a[i] = s[i];
int a2 = a.length-'0';
a1 = (int)(Math.pow(2,i));
s1 += a2 * a1;
m+=s1;
}
System.out.print(s1);
System.out.print(".");

for(int i = 8;i<16;i++) {
b[i] = s[i];
int b2 = b.length-'0';
b1 =(int) (Math.pow(2,i));
s2 += b2 * b1;
m+=s2;
}
System.out.print(s2);
System.out.print(".");
for(int i = 16;i<24;i++) {
c[i] = s[i];
int c2 = c.length-'0';
c1 = (int) (Math.pow(2,i));
s3 += c2 * c1;
m+=s3;
}
System.out.print(s3);
System.out.print(".");
for(int i = 24; i<32;i++) {
d[i] = s[i];
int d2 = d.length-'0';
d1 =(int) (Math.pow(2,i));
s4 += d2 * d1;
m+=s4;
}
System.out.print(s4);
System.out.print(".");

}

}

但是上述代码却一直无法成功运行,再经历了无数次的编译和答案错误之后,我决定寻找其他的方法去解决此题。经过一系列的查找和学习,我找到了一个在java中用于分割字符串的函数,我突然想到,其实可以只用两个数组就可以完成,一个用于分割32位的字符串,另一个通过循环对分割下来的四位进行运算,再经过一些完善,就可以正确运行了。

改动代码如下:

import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String s = input.nextLine();
int[] a = new int[4];
int[] b = new int[4];
if(s.length()!=32)
System.out.println("Wrong Format");
else{
for(int i =0;i<4;i++)
{
b[i] = Integer.parseInt(s.substring((i+1)*8-8, (i+1)*8));
}

for(int i =0;i<4;i++)
{
for(int j = 0;j<8;j++)
{
a[i]+=Math.pow(2, j)*(b[i]%10);
b[i] /= 10;
}
if(i!=3)
System.out.print(a[i]+".");
else
System.out.print(a[i]);
}
}
}
}

7-4 求下一天

本题要求输入年月日的值,并输出下一天。这道题要求在主类中有一些相应的方法对题目进行运算。这到题写起来较复杂,但其实没有很难的算法。首先,需要考虑闰年的二月和平年的二月,年月日的范围,和每个月日期的不同。一定要对日期的范围考虑仔细,要全方位考虑,不能只考虑二月。

代码如下:

import java.util.Scanner;
public class Main {
public static boolean isLeapYear(int year) {
if((year % 4 == 0 && year % 100 !=0 )||year % 400 == 0)
return true;
else
return false;
}

public static boolean checkInputValidity(int year,int month,int day) {
int[] m=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
if(isLeapYear(year))
m[2] = 29;
if(year>=1820&&year<=2020&&month>0&&month<=12&&day<=m[month]&&day>0){
return true;
}
else{
return false;
}
}

public static void nextDate(int year,int month,int day) {
int[] m=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
if(isLeapYear(year))
m[2] = 29;
int a = 0,b = 0,c = 0;
if(checkInputValidity(year,month,day)) {
if(month==12) {
if(day==m[month]) {
a = year+1;
b = 1;
c = 1;
}
if(day>0&&day<m[month]){
a = year;
b = month;
c =day +1;
}
}
if(month<12) {
if(day==m[month]) {
a = year;
b = month + 1;
c = 1;
}
if(day>0&&day<m[month]){
a = year;
b = month;
c = day+1;
}
}
System.out.println("Next date is:"+a+"-"+b+"-"+c);
}
else System.out.println("Wrong Format");
}

public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int year = input.nextInt();
int month = input.nextInt();
int day = input.nextInt();
nextDate(year,month,day);

}

}

 类图如下:

 

 7-5 求前N天

本题是在前一题的基础上增加了范围,对日期的运算增加了难度,和上一题一样,本题需要考虑的和上一题基本相同,主要的区别是该题不光是求下一天了,而是可以求这天的前几天或后几天,因此增加了对天数的范围,对日期的计算也有了更深一步的理解。

代码如下:

import java.util.Scanner;

public class Main {

public static boolean isLeapYear(int year) {
if((year % 4 == 0 && year % 100 !=0 )||year % 400 == 0)
return true;
else
return false;
}

public static boolean checkInputValidity(int year,int month,int day,int n) {
int[] m=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
if(isLeapYear(year))
m[2] = 29;
if(year>=1820&&year<=2020&&month>0&&month<=12&&day<=m[month]&&day>0&&Math.abs(n)<=10)
return true;
else
return false;
}

public static void nextDate(int year,int month,int day,int n) {
int[] m=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
if(isLeapYear(year))
m[2] = 29;
int a = 0,b = 0,c = 0;
if(checkInputValidity(year,month,day,n)) {
if (n==0) {
a = year;
b = month;
c = day;
}
if(month==12&&n>0) {
if(day-n<=m[month]&&day-n>0) {
a = year;
b = month;
c = day-n;}
if(day-n<=m[month]&&day-n<0) {
a = year;
b = month-1;
c = m[b]-n+day;
}
if(day-n<=m[month]&&day-n==0) {
a = year;
b = month-1;
c = m[b]-n+day;
}
}
if(month==12&&n<0) {
if(day-n>m[month]) {
a = year +1;
b = 1;
c =day - n - m[month];
}
if(day-n<=m[month]) {
a = year;
b = month;
c =day - n;
}
}
if(month>1&&month<12&&n>0) {
if(day-n<=m[month]&&day-n>0) {
a = year;
b = month;
c = day-n;
}
if(day-n<=m[month]&&day-n<0) {
a = year;
b = month-1;
c = m[b]-n+day;
}
if(day-n<=m[month]&&day-n==0) {
a = year;
b = month-1;
c = m[b]-n+day;
}
}
if(month<12&&month>1&&n<0) {
if(day-n>m[month]) {
a = year;
b = month+1;
c =day - n - m[month];
}
if(day-n<=m[month]) {
a = year;
b = month;
c =day - n;
}
}
if(month == 1&&n>0) {
if(day-n<=m[month]&&day-n>0) {
a = year;
b = month;
c = day-n;
}
if(day-n<=m[month]&&day-n<0) {
a = year-1;
b = 12;
c = m[b]-n+day;
}
if(day-n<=m[month]&&day-n==0) {
a = year-1;
b = 12;
c = m[b]-n+day;
}
}
if(month==1&&n<0) {
if(day-n>m[month]) {
a = year;
b = month+1;
c =day - n -m[month];
}
if(day-n<=m[month]) {
a = year;
b = month;
c =day - n;
}
}
System.out.println(n+" days ago is:"+a+"-"+b+"-"+c);
}
else
System.out.println("Wrong Format");
}
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int year = input.nextInt();
int month = input.nextInt();
int day = input.nextInt();
int n = input.nextInt();
nextDate(year,month,day,n);
}
}

类图如下:

 

 3、题目集03

本题目集比前两次有较大的难度,主要对类和对象进行深层次的考察。主要的难点集中在7-2和7-3。

7-2 定义日期类

拿到这道题,首先要分析题目给出类图,本题需要我们设置三个私有变量年月日,并用一个数组存储日期,最主要的是要将这些都放在Date类里,并用getter和setter表示出来。除此之外,还需要用一个方法来对年月日进行范围的判断,对年月日的计算也要反复在类中,主类只需对分类进行引用。

代码如下:

import java.util.Scanner;
class Date {
private int year = 0;
private int month = 0;
private int day = 0;
int[] mon_maxnum = new int[] {0,31,28,31,30,31,30,31,31,30,31,30,31};

public Date() {
super();
}

public Date(int year, int month, int day) {
super();
this.year = year;
this.month = month;
this.day = day;
}

public int getYear() {
return year;
}

public void setYear(int year) {
this.year = year;
}

public int getMonth() {
return month;
}

public void setMonth(int month) {
this.month = month;
}

public int getDay() {
return day;
}

public void setDay(int day) {
this.day = day;
}
public boolean isLeapyear(int year) {
if((year % 4 == 0 && year % 100 != 0 || year % 400 == 0))

return true;

else

return false;

}
public boolean checklnputValidity() {
boolean b = isLeapyear(year);
if(year > 2000||year < 1900||month > 12||month < 1||day < 1||day > 31)
return false;
else if(b == false&&month == 2&&day > 28)
return false;
else if(b == true && month == 2&&day > 29)
return false;
else if((month == 4|| month == 6 || month == 9 || month == 11)&&day > 30)
return false;
else
return true;
}
public void getNextDate() {
if(isLeapyear(year))
mon_maxnum[2] = 29;
if(month == 12) {
if(day == mon_maxnum[month]) {
year = year + 1;
month = 1;
day = 1;
}
else {
year = year;
month = month;
day = day + 1;
}
}
else {
if(day == mon_maxnum[month] ) {
year = year;
month = month + 1;
day = 1;
}
else {
year = year;
month = month;
day = day + 1;
}
}
}

}
public class Main{
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int year = input.nextInt();
int month = input.nextInt();
int day = input.nextInt();
Date d1 = new Date(year,month,day);
Date d2 = new Date();
boolean a = d1.checklnputValidity();
d1.getNextDate();
if(a == false) {
System.out.println("Date Format is Wrong");
System.exit(0);
}
else {
System.out.println("Next day is:"+d1.getYear()+"-"+d1.getMonth()+"-"+d1.getDay());
}

}
}

类图如下:

 

 7-3 一元多项式求导(类设计)

本题主要是对输入的多项式进行求导,题目较复杂,需要考虑一元多项式的多种形式,还要符合题目给出的范围,本题最好使用正则表达式,但是我一直搞不懂,最终还是放弃,因此,这到题到最后也没有把题做出来,以后我会更加注重这方面的学习,一定会学会这方面的知识,以后不会在因为题难而放弃了

三、踩坑心得

1.题目集01

题目集01主要还是细心问题,有些题其实并不难,但因为自己的不正确输入,导致题目无法拿满分

例如7-4 数字比较长和多,最开始为了省事少打代码,将列出的代数式化为了最简,结果计算出了问题,导致答案错误,最后发现后重新算,可是代码还是有问题,我意识到,化简容易算错,于是就将代数式整个打上去,但我中间又出了问题,主要还是想偷懒,不想逐字逐句的大,结果范围搞错了,有重新开始找,但因为代码太长了,我一句一句的改,最后也没能找出最后的两分,所以打代码一定不能偷懒,一定要避免非技术上的粗心问题。

在7-8中在最开始时忽略了三边范围,只考虑了一种情况,导致部分错误,打代码时光靠自己的意向去打代码,导致一些不必要的格式错误,但是发现及时,最后追重要的问题时java规范的问题,最后打完代码过后发现代码是没有问题的,但还是部分正确,最后我才知道,是因为我没有按照java该有的规范写。

还有一些基础问题,将“或”和“且”的表达符号搞混,导致答案错误。

2.题目集02

题目集02是对类和对象的初步了解,但总体来说,还是比较简单的,主要是规范的问题,和对代码的分析不透彻。

例如7-1 从一开始就对题目的分析不到位,开始做的时候,总是发现少很多东西,有从中一点一点的加,而且经常忽略很多问题,包括二进制的字符串只有0和1,十进制需要每四个数之间加“.”但结尾不用加的问题。而且我因为对java很多函数了解太少导致把问题复杂化。

在7-3中,一开始错误的将java中的类理解为C语言中的函数,将本应该放在Main里的方法放在了Main主函数的外面,导致无法运行。

在7-4和7-5中基本上是犯了同样的问题,一开始就忽略了平年2月29号的情况,改正之后,范围因为考虑的不全面而报错,我直接打出了,day大于31的范围,却忘了2月是有28或29天的可能的,求天数的时候,没有将12月的情况分开考虑,导致出现问题。

3.题目集03

题目集是对类和对象的深入了解,题目相对较难,这次我更多的是想法的问题,还有一些细节的问题。

在7-1中代码最终成功运行后,发现最后还是有一分没拿上,一开始我一直找不出问题,知到最后我才知道只是一个小括号的问题,其实还是反应出我对问题考虑的不全面。

在7-2中一开始,对给出的类图不太理解,我过于心急的打代码,导致我对题目的理解出了问题,询问同学才知道是我对getter有着错误的理解,将所有的运算都打到了对应的get里,导致根本无法输出结果。

最主要的问题还是集中在7-3里,最开始,我就因为这道题被劝退,觉得太难了,学不会,因为要用正则表达式,我就找了相关的学习内容,其实正则会比if语句好用,但因为一开始的符号语言不理解,导致我产生了放弃的想法,试着打了一个照着打了一个输入,结果只有“Wrong Format”的输入是对的,但是我就产生了侥幸的心理,觉得好多人都没打出来,我打不出来也很正常,结果就是7-3都未完成。

四、改进建议

题目集01的题目都较为简单,主要的问题还是打代码时的不认真,就想着偷懒,不能对题目进行主观的分析,我以后自己打代码一定不偷奸取巧,一定要在认真分析完题目后,再开始代码,一定要做好C语言与java的区分,不能将其混为一谈。

题目集02主要的问题出在对java的不熟悉,把问题复杂化,不会运用java的优势去打代码,而且对题目不愿意改进。以后打代码一定要注重题目,不去主观臆想,多思考问题,尽量把问题按照又对又好的方向发展。

题目集03主要是思想的问题,不能因为任何难题而放弃,对问题的考虑要多面性,对类和对象的掌握还需更加熟练。

五、总结

本次的三个题目集是从简到难的,我觉的主要改变了我对学习专业课的想法,打代码一定要仔细,不能浑水摸鱼,其次就是对java一些基本知识的掌握,对Java书写规范的了解,对java的数组的学习,对类和对象的学习,学会用类来解决一些复杂的问题,对一些java的函数有了了解。

另外,java让我逐渐熟悉打代码加空格的习惯,代码看起来会舒服很多,还让我改掉了不仔细分析题的问题,java让我学会更多的独立思考题目,戒掉一些依赖性。

最后,正则还是需要我攻克的难题,还是需要更多的学一些高级的算法去打代码,不能光用基础的知识。

 

 

 

 

 

 

 

 

 

 

posted @ 2021-04-03 14:58  柠甜  阅读(69)  评论(0)    收藏  举报