Java для школьников. Занятие №9. Интересная задача. Проверка - является ли число простым?

Предыдущее занятие Следущее занятие

Можно сказать, мы потратили на изучение Java уже достаточно времени и вполне можем решать уже какие-либо интересные задачи. К одной из таких задач можно отнести, например, проверку - является ли введенное число простым? О простых числах и об алгоритмах нахождения простых чисел можно почитать здесь. Для тех, кто не хочет углубляться в теорию, скажем, что простое число, это натуральное число (т.е. употребляемое для счета предметов), которое делится на единицу и на самого себя.

На этом занятии мы разберем несколько важных аспектов программирования на Java:

  • Метод main() и точка входа в программу;
  • организация ввода данных с помощью аргументов программы в командной строке (здесь также вспомним про строковый и другие типы данных);
  • операторы цикла;
  • операторы сравнения в Java.

плюс - некоторые операторы, которые часто применяются программистами в работе:

  • нахождение остатка от деления;
  • оператор return и завершение программы.

Отметим, что наш вариант программы (см. Листинг 1) для решения поставленной задачи, с точки зрения классического объектно-ориентированного программирования (ООП), "не очень правильный" - без конструкторов, полей и методов класса (прочитать об ООП можно в материалах Занятия 1). Приведенный вариант - пример того, как можно программировать на Java не используя ООП, и на первый план при этом выходит очень интересный метод main(). Итак, смотрим Листинг 1.

Листинг 1. Проверка - является ли число простым (файл IsNumberIsSimple.java)

public class IsNumberIsSimple {
       
        public static void main (String args[]) {
          int num = Integer.parseInt(args[0]);
         
          for ( int i=2; i < num; i++) {
                  if ( num%i == 0) {
                          System.out.println("This number is not simple!!!");
                          return;
                  }      
          }
          System.out.println("Very well! It's simple!");         
        }      
}

Чтобы убедиться, что программа работает, необходимо скомпилировать ее командой
javac IsNumberIsSimple.java
и, внимание, запустить с аргументом - числом для проверки, например
java IsNumberIsSimple 7

Аргумент программы - это параметр, который в командной строке пишется после имени программы через пробел.

О компиляции и запуске программ на языке Java см. Занятие 3.

Давайте теперь разберем подробнее программу из Листинга 1. Нужно сказать, что она получилась достаточно компактной. В классе IsNumberIsSimple использован всего лишь один метод main(), и, думается, настало время поговорить об этом методе более подробно. Во многих языках программирования имеется метод (функция), определяющий так называемую "точку входа" в программу. Язык Java многое позаимствовал от языков C/C++, в том числе и название такой точки входа. Речь идет о том, что если Вы хотите, чтобы программа была выполнена операционной системой ( в нашем случае виртуальной машиной), необходимо снабдить ее исходный код методом main(). Для языка программирования Java это означает, что необходимо включить метод main() в основной класс программного модуля. (Если в этом абзаце ничего не понятно, см. Занятие 1, Занятие 8 или просто поверьте что код Листинга 1 будет работать, а ознакомление с этими понятиями оставьте "на потОм").

"Метод main() записывается как обычный метод, может содержать любые описания и действия, но он обязательно должен быть открытым (public), статическим (static), не иметь возвращаемого значения (void). Его аргументом обязательно должен быть массив строк (String[]). По традиции этот массив называют args, хотя имя может быть любым." (см. [1])

Мы пока сознательно опустим объяснение что такое статический метод, но обязательно вернемся к этому позже. Далее, оказывается, в метод main() можно передавать параметры, как сказано выше - массив строк. (О передаче параметров в метод см. в материале Занятия №6). До этого мы уже были знакомы со строками, т.к. выводили сообщения с помощью метода println() класса System. Строковый тип данных используется в программировании постоянно. И представляет из себя последовательность символов обычно состоящую из букв, знаков препинания и цифр. Вспомните незабываемый фрагмент кода из Занятия №4:

System.out.println("Да здравствует Java!!!");

