Основы программирования, первый семестр
Сайт codingbat.com
При решении задач мы будем иногда использовать сайт codingbat.com. Зарегистрируйтесь на этом сайте.
После регистрации откройте ссылку prefs
справа сверху, введите свое имя и внизу в раздел Share To
введите мой email: iposov@gmail.com.
При любом использовании сайта проверяйте, что вы на нем залогинены.
Некоторые задачи могут быть проверены на сайте автоматически, у таких задачи после условия указана ссылка на автоматическую проверку. Все автоматически проверяемые задачи собраны на одной странице: http://codingbat.com/home/iposov@gmail.com/1st-semester.
Bat файл для запуска программ
Рекомендую использовать следующий bat файл для запуска программ. В нем настроены кодировки так, чтобы в ваших программах корректно работал русский язык. Убедитесь только, что вы пишете свою программу в кодировке utf-8.
del *.class
"путь до javac.exe" -encoding utf8 YourClass.java
"путь до java.exe" -Dfile.encoding=CP866 YourClass
pause
Еще одна версия bat файла, в ней не нужно указывать имя класса. Файл HelloWorld.bat
будет запускать класс HelloWorld
,
а если его переименовать в Abc.bat
, он будет запускать класс Abc
.
del *.class
"путь до javac.exe" -encoding utf8 %~n0.java
"путь до java.exe" -Dfile.encoding=CP866 %~n0
pause
Некоторые лекции
Лекция от 29 сентября
Задания
Типы и условные операторы
- Дан год, определить, високосный или нет.
- Дано целое число. Выведите после него существительное “кот” (или любое другое) в правильной форме: 1 кот, 2 кота, 5 котов
- Даны коэффициенты квадратного уравнения, целые числа a, b, c: \(ax^2+bx+c = 0\) Решите квадратное уравнение. Разберите все случаи, включая \(a = 0\). Ответ должен быть одним из следующих: «решений нет», «одно решение x = …», «два решения x1 = …, x2 = …» или «решений бесконечно много».
- Даны три целых числа a, b, с, выведите многочлен ax^2+bx+с. Получите результат в виде строки,
последней операцией в программе напечатайте эту строку на экран. http://codingbat.com/prob/p299433
- Перерешайте эту задачу еще раз, напишите короткое и понятное решение с помощью двух функций.
Функция
coef()
должна приписывать коэффициент к одночлену, например,coef(2, "x") -> "2x"
,coef(-1, "x^2") -> "-x^2"
,coef(0, "x") -> "0"
,coef(2, "") -> "2"
,coef(-1, "") -> -1
(здесь вместо свободного члена x^0 пишем пустую строку “”). А функцияsum()
должна складывать два слагаемых, например,sum("x^2", "2x") -> "x^2+2x"
,sum("x^2", "-2x") -> "x^2-2x"
,sum("x", "-3") -> "x-3"
,sum("x^2", "0") -> "x^2"
.
- Перерешайте эту задачу еще раз, напишите короткое и понятное решение с помощью двух функций.
Функция
- Дано целое число от 1 до 999, вывести его в виде текста. Убедитесь, что вы не выводите двух пробелов подряд, и пробелов в конце текста. Получите результат в виде строки, последней операцией в программе напечатайте эту строку на экран. http://codingbat.com/prob/p297521 (усложненный вариант http://codingbat.com/prob/p220544)
- Строки. Для каждого утверждения из списка ниже заведите функцию, которая по заданной строке возвращает, верно утверждение или нет. Не забудьте проверить все функции в методе
main
.- Строка состоит только из строчных букв
- Строка состоит только из заглавных букв
- Строка начинается с заглавной буквы, а все остальные строчные
- В строке чередуются буквы, т.е. первая заглавная, вторая строчная, третья заглавная и т.д. Или наоборот, первая строчная, вторая заглавная, третья строчная и т.д. Используйте конструкцию Character.isUpperCase(‘z’), чтобы определить, верно ли, что символ является заглавной буквой. (аналогично Character.isLowerCase())
- Циклы.
- Напишите функцию, которая по заданному n создает строку с числами от 1 до n через запятую. Сделайте еще одну такую же функцию, только чтобы числа шли назад от n до 1.
- Напишите функцию, которая удаляет из строки все символы кроме букв. Т.е. по строке “x,y,z,1 2 3abc” должна возвращаться строка “xyzabc”. Используйте Character.isLetter(‘z’), чтобы проверить, что символ является буквой.
- Вложенные циклы.
Все задачи нужно оформить в виде void функций. Они получают на вход одно или два числа, в зависимости от условия.
- Напечатайте на экране таблицу из m на n звездочек
- Напечатайте на экране треугольник из звездочек размера n на n:
* ** *** ****
- Напечатайте на экране треугольник из звездочек размера n на n:
**** *** ** *
- Напечатайте на экране треугольник из звездочек размера n на n:
* ** *** ****
- Напечатайте на экране таблицу размера m на n, используя полный набор символов псевдографики. Это символы └, ├ и другие. Вводите эти символы с помощью \u нотации. Ниже перечислены все необходимые символы и соответствующие им коды. Не выводите лишние пробелы, на картинке они даны только для наглядности.
┌ ─ ┬ ─ ┐ \u250C \u2500 \u252C \u2500 \u2510 │ │ │ 3 раза \u2502 ├ ─ ┼ ─ ┤ \u251C \u2500 \u253C \u2500 \u2524 │ │ │ 3 раза \u2502 └ ─ ┴ ─ ┘ \u2514 \u2500 \u2534 \u2500 \u2518
Например, для m = 2, n = 3 получится таблица
┌─┬─┬─┐ │ │ │ │ ├─┼─┼─┤ │ │ │ │ └─┴─┴─┘
- Массивы. Реализуйте указанные функции:
- Дано
n
, верните массив из первых n четных чисел: 2 4 6 8 … 2n - Дан массив, функция проверяет, есть ли в массиве одинаковые элементы:
boolean hasSimilar(int[] a)
- Дан массив, верните среднее значение всех элементов массива. (т.е. сумму элементов, деленную на количество элементов)
- Дан массив, верните дисперсию всех элементов массива. (это среднее значение элементов массива, возведенных в квадрат, минус среднее значение элементов массива, возведенное в квадрат)
- Остортируйте массив по убыванию:
private static int[] sortReverse(int[] a)
. Используйте для этогоArrays.sort()
с одним аргументом. Содержимое исходного массива меняться не должно, нужно вернуть новый отсортированный массив. Пример: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
- Дано
- Двумерные массивы. Заставьте следующий код работать:
char[][] c = createTable(20, '.'); printTable(c); System.out.println('============ Заполним строки: =========='); fillFirstAndLastLines(c, '#'); printTable(c); System.out.println('============ Заполним столбцы: ========='); fillFirstAndLastColumns(c, '#'); printTable(c);
createTable
возвращает массив char 20 на 20, все символы в массиве должны быть ‘.’printTable
печатает массив на экран. При этом выводите символы подряд, без запятых. Можете вывести пробелы между символами, так получается более красиво.fillFirstAndLastLines
Воспользуйтесь Arrays.fill(), чтобы заполнить первую и последнюю строки массива символами ‘#’.fillFirstAndLastColumns
Заполните первый и последний столбец массива символами ‘#’.
- Файлы на диске (каталог = директория = папка)
- Выведите на экран все файлы в текущем каталоге (в каталоге
.
), директории выводить не нужно. Не забудьте создать несколько директорий в каталоге для тестирования, чтобы убедиться, что папки не выводятся. - Выведите дерево каталогов, начиная с текущей директории. Содержимое каждой новой директории должно сдвигаться на четыре пробела вправо. Например:
. a.txt b.txt subdir1 aa.txt bb.txt subsubdir aaa.txt subdir2 cc.txt
Для этого создайте функцию void printDirectory(File directory, String indent), которой передается директория для печати и indent — строка, содержащая нужное количество пробелов для отступа.
- Выведите на экран все файлы в текущем каталоге (в каталоге
- Чтение и запись в файлы
- Дан файл. Прочитайте из него все целые числа и выведите на экран их сумму.
- Измените метод так, чтобы он игнорировал все слова, которые не являются целыми числами. (используйте
hasNextInt()
, не используйтеscanner.useDelimiter()
).
- Измените метод так, чтобы он игнорировал все слова, которые не являются целыми числами. (используйте
- Дан массив строк lines и имя файла. Запишите в файл заданные строки построчно. Не забудьте, что есть цикл “for each”.
-
Даны два файла. Прочитайте из первого файла текст и перепишите его во второй файл, исправив ошибки в регистрах букв Например, если исходный текст был:
какой-то Текст с неправильными Регистрами букв! втОРОе предложение Этого текста.
то должно получиться:
Какой-то текст с неправильными регистрами букв! Второе предложение этого текста.
Вы должны читать исходный файл по словам, разделенными пробельными символами, следить за последним символом очередного слова. Если это символ конца предложения (точка, восклицательный знак, вопросительный знак), нужно сделать так, чтобы следующее слово начиналось с заглавной буквы. Иначе следующее слово должно начинаться со строчной буквы. Заглавные буквы внутри слов нужно изменить на строчные.
- Дан файл. Прочитайте из него все целые числа и выведите на экран их сумму.
- Регулярные (неэпизодические) выражения
- Дана строка, проверьте, что в ней содержится корректный email адрес. Будем считать, что корректный email состоит из имени пользователя (несколько латинских букв, точек, подчеркиваний, минусов), далее следует символ @, далее идет домен (тоже несколько латинских букв, точек, подчеркиваний, минусов), в конце должна быть точка и от двух до четырех латинских букв. Т.е. конец должен выглядеть как .com, .ru и т.п. Помните, что обычная точка означает любой символ, и ее может понадобиться экранировать. Используйте метод
matches()
класса String- Необязательное задание. Используйте регулярное выражение для email по ссылке https://gist.githubusercontent.com/iposov/6867dd66e129c3b5feb8/raw/a6f6655fa9d4bc70d522f5fd47d928bded37db27/email-regex.txt
- Дана строка с текстом на русском языке, в которой автор неправильно расставил пробелы перед запятыми. Например,
Это строка , у которой зачем-то написаны два пробела перед запятой
. Нужно найти все пробельные символы перед запятыми и удалить их. Должно получитьсяЭто строка, у которой зачем-то написаны два пробела перед запятой
. Используйте методreplaceAll()
класса String. - Дана строка. Найдите в ней все слова, написанные через дефис и поменяйте две половинки этих слов местами. Например, строка “Какая-то сине-зеленовая трава” должна превратиться в “то-Какая зеленовая-сине трава”. Используйте метод
replaceAll
класса String и$
для ссылки на группы. - Дана строка. Посчитайте, сколько раз в ней встречаются символы “кот”, в произвольном регистре. Т.е. Кот и КОТ тоже надо считать. Используйте
Matcher
с методомfind()
. При создании регулярного выражения с помощью классаPattern
установите режимыPattern.UNICODE_CASE
иPattern.CASE_INSENSITIVE
.-
Необязательное задание. А если надо искать слово “кот”, т.е. не считать, например, слово “который”? Попробуйте два способа указать, что “кот” должно быть частью другого слова. 1) найдите на странице с лекцией ссылку на все возможности регулярных выражений в Java, и там найдите, как указать word boundaries 2) используйте конструкции наподобие (\s $) - это означает либо пробельный символ, либо конец строки.
-
- Дан файл, допустим,
text_with_numbers.txt
. Создайте файлtext_with_numbers_plus_one.txt
, который содержит ровно то же, что содержит первый файл, только все числа (последовательности цифр\d+
) увеличены на единицу. Используйте методыappendReplacement
иappendTail
в классеMatcher
.
- Дана строка, проверьте, что в ней содержится корректный email адрес. Будем считать, что корректный email состоит из имени пользователя (несколько латинских букв, точек, подчеркиваний, минусов), далее следует символ @, далее идет домен (тоже несколько латинских букв, точек, подчеркиваний, минусов), в конце должна быть точка и от двух до четырех латинских букв. Т.е. конец должен выглядеть как .com, .ru и т.п. Помните, что обычная точка означает любой символ, и ее может понадобиться экранировать. Используйте метод
Задачи посложнее
Для тех, кому скучно решать стандартные задачи: сюда.