第一次博客作业
(1):前言
1.题目集 1 前言
本次题目集一共包含了9道题目,题目难度相对比较简单,第一题到第五题的知识点有一个选择结构,题目难度相对简单。第六到第八题主要考察了字符串的输入,提取字符,字符的检查。其中第八题的难度相对其他题目而言是最困难的,考察了字符串的结束字符和二进制数字测序。
2.题目集2 前言
本次题目集一共只含有3道题目,但难度相对题目集而言难度增加了许多。第一题是将所有英文字母转换成它们在字母表中的序号。考察了如何将字符串字母全部转换为大写或者全部转换为小写。第二题的难度就上升了许多,题目为RS232相关的知识,字符串中含有空闲位,奇偶校验位和有效数据位。题目比较复杂,考察的是对字符串的比对,以及字符串.length(),substring()方法的用法,第三题是编写程序处理用全院学生学号连接起来的长字符串,相对第二题而言比较简单,本题考察的知识点主要有 String的格式判断与内容提取 ,以及字符串charAt()方法的用法。
3,题目集3前言
本次题目集一共只有3道题,难度较高,是所有题目集最难的。第一题为输入两点坐标求点之间的距离,但是输入点坐标中带有符号,主要考察了正则表达式以及对正则表达式的处理,第二题难度上升了许多,有五种输入选项,每种输入选项所要求的坐标个数不同,使用正则表达式可一有效的解决大部分问题,以及字符串parse函数的运用。第三题的难度是三道题目中最难的。题目类型和第二题相似,但是选项的所要求的功能更为复杂,题目中涉及了许多数学中线段与三角形的交点与面积问题,难度上升了很多,但是考察的知识点与第二题差不多,主要考察了正则表达式以及对正则表达式的处理。
这三道习题集总体而言难度适中,通过此三道习题集,可以让我们更全面的了解java的知识点。虽然后面两次的习题集的题量并没有很多,但是考察的知识点比较全面,可以让我们运用自己所学的新知识点,让我们可以巩固知识点,对知识点的掌握程度大大提高。前两次习题集因为拿了满分,认为java比较简单,但是第三次习题集让我明白了自己的无知,我所掌握的知识点并不全面,更应该花时间在java这门专业课上。
三次习题集的得分情况:
习题集一:100分
习题集二:100分
习题集三:61分
(2):设计与分析
题目集2的7-2 :
题目:
过滤掉空闲、起始、结束以及奇偶校验位之后的数据,数据之前加上序号和英文冒号。
如有多个数据,每个数据单独一行显示。
若数据不足11位或者输入数据全1没有起始位,则输出"null data",
若某个数据的结束符不为1,则输出“validate error”。
若某个数据奇偶校验错误,则输出“parity check error”。
若数据结束符和奇偶校验均不合格,输出“validate error”。
设计思路:先对字符串输入格式是否正确进行判断,如果正确,就进行下一步操作;反之,直接输出“输入非法”。
for(int i=0;i<le-1;i++){ ch=message.charAt(i); if(ch=='0'){ flag=1; } }
再然后对题目所给要求和功能进行代码的编写,最后完成题目。
题目集3的7-1:
题目:4个double类型的实数,两个点的x,y坐标,依次是x1、y1、x2、y2,两个点的坐标之间以空格分隔,每个点的x,y坐标以英文“,”分隔。例如:0,0 1,1或0.1,-0.3 +3.5,15.6。
若输入格式非法,输出"Wrong Format"。
若输入格式合法但坐标点的数量超过两个,输出“wrong number of points”。
public class Main{
public static void main(String []arge){
Scanner input=new Scanner(System.in);
int flag=0,j=0,count=0;
String data=input.nextLine();
int le = data.length();
for(int i=0;i<le;i++){
if( ( ( data.charAt(i)=='+' || data.charAt(i)=='-') && (data.charAt(i+1)=='+'||data.charAt(i+1)=='-') )||data.charAt(i)=='='||data.charAt(i)=='@'||data.charAt(i)=='#'||data.charAt(i)=='*'||data.charAt(i)=='&'){
System.out.println("Wrong Format");
return ;
}
if(data.charAt(i)==','){
System.out.println("Wrong Format");
return ;
}
}
String array[]=data.split("\\s+");
for(String s:array){
j++;
}
if(j>2) {
System.out.println("wrong number of points");
}
else {
String[] nums = array[0].split(",") ;
String[] nums1 = array[1].split(",") ;
double a = Double.parseDouble(nums[0]);
double b = Double.parseDouble(nums[1]) ;
double c = Double.parseDouble(nums1[0]) ;
double d = Double.parseDouble(nums1[1]) ;
double de = Math.pow((c-a)*(c-a)+(d-b)*(d-b),0.5);
System.out.println(de);
}
}
}
设计思路:先运用正则表达式对输入的字符串进行分割处理,后使用for(:)对输入坐标个数进行判断,再将字符串强制转化为浮点型,解决完此问题后,后面的就非常的简单了。
题目集3的7-2:
题目;
用户输入一组选项和数据,进行与直线有关的计算。选项包括:
1:输入两点坐标,计算斜率,若线条垂直于X轴,输出"Slope does not exist"。
2:输入三个点坐标,输出第一个点与另外两点连线的垂直距离。
3:输入三个点坐标,判断三个点是否在一条线上,输出true或者false。
4:输入四个点坐标,判断前两个点所构成的直线与后两点构成的直线是否平行,输出true或者false.
5:输入四个点坐标,计算输出前两个点所构成的直线与后两点构成的直线的交点坐标,x、y坐标之间以英文分隔",",并输出交叉点是否在两条线段之内(不含四个端点)的判断结果(true/false),判断结果与坐标之间以一个英文空格分隔。若两条线平行,没有交叉点,则输出"is parallel lines,have no intersection point"。
if(flag==2 || flag==3){ if(data.charAt(1)!=':'){ System.out.println("Wrong Format"); return ; } String[] nums = array[0].split(":|,") ; String[] nums1 = array[1].split(",") ; String[] nums2 = array[2].split(","); double a = Double.parseDouble(nums[1]); double b = Double.parseDouble(nums[2]) ; double c = Double.parseDouble(nums1[0]) ; double d = Double.parseDouble(nums1[1]) ; double e = Double.parseDouble(nums2[0]) ; double f = Double.parseDouble(nums2[1]) ; if(j>3){ System.out.println("wrong number of points"); } else if(c==e&&d==f){ System.out.println("points coincide"); } else if(c==e){ de=Math.abs(a-c); if(flag==3&&de==0){ System.out.println("true"); } else if(flag==2) System.out.println(de); else if(flag==3) System.out.println("false"); } else{ k= (f-d)/(e-c); be=f-k*e; de=Math.abs(a*k-b+be)/(Math.pow(k*k+1,0.5)); if(flag==3&&de==0){ System.out.println("true"); } else if(flag==2) System.out.println(de); else if(flag==3) System.out.println("false"); } }
设计思路:先判断输入数据所满足的选项,再采用正则表达式,将字符串分割为自己想要的数据,再根据选项所以达到的功能进行编译程序,若输入数据不符合基本格式,则直接输出“格式错误”。
题目集3的7-3:
题目:
如果不符合基本格式,输出"Wrong Format"。
如果符合基本格式,但输入点的数量不符合要求,输出"wrong number of points"。
如果输入的三个点无法构成三角形,输出"data error"。
注意:输出的数据若小数点后超过6位,只保留小数点后6位,多余部分采用四舍五入规则进到最低位。小数点后若不足6位,按原始位数显示,不必补齐。例如:1/3的结果按格式输出为 0.333333,1.0按格式输出为1.0
选项4中所输入线的两个点坐标重合,输出"points coincide",
if(flag==1||flag==2 || flag==3){ String[] nums = array[0].split(":|,") ; String[] nums1 = array[1].split(",") ; String[] nums2 = array[2].split(","); double a = Double.parseDouble(nums[1]); double b = Double.parseDouble(nums[2]) ; double c = Double.parseDouble(nums1[0]) ; double d = Double.parseDouble(nums1[1]) ; double e = Double.parseDouble(nums2[0]) ; double f = Double.parseDouble(nums2[1]) ; double de1 = Math.pow((c-a)*(c-a)+(d-b)*(d-b),0.5); double de2 = Math.pow((c-e)*(c-e)+(d-f)*(d-f),0.5); double de3 = Math.pow((e-a)*(e-a)+(f-b)*(f-b),0.5); double de4=(c-a)*(c-a)+(d-b)*(d-b); double de5=(c-e)*(c-e)+(d-f)*(d-f); double de6=(e-a)*(e-a)+(f-b)*(f-b); if(j!=3){ System.out.println("wrong number of points"); return; } else if((a==c&&b==d)||(a==e&&b==f)||c==e&&d==f){ System.out.println("points coincide"); return ; } else if(de1+de2<=de3||de1+de3<=de2||de3+de2<=de1){ System.out.println("data error"); return ; } // System.out.println(de1+" "+de2+" "+de3); if(flag==1){ if((de4==de5)||(de4==de6)||de5==de6){ System.out.printf("true"); } else{ System.out.printf("false"); } if((de4==de5)&&(de4==de6)&&de5==de6){ System.out.print(" true"); } else{ System.out.printf(" false"); } }
设计思路:先输入一串字符串,运用正则表达式将数据分割为几分,再根据题目所给的选项进行编译,如选项1:将输入的数据进行格式转换成浮点数类型,再运用数学知识求出坐标之间的距离,再根据距离判断是否可以组成三角形,如果为三角形,在进行是否为等边或等腰三角形。
(3)采坑心得:
题目集一踩坑心得:
else if((a==b && c*c-a*a-b*b<0.0001 && c*c-a*a-b*b>-0.0001) || (a==c && b*b-a*a-c*c<0.0001 &&c*c-a*a-b*b>-0.0001)||(c==b && a*a-c*c-b*b<0.0001&&c*c-a*a-b*b>-0.0001)){
System.out.println("Isosceles right-angled triangle");
}
在写这道题目时,判断三角形是否为等腰直角三角形时老是过不了,以为是逻辑出现问题,后发现是误差问题。
bang=(float)(height/0.45359237);
chun=(float)(length/0.0254);
在这道题中出现了输出格式错误,后面将变量强转置后解决。
题目集三踩坑心得:
1.
String array[]=data.split("\\s+");
当在做这道题时发现输入的数据带有符号时,就感到一头雾水,后面查找资料发现可以使用正则表达式进行输入带有字符的数据。
2.
System.out.print(new DecimalFormat("#.######").format(zx)+","+new DecimalFormat("#.######").format(zy));
在输出选项二中数据的格式时出现错误,不知如何将输出的数据若小数点后超过6位,只保留小数点后6位,多余部分采用四舍五入规则进到最低位。小数点后若不足6位,按原始位数显示,不必补齐。后在网络上查找资料,发现了DecimaFormat()方法的运用,顺利的解决了此问题。
3.
for(String s:array){ j++; }
在进行输入点坐标个数的检查时常常没有通过,后面使用foreach循环解决了个数问题。
(4)改进建议:
1.在编写代码时应该注意代码的格式,待到代码出现逻辑问题时可以更加有效的检查出自己的问题出现在哪里,可以大大的加大自己的效率。
2.在编写代码时应该采用多种函数的方法,可以更加有效的运行代码,能够把复杂的任务划分成更小、更简单的任务,从而大大减少我们程序的整体复杂性。
3.还有就是要善于用Java中一些功能方便的类,这样可以大大的提高我们的解题效率。
4.设计思维的改进,在每次写代码解题之前就想清楚,各个类之间的关系,以及这个类有怎样的功能,该承担怎样的职责,把这些全部想清楚这样就在写代码时大大的提高了我们的效率。
5.在进行代码的编写时应该尽量避免代码的重复编写,使我的代码更加的简洁.
6,在进行代码的编译时,不应该只有单调的一个了类。
(5) 总结:
1.通过三次的题目集,我了解了如何快速的、有效的、正确的编写程序,尤其是习题二的(7-2)和习题三的(7-2)(7-3),因为这三道题是所以题目集中难度最高的,所以做作业时花费了大量的时间在这三题上,所以通过这三道题使得我的编程能力大大的加强了。
2.在写题目集的过程中,我了解了在编程的时候使用注释的好处,当自己在测试程序的功能的时候出现bug时,可以快速的寻找注释,更加快速的寻找到测试该功能的代码,方便我的修改和优良。
3.在本次的题目集中,我只使用了一个主函数类,并没有加入多余的类,使得我的代码更加的单调,在后面的题目集中,我应该尝试更多的类,从而使我们的代码更加的简洁,且实现功能。
4.通过此次题目集练习,我的编程能力有了很大的提升,自己的逻辑能力也有了较大的提高。