Към съдържанието
wannacode

Задачи

Тук са задачите на курса на едно място. Първо 50 самостоятелни задачи от „Здравей, свят“ до най-кратък път в матрица, всяка с пример и решение на Java, проверено с истински компилатор. После задачите от уроците, по модули: всяка води към урока, където е обяснено нужното.

50 задачи за упражнение

  1. 1. Hello World

    Изпиши на конзолата текста Hello, World! – програмата няма вход.

    Без вход.

    Изход
    Hello, World!

    Нужното е в урока: Първата програма

    Решение
    public class Main {
    public static void main(String[] args) {
    System.out.println("Hello, World!");
    }
    }
  2. 2. Поздрави потребителя

    Прочети име от един ред и поздрави човека по име във вида „Здравей, <име>!“.

    Вход
    Мария
    Изход
    Здравей, Мария!

    Нужното е в урока: Вход и изход

    Решение
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    String name = in.nextLine();
    System.out.println("Здравей, " + name + "!");
    }
    }
  3. 3. Изписване на възраст

    Прочети възрастта на потребителя (цяло число), запази я в променлива и я изпиши в изречение.

    Вход
    17
    Изход
    Ти си на 17 години.

    Нужното е в урока: Променливи и типове

    Решение
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int age = Integer.parseInt(in.nextLine());
    System.out.println("Ти си на " + age + " години.");
    }
    }
  4. 4. Конвертор на единици

    Прочети дължина в инчове (може да е дробно число) и я преобразувай в сантиметри: 1 инч = 2.54 см. Изпиши резултата с 2 знака след точката.

    Вход
    12.5
    Изход
    31.75 см

    Нужното е в урока: Оператори и аритметика

    Решение
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    double inches = Double.parseDouble(in.nextLine());
    System.out.printf("%.2f см%n", inches * 2.54);
    }
    }
  5. 5. Проверка за четност

    Прочети цяло число и изпиши дали е четно, или нечетно.

    Вход
    7
    Изход
    7 е нечетно.

    Нужното е в урока: Условия

    Решение
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int number = Integer.parseInt(in.nextLine());
    if (number % 2 == 0) {
    System.out.println(number + " е четно.");
    } else {
    System.out.println(number + " е нечетно.");
    }
    }
    }
  6. 6. Сума на числа

    Прочети две цели числа, всяко на отделен ред, и изпиши сумата им.

    Вход
    12
    30
    Изход
    Сумата е 42.

    Нужното е в урока: Оператори и аритметика

    Решение
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int first = Integer.parseInt(in.nextLine());
    int second = Integer.parseInt(in.nextLine());
    System.out.println("Сумата е " + (first + second) + ".");
    }
    }
  7. 7. Площ на квадрат

    Прочети страната на квадрат (цяло число) и изпиши лицето му.

    Вход
    5
    Изход
    Лицето е 25.

    Нужното е в урока: Оператори и аритметика

    Решение
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int side = Integer.parseInt(in.nextLine());
    System.out.println("Лицето е " + side * side + ".");
    }
    }
  8. 8. Обем на сфера

    Прочети радиуса r (може да е дробно число) и изпиши обема на сферата V = 4/3 · π · r³ с 2 знака след точката.

    Вход
    3
    Изход
    Обемът е 113.10.

    Нужното е в урока: Оператори и аритметика

    Решение
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    double r = Double.parseDouble(in.nextLine());
    double volume = 4.0 / 3 * Math.PI * r * r * r;
    System.out.printf("Обемът е %.2f.%n", volume);
    }
    }
  9. 9. Сравнение на числа

    Прочети две цели числа, всяко на отделен ред, и изпиши по-голямото от тях (ако са равни, което и да е).

    Вход
    8
    15
    Изход
    По-голямото е 15.

    Нужното е в урока: Условия

    Решение
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int a = Integer.parseInt(in.nextLine());
    int b = Integer.parseInt(in.nextLine());
    if (a > b) {
    System.out.println("По-голямото е " + a + ".");
    } else {
    System.out.println("По-голямото е " + b + ".");
    }
    }
    }
  10. 10. Проверка за триъгълник

    Прочети три цели числа, всяко на отделен ред, и провери дали могат да са страни на триъгълник: сборът на всеки две трябва да е по-голям от третото.

    Вход
    3
    4
    5
    Изход
    Могат да образуват триъгълник.

    Нужното е в урока: Условия

    Решение
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int a = Integer.parseInt(in.nextLine());
    int b = Integer.parseInt(in.nextLine());
    int c = Integer.parseInt(in.nextLine());
    if (a + b > c && a + c > b && b + c > a) {
    System.out.println("Могат да образуват триъгълник.");
    } else {
    System.out.println("Не могат да образуват триъгълник.");
    }
    }
    }
  11. 11. Класификация по оценка

    Прочети оценка от 2 до 6 (може да е дробна) и изпиши словом: от 5.50 – Отличен, от 4.50 – Много добър, от 3.50 – Добър, от 3.00 – Среден, под 3.00 – Слаб.

    Вход
    4.75
    Изход
    Много добър

    Нужното е в урока: Условия

    Решение
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    double grade = Double.parseDouble(in.nextLine());
    if (grade >= 5.5) {
    System.out.println("Отличен");
    } else if (grade >= 4.5) {
    System.out.println("Много добър");
    } else if (grade >= 3.5) {
    System.out.println("Добър");
    } else if (grade >= 3) {
    System.out.println("Среден");
    } else {
    System.out.println("Слаб");
    }
    }
    }
  12. 12. Конвертиране на време

    Прочети брой часове (цяло число) и изпиши колко секунди са.

    Вход
    2
    Изход
    7200 секунди

    Нужното е в урока: Оператори и аритметика

    Решение
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int hours = Integer.parseInt(in.nextLine());
    System.out.println(hours * 3600 + " секунди");
    }
    }
  13. 13. Изброяване до N

    Прочети цяло число N и изпиши числата от 1 до N, всяко на нов ред.

    Вход
    5
    Изход
    1
    2
    3
    4
    5

    Нужното е в урока: Цикли

    Решение
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int n = Integer.parseInt(in.nextLine());
    for (int i = 1; i <= n; i++) {
    System.out.println(i);
    }
    }
    }
  14. 14. ASCII стойност

    Прочети един символ (първия символ на реда) и изпиши неговия ASCII код, тоест числото, с което компютърът го пази.

    Вход
    A
    Изход
    Кодът на A е 65.

    Нужното е в урока: Низове: работа с текст

    Решение
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    char symbol = in.nextLine().charAt(0);
    System.out.println("Кодът на " + symbol + " е " + (int) symbol + ".");
    }
    }
  15. 15. Квадратно уравнение

    Прочети a, b и c, всяко на отделен ред, и реши уравнението ax² + bx + c = 0. При два корена изпиши „x1 = …, x2 = …“ (x1 е с +√D), при един – „x = …“, с 2 знака след точката; ако корени няма или a е 0, кажи го.

    Вход
    1
    -3
    2
    Изход
    x1 = 2.00, x2 = 1.00

    Нужното е в урока: Условия

    Решение
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    double a = Double.parseDouble(in.nextLine());
    double b = Double.parseDouble(in.nextLine());
    double c = Double.parseDouble(in.nextLine());
    if (a == 0) {
    System.out.println("Това не е квадратно уравнение");
    } else {
    double d = b * b - 4 * a * c;
    if (d > 0) {
    double x1 = (-b + Math.sqrt(d)) / (2 * a);
    double x2 = (-b - Math.sqrt(d)) / (2 * a);
    System.out.printf("x1 = %.2f, x2 = %.2f%n", x1, x2);
    } else if (d == 0) {
    System.out.printf("x = %.2f%n", -b / (2 * a));
    } else {
    System.out.println("Няма реални корени");
    }
    }
    }
    }
  16. 16. Положително или отрицателно

    Прочети цяло число и изпиши дали е положително, отрицателно, или нула.

    Вход
    -4
    Изход
    Отрицателно

    Нужното е в урока: Условия

    Решение
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int number = Integer.parseInt(in.nextLine());
    if (number > 0) {
    System.out.println("Положително");
    } else if (number < 0) {
    System.out.println("Отрицателно");
    } else {
    System.out.println("Нула");
    }
    }
    }
  17. 17. Сезони

    Прочети номер на месец (1–12) и изпиши сезона: 12, 1, 2 – Зима, 3–5 – Пролет, 6–8 – Лято, 9–11 – Есен. За друго число изпиши „Невалиден месец“.

    Вход
    4
    Изход
    Пролет

    Нужното е в урока: Условия

    Решение
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int month = Integer.parseInt(in.nextLine());
    if (month < 1 || month > 12) {
    System.out.println("Невалиден месец");
    } else if (month == 12 || month <= 2) {
    System.out.println("Зима");
    } else if (month <= 5) {
    System.out.println("Пролет");
    } else if (month <= 8) {
    System.out.println("Лято");
    } else {
    System.out.println("Есен");
    }
    }
    }
  18. 18. Обратен ред на число

    Прочети цяло положително число и изведи числото с цифрите му в обратен ред: от 123 става 321. Нулите, които излизат отпред, изчезват (от 1200 става 21). Вземай последната цифра с % 10 и я махай с деление на 10.

    Вход
    9071
    Изход
    1709

    Нужното е в урока: Цикли

    Решение
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int n = in.nextInt();
    int reversed = 0;
    while (n > 0) {
    reversed = reversed * 10 + n % 10;
    n /= 10;
    }
    System.out.println(reversed);
    }
    }
  19. 19. Температурен конвертор

    Прочети температура в градуси по Целзий (може да е дробно число, с точка) и я изведи във Фаренхайт с два знака след точката. Формулата е F = C * 9 / 5 + 32.

    Вход
    36.6
    Изход
    97.88 °F

    Нужното е в урока: Оператори и аритметика

    Решение
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    double celsius = Double.parseDouble(in.nextLine());
    double fahrenheit = celsius * 9 / 5 + 32;
    System.out.printf("%.2f °F%n", fahrenheit);
    }
    }
  20. 20. Име с най-много букви

    На първия ред е броят на имената n, на следващите n реда по едно име. Изведи името с най-много букви и броя им в скоби; ако две имена са еднакво дълги, изведи първото от тях.

    Вход
    4
    Мария
    Александра
    Иван
    Константин
    Изход
    Александра (10 букви)

    Нужното е в урока: Низове: работа с текст

    Решение
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int n = Integer.parseInt(in.nextLine());
    String longest = "";
    for (int i = 0; i < n; i++) {
    String name = in.nextLine();
    if (name.length() > longest.length()) {
    longest = name;
    }
    }
    System.out.println(longest + " (" + longest.length() + " букви)");
    }
    }
  21. 21. Брояч на думи

    Прочети един ред текст и изведи колко думи има в него. Думите са разделени с един или повече интервала, така че празните парчета между два интервала не са думи.

    Вход
    Пиша код всеки ден и ставам по-добър
    Изход
    7

    Нужното е в урока: Низове: работа с текст

    Решение
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    String line = in.nextLine();
    String[] words = line.trim().split(" +");
    System.out.println(words.length);
    }
    }
  22. 22. Просто число

    Прочети цяло число n и провери дали е просто: по-голямо от 1 и се дели само на 1 и на себе си. Достатъчно е да пробваш делителите i, за които i * i <= n.

    Вход
    91
    Изход
    91 не е просто

    Нужното е в урока: Цикли

    Решение
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int n = in.nextInt();
    boolean prime = n > 1;
    for (int i = 2; i * i <= n; i++) {
    if (n % i == 0) {
    prime = false;
    break;
    }
    }
    if (prime) {
    System.out.println(n + " е просто");
    } else {
    System.out.println(n + " не е просто");
    }
    }
    }
  23. 23. Ден от седмицата

    Прочети число от 1 до 7 и изведи името на деня от седмицата на български, като 1 е понеделник. Имената дръж в масив; за друго число изведи „Няма такъв ден“.

    Вход
    5
    Изход
    Петък

    Нужното е в урока: Масиви

    Решение
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int day = in.nextInt();
    String[] days = { "Понеделник", "Вторник", "Сряда", "Четвъртък", "Петък", "Събота", "Неделя" };
    if (day >= 1 && day <= 7) {
    System.out.println(days[day - 1]);
    } else {
    System.out.println("Няма такъв ден");
    }
    }
    }
  24. 24. Факториел

    Прочети цяло число n от 0 до 15 и изведи n! = 1 * 2 * … * n (0! е 1). Още 13! не се побира в int, затова в Java и C# пази произведението в long.

    Вход
    15
    Изход
    15! = 1307674368000

    Нужното е в урока: Цикли

    Решение
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int n = in.nextInt();
    long factorial = 1;
    for (int i = 2; i <= n; i++) {
    factorial *= i;
    }
    System.out.println(n + "! = " + factorial);
    }
    }
  25. 25. Валидна дата

    Прочети ден, месец и година, всяко на отделен ред, и изведи „Валидна дата“ или „Невалидна дата“. Годината е поне 1, месецът е от 1 до 12, а денят от 1 до броя дни в месеца; февруари има 29 дни във високосна година (делима на 4, но не на 100, освен ако е делима на 400).

    Вход
    29
    2
    2100
    Изход
    Невалидна дата

    Нужното е в урока: Условия

    Решение
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int day = in.nextInt();
    int month = in.nextInt();
    int year = in.nextInt();
    boolean leap = (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
    int days;
    if (month == 2) {
    days = leap ? 29 : 28;
    } else if (month == 4 || month == 6 || month == 9 || month == 11) {
    days = 30;
    } else {
    days = 31;
    }
    if (year >= 1 && month >= 1 && month <= 12 && day >= 1 && day <= days) {
    System.out.println("Валидна дата");
    } else {
    System.out.println("Невалидна дата");
    }
    }
    }
  26. 26. Честота на букви

    Прочети един ред текст и изведи колко пъти се среща всяка буква в него, без значение дали е главна или малка. Изведи буквите по азбучен ред, по една на ред във вида „а: 5“; интервалите и препинателните знаци не се броят.

    Вход
    Банан и ананас!
    Изход
    а: 5
    б: 1
    и: 1
    н: 4
    с: 1

    Нужното е в урока: HashMap и HashSet

    Решение
    import java.util.Map;
    import java.util.Scanner;
    import java.util.TreeMap;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    String text = in.nextLine().toLowerCase();
    Map<Character, Integer> counts = new TreeMap<>();
    for (char c : text.toCharArray()) {
    if (Character.isLetter(c)) {
    counts.put(c, counts.getOrDefault(c, 0) + 1);
    }
    }
    for (char c : counts.keySet()) {
    System.out.println(c + ": " + counts.get(c));
    }
    }
    }
  27. 27. Минимум и максимум в масив

    На първия ред е броят n, на следващите n реда по едно цяло число. Прочети ги в масив и изведи най-малкото и най-голямото, като започнеш от първия елемент и сравняваш с останалите.

    Вход
    5
    7
    -3
    12
    0
    4
    Изход
    Най-малко: -3
    Най-голямо: 12

    Нужното е в урока: Масиви

    Решение
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int n = in.nextInt();
    int[] numbers = new int[n];
    for (int i = 0; i < n; i++) {
    numbers[i] = in.nextInt();
    }
    int min = numbers[0];
    int max = numbers[0];
    for (int i = 1; i < n; i++) {
    if (numbers[i] < min) {
    min = numbers[i];
    }
    if (numbers[i] > max) {
    max = numbers[i];
    }
    }
    System.out.println("Най-малко: " + min);
    System.out.println("Най-голямо: " + max);
    }
    }
  28. 28. Сортиране на масив

    На първия ред е броят n, на следващите n реда по едно цяло число. Подреди ги сам във възходящ ред с метода на мехурчето (n - 1 минавания, във всяко разменяш съседи, които са в грешен ред) и ги изведи на един ред, разделени с интервал.

    Вход
    6
    5
    2
    9
    1
    5
    6
    Изход
    1 2 5 5 6 9

    Нужното е в урока: Масиви

    Решение
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int n = in.nextInt();
    int[] numbers = new int[n];
    for (int i = 0; i < n; i++) {
    numbers[i] = in.nextInt();
    }
    for (int pass = 0; pass < n - 1; pass++) {
    for (int i = 0; i < n - 1 - pass; i++) {
    if (numbers[i] > numbers[i + 1]) {
    int temp = numbers[i];
    numbers[i] = numbers[i + 1];
    numbers[i + 1] = temp;
    }
    }
    }
    for (int i = 0; i < n; i++) {
    if (i > 0) {
    System.out.print(" ");
    }
    System.out.print(numbers[i]);
    }
    System.out.println();
    }
    }
  29. 29. Замяна на гласните

    Прочети един ред текст и го изведи, като всяка гласна, главна или малка, е заменена със знака *. Гласните са а, е, и, о, у, ъ, ю, я.

    Вход
    Обичам да програмирам
    Изход
    *б*ч*м д* пр*гр*м*р*м

    Нужното е в урока: Низове: работа с текст

    Решение
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    String text = in.nextLine();
    String vowels = "аеиоуъюя";
    String result = "";
    for (char c : text.toCharArray()) {
    if (vowels.indexOf(Character.toLowerCase(c)) >= 0) {
    result += "*";
    } else {
    result += c;
    }
    }
    System.out.println(result);
    }
    }
  30. 30. Сума на цифрите

    Прочети цяло неотрицателно число и изведи сумата на цифрите му. Последната цифра е n % 10, а n / 10 я маха (в Python n // 10).

    Вход
    9875
    Изход
    29

    Нужното е в урока: Цикли

    Решение
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int n = in.nextInt();
    int sum = 0;
    while (n > 0) {
    sum += n % 10;
    n /= 10;
    }
    System.out.println(sum);
    }
    }
  31. 31. Палиндром

    Прочети един ред текст и провери дали е палиндром, тоест чете се еднакво и отзад напред. Главните и малките букви се смятат за еднакви, а интервалите се пропускат. Изведи „Палиндром“ или „Не е палиндром“.

    Вход
    Капак
    Изход
    Палиндром

    Нужното е в урока: Низове: работа с текст

    Решение
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    String text = in.nextLine().toLowerCase().replace(" ", "");
    boolean palindrome = true;
    for (int i = 0; i < text.length() / 2; i++) {
    if (text.charAt(i) != text.charAt(text.length() - 1 - i)) {
    palindrome = false;
    break;
    }
    }
    if (palindrome) {
    System.out.println("Палиндром");
    } else {
    System.out.println("Не е палиндром");
    }
    }
    }
  32. 32. Сигурна парола

    Чети пароли, по една на ред, докато дойде сигурна: поне 8 знака, поне една цифра, една главна и една малка буква. За всяка слаба изведи първото неизпълнено правило в този ред („Твърде кратка“, „Няма цифра“, „Няма главна буква“, „Няма малка буква“), а за сигурната „Паролата е приета“ и спри.

    Вход
    kotka
    kotkamiau
    kotkamiau7
    Kotkamiau7
    Изход
    Твърде кратка
    Няма цифра
    Няма главна буква
    Паролата е приета

    Нужното е в урока: Низове: работа с текст

    Решение
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    while (true) {
    String password = in.nextLine();
    boolean digit = false;
    boolean upper = false;
    boolean lower = false;
    for (char c : password.toCharArray()) {
    if (Character.isDigit(c)) {
    digit = true;
    } else if (Character.isUpperCase(c)) {
    upper = true;
    } else if (Character.isLowerCase(c)) {
    lower = true;
    }
    }
    if (password.length() < 8) {
    System.out.println("Твърде кратка");
    } else if (!digit) {
    System.out.println("Няма цифра");
    } else if (!upper) {
    System.out.println("Няма главна буква");
    } else if (!lower) {
    System.out.println("Няма малка буква");
    } else {
    System.out.println("Паролата е приета");
    break;
    }
    }
    }
    }
  33. 33. Обратен масив

    На първия ред е броят n, на следващите n реда по едно цяло число. Прочети ги в масив и ги изведи в обратен ред, на един ред, разделени с интервал: обходи масива от последния индекс към нулевия.

    Вход
    4
    10
    -2
    7
    3
    Изход
    3 7 -2 10

    Нужното е в урока: Масиви

    Решение
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int n = in.nextInt();
    int[] numbers = new int[n];
    for (int i = 0; i < n; i++) {
    numbers[i] = in.nextInt();
    }
    for (int i = n - 1; i >= 0; i--) {
    System.out.print(numbers[i]);
    if (i > 0) {
    System.out.print(" ");
    }
    }
    System.out.println();
    }
    }
  34. 34. Брой на елементите

    Прочети един ред с думи, разделени с по един интервал, и изведи колко пъти се среща всяка дума, във вида „дума: брой“. Думите излизат в реда, в който са се появили за първи път.

    Вход
    ябълка круша ябълка слива круша ябълка
    Изход
    ябълка: 3
    круша: 2
    слива: 1

    Нужното е в урока: HashMap и HashSet

    Решение
    import java.util.LinkedHashMap;
    import java.util.Map;
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    String line = in.nextLine();
    Map<String, Integer> counts = new LinkedHashMap<>();
    for (String word : line.split(" ")) {
    counts.put(word, counts.getOrDefault(word, 0) + 1);
    }
    for (String word : counts.keySet()) {
    System.out.println(word + ": " + counts.get(word));
    }
    }
    }
  35. 35. Прости числа

    Прочети число N и изведи на един ред, разделени с интервал, всички прости числа от 2 до N.

    Вход
    30
    Изход
    2 3 5 7 11 13 17 19 23 29

    Нужното е в урока: Цикли

    Решение
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int n = Integer.parseInt(in.nextLine());
    String result = "";
    for (int i = 2; i <= n; i++) {
    boolean prime = true;
    for (int d = 2; d * d <= i; d++) {
    if (i % d == 0) {
    prime = false;
    break;
    }
    }
    if (prime) {
    result += i + " ";
    }
    }
    System.out.println(result.trim());
    }
    }
  36. 36. Средна стойност

    На един ред са дадени цели числа, разделени с интервал. Изведи средната им стойност с два знака след точката.

    Вход
    5 8 12 6
    Изход
    Средна стойност: 7.75

    Нужното е в урока: Масиви

    Решение
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    String[] parts = in.nextLine().split(" ");
    int sum = 0;
    for (int i = 0; i < parts.length; i++) {
    sum += Integer.parseInt(parts[i]);
    }
    double average = (double) sum / parts.length;
    System.out.printf("Средна стойност: %.2f%n", average);
    }
    }
  37. 37. Сортиране по дължина

    На един ред са дадени думи, разделени с интервал. Подреди ги по дължина от най-късата към най-дългата (думите с еднаква дължина остават в реда от входа) и ги изведи на един ред.

    Вход
    смокиня киви ябълка дюля круша
    Изход
    киви дюля круша ябълка смокиня

    Нужното е в урока: Низове: работа с текст

    Решение
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    String[] words = in.nextLine().split(" ");
    for (int i = 0; i < words.length - 1; i++) {
    for (int j = 0; j < words.length - 1 - i; j++) {
    if (words[j].length() > words[j + 1].length()) {
    String temp = words[j];
    words[j] = words[j + 1];
    words[j + 1] = temp;
    }
    }
    }
    System.out.println(String.join(" ", words));
    }
    }
  38. 38. Брояч на изречения

    Прочети един ред текст и изведи колко изречения има в него. Изречението завършва с точка, удивителна или въпросителна; поредица от такива знаци (като „...“ или „?!“) е един край.

    Вход
    Здравей! Как си? Аз съм добре... А ти?!
    Изход
    Изречения: 4

    Нужното е в урока: Низове: работа с текст

    Решение
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    String text = in.nextLine();
    String ends = ".!?";
    int count = 0;
    for (int i = 0; i < text.length(); i++) {
    boolean isEnd = ends.indexOf(text.charAt(i)) >= 0;
    boolean nextIsEnd = i + 1 < text.length() && ends.indexOf(text.charAt(i + 1)) >= 0;
    if (isEnd && !nextIsEnd) {
    count++;
    }
    }
    System.out.println("Изречения: " + count);
    }
    }
  39. 39. Числа на Фибоначи

    Редицата на Фибоначи започва с 1, 1, а всяко следващо число е сборът на предходните две. Прочети N (от 1 до 50) и изведи N-тото число от редицата.

    Вход
    40
    Изход
    102334155

    Нужното е в урока: Цикли

    Решение
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int n = Integer.parseInt(in.nextLine());
    long previous = 0;
    long current = 1;
    for (int i = 1; i < n; i++) {
    long next = previous + current;
    previous = current;
    current = next;
    }
    System.out.println(current);
    }
    }
  40. 40. Намиране на медиана

    На един ред са дадени цели числа, разделени с интервал. Изведи медианата им с един знак след точката: средното число след подреждане, а при четен брой числа – средното аритметично на двете средни.

    Вход
    12 3 7 9 1 8
    Изход
    Медиана: 7.5

    Нужното е в урока: Списъци

    Решение
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    List<Integer> numbers = new ArrayList<>();
    for (String part : in.nextLine().split(" ")) {
    numbers.add(Integer.parseInt(part));
    }
    Collections.sort(numbers);
    int n = numbers.size();
    double median;
    if (n % 2 == 1) {
    median = numbers.get(n / 2);
    } else {
    median = (numbers.get(n / 2 - 1) + numbers.get(n / 2)) / 2.0;
    }
    System.out.printf("Медиана: %.1f%n", median);
    }
    }
  41. 41. Графика на символи

    Прочети един ред текст. За всеки символ без интервала, в реда на първата му поява, изведи ред „символ | звездички“ с по една звездичка за всяко срещане в текста.

    Вход
    баба баница
    Изход
    б | ***
    а | ****
    н | *
    и | *
    ц | *

    Нужното е в урока: Низове: работа с текст

    Решение
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    String text = in.nextLine();
    for (int i = 0; i < text.length(); i++) {
    char c = text.charAt(i);
    if (c != ' ' && text.indexOf(c) == i) {
    int count = 0;
    for (int j = 0; j < text.length(); j++) {
    if (text.charAt(j) == c) {
    count++;
    }
    }
    System.out.println(c + " | " + "*".repeat(count));
    }
    }
    }
    }
  42. 42. Транспониране на матрица

    На първия ред са броят редове R и броят колони C, следват R реда с по C числа, разделени с интервал. Изведи транспонираната матрица: C реда с по R числа, където редовете стават колони.

    Вход
    2 3
    1 2 3
    4 5 6
    Изход
    1 4
    2 5
    3 6

    Нужното е в урока: Двумерни масиви

    Решение
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    String[] size = in.nextLine().split(" ");
    int rows = Integer.parseInt(size[0]);
    int cols = Integer.parseInt(size[1]);
    int[][] matrix = new int[rows][cols];
    for (int r = 0; r < rows; r++) {
    String[] parts = in.nextLine().split(" ");
    for (int c = 0; c < cols; c++) {
    matrix[r][c] = Integer.parseInt(parts[c]);
    }
    }
    for (int c = 0; c < cols; c++) {
    String line = "";
    for (int r = 0; r < rows; r++) {
    line += matrix[r][c] + " ";
    }
    System.out.println(line.trim());
    }
    }
    }
  43. 43. Пътища в лабиринт

    На първия ред са R и C, следват R реда по C знака: „.“ е свободна клетка, „#“ е стена. Като се движиш само надясно или надолу и не стъпваш на стена, изведи броя на всички пътища от горния ляв до долния десен ъгъл.

    Вход
    4 5
    .....
    .#.#.
    ...#.
    #....
    Изход
    Пътища: 4

    Нужното е в урока: Рекурсия

    Решение
    import java.util.Scanner;
    public class Main {
    static int countPaths(String[] maze, int r, int c) {
    if (r >= maze.length || c >= maze[0].length() || maze[r].charAt(c) == '#') {
    return 0;
    }
    if (r == maze.length - 1 && c == maze[0].length() - 1) {
    return 1;
    }
    return countPaths(maze, r + 1, c) + countPaths(maze, r, c + 1);
    }
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    String[] size = in.nextLine().split(" ");
    int rows = Integer.parseInt(size[0]);
    String[] maze = new String[rows];
    for (int r = 0; r < rows; r++) {
    maze[r] = in.nextLine();
    }
    System.out.println("Пътища: " + countPaths(maze, 0, 0));
    }
    }
  44. 44. Статистика на оценките

    На един ред са дадени оценки от 2 до 6, разделени с интервал. Изведи колко са отличните, много добрите, добрите, средните и слабите, всяка категория на отделен ред.

    Вход
    6 4 5 6 3 5 2 6 5 4
    Изход
    Отличен (6): 3
    Много добър (5): 3
    Добър (4): 2
    Среден (3): 1
    Слаб (2): 1

    Нужното е в урока: Масиви

    Решение
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    String[] names = { "", "", "Слаб", "Среден", "Добър", "Много добър", "Отличен" };
    int[] counts = new int[7];
    String[] parts = in.nextLine().split(" ");
    for (int i = 0; i < parts.length; i++) {
    counts[Integer.parseInt(parts[i])]++;
    }
    for (int grade = 6; grade >= 2; grade--) {
    System.out.println(names[grade] + " (" + grade + "): " + counts[grade]);
    }
    }
    }
  45. 45. Римски цифри

    Прочети цяло число от 1 до 3999 и го изведи с римски цифри (I, V, X, L, C, D, M, като 4 е IV, 9 е IX, 40 е XL и т.н.).

    Вход
    1994
    Изход
    MCMXCIV

    Нужното е в урока: Масиви

    Решение
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int number = Integer.parseInt(in.nextLine());
    int[] values = { 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 };
    String[] symbols = { "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I" };
    String roman = "";
    for (int i = 0; i < values.length; i++) {
    while (number >= values[i]) {
    roman += symbols[i];
    number -= values[i];
    }
    }
    System.out.println(roman);
    }
    }
  46. 46. Симулация на монета

    Прочети семе x (от 1 до 2147483646) и брой хвърляния N, всяко на отделен ред. При всяко хвърляне смени x = x * 16807 % 2147483647; четно x е ези (Е), нечетно е тура (Т). Изведи хвърлянията на един ред, после колко пъти се е паднало ези и колко тура.

    Вход
    42
    10
    Изход
    ЕТТТЕТТЕЕТ
    Ези: 4
    Тура: 6

    Нужното е в урока: Цикли

    Решение
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    long x = Long.parseLong(in.nextLine());
    int n = Integer.parseInt(in.nextLine());
    String tosses = "";
    int heads = 0;
    for (int i = 0; i < n; i++) {
    x = x * 16807 % 2147483647;
    if (x % 2 == 0) {
    tosses += "Е";
    heads++;
    } else {
    tosses += "Т";
    }
    }
    System.out.println(tosses);
    System.out.println("Ези: " + heads);
    System.out.println("Тура: " + (n - heads));
    }
    }
  47. 47. Симетричен масив

    На един ред са дадени цели числа, разделени с интервал. Провери дали масивът е симетричен, тоест чете се еднакво отляво надясно и отдясно наляво.

    Вход
    1 2 3 2 1
    Изход
    Симетричен

    Нужното е в урока: Масиви

    Решение
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    String[] parts = in.nextLine().split(" ");
    int[] numbers = new int[parts.length];
    for (int i = 0; i < parts.length; i++) {
    numbers[i] = Integer.parseInt(parts[i]);
    }
    boolean symmetric = true;
    for (int i = 0; i < numbers.length / 2; i++) {
    if (numbers[i] != numbers[numbers.length - 1 - i]) {
    symmetric = false;
    break;
    }
    }
    System.out.println(symmetric ? "Симетричен" : "Не е симетричен");
    }
    }
  48. 48. Балансирани скоби

    Прочети един ред текст и провери дали скобите (), [] и {} в него са балансирани: всяка отваряща има своята затваряща от същия вид и двойките не се пресичат. Другите символи не се броят.

    Вход
    (a + [b) * c]
    Изход
    Небалансирани

    Нужното е в урока: Стек, опашка и свързан списък

    Решение
    import java.util.ArrayDeque;
    import java.util.Deque;
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    String text = in.nextLine();
    String opening = "([{";
    String closing = ")]}";
    Deque<Character> stack = new ArrayDeque<>();
    boolean balanced = true;
    for (int i = 0; i < text.length(); i++) {
    char c = text.charAt(i);
    if (opening.indexOf(c) >= 0) {
    stack.push(c);
    } else if (closing.indexOf(c) >= 0) {
    if (stack.isEmpty() || opening.indexOf(stack.pop()) != closing.indexOf(c)) {
    balanced = false;
    break;
    }
    }
    }
    if (balanced && stack.isEmpty()) {
    System.out.println("Балансирани");
    } else {
    System.out.println("Небалансирани");
    }
    }
    }
  49. 49. Последователност от еднакви елементи

    На един ред са дадени цели числа, разделени с интервал. Намери най-дългата поредица от еднакви съседни числа и я изведи на един ред; ако има няколко с еднаква дължина, изведи първата.

    Вход
    2 1 1 3 3 3 2 2 2 5
    Изход
    3 3 3

    Нужното е в урока: Масиви

    Решение
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    String[] parts = in.nextLine().split(" ");
    int[] numbers = new int[parts.length];
    for (int i = 0; i < parts.length; i++) {
    numbers[i] = Integer.parseInt(parts[i]);
    }
    int bestValue = numbers[0];
    int bestLength = 1;
    int length = 1;
    for (int i = 1; i < numbers.length; i++) {
    if (numbers[i] == numbers[i - 1]) {
    length++;
    } else {
    length = 1;
    }
    if (length > bestLength) {
    bestLength = length;
    bestValue = numbers[i];
    }
    }
    String result = "";
    for (int i = 0; i < bestLength; i++) {
    result += bestValue + " ";
    }
    System.out.println(result.trim());
    }
    }
  50. 50. Най-кратък път в матрица

    На първия ред са R и C, следват R реда по C знака: „.“ е свободна клетка, „#“ е стена, „S“ е началото, „E“ е целта. С ходове нагоре, надолу, наляво и надясно изведи най-малкия брой ходове от S до E или „Няма път“, ако E е недостижима.

    Вход
    5 6
    S.#...
    .##.#.
    ...#..
    #.#..#
    ...E.#
    Изход
    7

    Нужното е в урока: Стек, опашка и свързан списък

    Решение
    import java.util.ArrayDeque;
    import java.util.Queue;
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    String[] size = in.nextLine().split(" ");
    int rows = Integer.parseInt(size[0]);
    int cols = Integer.parseInt(size[1]);
    String[] grid = new String[rows];
    for (int r = 0; r < rows; r++) {
    grid[r] = in.nextLine();
    }
    int[][] dist = new int[rows][cols];
    Queue<int[]> queue = new ArrayDeque<>();
    for (int r = 0; r < rows; r++) {
    for (int c = 0; c < cols; c++) {
    dist[r][c] = -1;
    if (grid[r].charAt(c) == 'S') {
    dist[r][c] = 0;
    queue.add(new int[] { r, c });
    }
    }
    }
    int[] dr = { -1, 1, 0, 0 };
    int[] dc = { 0, 0, -1, 1 };
    String answer = "Няма път";
    while (!queue.isEmpty()) {
    int[] cell = queue.poll();
    int r = cell[0];
    int c = cell[1];
    if (grid[r].charAt(c) == 'E') {
    answer = String.valueOf(dist[r][c]);
    break;
    }
    for (int d = 0; d < 4; d++) {
    int nr = r + dr[d];
    int nc = c + dc[d];
    if (nr >= 0 && nr < rows && nc >= 0 && nc < cols && grid[nr].charAt(nc) != '#' && dist[nr][nc] == -1) {
    dist[nr][nc] = dist[r][c] + 1;
    queue.add(new int[] { nr, nc });
    }
    }
    }
    System.out.println(answer);
    }
    }

