BLOG-2
import java.util.Scanner;
public class Main{
public static void main(String[] args){
int[] num=new int[20];
int x=0,da=0;
String[] a= new String[15];
Scanner in = new Scanner(System.in);
for(x=0;;x++){
a[x]=in.nextLine();
if(a[x].equals("end")==true){
break;
}
}
for(int i=0;i<x;i++){
String c[]=a[i].split("\\D+");
for(int j=0;j<c.length;j++){
if (!c[j].equals("")){
da=Integer.parseInt(c[j]);
num[i]=num[i]+da;
}
}
}
for(int i=0;i<x-1;i++){
System.out.println(num[i]);
}
System.out.print(num[x-1]);
}
}
在这一题做法:首先创建一个长度相对较大的字符串数组,然后用for循环接受字符串,遇到“end”终止循环。然后用for循环和String c[]=a[i].split("\\D+")提取出每个字符串中的有用数据,最后进行加法运算得出答案。
踩坑心得:在提交过程中出现过答案只显示一行的情况,在调试中才发现是条件语句if (!c[j].equals(""))漏掉导致的。
改进建议:无。

PTA大作业四7-2源码:
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
String a=new String();
a=in.nextLine();
int num=0;
int x=0;
float[] point=new float[8];
if(a.substring(1,2).equals(":")==false||(a.substring(0,1).equals("1")==false&&a.substring(0,1).equals("2")==false&&a.substring(0,1).equals("3")==false&&a.substring(0,1).equals("4")==false)){
System.out.print("Wrong Format");
return ;
}
for(int i=0;i+2<a.length();i++){
if(a.substring(i,i+2).equals("++")==true||a.substring(i,i+2).equals("+-")==true||a.substring(i,i+2).equals("-+")==true||a.substring(i,i+2).equals("--")==true){
System.out.print("Wrong Format");
return ;
}
}
for(int i=0;i+1<a.length();i++){
if(a.substring(i,i+1).equals(",")){
num++;
}
}
if(num!=4&&a.substring(0,1).equals("4")==false||num!=6&&a.substring(0,1).equals("4")==true){
System.out.print("wrong number of points");
return ;
}
String b[]=a.substring(2,a.length()).split(" ");
for(int i=0;i<b.length;i++,x=x+2){
String c[]=b[i].split(",");
point[x]=Integer.parseInt(c[0]);
point[x+1]=Integer.parseInt(c[1]);
}
if((point[0]==point[2]&&point[1]==point[3])||(point[0]==point[4]&&point[1]==point[5])||(point[0]==point[6]&&point[1]==point[7])||(point[2]==point[4]&&point[3]==point[5])||(point[2]==point[6]&&point[3]==point[7])||(point[4]==point[6]&&point[5]==point[7])){
System.out.print("points coincide");
return ;
}
else{
if(a.substring(0,1).equals("1")){
section1(point);
return ;
}
if(a.substring(0,1).equals("2")){
section2(point);
return ;
}
if(a.substring(0,1).equals("3")){
section3(point);
return ;
}
if(a.substring(0,1).equals("4")){
section4(point);
return ;
}
}
}
public static void section1(float[] point){
float k=(point[1]-point[3])/(point[0]-point[2]);
float b=point[1]-point[0]*k;
if(point[5]==k*point[4]+b||point[7]==k*point[6]+b){
System.out.print("false false");
return ;
}
else{
System.out.print("true ");
if((point[1]-point[3])/(point[0]-point[2])==(point[5]-point[7])/(point[4]-point[6])){
System.out.print("true");
}
else{
System.out.print("false");
return ;
}
}
}
public static void section2(float[] point){
float k=(point[1]-point[3])/(point[0]-point[2]);
float b=point[1]-point[0]*k;
if(point[5]==k*point[4]+b||point[7]==k*point[6]+b){
System.out.print("not a quadrilateral");
return ;
}
if(point[0]-point[2]==0&&point[4]-point[6]==0&&((point[1]-point[3])*(point[1]-point[3])+(point[0]-point[2])*(point[0]-point[2])==(point[5]-point[7])*(point[5]-point[7])+(point[4]-point[6])*(point[4]-point[6]))){
if((point[1]-point[3])*(point[1]-point[3])+(point[0]-point[2])*(point[0]-point[2])==(point[1]-point[7])*(point[1]-point[7])+(point[0]-point[6])*(point[0]-point[6])){
if(point[1]-point[7]==0){
System.out.print("true true true");
return ;
}
else{
System.out.print("true false false");
return ;
}
}
else{
if(point[1]-point[7]==0){
System.out.print("false true false");
return ;
}
}
}
else{
System.out.print("false false false");
return ;
}
if((point[1]-point[3])/(point[0]-point[2])==(point[5]-point[7])/(point[4]-point[6])&&((point[1]-point[3])*(point[1]-point[3])+(point[0]-point[2])*(point[0]-point[2])==(point[5]-point[7])*(point[5]-point[7])+(point[4]-point[6])*(point[4]-point[6]))){
if((point[1]-point[3])*(point[1]-point[3])+(point[0]-point[2])*(point[0]-point[2])==(point[1]-point[7])*(point[1]-point[7])+(point[0]-point[6])*(point[0]-point[6])){
if(((point[1]-point[3])/(point[0]-point[2]))*((point[1]-point[7])/(point[0]-point[6]))==-1){
System.out.print("true true true");
return ;
}
else{
System.out.print("true false false");
return ;
}
}
else{
if(((point[1]-point[3])/(point[0]-point[2]))*((point[1]-point[7])/(point[0]-point[6]))==-1){
System.out.print("false true false");
return ;
}
}
}
else{
System.out.print("false false false");
return ;
}
}
public static void section3(float[] point){
float k=(point[1]-point[3])/(point[0]-point[2]);
float b=point[1]-point[0]*k;
if(point[5]==k*point[4]+b||point[7]==k*point[6]+b){
System.out.print("not a quadrilateral");
return ;
}
}
public static void section4(float[] point){
System.out.print("The line is coincide with one of the lines");
}
}
在这一题的做法:首先是用正则表达式提取出有用数据,然后根据每个选择的要求设计相应算法,最后输出结果。
踩坑新得:在做这题的时候,即使给的例子都可以得出相应正确答案,但还是有部分得分点未得到,总是要考虑各种特殊情况来输入相应例子检测,并根据输出结果修改程序。
改进建议:在这一题应该采用多个类的方式来编码,这样浏览起来更加轻松直观。

