第一次博客作业
第一次博客作业
一、前言
由于是第一次接触所以对于写法还是没有那么深入的了解。
第一次作业主要考察了java语言的语句以及选择结构if else语句、循环结构for循环、while循环以及do while循环和对基本数据类型int、double、char、boolean等基本数据类型和对数组结构的考察,作业总体上难度不大,与之前学习的C语言基本类似,编程也还停留在面向过程中。
第二次作业在第一次作业考察基本数据类型、基本数据结构、编程语法语句的同时,还加大了对数据处理的要求,和对日期类算法的考察,和对函数方法的调用,函数的调用使得程序更加模块化,日期类算法考察了我们编程的逻辑性以及对日期中存在的特殊情况的处理。
第三次作业开始逐渐从面向过程逐渐转变为面向对象,开始对java语言中的对象和类进行考察,比如类的可见性、构造函数、函数的调用、对象传值与调用等。考察了类的四种可见性public 所有可见、private 私有属性,仅对本类可见、protected 本包和子类可见default 本包可见(没有修饰符)。构造函数考察了构造函数的基本知识,java的构造函数的名称与类名一样,且没有返回值,每个类中都必须构造函数,如果没有显式构造函数,java编译器会自动为该类产生一个空的无参构造函数,且一个类可以有多个构造函数,只要形参列表不相同即可。在new一个对象时,根据实参的不同,会自动挑选相应的构造函数,如果实参形参匹配不上,系统将会报错。
前两次的作业还基本停留在面向过程的思想中,没有理解到面向对象程序设计的思想,和类和对象之间的关系,解题思路与上学期C语言大致相似,以过程为中心的编程思想,以什么正在发生为主要目标进行编程,分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。而第三次作业真正开始进入了面向对象世界,以对象作为基本程序结构单位的程序设计,用于描述的设计是以对象为核心,而对象是程序运行时刻的基本成分。用于描述的设计是以对象为核心,对象是程序运行时刻的基本成分。第三次作业的类设计就很好的体现了面向对象者一编程思想,充分发育了面向对象的优势与特点,开始真正的从面向过程过渡到面向对象。
二、设计与分析
第二次作业第二题串口字符解析

import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); String a = in.next(); if(a.length()<11) { System.out.print("null data"); return; } if(a.matches("^[1]*$")) { System.out.print("null data"); return; } int start = 0,i=0,num = 1,sum = 0; boolean parity = false,validate = false; for(start = 0;start<a.length()-10;start++) { if(a.charAt(start)=='0') { System.out.print(num+":"); num++; if(a.charAt(start+10)=='0') { validate = false; }else { validate = true; sum = 0; for(i=start+1;i<start+9;i++) { if(a.charAt(i)=='1') { sum++; } } if(sum%2==0) { if(a.charAt(start+9)=='1') { parity = true; }else { parity = false; } }else { if(a.charAt(start+9)=='0') { parity = true; }else { parity = false; } } } if(validate == true) { if(parity == true) { for(i=start+1;i<start+9;i++) { System.out.print(a.charAt(i)); } System.out.print("\n"); }else { System.out.println("parity check error"); } }else { System.out.println("validate error"); } start = start + 10; } } } }
但是报错,经过修改最后也没成功,后来经过同学指导告知此题目需要大量运用字符串中单个字符的提取和判断,以及子字符串的提取和内容判断。需仿照RS232通信协议进行输入数据的判断,并输出相应的结果。逻辑复杂,语句繁复。总体难度较难。
改正后的代码为
import java.util.Scanner; public class Main{ public static void main(String[] args){ Scanner input = new Scanner(System.in); String data = input.nextLine(); if(data.length() < 11) { System.out.print("null data"); System.exit(0); } else { int t = data.indexOf('0',0); if(t==-1) { System.out.print("null data"); System.exit(0); } else { int count1 = 0,count2/*起始符个数*/ = 0,count3/*1的个数*/ = 0; for(int i = 0;i<data.length();) { if(data.charAt(i)==0) { count1 = i; i = i +12; count2++; } for(int j = count1;j<=count1+11;j++) { if(data.charAt(j)==1) count3++; } if(count3%2==1) { if(data.charAt(count1+11)=='1') { if(data.charAt(count1+10)=='0') System.out.println(count2+":"+data.substring(count1,count1+12)); else System.out.println(count2+":parity check error"); } else System.out.println(count2+":validate error"); } else { if(data.charAt(count1+11)=='1') { if(data.charAt(count1+10)=='1') System.out.println(count2+":"+data.substring(count1,count1+12)); else System.out.println(count2+":parity check error"); } else System.out.println(count2+":validate error"); } } } } } }
第三次作业题目一
计算两点之间距离

