三次作业总计
一. 前言
通过这三次作业的练习以后,我对java和c的区别有了一些初步的认知。本来认为有c的老底然后来写java的作业的话应该不是很难,前两次作业都还好,虽然过程中有很多困难,但最后还是基本完成任务,但是在第三次作业中,我看到了java不一样的地方,难度也上升了很多,花费了很多时间,但是最后还是没能解决问题。这让我心中产生了许多的不解和困惑,并且提醒了我在以后的学习过程中不能再掉以轻心了,要认认真真的对待每一堂课和每次作业。
1.三次作业总结
(1)第一次作业
第一次作业的题目量虽然比较大,但是大多都是比较基础简单的题目,大多都是简单的输入,输出,求和,判断,选择。考察的东西就是java的基本结构和一些比较简单的语法问题,例如if~else语句,循环语句等等。不过还是存在一些细节上的考点,有时候会出现测试点不过的情况,大体上没有什么难度,不过二进制数值提取的这道题目我没有拿满分,有三个测试点没有通过。
(2)第二次作业
第二次作业主要考察的是字符串的提取与循环的运用,大多是将输入的内容提取一部分出来,如7-2 串口字符解析和7-3 String的格式判断与内容提取,还有将输入的内容转换一下,如7-1字母-数字转换。这次题目的难度还算比较均衡,除去第二题比较困难,题意难解,另外两道题的难度还算适中,并不是很困难。
(3)第三次作业
第三次作业相比较于前两次作业而言,难度比较大,主要是对新知识点正则表达式的考察和使用。在网上阅读完相关资料以后,并没能完全将这个知识点掌握并运用到题目当中去,一直处于一个一知半解的状态下。
二.设计与分析
第二次作业的7-2源码如下:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String in = input.nextLine();
if (in.length() < 11 || in.matches("^[1]*$")) {
System.out.println("null data");
return;
}
int i,j,sum,num=1;
boolean m = false, n = false;
for (i = 0; i < in.length() - 10; i++) {
if (in.charAt(i) == '0') {
System.out.print(num + ":");
num++;
if (in.charAt(i + 10) == '0') {
m = false;
} else {
m = true;
sum = 0;
for (j = i + 1; j < i + 9; j++) {
if (in.charAt(j) == '1') {
sum++;
}
}
if (sum % 2 == 0) {
if (in.charAt(i + 9) == '1') {
n = true;
} else {
n = false;
}
} else {
if (in.charAt(i + 9) == '0') {
n = true;
} else {
n = false;
}
}
}
if (m) {
if (n) {
for (j = i + 1; j < i + 9; j++) {
System.out.print(in.charAt(j));
}
System.out.print("\n");
} else {
System.out.println("parity check error");
}
} else {
System.out.println("validate error");
}
i = i + 10;
}
}
}
}
这道题目对正则表达式有了初步的考察。
这题运用正则表达式的匹配功能来判断输入的合法性,也就是判断语句if中的 in.matches("^[1]*$"),通过这个语句来筛选正确输入的情况。然后通过if~else语句来筛选出各种情况,并进行输出。其中也考察了奇偶校验中的奇校验。通过对这道题目的练习,对奇偶校验有了一个初步的理解。
第三次作业7-1的源码如下:
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String s = input.nextLine();
int i;
for(i=0;i<s.length();i++)
{
if((s.charAt(i)=='+'&&s.charAt(i+1)=='+')||(s.charAt(i)=='-'&&s.charAt(i+1)=='-'))
{System.out.println("Wrong Format");
return;}
}
double num=0.0;
String u;
Pattern pattern1 = Pattern.compile("([+-]?\\d+\\.?\\d*)(\\,)([+-]?\\d+\\.?\\d*)");
Matcher matcher1 = pattern1.matcher(s);
double x1,x2,y1,y2;
matcher1.find();
u = matcher1.group(1);
x1 = Double.parseDouble(u);
u = matcher1.group(3);
y1 = Double.parseDouble(u);
matcher1.find();
u = matcher1.group(1);
x2 = Double.parseDouble(u);
u = matcher1.group(3);
y2 = Double.parseDouble(u);
if(matcher1.find())
{
System.out.println("wrong number of points");
return;
}
num = Math.sqrt(Math.pow((x1-x2) * 1.0, 2) + Math.pow((y1-y2)* 1.0, 2));
System.out.println(num);
}
}
这道题目主要也是对正则表达式的运用和理解。不过难度却稍微高了一些,深度也大了一些。首先我们要同过正则表达式的匹配功能来筛选出正确输入的情况,然后同过获取功能将我们所需要的数据拿出来单独存取,最后再通过公式运算来获得最终的结果。设想过程中很不错,不过编写程序的过程中却经常出现测试点不通过的情况。错误输入格式的情况屡屡再现,最终也没有妥善的解决。
第三次作业7-2的源码如下:
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String s = input.nextLine();
int i;
for(i=0;i<s.length();i++)
{
if((s.charAt(i)=='+'&&s.charAt(i+1)=='+')||(s.charAt(i)=='-'&&s.charAt(i+1)=='-'))
{System.out.println("Wrong Format");
return;}
}
String u;
Pattern pattern1 = Pattern.compile("([+-]?\\d+\\.?\\d*)(\\,)([+-]?\\d+\\.?\\d*)");
Matcher matcher1 = pattern1.matcher(s);
double a[]=new double[8];
int j= 0;
while(matcher1.find())
{
u = matcher1.group(1);
a[j] = Double.parseDouble(u);
j++;
u = matcher1.group(3);
a[j] = Double.parseDouble(u);
j++;
}
if(s.charAt(0)=='1')
{
double t = (a[3]-a[1])/(a[2]-a[0]);
if(a[2]!=a[0])
System.out.println(t);
else
System.out.println("Slope does not exist");
return;
}
else if(s.charAt(0)=='2')
{
double t =Math.abs((((a[3]-a[5])/(a[2]-a[4]))*a[0]-a[1]+a[5]-((a[3]-a[5])/(a[2]-a[4]))*a[2])/
Math.sqrt(((a[3]-a[5])/(a[2]-a[4]))*((a[3]-a[5])/(a[2]-a[4]))+1));
System.out.println(t);
return;
}
else if(s.charAt(0)=='3')
{
double t =Math.abs((((a[3]-a[5])/(a[2]-a[4]))*a[0]-a[1]+a[5]-((a[3]-a[5])/(a[2]-a[4]))*a[2])/
Math.sqrt(((a[3]-a[5])/(a[2]-a[4]))*((a[3]-a[5])/(a[2]-a[4]))+1));
if(t==0)
System.out.println("ture");
else
System.out.println("false");
return;
}
else if(s.charAt(0)=='4')
{
if((a[3]-a[1])/(a[2]-a[0])==(a[7]-a[5])/(a[6]-a[4]))
System.out.println("ture");
else
System.out.println("false");
return;
}
else if(s.charAt(0)=='5')
{
return;
}
}
}
这题相较于第一题而言难度上升了很多。
这道题有所包含的内容如下:
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~else语句去正确处理这些数据,得到最终的输出结果。。大体上是这个设计思路,然后再编写代码的过程中进行了一部分修改。
第三次作业7-3的源码如下:
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String s = input.nextLine();
int i;
String u;
Pattern pattern1 = Pattern.compile("([+-]?\\d+\\.?\\d*)(\\,)([+-]?\\d+\\.?\\d*)");
Matcher matcher1 = pattern1.matcher(s);
double a[]=new double[8];
int j= 0;
while(matcher1.find())
{
u = matcher1.group(1);
a[j] = Double.parseDouble(u);
j++;
u = matcher1.group(3);
a[j] = Double.parseDouble(u);
j++;
}
if(s.charAt(0)=='1')
{
double c = Math.sqrt((a[0]-a[2])*(a[0]-a[2])+(a[1]-a[3])*(a[1]-a[3]));
double d = Math.sqrt((a[0]-a[4])*(a[0]-a[4])+(a[1]-a[5])*(a[1]-a[5]));
double e = Math.sqrt((a[4]-a[2])*(a[4]-a[2])+(a[5]-a[3])*(a[5]-a[3]));
if(c==d&&c==e)
{
System.out.print("ture ture");
}
else if(c==d||c==e||d==e)
System.out.print("ture false");
else
System.out.print("false false");
return;
}
else if(s.charAt(0)=='2')
{
return;
}
else if(s.charAt(0)=='3')
{
double c = Math.sqrt((a[0]-a[2])*(a[0]-a[2])+(a[1]-a[3])*(a[1]-a[3]));
double d = Math.sqrt((a[0]-a[4])*(a[0]-a[4])+(a[1]-a[5])*(a[1]-a[5]));
double e = Math.sqrt((a[4]-a[2])*(a[4]-a[2])+(a[5]-a[3])*(a[5]-a[3]));
double f = c*c+d*d-e*e;
double g = c*c-d*d+e*e;
double h = -c*c+d*d+e*e;
if(f>0&&g>0&&h>0)
System.out.print("false false ture");
else if(f==0||g==0||h==0)
System.out.print("false ture false");
else if(f<0||g<0||h<0)
System.out.print("true false false");
return;
}
else if(s.charAt(0)=='4')
{
return;
}
else if(s.charAt(0)=='5')
{
return;
}
}
}
这道题所包含的内容如下:
1:输入三个点坐标,判断是否是等腰三角形、等边三角形,判断结果输出true/false,两个结果之间以一个英文空格符分隔。
2:输入三个点坐标,输出周长、面积、重心坐标,三个参数之间以一个英文空格分隔,坐标之间以英文","分隔。
3:输入三个点坐标,输出是钝角、直角还是锐角三角形,依次输出三个判断结果(true/false),以一个英文空格分隔,
4:输入五个点坐标,输出前两个点所在的直线与三个点所构成的三角形相交的交点数量,如果交点有两个,则按面积大小依次输出三角形被直线分割成两部分的面积。若直线与三角形一条线重合,输出"The point is on the edge of the
triangle"
5:输入四个点坐标,输出第一个是否在后三个点所构成的三角形的内部(输出in the triangle/outof triangle)。
必须使用射线法,原理:由第一个点往任一方向做一射线,射线与三角形的边的交点(不含点本身)数量如果为1,则在三角形内部。如果交点有两个或0个,则在三角形之外。若点在三角形的某条边上,输出"on the triangle"
这道题目与第二道题目类似,首先仍然是筛选输入的数据合理性,如果不合理直接结束。正确输入后,再使用正则表达式,将所需要的数据提取出来单独处理,通过输入的第一个字符判断所需要的功能,此时用if~else语句去正确处理这些数据,得到最终的输出结果。
三.踩坑心得
对于前两次作业雷坑相对来说比较少,我记得第一次作业中,很多题的浮点型数据只能定义float类型的浮点数,而不能定义为double类型的浮点型数据。其次就是有些输入输出的问题,总是有些格式错误,我到现在还没搞明白。还有一些时候,再数据输出的时候必须要加上(类型),来避免数据出错。然后从第三次作业开始,主要是对于正则表达式的考察,主要是字符串的匹配和字符串的获取。雷坑就在于如何合理的使用正则表达式,然而我在调试的过程中总是会出现格式错误,测试点不通过,或者是三个点只对一个点。我通过题目给出的测试数据来进行调试,但是最后没有找到哪里的错误。然后我还有很多地方没有写出来,是不知道怎么将正则表达式运用得很好,只能初略的进行筛选,然后获取其中的内容。
四.改进建议
对于前这三次作业而言,我的代码一般都是大家的惯性思维,由于怕出错,所以都写得比较常规,有些题目确实有更简单的思路,但是我不知道怎么去运用哪些方法,可能是知识量储备的比较少吧。例如第三次作业的题目,可以用正则表达式去筛选出输入格式错误的情况,但是我是把输入错误的情况一一表达出来,然后通过判断语句去解决。首先是对正则表达式认知的不到位,不知道怎么去正确使用正则表达式去筛选出输入格式错误的地方,如果将这个点弄明白的话,代码的复杂程度就会降低很多。
五.总结
通过这三次的习题练习,我学到了挺多的东西。
如java的基本结构,变量的类型以及字符串的输入与输出。收获最大的自然是正则表达式与奇偶校验。在Java编程中,我们经常要处理一些字符串的查找等与字符串相关的程序,而正则表达式满足了这个需要,它规定了各种复杂的规则,换句话说,正则表达式就是记录文本规则的代码,计算机处理更多的不是数字而是字符串,而正则表达式就是对字符串进行匹配最为强大的工具,很多语言都支持正则表达式。正则表达式,又称规则表达式。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。正则表达式(Regular Expression)是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符")。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。
正则表达式有四个用处:
1. 字符串的匹配功能
2. 字符串的切割功能
3. 字符串的替换功能
4. 字符串的获取功能
奇校验:校验数据完整性的一种方法,一个字节的8个数据位与校验位加起来之和有奇数个 1。校验线路在收到数后,通过发生器在校验位填上 0 或 1,以保证和是奇数个 1。
因此,校验位是 0 时,数据位中应该有奇数个 1;
而校验位是 1 时,数据位应该有偶数个 1。
如果读取数据时发现与此规则不符,CPU会下令重新传输数据。
但是对于正则表达式的理解还是不到位,仍然处于一知半解的状态,所以我还要多花点心思在正则表达式的身上,多多去研究它,希望能获得更进一步的理解。

浙公网安备 33010602011771号