[POO] aula07 ex1 and ex2 added

This commit is contained in:
TiagoRG 2023-03-28 18:34:24 +01:00
parent b36275c654
commit 24c1f3fdd1
8 changed files with 452 additions and 0 deletions

View File

@ -0,0 +1,43 @@
package aula07.ex1;
public class Circle extends Shape {
private double radius;
public Circle(double radius) {
if (radius <= 0)
throw new IllegalArgumentException("Sizes must be positive.");
this.radius = radius;
}
public double getRadius() {
return this.radius;
}
public void setRadius(double radius) {
if (radius <= 0)
throw new IllegalArgumentException("Sizes must be positive.");
this.radius = radius;
}
@Override
public double getArea() {
return Math.PI * Math.pow(this.radius, 2);
}
@Override
public double getPerimeter() {
return 2 * Math.PI * this.radius;
}
@Override
public boolean equals(Shape s2) {
if (s2 instanceof Circle s2Circ)
return this.radius == s2Circ.radius;
return false;
}
@Override
public String toString() {
return "Circle with radius " + this.radius;
}
}

View File

@ -0,0 +1,46 @@
package aula07.ex1;
public class Rectangle extends Shape {
public double side1;
public double side2;
public Rectangle(double side1, double side2) {
if (!(side1 > 0 && side2 > 0))
throw new IllegalArgumentException("Sizes must be positive.");
this.side1 = side1;
this.side2 = side2;
}
public double[] getSides() {
return new double[] {this.side1, this.side2};
}
public void setSides(double side1, double side2) {
if (!(side1 > 0 && side2 > 0))
throw new IllegalArgumentException("Sizes must be positive.");
this.side1 = side1;
this.side2 = side2;
}
@Override
public boolean equals(Shape s2) {
if (s2 instanceof Rectangle s2Rect)
return this.side1 == s2Rect.side1 && this.side2 == s2Rect.side2;
return false;
}
@Override
public String toString() {
return "Rectangle with sides " + this.side1 + ", " + this.side2;
}
@Override
public double getArea() {
return this.side1 * this.side2;
}
@Override
public double getPerimeter() {
return 2 * (this.side1 + this.side2);
}
}

View File

@ -0,0 +1,8 @@
package aula07.ex1;
public abstract class Shape {
public abstract boolean equals(Shape c2);
public abstract String toString();
public abstract double getArea();
public abstract double getPerimeter();
}

View File

@ -0,0 +1,50 @@
package aula07.ex1;
public class Triangle extends Shape {
private double side1;
private double side2;
private double side3;
public Triangle(double side1, double side2, double side3) {
if (!(side1 > 0 && side2 > 0 && side3 > 0))
throw new IllegalArgumentException("Sizes must be positive.");
this.side1 = side1;
this.side2 = side2;
this.side3 = side3;
}
public double[] getSides() {
return new double[] {this.side1, this.side2, this.side3};
}
public void setSides(double side1, double side2, double side3) {
if (!(side1 > 0 && side2 > 0 && side3 > 0))
throw new IllegalArgumentException("Sizes must be positive.");
this.side1 = side1;
this.side2 = side2;
this.side3 = side3;
}
@Override
public boolean equals(Shape s2) {
if (s2 instanceof Triangle s2Triang)
return this.side1 == s2Triang.side1 && this.side2 == s2Triang.side2 && this.side3 == s2Triang.side3;
return false;
}
@Override
public String toString() {
return "Triangle with sides " + this.side1 + ", " + this.side2 + ", " + this.side3;
}
@Override
public double getArea() {
double p = this.getPerimeter() / 2;
return Math.sqrt(p * (p - this.side1) * (p - this.side2) * (p - this.side3));
}
@Override
public double getPerimeter() {
return this.side1 + this.side2 + this.side3;
}
}

View File

@ -0,0 +1,34 @@
package aula07.ex2;
public abstract class Date {
public abstract int getAbsDay();
public abstract int getDay();
public abstract int getMonth();
public abstract int getYear();
public abstract void increment();
public abstract void decrement();
public abstract void addDays(int days);
public abstract void removeDays(int days);
public static int monthDays(int month, int year) {
if (!validMonth(month))
return -1;
int[] daysPerMonth = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if (month == 2 && isLeapYear(year))
return 29;
return daysPerMonth[month - 1];
}
public static boolean validMonth(int month) {
return month >= 1 && month <= 12;
}
public static boolean validDate(int day, int month, int year) {
return day >= 1 && day <= monthDays(month, year);
}
public static boolean isLeapYear(int year) {
return year % 100 == 0 ? year % 400 == 0 : year % 4 == 0;
}
}

View File