PTA大作业四7-3源码:
import java.util.Scanner;
public class Main{
public static void main(String[] args){
String a=new String();
String b=new String();
Scanner in = new Scanner(System.in);
float cun=0,qu=0,yu=0;
int x=0;
a=in.nextLine(); //111
x=a.indexOf(" ");
welcome();
b=in.nextLine(); //222
cun=(float)Integer.parseInt(b.substring(7,b.length()));
System.out.println("您的余额有"+cun+"元。");
b=in.nextLine(); //333
if(a.substring(x+1,a.length()).equals(b.substring(0,6))==false){
System.out.println("您的密码错误!");
}
b=in.nextLine(); //444
qu=(float)Integer.parseInt(b.substring(7,b.length()));
if(cun<qu){
System.out.println("您的余额不足!");
}
b=in.nextLine(); //555
qu=(float)Integer.parseInt(b.substring(7,b.length()));
yu=cun-qu;
System.out.println("请取走钞票,您的余额还有"+yu+"元。");
System.out.print("请收好您的证件和物品,欢迎您下次光临!");
}
public static void welcome(){
System.out.println("中国银行欢迎您的到来!");
}
}
在这一题的做法,完全按照题目要求对字符串进行输入输出,截取字符串并做计算比较。
踩坑心得:无。
改进建议:无。

