Задачи с сайта Coding.bat
Зарегистрируйтесь на этом сайте и решайте задачи из разделов
Warmup-*
, String-*
, Logic-*
, String-*
, Array-*
.
Из каждого раздела необходимо решить хотя бы $6 - x$ задач, где
$x$ это сложность раздела, например, у раздела String-3
она равна 3.
Задачки на базовые возможности Java, теория чисел
PrimalityTest
. Дано число, верните, простое ли оноSieveOfEratosthenes
. Алгоритм Решето Эратосфена, еще одно описание с картинками.- Дано натуральное
n
, верните массивboolean[]
размераn + 1
, в котором по индексуi
записано, верно ли что числоi
простое. - Дано натуральное
n
, верните массивint[]
, в котором перечислены в порядке возрастания все простые числа от 1 доn
. Воспользуйтесь функцией из предыдущего подпункта.
- Дано натуральное
Массивы.
Создайте класс ArraysTasks
и заполните его функциями:
- Дано
n
, верните массив из первых n четных чисел: 2 4 6 8 … 2n - Дан массив, функция проверяет, есть ли в массиве одинаковые элементы:
boolean hasSimilar(int[] a)
- Дан массив, верните среднее значение всех элементов массива. (т.е. сумму элементов, деленную на количество элементов)
- Остортируйте массив по убыванию:
private static int[] sortReverse(int[] a)
. Используйте для этогоArrays.sort()
с одним аргументом. Содержимое исходного массива меняться не должно, нужно вернуть новый отсортированный массив. Для копирования массива используйте иArrays.copyOf()
.
Пример:
int[] x = {20, 10, 30};
int[] y = sortReverse(x);
System.out.println(Arrays.toString(x)); // печатает 20 10 30
System.out.println(Arrays.toString(y)); // печатает 30 20 10
Чтение и запись в файлы
Создайте класс IOTasks
и заполните его функциями:
- Дан файл, содержащий несколько целых чисел, разделенных пробелами и переводами строк.
Прочитайте из него все числа и выведите на экран их сумму.
- Решите предыдущую задачу, но считайте, что в файле могут быть и слова, не являющиеся числами.
Эти слова надо игнорировать. Используйте
scanner.hasNextInt()
, не используйтеscanner.useDelimiter()
.
- Решите предыдущую задачу, но считайте, что в файле могут быть и слова, не являющиеся числами.
Эти слова надо игнорировать. Используйте
- Дан массив строк
lines
и имя файла. Запишите в файл заданные строки построчно. Не забудьте, что есть цикл “for each”. -
Даны два файла. Прочитайте из первого файла текст и перепишите его во второй файл, исправив ошибки в регистрах букв. Например, если исходный текст был:
какой-то Текст с неправильными Регистрами букв! втОРОе предложение Этого текста.
то должно получиться:
Какой-то текст с неправильными регистрами букв! Второе предложение этого текста.
Вы должны читать исходный файл по словам, разделенными пробельными символами, и следить за последним символом очередного слова. Если это символ конца предложения (точка, восклицательный знак, вопросительный знак), нужно сделать так, чтобы следующее слово начиналось с заглавной буквы. Иначе следующее слово должно начинаться со строчной буквы. Заглавные буквы внутри слов нужно изменить на строчные.
- Скорочтение. Класс
FastReader
. Прочитать из файла текст, разбить его на слова. Показыавть в консоли слова текста с большой скоростью. Т.е. программа показывает первое слово, делает паузу, показывает вместо него второе слово, потом пауза, третье слово и т.д. Если после слова стоит знак препинания, его нужно отображать. После знаков препинания (запятых, точек и т.п.) нужно чуть увеличивать паузу.- Для того, чтобы перезаписать слово в консоли, выводите символ
'\r'
, этот символ не переводит строку, а возвращает каретку в начало. - Вызывайте метод
System.out.flush()
после каждого вызоваSystem.out.print()
. Иначе результат может не появиться на экране.
- Для того, чтобы перезаписать слово в консоли, выводите символ
Двумерные массивы
Создайте класс TwoDimensionalArrayTask
, запишите следующий код в метод
main
и заставьте его работать:
```
char[][] c = createTable(20, '.');
printTable(c);
System.out.println("============ Заполним строки: ==========");
fillFirstAndLastLines(c, '#');
printTable(c);
System.out.println("============ Заполним столбцы: =========");
fillFirstAndLastColumns(c, '#');
printTable(c);
``` 1. `createTable(20, '.')` возвращает массив char 20 на 20, все символы в массиве должны быть '.' 1. `printTable` печатает массив на экран. При этом выводите символы подряд, без запятых. Можете вывести пробелы между символами, так получается более красиво. 1. `fillFirstAndLastLines` Воспользуйтесь `Arrays.fill()`, чтобы заполнить первую и последнюю строки массива символами '#'. 1. `fillFirstAndLastColumns` Заполните первый и последний столбец массива символами '#'.
Регулярные выражения.
- Дана строка, проверьте, что в ней содержится корректный email адрес. Будем считать, что корректный
email состоит из имени пользователя (несколько латинских букв, точек, подчеркиваний, минусов),
далее следует символ @, далее идет домен (тоже несколько латинских букв, точек, подчеркиваний,
минусов), в конце должна быть точка и от двух до четырех латинских букв.
Т.е. конец должен выглядеть как .com, .ru и т.п. Помните, что обычная точка означает любой символ,
и ее может понадобиться экранировать. Используйте метод
matches()
класса String- Решите прошлую задачу еще раз, но используйте регулярное выражение для email по ссылке emailregex.com
- Дана строка с текстом на русском языке, в которой автор неправильно расставил пробелы перед запятыми. Например,
Это строка , у которой зачем-то написаны два пробела перед запятой
. Нужно найти все пробельные символы перед запятыми и удалить их. Должно получитьсяЭто строка, у которой зачем-то написаны два пробела перед запятой
. Используйте методreplaceAll()
класса String. - Дана строка. Найдите в ней все слова, написанные через дефис и поменяйте две половинки этих слов местами. Например, строка “Какая-то сине-зеленовая трава” должна превратиться в “то-Какая зеленовая-сине трава”. Используйте метод
replaceAll
класса String и$
для ссылки на группы. -
Дана строка. Посчитайте, сколько раз в ней встречаются символы “кот”, в произвольном регистре. Т.е. Кот и КОТ тоже надо считать. Используйте
Matcher
с методомfind()
. При создании регулярного выражения с помощью классаPattern
установите режимыPattern.UNICODE_CASE
иPattern.CASE_INSENSITIVE
.* Необязательное задание. А если надо искать слово "кот", т.е. не считать, например, слово "который"? Попробуйте два способа указать, что "кот" должно быть частью другого слова. 1) найдите на странице с лекцией ссылку на все возможности регулярных выражений в Java, и там найдите, как указать word boundaries 2) используйте конструкции наподобие (\s\|$) - это означает либо пробельный символ, либо конец строки.
- Даны два имени файла. Откройте первый, замените в нем все числа (последовательности цифр) на
эти же числа, увеличенные на один. Запишите результат во второй файл. Используйте функцию
Files.readString(Path, DefaultEncoding.UTF-8)
для чтения файла, прописав необходимыеimport
. Для записи файла найдите аналогичную функцию.
Класс “время”
Для решения этой задачи достаточно прочитать учебник по ООП до раздела “Конструкторы” включительно.
Вы должны создать класс ExperimentsWithTime
, чтобы в нем проверять всё, что вы сделали
с часами. Нужно проверить работу каждого пункта, который вы выполните.
Пожалуйста, в окончательной версии не ставьте комментарии на куски кода, которые
проверяют работу вашего класса, обычно так делают, чтобы старые проверки не мешали
новым. Так вот, не надо комментировать проверки.
- Заведите класс
Time
, который хранит информацию о количестве часов и минут. Т.е. введите два поля. - Добавьте конструктор, в котором можно сразу указать количество часов и минут.
- Сделайте метод
String show();
, который возвращает строку с часами и минутами через двоеточие. Например, он может вернуть"09:10"
. - Сделайте методы isDay(), isMorning(), isEvening(), isNight(), которые возвращают верно ли, что сейчас, соответственно, день, утро, вечер, ночь. Придумайте сами, начиная с какого времени утро переходит в день и т.п.
- Сделайте метод
String sayHello()
, который возвращает строку “Доброе утро”, “Добрый день” и т.п. в зависимости от текущего времени. - Сделайте метод, который добавляет указанное количество минут:
c.add(20)
. Если было"9:10"
, то должно получиться"9:30"
. А если было"9:50"
, должно получиться"10:10"
. Еще пример."9:20"
плюс 120 минут должно быть"11:20"
.
Рациональные числа
Класс “Рациональные числа”
Сделаем класс Rational, это рациональные числа, для которых хранится их числитель и знаменатель. С рациональными числами можно совершать арифметические операции.
- Создайте класс и добавьте поля n и d (numerator, denominator - числитель, знаменатель). Убедитесь, что поля приватные.
- Класс должен иметь конструкторы вида
Rational(3, 2)
иRational(3)
. - Добавьте метод
public String toString()
, который возвращает естественное представление числа в виде строки, например,5/7
. Если знаменатель равен 1, его не нужно писать. Если числитель ноль, то “0”, а не “0/2” и т.п. - Добавьте метод double toDouble(), который возвращает значение в виде double.
- Добавьте сокращение дроби в конструктор: поделить числитель и знаменатель на НОД, убедиться, что знаменатель положительный.
-
Арифметические функции. add, sub, mul, div:
Rational r1 = r2.add(r3); // создает новое число r2.addInPlace(r3); // добавляет к r2 и изменяет его
Протестируйте! Проверьте, например, что \(\frac16 + \frac13 = \frac12\), и проверьте другие аналогичные равенства для других арифметических операций.
- Создайте функцию не в Rational, которая по n считает \(1 + \frac12 + \frac13 + \frac14 + \frac15 + … + \frac1n\) Проверьте, что f(1) = 1, f(2) = 1.5, f(3) = 1.833333333333333
- Чему равно f(20)? Почему оно равно тому, чему равно? Как исправить?
- Добавьте get- методы для числителя и знаменателя. Чтобы Rational стал совсем неизменяемым, закомментируйте методы
*InPlace()
. - Создайте статические константы ONE и ZERO типа Rational, хранящие элементы 0, 1 в виде рациональных чисел.
- Сделайте статическим метод поиска НОД (или сокращения)
- Создайте статические версии арифметических операций:
static Rational add(Rational r1, Rational r2)
и т.п. Эти операции создают новое число, вы можете переиспользовать старые арифметические операции. - (*) Решите аналогичную задачу про комплексные числа. Они хранятся в виде вещественной и мнимой части.
Рисование
Класс Drawing (изображение) хранит изображение в виде массива символов char[][]
. Например,
.........
.........
....x....
.........
- Создайте конструктор, в котором указывается размер (сколько строк и столбцов) и символ, которым изначально все заполнить. Например, new Drawing(20, 30, ‘.’)
- Создайте метод
print()
, он печатает на экране изображение - Метод
setPoint(x, y, char)
рисует один символ в изображении. Методу нужно указать, где и какой символ поставить. - Методы
drawVerticalLine(...)
,drawHorizontalLine(...)
рисуют вертикальную или горизонтальную линию от заданной точки до заданной. Определите сами параметры для методов, они должны определять расположение линии и символ, которым линию рисовать. - Метод
drawRectangle()
рисует прямоугольник по двум противоположным углам, стороны прямоугольника вертикальны и горизонтальны. Используйте методы, реализованные ранее. - Необязательно: Рисование произвольной линии (см. необязательную задачу за прошлый семестр)
- Рисование круга (или окружности — необязательно). Пользователь указывает центр и радиус, программа должна пройтись по всем точкам поля и, если они лежат в круге, зарисовать их указанным символом.
- Реализуйте метод
draw(x, y, Drawing d)
нарисовать одно изображение на другом. При вызове метода указывается, где и какое изображение рисовать. - (Необязательная задача). Сделайте Drawing неизменяемым: все функции рисования возвращают новый Drawing и не меняют текущий. Чтобы не портить старый класс, назовите новый ImmutableDrawing.
- Используйте все реализованные вами ранее методы, чтобы нарисовать Джоконду. Ну или домик.