Главная Случайная страница


Категории:

ДомЗдоровьеЗоологияИнформатикаИскусствоИскусствоКомпьютерыКулинарияМаркетингМатематикаМедицинаМенеджментОбразованиеПедагогикаПитомцыПрограммированиеПроизводствоПромышленностьПсихологияРазноеРелигияСоциологияСпортСтатистикаТранспортФизикаФилософияФинансыХимияХоббиЭкологияЭкономикаЭлектроника






ЯЗЫКИ ПРОГРАММИРОВАНИЯ ДЛЯ РАЗРАБОТКИ СЕТЕВЫХ ПРИЛОЖЕНИЙ: ЯЗЫК ПРОГРАММИРОВАНИЯ JAVA

ЯЗЫКИ ПРОГРАММИРОВАНИЯ ДЛЯ РАЗРАБОТКИ СЕТЕВЫХ ПРИЛОЖЕНИЙ: ЯЗЫК ПРОГРАММИРОВАНИЯ JAVA

 

ЛАБОРАТОРНЫЙ ПРАКТИКУМ

для студентов специальностей

I-27 01 01 «Экономика и организация производства»,

I-26 02 03 «Маркетинг»

дневной формы обучения

 

 

В 2-х частях

 

Часть 1

 

Минск 2007


УДК 681.3.061(075.8)

ББК 32.973.26-018.1 я 73

Я 41

 

Р е ц е н з е н т:

Зав. кафедрой интеллектуальных информационных технологий

Белорусского государственного университета информатики и

радиоэлектроники, д-р техн. наук, проф. В. В. Голенков

 

А в т о р ы:

Т.М. Унучек, В.Н. Комличенко,

Д.С. Марудов, Д. А. Сторожев, Е.Н. Унучек

 

 

Языкипрограммирования для разработки сетевых приложний:

Я 41 Язык программирования JAVA: лаб. практикум для студ. спец. I - 27 01 01 «Экономика и организация производства», I - 26 02 03 «Маркетинг» в 2ч: ч.1 / Т. М. Унучек [и др.]. – Минск : БГУИР, 2007. – 62 с.

ISBN 978-985-488-079-2 (ч.1)

 

В лабораторном практикуме излагаются основы платформно-независимого объектно-ориентированного языка программирования Java 2, приведено описание основных его библиотек и классов.

Первая часть практикума состоит из четырех лабораторных работ, нацеленных на создание консольных приложений. Каждая лабораторная работа содержит основной теоретический материал по тематике работы, сопровождается большим числом примеров и законченных программ.

 

УДК 681.3.061(075.8)

ББК 32.973.26-018.1 я 73

ISBN978-985-488-079-2 (ч.1)© УО «Белорусский государственный университет ISBN978-985-488-081-5 информатики и радиоэлектроники», 2007


СОДЕРЖАНИЕ

Введение ……………………………………………………………………………...
Лабораторная работа № 1. Разработка консольных приложений……………
Понятие и определение класса……………………………………………….......
Модификаторы класса ……………………………………………………………
Объявление методов………………………………………………………………
Объявление объектов и операция new…………………………………………...
Метод main…………………………………………………………………………
Конструкторы ……………………………………………………………………..
Использование атрибутов доступа……………………………………………….
Статические переменные и методы………………………………………………
Потоки……………………………………………………………………………...
Байтовые и символьные потоки………………………………………………….
Классы байтовых потоков ……………………………………………………......
Классы символьных потоков…………………………………………………......
Задания для самостоятельного выполнения……………………………………..
Лабораторная работа №2. Работа с файлами….…………………..................
Классы FileInputStream и FileOutputStream……………………………………...
BufferedInputStream и BufferedOutputStream…………………………………….
DataInputStream и DataOutputStream………………………………………..........
Класс File…………………………………………………………………………..
Класс RandomAccessFile…………………………………………………………..
Задания для самостоятельного выполнения……………………………………..
Лаборатоная работа №3. Разработка клиент-серверных приложений с использованием TCP соединений…………….…………………………………
Сервера и клиенты ……………………………………………………………….
Сокеты………………………………………………………………………………
Сокеты TCP/IP серверов…………………………………………………………..
Сокеты TCP/IP клиентов………………………………………………………….
Задания для самостоятельного выполнения…………………………………......
Лабораторная работа №4. Разработка клиент-серверных приложений с использованием UDP соединений ………………………………………………
Протокол UDP………………………………………………………………….......
Характеристика сокетов UDP…………………………………………………….
Классы UDP………………………………………………………………………...
Задания для самостоятельного выполнения……………………………………..
Литература……………………………... …………………………..……………….
Приложения…………………………………………………………………………