21级软件工程专业期中考试(OOP)7-1源码:
import java.util.Scanner;
import java.util.InputMismatchException;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int x=0;
try {
Point p1 = new Point(in.nextDouble(), in.nextDouble());
Point p2 = new Point(in.nextDouble(), in.nextDouble());
x=panduan(p1);
if(x==1) {
System.out.println("Wrong Format");
return ;
}
x=panduan(p2);
if(x==1) {
System.out.println("Wrong Format");
return ;
}
Line l = new Line(p1, p2, in.next());
l.display();
in.close();
} catch (InputMismatchException ex) {
System.out.println("Wrong Format");
}
}
private static int panduan(Point p1) {
if(String.valueOf(p1.getX()).length()-String.valueOf(p1.getX()).indexOf(".")-1>=3&&String.valueOf(p1.getX()).indexOf(".")!=-1) {
return 1;
}
if(String.valueOf(p1.getY()).length()-String.valueOf(p1.getY()).indexOf(".")-1>=3&&String.valueOf(p1.getX()).indexOf(".")!=-1) {
return 1;
}
return 0;
}
}
class Point{
private double x=0;
private double y=0;
public Point(double x,double y) {
setX(x);
setY(y);
}
public Point() {
}
public double getX() {
return x;
}
public double getY() {
return y;
}
public void setX(double x) {
this.x=x;
}
public void setY(double y) {
this.y=y;
}
public void display() {
System.out.printf("(%.2f,%.2f)\n",x,y);
}
}
class Line {
private Point point1 = new Point();
private Point point2 = new Point();
private String color = new String();
Line(){
}
Line(Point p1,Point p2,String color){
setpoint1(p1);
setpoint2(p2);
setcolor(color);
}
public void setcolor(String color) {
this.color=color;
}
public void setpoint2(Point p2) {
this.point2=p2;
}
public void setpoint1(Point p1) {
this.point1=p1;
}
public Point getPoint1() {
return point1;
}
public Point getPoint2() {
return point2;
}
public String getColor() {
return color;
}
public double getDistance() {
return Math.sqrt(Math.pow(point1.getX()-point2.getX(),2)+Math.pow(point1.getY()-point2.getY(),2));
}
public void display() {
System.out.println("The line's color is:"+color);
System.out.println("The line's begin point's Coordinate is:");
point1.display();
System.out.println("The line's end point's Coordinate is:");
point2.display();
System.out.printf("The line's length is:%.2f",this.getDistance());
}
}
这一题的做法:按照所给类图来编码。
踩坑心得:通过输入特定数据查看结果,并借此修改代码,如输入格式错误时让代码增加try-catch语句来规避。
改进建议:无。

