Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
105 changes: 105 additions & 0 deletions task01/src/com/example/task01/Logger.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
package com.example.task01;

import java.text.MessageFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.Map;

public class Logger {
private static final Map<String, Logger> LOGGERS = new HashMap<>();
private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy.MM.dd");
private static final DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("HH:mm:ss");

private final String name;
private Level level;

public enum Level {
DEBUG,
INFO,
WARNING,
ERROR
}

private Logger(String name) {
this.name = name;
this.level = Level.DEBUG;
}

public static Logger getLogger(String name) {
return LOGGERS.computeIfAbsent(name, Logger::new);
}

public String getName() {
return name;
}

public Level getLevel() {
return level;
}

public void setLevel(Level level) {
this.level = level;
}

private boolean shouldLog(Level messageLevel) {
return messageLevel.ordinal() >= level.ordinal();
}

private void log(Level level, String message) {
if (!shouldLog(level)) return;

String timestamp = getFormattedTimestamp();
String output = String.format("[%s] %s %s - %s", level, timestamp, name, message);

if (level == Level.ERROR || level == Level.WARNING) {
System.err.println(output);
} else {
System.out.println(output);
}
}

private void log(Level level, String template, Object... args) {
if (!shouldLog(level)) return;
String formattedMessage = MessageFormat.format(template, args);
log(level, formattedMessage);
}

private String getFormattedTimestamp() {
LocalDateTime now = LocalDateTime.now();
return now.format(DATE_FORMATTER) + " " + now.format(TIME_FORMATTER);
}

// Методы для уровней логирования
public void debug(String message) {
log(Level.DEBUG, message);
}

public void debug(String template, Object... args) {
log(Level.DEBUG, template, args);
}

public void info(String message) {
log(Level.INFO, message);
}

public void info(String template, Object... args) {
log(Level.INFO, template, args);
}

public void warning(String message) {
log(Level.WARNING, message);
}

public void warning(String template, Object... args) {
log(Level.WARNING, template, args);
}

public void error(String message) {
log(Level.ERROR, message);
}

public void error(String template, Object... args) {
log(Level.ERROR, template, args);
}
}
4 changes: 3 additions & 1 deletion task01/src/com/example/task01/Task01Main.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

public class Task01Main {
public static void main(String[] args) {

Logger logger = Logger.getLogger("main");
logger.setLevel(Logger.Level.WARNING);
logger.warning("Disk space low: {0}GB remaining", 2.5);
}
}
49 changes: 49 additions & 0 deletions task02/src/com/example/task02/DiscountBill.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package com.example.task02;

/**
* Счет к оплате со скидкой
*/
public class DiscountBill extends Bill {
private final double discountPercent;

public DiscountBill(double discountPercent) {
if (discountPercent < 0 || discountPercent > 1) {
throw new IllegalArgumentException("Скидка должна быть в диапазоне от 0 до 1");
}
this.discountPercent = discountPercent;
}

/**
* Возвращает процент скидки (от 0 до 1)
*/
public double getDiscountPercent() {
return discountPercent;
}

/**
* Возвращает абсолютное значение скидки
*/
public long getDiscountAbsolute() {
long originalPrice = super.getPrice();
return Math.round(originalPrice * discountPercent);
}

/**
* Подсчитывает общую сумму покупки со скидкой
*/
@Override
public long getPrice() {
long originalPrice = super.getPrice();
return originalPrice - getDiscountAbsolute();
}

@Override
public String toString() {
StringBuilder sb = new StringBuilder("Счет к оплате (со скидкой " + (discountPercent * 100) + "%)\n");
// Здесь нужно получить доступ к items из родительского класса
// Поскольку items приватные, используем унаследованное поведение
return super.toString().replace("Счет к оплате", "Счет к оплате (со скидкой " + (discountPercent * 100) + "%)")
+ "\nСкидка: " + getDiscountAbsolute()
+ "\nИтоговая сумма: " + getPrice();
}
}
14 changes: 7 additions & 7 deletions task02/src/com/example/task02/Task02Main.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,12 @@ public class Task02Main {
private static final Item ITEM6 = new Item("Товар 6", 60);

public static void main(String[] args) {
Bill bill = new Bill();
bill.add(ITEM1, 10);
bill.add(ITEM3, 3);
bill.add(ITEM6, 1);
System.out.println(bill);
bill.add(ITEM3, 3);
System.out.println(bill);
DiscountBill discountBill = new DiscountBill(0.1); // 10% скидка
discountBill.add(ITEM1, 10);
discountBill.add(ITEM2, 5);

System.out.println(discountBill);
System.out.println("Абсолютная скидка: " + discountBill.getDiscountAbsolute());
System.out.println("Процент скидки: " + discountBill.getDiscountPercent());
}
}
33 changes: 33 additions & 0 deletions task03/src/com/example/task03/Hours.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.example.task03;

/**
* Интервал в часах
*/
public class Hours implements TimeUnit {

private final long amount;

public Hours(long amount) {
this.amount = amount;
}

@Override
public long toMillis() {
return amount * 60 * 60 * 1000;
}

@Override
public long toSeconds() {
return amount * 60 * 60;
}

@Override
public long toMinutes() {
return amount * 60;
}

@Override
public long toHours() {
return amount;
}
}
11 changes: 8 additions & 3 deletions task03/src/com/example/task03/Milliseconds.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,16 @@ public long toMillis() {

@Override
public long toSeconds() {
return amount / 1000;
return Math.round(amount / 1000.0);
}

@Override
public long toMinutes() {
return amount / 1000 * 60;
return Math.round(amount / (1000.0 * 60));
}
}

@Override
public long toHours() {
return Math.round(amount / (1000.0 * 60 * 60));
}
}
24 changes: 15 additions & 9 deletions task03/src/com/example/task03/Minutes.java
Original file line number Diff line number Diff line change
@@ -1,27 +1,33 @@
package com.example.task03;

/**
* Интервал в минутах
*/
public class Minutes implements TimeUnit {

private final long amount;

public Minutes(long amount) {
// TODO: реализовать
throw new UnsupportedOperationException();
this.amount = amount;
}

@Override
public long toMillis() {
// TODO: реализовать
throw new UnsupportedOperationException();
return amount * 60 * 1000;
}

@Override
public long toSeconds() {
// TODO: реализовать
throw new UnsupportedOperationException();
return amount * 60;
}

@Override
public long toMinutes() {
// TODO: реализовать
throw new UnsupportedOperationException();
return amount;
}

@Override
public long toHours() {
return Math.round(amount / 60.0);
}
}
}
9 changes: 7 additions & 2 deletions task03/src/com/example/task03/Seconds.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,11 @@ public long toSeconds() {

@Override
public long toMinutes() {
return Math.round(amount / 60);
return Math.round(amount / 60.0);
}
}

@Override
public long toHours() {
return Math.round(amount / (60.0 * 60));
}
}
8 changes: 8 additions & 0 deletions task03/src/com/example/task03/TimeUnit.java
Original file line number Diff line number Diff line change
Expand Up @@ -28,4 +28,12 @@ public interface TimeUnit {
*/
long toMinutes();

/**
* Возвращает продолжительность текущего интервала, пересчитанного в часах.
* При необходимости округлять по обычным правилам округления (число, меньшее 0.5 переходит в 0, большее или равное - в 1)
*
* @return количество часов в текущем интервале
*/
long toHours();

}
Loading