ВВЕДЕНИЕ

 

Java – объектно-ориентированная платформно-независимая многопоточная среда программирования. Первая версия Java была задумана Дж. Гослингом, П. Ноутоном, К. Вартом, Э. Франком, М. Шериданом. Спецификация была разработана компанией Sun Microsystems и выпущена в 1991 г. Сначала язык назывался Oak («Дуб») и был задуман как независимый от платформы язык с целью внедрения в электронные устройства различных производителей. Позднее проявилась другая его особенность – пригодность для использования в WWW. Непосредственно Java его стали называть в 1995 г.

Клиент-серверные возможности языка Java. Язык Java разработан для распределенной среды, предоставляет специальные классы и широкие возможности организации работы в сети. Он поддерживает протоколы TCP/IP и фактически снижает сложность доступа к сетевому ресурсу до уровня сложности доступа к файлу, а также обеспечивает ряд технологий для разработки сетевых приложений. Кроме того, Java позволяет создавать интерактивные сетевые программы за счет поддержки многопоточного программирования и эффективных решений распараллеливания и синхронизации процессов.

Java ­­­− интерпретируемый язык. Сначала программист компилирует исходный текст утилитой javac из набора инструментов JDK в Java в байт-коды. Байт-коды являются двоичными и не зависят от архитектуры компьютера (или от платформы). Байт-коды – незаконченное приложение, они не выполняются в операционной среде выполнения программ (Java runtime environment). Обычно в роли среды выступает браузер или JVM (виртуальная машина Java). Поскольку каждая среда выполнения создается для конкретной платформы, законченный программный продукт будет работать на этой платформе.

Java - объектно-ориентированный язык. Язык Java является объектно-ориентированным и, следовательно, относится к группе языков, рассматривающих данные как объекты и методы, используемые для этих объектов. Java язык со строгой типизацией, что помогает выявлять возможные скрытые ошибки. В Java отсутствует множественное наследование и указатели, что с одной стороны, повышает читаемость, надежность программного кода, упрощает программирование и предохраняет от множества трудно диагностируемых ошибок, а с другой, несколько ограничивает в ряде ключевых возможностей. Java обеспечивает очень развитую объектно-ориентированную технологию поддержки обработки особых «исключительных» ситуаций. В Java можно создавать совершенно «абстрактные классы», называемые интерфейсами(interface). Интерфейсы позволяют описывать методы, разделяемые и реализуемые между несколькими классами, не учитывая при этом то, как другие классы используют данные методы.

Виртуальная Java-машина. Основой языка Java является виртуальная Java-машина(Java Virtual Machine, JVM). JVM это виртуальный компьютер (модель компьютера), располагающийся только в оперативной памяти. JVM позволяет выполнять Java-приложения на множестве платформ, а не только в той системе, для которой скомпилирован код. Возможность компиляции Java-программ для JVM обеспечивает уникальность языка. Но для того чтобы приложения Java выполнялись на конкретной платформе, необходимо реализовать JVM для данной платформы (для каждой платформы своя JVM, что и обеспечивает мобильность JAVA).

Установка и основные утилиты Java.Программа установки Java (пакет Java SDK, известный также под названием JDK) представляет собой самораспаковывающийся архив, при разархивировании которого выдаются инструкции по установке. Java SDK обычно включает шесть подкаталогов:

· bin – содержит выполняемые модули и утилиты JDK;

· demo – включает множество апплетов, а также примеры текстов программ на Java;

· docs – содержит документацию по java;

· include – включает заголовочные файлы С и С++, используемые для

построения среды Java;

· lib – библиотеки и архивы, используемые в Java;

· src – исходные коды библиотек, созданных компанией Sun.

Наиболее важными в Java являются следующие утилиты:

· javac – компилятор Java, компилирует разработанный файл исходного текста программы в файл (байт-код) с таким же именем и расширением .class;

· java – утилита-интерпретатор запуска приложений java;

· appletviewer – утилита просмотра апплетов;

· jdb – утилита тестирования приложений, написанных на java;

· javadoc – утилита для создания документации.

В данном издании представлены четыре лабораторные работы, нацеленные на создание консольных приложений. Каждая лабораторная работа включает основной теоретический материал, сопровождается большим числом примеров и законченных программ. В конце каждой лабораторной работы содержатся задания для самостоятельного выполнения студентами. В приложении размещены полезные классы и методы, часто применяемые для написания приложений.


