From 824decc78ca32e77ea36e9c7b280128d55485a4d Mon Sep 17 00:00:00 2001 From: TiagoRG <35657250+TiagoRG@users.noreply.github.com> Date: Tue, 28 Mar 2023 18:34:24 +0100 Subject: [PATCH] [POO] aula07 ex1 and ex2 added --- 1ano/2semestre/poo/src/aula07/ex1/Circle.java | 43 +++++++ .../poo/src/aula07/ex1/Rectangle.java | 46 ++++++++ 1ano/2semestre/poo/src/aula07/ex1/Shape.java | 8 ++ .../poo/src/aula07/ex1/Triangle.java | 50 ++++++++ 1ano/2semestre/poo/src/aula07/ex2/Date.java | 34 ++++++ 1ano/2semestre/poo/src/aula07/ex2/DateND.java | 104 ++++++++++++++++ .../poo/src/aula07/ex2/DateTest.java | 56 +++++++++ .../2semestre/poo/src/aula07/ex2/DateYMD.java | 111 ++++++++++++++++++ 8 files changed, 452 insertions(+) create mode 100644 1ano/2semestre/poo/src/aula07/ex1/Circle.java create mode 100644 1ano/2semestre/poo/src/aula07/ex1/Rectangle.java create mode 100644 1ano/2semestre/poo/src/aula07/ex1/Shape.java create mode 100644 1ano/2semestre/poo/src/aula07/ex1/Triangle.java create mode 100644 1ano/2semestre/poo/src/aula07/ex2/Date.java create mode 100644 1ano/2semestre/poo/src/aula07/ex2/DateND.java create mode 100644 1ano/2semestre/poo/src/aula07/ex2/DateTest.java create mode 100644 1ano/2semestre/poo/src/aula07/ex2/DateYMD.java diff --git a/1ano/2semestre/poo/src/aula07/ex1/Circle.java b/1ano/2semestre/poo/src/aula07/ex1/Circle.java new file mode 100644 index 0000000..d83306b --- /dev/null +++ b/1ano/2semestre/poo/src/aula07/ex1/Circle.java @@ -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; + } +} diff --git a/1ano/2semestre/poo/src/aula07/ex1/Rectangle.java b/1ano/2semestre/poo/src/aula07/ex1/Rectangle.java new file mode 100644 index 0000000..ca50d04 --- /dev/null +++ b/1ano/2semestre/poo/src/aula07/ex1/Rectangle.java @@ -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); + } +} diff --git a/1ano/2semestre/poo/src/aula07/ex1/Shape.java b/1ano/2semestre/poo/src/aula07/ex1/Shape.java new file mode 100644 index 0000000..ed19ada --- /dev/null +++ b/1ano/2semestre/poo/src/aula07/ex1/Shape.java @@ -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(); +} diff --git a/1ano/2semestre/poo/src/aula07/ex1/Triangle.java b/1ano/2semestre/poo/src/aula07/ex1/Triangle.java new file mode 100644 index 0000000..c41280f --- /dev/null +++ b/1ano/2semestre/poo/src/aula07/ex1/Triangle.java @@ -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; + } +} diff --git a/1ano/2semestre/poo/src/aula07/ex2/Date.java b/1ano/2semestre/poo/src/aula07/ex2/Date.java new file mode 100644 index 0000000..1d544d7 --- /dev/null +++ b/1ano/2semestre/poo/src/aula07/ex2/Date.java @@ -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; + } +} diff --git a/1ano/2semestre/poo/src/aula07/ex2/DateND.java b/1ano/2semestre/poo/src/aula07/ex2/DateND.java new file mode 100644 index 0000000..cd4b35a --- /dev/null +++ b/1ano/2semestre/poo/src/aula07/ex2/DateND.java @@ -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); + } +} diff --git a/1ano/2semestre/poo/src/aula07/ex2/DateTest.java b/1ano/2semestre/poo/src/aula07/ex2/DateTest.java new file mode 100644 index 0000000..2d1c7b9 --- /dev/null +++ b/1ano/2semestre/poo/src/aula07/ex2/DateTest.java @@ -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."); + } + } + } +} diff --git a/1ano/2semestre/poo/src/aula07/ex2/DateYMD.java b/1ano/2semestre/poo/src/aula07/ex2/DateYMD.java new file mode 100644 index 0000000..e946917 --- /dev/null +++ b/1ano/2semestre/poo/src/aula07/ex2/DateYMD.java @@ -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); + } +}