用到正则表达式对输入格式进行判断和限制,且需要用到子字符串的提取和内容判断,最后在输入格式正确且数据合法的情况下执行两点间距离公式的计算并输出结果。在进行输入格式判断时比较复杂,需要进行多重判断和限制。根据网上的做法说这道题最好的是采用类设计来做。这里点可以设计成一个类。
第三次作业题目二:

这两个函数以DateUtil类名作函数的返回值类型,以类名作返回类型是返回该类的对象。
import java.util.Scanner; public class Main { public static void main(String[] args) { // TODO 自动生成的方法存根 Scanner in=new Scanner(System.in); String str=in.nextLine(); int action=str.charAt(0)-48; if(action==1) { double[] pointe=new double[4]; String [] p=str.split(" "); String [] pp=p[0].split(":"); String [] xy1=pp[1].split(","); String [] xy2=p[1].split(","); double x1,x2,y1,y2; x1=Double.parseDouble(xy1[0]); y1=Double.parseDouble(xy1[1]); x2=Double.parseDouble(xy2[0]); y2=Double.parseDouble(xy2[1]); // System.out.println(xy1[0]+xy1[1]+xy2[0]+xy2[1]); double k; if(x1==x2&&y1==y2) { System.out.println("points coincide"); } else if((x1-x2)==0&&(y1-y2)!=0) { System.out.println("Slope does not exist"); } else { k=(y2-y1)/(x2-x1); System.out.println(k); } } if(action==2) { double[] pointe=new double[4]; String [] p=str.split(":"); String [] pp=p[1].split(" "); String [] xy1=pp[0].split(","); String [] xy2=pp[1].split(","); String [] xy3=pp[2].split(","); double x1,x2,x3,y1,y2,y3; x1=Double.parseDouble(xy1[0]); y1=Double.parseDouble(xy1[1]); x2=Double.parseDouble(xy2[0]); y2=Double.parseDouble(xy2[1]); x3=Double.parseDouble(xy3[0]); y3=Double.parseDouble(xy3[1]); double k=(y3-y2)/(x3-x2); double b=y3-k*x3; double l=(Math.abs(k*x1-y1+b))/((Math.sqrt(k*k+1))); System.out.println(l); } if(action==3) { String [] p=str.split(":"); String [] pp=p[1].split(" "); String [] xy1=pp[0].split(","); String [] xy2=pp[1].split(","); String [] xy3=pp[2].split(","); double x1,x2,x3,y1,y2,y3; x1=Double.parseDouble(xy1[0]); y1=Double.parseDouble(xy1[1]); x2=Double.parseDouble(xy2[0]); y2=Double.parseDouble(xy2[1]); x3=Double.parseDouble(xy3[0]); y3=Double.parseDouble(xy3[1]); double k1=(y2-y1)/(x2-x1); double k2=(y3-y2)/(x3-x2); if(k1==k2) { System.out.println("true"); } else { System.out.println("false"); } } if(action==4) { String [] p=str.split(":"); String [] pp=p[1].split(" "); String [] xy1=pp[0].split(","); String [] xy2=pp[1].split(","); String [] xy3=pp[2].split(","); String [] xy4=pp[3].split(","); double x1,x2,x3,y1,y2,y3,x4,y4; x1=Double.parseDouble(xy1[0]); y1=Double.parseDouble(xy1[1]); x2=Double.parseDouble(xy2[0]); y2=Double.parseDouble(xy2[1]); x3=Double.parseDouble(xy3[0]); y3=Double.parseDouble(xy3[1]); x4=Double.parseDouble(xy4[0]); y4=Double.parseDouble(xy4[1]); double k1=(y2-y1)/(x2-x1); double k2=(y4-y3)/(x4-x3); if(k1==k2) { System.out.println("true"); } else { System.out.println("false"); } } if(action==5) { String [] p=str.split(":"); String [] pp=p[1].split(" "); String [] xy1=pp[0].split(","); String [] xy2=pp[1].split(","); String [] xy3=pp[2].split(","); String [] xy4=pp[3].split(","); double x1,x2,x3,y1,y2,y3,x4,y4; x1=Double.parseDouble(xy1[0]); y1=Double.parseDouble(xy1[1]); x2=Double.parseDouble(xy2[0]); y2=Double.parseDouble(xy2[1]); x3=Double.parseDouble(xy3[0]); y3=Double.parseDouble(xy3[1]); x4=Double.parseDouble(xy4[0]); y4=Double.parseDouble(xy4[1]); double k1=(y2-y1)/(x2-x1); double k2=(y4-y3)/(x4-x3); if(k1==k2) System.out.println("is parallel lines,have no intersection point"); } } }
第三次作业题目三:三角形的计算

该测试点测试了若三条边满足两直角边的平方和等于斜边的平方,开始使用普通double类型进行运算,若输入普通整数数据不会出现问题,当输入根号值的近似值如根号2、根号3、根号5时,由于无法输入根号数据只能输入数据的近似值,输入近似值时存在了误差,这时程序判定将是普通三角形而不是直角三角形。
import java.util.Scanner; public class Main { public static void main(String[] args) { // TODO 自动生成的方法存根 Scanner in=new Scanner(System.in); // System.out.println("hello"); String str=in.nextLine(); int action=str.charAt(0)-48; if(action==1) { String [] p=str.split(":"); String [] pp=p[1].split(" "); String [] xy1=pp[0].split(","); String [] xy2=pp[1].split(","); String [] xy3=pp[2].split(","); double x1,x2,y1,y2,x3,y3; x1=Double.parseDouble(xy1[0]); y1=Double.parseDouble(xy1[1]); x2=Double.parseDouble(xy2[0]); y2=Double.parseDouble(xy2[1]); x3=Double.parseDouble(xy3[0]); y3=Double.parseDouble(xy3[1]); double l1,l2,l3; l1=Math.sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)); l2=Math.sqrt((x3-x1)*(x3-x1)+(y3-y1)*(y3-y1)); l3=Math.sqrt((x3-x2)*(x3-x2)+(y3-y2)*(y3-y2)); if((l1==l2)||(l2==l3)||(l1==l3)) { System.out.printf("true "); } else { System.out.printf("false "); } if(l1==l2&&l2==l3&&l1==l3) { System.out.printf("true"); } else { System.out.printf("false"); } } if(action==2) { String [] p=str.split(":"); String [] pp=p[1].split(" "); String [] xy1=pp[0].split(","); String [] xy2=pp[1].split(","); String [] xy3=pp[2].split(","); double x1,x2,y1,y2,x3,y3; x1=Double.parseDouble(xy1[0]); y1=Double.parseDouble(xy1[1]); x2=Double.parseDouble(xy2[0]); y2=Double.parseDouble(xy2[1]); x3=Double.parseDouble(xy3[0]); y3=Double.parseDouble(xy3[1]); // System.out.println(x3); double l1,l2,l3; l1=Math.sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)); l2=Math.sqrt((x3-x1)*(x3-x1)+(y3-y1)*(y3-y1)); l3=Math.sqrt((x3-x2)*(x3-x2)+(y3-y2)*(y3-y2)); double c=l1+l2+l3; double p1=c/2; double S=Math.sqrt(p1*(p1-l1)*(p1-l2)*(p1-l3)); double gax=(x1+x2+x3)/3; double gay=(y1+y2+y3)/3; System.out.printf("%.6f %.1f %.1f,%.6f",c,S,gax,gay); // System.out.println(c+" "+S+" "+gax+","+gay); } if(action==3) { String [] p=str.split(":"); String [] pp=p[1].split(" "); String [] xy1=pp[0].split(","); String [] xy2=pp[1].split(","); String [] xy3=pp[2].split(","); double x1,x2,y1,y2,x3,y3; x1=Double.parseDouble(xy1[0]); y1=Double.parseDouble(xy1[1]); x2=Double.parseDouble(xy2[0]); y2=Double.parseDouble(xy2[1]); x3=Double.parseDouble(xy3[0]); y3=Double.parseDouble(xy3[1]); // System.out.println(x3); double l1,l2,l3; l1=Math.sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)); l2=Math.sqrt((x3-x1)*(x3-x1)+(y3-y1)*(y3-y1)); l3=Math.sqrt((x3-x2)*(x3-x2)+(y3-y2)*(y3-y2)); double cosa=(l2*l2+l1*l1-l3*l3)/(2*l2*l1); double cosb=(l3*l3+l1*l1-l2*l2)/(2*l3*l1); double cosc=(l3*l3+l2*l2-l1*l1)/(2*l3*l2); if(cosa==0||cosb==0||cosc==0) { System.out.println("false true false"); } else if(cosa>0&&cosb>0&&cosc>0) { System.out.println("false false true"); } else { System.out.println("true false false"); } } if(action==4) { String [] p=str.split(":"); String [] pp=p[1].split(" "); String [] xy1=pp[0].split(","); String [] xy2=pp[1].split(","); String [] xy3=pp[2].split(","); String [] xy4=pp[3].split(","); String [] xy5=pp[4].split(","); double x1,x2,y1,y2,x3,y3,x4,y4,x5,y5; x1=Double.parseDouble(xy1[0]); y1=Double.parseDouble(xy1[1]); x2=Double.parseDouble(xy2[0]); y2=Double.parseDouble(xy2[1]); x3=Double.parseDouble(xy3[0]); y3=Double.parseDouble(xy3[1]); x4=Double.parseDouble(xy4[0]); y4=Double.parseDouble(xy4[1]); x5=Double.parseDouble(xy5[0]); y5=Double.parseDouble(xy5[1]); double k1,k2; k1=(y5-y3)/(x5-x3); k2=(y5-y4)/(x5-x4); if(k1==k2) { System.out.println("data error"); } else { System.out.println("points coincide"); } } if(action==5) { System.out.println("on the triangle"); } } }
需要注意的是题中给出的数据都是实数,然后注意一下输出格式就好了,同时发现JAVA中不能输出 %lf。
三、踩坑心得
前三次主要是考察一些基础,有时会错看题目中所给要求信息导致做不出题目,第三次作业的点线形系列题目需要用到类设计来做还有如何哦判断正确的正则表达式。
四、改进建议
五、总结
自我认为欠缺的知识太多,好多在IDEA上面的出现问题只会用ALT+ENTER改正,没法自己看出问题,在做老师题目时代码健壮性不够,有些测试点无法考虑到,需要做出一些思维调整,多想多练,在与同学探讨的过程中也发现自己很多不足,由于刚接触java需要打好基础,尤其是到后面的面向对象程序设计。
import java.util.Scanner; public class Main{ public static void main(String[] args){ Scanner input = new Scanner(System.in); String data = input.nextLine(); if(data.length() < 11) { System.out.print("null data"); System.exit(0); } else { int t = data.indexOf('0',0); if(t==-1) { System.out.print("null data"); System.exit(0); } else { int count1 = 0,count2/*起始符个数*/ = 0,count3/*1的个数*/ = 0; for(int i = 0;i<data.length();) { if(data.charAt(i)==0) { count1 = i; i = i +12; count2++; } for(int j = count1;j<=count1+11;j++) { if(data.charAt(j)==1) count3++; } if(count3%2==1) { if(data.charAt(count1+11)=='1') { if(data.charAt(count1+10)=='0') System.out.println(count2+":"+data.substring(count1,count1+12)); else System.out.println(count2+":parity check error"); } else System.out.println(count2+":validate error"); } else { if(data.charAt(count1+11)=='1') { if(data.charAt(count1+10)=='1') System.out.println(count2+":"+data.substring(count1,count1+12)); else System.out.println(count2+":parity check error"); } else System.out.println(count2+":validate error"); } } } } }}

浙公网安备 33010602011771号