diff --git a/README.md b/README.md index ce75dfc..c5d372f 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,10 @@ - Пакет `ru.mentee.power` содержит: - `ru.mentee.power.HelloWorld.java` - программа для вывода приветствия - `ru.mentee.power.HelloGit.java` - простой пример работы с Git + - `ru.mentee.power.DataTypeBoundaries.java` - демонстрация границ примитивных типов в java + - `ru.mentee.power.DataTypesInAction.java` - демонстрация явного и неявного преобразования примитивных типов в java + - `ru.mentee.power.SmartCalculator.java` - пример калькулятора, который работает с разными типами и приводит к нужным во избежание потери данных + - `ru.mentee.power.TypePuzzle.java` - примеры неявного поведения примитивных типов с объяснениями - Пакет `ru.mentee.power.variables` содержит: - `ru.mentee.power.variables.PersonalCard` - пример объявления и вывода переменных разного типа - `ru.mentee.power.variables.TypeCalculator` - примеры конвертации числовых типов diff --git a/src/ru/mentee/power/CurrencyConverter.java b/src/ru/mentee/power/CurrencyConverter.java new file mode 100644 index 0000000..f86dce2 --- /dev/null +++ b/src/ru/mentee/power/CurrencyConverter.java @@ -0,0 +1,27 @@ +package ru.mentee.power; + +public class CurrencyConverter { + public static void main(String[] args) { + final double usdExchangeRate = 80.85; + final double eurExchangeRate = 93.92; + final double cnyExchangeRate = 11.28; + + double usdValue = 1000; + double eurValue = 800; + double cnyValue = 150.3; + + System.out.println("Курсы валют:"); + System.out.printf("1 USD = %f RUB\n", usdExchangeRate); + System.out.printf("1 EUR = %f RUB\n", eurExchangeRate); + System.out.printf("1 CNY = %f RUB\n", cnyExchangeRate); + System.out.print("\n"); + System.out.println("Конвертация:"); + System.out.printf("%f USD = %f RUB\n", usdValue, usdExchangeRate * usdValue); + System.out.printf("%f EUR = %f RUB\n", usdValue, eurExchangeRate * eurValue); + System.out.printf("%f CNY = %f RUB\n", usdValue, cnyExchangeRate * cnyValue); + System.out.println("Демонстрация проблемы точности с double:"); + + System.out.printf("0.3 + 0.4 == %.10f", 0.3f + 0.4f); + System.out.printf("(0.1 + 0.2) == 0.3 ? %b", 0.1 + 0.2 == 0.3); + } +} diff --git a/src/ru/mentee/power/DataTypeBoundaries.java b/src/ru/mentee/power/DataTypeBoundaries.java new file mode 100644 index 0000000..751de16 --- /dev/null +++ b/src/ru/mentee/power/DataTypeBoundaries.java @@ -0,0 +1,15 @@ +package ru.mentee.power; + +public class DataTypeBoundaries { + public static void main(String[] args) { + System.out.printf("Byte minimum = %d, Byte maximum = %d\n", Byte.MIN_VALUE, Byte.MAX_VALUE); + System.out.printf("Short minimum = %d, Short maximum = %d\n", Short.MIN_VALUE, Short.MAX_VALUE); + System.out.printf("Integer minimum = %d, Integer maximum = %d\n", Integer.MIN_VALUE, Integer.MAX_VALUE); + System.out.printf("Long minimum = %d, Long maximum = %d\n", Long.MIN_VALUE, Long.MAX_VALUE); + System.out.printf("Float minimum = %f, Float maximum = %f\n", Float.MIN_VALUE, Float.MAX_VALUE); + System.out.printf("Double minimum = %f, Double maximum = %f\n", Double.MIN_VALUE, Double.MAX_VALUE); + + short testValue = Short.MAX_VALUE; + System.out.printf("Short type overflow when adding 1 to max value -> %d + 1 = %d", testValue, (short) (testValue + 1) ); + } +} diff --git a/src/ru/mentee/power/DataTypesInAction.java b/src/ru/mentee/power/DataTypesInAction.java new file mode 100644 index 0000000..f2997c9 --- /dev/null +++ b/src/ru/mentee/power/DataTypesInAction.java @@ -0,0 +1,35 @@ +package ru.mentee.power; + +public class DataTypesInAction { + public static void main(String[] args) { + int intNum1 = 29; + int intNum2 = 5; + int intNum3 = 74; + short shortNum = 250; + double doubleNum = 3.3; + float floatNum = 4.5f; + byte byteNum1 = 70; + byte byteNum2 = 68; + + System.out.println("Целочисленное деление:"); + System.out.printf("%d / %d = %d\n", intNum1, intNum2, intNum1 / intNum2); + System.out.println("Деление с плавающей точкой:"); + System.out.printf("%d / %f = %f\n", intNum1, doubleNum, intNum1 / doubleNum); + System.out.println("Явное приведение типов:"); + System.out.printf("float %f к int %d - отбрасывание дробной части\n", floatNum, (int) floatNum); + System.out.printf("int %d к char %c - конвертация в символ с таким же кодом\n", intNum3, (char) intNum3); + System.out.printf("short %d к byte %d - сужение типа\n", shortNum, (byte) shortNum); + System.out.println("Автоматическое повышение типа:"); + System.out.printf("byte + byte = int: %d + %d = %d\n", byteNum1, byteNum2, byteNum1 + byteNum2); + System.out.printf("int + double = double: %d + %f = %f\n", intNum1, doubleNum, intNum1 + doubleNum); + System.out.println("Операции с boolean:"); + System.out.printf("false && false = %b\n", false && false); + System.out.printf("false && true = %b\n", false && true); + System.out.printf("true || false = %b\n", true || false); + System.out.println("Работа с символами:"); + System.out.printf("Код символа 'K' = %d\n", (int) 'K'); + System.out.printf("Символ кода 78 = %c\n", (char) 78); + System.out.printf("'K' + 5 = %c\n", 'K' + 5); + + } +} diff --git a/src/ru/mentee/power/SmartCalculator.java b/src/ru/mentee/power/SmartCalculator.java new file mode 100644 index 0000000..4a755e4 --- /dev/null +++ b/src/ru/mentee/power/SmartCalculator.java @@ -0,0 +1,32 @@ +package ru.mentee.power; + +public class SmartCalculator { + public static void main(String[] args) { + + // int + double автоматически приводит результат в double + System.out.printf("Сложение: 213 + 111.5 = %.2f - double\n", 213 + 115.5); + // int - int оставляют тип int + System.out.printf("Вычитание: 99 - 9 = %d - int\n", 99 - 9); + // int * double автоматически приводит результат в double + System.out.printf("Умножение: 12 * 2.5 = %.2f - double\n", 12 * 2.5); + // int / int оставляет тип int и отбрасывает остаток, но мы его сохраняем с помощью кастинга + System.out.printf("Деление: 100 / 11 = %.2f - double\n", (double) 100 / 11); + // int / int оставляет тип int, остаток отброшен + System.out.printf("Деление целочисленное: 75 / 15 = %d - int\n", 75 / 15); + // int % int возвращает нам только остаток от деления + System.out.printf("Остаток от деления: 80 / 15 = %d - int\n", 80 % 15); + // Метод возведения в степень принимает и возвращает только тип double + System.out.printf("Возведение в степень: 11 ^ 5 = %.3f\n", Math.pow(11, 5)); + System.out.println("Обработка особых случаев:"); + // Выводим результат деления переменной типа double на 0 + System.out.println("Попытка деления на ноль (для double): " + 2.0 / 0); + // Пытаемся поделить на ноль, ловим исключение и выводим его сообщение + try { + int a = 2 / 0; + } catch (Exception e) { + System.out.println("Попытка деления на ноль (для int): " + e.getMessage()); + } + + + } +} diff --git a/src/ru/mentee/power/TypePuzzle.java b/src/ru/mentee/power/TypePuzzle.java new file mode 100644 index 0000000..2ccfb20 --- /dev/null +++ b/src/ru/mentee/power/TypePuzzle.java @@ -0,0 +1,22 @@ +package ru.mentee.power; + +public class TypePuzzle { + public static void main(String[] args) { + + System.out.println("1) Сравнение двух строк с одинаковым содержанием:"); + System.out.println("Первую строку создаём написанием константы, вторую создаём как новый объект через new"); + String helloString1 = "hello"; + String helloString2 = new String("hello"); + System.out.printf("Содержание первой строки - %s\nСодержание второй строки - %s\n", helloString1, helloString2); + System.out.println("Сравниваем строки через оператор '==' -> " + (helloString1 == helloString2)); + System.out.println("Решение - использовать метод equals(), который сравнивает содержание, а не ссылки"); + + System.out.println("2) Автоматическая конвертация чисел в строку при конкатенации:"); + System.out.println("Если мы хотим сложить два числа в формате 2 + 2 и присоединить их к строке, то получим неожиданный результат"); + System.out.println("Сумма 2 + 2 = " + 2 + 2); + System.out.println("В данном случае, сложения не произошло, а каждое число просто сконкатенировалось со строкой по отдельности"); + System.out.println("Исправляется данная ошибка с помощью вынесения арифметических операций в скобки"); + System.out.println("Сумма (2 + 2) = " + (2 + 2)); + + } +}