Окно среды разработки NeBeans версии 6.8 представлено на рис. 1.4.
Рис.1.3. Окно среды разработки NeBeans 6.8
Для создания проекта в меню File выбирают команду New Project, как показано на рис. 1.4.
Рис.1.4. Создание нового проекта командой File>New Project
В качестве альтернативы можно воспользоваться кнопкой панели инструментов (по умолчанию она вторая слева) в виде светло-коричневой закрытой папки с зеленым крестом (рис. 1.5).
Рис.1.5. Кнопка создания нового проекта
В результате открывается диалоговое окно New Project, представленное на рис. 1.6. В этом окне в разделе Categories следует выбрать вид создаваемого проекта (в нашем случае выбирается позиция Java), а в разделе Projects - тип приложения (позиция Java Application). После щелчка на кнопке Next открывается окно New Java Application (рис. 1.7).
В поле Project Name указывается имя создаваемого проекта. Место для сохранения проекта вводится в поле Project Location (для выбора можно воспользоваться кнопкой Browse справа от поля). Кроме того, на рис. 1.7 сброшены флажки Create Main Class и Set as Main Project - в результате будет создан пустой (без пользовательских классов) проект. Окно среды NetBeans со вновь созданным проектом представленно на рис. 1.8.
Рис.1.6. Окно выбора типа приложения New Project
рис.1.7. Окно выбора параметров приложения New Java Application
рис.1.8. Добавление класса в проект
Чтобы добавить в проект класс, можно в контекстном меню проекта выбрать команду New ► Java Class или воспользоваться кнопкой New File на панели инструментов (по умолчанию первая слева).
В диалоговом окне New Java Class в поле Class Name вводится имя добавляемого в проект класса (рис. 1.9).
По умолчанию код класса содержит только формальные атрибуты начала и окончания описания класса и комментарии в шапке файла (этот шаблон, кстати, можно изменить). В код класса вносятся нужные изменения, например, так, как показано на рис. 1.11.
Для компиляции проекта можно воспользоваться командой Run ► Build Project или одноименной кнопкой на панели инструментов (рис. 1.12).
После успешной компиляции запускаем проект на выполнение. Для этого используем команду Run ► Run Project или кнопку, расположенную на панели инструментов справа от кнопки компиляции проекта (рис. 1.13).
При первом запуске проекта открывается окно Run Prject, предназначенное для выбора главного класса (рис. 1.14). В данном случае с предложенным выбором лучше согласиться. Окно среды NetBeans с результатом выполнения программы показано на рис. 1.15. Результат (текстовое сообщение) выводится в окне Output, которое играет в данном случае роль консоли.
Чтобы закрыть проект, используют команду Close Project меню File или команду Close контекстного меню проекта (рис. 1.16).
Рис.1.9. Окно задания параметров нового класса
рис.1.10. Окно среды NetBeans с кодом вновь созданного класса
Рис.1.11. Код класса после внесения изменений
рис.1.12.Компиляция проекта
рис.1.13. Запуск приложения
Рис.1.14.Окно выбора главного класса
рис.1.15. Результат выполнения программы отображается в окне Output среды NetBeans
Рис.1.16. Закрытие проекта
Чтобы открыть уже существующий проект, можно прибегнуть, например, к команде Open Project меню File (рис. 1.17).
Рис.1.17. Открытие проекта командой меню
Другой способ подразумевает использование соответствующей кнопки на панели инструментов - это третья слева кнопка (рис. 1.18).
рис.1.18.Открытие проекта с помощью кнопки панели инструментов
В результате открывается окно Open Project, в котором выбирается папка проекта, после чего выполняется щелчок на кнопке Open Project в нижней части окна (рис. 1.19).
Рис.1.19.Окно выбора папки проекта
После этого в окне среды NetBeans соответствующий проект открывается и его можно редактировать, компилировать и выполнять. Если необходимости в редактировании проекта нет и он уже откомпилирован, проект можно сразу запускать.
Пример программы
Орбита спутника
Следующая задача иллюстрирует работу с большими числами. Состоит она в вычислении высоты орбиты спутника над поверхностью Земли, если известны масса и радиус Земли, а также период обращения спутника вокруг Земли. В частности, используем значения универсальной гравитационной постоянной, массы Земли и радиуса Земли.
· Универсальная гравитационная постоянная:
G ≈ 6,672 х 10-11 Нм2/кг2.
· Масса Земли:
М ≈ 5,96 х 1024 кг.
· Радиус Земли:
R ≈ 6,37 х 106 м.
Если через Т обозначить период обращения спутника (в секундах), то высоту Н спутника над поверхностью Земли можно вычислить по формуле:
Соответствующий программный код приведен в листинге 1.5.
В результате выполнения программы получаем сообщение:
Высота орбиты спутника: 277.271 км
При инициализации переменных, определяющих параметры Земли и значение гравитационной постоянной, используется формат представления чисел в виде мантиссы и после литеры E (или e) значения показателя степени десятки. Поскольку время периода обращения спутника (переменная T) задается в часах, для перевода в секунды используем команду T*=3600. Высота вычисляется с помощью команды:
В этой команде использована математическая функция pow() для возведения числа в степень. Первым аргументом указывается возводимое в степень число, вторым - показатель степени. При вызове функции pow() явно указывается класс Math, в котором описана функция. Также использована константа PI (полная ссылка на константу имеет вид Math.PI) для числа п. Кроме того, при вычислении второго аргумента-показателя степени делятся два целых числа, а по умолчанию такое деление выполняется нацело. Чтобы деление выполнялось «как надо», использована инструкция (double).
После вычисления значения переменной H получаем значение высоты орбиты в метрах. Затем с помощью функции Math.round() это значение округляем и делим на 1000 для вычисления значения высоты орбиты в километрах. Поскольку функцией Math.round() возвращается целое число, при делении результата вызова этой функции на 1000 по умолчанию также выполняется деление нацело. В силу этой причины перед выражением указана инструкция (double) , в результате чего значение переменной H получаем в километрах с точностью до сотых, то есть точность орбиты вычисляется с точностью до метра.
Варианты для самостоятельного выполнения
Вариант 1. Комплексные числа
Рассмотрите программу, в которой вычисляется целочисленная степень комплексного числа. Напомним, что комплексным называется число в виде z = x + iy, где x и y - действительные числа, а мнимая единица i2 = -1. Величина Re(z) = x называется действительной частью комплексного числа, а величина Im(z) = у - мнимой. Модулем комплексного числа называется действительная величина
. Каждое комплексное число может быть представлено в тригонометрическом виде z = r exp(ij) = r cos(j) + ir sin(j), где модуль комплексного числа r и аргумент j связаны с действительной x и мнимой у частями комплексного числа соотношениями x = r cos(j) и у = r sin(j).
Если комплексное число z = x + iy необходимо возвести в целочисленную степень n, результатом является комплексное число zn = rn exp(inj) = rn cos(nj) + + irn sin(nj). Этим соотношением воспользуемся в программе для вычисления целочисленной степени комплексного числа.
Вариант 2. Прыгающий мячик
Рассмотрите такую задачу. Тело (упругий мячик) бросают под углом к горизонту с некоторой начальной скоростью. При падении мячика на ровную горизонтальную поверхность происходит упругое отбивание, так что горизонтальная составляющая скорости мячика не меняется, а вертикальная меняется на противоположную. Необходимо написать программу, которая бы вычисляла положение (координаты) мячика в произвольный момент времени.
При составлении программы воспользуемся тем, что если в начальный момент времени (то есть при t = 0) скорость мячика по модулю равна V, а угол к горизонту составляет а, то закон движения для горизонтальной координаты имеет вид:
Для вертикальной координаты соответствующая зависимость, исходя из постановки задачи, может быть записана так:
Здесь через Т обозначено время последнего на данный момент удара о землю. Поскольку время между ударами может быть определено как , то:
В данном случае квадратные скобки означают вычисление целой части от внутреннего выражения.
Вариант 3.Решение тригонометрического уравнения
Рассмотрите программу для решения уравнения вида:
Это уравнение, как известно, сводится к уравнению вида:
где . Поэтому формально решением исходного уравнения для любого n целого явления:
.
В программе, которую нужно написать, по значениям параметров а, b и с для значения п = 0 вычисляется решение уравнения, то есть решение (разумеется, если оно существует):
.
При этом проверяется условие существования решения а2 + b2 = с2. Если данное условие не выполняется, уравнение решений не имеет. Экзотический случай, когда а = b = с = 0 (при таких условиях решением является любое значение параметра х) в программе не отслеживается.
Вариант 4.Кодирование символов числами
Рассмотрим простую иллюстративную программу, в которой для записи сразу двух символьных значений (типа char) используется одна переменная целочисленного типа (int).
В программе учитывается то обстоятельство, что тип int в Java имеет размер в 32 бита, а для записи основных символов кодировки Unicode вполне достаточно 16 бит. Таким образом, объем памяти, выделяемой переменной типа int, достаточен для записи, по меньшей мере, двух букв (значений типа char). Алгоритм записи буквенных значений в виде чисел используем следующий: начальные 16 бит содержат код первой буквы, следующие 16 - код второй буквы.
Целочисленная переменная number предназначена для записи в нее числового кода, который формируется на основе значений переменных symbA и symbB типа char. После того как код создан и записан в переменную number, выполняется обратная операция: на основании значения переменной number восстанавливаются исходные символы, а результат записывается в переменные SymbA и SymbB типа char.
Значение переменной number задается командой: number=((int)symbB<<16)+((int)symbA)
В правой части соответствующего выражения стоит сумма из двух слагаемых. Первое слагаемое ((int)symbB<<16) представляет собой смещенный вправо на 16 позиций (битов) числовой код символа, записанного в переменную symbB. Для получения кода символа использована инструкция (int) явного приведения типов. Таким образом, инструкцией (int)symbB получаем код символа, после чего с помощью оператора сдвига << смещаем код на 16 бит влево с заполнением нулями младших 16 бит. В эти биты записывается код оставшегося символа, записанного в переменную symbA. Для этого к полученному на первом этапе коду прибавляется значение ((int)symbA) - то есть код первого символа.
Исходные символы и полученный на их основе числовой код выводятся на экран. Затем начинается обратная процедура по «извлечению» символов из числового кода. Для этого командой SymbB=(char)(number>>>16) «считывается» второй символ и записывается в переменную SymbB. Действительно, результатом инструкции number>>>16 является смещенный вправо на 16 бит код переменной number (с заполнением старшего бита нулем), то есть код второго символа (того, что записан в переменную symbB). Первый символ «считывается» немного сложнее. В частности, используется команда:
SymbA=(char)(number^((int)SymbB<<16))
Результатом инструкции (int)SymbB<<16) является код уже считанного второго символа, смещенный влево на 16 бит. По сравнению с кодом, записанным в переменную number, он отличается тем, что его младшие 16 бит нулевые, в то время как в переменной number эти биты содержат код первого символа. Старшие 16 бит при этом совпадают. Указанные два кода являются операндами в логической операции ^ (побитовое исключающее ИЛИ). Напомним, что результатом такой операции является единица, если один и только один из двух сравниваемых битов равен единице. Для совпадающих старших битов это означает «полное обнуление», а младшие единичные биты «выживают», поэтому на выходе получаем код, записанный в младшие 16 бит, то есть код первого символа. Сам символ получаем с помощью инструкции (char) явного приведения к символьному типу. После выполненного декодирования символы выводятся на экран.
В принципе, если для работы планируется использовать только небольшой набор символов, по описанному принципу можно «упаковать» в одной числовой переменной и большее количество символов. Однако для практических задач криптографии такой метод вряд ли можно считать приемлемым, поэтому пример следует рассматривать лишь как иллюстративный.
Вариант 5.Расчет параметров цепи
Составим программу для решения следующей задачи. Предположим, что участок электрической цепи должен состоять из двух блоков, в каждом из которых располагаются два параллельно соединенных резистора. Блоки между собой соединены последовательно. Имеется три резистора известного сопротивления, которые можно свободно переставлять между блоками, и один основной резистор, который обязан находиться во втором блоке. Необходимо определить, какой резистор вставить во второй блок в дополнение к основному, чтобы общее сопротивление участка цепи было минимальным.
Если сопротивления трех переставляемых резисторов обозначить как R1, R2 и R3, а сопротивление основного резистора как R, то при условии, что первые два резистора подключаются в первый блок, а третий резистор - во второй, общее сопротивление участка цепи будет составлять величину:
Поэтому для определения оптимального способа подключения резисторов нужно проверить три варианта, когда каждый из трех резисторов включается во второй блок, и выбрать тот вариант подключения, когда общее сопротивление минимально.
В программе объявляются и инициализируются переменные R1, R2, R3, R типа double, определяющие сопротивления трех переставляемых резисторов и основного резистора соответственно. Переменные r1, r2 и r3 типа double предназначены для вычисления и записи в них значения сопротивления участка цепи для каждого из трех возможных способов подключения резисторов. Также в программе объявляются две логические переменные A и B (типа boolean). Значения этих переменных определяются командами A=(r1<=r2)&&(r1<=r3) и B=(r2<=r1)&&(r2<=r3). Значение переменной A равно true в том случае, если при первом способе подключения резисторов (во втором блоке размещается первый резистор) общее сопротивление цепи не превышает сопротивление цепи для второго и третьего способов подключения резисторов. Значение переменной B равно true в том случае, если при втором способе подключения резисторов (во втором блоке размещается второй резистор) общее сопротивление цепи не превышает сопротивление цепи для первого и третьего способов подключения резисторов. Понятно, что если обе эти переменные равны false, то оптимальным является третий способ подключения резисторов.
После вычисления значений переменных A и B выполняется вывод результата. Сначала серией команд отображаются текущие значения, указанные при инициализации переменных для сопротивлений резисторов. Затем выводится начало фразы о способе подключения резисторов. Номер резистора (в текстовом формате) определяется непосредственно в аргументе метода println() командой A?"первый":B?"второй":"третий", в которой использованы вложенные тернарные операторы. Если значение переменной A (первый операнд внешнего тернарного оператора) равно true, возвращается второй операнд внешнего тернарного оператора - текстовое значение "первый". В противном случае вычисляется третий операнд внешнего тернарного оператора. Третьим операндом является тернарный оператор B?"второй":"третий". При условии, что значение переменной B равно true, возвращается текст "второй", в противном случае - текст "третий". После того как нужное слово (название резистора) выведено на экран, следующими командами завершается выведение финальной фразы.