由于21级软件工程专业期中考试(OOP)7-2和7-3是在7-1的基础上来编码的,这里就不粘贴源码了,7-2要注意抽象类的使用,7-3要注意容器类的用法,踩坑心得同7-1,改进建议无。
超星作业实验一第一题源码:
import java.util.Random;
import java.util.Scanner;
public class Text1_1 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String[] stu=new String[30];
String[] ID=new String[30];
System.out.println("请输入学生姓名:");
String name=in.nextLine();
System.out.println("请输入学生学号:");
String id=in.nextLine();
double[][] score = new double[30][4];
double[] score1 = new double[4];
double[] pingjun = new double[30];
double[] highping_fen =new double[2];
double quanping;
double pingjun1;
double highfen1;
int x;
sc(stu,ID,score,pingjun);
x=select(highping_fen,pingjun,score,stu);
quanping=quanping(pingjun);
System.out.println("请输入四门课的成绩,以空格分隔:");
sc1(score1);
for(int i=0;i<4;i++) {
if(score1[i]>100) {
System.out.println("课程成绩不能高于100分!!");
return ;
}
}
pingjun1=pingjun1(score1);
highfen1=highfen1(score1);
print(name,id,pingjun1,highfen1,highping_fen,quanping,x,stu,ID);
}
private static void print(String name, String id, double pingjun1, double highfen1, double[] highping_fen, double quanping, int x, String[] stu, String[] ID) {
System.out.printf("%s(ID:%s)平均分%.2f最高分%.2f\n",name,id,pingjun1,highfen1);
if(pingjun1>highping_fen[0]) {
System.out.println(name.substring(0,4)+"现在是班上成绩最好的学生了");
System.out.println(name.substring(0,4)+"的平均成绩高于全班的平均分");
}
else {
System.out.printf("%s(ID:%s)平均分%.2f最高分%.2f\n",stu[x],ID[x],highping_fen[0],highping_fen[1]);
if(pingjun1>quanping) {
System.out.println(name.substring(0,4)+"的平均成绩高于全班的平均分");
}
if(pingjun1<quanping) {
System.out.println(name.substring(0,4)+"的平均成绩低于全班的平均分");
}
}
}
private static double highfen1(double[] score1) {
double max=0;
for(int i=0;i<4;i++) {
if(max<score1[i]) {
max=score1[i];
}
}
return max;
}
private static double pingjun1(double[] score1) {
double sum=0,pingjun1;
for(int i=0;i<4;i++) {
sum=sum+score1[i];
}
pingjun1=sum/4;
return pingjun1;
}
private static void sc1(double[] score1) {
Scanner in = new Scanner(System.in);
for(int i=0;i<4;i++) {
score1[i] = in.nextDouble();//新同学成绩
}
in.close();
}
private static int select(double[] highping_fen, double[] pingjun, double[][] score, String[] stu) {
int x = 0;
for(int i=0;i<30;i++) {
if(highping_fen[0]<pingjun[i]) {
highping_fen[0]=pingjun[i];
x=i;
}
}
for(int i=0;i<4;i++) {
if(highping_fen[1]<score[x][i]) {
highping_fen[1]=score[x][i];
}
}
return x;
}
private static double quanping(double[] pingjun) {
double sum=0,quanping;
for(int i=0;i<30;i++) {
sum=sum+pingjun[i];
}
quanping=sum/30;
return quanping;
}
static void sc(String[] stu, String[] ID, double[][] score, double[] pingjun) {
String table1="qwertyuiopasdfghjklzxcvbnm ";
String table2="1234567890 ";
int x=0,y=0;
double sum=0;
for(int i=0;i<30;i++) {
stu[i]="";
for(int j=0;j<4;j++) {
x=(int)(Math.random()*27);
stu[i]=stu[i].concat(table1.substring(x, x+1));//生成姓名
}
}
for(int i=0;i<30;i++) {
ID[i]="";
for(int j=0;j<8;j++) {
y=(int)(Math.random()*11);
ID[i]=ID[i].concat(table2.substring(y,y+1));//生成学号
}
}
for(int i=0;i<30;i++) {
for(int j=0;j<4;j++) {
score[i][j]=(float) (Math.random()*100000%100);//生成成绩
sum=sum+score[i][j];
}
pingjun[i]=sum/4;//求单个学生平均成绩
sum=0;
}
}
}
这一题的做法:建立多个数组,用for循环和random()函数取得所需数据,然后用条件语句和for语句比较数据,得出答案。
踩坑心得:多多注意for循环的取值范围,小心数组越界。
改进建议:增加一个学生类可以使程序更简洁清楚。

