【任务一】:设计并实现一个直线(Line2D)类,可以通过四个构造函数分别使用一般式、点斜式、两点式和截距式四种方法来构造直线。并对直线做简单的比较。
要求:
- 点需要使用 Point2D 类表示,
1.1 Point2D 应该有两个 double 类型的私有属性,分别表示笛卡尔坐标系上点的横坐标和纵坐标。
1.2 Point2D 类至少应该提供一个构造函数具有参数(double x, double y)。有能力可以考虑以极坐标的方式创建点
(不做要求)。
1.3 重写 Point2D 类的 equals()方法,来判断两个点是否是同一个点。 - 提供合理的直线带参的四种构造函数:一般式三个参数(double a, double b, double c)、点斜式两个参数(Point2D point, double slope)、两点式两个参数(Point2D point1, Point2D point2)和截距式(double interceptX, double interceptY)。
- 重写 Line2D 类的 equals()方法,判断两条直线是否是同一条。
- 添加 boolean isParallel(Line2D anotherLine)方法,判断两条直线是否平行。
提示: - 使用两点式构造直线时,注意两点重合则无法唯一确定一条直线,此时直线不合法。不合法的直线和任何直线对
比都为假。 - 使用点斜式时,当直线平行于 y 轴时,斜率为无穷大,但是 Java 语言中 double 类型是可以表示无穷大,请参阅
Java API 文档:Double. NEGATIVE_INFINITY 和 Double. POSITIVE_INFINITY,此外,double 类型还可能是 Double.NAN。 - 注意,用不同构造函数创建的直线也需要进行比较,建议在类的内部将三种构造函数统一成一种表示方法,以方便比较直线是否相等。(可以在对象构造的时候就将直线表示成同一种表示方法)。
- 在判断两条直线是否平行时,首先要排除两条直线重合的情况。
- 所有非法的直线,在判断平行时,一律不平行。
- 注意只要是对象的引用作为函数的参数,则这个函数的调用者,可能会传空值进来。
- 所有不合法的直线和点的情况,不能只在输入时判断,需要类本身能够识别非法情况,并且在比较和判断平行时
做出正确判断。
/*
* @Author:苘山楂树
* @Description:实现四种方法对直线的构造
* @Date: 2019/10/16
* @Modified By:苘山楂树
*/
public class Line2D {
private double A;
private double B;
private double C;
public Line2D(double a,double b,double c){
//一般式
A = a;
B = b;
C = c;
}
public Line2D(Point2D point, double slope){
//点斜式
if(Double.isInfinite(slope) || Double.isNaN(slope)){
System.out.println("The slope is infinite or none value!");
}
else {
A = slope;
B = -1;
C = point.getY() - slope * point.getX();
}
}
public Line2D(Point2D point1,Point2D point2){
//两点式
if(!point1.equals(point2)){
A = point1.getY()-point2.getY();
B = point2.getX()-point2.getX();
C = point2.getY()*(point1.getX()-point2.getX())-point2.getX()*(point1.getY()-point2.getY());
}
else {
//两点重合无法唯一确定一条直线
System.out.println("These two points are the same!");
System.exit(0);
}
}
public Line2D(double interceptX,double interceptY){
//截距式
A = 1/interceptX;
B = 1/interceptY;
C = -1;
}
public boolean isParallel(Line2D anotherLine){
return A * anotherLine.B == B * anotherLine.A && C != anotherLine.C;
}
}
public class Point2D {
private double x,y;
public Point2D(double param_x,double param_y){
x = param_x;
y = param_y;
}
public boolean equals(Point2D p) {
return x == p.x && y == p.y;
}
public double getX() {
return x;
}
public double getY() {
return y;
}
}
【任务二】:用面向对象的方式改进日记系统的用户注册和登录过程。实现简单的写日记功能。
要求:
- 在实现实验二中任务二的所有功能的基础上,改进用户注册和登录的设计。
1.1. 在上一次实验任务二的基础上,添加 User 类。
1.2. 使用封装的方式将 User 类中相关属性的验证方法封装到 User 类中。
1.3. 在 User 类中添加方法用来判断用户登录是否成功。
1.4. 在主类中添加一个 static 属性用来判断用户是否登录,以及保存当前登录的用户信息。 - 实现写日记功能。
2.1 基于以前实验的结果,用户在如下的菜单中 - 登录系统;
- 系统设置;
- 写日记;
- 查找日记;
- 退出系统;
请选择:
选择功能 3 的时候,进入写日记功能。
2.2 创建一个 Diary 类用来保存用户日记的所有信息。
2.2.1 Diary 类应该至少包含这些属性:日期、天气、心情、标题和内容。
2.2.2 其中天气和心情属性的类型应该是枚举类型。
2.2.3 其中日期使用自定义的日期类(Date)。该类应该包含一个通过字符串构造的日期函数Date(String date),
还应该包含一个 static 方法用来判断用户输入的日期是否正确,在构造日期之前先用该方法判断日期是否合法。
2.2.4 重写 Diary 类的 toString()方法,显示 Diary 的日期、天气、心情、标题和内容。
2.3 当用户进入写日记功能时,先让用户选择天气和当时的心情。
2.4 随后让用户输入日期,默认为当前日期,若用户输入的日期不正确,则一直到用户输入正确为止。
2.6 让用户输入标题,并且标题不能超过 12 个字。
2.6 随后让用户输入日记内容。
2.7 当用户提交之后创建 Diary 对象用来保存用户的日记。
2.8 输出 Diary 对象的内容(提示:通过重写 Diary 对象的 toString()方法,可以直接打印出 Diary 对象)。
这次实验比较难的部分就应该是判断日期和封装User类了,刚开始对封装完全蒙蔽啊(好叭现在还是有点儿蒙蔽,好在有厉害的大牛牛->如果看到请不要骄傲:) 看了笔记之后真的是醍醐灌顶啊 好叭来讲讲我理解的封装,封装其实就是字面意思,打包封装并且将里面的属性方法私有化,要用的时候再用get或者set来得到,既然讲了那么就有时间写篇博客来谈谈~
/*
* @Author:苘山楂树
* @Description:实现用户登录注册等功能
* @Date: 2019/10/18
* @Modified By:苘山楂树
*/
import java.lang.invoke.SwitchPoint;
import java.text.SimpleDateFormat;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Log {
static int index;
static boolean logIn = false;
static User[] users = new User[100];
/*private static String[] userNameArray = new String[100] ;
private static String[] screenNameArray = new String[100];
private static String[] passwordArray = new String[100];
private static String[] emailAddressArray = new String[100];
private static String[] answerArray = new String[100];*/
private static int userCount = 0;
static String[] testAnswers = {
"","1.Q1","2.Q2","3.Q3","4.Q4","5.Q5"};
public static void main(String[] args){
mainMenu();
}
private static void mainMenu() {
Scanner input = new Scanner(System.in);
System.out.println("1.系统登陆");
System.out.println("2.系统设置");
System.out.println("3.写日记");
System.out.println("4.查找日记");
System.out.println("5.退出系统");
System.out.println("请选择:");
int option = input.nextInt();
while (!(option >= 1 && option <=