понедельник, 15 марта 2010 г.

Решения для заданий 1-го занятия по Java

Напоминаю, если вы не сделали еще задачи, то не нажимайте кнопку далее.

Первую задачу, как я уже сказал я разбил на два метода.
Первый метод определяет простое число или нет. Для тех кто еще не читает код на ява, в двух словах идея алгоритма:
Делаем предположение, что число простое. Условие продолжения цикла, что число простое и меньше корня из тестируемого числа (больше проверять смысла нет). В переменную в которой хранится предположение записываем результат сравнения остатка от деления с нулем. Если не равно нулю - число пока не составное, если равно - флаг опускается тем самым прерывая выполнения цикла. Действительно, поняв что число 18 делится на 2, зачем его делить на 3, 4... Второй метод интереса не представляет.
Код:
public static boolean isSimple(int i) {
    boolean simple = true;
    int sqrI = (int)Math.sqrt(i);
    int iterator = 2;
    while (simple && iterator <= sqrI)
    {
      simple = i % iterator != 0;
      iterator++;
    }
    return simple;
  }

  public static void PrintSimple(int forNumber)
  {
    for  (int i = 1; i <= forNumber; i++)
    {
      if (isSimple(i))
      {
        System.out.println(i);
      }
    }
  }


* This source code was highlighted with Source Code Highlighter.

Вторая задача, как я уже говорил поинтереснее, если решать при помощи календаря, то будет скучно. Идея простая записываем числа в календарь, смотрим то что хранится в календаре поэлементно с тем, что введено. Если совпало - даты правильные. Скучно...
Решал так. сначала писал метод с двумя параметрами, делая допущение что год не високосный. Проверяем правильность введенного месяца, а потом смотрим сколько дней максимум в том месяце который проверяем. Т.к. месяцев с 31 днем больше чем других, это предположение идет первым. Затем проверяем месяц с 28 днями и месяца с 30 днями (их всего 4 против 7 месяцев с 31 днем).
  public static boolean checkDate(final int month, final int date) {
    boolean normalDate = true;
    if (month < 1 || month > 12)
    {
      normalDate = false;
    }
    else
    {
      if (date < 1)
      {
        normalDate = false;
      }
      else
      {
        int maxDate = 31;
        switch (month)
        {
          case (2):
            maxDate = 28;
            break;
          case (4):
          case (6):
          case (9):
          case (11):
            maxDate = 30;
            break;
        }
        if (date > maxDate)
        {
          normalDate = false;
        }
      }
    }
    return normalDate;
  }


* This source code was highlighted with Source Code Highlighter.
Ну и собственно второй метод вызывает первый (помните мы делали предположение что год не високосный), и вносит правку в случае февраля високосного года.
  public static boolean checkDate(final int year, final int month, final int date) {
    boolean normalDate = checkDate(month, date);
    if (year < 1970)
    {
      normalDate = false;
    }
    else
    {
      if (month == 2 && year % 4 == 0 && (year % 100 > 1 || year % 400 == 0) && date < 30 && date > 0)
      {
        normalDate = true;
      }
    }

    return normalDate;
  }


* This source code was highlighted with Source Code Highlighter.
Ну и третья задача. Первый метод тривиальный, и единственная особенность проверить что индекс заменяемого символа существует:
  public static String setCharAt(final String source, final char symbol, final int position) throws IllegalArgumentException {
    String result = source;
    if (position >= 0 && position < source.length())
    {
      result = source.substring(0, position) + symbol + source.substring(position + 1, source.length());
    }
    return result;
  }


* This source code was highlighted with Source Code Highlighter.
Вторая задача чуть поинтереснее, да и то в случае, если подумать о производительности (строки это медленный тип). Поэтому строка в массив, инверсия, массив в строку.
  public static String reverse(final String source) {
    char[] buffer = source.toCharArray();
    int midlePosition = buffer.length / 2;
    for (int i = 0; i < midlePosition; i++) {
      char temp = buffer[i];
      buffer[i] = buffer[buffer.length - i - 1];
      buffer[buffer.length - i - 1] = temp;
    }
    return String.copyValueOf(buffer);
  }


* This source code was highlighted with Source Code Highlighter.
На этом все. Приятного времяпровождения за изучением забавного языка Java.

P.s. Кстати кто знает как в эклипсе дебагером воспользоваться?

Комментариев нет:

Отправить комментарий