1 Обзор Современные средства создания Java-приложений разработаны для различ- ных платформ: Linux, Solaris, Windows и MacOS. Важнейшее преимущество языка Java заключается в том, что приложение, написанное на основе данного языка, является независимым от платформы и архитектуры процессора, кото- рый будет выполнять алгоритм данного приложения. Главным звеном в данном процессе является виртуальная машина Java — это специальная программа, которая имеющийся откомпилированный независи- мый байт-код преобразует в набор инструкций для конкретного процессора. Программа должна быть предварительно установлена на компьютер, где пла- нируется запуск приложения. Байт-код формируется из кода Java встроенным компилятором Язык Java является объектно-ориентированным и поставляется с достаточно объемной библиотекой классов. Библиотеки классов Java значительно упро- щают разработку приложений, предоставляя в распоряжение программиста мощные средства решения стандартных задач. Почти сразу же после появления Java было создано большое количество инте- грированных сред разработки (ИСР) программ для этого языка: Eclipse (Eclipse Foundation), NetBeans (Sun), JBuilder (Inprise), Visual Age (IBM), VisualCafe (Sy- mantec) и др. Большинство из существующих ИСР приложений сами написаны полностью на Java и имеют развитые средства визуального программирова- ния. Лабораторный цикл содержит работы по изучению программирования на языке Java. Можно по выбору использовать две свободные ИСР: Eclipse или Net- Beans. NetBeans. Разработка ИСР NetBeans началась в 1996 г. под названием Xelfi (игра букв на основе Delphi) в качестве проекта студентов под руководством Романа Стане- ка по на Факультете Математики и Физики Карлова Университета в Праге. В 1997г. начат выпуск коммерческих версий ИСР NetBeans до передачи всех прав на нее корпорации Sun Microsystems в 1999г. В 2000г. Sun открыла исход- ные коды ИСР NetBeans. Сейчас спонсор этой ИСР – Oracle. Обе ИСР предназначены для разработки консольных приложений, приложе- ний для ОС с графическим интерфейсом, DLL и др. 1.1 Методическиеуказания Названиеработы. Цельработы. Задание в соответствии свариантом. Блок-схема алгоритма в соответствии с номеромварианта. Листингипрограммы. Результаты выполнения программы наПК. Выбор варианта задания Номер варианта задания = 1 + последняя цифра номера зачетной книжки. В отдельных работах варианты выбираются по оговоренному правилу. Сохранение кодов ИСР для каждого проекта создает несколько файлов. Чтобы файлы разных проектов не перепутывались, следует для каждого проекта создавать свою папку с именем, отображающим смысл (например, WFormApplHello). Чтобы файлы разных студентов не перепутывались друг с другом, каждому студенту следует создавать для своих файлов индивидуальные папки. Реко- мендуется иерархия вложенных друг в друга папок: Диск пользователя (устанавливается администратором) Папка Users (пользователи) Папка группы (например, PO_31) Папка студента (например, Ivanov) Папка проекта (например, Hello_Appl) Внутри нее файлы проекта. В дисплейных классах в папке проекта на каждом занятии следует сохранять файлы проекта (одно задание лабораторной работы – один проект, одна пап- ка). Рекомендуется при выполнении работы периодически сохранять незавер- шенные проекты в текущем состоянии, чтобы избежать потерь документов при сбоях. Методические указания МУ в электронном виде доступны студентам на сервере кафедры (только для чтения). Иерархия папок с документацией следующая: Диск Method Папка преподавателя (например, Akchurin) Папка МУ для дисциплины (например, Java) Файлы методических указаний к отдельным работам. Внимание. ИСР для каждого нового проекта использует шаблон, в который нужно добавить функциональность. ИСР создает перечень доступных про- странств имен директивами import по умолчанию. 2 Java. Первыепрограммы Предмет исследования Активизация интегрированной среды разработки(ИСР). Структура главного меню и егопункты. Опции выпадающихменю. Создание простого Windowsприложения. Создание простого консольногоприложения. Контрольные вопросы 1. Активизация ИСР и выход изсреды 2. ОкнаИСР. 3. Назначение и содержание главного окнаИСР. 4. Окно Конструктораформы. 5. Окно Редакторакода. 6. Окноинструментов. 7. Главное меню ИСР. Опциипунктов. 8. Отличия проектов Приложение и Консольноеприложение. 9. Использование встроенного подсказчика. 10. Создание Windowsприложения. 11. Создание консольногоприложения. едакторе номеров строк. 2.1 Основы ИСРNetBeans Окно ИСР пустого проекта содержит: Строку заголовка с именемИСР. Главное меню, может быть на русскомязыке. Панельинструментов. Слева окно иерархии решения с вкладками – Проекты, Файлы,Службы. Справа вверху рабочее полепроекта. Справа внизу окно для выводарезультатов. Пункты главного меню: Файл(File)-стандартныеоперацииработысфайлами. Правка(Edit)-стандартныеоперацииредактирования. Просмотр (Navigate) - команды выбора компонент проекта дляпросмотра. Переход. Исходный код (Source) - команды выбора фрагментовкода.. Реорганизация кода (Refactor) – операции по изменениюоформления имеющегося кода программы без изменения ееповедения. Выполнить (Run).Запуск. Отладка. Профиль. Тeam. Связь с сервером командыразработчиков. Сервис. Окна (Windows). Выбор окон дляотображения. Справка (Help). На английскомязыке. Для начала работы с проектом нужно его создать. Для этого исполняется ко- манда Файл=>Создать проект. Отображается выпадающее меню для выбора типа проекта. В нем нужно выбрать категорию проекта и тип проекта. Выбираем категорию Java и тип - Приложение Java. Это консольное приложение. Отображается окно со свойствами проекта. В нем нужно задать: Имя проекта (например,First). Расположение проекта (например,E:\Eddy\java\NetBeans). Установить флаг - Создать главныйкласс. Установить флаг - Сделать главнымпроектом. В итоге генерируется окно проекта, в котором отображаются его компоненты В окне проекта иерархия First. Содержит автоматически подключенные библиотеки. В рабочем поле проекта вкладка Main.java с шаблоном кодапроекта. ВподключенномокненавигацииMainсредствапросмотрачленовкла сса Main. Программа – это класс с именем Main. Внутри него определен главный метод с именем main(). Исполнение программы начинается с его запуска. В коде программы по умолчанию вставлены строки: Java комментария (в парных скобках /** и */). По нему можно автоматиче- ски построить справку (Help) кпроекту. Текстового комментария в конце строк (с символами//). Пустые строки для визуального разделения фрагментовкода. В метод main нужно добавлять свой функционал. Добавим команду вывода в консоль фразы Proba командой System.out.println (“Proba”); При наборе команды используем интерактивный подсказчик. После набора слова System и точки появится выпадающее меню. В нем ищем нужное действие. Если его не видно, то набираем следующую букву и ищем снова. Найденный метод выбираем. В качестве аргумента вы- бранного метода вводим строку “Proba”. Если при наборе кода допускается ошибка, то ошибочный фрагмент кода подчеркивается волнистой линией. При подведении курсора к месту ошибки во всплывающем окне ошибка описывает- ся. Листинг программы /* * To change this template, choose Tools |Templates * and open the template in theeditor. */ package first; /** * * @author Костян */ public class Main { 28 /** * @param args the command linearguments */ public static void main(String[] args) { System.out.println("Proba");// Действие } } Внимание. По умолчанию открывающая фигурная скобка тела класса или метода размещается в строке заголовка после сигнатуры. Это ухудшает визу- альное восприятие кода, так как скобки пары не размещаются в одном и том жестолбце. Листинг программы (другая иерархия) /* * To change this template, choose Tools |Templates * and open the template in theeditor. */ package first; /** * * @author Костян */ public class Main { /** * @param args the command linearguments */ public static void main(String[] args) { System.out.println("Proba");// Действие } } Для прогона программы используем команду Выполнить=>Запустить глав- ный проект. В закладке Вывод отображается результат консольного приложе- ния: ФразаProba. Сообщение о завершении и времяисполнения. Внимание! При запуске готовой программы файлы проекта автоматически сохраня- ются. При любом новом прогоне обновленные файлы будут переписы- ваться в местеразмещения. Если Вы переходите к новому проекту, то закройте старый, но не удаляйтеего.Приудалениивесьпроектстираетсяизместарасположени я. При больших программах желательно видеть номера строк кода. Если номера не отображаются, то для активизации нумерации строк нужно кликнуть правой кнопкой мыши по линейке слева от кода. В выпадающем меню выбрать коман- ду - Показать номера строк. Это приведет к отображению в редакторе номеров строк. 2.2 Hello_Cons Создать проект консольного приложения Hello. Оно должно в символьном ре- жиме выводить в консоль фразу «Hello, World и Россия от <Фамилия студен- та>». Варианты к заданию. Индивидуальные данные студента. Пример. Создать проект консольного приложения Hello. Оно должно в сим- вольном режиме выводить в консоль фразу «Hello, World и Россия от Акчури- на». Используем ИСР NetBeans. Действуя, как в задании 2, создаем проект с именем Hello_cons. В тело программы main добавляем строку вывода в консоль нужной фразы. В окне Вывод может отображаться результата проекта, использованного до этого проекта. Листинг программы /* * To change this template, choose Tools |Templates * and open the template in theeditor. */ package hello_cons; /** * * @author Акчурин */ public class Main { /** * @param args the command linearguments */ public static void main(String[] args) { System.out.println("Hello, World и Россия от Акчурина");// Действие } } Результат прогона в окне Вывод: 32 2.3 Hello_Appl Создать проект Windows приложения Hello. Оно должно в графическом режиме выводить в окно формы фразу «Hello, World и Россия от <Фамилия студента>». Варианты к заданию. Индивидуальные данные студента. Пример. Создать проект Windows приложения Hello. Оно должно в графиче- ском режиме выводить в окно формы фразу «Hello, World и Россия от Акчури- на». Используем ИСР NetBeans. При создании нового проекта из меню командой Файл=>Создать_проект вы- зывается окно выбора типа проекта. В нем выбираем категорию Java и тип проекта - Настольное приложение Java. В нем поддерживается графический интерфейс пользователя (ГИП) с набором компонент Swing или AWT по выбо- ру. В окне выбираем Настольное приложение Java. Проекту нужно задать имя (например, Hello_Appl) и расположение (например, E:\Eddy\java\NetBeans\Hello_Appl). Генерируется окно проекта. 34 В графическом приложении ИСР использует два окна: Исходныйкод. Конструктор. В нем отображается форма приложения. Форма конструиру- ется визуально, а исходный код будет формироватьсяавтоматически. Справа от Конструктора расположено два окна: Палитра доступныхкомпонент. Свойстваэлементовформы.Внейотображаютсясвойстваэлемент а, выделенного вформе. При визуальном конструировании формы в палитре нужно выделить компо- ненту и переместить ее в форму в желаемое место. Используем два компонен- та: Кнопка Button, при нажатии которой будет происходить вывод фразы. Ее имяjButton1. Метка Label, в которую будет выводиться фраза. Имя меткиjLabel1. В окне Свойства для кнопки Button задаем надпись «Нажми меня», а для метки Label стартовую надпись «Смотри сюда». Для кнопки задаем отслеживаемое событие. Для этого в выпадающем меню кнопки выбираем это событие командой События=>Action=>actionPerformed. Это означает реакцию на приоритетное действие, для кнопки это однократный щелчок мышью. В код программы автоматически заносится обработчик события, в код которого нужно задать действие: jLabel1.setText(“Hello World и Россия от Акчурина”). Код очень длинный, он включает действия эмулируемее системно. Его не надо редактировать. 36 Фрагмент листинга программы Результаты прогона 3 Типы в языкеJava Предмет исследований Структура программы на языкеJava. Задание констант,переменных. Типы численных данных и ошибки при преобразованияхтипов. Организация простейшего ввода-выводаданных. Программа решения задачи в виде консольногоприложения. Контрольные вопросы 1. Алфавит языка Java, операции,идентификаторы. 2. Структурапрограммы. 3. Типы данных в Java.Идентификаторы. 4. Константы. Их объявление. Константныевыражения. 5. Переменные. Ихобъявление. 6. Форматы представления чисел (с фиксированной и плавающейточкой). 7. Целые типы, используемые в Java. Арифметические операции над пере- менными целыхтипов. 8. Вещественные типы, используемые вJava. 9. Операции сравнения для целых чисел, используемые вJava. 10. Логические типы данных boolean. Логические операции, используемые в Java. 11. Приведение типов в Java. Совместимость типов приприсвоениях. 12. Символьные типы вJava.. 13. Строковые типы вJava. 3.1 Численныетипы Задание. Создать программу взаимных преобразований типов численных дан- ных в соответствии с вариантом. Нужно преобразовывать численные данные из типа Start в типы Fin1 и Fin2 для вещественных и целыхчисел. Пример. Создать программу преобразования численных данных из типа Start в типы Fin1, Fin2: Для вещественных чисел: Start = Double, Fin1 = Float. Дляцелыхчисел: Start = Int, Fin1 = Short, Fin2 =Long.Блок-схемаалгоритма Для контроля размеров данных в программе используется встроенная функция тип_данных.size, возвращающая размер аргумента в битах. Каждый раз дан- ные выводятся в виде значения, размера в битах и типа данных. Числа для наглядности отображаются в формате с фиксированной точкой. Используем ИСР NetBeans. Листингпрограммы package chisla; public class Main { public static void main(String[] args) { final double real_0=123.456789; final int int_0=1111; float real_1; short int_1; long int_2; System.out.println("Вещественное число в разных типах\n"); real_1=(float)(real_0); System.out.println("Значения и размер в битах в разных типах"); System.out.println("real_0="+real_0+":"+Double.SIZE+"bites double"); System.out.println("real_1="+real_1+": "+Float.SIZE+" bites float"); System.out.println("\nЦелое число в разных типах\n"); int_1=(short)(int_0); int_2=(long)(int_0); System.out.println("Значения и размер в битах в разных типах"); System.out.println("int_0="+int_0+": "+Integer.SIZE+" bites int"); System.out.println("int_1="+int_1+": "+Short.SIZE+" bites short"); System.out.println("int_2="+int_2+": "+Long.SIZE+" bites long"); } } В листинге программы объявлены типизированные константы real_0 и int_0 (final), стартовые числа Start. Значение int_0 выбрано таким, чтобы оно уме- щалось в формате выбранного типа. В листинге также объявлены группы пе- ременных Fin1, Fin2 для каждого вида чисел. Вывод в консоль 3.2 КлассDate Предмет исследований Использование класса Date. Разработка алгоритма решения в соответствии сзаданием. Составление программы решения задачи в виде консольногоприложения. Контрольные вопросы 1. Назначение классаDate. 2. Стандарт UT (Universal Time) –универсальное время по атомнымчасам. 3. Стандарт UTC (Coordinated Universal Time) – координированное универ- сальное время с дополнительнымисекундами. 4. Создание объектаDate. 5. Методы объекта Date. 6. Получение компонент объектаDate. 7. Коррекция компонент объектаDate. Задание. Создать консольное приложение для работы с типом Date. Оно должно вводить дату и время рождения студента, выводить детали этих све- дений. Варианты к заданиям - индивидуальные данные студента. Пример. О человеке, который родился 24 марта 1940 года. Листингпрограммы package cons_date; importjava.util.Da te; public class Main{ public static void main(String[] args) { Date Date1 = new Date(1940,3,24,8,30,40); System.out.println("Свойстваобъекта Date1"); System.out.println("Год = " + Date1.getYear()); System.out.println("Месяц = "+Date1.getMonth()); System.out.println("День = "+Date1.getDate()); System.out.println("Деньнедели = " + Date1.getDay()); System.out.println("Час = " + Date1.getHours()); System.out.println("Минута = " + Date1.getMinutes()); System.out.println("Секунда = " + Date1.getSeconds()); System.out.println(); System.out.println("Нажмите Enter"); } } Результат прогона 3.3 Строковые и символьныетипы Создать программу взаимных преобразований строковых и символьных типов. Она должна отображать строку Фамилия студента и добавлять к строке символ восклицательного знака ( ! ). Пример. Создать программу для работы со строковыми типами. Она должна отображать слово World в виде строки и добавлять к строке символ восклица- тельного знака ( ! ). Используем ИСР NetBeans. Блок-схема алгоритма Листинг программы package symbols; public class Main { public static void main(String[] args) { String Str_1="World"; String Str_2; int Len_1,Len_2; String MyChar="!"; System.out.println("Работасострокам и"); Len_1=Str_1.length(); System.out.print("Str_1="+Str_1+" Длинастроки="+Len_1); System.out.println(); System.out.println("\nДобавимкстрокесимво л !"); Str_2=Str_1+MyChar; Len_2=Str_2.length(); System.out.print("Str_2="+Str_2+" Длинастроки="+Len_2); System.out.println(); } } Вывод в консоль. 4 Линейныеструктуры Предмет исследований Запись констант, переменных, стандартныхфункций. Правила записи арифметическихвыражений. Арифметические операторыприсваивания. Разработка алгоритма решения в соответствии сзаданием. Составление программы решения задачи в виде консольногоприложения. Контрольные вопросы 1. Алфавит языкаJava 2. Операции. 3. Идентификаторы. 4. Литералы. 5. Описание констант ипеременных. 6. Стандартныефункции. 7. Процедурыввода. 8. Процедурывывода. 9. Последовательность действий при выполнении оператораприсваивания. 10. Приоритетность выполнения операций ввыражениях. 4.1 Использование базовыхфункций Задание. Вычислить значения переменных в соответствии с вариантами зада- ния. Вывести значения вводимых исходных данных и результаты, сопровож- дая их вывод именами выводимых переменных. Задание выполнить в виде консольного приложения. 46 Пример. Используем ИСР NetBeans. Вычислить при x = 2.1, y = 0.59, z = 4.8 значения a и b, используя формулы Блок-схема алгоритма Листингпрограммы packagelin_basi c; public class main{ public static void main(String[] args) { double x=2.1, y=0.59, z=-4.8; double a,b; a=y*Math.tan(x*x)*Math.tan(x*x)*Math.tan(x*x)+Math.sqrt(z*z/ (y*y+x*x)); b=Math.log(y+x*x)+Math.sin(z/y)*Math.sin(z/y); System.out.println("double a = "+ a ) ; System.out.println("double b = " + b); } } Вывод в консоль. 4.2 Использование функцийMath Повторить задание 1, используя функцию pow(x,y) , класс Math. Используем ИСР NetBeans. Листинг программы package lin_math; public class Main { public static void main(String[] args) { double x=2.1,y=0.59,z=-4.8; double a, b; a=y*Math.pow(Math.tan(Math.pow(x,2)),3) + Math.sqrt((Math.pow(z,2))/(Math.pow(y,2) + Math.pow(x,2))); b=Math.log(y+Math.pow(x,2)) + Math.pow((Math.sin(z/y)),2); System.out.println("a = " + a); System.out.println("b = "+ b ) ; } } Вывод в консоль. 5 Структуры светвлениями Предмет исследований: Полная и сокращенная формы условного оператора if. Вычислительныепроцессысразветвляющейсяструктурой.Использ ова- ние оператора выбора switch…case. Разработать алгоритмы решения в соответствии сзаданием. Составить программы решениязадач. Контрольныевопросы 1. Какие структуры вычислительных процессов Вызнаете? 2. Как организовать разветвлениевычислений? 3. Условная инструкция If (<условие>) <инструкция 1>; else <инструкция2>. 4. Условная инструкция If (<условие>) <инструкция1>. 5. Вложенные условныеинструкции. 6. Инструкция выбора switch…case. 5.1 Ветвления с инструкциейif Вычислить значения функции по варианту задания из 3.1Ошибка! Источник ссылки не найден.. Вывести значения исходных данных и полученные ре- зультаты, сопровождая их именами переменных. Значения аргумента взять из указанного диапазона так, чтобы протестировать все ветви программы. Проект – консольное приложение. Пример Вычислить при y=1.3, x=[0.. 2.1] с шагом 0.3 значения функции a. Результат вывести в виде таблицы. Проект – консольное приложение. Используем ИСР NetBeans. при yx a cos( yx e yx cos(yx yx при при yx yx Блок-схема алгоритма представлена на рисунке. Для организации цикла вве- дены следующие переменные: xs - начальное значение, xk конечное значе- ние, dx - шаг изменения аргумента x. Листингпрограммы package if_else; public class Main { public static void main(String[] args) { double a=0, x=0, xs=0, xk=2.1, dx=0.3, y=1.3; // Переменныетипа double System.out.println("Таблицаa(x)"); //Заголовок for (x=xs; (x<=xk);x=x+dx){ // Началоцикла if (y*x<1) // Первоеветвление a = Math.exp(-y*x)*Math.cos(y*x); else if (y*x==1) // Вложенноеветвление a=Math.cos(y*x+1); else if (y*x>1) // Вложенноеветвление a = y*x +1; System.out.print("x = " + x); System.out.println(" a = " + a); } // конеццикла } } Вывод в консоль. 5.2 Выбор switch;case Вывести сообщения для дней недели с использованием оператора множе- ственного ветвления. Проект – консольное приложение. Используем ИСР NetBeans. В листинге программы объявлена переменная MyWeek типа «массив строк», значениям которой в исполняемой части программы присвоены русскоязычные имена дней недели. Программа содержит цикл запроса у пользователя номера дня недели в пределах 1..7. После ввода номера в этом интервале с помощью оператора выбора switch…case формируется текстовое сообщение о дне не- дели. Если пользователь вводит номер 0, работа приложения завершается. Ввод чисел, отличных от 0..7, программа рассматривает как ошибку и просит повторить ввод числа. Листингпрограммы package switch_case; import java.io.*; public class main { public static void main(String[] args) throws IOException { String[] MyWeek; MyWeek=new String[7]; String s=null, str_x; int x; MyWeek[0]="Понедельн ик"; MyWeek[1]="Вторник"; MyWeek[2]="Среда"; MyWeek[3]="Четверг"; MyWeek[4]="Пятница"; MyWeek[5]="Суббота"; MyWeek[6]="Воскресенье"; // ввод числа в виде строки с клавиатуры BufferedReader bReader = new BufferedReader (new InputStreamReader(System.in)); while (true) { System.out.println("Введитеномерднянедели 1..7, длявыхода 0"); str_x=bReader.readLine(); // вводстроки x=Integer.parseInt(str_x); // переводстрокивцелоечисло switch(x){ case 0: s="Спасибо, досвидания"; System.out.println(s); System.exit(0); break; case 1: s=MyWeek[x-1] + " - деньбездельник"; break; case 2: case 3: case 4: s=MyWeek[x-1]+" - рабочийдень"; break; case 5: s=MyWeek[x-1]+". Уф, завтра отдыхаем!"; break; case 6: s=MyWeek[x-1]+" - выходной день"; break; case 7: s=MyWeek[x-1]+" - выходной день, а завтра..."; break; default: System.out.println("Вы ошиблись, повторите ввод"); continue; } // конец switch System.out.println(s); } // конеццикла } } Вывод в консоль. 6 Циклы с неизвестным числомповторений Предмет исследований Организация циклов с неизвестным числомповторений. Инструкции циклов while иdo-while. Вычисление суммы членов бесконечногоряда. Разработать алгоритмы решениязадачи. Составить программы решениязадачи. Контрольные вопросы 1. Циклический процесс с неизвестным числомповторений. 2. Его отличия от цикла с заданным числомповторений. 3. Инструкции языка Java для организации таких циклов. Ихсравнение. 4. Синтаксис инструкцииwhile. 5. Как выполнить группу операторов в циклеwhile? 6. Синтаксис инструкцииdo-while. 7. Как выполнить группу операторов в циклеdo-while? 8. Прямое вычисление суммы членов бесконечногоряда. 9. Вычисление суммы членов бесконечного ряда по рекуррентнойформуле. 10. Условие выхода из цикла при вычислении суммы членов бесконечного ряда. 6.1 Циклwhile Вычислить значение суммы членов бесконечного ряда с заданной точностью Е, используя инструкции цикла while. На печать вывести значение суммы и число членов ряда, вошедших в сумму. Проект – консольное приложение. Ис- пользуем ИСРNetBeans. Пример. Вычислить значение суммы членов бесконечного ряда при x = 0.1 с точностью до члена ряда с модулем, меньшим E=0.00001. Для вычисления очередного члена ряда будем использовать рекуррентное соотношение, связывающее его с предыдущим членом a(n+1) = q*a(n). Приме- нение рекуррентных формул позволяет избежать вычисления факториала и возведения в произвольную степень. Рекуррентный коэффициент q найдем из выражений для текущего и следующего членов ряда Деля второе выражение на первое, получим Значение начального члена ряда задаем до цикла путем прямого присваива- ния (номер начального члена n в разных вариантах равен 0 или 1, правильное значение определяется по формуле текущего члена). В нашем задании n=0, a=x. Листинг программы package whilepkg; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class main { static double a, e, q, s, x; static int n=0; static String se, sx; public static void main(String[] args) throws IOException { // вводвещ. переменных c клавиатуры BufferedReader bReader = new BufferedReader (new InputStreamReader(System.in)); System.out.println("Введитеточность"); se = bReader.readLine(); e = Double.parseDouble(se); System.out.println("Введитеаргуме нт"); sx = bReader.readLine(); x=Double.parseDouble(sx); a=x ; s=a; while(Math.abs(a)>e) { q=x*x/(2*n+2)/(2*n+3); a=a*q; s=s+a; n=n+ 1; } System.out.println("результат \n Сумма s= "+s); System.out.println(" Числочленовряда n= "+n); } } Вывод в консоль. 6.2 Циклdo-while Выполнить ту же задачу с применением инструкции цикла do-while. Проект – консольное приложение. Пример. Используем ИСР NetBeans. Листингпрограм мы package do_while; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Main { static double a, e, q, s, x; static int n=0; static String se, sx; public static void main(String[] args) throws IOException { // вводвещ. переменных c клавиатуры BufferedReader bReader = new BufferedReader (new InputStreamReader(System.in)); System.out.println("Введитеточнос ть"); se = bReader.readLine(); e = Double.parseDouble(se); System.out.println("Введитеаргуме нт"); sx = bReader.readLine(); x=Double.parseDouble(sx); a=x ; s=a ; do { q=x*x/(2*n+2)/(2*n+3); a=a*q; s=s+a; n=n+1 ; } while (Math.abs(a)>e); System.out.println("результат \n Сумма s= "+s); System.out.println(" Числочленовряда n= "+n); } } Вывод в консоль. Результат работы программы такой же, как для задания 1. 7 Циклы с заданным числомповторений Подготовка к работе Организация циклов с известным числомповторений. Инкрементная и декрементная инструкции циклаfor. Разработать алгоритмы решениязадач. Составить программы решениязадач. Контрольные вопросы 1. Преимущества использования инструкций циклов впрограмме. 2. Инкрементная инструкция циклаfor. 3. Декрементная инструкция циклаfor. 4. Разница между инкрементной и декрементной инструкциями циклаfor. 5. Требования к переменной цикла в инструкцияхfor. 6. Организация вычислениясуммы. 7. Организация вычисленияпроизведения. 7.1 Циклfor Вычислить значения функции Задача 1 с использованием инструкции цикла for. Проект – консольное приложение. Пример. Вычислить значения функции с использованием инструкции цикла for. Проект – консольное приложение. Используем ИСР NetBeans. 20 z x /i 2 i Блок-схема алгоритма Листинг программы Package forpkg; import java.io.*; import java.text.NumberFormat; public class main { public static void main(String[] args)throwsIOException { doublex,z; int i; String str_x; // установка связи с клавиатурой BufferedReader br=new BufferedReader (new InputStreamReader(System.in)); // ограничениедлявещественныхчисел // количествавыводимыхзнаковпослезапятой (5 цифр) NumberFormat nf = NumberFormat.getInstance(); nf.setMaximumFractionDigits(5); System.out.println("Введитех"); str_x = br.readLine(); x=Double.parseDouble(str_x); // обнулениесуммы z=0; // вычислениесуммы (z=z+sqr(x)/i) for (i=1;i<=20;i++) z+=Math.pow(x,2)/i; System.out.println("Результатх = "+nf.format(x)+", z = "+nf.format(z)); // вывод результата System.exit(0); } } Вывод в консоль. 7.2 Вложенные циклыfor Вычислить значения функции Задача 2 с использованием вложенных инструк- ций цикла for. Проект – консольноеприложение. Пример. Используем ИСР NetBeans.Вычислить В алгоритме для разнообразия один цикл реализован инструкцией for с нарас- танием индекса, а другой - инструкцией for с убыванием индекса. Блок-схема алгоритма Листинг программы package for_vlogh; import java.io.*; import java.text.NumberFormat; public class Main { public static void main(String[] args) throws IOException { double s,t,x; int i,j; String str_x; // установкасвязисклавиатурой BufferedReader br=new BufferedReader (new InputStreamReader(System.in)); // ограничениедлявещественныхчисел // количествавыводимыхзнаковпослезапятой (10 цифр) NumberFormat nf = NumberFormat.getInstance(); nf.setMaximumFractionDigits(10); System.out.println("Введитех"); str_x = br.readLine(); x=Double.parseDouble(str_x); // инициализация произведения t=1; // цикл произведения for (i=1;i<=10;i++) { s=0; // обнулениесуммы for(j=10;j>=1;j--)s+=Math.cos(i*j*x); // циклсуммы t*=s; //t=t*s } // конецfor(i) // выводрезультата System.out.println("Результат \n х = "+nf.format(x)+", t = "+nf.format(t)); // выход из программы System.exit(0); } } Вывод в консоль. 7.3 Командаbreak Создать программу с иcпользованием команды break. Проект – консольное приложение. В программе ищется первое не простое число из последователь- ности чисел от N до 1. Варианты заданий – N = две последние цифры номера зачетной книжки. Пример. Создать программу с иcпользованием команды break. Проект – кон- сольное приложение. В программе ищется первое не простое число из после- довательности чисел от i = 8 до 1. Число не простое, если при его делении на целые числа, меньшие его, получается нулевой остаток. Во внешнем цикле перебираются числа делимые от i = 8 до 1. Во внутреннем цикле перебирают- ся делители от j = i -1 до 1. При обнаружении нулевого остатка сбрасывается флаг простого числа, по которому команда break прекращает итерации, так как ответ уже найден. Листингпрограммы package breakpkg; public class Main { public static void main(String[] args) { for (int i = 10; i >1;i--) { Boolean IsPrimeNumber = true; // устанавливаемфлагпростогочисла for (int j = i - 1; j >1;j--) { //еслиестьделительснулевымостатком,сбрасываемфлаг if (i % j==0) { IsPrimeNumber = false; break; // дальнейшая проверка бессмысленна } } if (IsPrimeNumber == false) { System.out.println("Непростоечисло " + i); } else { System.out.println("Простоечисло " + i); } } } } Результат прогона в окне вывода: 7.4 Командаcontinue Создать программу с использованием команды continue. Проект – консольное приложение. В программе ищется первое нечетное число из последовательно- сти чисел от N до 1. Варианты заданий – N = две последние цифры номера зачетной книжки. Пример. В программе ищется первое нечетное число из последовательности чисел от N до 1. Признак нечетности – остаток от деления на 2 не равен нулю. Если он равен нулю, то команда continue прерывает текущую итерацию и пе- реходит к следующей. Листингпрограммы package continuepkg public class Main { public static void main(String[] args) { for ( int i = 10; i >0;i--) { if (i%2==0) { continue; } System.out.println("Нечетноечисло " + i); } } } Результат прогона в окне вывода: 8 Массивы Предмет исследований Способы описания размеровмассивов. Способы ввода и выводамассивов. Реализацияприемовнакоплениясуммыилипроизведенияэлемен тов массивов, запоминания результатов, нахождения наибольшего и наименьшего. Способы ввода и выводаматриц. Разработать алгоритмы решения в соответствии сзаданием. Составить программы решениязадач. Контрольные вопросы 1. Что такоемассив? 2. Описание типа -массив. 3. Какие операторы языка можно использовать для описаниямассивов? 4. Особенности организации цикла при обработкемассивов? 5. Особенности программирования при обработкемассивов? 6. Особенность ввода и выводамассивов? 7. Метод length. 8. Массивмассивов. 8.1 Одномерный массив Обработка одномерного массива. Проект – консольное приложение. Пример. Вычислить наибольший элемент Xmax массива Х и его порядковый номер Nmax. Размерность массива N . Результат консольное приложе- ние. Используем ИСР NetBeans. Блок-схема алгоритма Листингпрограммы package massiv; import java.io.*; public class massiv{ public static void main(String[] args) throws IOException { int NN=30; int i, xmax, imax, N; int[] x=new int[NN]; String strNN; // связьсклавиатурой BufferedReader bReader = new BufferedReader(new InputStreamReader(System.in)); System.out.println("Введитеразмермассива"); strNN = bReader.readLine(); N=Integer.parseInt(strNN);System.out.println("раз мермассива="+strNN); for (i=0;i<N;i++) { x[i]=(int)(Math.random()*100); } xmax=x[0]; imax=0; for (i=1;i<x.length;i++) { if (x[i] > xmax) { xmax=x[i]; imax=i; } } System.out.println("Результа т"); for (i=0;i<N;i++) { System.out.print("x["+(i+1)+"]= "+x[i]+"; "); } System.out.println("\nРезультат"); System.out.println("xmax= "+xmax+" imax= "+(imax+1)); } } Вывод в консоль. 8.2 Матрица Обработка матрицы. Проект – консольное приложение Пример. Вывести квадратную матрицу X размером 4x4 в виде таблицы. Найти максимальное значение элемента и его координаты: номер строки R и номер столбца C. Используем ИСР NetBeans. Для автоматизации инициализации матрицы применяем методы класса Random. Листинг программы package matrix; import java.util.Random; // Класс Random public class Main { public static void main(String[] args) { int r=0,Row=8,c=0,Col=8,Cmax=0,Rmax=0,Mmax=0; // Переменные типа int Row = 4; // Число строк матрицы, нумерация с0 Col = 4; // Число столбцов матрицы, нумерация с 0 int [][] M = newint[Row][Col]; // Матрица M[Row,Col] типаint for (r = 0; r < Row;r++) { // Созданиематрицы for (c = 0; c < Col; c++) { // Генерация случайного целого Random Rnd = new Random(); // Генератор случайных чисел M[r][c]=Rnd.nextInt(100); // Случайное целое 0...100 вматрицу if (M[r][c] >Mmax) { // Обнаружениемаксимума Mmax=M[r][c]; // Значениемаксимума Rmax=r; // Номерстроки Cmax=c; // Номерстолбца } } } // Выводим результаты System.out.println("Матрица M[Row,Col] случайных целых чисел"); for (r=0; r<Row; r++) { for (c=0; c<Col; c++) { System.out.printf("%d ",M[r][c]); // Строка с разделителями } System.out.println(); } System.out.println("Мmax= " + Mmax); // Вывод Mmax System.out.println("Rmax=" + Rmax); // Вывод Rmax System.out.println("Cmax= " + Cmax); // Вывод Cmax } } Результат прогона: Внимание. Нумерация с 0. 9 Файлы Предметисследований Типы файлов, определенные вJava. Операции сфайлами. Разработать алгоритмы решения в соответствии сзаданием. Контрольные вопросы 1. Типы файлов, определенные вJava. 2. Процедуры создания, открытия, закрытияфайлов. 3. Контроль ошибок работы сфайлами Внимание! При работе с файлами в консольном приложении нельзя применять в путях к файлам символов кириллицы. Рекомендуется вводить строки со смыслом, лучше всего числовые - 1, 2, 3...Imax. 9.1 Текстовыефайлы Создать программу создания и дополнения текстового файла. Сначала со- здать текстовый файл из 5 строк и посмотреть его содержимое. Затем доба- вить в этот файл произвольные строки и проверить содержимое итогового файла. Пример. Используем ИСР NetBeans. Листинг программы package file_text; import java.io.*; public class Main { public static void main(String[] args) throws IOException { String FileDir=" "e:\\Eddy\\java\\NetBeans\\File_text\\"; String FilePath,FileName,Temp; //переменныедлястрок int i,imax; longlength; //длина файла вбайтах // установка связи с клавиатурой BufferedReaderbr=new BufferedReader(new InputStreamReader(System.in)); System.out.println("Введите имя файла: <имя_файла.расширение>"); FileName=br.readLine(); FilePath=FileDir+FileName; //путькфайл у try{ // класс для потоковой (последовательной) записи данных // данных стандартных типов в файл DataOutputStream MyFile = new DataOutputStream( new FileOutputStream(FilePath)); //******************************************// // Запись в файл строк, вводимых с клавиатуры// //**************************** **************// imax=5; System.out.println("Введите "+imax+" строк"); for (i=1;i<=imax;i++) { System.out.print("Строка "+i+" = "); Temp=br.readLine(); //чтение строки с клавиатуры MyFile.writeChars(Temp+"\n"); //запись этой строки в файл } MyFile.close(); //закрытьфайл //**********************************// // Вывод на консоль содержимого файла// //******************************* ****// System.out.println("\nСодержимоефай ла"); RandomAccessFile fr; // открыть файл с возможностью только чтения fr=new RandomAccessFile(FilePath,"r"); fr.seek(0); //установка на запись с нулевойпозицией Temp=""; i=1; while (Temp != null) { // повторять до конца файла Temp=fr.readLine(); // чтение строки из файла System.out.println("Строка "+i+" = " +Temp); i+=1; } fr.close(); //закрытьфайл //************************// // Добавление строк в файл// //**************** ********// RandomAccessFile frw; //открыть файл с возможностью чтения и записи frw=new RandomAccessFile(FilePath,"rw"); length=frw.length(); //получение длины файла frw.seek(0); //перемещение курсора вначало // перемещение указателя файла в позицию, на n больше текущей frw.skipBytes((int)length); System.out.println("length= "+length); System.out.println("\nВведите "+imax+" строк"); for (i=imax+1;i<=imax*2;i++) { System.out.print("Строка "+i+" = "); Temp=br.readLine(); // чтениестрокисклавиатуры frw.writeChars(Temp+"\n"); // дозаписываемстрокувконецфайла } frw.close(); //закрытьфайл //************************************************// // Вывод на консоль содержимого дополненного файла // //****************************************** ******// System.out.println("\nСодержимое дополненного файла"); RandomAccessFile addfr; // открыть файл с возможностью только чтения addfr=new RandomAccessFile(FilePath,"r"); addfr.seek(0); // установка на запись с нулевойпозицией Temp=""; i=1; while (Temp != null) { //повторять до конца файла Temp=addfr.readLine(); // чтение строки изфайла System.out.println("Строка "+i+" = "+Temp); i+=1; } addfr.close(); // закрытьфайл } // конец try catch (FileNotFoundException e) { System.out.println("Файл "+FilePath+" ненайден"); } } } Вывод в консоль. 9.2 Файлы произвольногодоступа Создать программу демонстрации произвольного доступа к элементам файла. Она заносит в файл последовательно числа от N1 до N2. После записи из файла считываются на дисплей все компоненты. Пример. Работаем с файлом test.txt. Используем ИСР NetBeans. Листингпрограммы package file_pr_dostup; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.RandomAccessFile; public class Main { public static void main(String[] args) throws IOException { String FileDir="e:\\Eddy\\java\\NetBeans\\file_pr_dostup\\ "; String FilePath,FileName; //переменныедлястрок int N1,N2,i,imax,Temp; String sN1,sN2; // установкасвязисклавиатурой BufferedReaderbr=new BufferedReader(new InputStreamReader(System.in)); System.out.println("Введитеимяфайла: <имя_файла.расширение>"); FileName=br.readLine(); FilePath=FileDir+FileName; // путькфайлу try{ // класс для потоковой (последовательной) записи // данных стандартных типов в файл DataOutputStream MyFile = new DataOutputStream (new FileOutputStream(FilePath)); System.out.println("Спасибо"); //*******************************// // Запись в файл чисел от N1 до N2// //*********************** ********// System.out.println("Введите N1"); sN1 = br.readLine(); System.out.println("Введите N2"); sN2 = br.readLine(); // перевод введенной строки в целое число N1=Integer.parseInt(sN1); N2=Integer.parseInt(sN2); imax=N2-N1; for (i=0;i<=imax;i++) { Temp=N1+i; MyFile.write(Temp); // запись числа в файл } MyFile.close(); // закрытьфайл //**********************************// // Вывод на консоль содержимого файла// //******************************* ****// System.out.println("\nКомпонентыфай ла"); RandomAccessFile fr; // открыть файл с возможностью только чтения fr=new RandomAccessFile(FilePath,"r"); for (i=0;i<=imax;i++) { fr.seek(i); // установка позиции указателя вфайле Temp=fr.read(); System.out.println("Компонент "+i+" = " +Temp); } fr.close(); //закрытьфайл } // конецtry catch (FileNotFoundException e) { System.out.println("Файл "+FilePath+" ненайден"); } } } Вывод в консоль. 9.3 Копированиефайлов Создать программу для высокоскоростного копирования файлаисточника в файл-приемник. В качестве файла-источника использовать test,txt программы задания 1, созданный ранее. В качестве файлаприемника определить файл с именем test1,txt. После выполнения нужно проверить, что на диске имеется файл-приемник того же размера и содержания. Пример. Работаем с файлом test.txt. Используем ИСР NetBeans. Листингпрограммы package file_bystr_copy; import java.io.*; public class Main { public static void main(String[] args) throws IOException { String FileDir1="e:\\Eddy\\java\\NetBeans\\file_text\\"; String FileDir2="e:\\Eddy\\java\\NetBeans\\file_bystr_copy\\ "; byte[] Buf = new byte [512]; // буфер String FilePath1=null,FilePath2=null; // путикфайлам long lengthin,lengthout; // длиныфайловвбайтах intbuf_len; // установка связи с клавиатурой BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); try { FilePath1=FileDir1+"test.txt"; //файл-источник // класс для потокового (последовательного) чтения // данных стандартных типов из файла FilePath2=FileDir2+"test1.txt"; // файл-приемник // открыть файлисточник RandomAccessFile infile; // открыть файл с возможностью только чтения infile=new RandomAccessFile(FilePath1,"r"); infile.seek(0); // перемещение курсора вначало // открытьфайл-приемник RandomAccessFile outfile; // открытьфайлсвозможностьючтенияизаписи outfile=new RandomAccessFile(FilePath1,"rw"); outfile.seek(0); // перемещениекурсоравначало // создать класс для потоковой записи данных в файлприемник DataOutputStream OutFile = new DataOutputStream( new FileOutputStream(FilePath2)); System.out.println("Файл-источник "+FilePath1); System.out.println("Файлприемник "+FilePath2); System.out.println("\nКопировать?"); System.out.println("Нажмите любую клавишу"); br.readLine(); System.out.println("\nКопирование начато..."); lengthin=infile.length(); // копирование содержимого файла-источника в файлприемник while (true) { buf_len=infile.read(B uf); if (buf_len < 0)break; OutFile.write(Buf, 0, buf_len); } System.out.println("\nКопирование закончено."); lengthout=outfile.lengt h(); if(lengthin==lengthout ) System.out.println("\nРазмерыфайловодинаков ы."); infile.close(); outfile.close(); } //end try catch (FileNotFoundException e) { System.out.println("Файл "+FilePath1+" ненайден"); } } } Вывод в консоль. 9.4 Обмен данными междуфайлами Создать программу обмена данными с файлом, использующую прямое обра- щение к именам файлов. Она заносит в буфер N1 случайных чисел и перено- сит их в файл. Затем буфер обнуляется, и из файла возвращаются первые N1- 2 числа. Пример. Создать программу обмена данными с файлом, использующую связь с файлами без файловых переменных. Она заносит в буфер 6 случайных чи- сел и переносит их в файл test.txt (он создается в папке проекта). Затем буфер обнуляется, и из файла возвращаются первые 4 числа. Используем ИСР NetBeans. Листингпрограммы package file_obmen; import java.io.*; public class Main { public static void main(String[] args) throws IOException { final byte Count=6; byte[] Buffer=newbyte[Count]; // буфер inti,Fact; String FileDir="e:\\Eddy\\java\\NetBeans\\file_text\\" ; String FilePath=null; //путькфайлу // установка связи с клавиатурой BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); try { FilePath=FileDir+"MyFile"; // создать класс для потоковой записи // данных в файл (и создать файл) DataOutputStream OutFile = new DataOutputStream( newFileOutputStream(FilePath)); System.out.println("Вбуфереслучайныечисла" ); for (i=0;i<Count;i++){ Buffer[i]=(byte)(Math.random()*100); System.out.println(" "+Buffer[i]); OutFile.write(Buffer[i]); } Fact=OutFile.size(); System.out.println("Вфайлзаписаночисел "+Fact); System.out.println("Нажмитеклавишу Enter"); br.readLine(); System.out.println("Буферочищаетс я"); for (i=0;i<Count;i++) { Buffer[i]=0; System.out.println(" "+Buffer[i]); } System.out.println("Нажмитеклавишу Enter"); br.readLine(); RandomAccessFile outfile; // создатьфайлсвозможностьючтенияизаписи outfile=new RandomAccessFile(FilePath,"rw"); outfile.seek(0); // перемещениекурсоравначалофайла outfile.read(Buffer, 0,Count-2); System.out.println("Изфайлавбуферпрочитаны "); for (i=0;i<Count;i++) { System.out.println(" "+Buffer[i]); } System.out.println("Вбуферененулевыхчисел "+(Fact-2)); outfile.close(); OutFile.close(); } // конецtry catch (FileNotFoundException e) { System.out.println("Файл "+FilePath+" ненайден"); } } } Окно приложения задания 4 показано далее на рисунке. 10 Исключения Предмет исследований Класс исключений и ихобработка. Инструкции try, catch,finally. Разработать алгоритмы решениязадач. Составить программы решениязадач. Контрольные вопросы 1. Что такоеисключение? 2. Классы исключений и ихсвойства. 3. Инструкция try,catch. Назначение, структура иприменение. 4. Инструкция try, catch, finally. Назначение, структура иприменение. 5. ИсключениеEZeroDivide. 6. ИсключениеERangeError. 7. Как включить отработку исключенияERangeError. 8. Как отключить перехват исключениясистемой. 10.1 Работа с вещественнымичислами Задание. Создать программу, обрабатывающую исключения с использованием инструкции try… catch…finally. Проект – консольное приложение. В задании надо рассчитывать массив f [ x ] = 1 / (x – N) при x =0…k. Варианты заданий N – последняя цифра номера зачетной книжки плюс 5. Необходимо отслеживать два исключения: Деление на0. Выход за пределыдиапазона. При работе с программой менять k, чтобы получать разные условия возможно- го возникновения исключений. Пример. Вариант задания: f[x] = 1 / (x-5). Листингпрограммы package trycatch; public class Main { public static void main(String[] args) { int k=10; double[] f =newdouble[10]; // Массив размером 10 (09) try{ // Инициализацияисключения for (int x = 0; x < k + 1; x++) { f[x] = (double) x/(x-5); // Вычисление элемента массива System.out.println("x="+x+", f[x]=" + f[x]); } } // Перехватить попытку деления на 0 catch (ArithmeticException ae) { System.out.println(“x=”+x+”, Попытка деления на 0"); } // Перехватить выход из диапазона catch (ArrayIndexOutOfBoundsException ai) { System.out.println("x=”+x+”, Выход из диапазона"); } } } Вывод в консоль Результаты: Деление на 0 – не ошибка. Ответбесконечность. Выход за пределы массива приx=10 10.2 Работа с целыми числами Задание. Повторить задание 1 для целыхчисел. Пример. Вариант задания: f[x] = 1 /(x-5). Листинг программы package trycatchint; public class Main { public static void main(String[] args) { int x=0; int k=10; int[] f =newint[10]; // Определен массив размером 10 try{ // Инициализацияисключения for (x = 0; x < k + 1; x++) { f[x] = (int) x/(x-5); // Вычисление элемента массива System.out.println("x="+x+", f[x]=" + f[x]); } } // Перехватить попытку деления на0 catch (ArithmeticException ae) { System.out.println("x="+x+", Попытка деления на 0"); } // Перехватить выход из диапазона catch (ArrayIndexOutOfBoundsException ai) { System.out.println("x="+x+", Выход из диапазона"); } } } Результаты: Деление на 0 при x = 5 –ошибка. Выход за пределы массива ожидался при x=10, но этого события не произошло. 11 Списки Предмет исследований ОпределенныевJavaтипысписковиосновныекоманды,используем ые для работы сними. КнопкаButtjjn. НадписьLabel. СписокListBox. Участок текстаTextArea. КомбинированныйсписокGomboBox.Этокомбинацияпростогосп искас однострочным редакторомTextField. Контрольные вопросы 1. Проект Java – Настольноеприложение. 2. Средства графического интерфейса пользователя вNetBeans. 3. ПлатформаSwing. 4. Типы списков, используемых в языке Java, ихназначение. 5. Компоненты списков List (список) и GomboBox (комбинированный список) в ИСР NetBeans. Их назначение исравнение. 6. Создание в форме компонентовсписков. 7. Добавление элемента в конец комбинированногосписка. 8. Вставка элемента в любую другую позицию (кроме позиции последнего элемента) комбинированногосписка. 9. Добавление строки в участок текстаTextArea. 10. Нумерация элементовсписков. 11. Создание обработчика события длякомпонента. 12. ДействиеActionPerformed. Задание Создать проект работы со списками. Пример. Создать проект работы со списками. В проекте предусмотреть: Ввести заголовок программы: NetBeans –Списки. Инициализацию поля вводатекста. Добавление строки из поля ввода текста в конец комбинированного спис- ка. Вставку строки из поля ввода текста в комбинированный список в выде- ленноеместо. Копированиестрокиизкомбинированногоспискаввыделенноммес тев участок текста TextArea с вставкой команды перехода к новойстроке. Рекомендуемая форма программы: Форма содержит следующие компоненты (во всех именах первый символ – j, так принято в NetBeans): Меню формы с полями File, Help. Поле Help удаляем, полю File меняем содержимое на NetBeans –Списки. jTextArea1 – участок текста. jLabel1 – надпись для заголовка (Участок текста) компонентаjTextArea1. jCcomboBox1 - комбинированныйсписок. jLabel2 – метка для заголовка (Поле со списком) компонентаJComboBox1. jLlabel3 – метка для приглашения (Введите текст =>). jNextField1 – текстовое поле (однострочный редактор для ввода текста). В него вводится строка текста (по умолчанию – Место длятекста). jLlabel4 – метка для заголовка (Текстовое поле) компонентаjTextField1. jButton1– кнопка"Инициализация".ПозволяетвjTextField1очиститьполе ввода и установить тамкурсор. jButton2– кнопка"ДобавитьвcomboBox"длязаполнениякомпонента jComboBox1. jButton3 – кнопка "Вставить в comboBox". Вставляет строку текста в выде- ленное место всписке. jButton4 – кнопка "Копировать в TextArea". Копирует в jTextArea1 строку, выделяемую в jComboBox1построчно. Для определения функциональности программы программист создает обра- ботчики событий. Остальной код система делает сама, его не надо редактиро- вать. Фрагментлистингапрограммы private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { jTextField1.setText(""); } private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) { jComboBox1.addItem(jTextField1.getText()); jTextField1.setText(""); } privatevoidjButton3ActionPerformed(java.awt.event.ActionEven tevt){ int pos = jComboBox1.getSelectedIndex(); jComboBox1.insertItemAt(jTextField1.getText(),pos); jTextField1.setText(""); } private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) { int pos = jComboBox1.getSelectedIndex(); String str = (String)jComboBox1.getItemAt(pos); str+="\n"; // Добавитьпереводстроки int pos1 = 0; jTextArea1.insert(str, pos1); pos1 += 1; } При прогоне программы отображается форма. Действия пользователя видны в форме и комментируются в окне консольного вывода. 12 Таблицы Предмет исследований Назначение компонентов Label, Button, TextField. Построение таблицы с помощьюDefaultTableColumnModel. Назначениеслушателя. Как создать код обработчикасобытия. Контрольные вопросы 1. Код созданияслушателя. 2. Назначение компонентакнопка. 3. Назначение компонентметка. 4. Назначение компонента однострочныйредактор. 5. Порядок действий для создания слушателя (обработчикасобытия). Задание. Создать проект “Таблица конвертации” для конвертации рублей Рос- сии в разные валюты с учетом комиссии. В таблице предусмотреть возмож- ность редактирования содержимого ячеек, добавления и удаления строк и столбцов. Пример. Создать таблицу для расчета суммы конвертации рублей России в доллары СА, евро и фунты стерлингов Великобритании. ЗапуститьИСР. Создать в ней новый проект икласс. Добавить текстовое поле textField1 для ввода суммы рублей для конвер- тации. Добавить метки Label1 – Label4 для поясняющихнадписей. Добавить кнопку Button1 для старта обработчикасобытия. Добавить комбинированный список jComboBox1 для выбора валюты из списка., Добавить счетчик jSpinner1 для выбора процентакомиссии. Добавить счетчик jSpinner2 для выбора курсарубля. Добавить таблицуjTable1. Задать следующие свойства компонент: Компонент Надпись Описание функций tехtField1 Текст = Ваши рубли Ввод суммы Label1 Сумма для конвертации, руб Поясняющая надпись => Label2 Валюта => Поясняющая надпись Label3 Комиссия % => Поясняющая надпись Label4 Курс рубля => Поясняющая надпись jComboBox Старт Принятие суммы и расчет jSpinner1 Старт Принятие суммы и расчет jSpinner1 Старт Принятие суммы и расчет Button1 Старт Принятие суммы и расчет Для таблицы щелчком правой кнопки мыши вызвать локальное меню, в кото- ром выбрать команду Содержание. В нем задать заголовки столбцов, типы данных в столбцах и флаги редактирования. Для счетчиков командой model в свойствах вызвать редактор и задать свой- ства счетчиков. Послеустановокинтерфейспроектаприметвид,какпоказанониженарисунке. Теперь щелчком правой кнопки мыши вызывается локальное меню. В нем вы- бираем событие для кнопки: События => Action => ActionPerformed. Cоздается Слушательсобытий.Длякнопкипоумолчаниюэтооднократныйщелчокмы ши. Вы автоматически попадаете в редактор кода, где в шаблон обработчика зано- сим коды. Листингобработчика. private void button1ActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: int pos=jComboBox1.getSelectedIndex(); // Номервспискевалют String str1 =(String)jComboBox1.getItemAt(pos); // Валюта String str2=jSpinner1.getValue().toString(); // % комиссии String str3=jSpinner2.getValue().toString(); //Курс String str4=textField1.getText(); // Выборкасуммы // Строки => в числа и вычисления float Rub=Float.valueOf(str4); // Рубли float Kom=Float.valueOf(str2); // %комиссии float Kurs=Float.valueOf(str3); //Курс float KomRub=Rub*Kom/100; // Комиссия, рубли float Valuta=(Rub-KomRub)/Kurs; // Вашавалюта // ЗаполнениетаблицыjTable1.getModel().setValueAt(st r1, pos,0); jTable1.getModel().setValueAt(str3, pos,1); jTable1.getModel().setValueAt(str2, pos,2); jTable1.getModel().setValueAt(KomRub, pos, 3); jTable1.getModel().setValueAt(Valuta, pos, 4); } Внимание. Значение счетчика (целое числа) методом getValue() возвращается как Object. Поэтому приходится сначала преобразовать его в строку методом toString, а затем в число методом valueOf() класса Float. В окне TablitsaAboutBox.java задаем заголовок окна формы приложения => Конвертация валют. При запуске программы возникает окно, в котором нужно для каждой из вы- бранных валют задать данные и нажать кнопку Старт. А это результат. 13 Графика Предмет исследований Графические средства ИСРEclipse. Разработать алгоритмы решения и составить программы решениязадач. Контрольные вопросы 6. Что представляет из себя AWT (Abstract WindowToolkit)? 7. Что представляет из себя GUI (Graphics User Interface)? 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. БиблиотекаSwing. Отличие между AWT иSwing. Как задать цвет фона фигуры? Как задать цвет контурафигуры? Для чего используется классPolygon? Назовите несколько методов класса Graphics вычерчивающих примитив- ные фигуры, залитые текущимцветом? Процедура обработки событияActionEvent. Методы drawString() иsetPaint. Методы setLayout, setSize,setDefaultCloseOperation. Методы setVisible,setResizable. Методы gr.setColor иgr.drawLine. 13.1 Рисуем простейшие графические фигуры Задание. Нарисовать фигуру и покрасить ее в нужный цвет, используя свой вариант задания. № Фигура Цвет фона 1. 2. 3. Круг Прямоугольник Прямоугольник с закругленным углом Выступающий прямоугольник Западающий прямоугольник 6. 7. 8. 9. 4. 5. Цвет области красный Серый Розовый Цвет контура Желтый Серый Белый Пурпурный Оранжевый Белый Оранжевый Красный Желтый Овал Черный Голубой Красный Многоугольник Треугольник Квадрат Желтый Белый Голубой Зеленый Черный Розовый Серый Пурпурный Черный Зеленый Голубой Оранжевый 10. Сегмент Зеленый Пурпурный Розовый Пример. Рисование домика с использованием примитивных фигур. Создаем проект File=>New=>Java Project, показанный на рисунке 3.36. Затем создаем новый класс File=>New=>Class. Появляется окно с встроенным кодом программы, в которое записываем свой листингпрограммы Листингпрограммы import javax.swing.SwingUtilities; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Graphics; import javax.swing.JPanel; import javax.swing.Jframe; public class domik extends Jframe { private static final long serialVersionUID = 1L; private Jpanel jContentPane = null; public void Figures (String s) { setLayout(null); setSize(600,300); setVisible(true); this.setDefaultCloseOperation(DISPOSE_ON_CLOSE ); this.setResizable(false); } public void paint(Graphics gr){ // Рисуемизадаемцветлугаgr.se tColor(Color.GREEN); gr.fillRect(0, 150,600,300); // Рисуемизадаемцветнебаgr.set Color(Color.CYAN); gr.fillRect(0, 0,600,150 ); // Рисуемизадаемцветсолнцаgr.se tColor(Color.YELLOW); gr.fillOval(50, 50, 70, 70); // Рисование 5-угольника - домика. Задание координат его вершин int[] xpoints = {300, 400,500,500,300}; // new int[5]; int[] ypoints = {150, 100, 150,280,280}; //new int[5]; //Задание количества вершин домика int npoints = 5; // Задание цвета линий домика gr.setColor(Color.BLACK); gr.drawPolygon(xpoints, ypoints, npoints); // Задание цвета заполнения домика gr.setColor(Color.RED); gr.fillPolygon(xpoints, ypoints, npoints); // Рисование треугольника. Задание координат его вершин int[] x0points = {300, 400,500};//new int[3]; int[] y0points = {150, 100, 150};//new int[3]; // Задание числа вершин треугольника int n0points = 3; // Задание цвета линий треугольника gr.setColor(Color.BLACK); gr.drawPolygon(x0points, y0points, n0points); // Задание цвета заполнения треугольника gr.setColor(Color.GRAY); gr.fillPolygon(x0points, y0points, n0points); // Рисуем в домике окно gr.setColor(Color.MAGENTA); gr.fillRect(360,165,80,50); // Рисуем лучи солнца gr.setColor(Color.YELLOW); gr.drawLine(100,50,200,50); gr.drawLine(100,80,200,150); gr.drawLine(70,100,70,190); gr.drawLine(100,65,200,80); gr.drawLine(80,90,140,180); // Рисуем лепестки цветка gr.setColor(Color.WHITE); gr.fillOval(95,360,30,50); gr.setColor(Color.YELLO W); gr.fillOval(100,345,60,30); gr.setColor(Color.BLUE); gr.fillOval(95,300,30,50); gr.setColor(Color.RED); gr.fillOval(60,345,50,30); gr.setColor(Color.BLACK) ; gr.fillOval(94,345,30,30); // Рисуем стебель цветка gr.setColor(Color.BLACK); gr.drawLine(120,400,120,450); int[] x2points = {120,170,140};//new int[3]; int[] y2points = {430,400,450};//new int[3]; // Задание количества вершин листа 1 int n2points = 3; // Заданиецветалинийлиста 1 gr.setColor(Color.BLACK); gr.drawPolygon(x2points, y2points, n2points); int[] x3points = {120,100,90};//new int[3]; int[] y3points = {430,415,450};//new int[3]; // Заданиеколичествавершинлиста 2 int n3points = 3; // Заданиецветалинийлиста 2 gr.setColor(Color.BLACK); gr.drawPolygon(x3points, y3points, n3points); gr.dispose(); } public static void main(String[] args) { SwingUtilities.invokeLater( new Runnable() { public void run() { domik thisClass = new domik(); thisClass.setDefaultCloseOperation(Jframe.EXIT_ON_CLOSE); thisClass.setVisible(true); } } ); } public domik() { super(); initialize(); } private void initialize() { this.setSize(600, 458); this.setContentPane(getJContentPane()); this.setLocation(100, 100); this.setTitle(“domik”); } private Jpanel getJContentPane() { if (jContentPane == null) { jContentPane = new Jpanel(); jContentPane.setLayout(new BorderLayout()); } return jContentPane; } } Окно с готовым кодом программы Теперь запускаем программу и получаем окно запуска. Выбираем Java Application , нажимаем на Ok и получаем окно Save and Launch. При выборе нужного проекта получаем картинку domik. 13.2 Текст и график функции в форме Создать программу вывода текста и рисования в форме графиков функций. Проект – WindowsForm приложение. Пример. Используем ИСР Eclipse. В программе выполняется построение гра- фика функции y=tg(x). Создаем Java Visual Class, набираем File-New-Other-Java-AWT-JFrame Visual Class,получаем: ишем имя Visual Class, устанавливаем соответствующие флаги ,нажимаем на Finish,получаем: Листингпрограммы import javax.swing.SwingUtilities; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Graphics; import javax.swing.JPanel; import javax.swing.JFrame; public class Frame_Graphic extends JFrame { private static final long serialVersionUID = 1L; private JPanel jContentPane = null; public void Sinus(String s) { setLayout(null); setSize(600,300); setVisible(true); this.setDefaultCloseOperation(DISPOSE_ON_CLOSE); this.setResizable(false); this.setLocation(100, 100); } public void paint(Graphics gr) { int y; int j=0; int k=0; gr.setColor(Color.WHITE); gr.fillRect(0, 0, 600, 300); gr.setColor(Color.lightGray); while(j<600) { gr.drawLine(j, 0, j, 300); j+=30; } while(k<300) { gr.drawLine(0, k, 600, k); k+=30; } gr.setColor(Color.BLACK); gr.drawLine(300, 0, 300,300); gr.drawLine(0, 150, 600,150); gr.drawLine(120, 140, 120,160); gr.drawLine(480, 140, 480,160); gr.drawString("0", 305, 165); gr.drawString("-"+"\u03c0", 125, 140); gr.drawString("\u03c0", 485, 140); gr.setColor(Color.BLUE); for(double i=0;i<1000;i++){ y=(int)(-50*Math.tan(Math.PI*i/180)); gr.drawLine((int)i-240, y+150, (int)i-240, y+150); } gr.dispose(); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { Frame_Graphic thisClass = new Frame_Graphic(); thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); thisClass.setVisible(true); } }); } public Frame_Graphic() { super(); initialize (); } private void initialize() { this.setSize(600, 300); this.setContentPane(getJContentPane()); this.setTitle("Graphicy=tg(x)"); } private JPanelgetJContentPane() { if (jContentPane == null) { jContentPane = new JPanel(); jContentPane.setLayout(new BorderLayout()); } return jContentPane; } После запуска программы получаем: В классе, который производит построение графиков, с использованием двух циклов происходит построение координатной сетки светло-серым цветом, за- тем черным цветом строятся оси абсцисс и ординат. Синус и косинус рисуются по аналогии: вначале вычисляется значение y и методом drawString() рисуется линия длиной в один пиксель. Координата y вычисляется путем явного преоб- разования типа double в тип int, полученного в результате выполнения выра- жения 50*Math.tan(Math.PI*i/180). Списоклитературы 1. Иллюстрированный самоучитель по Java. Русский HELP.(http://ruhelp.org) 2. Эккель Б.. Философия Java. Библиотека программиста. 4-е изд. – СПб.: Питер, 2009. – 640с. 3. Щилдт Г. Холмс Д. Искусство программирования на Java. Пер. с англ. - М.: "Вильямс", 2005. - 335с. 4. Монахов В. Язык программирования Java и среда NetBeans, 3-е издание. БХВ=Петербург, 2011, 704с. 5. Казарин С., Клишин А. Среда разработки Java- приложений Eclipse - М., 2008. 77с. 6. Хемраджани А. Гибкая разработка приложений на Java с помощью Spring, Hubernate и Eclipse. :Пер. с англ. - М.: "Вильямс", 2008. 352с.