21201617-刘展睿-第二次blog作业
一:前言:
第四次作业
知识点:第一题考察对输入字符串进行数字提取并进行计算等知识;第二题考察的知识点较多,主要是与之前三角形类相接轨,在原先的基础上,又涉及继承与多态等新知识点;第三题则是考察属性与方法的类型,比如:public private等。
题量:较少。
难度:第一题和第三题难度较小,第二题的难度较大。
期中考试
知识点:第一题考察类的设计;第二题考察继承与多态;第三题主要考察容器类的知识。
题量:较少。
难度:相对于这几次大作业来说,这次期中考试的难度较小。
第五次作业
知识点:这两题考察了字符串格式判断,转换;以及利用继承与多态来将不同多边形的判断,计算统一等,还有对数据的处理等知识。
题量:较少。
难度:这次大作业是前几次大作业的“进阶”,不仅考察了对前几次点类,线类,三角形类,四边形类的重复利用;还增加了五边形类的设计,因为我之前类的设计并不是很合理,导致我需要对之前的类进行了一些修改,这增加了不少难度,同时需要在这里使用了继承与多态来简化代码,这对我来说也是一个不小的挑战。
二.设计与分析
期中考试第一题
设计一个类表示平面直角坐标系上的点Point,私有属性分别为横坐标x与纵坐标y,数据类型均为实型数,除构造方法以及属性的getter与setter方法外,定义一个用于显示信息的方法display(),用来输出该坐标点的坐标信息,格式如下:(x,y),数值保留两位小数。为简化题目,其中,坐标点的取值范围设定为(0,200]。若输入有误,系统则直接输出Wrong Format
三.package 期中考试;
import java.util.Scanner;
public class 第一题 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
double x1 = in.nextDouble();
double y1 = in.nextDouble();
double x2 = in.nextDouble();
double y2 = in.nextDouble();
String color = in.next();
Point p1 = new Point(x1, y1);
Point p2 = new Point(x2, y2);
Line line = new Line(p1, p2, color);
line.display();
in.close();
}
}
class Point {
private double x;
private double y;
public Point() {
}
public Point(double x, double y) {
this.x = x;
this.y = y;
}
public void setX(double x) {
this.x = x;
}
public double getX() {
return x;
}
public void setY(double y) {
this.y = y;
}
public double getY() {
return y;
}
public void display() {
System.out.println("("+String.format("%.2f",getX() )+","+String.format("%.2f",getY() )+")");
}
}
class Line {
private Point p1;
private Point p2;
private String color;
public Line() {
}
public Line(Point p1, Point p2, String color) {
this.p1 = p1;
this.p2 = p2;
this.color = color;
}
public void setPoint1(Point p1) {
this.p1 = p1;
}
public Point getPoint1() {
return p1;
}
public void setPoint2(Point p2) {
this.p2 = p2;
}
public Point getPoint2() {
return p2;
}
public double getDistance() {
double distance;
distance = Math.sqrt(Math.pow(p1.getX() - p2.getX(), 2) + Math.pow(p1.getY() - p2.getY(),2 ));
return distance;
}
public void display() {
if(p1.getX() > 0 && p1.getX() <=200 && p1.getY() > 0 && p1.getY() <= 200 && p2.getX() > 0 && p2.getX() <= 200 && p2.getY() > 0 && p2.getY() <=200) {
System.out.println("The line's color is:"+color);
System.out.println("The line's begin point's Coordinate is:");
p1.display();
System.out.println("The line's end point's Coordinate is:");
p2.display();
System.out.println("The line's length is:"+String.format("%.2f", getDistance()));
}
else {
System.out.println("Wrong Format");
}
}
}
这道题并不难,主要是类的设计,加深了我对类的理解,类与int、double、String这种的相似。
在第四题的第一题中需要用到动态数组加上正则表达式,把每一行的数字全部提取出来
第四次PTA作业:
1,3道题目是比较简单的,解决起来难度不大。下面是源码
第一题:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
boolean flag1 = true;
int i = 0;
int total = 0,temp;
String s =in.nextLine();
if(s.equals("end"))
flag1 = false;
while(flag1){
String[] s1 = s.split("\\D");
for(i = 0;i < s1.length;i++) {
if(!s1[i].equals("")) {
temp = Integer.parseInt(s1[i]);
total += temp;
}
}
System.out.println(total);
total = 0;
s =in.nextLine();
if(s.equals("end"))
flag1 = false;
}
}
}
第三题:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
BankBusiness account = new BankBusiness();
account.welcome();
account.setaccount(in.next(), in.next());
account.deposit(in.next(), in.nextDouble());
account.withdraw(in.next(), in.nextDouble());
account.withdraw(in.next(), in.nextDouble());
account.withdraw(in.next(), in.nextDouble());
account.welcomeNext();
}
}
class BankBusiness{
public static String bankName = "中国银行";
private String name;
private double balance;
private String password;
void welcome() {
System.out.println(bankName + "欢迎您的到来!");
}
void welcomeNext() {
System.out.println("请收好您的证件和物品,欢迎您下次光临!");
}
public void setaccount(String a ,String b) {
this.name = a;
this.password = b;
this.balance = 0;
}
public void deposit(String c, double d) {
if(this.password .equals(c)) {
this.balance += d;
System.out.println("您的余额有"+balance +"元。");
}
else {
System.out.println("您的密码错误!");
}
}
public void withdraw(String c, double d) {
if(this.password .equals(c)) {
if(this.balance < d) {
System.out.println("您的余额不足!");
}
else {
this.balance -= d;
System.out.println("请取走钞票,您的余额还有" + balance +"元。");
}
}
else {
System.out.println("您的密码错误!");
}
}
}
第二题的难度较高,解决起来比较复杂,如果类的设计不好的话,很容易会造成后面的选项越写越困难,甚至把自己也给绕进去,所以类的设计尽量做到单一职责。而且方法也要尽可能的可以多次调用,如果一个方法只能调用一次,只是徒有其表。
第五次作业的二道题
第一题还是比较好计算的,
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String str = in.nextLine();
if(num(str)==false)
{
System.out.print("wrong number of points");
}
else{
if(str.matches("^[+-]?(0|[1-9][\\d]{0,})(\\.[\\d]{1,})?[\\,][+-]?(0|[1-9][\\d]{0,})(\\.[\\d]{1,})?[\\s][+-]?(0|[1-9][\\d]{0,})(\\.[\\d]{1,})?[\\,][+-]?(0|[1-9][\\d]{0,})(\\.[\\d]{1,})?"))
这里运用正则表达式判断输的格式
将输入的内容先看做字符串然后用indexOf进行返回
{
int index = str.indexOf(' ');
String str0 = str.substring(0,index);
String str1 = str.substring(index+1,str.length());
Distance dis = new Distance(str0,str1);
dis.distance();
}
else
{
System.out.print("Wrong Format");
}
}
}
public static boolean num(String args) {
布偶类判断输入的合法性
int count=0;
for(int i=0;i<args.length();i++) {
{
if(args.charAt(i) == ' ')
count++;
}
if(count>=2)
return false;
}
return true;
}
}
class Distance
单独创建一个距离类来进行运算方便后面题目的运用{
String str1;
String str2;
public Distance(String str1, String str2)
{
this.str1 = str1;
this.str2 = str2;
}
//double num = Integer.parseInt(str1);
public double[] change(String s) {
double num[]= {0,0};
String str1="";
String str2="";
int index = s.indexOf(',');
for(int i=0;i<index;i++) {
if(s.charAt(i)>=48 && s.charAt(i)<=57||s.charAt(i)=='-'||s.charAt(i)=='.')
{
str1+=s.charAt(i);再创建一个类来将输入的代码提取出来,转化成我们需要的两个点
}
}
for(int i=index+1;i<s.length();i++) {
if(s.charAt(i)>=48 && s.charAt(i)<=57||s.charAt(i)=='-'||s.charAt(i)=='.')
{
str2+=s.charAt(i);
}
}
num[0] = Double.parseDouble(str1);这里就是进行把字符串的类型转化为浮点类型
num[1] = Double.parseDouble(str2);
return num;
}
public void distance() {
double d=0;
double[] sum1=change(str1);
double[] sum2=change(str2);
d = Math.sqrt(Math.pow(sum1[0]-sum2[0],2)+Math.pow(sum1[1]-sum2[1],2));//这里就是进行实际的计算操作返回值
System.out.print(d);
}
}
这题的大概思路就是你要创建一个点类,把输入的字符串按照格式要求后筛选,在把其转化成浮点类,在进行计算。
后面的第二题要求多一点,但是也要用到点类,我因为时间不够没有写出来,不过要创建好几个类, 点类,线类,然后进行判断平行的垂直,平行,当然,这三题是层层递进的,所以第三题也没有写出来,我觉得还是自己对类的定义调用,包括他们之间的关系,对成员变量,本地变量也不不够熟悉了解,还是得加强学习,而且时间也没有把控好,下次应该在发布后就写有时间思考
三.踩坑心得
1、在编写代码前要思考清楚,在这几次代码中我每一次都要对前一次代码进行修改,或解决一些bug,或简化一些步骤,尤其是最后一次,在原代码的基础上将其转换为继承与多态的形式,花费了较多的时间和精力。
2、在使用类时,比如String类,ArrayList类以及自己设计的类要注意是管理者而非拥有者,正如C语言中的指针,在涉及数据的更改时更需要注意,否则会产生很大的困扰。我在设计选项5和选项6时因为没有意识到这一点导致我将两个多边形的顶点分离时有一些我意料不到的错误,花费了较多的时间来解决它。下面附上解决后的部分代码:
四,改进建议
类的设计要更加的完善,先画好类图,每个部分要实现的功能,再去写,而不是想道哪就写到那,这样虽然可能会很快解决一些基础的问题,但是当这些问题稍微深入一点,解决起来就会非常的困难。
基础知识要稳固,写题要细心,做事不要急躁。
五.总结
这三次作业学到不少东西,当然这也只是皮毛,但是基础要打牢,慢慢来,我相信我可以学到更多好的东西。
因为上个学期已经学过C语言,所以这个学期弄JAVA觉得轻松一些,是有许多相似的方式,但还是有很大的不同。我学到了方法和类的区别,也了解到了写代码时不应该只顾着写出来,更应该对其进行优化。而且不管题目有多难我们都应该努力克服,而不是逃避。

浙公网安备 33010602011771号