Skip to content

Instantly share code, notes, and snippets.

@rmuhamedgaliev
Created November 16, 2021 23:36
Show Gist options
  • Save rmuhamedgaliev/86b9605cc1f2815ebddca9a25e7bc04f to your computer and use it in GitHub Desktop.
Save rmuhamedgaliev/86b9605cc1f2815ebddca9a25e7bc04f to your computer and use it in GitHub Desktop.
TestTask.java
import java.time.LocalDate;
import java.util.Arrays;
import java.util.Scanner;
public class Scratch {
// Название метода не соотвествует содержимому в методе, он просто проверяет год, но на что проверяет не понятно
public static void checkYear(int year) {
// Для человека не знакомого с сутью проверки не очень понятно что означает 4, 100, 400? Это называется
// "магические перменные", так же я бы выделил это условие на разные логические соотвляющие с префиксом is
// Печать стоило бы разделить от проверки, так как например в будущем вы захотите вывести результат в файл
// или в HTTP
// Так же не выполнено условие по сообщению
// Результат программы выведите в консоль. Если год високосной, то должно быть выведено “номер года –
// високосный год”. Если год не високосный, то, соответственно : “номер года – не високосный год”
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
System.out.printf("%d is a leap year\n", year);
} else {
System.out.printf("%d is not a leap year\n", year);
}
}
public static void checkOS(int deviceYear, int clientOS) {
int currentYear = LocalDate.now().getYear();
// Проверку системы стоит выделить в отдельный метод и возвращать назвагние строкой
// Стоит избавиться от магических переменных, а завести через константы
if (clientOS == 1) {
// Проверка дублируется и вообще сообщения тоже дублируются необходимо подумать надо декомпозицией метода
// для избавления от дублирования
if (deviceYear < currentYear) {
System.out.println("Install the lite-version for iOS at the link");
} else if (deviceYear == currentYear) {
System.out.println("Install the full-version for iOS at the link");
} else {
System.out.println("Incorrect input!");
}
// Стоит избавиться от магических переменных, а завести через константы
} else if (clientOS == 0) {
// Проверка дублируется
if (deviceYear < currentYear) {
System.out.println("Install the lite-version for Android at the link");
} else if (deviceYear == currentYear) {
System.out.println("Install the full-version for Android at the link");
} else {
System.out.println("Incorrect input!");
}
} else {
System.out.println("Incorrect input!");
}
}
// Проверку на крайние кейсы необходимо вынести в начало метода, что бы метод отработал быстрее и не затрагивал
// логику, так же я бы рекомендовал проверить услование, например если мы напишем значение 200, то по времени
// доставки оно будет равно для дистанции 100 - этого немного странно. Лучше уточнить и проработать алгоритм
// расчета времени доставки
public static int calcDeliveryTime(int deliveryDistance) {
int deliveryTime = 1;
if (deliveryDistance > 20) {
deliveryTime++;
}
if (deliveryDistance > 60) {
deliveryTime++;
}
if (deliveryDistance <= 0) {
System.out.println("Incorrect input!");
return 0;
}
return deliveryTime;
}
public static void checkDoubles(String str) {
for (int i = 0; i < str.length() - 1; i++) {
// Я бы выделил в переменные str.charAt(i) например. char current = str.charAt(i), что бы было более
// понятнее
if (str.charAt(i) == str.charAt(i + 1)) {
System.out.printf("Duplicate character '%c' found.\n", str.charAt(i));
return;
}
}
System.out.println("Duplicate characters not found.");
}
// Не экономьте символы и не сохраняйте перменные вида 't', очевиднее будет tail
public static void reverseArrayOrder(int[] arr) {
for (int i = 0; i < arr.length / 2; i++) {
int t = arr[i];
// Тут повторяется индекс - (arr.length - i - 1) так легко ошибится, лучше сохзраняйте в перменные такие
// значения
arr[i] = arr[arr.length - i - 1];
arr[arr.length - i - 1] = t;
}
}
public static int[] generateRandomArray() {
java.util.Random random = new java.util.Random();
// Для гибкости данное значение 30 можно вынести в аргумент
int[] arr = new int[30];
for (int i = 0; i < arr.length; i++) {
arr[i] = random.nextInt(100_000) + 100_000;
}
return arr;
}
public static double getAverage(int[] arr) {
double sum = getSum(arr);
// Лучше вынести этот шаг в отдельный метод который будет считать среднее значение, так как из логики не
// совсем пожет быть ясно что скрывается за понятием arr.length, а по настоящему это количество дней
double averageValue = sum / arr.length;
// предыдущей результат можно сразу возвращать из функции
return averageValue;
}
public static double getSum(int[] arr) {
int sum = 0;
for (int i = 0; i < arr.length; i++) {
sum += arr[i];
}
return sum;
}
// Тут полностью отсуствует обработка ошибок и например если ввести неверное значение, то приложение попросту падает
// Советовал бы реализовать простое меню, котрое содержит обработку ошибок и выбор задания
public static void main(String[] args) {
//task1
Scanner input = new Scanner(System.in);
System.out.print("Enter the year: ");
int y = input.nextInt();
checkYear(y);
//task2
System.out.print("Enter the year of manufacture of the device: ");
int deviceYear = input.nextInt();
System.out.print("Enter 0 if you have Android OS or 1 if iOS: ");
int deviceOS = input.nextInt();
checkOS(deviceYear, deviceOS);
//task3
System.out.print("Enter the distance: ");
int dist = input.nextInt();
System.out.printf("Delivery will take %d days.\n", calcDeliveryTime(dist));
//task4
System.out.print("Enter some line: ");
String s = input.next();
checkDoubles(s);
input.close();
//task5
int[] array = {3, 2, 1, 6, 5};
reverseArrayOrder(array);
System.out.println("The reversed array looks like this: " + Arrays.toString(array));
//task6
int[] arr = generateRandomArray();
double averageArr = getAverage(arr);
System.out.printf("The average expenditure was %.2f rubles. \n", averageArr);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment