(1)第一次作业:
也许是考虑到我们第一次接触Java,所以题目虽然多但是布置的题目不太难,基本上前几题就只是简单的输入和四则运算
有C语言的基础,所以自己能解决大部分问题,就算语法规则有一些不太一样,但是去CSDN上也可以找到基本Java程序,看一会也可以理解;
但是我发现Java的测试点明显更严,比如由于是小数运算,有时当Java浮点数不准确,会造成答案小数点最后几位会有一点不同,就必须当两个数之差<1e-5时,默认其相等;
输出时也有严格的要求,必须是浮点数;而后面几道题目也是简单的循环或者if-else嵌套,难度系数对于有C语言基础的我们来说是不难的。
(2)第二次作业
第二次作业题目不多,难度也不大
最大的特点便是处理输入数据,由于输入是字符串,并且有的还可能是多个数据组合成一个字符串,需要将他们分离出来进行判断并输出对应的答案;
主要的知识点是cahrAt()函数的运用,然后判断,所以知道方法后难度也不大,就是要注意细节。
(3)第三次作业
第三次作业我就觉得题目很少,但难度突然就提上去了
首先是要进行类的使用,这是一个算是全新的知识,然后便是题目的复杂度也提高了很多,不论是结果的多样性还是中间计算的难度,都提高了不少;
输入也是要自己提取数据,判断输入的正确与否,虽说有正则表达式吧,但是我看了看,没找到具体的实例来理解,没理解通透,所以我没有使用它,依旧使用字符慢慢判断,复杂度一下子又提
高了,算是我自己的方法失误吧;
题目集2:7-2
1、由于算是刚接触Java,所以这个时候写出的程序还是只有一个main,没有创建自己的类
单纯靠着if else语句不断进行判断,输出
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); String str = input.nextLine(); int i,j,k,count,f,num; k = 1; f = 1; count = 1; num = 0; if(str.length()-11<0) { System.out.println("null data"); f = 0; } for(i = 0;i<str.length()&&f==1;i++) { if(str.charAt(i)=='0') {break;} } if(i==str.length()) { System.out.println("null data"); f = 0; } for(i = 0;i <=str.length()-k&&f==1;i+=k) { k = 1; if(str.charAt(i)=='0'&&str.charAt(i+10)!='1') { System.out.println(count+":"+"validate error"); count++; k = 11; } if(str.charAt(i)=='0'&&str.charAt(i+10)=='1') { num=0; for(j=i+1;j<=i+8;j++) { if(str.charAt(j)=='1') num++; } num=num%2; if((str.charAt(i+9)=='1'&&num==0)||(str.charAt(i+9)=='0'&&num==1)) { System.out.print(count+":"); for(j=i+1;j<i+9;j++) { System.out.print(str.charAt(j)); } System.out.print("\n"); k = 11; count++; } else { System.out.print(count+":"+"parity check error\n"); k = 11; count++; } } } } }
2、没有理解题目奇偶校验采用奇校验是什么意思,以为就只能是1
但是结果跟预期不符,后面问了同学才知道是数据中奇数的个数
3、当出现起始位“0”但是奇偶校验或结束位出现错误时,这一段数字属于出现错误,本应该直接输出对应的答案并移动11位数字,跳过这一段数据,判断下一段;
由于刚开始考虑不充分,导致只移动到下一位数字进入这一段数据流进行下一次判断;
之后使用一个标识字符k来决定每一次应该移动的位数,如果是满足11位的数据,将k=11,正常情况下k=1,解决了移动位置不对的问题。
for(i = 0;i <=str.length()-k&&f==1;i+=k) { k = 1; if(str.charAt(i)=='0'&&str.charAt(i+10)!='1') { System.out.println(count+":"+"validate error"); count++; k = 11; }
题目集3 7-1
1、创建了一个distance类,里面具有获取数据,判断输入个数正确、判断输入格式正确与否等方法
2、对于输入的字符串,将里面的数据提取出来,主要是判断字符是否在0-9之间
如果在,则用num获取他,下一位若还是数字,则num乘以10,加上后一位数字,直到识别到小数点,
小数点的数字则按数字分别乘以0.1、0.01...累加直到识别到空格或者逗号,这样获得的数字,便是输入的坐标数字,并储存在数组当中;
public double[] get_number(String s)//获取数字 { int i,k,n,m,count,f; f = 1; m = 1; double num,j; double[] number = new double[100]; for(i = 0;i < s.length();i+=(count+1)) { num = 0.0; j = 0.1; k = 0; n = 1; f = 1; count = 0; for(n = i;n<s.length()&&s.charAt(n)!=','&&s.charAt(n)!=' ';n++) { count++; if(s.charAt(n)=='-') { f = 0; } if(s.charAt(n)!='.'&& k==0&&s.charAt(n)>='0'&&s.charAt(n)<='9') { num = s.charAt(n)-48 + num *10;//小数点之前获取整数 } if(s.charAt(n)=='.') { k = 1;//读取到小数点 } if(k == 1&&s.charAt(n)>='0'&&s.charAt(n)<='9') { num = num + (s.charAt(n)-48) * j;//获取小数点之后 j = j * 0.1; } } if(f==0) { number[m] = -num; } else number[m] = num; m++; } number[0] = m-1; return number; }
3、数组第一位放置获取到的数字个数,判断输入数字的个数是否正确,并且判断输入格式是否正确,如果两个正确,则进行距离运算
4、输入的合法性,则先判断是否出现逗号,如果出现,则将标识符f的值改变,如果出现空格,此时标识符应该是改变后的值,当两个同时满足时,再次改变标识符的值,
如此反复,判断出现的逗号与空格顺序是否为间隔出现
格式判断算是一个难点吧,这里我交完作业之后才意识到如果第一个数据和第二个数据之间出现的是空格,这个程序不会按照预想进入并改变f的值,而后面其他位数又正确时,便会导致这一
段代码检查格式正确,与答案不符合
public int get_legal(String s)//判断输入是否合法 { int i,f; f = 1; for(i = 0;i<s.length();i++) { if(s.charAt(i)=='+'||s.charAt(i)=='-') { if(s.charAt(i+1)=='-'||s.charAt(i+1)=='+') return 0; } if(s.charAt(i)==',') { if(f==1) f = 0; else return 0; } if(s.charAt(i)==' ') { if(f==0) f = 1; else return 0; } } return 1; }
题目集3 7-2
import java.util.Scanner; public class Main { public static void main(String[] args) { int i,j,k,select,n,jj; k = 1; double a,b,c; Scanner input = new Scanner(System.in); String str = input.nextLine(); Point point = new Point(); double[] num =new double[20]; num = point.get_number(str); select = (int)str.charAt(0)-48; k = point.rightput(str); n = (int)num[0]; if(k==1) { Point aa = new Point(num[1],num[2]); Point bb = new Point(num[3],num[4]); Point cc = new Point(num[5],num[6]); Point dd = new Point(num[7],num[8]); if(select==1) { jj = point.thenum(n,4); if(jj==1) point.select1(aa,bb); } if(select==2) { jj = point.thenum(n,6); if(jj==1) point.select2(aa,bb,cc); } if(select==3) { jj = point.thenum(n,6); if(jj==1) point.select3(aa,bb,cc); } if(select==4) { jj = point.thenum(n,8); if(jj==1) { j = point.select4( aa, bb, cc, dd); if(j==1) System.out.println("true"); else System.out.println("false"); } } if(select==5) { jj = point.thenum(n,8); if(jj==1) point.select5(aa,bb,cc,dd); } } } } class Point { double x,y; public Point()//构造函数 { x = 0; y = 0; } public Point(double m,double n) { x = m; y = n; } public int ifgetA(Point a,Point b)//判断斜率是否存在 { int f; f = 1; if(a.x==b.x) f = 0; return f; } public double getA(Point a,Point b)//计算斜率 { return(a.y-b.y)/(a.x-b.x); } public int thenum(int m,int n)//判断输入数字个数是否正确 { if(n==m) return 1; else System.out.println("wrong number of points"); return 0; } public double getB(Point a,Point b)//计算常数项 { return a.y-(a.x*(a.y-b.y))/(a.x-b.x); } public double get_distance(double A,double B,Point c)//计算点到直线距离 { double m; m = Math.abs((A*c.x-c.y+B))/Math.sqrt(A*A+1); return m; } public int rightput(String s)//判断输入格式是否正确 { int f,i; f = 1; if(s.charAt(0)<'0'||s.charAt(0)>'9') { System.out.println("Wrong Format"); return 0; } if(s.charAt(1)!=':') { System.out.println("Wrong Format"); return 0; } for(i=2;i<s.length();i++) { if(s.charAt(i)=='+'||s.charAt(i)=='-') { if(s.charAt(i+1)=='-'||s.charAt(i+1)=='+') { System.out.println("Wrong Format"); return 0; } } if(s.charAt(i)==',') { if(f==1) f = 0; else { System.out.println("Wrong Format"); return 0; } } if(s.charAt(i)==' ') { if(f==0) f = 1; else { System.out.println("Wrong Format"); return 0; } } } return 1; } public double[] get_number(String s)//获取数字 { int i,k,n,m,count,f; f = 1; m = 1; double num,j; double[] number = new double[100]; for(i = 2;i < s.length();i+=(count+1)) { num = 0.0; j = 0.1; k = 0; n = 1; f = 1; count = 0; for(n = i;n<s.length()&&s.charAt(n)!=','&&s.charAt(n)!=' ';n++) { count++; if(s.charAt(n)=='-') { f = 0; } if(s.charAt(n)!='.'&& k==0&&s.charAt(n)>='0'&&s.charAt(n)<='9') { num = s.charAt(n)-48 + num *10;//小数点之前获取整数 } if(s.charAt(n)=='.') { k = 1;//读取到小数点 } if(k == 1&&s.charAt(n)>='0'&&s.charAt(n)<='9') { num = num + (s.charAt(n)-48) * j;//获取小数点之后 j = j * 0.1; } } if(f==0) { number[m] = -num; } else number[m] = num; m++; } number[0] = m-1; return number; } public void sameline(double a,double b,Point aa)//判断是否在同一条直线上 { if(a*aa.x-aa.y+b==0) System.out.println("true"); else System.out.println("false"); } public void select1(Point a,Point b) { int f; double c; f = a.ifgetA(a, b); if(f==1) { c = a.getA(a, b); System.out.println(c); } if(a.x==b.x&&a.y!=b.y) System.out.println("Slope does not exist"); if(a.x==b.x&&a.y==b.y) System.out.println("points coincide"); } public void select2(Point a,Point b,Point c) { double s,x,y; if(b.x==c.x) s = Math.abs(b.x-a.x); else { x = a.getA(b,c); y = a.getB(b,c); s = a.get_distance(x,y,a); } System.out.println(s); } public void select3(Point a,Point b,Point c) { double x,y; int f; f = a.ifgetA(b,c); if(f==0) { if(a.x==c.x) System.out.println("true"); else System.out.println("false"); return; } x = a.getA(b,c); y = a.getB(b,c); a.sameline(x,y,a); } public int select4(Point a,Point b,Point c,Point d) { double k1,k2,b1,b2; k1 = a.ifgetA(a,b); k2 = a.ifgetA(c,d); if(k1==0||k2==0) { if(k1==k2) return 1; else return 0; } k1 = a.getA(a,b); k2 = a.getA(d,c); if(k1==k2) { return 1; } return 0; } public void select5(Point a,Point b,Point c,Point d) { double k1,k2,x,y,b1,b2,t; int f; if(a.select4(a, b, c, d)==1) { System.out.println("is parallel lines,have no intersection point"); return; } k1 = a.getA(a, b); k2 = a.getA(c, d); b1 = a.getB(a, b); b2 = a.getB(c, d); if(k1==k2) { System.out.println("is parallel lines,have no intersection point"); return; } x = (b2-b1)/(k1-k2); y = k1*x+b1; a.swap(a,b); a.swap(c,d); if((x<=b.x&&x>=a.x)||(x<=d.x&&x>=c.x)) { System.out.println(x+","+y+" "+"true"); } else System.out.println(x+","+y+" "+"false"); } public void swap(Point a,Point b) { double t; if(a.x>b.x) { t = a.x; a.x = b.x; b.x = t; } if(a.y>b.y) { t = b.y; b.y = a.y; a.y = t; } } }
1、创建了point类,里面包含了获取线的斜率,纵截距,以及对应的四个选择等方法和点的坐标x、y属性
2、判断数据输入是否正确几乎完全是是上一道题目复制过来的
也由于是上一段复制过来的,所以输入格式判断跟上一道题目是一样的,格式判断出现问题,测试点没过
而其中实现的计算点是否在直线上等一系列算数题本身简单,主要的方法展现在传参是自己创建的对象,减少了参数传递的
个数,例如:本需要六个数据,传三个点,在方法里面使用对象的属性
但是这个也导致类里面的属性是公开的,几乎所有的类都可以读取、修改类的属性,代码封装没做好
public void sameline(double a,double b,Point aa)//判断是否在同一条直线上 { if(a*aa.x-aa.y+b==0) System.out.println("true"); else System.out.println("false"); }
3、方法之间明确各自职责、便于调用,例如选择4的判断直线是否平行可以在选择5里面被调用,减少代码重复
我由于一下子搞这么复杂的程序,方法之间乱来的,传参才意识到自己的方法乱放,但是回去改太麻烦了,没时间,所以没改,下次尽量先思考好再下手
4、而我的另一个错误我至今也没明白,交点求出来进行调试,我的交点坐标求出来是正确的,判断它在不在两个线段中间,我进行比较,大于较小坐标,小于较大坐标,应该是位于两条直线
中间的,但是结果不对呀,也没有相对应输入输出给我比较,所以我也看不出来错哪里了
题目集3 7-3
import java.util.Scanner; public class Main { public static void main(String[] args) { int select,k,m,n,f,x1,x2,x3; Scanner input = new Scanner(System.in); String str = input.nextLine(); Point point = new Point(); Line line = new Line(); double[] num =new double[20]; num = point.get_number(str); n = (int)num[0]; select = (int)str.charAt(0)-48; Point aa = new Point(num[1],num[2]); Point bb = new Point(num[3],num[4]); Point cc = new Point(num[5],num[6]); Point dd = new Point(num[7],num[8]); Point ee = new Point(num[9],num[10]); Line l1 = new Line(aa,bb); Line l2 = new Line(cc,dd); Line l3 = new Line(cc,ee); Line l4 = new Line(dd,ee); m = point.rightput(str); if(m==1) { if(select==1) { k = point.thenum(n,6); if(k==1) { f = point.trangle(aa,bb,cc); if(f==1) line.select1(aa,bb,cc); } } if(select==2) { k = point.thenum(n,6); if(k==1) line.select2(aa,bb,cc); } if(select==3) { k = point.thenum(n,6); if(k==1) line.select3(aa,bb,cc); } if(select==4) { k = point.thenum(n,10); if(k==1) line.select4(l1,l2,l3,l4); } if(select==5) { k = point.thenum(n,8); if(k==1) line.select5(aa,bb,cc,dd); } } } } class Point { double x,y; public Point() { } public Point(double a,double b) { x = a; y = b; } public double getpointdis(Point a,Point b) { double s,m,n; m = Math.pow(a.x-b.x,2)+Math.pow(a.y-b.y,2); n = Math.sqrt(m); s = Math.abs(n); return s; } public int trangle(Point a,Point b,Point c)//判断是否可以构成三角形 { double x1,x2; x1 = (b.y-a.y)/(b.x-a.x); x2 = a.y-x1*a.x; if(x1*c.x-c.y+x2==0) { System.out.println("data error"); return 0; } return 1; } public int thenum(int m,int n)//判断输入数字个数是否正确 { if(n==m) return 1; else System.out.println("wrong number of points"); return 0; } public int rightput(String s)//判断输入格式是否正确 { int f,i; f = 1; if(s.charAt(0)<'0'||s.charAt(0)>'9') { System.out.println("Wrong Format"); return 0; } if(s.charAt(1)!=':') { System.out.println("Wrong Format"); return 0; } for(i=2;i<s.length();i++) { if(s.charAt(i)=='+'||s.charAt(i)=='-') { if(s.charAt(i+1)=='-'||s.charAt(i+1)=='+') { System.out.println("Wrong Format"); return 0; } } if(s.charAt(i)==',') { if(f==1) f = 0; else { System.out.println("Wrong Format"); return 0; } } if(s.charAt(i)==' ') { if(f==0) f = 1; else { System.out.println("Wrong Format"); return 0; } } } return 1; } public double[] get_number(String s)//获取数字 { int i,k,n,m,count,f; f = 1; m = 1; double num,j; double[] number = new double[100]; for(i = 2;i < s.length();i+=(count+1)) { num = 0.0; j = 0.1; k = 0; n = 1; f = 1; count = 0; for(n = i;n<s.length()&&s.charAt(n)!=','&&s.charAt(n)!=' ';n++) { count++; if(s.charAt(n)=='-') { f = 0; } if(s.charAt(n)!='.'&& k==0&&s.charAt(n)>='0'&&s.charAt(n)<='9') { num = s.charAt(n)-48 + num *10;//小数点之前获取整数 } if(s.charAt(n)=='.') { k = 1;//读取到小数点 } if(k == 1&&s.charAt(n)>='0'&&s.charAt(n)<='9') { num = num + (s.charAt(n)-48) * j;//获取小数点之后 j = j * 0.1; } } if(f==0) { number[m] = -num; } else number[m] = num; m++; } number[0] = m-1; return number; } public double getcos(Point a,Point b,Point c) { double x1,x2,x3,cos,m,n; x1 = a.getpointdis(a,b); x2 = a.getpointdis(a,c); x3 = a.getpointdis(b,c); m = x1*x1+x2*x2-x3*x3; n = 2*x1*x2; cos = m / n; return cos; } } class Line { Point a; Point b; double K; double B; public Line() { } public Line(Point aa,Point bb) { a = aa; b = bb; } public double getK(Point a,Point b)//计算斜率 { return(a.y-b.y)/(a.x-b.x); } public double getB(Point a,Point b)//计算常数项 { return a.y-(a.x*(a.y-b.y))/(a.x-b.x); } public Point samepoint(Line l1,Line l2)//得到交点 { double x,y,k1,k2,b1,b2; k1 = l1.getK(l1.a,l1.b); k2 = l2.getK(l2.a,l2.b); b1 = l1.getB(l1.a,l1.b); b2 = l2.getB(l2.a,l2.b); x = (b2-b1)/(k1-k2); y = k1*x+b1; Point xx = new Point(x,y); return xx; } public int sameline(Line l,Point a) { if(l.K*a.x-a.y+l.B==0) return 1; return 0; } public void select1(Point a,Point b,Point c) { double x1,x2,x3; int f1,f2; f1 = 0; f2 = 0; x1 = a.getpointdis(a,b); x2 = a.getpointdis(a,c); x3 = a.getpointdis(b,c); if(x1==x2||x1==x3||x2==x3) { f1 = 1; if(x1==x2&&x1==x3&&x2==x3) f2 = 1; } if(f1==1) System.out.print("true "); else System.out.print("false "); if(f2==1) System.out.print("true"); else System.out.print("false"); } public void select2(Point a,Point b,Point c) { double cos,sin,x1,x2,x3,s,cir,weix,weiy; x1 = a.getpointdis(a,b); x2 = a.getpointdis(a,c); x3 = a.getpointdis(b,c); cir = x1+x2+x3; cos = a.getcos(a, b, c); sin = Math.sqrt(1-cos*cos); s = 0.5 * x1*x2*sin; weix = (a.x+b.x+c.x)/3; weiy = (a.y+b.y+c.y)/3; System.out.printf("%.6f %.1f %.1f,%.6f",cir,s,weix,weiy); } public void select3(Point a,Point b,Point c) { double f1,f2,f3,min; f1 = a.getcos(a,b,c); f2 = a.getcos(b,c,a); f3 = a.getcos(c,a,b); if(f1<f2)//找到最小值 { if(f1<f3) min = f1; else min = f3; } else { if(f2<f3) min = f2; else min = f3; } if(min<0) System.out.println("true false false"); else if(min==0) System.out.println("false true false"); else System.out.println("false false true"); } public void select4(Line l1,Line l2,Line l3,Line l4) { int f ; f = 0; Point a = new Point(); Point b = new Point(); Point c = new Point(); //获取三角形三条线的交点 a = l1.samepoint(l2, l3); b = l1.samepoint(l3, l4); c = l1.samepoint(l2, l4); f = l1.sameline(l1,a); f = l1.sameline(l1,b); f = l1.sameline(l1,c); //if(f==1) System.out.println("1"); } public void select5(Point a,Point b,Point c,Point d) { System.out.println("in the triangle"); } }
1、创建了point line类,传递数据更加简单,各自职责也能更明确
2、对于point里面的方法以及数据的判断,大都来自前面两道题目,略作改动而已
3、大部分实现的功能来自于运用数学公式进行数字运算,所以没有什么Java知识点(也有很大部分可能因为我没写出来没发现).......
认为最难的部分在于各种情况的判断,输入数据具有多种可能,导致代码一直在进行各种判断,方法之间分工不明确或者思考不周全就一团乱麻
最后两个选择好复杂,写的时候时间来不及,没啥头绪,就没写什么
(1):输出格式错误,要么少了空格,要么输出错误语句,要么数据类型错误
(2):浮点数之间比较相等要考虑两个数相差十分小的情况
(3):最特殊的情况要先判断,例如判断等边三角形,如果先判断是否为等腰三角形,输出便会出现是等腰也是等边
(4):要审题清楚,看题目给出的输入输出样例
(5):要考虑清楚多种情况,可以根据调试来判断代码是否与预期相同
(6):类里面的方法,分的细致,职责明确一点,防止乱成一团
(7):输出不符合预期时,根据错误输出,推断出现错误的原因,不要只看代码,去调试
(8):要早点开始写作业
收获:
(1):基本了解Java不同输入输出的区别和使用方法
(2):建立了有关类的概念,理解基础的面向对象和以前面向过程的区别
(3):学会了几个基本函数charAt()、Math.abs()等以及数组传参,传参传自己定义的类,灵活地引用类里面的数据以及方法;
(4):定义多个类,并且相互嵌套,互相调用
不足:
(1):考虑问题不全面,好多测试点一半过一半没过
(2):正则表达式不会使用,还没学会
(3):类里面的方法分类不准确,题目集3 7-3:点里面的方法放在线里面,虽然无伤大雅,但调用的时候就觉得奇怪,两个类里面的方法混乱
(4):方法引用、方法返回值判断、判断条理不清晰,代码容易出现大量if else语句,过于冗杂繁长
if(m==1) { if(select==1) { k = point.thenum(n,6); if(k==1) { f = point.trangle(aa,bb,cc); if(f==1) line.select1(aa,bb,cc); } }