ЛАБОРАТОРНАЯ РАБОТА №1

 

Понятие и определение класса

Класс – это шаблон для объекта. Объект – это экземпляр класса. Данные класса называются переменными экземпляра. Каждый объект содержит собственную копию этих переменных. Метод предназначен для обработки данных. Определение класса:

 

class classname {

type instance-variable1;

type instance-variable2;

// …

type instance-variableN;

type methodname1 (parameter-list) {

// тело метода

}

type methodname2 (parameter-list) {

// тело метода

}

//…

type methodnameN(parameter-list) {

// тело метода

}

}

 

Рассмотрим пример класса, с помощью которого определяется минимальное и максимальное число.

 

Пример 1.1

class MinMax {

int x;

int y;

public int max(){

if(x>y) return x;

else return y;}

public int min(){

if(x<y) return x;

else return y;}

}

 

Для определения экземпляра класса используется синтаксис:

 

ИмяКласса имяпеременной;

имяпеременной = new ИмяКласса (параметры инициализации);

или

ИмяКласса имяпеременной = new ИмяКласса (параметры инициализации);

Членами класса могут быть:

• поля;

• методы;

• внутренние типы (классов и интерфейсов;

• конструкторы;

• инициализаторы;

• статические инициализаторы.

 

Поля и методы могут иметь одинаковые имена.

Пример 1.2

class Point {

int x=3;

int x() {return x;}

int y=x();

public static void main (String s[]) {

Point p=new Point();

System.out.println(p.x+", "+p.y);

System.out.println(p.x());

 

}

}

Результат программы: 3, 3

 

 

Модификаторы класса

public – класс доступен для использования, наследования вне зависимости от пакета или от каталога; public-классы должны храниться в файлах с именем имя_класса.java.

friendly – модификатор класса по умолчанию, если модификатор не определен явно для класса. Такой класс доступен только для объектов, находящихся в том же пакете. Вне пакета он выступает как private.

final – класс не может быть наследован, т.е. иметь подклассов.

abstract – класс, в котором объявлен хотя бы один абстрактный метод. Для таких классов нельзя создавать объекты. Такие классы используются для производных классов, а также для организации стандартизированных интерфейсов.

 

Пример 1.3

abstract class Myclass {

abstract void actMet();

}

 

Объявление методов

Объявление метода состоит из заголовка и тела метода. Состав заголовка:

• модификаторы (доступа в том числе);

• тип возвращаемого значения или ключевого слова void;

• имя метода;

• список аргументов в круглых скобках (аргументов может не быть);

• специальное throws-выражение.

Заголовок начинается с перечисления модификаторов. Для методов доступен любой из трех возможных модификаторов доступа. Также допускается использование доступа по умолчанию. Кроме этого, существует модификатор final, который говорит о том, что такой метод нельзя переопределять в наследниках. Можно считать, что все методы final-класса, а также все private-методы любого класса являются final.

Затем поддерживается модификатор native. Метод, объявленный с таким модификатором, не имеет реализации на Java. Он должен быть написан на другом языке (C/C++, Fortran и т.д.) и добавлен в систему в виде загружаемой динамической библиотеки (например DLL для Windows). Наконец, существует еще один специальный модификатор synchronized, который будет рассмотрен в теме, описывающей потоки.

Метод main

Итак, виртуальная машина реализуется приложением операционной системы и запускается по обычным правилам. Программа, написанная на Java, является набором классов. Требуется некая входная точка, с которой должно начинаться выполнение приложения. Такой входной точкой, по аналогии с языками C/C++, является метод main(). Для объявления метода main() используется следующий синтаксис:

 

public static void main(String[] args) {}

Модификатор static позволяет вызвать метод main(), не создавая объектов. Метод не возвращает никакого значения, хотя в C есть возможность указать код возврата из программы. В Java для этой цели есть метод System.exit(), который закрывает виртуальную машину и имеет аргумент типа int.

Аргументом метода main() является массив строк. Он заполняется дополнительными параметрами, которые были указаны при вызове метода.

Пример 1.5

Пример демонстрирует вывод в консоль параметров, переданных в метод main. Для запуска примера необходимо передать сами параметры, например

java test.first.Test HelloWorld

package test.first;

public class Test {

public static void main(String[] args) {

for (int i=0; i<args.length; i++) {

System.out.print(args[i]+" ");

}

System.out.println();

}

}

 

Результат работы программы: HelloWorld

 

Если вышеприведенный модуль компиляции сохранен в файле Test.java, который лежит в директории test\first, то вызов компилятора записывается следующим образом:

javac test\first\Test.java

А вызов виртуальной машины:

java test.first.Test

 

Конструкторы

Конструктор – это тот же метод класса, обладающий некоторыми особенностями:

· имеет такое же название, как и класс;

· вызывается сам;

· не возвращает никакого значения.

Ниже продемонстрирован пример перегрузки конструктора.

 

Пример 1.6

// перегрузка конструктора

class worker

{ private int Age;

public String Name;

public worker() // конструктор без параметров

{ Age = 20;}

public worker(int newAge, String newName)

{ Age = newAge;

Name = newName; }

public int getAge()

{return Age;}

};

class worker_pub

{ public static void main(String args[])

{ worker wrk1 = new worker( );

worker wrk2 = new worker(40, "Petrov");

System.out.println(wrk1. getAge()+wrk1.Name);

System.out.println(wrk2. getAge()+wrk2.Name); } }

 

Результат выполнения программы:

20null

40Petrov

 

Если конструктор не определяется явно, то Java создает его сам, без параметров.

 

Потоки

Java-программы выполняют ввод/вывод через потоки. Поток является абстракцией, которая или производит, или потребляет информацию. Поток связывается с физическим устройством с помощью системы ввода/вывода Java (Java I/O system). Все потоки ведут себя одинаковым образом, хотя фактические физические устройства, с которыми они связаны, могут сильно различаться. Таким образом, одни и те же классы и методы ввода/вывода можно применять к устройствам любого типа. Это означает, что поток ввода может извлекать много различных видов входных данных: из дискового файла, с клавиатуры или сетевого разъема. Аналогично, поток вывода может обратиться к консоли, дисковому файлу или сетевому соединению (сокету).

Благодаря потокам, ваша программа выполняет ввод/вывод, не понимая различий между клавиатурой и сетью. Java реализует потоки с помощью иерархии классов, определенных в пакете java.io.

Байтовые и символьные потоки

Java 2 определяет два типа потоков: байтовый и символьный. Байтовые потоки предоставляют удобные средства для обработки ввода и вывода байт. Байтовые потоки используются, например, при чтении или записи данных в двоичном коде. Символьные потоки предоставляют удобные средства для обработки ввода и вывода символов. Они используют Unicode и поэтому могут быть интернационализированы. Кроме того, в некоторых случаях символьные потоки более эффективны, чем байтовые. Первоначальная версия Java (Java 1.0) не включала символьные потоки, и таким образом, весь ввод/вывод был байтовым. Символьные потоки были добавлены в Java 1.1, а некоторые байтовые классы и методы были исключены.

 

Классы байтовых потоков

Байтовые потоки определяются в двух иерархиях классов. Наверху этой иерархии — два абстрактных класса: InputStream и OutputStream. Каждый из этих абстрактных классов имеет несколько конкретных подклассов (табл. 1.2), которые обрабатывают различия между разными устройствами, такими, как дисковые файлы, сетевые соединения и даже буферы памяти.

Абстрактные классы InputStream и OutputStream определяют несколько ключевых методов, которые реализуются другими поточными классами. Два наиболее важных— read() и write(), которые соответственно читают и записывают байты данных. Оба метода объявлены как абстрактные внутри
классов InputStream и OutputStream и переопределяются производными поточными классами.

Таблица 1.2

Классы байтовых потоков

 

Поточный класс Назначение
InputStream OutputStream Абстрактные классы, которые описывают поточный ввод и вывод
BufferedInputStream BufferedOutputStream Буферизированный поток ввода и вывода
ByteArrayInputStream ByteArrayOutputStream Поток ввода, который читает из байт-массива Поток вывода, который записывает в байт-массив
FileInputStream FileOutputStream Поток ввода, который читает из файла Поток вывода, который записывает в файл
RandomAccessFile Поддерживает ввод/вывод файла произвольного доступа

 

Классы символьных потоков

Символьные потоки определены в двух иерархиях классов. Наверху этой иерархии два абстрактных класса: Reader и Writer. Они обрабатывают потоки символов Unicode. В Java существуют несколько конкретных подклассов каждого из них. Классы Reader и Writer – наследники InputStream и OutputStream. Если с их помощью записывать или считывать текст, то сначала необходимо сопоставить каждому символу его числовой код. Такое соответствие называется кодировкой. Классы символьных потоков показаны в таблице 1.3.

Абстрактные классы Reader и Writer определяют несколько ключевых методов, которые реализуются другими поточными классами. Два самых важных метода — read() и write(), которые читают и записывают символы данных, соответственно. Они переопределяются производными поточными классами.

 

Таблица 1.3

Классы символьных потоков

 

Символьный класс Назначение
Reader Writer Абстрактные классы символьного потока ввода и вывода
BufferedReader BufferedWriter Буферизированные символьные потоки ввода и вывода
FileReader FileWriter Поток ввода, который читает поток символов из файла; Выходной поток, который записывает символы в файл
StringReader StringWriter Поток ввода, который читает из строки; Поток вывода, который записывает в строку
PrintWriter Поток вывода, который поддерживает методы print() и println()

 

Известно, что Java использует кодировку Unicode, в которой символы представляются двухбайтным кодом. Байтовые потоки зачастую работают с текстом упрощенно – они просто отбрасывают старший байт каждого символа. В реальных же приложениях они могут использовать различные кодировки (даже для русского языка их существует несколько). Поэтому в версии Java 1.1 появился дополнительный набор классов, основывающийся на типах Reader и Writer.

Эта иерархия очень схожа с аналогичной для байтовых потоков InputStream и OutputStream. Главное отличие между ними – Reader и Writer работают с потоком символов (char). Только чтение массива символов в Reader описывается методом read(char[]), а запись в Writer – write(char[]).

В табл. 1.4 приведены соответствия классов для байтовых и символьных потоков.

Таблица 1.4

Соответствие классов для байтовых и символьных потоков

 

Байтовый поток Символьный поток
InputStream Reader
OutputStream Writer
ByteArrayInputStream CharArrayReader
ByteArrayOutputStream CharArrayWriter
Нет аналога InputStreamReader
Нет аналога OutputStreamWriter
FileInputStream FileReader
FileOutputStream FileWriter
FilterInputStream FilterReader
FilterOutputStream FilterWriter
BufferedInputStream BufferedReader
BufferedOutputStream BufferedWriter
PrintStream PrintWriter
DataInputStream Нет аналога
DataOutputStream Нет аналога
ObjectInputStream Нет аналога
ObjectOutputStream Нет аналога
PipedInputStream PipedReader
PipedOutputStream PipedWriter
StringBufferInputStream StringReader
Нет аналога StringWriter
LineNumberInputStream LineNumberReader
PushBackInputStream PushBackReader
SequenceInputStream Нет аналога

 

Как видно из табл. 1.4, различия крайне незначительны и предсказуемы.

Например, конечно же, отсутствует преобразование в символьное представление примитивных типов Java и объектов (DataInput/Output, ObjectInput/Output). Добавлены классы-мосты, преобразующие символьные потоки в байтовые: InputStreamReader и OutputStreamWriter. Именно на их основе реализованы FileReader и FileWriter. Метод available() класса InputStream в классе Reader отсутствует, он заменен методом ready(), возвращающим булевое значение, – готов ли поток к считыванию (то есть будет ли считывание произведено без блокирования).

В остальном же использование символьных потоков идентично работе с байтовыми потоками.

Классы-мосты InputStreamReader и OutputStreamWriter при преобразовании символов также используют некоторую кодировку. Ее можно задать, передав в конструктор в качестве аргумента ее название. Если оно не будет соответствовать никакой из известных кодировок, будет брошено исключение UnsupportedEncodingException. Вот некоторые из корректных значений этого аргумента (чувствительного к регистру!) для распространенных кодировок: "Cp1251", "UTF-8", "8859_1" и т.д.

В следуюшем примере приведена программа, которая демонстрирует read(), читая символы с консоли, пока пользователь не напечатает «q»:

 

Пример 1.9

import java.io.*;

class BRRead {

public static void main(String args [ ]) throws IOException

{

char c;

BufferedReader br = new

BufferedReader(new InputStreamReader(System.in));

System.out.println("Enter symbols or 'q' to exit");

// чтение символов

do {

c= (char)br.read();

System.out.println(c);

}

while(c != 'q');

}

}

 

Результат выполнения программы:

Enter symbols or 'q' to exit

123abcq

а

b

с

q

 

Следующая программа демонстрирует BufferedReader и метод readLine(). Она читает и отображает строки текста, пока не будет введено слово «stop».

 

Пример 1.10

import java.io.*;

class BRReadLines {

public static void main(String args[])throws IOException

{

// создать BufferedReader, используя System.in

BufferedReader br = new BufferedReader(new

InputStreamReader(System.in));

String str;

System.out.println("Enter text");

System.out.println("Enter 'stop' to exit");

do {

str = br.readLine();

System.out.println(str);

} while(!str.equals("stop"));

}

}

 

Программный код для записи символьных данных в файл приведен в следующем примере.

 

Пример 1.11

String fileName = "d:\\file.txt";

//строка, которая будет записана в файл

String data = "Some data to be written and read.\n";

try{

FileWriter fw = new FileWriter(fileName);

BufferedWriter bw = new BufferedWriter(fw);

System.out.println("Write some data to file: " + fileName);

// несколько раз записать строку

for(int i=(int)(Math.random()*10);--i>=0;)

bw.write(data);

bw.close();

// cчитываем результат

FileReader fr = new FileReader(fileName);

BufferedReader br = new BufferedReader(fr);

String s = null;

int count = 0;

System.out.println("Read data from file: " + fileName);

// cчитывать данные, отображая на экран

while((s=br.readLine())!=null)

System.out.println("row " + ++count + " read:" + s);

br.close();

} catch(Exception e) {e.printStackTrace();}

 

Следующий пример демонстрирует извлечение из строки последовательности подстрок, которые разделены простыми пробелами.

 

Пример 1.12

public class ExtractSubstring

{

public static void main(String[] args)

{

String text = "To be or not to be"; //строка для расчленения

int count = 0; //число подстрок

char separator = ' '; //разделитель подстрок

// определить число подстрок

int index = 0;

do {

++count; //увеличить счетчик подстрок

++index; //перейти за последнюю позицию

index = text.indexOf(separator, index);

}

while (index != -1);

//поместить подстроку в массив

String[] subStr = new String[count]; //выделить для подстрок

index = 0; //индекс начала подстроки

int endIndex = 0; //индекс окончания подстроки

for(int i = 0; i < count; i++)

{

endIndex = text.indexOf(separator,index); //найти

//следующий разделитель

if(endIndex == -1) //если он не найден

subStr[i] = text.substring(index); //извлечь до конца

else //иначе

subStr[i] = text.substring(index, endIndex);

//до конечного индекса

index = endIndex + 1; //задать начало для

//следующего цикла

}

//вывести подстроки

for(int i = 0; i < subStr.length; i++)

System.out.println(subStr[i]);

}

}

 

Результат выпонения программы:

To

be

or

not

to

be

 

В следующем примере создается последовательность точек и линии, соединяющие каждую пару последовательных точек, вычисляется общая длина линии. Пример включает три класса: TryPackage, Point, Line.

 

Пример 1.13

Код класса TryPackage

import Geometry.*; // импортировать классы Point и Line

public class TryPackage

{

public static void main(String[] args)

{

double[][] coords = { {1.0, 0.0}, {6.0, 0.0},

{6.0, 10.0},{10.0,10.0},

{10.0, -14.0}, {8.0, -14.0}};

 

//создать массив точек и заполнить его объектами Point

Point[] points = new Point[coords.length];

for(int i = 0; i < coords.length; i++)

points[i] = new Point(coords[i][0],coords[i][1]);

//создать массив линий и заполнить его с помощью пар

//объектов Point

Line[] lines = new Line[points.length - 1];

double totalLength = 0.0; //сохранить общую длину линии

for(int i = 0; i < points.length - 1; i++)

{

//создать Line

lines[i] = new Line(points[i], points[i+1]);

//добавить ее длину

totalLength += lines[i].length();

System.out.println("\nLine "+(i+1)+' ' +lines[i] +

" Length is " + lines[i].length());

}

//вывести общую длину

System.out.println("\n\nTotal line length = " + totalLength);

}

}

 

Код класса Point

package Geometry;

public class Point

{

//создать точку (Point) по ее координатам

public Point(double xVal, double yVal)

{

x = xVal;

y = yVal;

}

//создать точку (Point) из существующего объекта (Point)

public Point(final Point aPoint)

{

x = aPoint.x;

y = aPoint.y;

}

//переместить точку

public void move(double xDelta, double yDelta)

{

//значения параметров являются приращениями для текущих координат

x += xDelta;

y += yDelta;

}

//вычислить расстояние до другой точки public double distance (final Point aPoint)

{

return Math.sqrt(

(x - aPoint.x)*(x - aPoint.x) +

(y - aPoint.y)*(y - aPoint.y) );

}

//преобразовать точку (Point) в строку

public String toString()

{

return Double.toString(x) + ", " + y; //Как "x, y"

}

//извлечь координату х

public double getX()

{ return x; }

//извлечь координату y

public double getY()

{ return y; }

//задать координату x

public void setX(double inputX)

{ x = inputX; }

//задать координату y

public void setY(double inputY)

{ y = inputY; }

//координаты точки

private double x;

private double y;

}

 

Код класса Line

package Geometry;

public class Line

{

//создать прямую (Line) по двум точкам

public Line(final Point start, final Point end)

{

this.start = new Point(start);

this.end = new Point(end);

}

//создать прямую (Line) из двух пар координат

public Line(double xStart, double yStart, double xEnd, double yEnd)

{

start = new Point(xStart, yStart); //создать начальную точку

end = new Point(xEnd, yEnd); //создать конечную точку

}

//вычислить длину прямой

public double length()

{

return start.distance(end); //использовать метод из класса Point

}

//вернуть точку как пересечение двух прямых

public Point intersects(final Line line1)

{

Point localPoint = new Point(0, 0);

double num =

(this.end.getY() - this.start.getY())*(this.start.getX() - line1.start.getX()) -

(this.end.getX() - this.start.getX())*(this.start.getY() - line1.start.getY());

double denom =

(this.end.getY() - this.start.getY())*(line1.end.getX() - line1.start.getX()) -

(this.end.getX() - this.start.getX())*(line1.end.getY() - line1.start.getY());

localPoint.setX(line1.start.getX() + (line1.end.getX() - line1.start.getX())*num/denom);

localPoint.setY(line1.start.getY() + (line1.end.getY() - line1.start.getY())*num/denom);

return localPoint;

}

//преобразовать прямую (Line) в строку

public String toString() {

return "(" + start+ "):(" + end + ")"; //Как "(start):(end)"

} //т.е."(x1, y1):(x2, y2)"

// Data members

Point start; //начальная точка прямой

Point end; //конечная точка прямой

}

 

Откомпилировав файлы и запустив программу, получим следующий результат работы программы:

Line 1 (1.0, 0.0) : (6.0, 0.0) Length is 5.0

Line 2 (6.0, 0.0) : (6.0, 10.0) Length is 10.0

Line 3 (6.0, 10.0) : (10.0, 10.0) Length is 4.0

Line 4 (10.0, 10.0) : (10.0, -14.0) Length is 24.0

Line 5 (10.0, -14.0) : (8.0, -14.0) Length is 2.0

Total line length = 45.0

 

Задания для самостоятельного выполнения

 

1. Создать массив переменных String и инициализировать массив названиями месяцев от января до декабря. Создать массив, содержащий 12 случайных десятичных значений между 0.0 и 100.0. Вывести название каждого месяца вместе с соответствующим десятичным значением. Вычислить и вывести среднее значение 12 значений.

2. Написать программу, которая задает переменную String, содержащую параграф текста на выбор. Извлечь слова из текста и отсортировать их в алфавитном порядке. Вывести отсортированный список слов.

3. Создать массив из десяти переменных String, каждая из которых содержит произвольную строку – месяц/день/год, например 01/10/06. Проанализировать каждый элемент в массиве и вывести представление даты в форме 10 января 2006.

4. Написать программу для создания случайной последовательности прописных букв, которая не включает гласные буквы.

5. Написать программу для создания случайной последовательности строчных букв, которая не включает гласные буквы.

6. Создать объект типа String и проинициализировать его текстовой строкой. Определить количество гласных, пробелов и общее количество букв.

7. Создать массив объектов типа String и проинициализировать его следующими текстовыми строками: «To be or not to be that is the question», «I am the student of economical department», «My name is John», «Hello world». Воспользоваться методом indexOf(), чтобы определить в массиве подстроки «be», «is»,«am»,«department», «hello». Вывести номер строки и для нее номер указанного элемента.

8. Создать массив объектов типа String и проинициализировать его следующими строками: «To;be:or*not;to:be*that;is:the*question», «I;am:the*student;of:economical*department», «My;name:is*John», «Hello;world». Использовать метод indexOf() совместно с методом substring() для извлечения из исходного массива строк последовательности подстрок, которые разделены символами «;», «:»,«*».

9. Написать программу, с помощью которой создается последовательность точек и линия, соединяющая каждую пару последовательных точек. Затем вычисляется общая длина линии. Найти на этой отрезок минимальной длины.

10. Написать программу для создания прямоугольного массива, содержащего таблицу умножения от 1×1 до 12×12. Вывести таблицу как 13 столбцов с числовыми значениями, выровненными справа в столбцах (рис. 1.3). Первая строка вывода – это заголовки столбцов без заголовка для первого столбца, затем числа от 1 до 12 для остальных столбцов. Первый элемент в каждой из последующих строк является заголовком строки, изменяющимся от 1 до 12.

 

1 2 3 4 5 6 7 8 9 10 11 12

1 1 2 3 4 5 6 7 8 9 10 11 12

2 2 4 6 8 10 12 14 16 18 20 22 24

3 3 6 9 12 15 18 21 24 27 30 33 36

4 4 8 12 16 20 24 28 32 36 40 44 48

5 5 10 15 20 25 30 35 40 45 50 55 60

6 6 12 18 24 30 36 42 48 54 60 66 72

7 7 14 21 28 35 42 49 56 63 70 77 84

8 8 16 24 32 40 48 56 64 72 80 88 96

9 9 18 27 36 45 54 63 72 81 90 99 108

10 10 20 30 40 50 60 70 80 90 100 110 120

11 11 22 33 44 55 66 77 88 99 110 121 132

12 12 24 36 48 60 72 84 96 108 120 132 144

 

Рис. 1.3. Результат вывода программы

 

11. Написать программу, с помощью которой создается бы последовательность точек и линия, соединяющая каждую пару последовательных точек. Затем вычисляется средняя длина линии. Найти на этой линии отрезок максимальной длины.

12. Диаметр Солнца равен приблизительно 865 000 милям, а диаметр Земли – 7600 милям. Вычислить с помощью методов класса Math:

– объем Земли в кубических милях;

– объем Солнца в кубических милях;

– отношение объема Солнца к объему Земли.

Затем вывести эти значения. Считать, что Земля и Солнце являются шарами. Объем шара задается формулой 4пr³/3, где r – радиус шара.

13. Написать программу, которая по трем точкам определит вид треугольника: прямоугольный, равнобедренный, равносторонний или разносторонний.

14. Написать программу, которая в матрице произвольного порядка определит индекс строки с минимальным элементом и индекс столбца с максимальным элементом этой матрицы.

15. Написать программу, которая в матрице произвольного порядка определит отношение среднего значения элементов, расположенных на главной диагонали, к среднему значению элементов, расположенных на побочной диагонали этой матрицы.


ЛАБОРАТОРНАЯ РАБОТА №2

РАБОТА С ФАЙЛАМИ

 

Цель: разработка консольных приложений с возможностью записи и чтения в/из файла.

 

Класс File

Если классы потоков осуществляют реальную запись и чтение данных, то класс File – это вспомогательный инструмент, призванный обеспечить работу с файлами и каталогами.

Объект класса File является абстрактным представлением файла и пути к нему. Он устанавливает только соответствие с ним, при этом для создания объекта неважно, существует ли такой файл на диске. После создания можно выполнить проверку, вызвав метод exists, который возвращает значение true, если файл существует. Создание или удаление объекта класса File никоим образом не отображается на реальных файлах. Для работы с содержимым файла можно получить экземпляры FileI/OStream.

Объект File может указывать на каталог (узнать это можно путем вызова метода isDirectory()). Метод list возвращает список имен (массив String) содержащихся в нем файлов (если объект File не указывает на каталог, будет возвращен null).

Следующий пример демонстрирует использование объектов класса File.

 

Пример 2.5

import java.io.*; public class FileDemo { public static void findFiles(File file, FileFilter filter, PrintStream output) throws IOException{ if (file.isDirectory()) { File[] list = file.listFiles(); for (int i=list.length; --i>=0;) { findFiles(list[i], filter, output); } } else { if (filter.accept(file)) output.println("\t" + file.getCanonicalPath()); } } public static void main(String[] args) { class NameFilter implements FileFilter { private String mask; NameFilter(String mask) { this.mask = mask; } public boolean accept(File file){ return (file.getName().indexOf(mask)!=-1)?true:false; } } File pathFile = new File("."); String filterString = ".java"; try { FileFilter filter = new NameFilter(filterString); findFiles(pathFile, filter, System.out); } catch(Exception e) { e.printStackTrace(); } System.out.println("work finished"); } }

При выполнении этой программы на экран будут выведены названия (в каноническом виде) всех файлов с расширением .java, содержащихся в текущем каталоге и всех его подкаталогах.

Для определения того, что файл имеет расширение .java, использовал

Последнее изменение этой страницы: 2016-08-11

lectmania.ru. Все права принадлежат авторам данных материалов. В случае нарушения авторского права напишите нам сюда...