Основи на езика

Методи

Класове и обекти

Наследяване и полиморфизъм

Грешки и изключения

Текст и файлове

Колекции

  • Списъци: Рафт с книги · Журнал на събитията · Тетрадка · Смятане наум
  • Стек, опашка и свързан списък: Влакче · Маршрут на автобус · Борсов тикер · Скобите в баланс · Свой свързан списък
  • HashMap и HashSet: Таблица с потребители · Честота на думите · Документи по ключова дума · Мрежа от контакти
  • Хеш код и хеш функции: Хеш код на човек · Роботът в склада · Хеш на файл
  • Вложени класове: Количка за пазаруване · Монитор на уеб сървър · Сграден мениджър · Класиране

Модерна Java

  • Ламбди: Подреждане по няколко полета · Филтър на поръчки · Отстъпки една след друга
  • Stream: Продажби по категория · Топ 3 продукта · Средна оценка · Думите в текст
  • record, switch и шаблони: Фигури · Цена на доставка · Точка като ключ
  • Шаблони за дизайн: Отстъпки като стратегии · „Уведоми ме, когато е налично“ · Фабрика за известия · Стар термометър

Програми в истинския свят

  • Тестове с JUnit: Калкулаторът на отстъпки · Сметката · Бъгът в средната оценка
  • Нишки: Паралелна сума · Сваляне с басейн · Брояч без загуби
  • Мрежово програмиране: Ехо сървър · Сървър с команди · Чат за двама
  • Бази данни: Каталог · Търсене по част от името · Превод, който се проваля наполовина
  • Reflection и анотации: Всички полета · Мини JSON · Свой пускач на тестове

Да направим игра

Хрониките на Арканум

Epic Cosmos: империята

Проект

Създаден от Иво Гергов като част от кампанията на Evo Tech за достъпно обучение по програмиране ·