Фраза, заключенная в кавычки - "Да здравствует Java!!!" - типичный представитель строкового типа данных.

Далее, еще один новый термин - массив. Массив — это упорядоченный набор данных, идентифицируемых с помощью индексов. В простейшем случае массив имеет постоянную длину и хранит единицы данных одного и того же типа (подробнее см., например, в Википедии). В нашем случае, в метод main() передается массив строк под названием args. Что интересно, первый из элементов массива будет иметь индекс 0. Т.е. в ячейке памяти, отведенной под переменную с именем args[0] будет храниться первый и единственный параметр командной строки для нашей программы. Это и будет число для проверки (вспомните цель нашей программы - проверить является ли какое-то число простым).

В программе мы объявили всего лишь одну переменную:

          int num = Integer.parseInt(args[0]);

тип этой переменной - int. Так в Java объявляются целочисленные переменные. Что такое целое число? Математическое определение целых чисел можно посмотреть здесь. Как видно, ряд натуральных чисел входит в состав целых. Так для чего нам понадобилась такая целочисленная переменная? Как уже было сказано, в метод main() передается строковый массив, а в первом его элементе - args[0] хранится первый параметр метода main() (число для проверки), который тоже является строкой, но со строками в программировании, к сожалению, нельзя выполнять математических операций, а они (точнее некоторые из них) нам обязательно понадобятся.

С помощью конструкции

Integer.parseInt(args[0]);

мы преобразовали первый элемент строкового массива args к типу целочисленных переменных.

Идея нашей программы проста. Если ввести в программу в качестве аргумента число больше 2, программа будет перебирать все целые числа и проверять делится число, которое мы ввели на текущее. Перебор всех целых чисел, которые меньше аргумента нашей программы, достигается при помощи следующей конструкции (оператора) for:

 for ( int i=2; i < num; i++) { ... }

В которой внутри круглых скобок код символом ";" разделен на три части - в первой определяется переменная i, уже знакомого нам целочисленного типа, и ей сразу же присваивается значение 2, во второй записывается условие, до выполнения которого будет выполняться третья часть оператора for - в нашем случае это увеличение переменной i на единицу. Увеличение переменной на единицу записывается с помощью еще одного "хитрого" оператора ++. Итак, пока условие, записанное во второй части кода в круглых скобках, не сработало, будет выполняться блок кода, заключенный в фигурные скобки. Такая конструкция в программировании называется циклом, а оператор for называется "оператором цикла".

Далее, в теле цикла for (в блоке кода, заключенного в фигурные скобки) с помощью оператора if, осуществляющего проверку условия

 if ( num%i == 0) {
          System.out.println("This number is not simple!!!");
          return;
}

мы проверяем, делится ли исходное число (аргумент нашей программы - попавший в переменную num после присваивания) на текущее (переменная i) нацело (т.е. без остатка) с помощью оператора выделения остатка от деления "%". И, если делится, это означает что число не является простым, Далее программа прерывает свое выполнение с помощью оператора return. В данном случае оператор return вернет управление среде, вызвавшей метод main(), т.е. виртуальной машине Java и операционной системе.

Если же, перебрав все целые числа от 2 до num в цикле for мы не обнаружили ни одного случая деления без остатка, то, по определению, аргумент программы - целое число.

Задание для самостоятельного выполнения:
* доработайте программу так, чтобы она проверяла введенное число на условие "является ли оно составным?". Узнайте что такое составное число.

Литература:

1. И.Хабибуллин "Java 2", с.91

Комментарии

Интересное дополнение к алгоритму нахождения простого числа прочитал в сборнике "Эффективная подготовка к ЕГЭ 2015" Н.Н.Самылкиной, Е.М.Островской. Действительно, нет смысла делить проверяемое число на числа, большие его половины (нацело все равно не поделится). Поэтому, строку for ( int i=2; i < num; i++) можно заменить на for ( int i=2; i < num/2; i++), т.е. цикл будет продолжаться до целого числа - половины от исходного, а программа будет выполняться быстрее.

Страницы