超星作业实验一第二题源码:
import java.util.Scanner;
/**
* 分数的四则运算测试类
*/
public class FractionalCalculator {
public static void main(String[] args) {
// 输入分数内容和运算符
Scanner input = new Scanner(System.in);
System.out.println("请分部输入表达式");
System.out.println("请输入参数1的分子:");
String data1 = input.nextLine();
System.out.println("请输入参数1的分母:");
String data2 = input.nextLine();
System.out.println("请输入运算符(+-*/) :");
String operation = input.nextLine();
System.out.println("请输入参数2的分子:");
String data3 = input.nextLine();
System.out.println("请输入参数2的分母:");
String data4 = input.nextLine();
// 运算并输出
Calculator cal = new Calculator();
System.out.println("运算结果为:");
cal.compute(data1, data2, operation, data3, data4);
}
}
/**
* 分数的四则运算类输入:两个以字符串构成的分数,输出其相加的结果,结果仍以分数行式表示。
*/
class Calculator {
int numerator; // 分子
int denominator; // 分母
/**设置分子分母
* 输入:正整数
* 输出:最简分数式,分子分母不包含公约数
*/
void setNumeratorAndDenominator(int data1_2, int data1_22){ // 设置分子和分母
int c = gcd(data1_2,data1_22); // 计算最大公约数
numerator = (data1_2 / c);
denominator = data1_22 / c;
}
int getNumerator() {
return numerator;
}
int getDenominator() {
return denominator;
}
/*
* greatest common divisor 求两整数最大公约数, 输入:两正整数a,b 输出:最大公约数b
*/
int gcd(int data1_2, int data1_22) {
if (data1_2 < data1_22) {
int c = data1_2;
data1_2 = data1_22;
data1_22 = c;
}
int r = data1_2 % data1_22;
int aa=data1_22;
while (r != 0) {
aa--;
if(data1_22%aa==0) {
r=data1_2%aa;
}
if(r==0) {
data1_22=aa;
}
}
return data1_22;
}
Calculator add(Calculator r) { // 加法运算
int a = r.getNumerator();
int b = r.getDenominator();
int newNumerator = numerator * b + denominator * a;
int newDenominator = denominator * b;
Calculator result = new Calculator();
result.setNumeratorAndDenominator(newNumerator, newDenominator);
return result;
}
Calculator jian(Calculator r) { // 减法运算
int a = r.getNumerator();
int b = r.getDenominator();
int newNumerator = numerator * b - denominator * a;
int newDenominator = denominator * b;
Calculator result = new Calculator();
result.setNumeratorAndDenominator(newNumerator, newDenominator);
return result;
}
// 转化输入格式,判断并输出运算结果
public void compute(String data1, String data2, String operation, String data3, String data4) {
int data1_1 = Math.abs(Integer.parseInt(data1));
int data1_2 = Math.abs(Integer.parseInt(data2));
int data2_1 = Math.abs(Integer.parseInt(data3));
int data2_2 = Math.abs(Integer.parseInt(data4));
Calculator r1 = new Calculator();
r1.setNumeratorAndDenominator(data1_1, data1_2);
Calculator r2 = new Calculator();
r2.setNumeratorAndDenominator(data2_1, data2_2);
Calculator result = new Calculator();
int a, b;
if (operation.equals("+")) {
result = r1.add(r2);
a = result.getNumerator();
b = result.getDenominator();
System.out.println(
data1 + "/" + data2 + " " + operation + " " + data3 + "/" + data4 + " = " + a + "/" + b);
}
}
}
这一题的做法:先浏览一遍要修正的代码,将其中明显的语法错误(变量声明位置错误,变量类型及所用函数错误,“{}“不规范的错误)改正,并将其中的逻辑错误(最大公约数的方法错误)改正。
踩坑心得:无。
改进建议:无。

总结
通过该阶段的学习,我学到了如何用正则表达式来提取字符串中的信息,类与类之间如何来用继承关系,同时封装类的属性,降低类与类之间的耦合性。在关于容器和抽象类的知识和用法我还有些不熟悉,需要进一步学习和研究。对于作业,我还是希望老师能在PTA的作业中把得分点的详细情况标出,不然一个一个猜得分点太耗费时间了。
浙公网安备 33010602011771号