@ -0,0 +1,104 @@
package aula07.ex2;
import java.util.Objects;
public class DateND extends Date {
private int absDay;
public DateND(int absDay) {
set(absDay);
}
public void set(int absDay) {
if (absDay <= 0)
throw new IllegalArgumentException("Absolute day must be positive!");
this.absDay = absDay;
}
@Override
public int getAbsDay() {
return this.absDay;
}
private int[] getYMD() {
int[] date = new int[3];
int tempAbsDay = this.absDay;
int year = 1999;
while (tempAbsDay > 0) {
year++;
tempAbsDay -= isLeapYear(year) ? 366 : 365;
}
date[2] = year;
tempAbsDay += isLeapYear(year) ? 366 : 365;
int month = 0;
while (tempAbsDay > 0) {
month++;
tempAbsDay -= monthDays(month, year);
}
date[1] = month;
tempAbsDay += monthDays(month, year);
date[0] = tempAbsDay;
return date;
}
@Override
public int getDay() {
return this.getYMD()[0];
}
@Override
public int getMonth() {
return this.getYMD()[1];
}
@Override
public int getYear() {
return this.getYMD()[2];
}
@Override
public void increment() {
this.absDay++;
}
@Override
public void decrement() {
this.absDay--;
}
@Override
public void addDays(int days) {
for (int i = 0; i < days; i++)
this.increment();
}
@Override
public void removeDays(int days) {
if (days > this.absDay)
this.absDay = 0;
else
for (int i = 0; i < days; i++)
this.decrement();
}
@Override
public String toString() {
return String.format("Date: %d past 01-01-2000", this.absDay);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
DateND dateND = (DateND) o;
return absDay == dateND.absDay;
}
@Override
public int hashCode() {
return Objects.hash(absDay);
}
}

View File

@ -0,0 +1,56 @@
package aula07.ex2;
import java.util.Scanner;
public class DateTest {
public static void main(String[] args) {
Scanner sin = new Scanner(System.in);
while (true) {
System.out.print("Class to test (0-Quit;1-DateYMD;2-DateND): ");
String option = sin.nextLine();
switch (option) {
case "0" -> {
sin.close();
System.exit(0);
}
case "1" -> {
System.out.print("Day: ");
int day = Integer.parseInt(sin.nextLine());
System.out.print("Month: ");
int month = Integer.parseInt(sin.nextLine());
System.out.print("Year: ");
int year = Integer.parseInt(sin.nextLine());
DateYMD date = new DateYMD(day, month, year);
System.out.printf("Initial date: %s%n%n", date);
System.out.printf("Absolute day: %d%n", date.getAbsDay());
System.out.println("Adding 7 days...");
date.addDays(7);
System.out.printf("New absolute day: %d%n", date.getAbsDay());
System.out.println("Removing 534 days...");
date.removeDays(534);
System.out.printf("New absolute day: %d%n", date.getAbsDay());
System.out.println("Final date: " + date);
}
case "2" -> {
System.out.print("Days past past 01-01-2000: ");
int days = Integer.parseInt(sin.nextLine());
DateND date = new DateND(days);
System.out.printf("Initial date: %s%n%n", date);
System.out.printf("YMD date: %s%n", new DateYMD(date.getDay(), date.getMonth(), date.getYear()));
System.out.println("Adding 74 days...");
date.addDays(74);
System.out.printf("New YMD date: %s%n", new DateYMD(date.getDay(), date.getMonth(), date.getYear()));
System.out.println("Removing 612 days...");
date.removeDays(612);
System.out.printf("New YMD date: %s%n", new DateYMD(date.getDay(), date.getMonth(), date.getYear()));
System.out.println("Final date: " + date);
}
default -> System.out.println("Invalid option.");
}
}
}
}

View File

@ -0,0 +1,111 @@
package aula07.ex2;
import java.util.Objects;
public class DateYMD extends Date {
private int day;
private int month;
private int year;
public DateYMD(int day, int month, int year) {
set(day, month, year);
}
public void set(int day, int month, int year) {
if (!validDate(day, month, year))
throw new IllegalArgumentException("Invalid date");
this.day = day;
this.month = month;
this.year = year;
}
@Override
public int getAbsDay() {
int absDay = 0;
for (int i = 2000; i < this.year; i++) {
if (isLeapYear(i))
absDay += 366;
else
absDay += 365;
}
for (int i = 1; i < this.month; i++) {
absDay += monthDays(i, this.year);
}
return absDay + this.day;
}
@Override
public int getDay() {
return this.day;
}
@Override
public int getMonth() {
return this.month;
}
@Override
public int getYear() {
return this.year;
}
@Override
public void increment() {
if (this.day < monthDays(this.month, this.year))
this.day++;
else {
this.day = 1;
if (this.month < 12)
this.month++;
else {
this.month = 1;
this.year++;
}
}
}
@Override
public void decrement() {
if (this.day > 1)
this.day--;
else {
this.day = monthDays(this.month == 1 ? 12 : this.month-1, this.year);
if (this.month > 1)
this.month--;
else {
this.month = 12;
this.year--;
}
}
}
@Override
public void addDays(int days) {
for (int i = 0; i < days; i++)
this.increment();
}
@Override
public void removeDays(int days) {
for (int i = 0; i < days; i++)
this.decrement();
}
@Override
public String toString() {
return String.format("%02d-%02d-%04d", this.day, this.month, this.year);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
DateYMD dateYMD = (DateYMD) o;
return day == dateYMD.day && month == dateYMD.month && year == dateYMD.year;
}
@Override
public int hashCode() {
return Objects.hash(day, month, year);
}
}