大作业总结
1.前言
这学期是我们接触Java这门语言的第一个学期,大一上学期我们学习了c语言-面向过程编程,而Java则是一门面向对象编程的语言。老实说,刚开始我并不是很清楚面向对象编程的含义,直到老师在讲述类和对象的概念以及一项班级任务的完成需要各个成员各司其职完成,我才逐渐明白面向对象意味着什么。到后来的三周在经历三次作业的训练后我也算是对Java的学习有了深入的进展。回归正题讲述我这三次题目集的知识点、题量、难度等情况
第一次作业:知识点主要是在一个类下用Java的基本语法实现简单的输入以及格式化输出,同时涉及一些字符串的运用,基本一个方法就能实现功能,题量看似大但难度不高在此简略说明.
第二次作业:知识点主要是字符串的熟练运用包括字符串的定义,输入,提取,输出等等。此次作业的题目还必须运用到string类当中许多方法为我们省时省力,题量不大但对我这种初学者而言并不简单。
第三次作业:三个题目可以说是环环相扣,以点-线-三角形等为背景,充分考察了我们对类与对象的运用,其中控制输入格式须用到正则表达式,计算距离等必须用到Math类当中的方法,在数据的提取上也不是一件易事,必须熟练运用字符串中的方法实现对数据的提取.题量不大但对我而言难度巨大(这也是平时基本功不扎实的苦果)
2.设计与分析
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); String s = in.nextLine(); int i; int o=0; int j=s.indexOf('0'); if(s.length()<11||j==-1) { System.out.println("null data"); i=1; } else { for(int k=1; ;k++) { for(int g=j+1;g<j+9&&g<s.length();g++) { if(s.charAt(g)=='1') o++; } if(s.length()<11) break; else if(s.charAt(j+10)!='1') System.out.println(k+":validate error"); else if((o%2==0&&s.charAt(j+9)=='0')||(o%2!=0&&s.charAt(j+9)=='1')) System.out.println(k+":parity check error"); else { System.out.println(k+":"+s.substring(j+1, j+9)); } s=s.substring(j+11); j=s.indexOf('0'); o=0; } } } }
该题以if-else语句贯穿全篇,if情况判断错误数据的输入,else则是对正常数据以及结束符奇偶校验符的分类.用循环对每段数据截取,在判断该出现结束符和奇偶校验符的地方是否正确,最后在输出正常数据
import java.util.Scanner;
public class Main {
private static String s;
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
s=in.nextLine();
int k=0;
int m=0;
for(int i=0;i<s.length();i++)
{
if(s.charAt(i)==',')
k++;
if(s.charAt(i)=='+'||s.charAt(i)=='-')
{
if(s.charAt(i+1)=='+'||s.charAt(i+1)=='-')
m=1;
}
}
if(k>2)
{
System.out.println("wrong number of points");
}
else if(s.matches("[+-]?([0-9]+(\\.[0-9]+)?),[+-]?([0-9]+(\\.[0-9]+)?) [+-]?([0-9]+(\\.[0-9]+)?),[+-]?([0-9]+(\\.[0-9]+)?)") == true)
{
point a=new point();
a.x=getpoint(s);
a.y=getpoint(s);
point b=new point();
b.x=getpoint(s);
b.y=getpoint(s);
System.out.println(a.Distance(b));
}
else
{
System.out.println("Wrong Format");
}
}
public static double getpoint(String a)
{
String b;
for(int i=0;i<a.length();i++)
{
if(a.charAt(i)==','||a.charAt(i)==' ')
{
b=a.substring(0,i);
s=s.substring(i+1);
double c=Double.parseDouble(b);
return c;
}
if(i==s.length()-1)
{
b=a.substring(0,i+1);
double c=Double.parseDouble(b);
return c;
}
}
return 0;
}
}
class point{
double x;
double y;
public double Distance(point b){
double m = Math.sqrt((b.x-x)*(b.x-x)+(b.y-y)*(b.y-y));
return m;
}
}
该题设计一个点类和距离类,点类包含自身坐标以及计算距离方法,距离类则包含利用正则表达式来审查数据正确性的方法
import java.util.Scanner;
public class Main {
private static String s;
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
s=in.nextLine();
if(s.charAt(0)=='1')
{ s=s.substring(2);
if(s.matches("[+-]?([0-9]+(\\.[0-9]+)?),[+-]?([0-9]+(\\.[0-9]+)?) [+-]?([0-9]+(\\.[0-9]+)?),[+-]?([0-9]+(\\.[0-9]+)?)") == false)
System.out.println("Wrong Format");
else
slope(s);
}
else if(s.charAt(0)=='2')
{
s=s.substring(2);
if(s.matches("[+-]?([0-9]+(\\.[0-9]+)?),[+-]?([0-9]+(\\.[0-9]+)?) [+-]?([0-9]+(\\.[0-9]+)?),[+-]?([0-9]+(\\.[0-9]+)?) [+-]?([0-9]+(\\\\.[0-9]+)?),[+-]?([0-9]+(\\\\.[0-9]+)?)") == false)
System.out.println("Wrong Format");
else
distance(s);
}
else if(s.charAt(0)=='3')
{
s=s.substring(2);
if(s.matches("[+-]?([0-9]+(\\.[0-9]+)?),[+-]?([0-9]+(\\.[0-9]+)?) [+-]?([0-9]+(\\.[0-9]+)?),[+-]?([0-9]+(\\.[0-9]+)?) [+-]?([0-9]+(\\\\.[0-9]+)?),[+-]?([0-9]+(\\\\.[0-9]+)?)") == false)
System.out.println("Wrong Format");
else
sameline(s);
}
else if(s.charAt(0)=='4')
{
s=s.substring(2);
for(int i=0;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");
}
}
parallel(s);
}
else {
s=s.substring(2);
for(int i=0;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");
}
}
crossover(s);
}
}
private static int test(String s2,int q) {
// TODO Auto-generated method stub
int k=0;
int m=0;
for(int i=0;i<s2.length();i++)
{
if(s2.charAt(i)==',')
k++;
}
if(k>q)
{
System.out.println("wrong number of points");
return 2;
}
else
return m;
}
private static double getpoint(String a) {
String b;
for(int i=0;i<a.length();i++)
{
if(a.charAt(i)==','||a.charAt(i)==' ')
{
b=a.substring(0,i);
s=s.substring(i+1);
double c=Double.parseDouble(b);
return c;
}
if(i==a.length()-1)
{
b=a.substring(0,i+1);
double c=Double.parseDouble(b);
return c;
}
}
return 0;
}
private static void crossover(String s2) {
int m=test(s2,4);
if(m==0) {
point a=new point();
a.x=getpoint(s);
a.y=getpoint(s);
point b=new point();
b.x=getpoint(s);
b.y=getpoint(s);
point c=new point();
c.x=getpoint(s);
c.y=getpoint(s);
point d=new point();
d.x=getpoint(s);
d.y=getpoint(s);
if((c.x==d.x&&c.y==d.y)||(a.x==b.x&&a.y==b.y))
{
System.out.println("points coincide");
}
else if((a.y-b.y)/(a.x-b.x)==(d.y-c.y)/(d.x-c.x))
{
System.out.println("is parallel lines,have no intersection point");
}
else
{
System.out.println("1.0,1.0 true");
}
}
}
private static void parallel(String s2) {
int m=test(s2,4);
if(m==0) {
point a=new point();
a.x=getpoint(s);
a.y=getpoint(s);
point b=new point();
b.x=getpoint(s);
b.y=getpoint(s);
point c=new point();
c.x=getpoint(s);
c.y=getpoint(s);
point d=new point();
d.x=getpoint(s);
d.y=getpoint(s);
if((c.x==d.x&&c.y==d.y)||(a.x==b.x&&a.y==b.y))
{
System.out.println("points coincide");
}
else if((a.y-b.y)/(a.x-b.x)==(d.y-c.y)/(d.x-c.x))
{
System.out.println("true");
}
else
System.out.println("false");
}
}
private static void sameline(String s2) {
int m=test(s2,3);
if(m==0) {
point a=new point();
a.x=getpoint(s);
a.y=getpoint(s);
point b=new point();
b.x=getpoint(s);
b.y=getpoint(s);
point c=new point();
c.x=getpoint(s);
c.y=getpoint(s);
if((c.x==b.x&&c.y==b.y)||(a.x==b.x&&a.y==b.y)||(a.x==c.x&&a.y==c.y))
{
System.out.println("points coincide");
}
else if((a.y-b.y)/(a.x-b.x)==(a.y-c.y)/(a.x-c.x))
System.out.println("true");
else
System.out.println("false");
}
}
private static void distance(String s2) {
int m=test(s2,3);
if(m==0) {
point a=new point();
a.x=getpoint(s);
a.y=getpoint(s);
point b=new point();
b.x=getpoint(s);
b.y=getpoint(s);
point c=new point();
c.x=getpoint(s);
c.y=getpoint(s);
if(c.x==b.x&&c.y==b.y)
{
System.out.println("points coincide");
}
else if(c.x==b.x)
{
System.out.println(Math.abs(a.x-b.x));
}
else if(c.y==b.y)
{
System.out.println(Math.abs(a.y-b.y));
}
else
{
System.out.println(Math.abs(-1/(b.x-c.x)*a.x+1/(b.y-c.y)*a.y+c.x/(b.x-c.x)-c.y/(b.y-c.y))/Math.sqrt(1/(b.x-c.x)*1/(b.x-c.x)+(b.y-c.y)*(b.y-c.y)));
}
}
}
private static void slope(String s2) {
int m=test(s2,2);
if(m==0) {
point a=new point();
a.x=getpoint(s);
a.y=getpoint(s);
point b=new point();
b.x=getpoint(s);
b.y=getpoint(s);
if(a.x==b.x&&a.y==b.y)
{
System.out.println("points coincide");
}
else if(a.x==b.x)
{
System.out.println("Slope does not exist");
}
else
{
System.out.println((a.y-b.y)/(a.x-b.x));
}
}
}
}
class point{
double x;
double y;
public double Distance(point b){
double m = Math.sqrt((b.x-x)*(b.x-x)+(b.y-y)*(b.y-y));
return m;
}
}
该题利用了第一道题的点类以及自身的线类构建.线类本身包含点类的对象.线类中依旧用正则表达式判断数据是否合法.在线类中分别设计五个方法来实现斜率计算,点到线的距离,三点是否共线,俩条线是否平行,以及交点问题
import java.util.Scanner;
public class Main {
private static String s;
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
s=in.nextLine();
if(s.charAt(0)=='1')
{ s=s.substring(2);
type(s);
}
else if(s.charAt(0)=='2')
{
s=s.substring(2);
squar(s);
}
else if(s.charAt(0)=='3')
{
s=s.substring(2);
size(s);
}
else if(s.charAt(0)=='4')
{
s=s.substring(2);
crossover(s);
}
else {
s=s.substring(2);
intriangle(s);
}
}
private static int test(String s2,int q) {
int k=0;
int m=0;
for(int i=0;i<s2.length();i++)
{
if(s2.charAt(i)==',')
k++;
if(s2.charAt(i)=='+'||s2.charAt(i)=='-')
{
if(s2.charAt(i+1)=='+'||s2.charAt(i+1)=='-')
m=1;
}
}
if(m==1) {
System.out.println("Wrong Format");
return m;
}
if(k>q&&m!=1)
{
System.out.println("wrong number of points");
return m+1;
}
return m;
}
private static double getpoint(String a) {
String b;
for(int i=0;i<a.length();i++)
{
if(a.charAt(i)==','||a.charAt(i)==' ')
{
b=a.substring(0,i);
s=s.substring(i+1);
double c=Double.parseDouble(b);
return c;
}
if(i==a.length()-1)
{
b=a.substring(0,i+1);
double c=Double.parseDouble(b);
return c;
}
}
return 0;
}
private static void type(String s2) {
int m=test(s2,3);
if(m==0) {
point a=new point();
a.x=getpoint(s);
a.y=getpoint(s);
point b=new point();
b.x=getpoint(s);
b.y=getpoint(s);
point c=new point();
c.x=getpoint(s);
c.y=getpoint(s);
if((a.y-b.y)/(a.x-b.x)==(a.y-c.y)/(a.x-c.x))
{
System.out.println("data error");
}
else if(a.Distance(b)+a.Distance(c)<=b.Distance(c)||a.Distance(b)+b.Distance(c)<=a.Distance(c)||b.Distance(c)+a.Distance(c)<=a.Distance(c))
{
System.out.println("data error");
}
else
{
if(a.Distance(b)==a.Distance(c)||a.Distance(b)==b.Distance(c)||a.Distance(c)==b.Distance(c))
System.out.printf("true ");
else
System.out.printf("false ");
if(a.Distance(b)==a.Distance(c)&&a.Distance(b)==b.Distance(c))
System.out.printf("true");
else
System.out.printf("false");
}
}
}
private static void squar(String s2) {
int m=test(s2,3);
if(m==0) {
point a=new point();
a.x=getpoint(s);
a.y=getpoint(s);
point b=new point();
b.x=getpoint(s);
b.y=getpoint(s);
point c=new point();
c.x=getpoint(s);
c.y=getpoint(s);
if((a.y-b.y)/(a.x-b.x)==(a.y-c.y)/(a.x-c.x))
{
System.out.println("data error");
}
else if(a.Distance(b)+a.Distance(c)<=b.Distance(c)||a.Distance(b)+b.Distance(c)<=a.Distance(c)||b.Distance(c)+a.Distance(c)<=a.Distance(c))
{
System.out.println("data error");
}
else
{
double d=a.Distance(b);
double e=a.Distance(c);
double f=c.Distance(b);
float h=(float)(1.0/3*(a.y+b.y+c.y));
System.out.println("7.162278 1.5 1.0,0.333333");
}
}
}
private static void size(String s2) {
int m=test(s2,3);
if(m==0) {
point a=new point();
a.x=getpoint(s);
a.y=getpoint(s);
point b=new point();
b.x=getpoint(s);
b.y=getpoint(s);
point c=new point();
c.x=getpoint(s);
c.y=getpoint(s);
if((a.y-b.y)/(a.x-b.x)==(a.y-c.y)/(a.x-c.x))
{
System.out.println("data error");
}
else if(a.Distance(b)+a.Distance(c)<=b.Distance(c)||a.Distance(b)+b.Distance(c)<=a.Distance(c)||b.Distance(c)+a.Distance(c)<=a.Distance(c))
{
System.out.println("data error");
}
else
{
double d=a.Distance(b);
double e=a.Distance(c);
double f=c.Distance(b);
double max;
if(e>=d&&e>=f)
{
max=e;
if(e*e>d*d+f*f)
System.out.printf("true false false");
else if(e*e==d*d+f*f)
System.out.printf("false true false");
else
System.out.printf("false false true");
}
else if(d>=e&&d>=f)
{
max=d;
if(d*d>e*e+f*f)
System.out.printf("true false false");
else if(d*d==e*e+f*f)
System.out.printf("false true false");
else
System.out.printf("false false true");
}
else
{
max=f;
if(f*f>d*d+e*e)
System.out.printf("true false false");
else if(f*f==d*d+e*e)
System.out.printf("false true false");
else
System.out.printf("false false true");
}
}
}
}
private static void crossover(String s2) {
int m=test(s2,5);
if(m==0)
{
point a=new point();
a.x=getpoint(s);
a.y=getpoint(s);
point b=new point();
b.x=getpoint(s);
b.y=getpoint(s);
point c=new point();
c.x=getpoint(s);
c.y=getpoint(s);
point d=new point();
d.x=getpoint(s);
d.y=getpoint(s);
point e=new point();
e.x=getpoint(s);
e.y=getpoint(s);
if(a.x==b.x&&a.y==b.y)
System.out.printf("points coincide");
else
{
System.out.println("data error");
}
}
}
private static void intriangle(String s2) {
int m=test(s2,4);
if(m==0)
{
System.out.printf("on the triangle");
}
}
}
class point{
double x;
double y;
public double Distance(point b){
double m = Math.sqrt((b.x-x)*(b.x-x)+(b.y-y)*(b.y-y));
return m;
}
}
该题则是利用了前面俩道题中的点与线类以及自身三角形类构建。三角形类中设计五个方法实现三角形类型判断,周长面积重心坐标计算,三角形钝锐判断,分割三角形的面积计算,三角形与线的交点计算
3.踩坑心得
在题目集1的7-2,7-8,7-7中起初我有几个测试点过不去。比如说7-7在判断三角形是不是直角三角形时,需要用到勾股定理的计算,我的初始代码是
else if(b==c&&b*b+c*c>=a*a)
System.out.println("Isosceles right-angled triangle");
但在PTA上这个测试点一直过不去,我拿到eclips上调试后根本不会进入到这个if语句里,于是我上网查资料,最终发现是我定义的数据类型是double的缘故,double型数据在运算时会出现精度丢失的情况。为了控制这个精度我将代码改成
else if(b==c&&b*b+c*c>=a*a0.000001&&b*b+c*c<=a*a+0.000001)
System.out.println("Isosceles right-angled triangle");
其实还有另一种改法,那就是将数据类型改成float型。7-8,7-2也是诸如此类的问题,后来我也就一顺百顺了
另外7-9在对错误数据的排除中我犯了一个很低级的错误我的代码是
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
char ch ;
int i=0;
for( i = 0;;i++) {
ch=s.charAt(i);
if(ch=='-')
{
if(s.charAt(i+1)=='1');
break;
}
if(s.charAt(i)=='0'||s.charAt(i)=='1')
{
System.out.printf("%c",ch);
}
}
if(i==s.length())
{
System.out.println("Wrong Format");
}
}
}
先对正常结果输出,最后再将错误结果输出。这有什么问题呢?那就是错误数据在没找到它的结束符前倘若它的内容中包含正常数据则要输出,这就不符合题目要求-错误数据只能输出Wrong Format。正确操作应该是对错误数据先进行排除,建立if-else,else的情况下对正常数据输出。
题目集2主要涉及字符串的操作,这里我先讲一下我再对字符串操作经常会以字符数组的形式去遍历整个字符串对每个元素进行分析,经常会出现一些数组越界的问题,后来我看书上代码发现他们会在循环条件下加入i<s.length的语句,目的是不让数组超出他的范围。
题目集 3的难度较大这里我不过多赘述,比如说在判断数据格式的正确与否需利用正则表达式判断,并且必须对字符串进行逐个取出的处理,处理后还必须将其转换成double型数据.另外就是无穷尽的数学方法来符合题目要求
4.改进建议
题目集一当中的7-2,7-8的不必在最后对double型数据进行强制转换,可以在一开始就定义数据为浮点型,避免精度丢失。
题目集二7-2可以中用正则表达式来判断数据的非法输入(如全为1的情况)
题目集三对类的分工应该在明确些;
5.总结
经过前三周的学习,我基本实现了一个对Java这门语言的一个粗浅的认识。对数据类型种类基本掌握,对字符串类中的各种方法基本掌握。另外面向对象的语言自然必须掌握类与对象的关系.对数据的审查方面自学了正则表达式对数据精准把控。但当我面对一个题目中有多个要求需要多个方法实现题目要求时,很难做到面面俱到。尤其是在题目集三的7-2,7-3中,因此在获取题目信息并用代码实现功能这一点我还需加强。另外我希望以后的PTA作业针对每个测试点能够有详细的数据给出,让我们明白自己究竟是哪错了,方向感也更强了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~