diff --git a/.gitignore b/.gitignore index eea6353..5303b8f 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,5 @@ .idea *.iws *.iml -*.ipr \ No newline at end of file +*.ipr +/out/ diff --git a/src/ru/milandr/courses/complexnumber/NewComplexNumberInterface.java b/src/ru/milandr/courses/complexnumber/NewComplexNumberInterface.java new file mode 100644 index 0000000..8f9d831 --- /dev/null +++ b/src/ru/milandr/courses/complexnumber/NewComplexNumberInterface.java @@ -0,0 +1,47 @@ +package ru.milandr.courses.complexnumber; + +public interface NewComplexNumberInterface { + + /** + * @param anotherNumber a number to add to current number + * @return complex number representing operation result + */ + NewComplexNumberInterface add(NewComplexNumberInterface anotherNumber); + + /** + * @param anotherNumber a number to subtract from current number + * @return complex number representing operation result (this minus another) + */ + NewComplexNumberInterface subtract(NewComplexNumberInterface anotherNumber); + + /** + * @param anotherNumber a number of times to take current number + * @return complex number representing operation result + */ + NewComplexNumberInterface multiply(NewComplexNumberInterface anotherNumber); + + /** + * @param anotherNumber a number to divide by + * @return complex number representing operation result (this divided by another) + */ + NewComplexNumberInterface divide(NewComplexNumberInterface anotherNumber); + + /** + * @return result of current complex number negating + */ + NewComplexNumberInterface negate(); + + /** + * @return modulus value for current complex number + */ + double calculateModulus(); + + /** + * @return argument value for current complex number + */ + double calculateArgument(); + + double getReal(); + + double getImagine(); +} \ No newline at end of file diff --git a/src/ru/milandr/courses/complexnumber/frolov/Abobus.java b/src/ru/milandr/courses/complexnumber/frolov/Abobus.java new file mode 100644 index 0000000..e48980a --- /dev/null +++ b/src/ru/milandr/courses/complexnumber/frolov/Abobus.java @@ -0,0 +1,51 @@ +package ru.milandr.courses.complexnumber.frolov; + +import ru.milandr.courses.complexnumber.NewComplexNumberInterface; + +public class Abobus implements NewComplexNumberInterface { + + @Override + public NewComplexNumberInterface add(NewComplexNumberInterface anotherNumber) { + return null; + } + + @Override + public NewComplexNumberInterface subtract(NewComplexNumberInterface anotherNumber) { + return null; + } + + @Override + public NewComplexNumberInterface multiply(NewComplexNumberInterface anotherNumber) { + return null; + } + + @Override + public NewComplexNumberInterface divide(NewComplexNumberInterface anotherNumber) { + return null; + } + + @Override + public NewComplexNumberInterface negate() { + return null; + } + + @Override + public double calculateModulus() { + return 0; + } + + @Override + public double calculateArgument() { + return 0; + } + + @Override + public double getReal() { + return 0; + } + + @Override + public double getImagine() { + return 0; + } +} diff --git a/src/ru/milandr/courses/complexnumber/frolov/ComplexNumber.java b/src/ru/milandr/courses/complexnumber/frolov/ComplexNumber.java new file mode 100644 index 0000000..fad1af3 --- /dev/null +++ b/src/ru/milandr/courses/complexnumber/frolov/ComplexNumber.java @@ -0,0 +1,131 @@ +package ru.milandr.courses.complexnumber.frolov; + +import ru.milandr.courses.complexnumber.NewComplexNumberInterface; + +public class ComplexNumber implements NewComplexNumberInterface { + + private final double real; + private final double imagine; + + public ComplexNumber(double a, double b) { + this.real = a; + this.imagine = b; + } + + + @Override + public NewComplexNumberInterface add(NewComplexNumberInterface anotherNumber) { + ComplexNumber myNumber = checkException(anotherNumber); + return new ComplexNumber((real + myNumber.real), (imagine + myNumber.imagine)); + } + + @Override + public NewComplexNumberInterface subtract(NewComplexNumberInterface anotherNumber) { + ComplexNumber myNumber = checkException(anotherNumber); + return new ComplexNumber((real - myNumber.real), (imagine - myNumber.imagine)); + } + + @Override + public NewComplexNumberInterface multiply(NewComplexNumberInterface anotherNumber) { + ComplexNumber myNumber = checkException(anotherNumber); + double newReal = (real * myNumber.real - imagine * myNumber.imagine); + double newImagine = real * myNumber.imagine + imagine * myNumber.real; + return new ComplexNumber(newReal, newImagine); + } + + @Override + public NewComplexNumberInterface divide(NewComplexNumberInterface anotherNumber) { + ComplexNumber myNumber = checkException(anotherNumber); + double v = Math.pow(myNumber.real, 2) + Math.pow(myNumber.imagine, 2); + double newReal = (real * myNumber.real + imagine * myNumber.real) / v; + double newImagine = (myNumber.real * imagine - real * (myNumber.imagine)) / v; + return new ComplexNumber(newReal, newImagine); + } + + @Override + public ComplexNumber negate() { + double newReal = real * -1; + double newImagine = imagine * -1; + return new ComplexNumber(newReal, newImagine); + } + + @Override + public double calculateModulus() { + return Math.sqrt(Math.pow(real, 2) + Math.pow(imagine, 2)); + } + + @Override + public double calculateArgument() { + if (imagine == 0 & real > 0) { + return Math.toRadians(0); + } + + if (imagine == 0 & real < 0) { + return Math.toRadians(180); + } + + if (real == 0 & imagine > 0) { + return Math.toRadians(90); + } + + if (real == 0 & imagine < 0) { + return Math.toRadians(270); + } + + return real >= 0 ? Math.atan(imagine / real) : Math.atan(imagine / real + Math.toRadians(90)); + } + + @Override + public double getReal() { + return real; + } + + @Override + public double getImagine() { + return imagine; + } + + private ComplexNumber checkException(NewComplexNumberInterface someInstance) { + if (!(someInstance instanceof ComplexNumber)) { + throw new ComplexNumberException("Неправильный формат числа"); + } + return new ComplexNumber(getReal(), getImagine()); + } + + @Override + public String toString() { + String signOfImagine = imagine > 0 ? "+" : "-"; + return String.format("z = %.2f %s %.2f i", real, signOfImagine, Math.abs(imagine)); + } + + public static void main(String[] args) { + NewComplexNumberInterface f1 = new ComplexNumber(5, 14); + System.out.println(f1); + NewComplexNumberInterface f2 = new ComplexNumber(10, -6); + System.out.println(f2); + NewComplexNumberInterface sum = f1.add(f2); + System.out.println("сумма: " + sum); + NewComplexNumberInterface diff = f1.subtract(f2); + System.out.println("разность: " + diff); + NewComplexNumberInterface multi = f1.multiply(f2); + System.out.println("умножение: " + multi); + NewComplexNumberInterface div = f1.divide(f2); + System.out.println("деление: " + div); + NewComplexNumberInterface negative = f1.negate(); + System.out.println("негатив: " + negative); + double mod = f1.calculateModulus(); + System.out.println("модуль: " + mod); + double arg = f1.calculateArgument(); + System.out.println("аргумент: " + arg); + + NewComplexNumberInterface f3 = new ComplexNumber(0, -6); + double arg3 = f3.calculateArgument(); + System.out.println("аргумент чисто мнимого числа: " + arg3); + NewComplexNumberInterface f4 = new ComplexNumber(10, 0); + double arg4 = f4.calculateArgument(); + System.out.println("аргумент действительного числа: " + arg4); + + //Попытка передать невалидный аргумент + f1.add(new Abobus()); + } +} diff --git a/src/ru/milandr/courses/complexnumber/frolov/ComplexNumberException.java b/src/ru/milandr/courses/complexnumber/frolov/ComplexNumberException.java new file mode 100644 index 0000000..67e0db1 --- /dev/null +++ b/src/ru/milandr/courses/complexnumber/frolov/ComplexNumberException.java @@ -0,0 +1,9 @@ +package ru.milandr.courses.complexnumber.frolov; + +public class ComplexNumberException extends RuntimeException { + + public ComplexNumberException(String message) { + super(message); + } + +} diff --git a/src/ru/milandr/courses/complexnumber/frolov/Text b/src/ru/milandr/courses/complexnumber/frolov/Text new file mode 100644 index 0000000..4fac831 --- /dev/null +++ b/src/ru/milandr/courses/complexnumber/frolov/Text @@ -0,0 +1,2 @@ +1) Переопределяемый метод не может выбрасывать проверяемые исключения, которые выше по иерархии чем исключения в методе родительского класса. +2) Конструктор дочернего класса должен включить в свой блок throws все классы исключений или их предков из блока throws конструктора родительского класса, к которому он обращается при создании объекта. \ No newline at end of file diff --git a/src/ru/milandr/courses/farm/frolov/Application.java b/src/ru/milandr/courses/farm/frolov/Application.java new file mode 100644 index 0000000..ddf7550 --- /dev/null +++ b/src/ru/milandr/courses/farm/frolov/Application.java @@ -0,0 +1,49 @@ +package ru.milandr.courses.farm.frolov; + +import ru.milandr.courses.farm.frolov.animals.Cow; +import ru.milandr.courses.farm.frolov.animals.Goat; +import ru.milandr.courses.farm.frolov.animals.Pig; +import ru.milandr.courses.farm.frolov.goods.Cheese; +import ru.milandr.courses.farm.frolov.goods.Meat; +import ru.milandr.courses.farm.frolov.goods.Milk; + +public class Application { + public static void main(String[] args) throws InterruptedException { + FarmerAbobus tolyanchik = new FarmerAbobus("Толянчик"); + + Pig pepa = new Pig("Пепа"); + Goat zuzya = new Goat("Зюзя"); + Cow zorka = new Cow("Зорька"); + + tolyanchik.petAnAnimal(pepa); + tolyanchik.petAnAnimal(zuzya); + tolyanchik.petAnAnimal(zorka); + + Milk milk = new Milk(); + Cheese cheese = new Cheese(); + + Meat meat = (Meat) tolyanchik.collectGoods(pepa); + + tolyanchik.collectGoods(milk); + tolyanchik.collectGoods(cheese); + + System.out.println("Ждем 5,1 сек, чтобы молоко испортилось"); + Thread.sleep(5100); + + tolyanchik.eatProduct(milk); + tolyanchik.eatProduct(cheese); + tolyanchik.eatProduct(meat); + + System.out.println("Ждем еще 2,5 сек, чтобы мясо испортилось"); + Thread.sleep(2500); + + tolyanchik.eatProduct(milk); + tolyanchik.eatProduct(cheese); + tolyanchik.eatProduct(meat); + + tolyanchik.petAnAnimal(pepa); + tolyanchik.petAnAnimal(zuzya); + tolyanchik.petAnAnimal(zorka); + } +} + diff --git a/src/ru/milandr/courses/farm/frolov/FarmerAbobus.java b/src/ru/milandr/courses/farm/frolov/FarmerAbobus.java new file mode 100644 index 0000000..1692884 --- /dev/null +++ b/src/ru/milandr/courses/farm/frolov/FarmerAbobus.java @@ -0,0 +1,47 @@ +package ru.milandr.courses.farm.frolov; + +import ru.milandr.courses.farm.Animal; +import ru.milandr.courses.farm.GenericFarmer; +import ru.milandr.courses.farm.Good; +import ru.milandr.courses.farm.frolov.animals.Pig; +import ru.milandr.courses.farm.frolov.goods.Meat; +import ru.milandr.courses.farm.frolov.goods.SuperGood; + +public class FarmerAbobus implements GenericFarmer { + private final String name; + + public FarmerAbobus(String name) { + this.name = name; + } + + @Override + public void collectGoods(Good good) { + ((SuperGood) good).getCollected(this); + } + + public Good collectGoods(Pig pig) { + Good meat = pig.produceGoods(); + ((Meat) meat).getCollected(this); + return meat; + } + + @Override + public void petAnAnimal(Animal animal) { + System.out.println(name + " погладил " + animal); + animal.produceSound(); + } + + @Override + public void eatProduct(Good good) { + SuperGood realGood = (SuperGood) good; + if (realGood.isRotten()) { + System.out.println("не хочу есть испорченный " + realGood); + return; + } + System.out.println(name + " употребил " + realGood); + } + + public String getName() { + return name; + } +} diff --git a/src/ru/milandr/courses/farm/frolov/animals/Cow.java b/src/ru/milandr/courses/farm/frolov/animals/Cow.java new file mode 100644 index 0000000..0f95796 --- /dev/null +++ b/src/ru/milandr/courses/farm/frolov/animals/Cow.java @@ -0,0 +1,26 @@ +package ru.milandr.courses.farm.frolov.animals; + +import ru.milandr.courses.farm.Good; +import ru.milandr.courses.farm.frolov.goods.Milk; + +public class Cow extends SuperAnimal { + + public Cow(String name) { + super(name); + } + + @Override + public void produceSound() { + System.out.println("му-му"); + } + + @Override + public Good produceGoods() { + return new Milk(); + } + + @Override + public String toString() { + return "Корова " + name; + } +} diff --git a/src/ru/milandr/courses/farm/frolov/animals/Goat.java b/src/ru/milandr/courses/farm/frolov/animals/Goat.java new file mode 100644 index 0000000..e5bcd5f --- /dev/null +++ b/src/ru/milandr/courses/farm/frolov/animals/Goat.java @@ -0,0 +1,26 @@ +package ru.milandr.courses.farm.frolov.animals; + +import ru.milandr.courses.farm.Good; +import ru.milandr.courses.farm.frolov.goods.Cheese; + +public class Goat extends SuperAnimal { + + public Goat(String name) { + super(name); + } + + @Override + public void produceSound() { + System.out.println("бе-бе"); + } + + @Override + public Good produceGoods() { + return new Cheese(); + } + + @Override + public String toString() { + return "Коза " + name; + } +} diff --git a/src/ru/milandr/courses/farm/frolov/animals/Pig.java b/src/ru/milandr/courses/farm/frolov/animals/Pig.java new file mode 100644 index 0000000..3c2733a --- /dev/null +++ b/src/ru/milandr/courses/farm/frolov/animals/Pig.java @@ -0,0 +1,37 @@ +package ru.milandr.courses.farm.frolov.animals; + +import ru.milandr.courses.farm.Good; +import ru.milandr.courses.farm.frolov.goods.Meat; + +public class Pig extends SuperAnimal { + private boolean isAlive; + + public Pig(String name) { + super(name); + this.isAlive = true; + } + + @Override + public void produceSound() { + if (isAlive) { + System.out.println("хрю-хрю"); + } else { + System.out.println("<<загробные звуки>> хрю-хрю"); + } + } + + @Override + public Good produceGoods() { + if (isAlive) { + isAlive = false; + return new Meat(); + } + System.out.println("Свинка " + name + " уже отдала свое мясо."); + return null; + } + + @Override + public String toString() { + return "Свинка " + name; + } +} diff --git a/src/ru/milandr/courses/farm/frolov/animals/SuperAnimal.java b/src/ru/milandr/courses/farm/frolov/animals/SuperAnimal.java new file mode 100644 index 0000000..4398af1 --- /dev/null +++ b/src/ru/milandr/courses/farm/frolov/animals/SuperAnimal.java @@ -0,0 +1,15 @@ +package ru.milandr.courses.farm.frolov.animals; + +import ru.milandr.courses.farm.Animal; + +public abstract class SuperAnimal implements Animal { + protected String name; + + public SuperAnimal(String name) { + this.name = name; + } + + public String getName() { + return name; + } +} diff --git a/src/ru/milandr/courses/farm/frolov/goods/Cheese.java b/src/ru/milandr/courses/farm/frolov/goods/Cheese.java new file mode 100644 index 0000000..44ef667 --- /dev/null +++ b/src/ru/milandr/courses/farm/frolov/goods/Cheese.java @@ -0,0 +1,22 @@ +package ru.milandr.courses.farm.frolov.goods; + +import ru.milandr.courses.farm.frolov.FarmerAbobus; + +public class Cheese extends SuperGood { + private static final long CHEESE_EXTENDED_TIME_MS = 10000; + public static final String CHEESE_NAME = "сыр"; + + public Cheese() { + extendedTime = CHEESE_EXTENDED_TIME_MS; + } + + @Override + public void getCollected(FarmerAbobus farmer) { + System.out.println(farmer.getName() + " сварил сыр"); + } + + @Override + public String toString() { + return CHEESE_NAME; + } +} \ No newline at end of file diff --git a/src/ru/milandr/courses/farm/frolov/goods/Meat.java b/src/ru/milandr/courses/farm/frolov/goods/Meat.java new file mode 100644 index 0000000..f9ef591 --- /dev/null +++ b/src/ru/milandr/courses/farm/frolov/goods/Meat.java @@ -0,0 +1,22 @@ +package ru.milandr.courses.farm.frolov.goods; + +import ru.milandr.courses.farm.frolov.FarmerAbobus; + +public class Meat extends SuperGood { + private static final long MEAT_EXTENDED_TIME_MS = 7500; + public static final String MEAT_NAME = "мясо"; + + public Meat() { + extendedTime = MEAT_EXTENDED_TIME_MS; + } + + @Override + public void getCollected(FarmerAbobus farmer) { + System.out.println(farmer.getName() + " заколол порося"); + } + + @Override + public String toString() { + return MEAT_NAME; + } +} \ No newline at end of file diff --git a/src/ru/milandr/courses/farm/frolov/goods/Milk.java b/src/ru/milandr/courses/farm/frolov/goods/Milk.java new file mode 100644 index 0000000..6efa94c --- /dev/null +++ b/src/ru/milandr/courses/farm/frolov/goods/Milk.java @@ -0,0 +1,22 @@ +package ru.milandr.courses.farm.frolov.goods; + +import ru.milandr.courses.farm.frolov.FarmerAbobus; + +public class Milk extends SuperGood { + private static final long MILK_EXTENDED_TIME_MS = 5000; + public static final String MILK_NAME = "молоко"; + + public Milk() { + extendedTime = MILK_EXTENDED_TIME_MS; + } + + @Override + public void getCollected(FarmerAbobus farmer) { + System.out.println(farmer.getName() + " подоил корову"); + } + + @Override + public String toString() { + return MILK_NAME; + } +} diff --git a/src/ru/milandr/courses/farm/frolov/goods/SuperGood.java b/src/ru/milandr/courses/farm/frolov/goods/SuperGood.java new file mode 100644 index 0000000..90dff20 --- /dev/null +++ b/src/ru/milandr/courses/farm/frolov/goods/SuperGood.java @@ -0,0 +1,41 @@ +package ru.milandr.courses.farm.frolov.goods; + +import ru.milandr.courses.farm.Good; +import ru.milandr.courses.farm.frolov.FarmerAbobus; + +public abstract class SuperGood implements Good { + private boolean isRotten; + private final long creationTime; + protected long extendedTime; + + public SuperGood() { + isRotten = false; + creationTime = System.currentTimeMillis(); + } + + @Override + public void goRotten() { + if (isRotten) { + System.out.println(this + " уже испорчено"); + return; + } + if (checkTime()) { + System.out.println(this + " испортилось"); + return; + } + System.out.println("Срок годности" + this + " еще не закончился"); + } + + + public abstract void getCollected(FarmerAbobus farmer); + + public boolean isRotten() { + isRotten = checkTime(); + return isRotten; + } + + private boolean checkTime() { + return System.currentTimeMillis() > creationTime + extendedTime; + } + +}