diff --git a/1ano/2semestre/poo/guides/POO-2022-aula05.pdf b/1ano/2semestre/poo/guides/POO-2022-aula05.pdf index c583ca1..b20e946 100644 Binary files a/1ano/2semestre/poo/guides/POO-2022-aula05.pdf and b/1ano/2semestre/poo/guides/POO-2022-aula05.pdf differ diff --git a/1ano/2semestre/poo/src/aula05/AuctionDemo.java b/1ano/2semestre/poo/src/aula05/AuctionDemo.java new file mode 100644 index 0000000..036e920 --- /dev/null +++ b/1ano/2semestre/poo/src/aula05/AuctionDemo.java @@ -0,0 +1,129 @@ +package aula05; + +public class AuctionDemo { + public static void main(String[] args) { + RealEstate imobiliaria = new RealEstate(); + imobiliaria.newProperty("Glória", 2, 30000); + imobiliaria.newProperty("Vera Cruz", 1, 25000); + imobiliaria.newProperty("Santa Joana", 3, 32000); + imobiliaria.newProperty("Aradas", 2, 24000); + imobiliaria.newProperty("São Bernardo", 2, 20000); + + imobiliaria.sell(1001); + imobiliaria.setAuction(1002, new DateYMD(21, 3, 2023), 4); + imobiliaria.setAuction(1003, new DateYMD(1, 4, 2023), 3); + imobiliaria.setAuction(1001, new DateYMD(1, 4, 2023), 4); + imobiliaria.setAuction(1010, new DateYMD(1, 4, 2023), 4); + + System.out.println(imobiliaria); + + } +} + +class RealEstate { + private final Property[] properties; + private int currentId; + + public RealEstate() { + this.properties = new Property[10]; + this.currentId = 1000; + } + + public void newProperty(String address, int rooms, int price) { + Property newProperty = new Property(currentId++, address, rooms, price); + for (int i = 0; i < this.properties.length; i++) { + if (this.properties[i] == null) { + this.properties[i] = newProperty; + break; + } + } + } + + public void sell(int id) { + for (Property property : this.properties) { + if (property != null && property.getId() == id) { + if (!property.isAvailable()) { + System.out.printf("Imóvel %d não está disponível.\n", id); + return; + } else { + property.setAvailability(false); + System.out.printf("Imóvel %d vendido.\n", id); + return; + } + } + } + System.out.printf("Imóvel %d não existe.\n", id); + } + + public void setAuction(int id, DateYMD date, int duration) { + for (Property property : this.properties) { + if (property != null && property.getId() == id) { + if (!property.isAvailable()) { + System.out.printf("Imóvel %d não está disponível.\n", id); + return; + } else { + DateYMD end = new DateYMD(date.getDay(), date.getMonth(), date.getYear()); + end.addDays(duration); + property.setAuction(date, end); + return; + } + } + } + System.out.printf("Imóvel %d não existe.\n", id); + } + + public String toString() { + StringBuilder result = new StringBuilder().append("Propriedades:\n"); + for (Property property : this.properties) + if (property != null) + result.append(property).append("\n"); + return result.toString(); + } +} + +class Property { + private final int id; + private final String address; + private final int rooms; + private final int price; + private boolean availability; + private DateYMD auctionBegin; + private DateYMD auctionEnd; + + public Property(int id, String address, int rooms, int price) { + this.id = id; + this.address = address; + this.rooms = rooms; + this.price = price; + this.availability = true; + this.auctionBegin = null; + this.auctionEnd = null; + } + + public int getId() { + return this.id; + } + public boolean isAvailable() { + return this.availability; + } + public void setAvailability(boolean availability) { + this.availability = availability; + } + + public void setAuction(DateYMD begin, DateYMD end) { + this.auctionBegin = begin; + this.auctionEnd = end; + } + + public DateYMD[] getAuction() { + return new DateYMD[] {this.auctionBegin, this.auctionEnd}; + } + + public boolean isAuction() { + return this.auctionBegin != null && this.auctionEnd != null; + } + + public String toString() { + return String.format("Imóvel %d; quartos: %d; localidade: %s; preço: %d; disponível: %s%s", this.id, this.rooms, this.address, this.price, this.availability ? "sim" : "não", this.isAuction() ? String.format("; leilão: %s : %s", this.auctionBegin, this.auctionEnd) : ""); + } +} \ No newline at end of file diff --git a/1ano/2semestre/poo/src/aula05/Calendar.java b/1ano/2semestre/poo/src/aula05/Calendar.java new file mode 100644 index 0000000..04a6677 --- /dev/null +++ b/1ano/2semestre/poo/src/aula05/Calendar.java @@ -0,0 +1,169 @@ +package aula05; + +import java.util.Arrays; +import java.util.Scanner; + +public class Calendar { + private final int year; + private final int firstDayOfWeek; + private final int[][] events; + + public Calendar(int year, int firstDayOfWeek) { + this.year = year; + this.firstDayOfWeek = firstDayOfWeek; + this.events = new int[366][3]; + } + + public int getYear() { + return this.year; + } + + public int getFirstDayOfWeek() { + return this.firstDayOfWeek; + } + + public int firstWeekdayOfMonth(int month) { + int day = this.firstDayOfWeek; + for (int m = 1; m < month; m++) { + if (day == 7) + day = 0; + int days = DateYMD.monthDays(m, this.year); + day += days % 7 - 1; + if (day > 7) + day -= 7; + day++; + } + return day == 7 ? 7 : day%7; + } + + public void printMonth(int month) { + String[] monthNames = {"Janeiro", "Fevereiro", "Março", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro"}; + System.out.printf("\n%15s %d\n", monthNames[month-1], year); + System.out.println("Dom Seg Ter Qua Qui Sex Sab"); + + int firstWeekday = this.firstWeekdayOfMonth(month); + for (int i = 1; i < firstWeekday; i++) + System.out.print(" "); + + for (int monthDay = 1; monthDay <= monthDays(month, year); monthDay++) { + System.out.print(this.isEvent(monthDay, month, this.year) ? String.format("*%2d ", monthDay) : String.format("%3d ", monthDay)); + if ((monthDay + firstWeekday - 1) % 7 == 0) + System.out.println(); + } + System.out.println(); + } + + public void addEvent(int day, int month, int year) { + int[] eventToAdd = {day, month, year}; + for (int i = 0; i < this.events.length; i++) { + if (Arrays.equals(this.events[i], new int[]{0, 0, 0})) { + this.events[i] = eventToAdd; + break; + } + } + } + + public void removeEvent(int day, int month, int year) { + int[] eventToRemove = {day, month, year}; + for (int i = 0; i < this.events.length; i++) { + if (this.events[i] == eventToRemove) { + this.events[i] = new int[]{0, 0, 0}; + break; + } + } + } + + private boolean isEvent(int day, int month, int year) { + int[] event = {day, month, year}; + for (int[] ints : this.events) { + if (Arrays.equals(ints, event)) + return true; + } + return false; + } + + private int monthDays(int month, int year) { + switch (month) { + case 2 -> { + if (year % 100 == 0 ? year % 400 == 0 : year % 4 == 0) + return 29; + else + return 28; + } + case 4, 6, 9, 11 -> { + return 30; + } + default -> { + return 31; + } + } + } +} + +class Tester { + public static void main(String[] args) { + Scanner sin = new Scanner(System.in); + Calendar calendar = null; + while (true) { + System.out.print("Calendar operations:\n1 - create new calendar\n2 - print calendar month\n3 - print calendar\n4 - add event\n5 - remove event\n6 - exit\n> "); + int op = sin.nextInt(); + switch (op) { + case 1 -> { + System.out.print("Year: "); + int year = sin.nextInt(); + System.out.print("First day of week: "); + int firstDayOfWeek = sin.nextInt(); + calendar = new Calendar(year, firstDayOfWeek); + } + case 2 -> { + if (calendar == null) { + System.out.println("Create a calendar first"); + break; + } + System.out.print("Month: "); + int month = sin.nextInt(); + calendar.printMonth(month); + } + case 3 -> { + if (calendar == null) { + System.out.println("Create a calendar first"); + break; + } + for (int month = 1; month <= 12; month++) + calendar.printMonth(month); + } + case 4 -> { + if (calendar == null) { + System.out.println("Create a calendar first"); + break; + } + System.out.print("Day: "); + int day = sin.nextInt(); + System.out.print("Month: "); + int month = sin.nextInt(); + System.out.print("Year: "); + int year = sin.nextInt(); + calendar.addEvent(day, month, year); + } + case 5 -> { + if (calendar == null) { + System.out.println("Create a calendar first"); + break; + } + System.out.print("Day: "); + int day = sin.nextInt(); + System.out.print("Month: "); + int month = sin.nextInt(); + System.out.print("Year: "); + int year = sin.nextInt(); + calendar.removeEvent(day, month, year); + } + case 6 -> { + sin.close(); + System.exit(0); + } + default -> System.out.println("Invalid option"); + } + } + } +} diff --git a/1ano/2semestre/poo/src/aula05/DateYMD.java b/1ano/2semestre/poo/src/aula05/DateYMD.java index e9b075c..13c7f84 100644 --- a/1ano/2semestre/poo/src/aula05/DateYMD.java +++ b/1ano/2semestre/poo/src/aula05/DateYMD.java @@ -3,6 +3,76 @@ package aula05; import java.util.Scanner; public class DateYMD { + private int day; + private int month; + private int year; + + public DateYMD(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; + } + + 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; + } + + public int[] get() { + return new int[]{this.day, this.month, this.year}; + } + + public int getDay() { + return day; + } + + public int getMonth() { + return month; + } + + public int getYear() { + return year; + } + + public void increment() { + if (this.day < monthDays(this.month, this.year)) + this.day++; + else if (this.month < 12) { + this.day = 1; + this.month++; + } else { + this.day = 1; + this.month = 1; + this.year++; + } + } + + public void addDays(int days) { + for (int i = 0; i < days; i++) + this.increment(); + } + + public void decrement() { + if (this.day > 1) + this.day--; + else if (this.month > 1) { + this.day = monthDays(this.month - 1, this.year); + this.month--; + } else { + this.day = 31; + this.month = 12; + this.year--; + } + } + + public String toString() { + return String.format("%04d-%02d-%02d", year, month, day); + } static boolean validMonth(int month) { return month >= 1 && month <= 12; } @@ -23,76 +93,12 @@ public class DateYMD { static boolean validDate(int day, int month, int year) { return day >= 1 && day <= monthDays(month, year); } - - class Date { - private int day; - private int month; - private int year; - - public Date(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; - } - - 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; - } - - public int getDay() { - return day; - } - - public int getMonth() { - return month; - } - - public int getYear() { - return year; - } - - public void increment() { - if (this.day < monthDays(this.month, this.year)) - this.day++; - else if (this.month < 12) { - this.day = 1; - this.month++; - } else { - this.day = 1; - this.month = 1; - this.year++; - } - } - - public void decrement() { - if (this.day > 1) - this.day--; - else if (this.month > 1) { - this.day = monthDays(this.month - 1, this.year); - this.month--; - } else { - this.day = 31; - this.month = 12; - this.year--; - } - } - - public String toString() { - return String.format("%04d-%02d-%02d", year, month, day); - } - } } class TestDateYMD { public static void main(String[] args) { Scanner sin = new Scanner(System.in); - DateYMD.Date date = null; + DateYMD date = null; while (true) { System.out.println("Date operations:"); System.out.println("1 - Create date"); @@ -112,7 +118,7 @@ class TestDateYMD { int month = sin.nextInt(); System.out.print("Year: "); int year = sin.nextInt(); - date = new DateYMD().new Date(day, month, year); + date = new DateYMD(day, month, year); System.out.println("Date created: " + date); break; case 2: