Основы программирования, первый семестр

Сайт 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. Дано целое число. Выведите после него существительное “кот” (или любое другое) в правильной форме: 1 кот, 2 кота, 5 котов
  3. Даны коэффициенты квадратного уравнения, целые числа a, b, c: \(ax^2+bx+c = 0\) Решите квадратное уравнение. Разберите все случаи, включая \(a = 0\). Ответ должен быть одним из следующих: «решений нет», «одно решение x = …», «два решения x1 = …, x2 = …» или «решений бесконечно много».
  4. Даны три целых числа 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".
  5. Дано целое число от 1 до 999, вывести его в виде текста. Убедитесь, что вы не выводите двух пробелов подряд, и пробелов в конце текста. Получите результат в виде строки, последней операцией в программе напечатайте эту строку на экран. http://codingbat.com/prob/p297521 (усложненный вариант http://codingbat.com/prob/p220544)
  6. Строки. Для каждого утверждения из списка ниже заведите функцию, которая по заданной строке возвращает, верно утверждение или нет. Не забудьте проверить все функции в методе main.
    1. Строка состоит только из строчных букв
    2. Строка состоит только из заглавных букв
    3. Строка начинается с заглавной буквы, а все остальные строчные
    4. В строке чередуются буквы, т.е. первая заглавная, вторая строчная, третья заглавная и т.д. Или наоборот, первая строчная, вторая заглавная, третья строчная и т.д. Используйте конструкцию Character.isUpperCase(‘z’), чтобы определить, верно ли, что символ является заглавной буквой. (аналогично Character.isLowerCase())
  7. Циклы.
    1. Напишите функцию, которая по заданному n создает строку с числами от 1 до n через запятую. Сделайте еще одну такую же функцию, только чтобы числа шли назад от n до 1.
    2. Напишите функцию, которая удаляет из строки все символы кроме букв. Т.е. по строке “x,y,z,1 2 3abc” должна возвращаться строка “xyzabc”. Используйте Character.isLetter(‘z’), чтобы проверить, что символ является буквой.
  8. Вложенные циклы. Все задачи нужно оформить в виде void функций. Они получают на вход одно или два числа, в зависимости от условия.
    1. Напечатайте на экране таблицу из m на n звездочек
    2. Напечатайте на экране треугольник из звездочек размера n на n:
       *
       **
       ***
       ****
      
    3. Напечатайте на экране треугольник из звездочек размера n на n:
       ****
       ***
       **
       *
      
    4. Напечатайте на экране треугольник из звездочек размера n на n:
          *
         **
        ***
       ****
      
    5. Напечатайте на экране таблицу размера 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 получится таблица

      ┌─┬─┬─┐
      │ │ │ │
      ├─┼─┼─┤
      │ │ │ │
      └─┴─┴─┘
      
  9. Массивы. Реализуйте указанные функции:
    1. Дано n, верните массив из первых n четных чисел: 2 4 6 8 … 2n
    2. Дан массив, функция проверяет, есть ли в массиве одинаковые элементы: boolean hasSimilar(int[] a)
    3. Дан массив, верните среднее значение всех элементов массива. (т.е. сумму элементов, деленную на количество элементов)
    4. Дан массив, верните дисперсию всех элементов массива. (это среднее значение элементов массива, возведенных в квадрат, минус среднее значение элементов массива, возведенное в квадрат)
    5. Остортируйте массив по убыванию: 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
      
  10. Двумерные массивы. Заставьте следующий код работать:
         char[][] c = createTable(20, '.');
         printTable(c);
    
         System.out.println('============ Заполним строки: ==========');
         fillFirstAndLastLines(c, '#');
         printTable(c);
    
         System.out.println('============ Заполним столбцы: =========');
         fillFirstAndLastColumns(c, '#');
         printTable(c);
    
    1. createTable возвращает массив char 20 на 20, все символы в массиве должны быть ‘.’
    2. printTable печатает массив на экран. При этом выводите символы подряд, без запятых. Можете вывести пробелы между символами, так получается более красиво.
    3. fillFirstAndLastLines Воспользуйтесь Arrays.fill(), чтобы заполнить первую и последнюю строки массива символами ‘#’.
    4. fillFirstAndLastColumns Заполните первый и последний столбец массива символами ‘#’.
  11. Файлы на диске (каталог = директория = папка)
    1. Выведите на экран все файлы в текущем каталоге (в каталоге .), директории выводить не нужно. Не забудьте создать несколько директорий в каталоге для тестирования, чтобы убедиться, что папки не выводятся.
    2. Выведите дерево каталогов, начиная с текущей директории. Содержимое каждой новой директории должно сдвигаться на четыре пробела вправо. Например:
               .
                   a.txt
                   b.txt
                   subdir1
                       aa.txt
                       bb.txt
                       subsubdir
                           aaa.txt
                   subdir2
                       cc.txt
      

    Для этого создайте функцию void printDirectory(File directory, String indent), которой передается директория для печати и indent — строка, содержащая нужное количество пробелов для отступа.

  12. Чтение и запись в файлы
    1. Дан файл. Прочитайте из него все целые числа и выведите на экран их сумму.
      • Измените метод так, чтобы он игнорировал все слова, которые не являются целыми числами. (используйте hasNextInt(), не используйте scanner.useDelimiter()).
    2. Дан массив строк lines и имя файла. Запишите в файл заданные строки построчно. Не забудьте, что есть цикл “for each”.
    3. Даны два файла. Прочитайте из первого файла текст и перепишите его во второй файл, исправив ошибки в регистрах букв Например, если исходный текст был:

       какой-то Текст с неправильными   Регистрами букв!  втОРОе предложение Этого текста.
      

      то должно получиться:

       Какой-то текст с неправильными регистрами букв! Второе предложение этого текста.
      

      Вы должны читать исходный файл по словам, разделенными пробельными символами, следить за последним символом очередного слова. Если это символ конца предложения (точка, восклицательный знак, вопросительный знак), нужно сделать так, чтобы следующее слово начиналось с заглавной буквы. Иначе следующее слово должно начинаться со строчной буквы. Заглавные буквы внутри слов нужно изменить на строчные.

  13. Регулярные (неэпизодические) выражения
    1. Дана строка, проверьте, что в ней содержится корректный email адрес. Будем считать, что корректный email состоит из имени пользователя (несколько латинских букв, точек, подчеркиваний, минусов), далее следует символ @, далее идет домен (тоже несколько латинских букв, точек, подчеркиваний, минусов), в конце должна быть точка и от двух до четырех латинских букв. Т.е. конец должен выглядеть как .com, .ru и т.п. Помните, что обычная точка означает любой символ, и ее может понадобиться экранировать. Используйте метод matches() класса String
    2. Дана строка с текстом на русском языке, в которой автор неправильно расставил пробелы перед запятыми. Например, Это строка , у которой зачем-то написаны два пробела перед запятой. Нужно найти все пробельные символы перед запятыми и удалить их. Должно получиться Это строка, у которой зачем-то написаны два пробела перед запятой. Используйте метод replaceAll() класса String.
    3. Дана строка. Найдите в ней все слова, написанные через дефис и поменяйте две половинки этих слов местами. Например, строка “Какая-то сине-зеленовая трава” должна превратиться в “то-Какая зеленовая-сине трава”. Используйте метод replaceAll класса String и $ для ссылки на группы.
    4. Дана строка. Посчитайте, сколько раз в ней встречаются символы “кот”, в произвольном регистре. Т.е. Кот и КОТ тоже надо считать. Используйте Matcher с методом find(). При создании регулярного выражения с помощью класса Pattern установите режимы Pattern.UNICODE_CASE и Pattern.CASE_INSENSITIVE.
      • Необязательное задание. А если надо искать слово “кот”, т.е. не считать, например, слово “который”? Попробуйте два способа указать, что “кот” должно быть частью другого слова. 1) найдите на странице с лекцией ссылку на все возможности регулярных выражений в Java, и там найдите, как указать word boundaries 2) используйте конструкции наподобие (\s $) - это означает либо пробельный символ, либо конец строки.
    5. Дан файл, допустим, text_with_numbers.txt. Создайте файл text_with_numbers_plus_one.txt, который содержит ровно то же, что содержит первый файл, только все числа (последовательности цифр \d+) увеличены на единицу. Используйте методы appendReplacement и appendTail в классе Matcher.

Задачи посложнее

Для тех, кому скучно решать стандартные задачи: сюда.

Результаты

Таблица результатов