5 метод по вып практ раб

Федеральное агентство по образованию
Государственное образовательное учреждение высшего профессионального образования
Омский государственный технический университет












Е.Б. Юдин

Объектно-ориентированное программирование на языке JAVA

Методические указания к выполнению практических заданий




















Омск-2008
Введение
В методическом руководстве представлен разбор некоторых тестовых вопросов, используемых при тестировании студентов, и тем лабораторных работ, выполнение которых необходимых для получения зачёта. Тестовые вопросы помогают заострить внимание на тонких моментах в изучении языка и подготовиться к тестированию. Разбор лабораторных работ также останавливается только на некоторых темах языка Java наиболее важных для тематики данной лабораторной. Однако многое остаётся на самостоятельную проработку. В методичке в каждой теме приведены соответствующие полезные ресурсы Интернета, также некоторые из книг, на которые указываются ссылки предоставляются в электронном виде на вводном занятии.
Лабораторные работы
Лабораторная работа №1 – Разработка консольного приложения
В данной лабораторной разрабатывается консольное приложение, реализующее заданный алгоритм для работы со строками и файлами, коллекциями или массивами. В данной лабораторной работе необходимо предусмотреть режим работы при котором данные считываются из файла.
Для задач программирования на Java, зная другие языки программирования, несложно разобраться с синтаксисом конкретного языка. Ресурс [ Cкачайте файл, чтобы посмотреть ссылку ] с примерами конструкций и мини-приложений призван в этом помочь. Ниже остановимся на некоторых дополнительных классов для работы со строками, коллекциями и массивами.
Класс StringTokenizer. .Лексический анализ текста
Класс StringTokenizer содержит методы, позволяющие разбивать текст на лексемы, отделяемые разделителями. Набор разделителей по умолчанию: пробел, символ табуляции, символ новой строки, перевод каретки. В задаваемой строке разделителей можно указывать другие разделители, например, «= , ; : ».
Класс StringTokenizer имеет конструкторы:
StringTokenizer(String str);
StringTokenizer(String str, String delimiters);
StringTokenizer(String str, String delimiters,
Boolean delimAsToken);
Некоторые методы:
String nextToken() – возвращает лексему как String объект;
boolean hasMoreTokens() – возвращает true, если одна или несколько лексем остались в строке;
int сountToken() – возвращает число лексем.
Класс был реализован в самой первой версии языка. Однако в настоящее время существуют более совершенные средства по обработке текстовой информации – регулярные выражения.
Регулярные выражения
Класс java.util.regex.Pattern применяется для определения регулярных выражений, для которого ищется соответствие в строке, файле или другом объекте представляющем собой некоторую последовательность символов. Для определения шаблона применяются специальные синтаксические конструкции. О каждом соответствии можно получить больше информации с помощью класса java.util.regex.Matcher.
Далее приведены основные логические конструкции для задания шаблона.
Если в строке, проверяемой на соответствие, необходимо, чтобы в какой-либо позиции находился один из символов некоторого символьного набора, то такой набор (класс символов) можно объявить, используя одну из следующих конструкций:



Таблица 1 - Способы определения классов символов
[abc]
a, b или c

[^abc]
символ, исключая a, b и c

[a-z]
символ между a и z

[a-d[m-p]]
либо между a и d, либо между m и p

[e-z&&[dem]]
e либо m (конъюнкция)

Кроме стандартных классов символов существуют предопределенные классы символов:
Таблица 2 - Дополнительные способы определения классов символов
.
любой символ

\d
[0-9]

\D
[^0-9]

\s
[ \t\n\x0B\f\r]

\S
[^ \s]

\w
[a-zA-Z_0-9]

\W
[^\w]

\p{javaLowerCase}
тоже, что и Character.isLowerCase()

\p{javaUpperCase}
тоже, что и Character.isUpperCase()

При создании регулярного выражения могут использоваться логические операции:
Таблица 3 – Способы задания логических операций
XY
После X следует Y

X|Y
X либо Y

(X)
X

Скобки, кроме их логического назначения, также используются для выделения групп.
Для определения регулярных выражений недостаточно одних классов символов, т. к. в шаблоне часто нужно указать количество повторений. Для этого существуют квантификаторы.
Таблица 4 - Квантификаторы
X?
X один раз или ни разу

X*
X ноль или более раз

X+
X один или более раз

X{n}
X n раз

X{n,}
X n или более раз

X{n,m}
X от n до m

Существует еще два типа квантификаторов, которые образованы прибавлением суффикса ? (слабое или неполное совпадение) или + («жадное» или собственное совпадение) к вышеперечисленным квантификаторам. Неполное совпадение соответствует выбору с наименее возможным количеством символов, а собственное – с максимально возможным.
Класс Pattern используется для простой обработки строк. Для более сложной обработки строк используется класс Matcher, рассматриваемый ниже.
В классе Pattern объявлены следующие методы:
Pattern compile(String regex) – возвращает Pattern, который соответствует regex.
Matcher matcher(CharSequence input) – возвращает Matcher, с помощью которого можно находить соответствия в строке input.
boolean matches(String regex, CharSequence input) – проверяет на соответствие строки input шаблону regex.
String pattern() – возвращает строку, соответствующую шаблону.
String[] split(CharSequence input) – разбивает строку input, учитывая, что разделителем является шаблон.
String[] split(CharSequence input, int limit) – разбивает строку input на не более чем limit частей.
С помощью метода matches() класса Pattern можно проверять на соответствие шаблону целой строки, но если необходимо найти соответствия внутри строки, например, определять участки, которые соответствуют шаблону, то класс Pattern не может быть использован. Для таких операций необходимо использовать класс Matcher.
Начальное состояние объекта типа Matcher не определено. Попытка вызвать какой-либо метод класса для извлечения информации о найденном соответствии приведет к возникновению ошибки IllegalStateException. Для того чтобы начать работу с объектом Matcher нужно вызвать один из его методов:
boolean matches() – проверяет, соответствует ли вся строка шаблону;
boolean lookingAt() – пытается найти последовательность символов, начинающуюся с начала строки и соответствующую шаблону;
boolean find() или boolean find(int start) – пытается найти последовательность символов, соответствующих шаблону, в любом месте строки. Параметр start указывает на начальную позицию поиска.
Иногда необходимо сбросить состояние Matcher’а в исходное, для этого применяется метод reset() или reset(CharSequence input), который также устанавливает новую последовательность символов для поиска.
Для замены всех подпоследовательностей символов, удовлетворяющих шаблону, на заданную строку можно применить метод replaceAll(String replacement).
Для того, чтобы ограничить поиск границами входной последовательности применяется метод region(int start, int end), а для получения значения этих границ – regionEnd() и regionStart(). С регионами связано несколько методов:
Matcher useAnchoringBounds(boolean b) – если установлен в true, то начало и конец региона соответствуют символам ^ и $ соответственно.
boolean hasAnchoringBounds() – проверяет закрепленность границ.
В регулярном выражении для более удобной обработки входной последовательности применяются группы, которые помогают выделить части найденной подпоследовательности. В шаблоне они обозначаются скобками “(“ и “)”. Номера групп начинаются с единицы. Нулевая группа совпадает со всей найденной подпоследовательностью. Далее приведены методы для извлечения информации о группах.
int end() – возвращает индекс последнего символа подпоследовательности, удовлетворяющей шаблону;
int end(int group) – возвращает индекс последнего символа указанной группы;
String group() – возвращает всю подпоследовательность, удовлетворяющую шаблону;
String group(int group) – возвращает конкретную группу;
int groupCount() – возвращает количество групп;
int start() – возвращает индекс первого символа подпоследовательности, удовлетворяющей шаблону;
int start(int group) – возвращает индекс первого символа указанной группы;
boolean hitEnd() – возвращает истину, если был достигнут конец входной последовательности.
Следующий пример показывает как можно использовать возможности классов Pattern и Matcher, для поиска, разбора и разбиения строк.

import java.util.regex.*;
public class DemoRegular {
public static void main(String[] args) {
//проверка на соответствие строки шаблону
Pattern p1 = Pattern.compile("a*y");
Matcher m1 = p1.matcher("aaay");
boolean b = m1.matches();
System.out.println(b);
//поиск и выбор подстроки, заданной шаблоном
String regex = "(\\w+)@(\\w+\\.)(\\w+)(\\.\\w+)*";
String s = "адреса эл.почты: [email protected] и [email protected]";
Pattern p2 = Pattern.compile(regex);
Matcher m2 = p2.matcher(s);
while (m2.find()) {
System.out.println("e-mail: " + m2.group());
}
//разбиение строки на подстроки с применением шаблона в качестве разделителя
Pattern p3 = Pattern.compile("\\d+\\s?");
String[] words = p3.split("java5tiger 77 java6mustang");
for (String word : words)
System.out.println(word);
}
}
В результате будет выведено:
true
e-mail: [email protected]
e-mail: [email protected]
java
tiger
java
mustang
Следующий пример показывает как использовать группы а также собственные и неполные квантификаторы.

public class Groups {
public static void main(String[] args) {
String input = "abdcxyz";
myMatches("([a-z]*)([a-z]+)", input);
myMatches("([a-z]?)([a-z]+)", input);
myMatches("([a-z]+)([a-z]*)", input);

·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·}
}
Результат работы программы:
First group: abdcxy
Second group: z
First group: a
Second group: bdcxyz
First group: abdcxyz
Second group: nothing
В первом случае к первой группе относятся все возможные символы, но при этом остается минимальное количество символов для второй группы.
Во втором случае для первой группы выбирается наименьшее количество символов, т. к. используется слабое совпадение.
В третьем случае первой группе будет соответствовать вся строка, а для второй не остается ни одного символа, так как вторая группа использует слабое совпадение.
В четвертом случае строка не соответствует регулярному выражению, т. к. для двух групп выбирается наименьшее количество символов.
В классе Matcher объявлены два полезных метода для замены найденных подпоследовательностей во входной строке.
Matcher appendReplacement(StringBuffer sb, String replacement) – метод читает символы из входной стоки и добавляет их в sb. Чтение останавливается на start()-1 позиции предыдущего совпадения, после чего происходит добавление в sb строки replacement. При следующем вызове этого метода, производится добавление символов, начиная с символа с индексом end() предыдущего совпадения.
StringBuffer appendTail(StringBuffer sb) – добавляет оставшуюся часть символов из входной последовательности в sb. Как правило, вызывается после одного или нескольких вызовов метода appendReplacement().
Работа с матрицами и коллекциями.
Очень важно понимать в каком случае какую структуру данных использовать для реализации хранения объектов. При этом есть всегда выбор между просто массивом и определённым видом коллекции (список, множество, карты).


Рис. 1. Иерархия наследования списков
Существует также выбор и среди реализации определённой коллекции. Скажем, если вы решили использовать список (интерфейс List), то вы можете использовать для реализации ArrayList, LinkedList, Vector, Stack и т.д. Известно, например, что ArrayList хранит элементы в виде массива, а значит доступ и замена будут выполняться относительно быстро, в то время как добавление влечёт по-сути удаление массива и создание нового размером, большего на единицу, при этом выполняется ещё и копирование элементов. В то же время LinkedList хранит элементы в виде списка, а значит «дорогим» поиском и «дешёвым» добавлением элементов. Рекомендуется ознакомится с реализациями структур данных прежде чем использовать эту структуру. При этом рекомендуется использовать следующие источники:
[ Cкачайте файл, чтобы посмотреть ссылку ]
[ Cкачайте файл, чтобы посмотреть ссылку ]
Важно также знание основных классов для работы с коллекциями и массивами. Особое внимание при изучении заслуживают класс Comporator, Arrays, Collections.

Задания к лабораторной работе №1

Ввести n строк с консоли, найти самую короткую строку. Вывести эту строку и ее длину.
Ввести n строк с консоли. Упорядочить и вывести строки в порядке возрастания их длин, а также значения их длин.
Ввести n строк с консоли. Упорядочить строки и вывести эти строки в порядке убывания длины, а также значения их длин.
Ввести n строк с консоли. Вывести на консоль те строки, длина которых меньше средней, также их длины.
Ввести n строк с консоли. Вывести на консоль те строки, длина которых больше средней, а также их длины.
Ввести n строк с консоли, найти самую короткую строку. Вывести эту строку и ее длину.
Ввести n строк с консоли. Найти самую длинную строку. Вывести найденную строку и ее длину.
Ввести n строк с консоли. Упорядочить и вывести строки в порядке возрастания их длин, а также значения их длин.
В каждом слове текста k-ю букву заменить заданным символом. Если k больше длины слова, корректировку не выполнять.
В русском тексте каждую букву заменить ее номером в алфавите. В одной строке печатать текст с двумя пробелами между буквами, в следующей строке внизу под каждой буквой печатать ее номер.
В тексте после буквы Р, если она не последняя в слове, ошибочно напечатана буква А вместо О. Внести исправления в текст.
В тексте слова заданной длины заменить указанной подстрокой, длина которой может не совпадать с длиной слова.
В тексте после k-го символа вставить заданную подстроку.
После каждого слова текста, заканчивающегося заданной подстрокой, вставить указанное слово.
В зависимости от признака (0 или 1) в каждой строке текста удалить указанный символ везде, где он встречается, или вставить его после   k-гo символа.
Из небольшого текста удалить все символы, кроме пробелов, не являющиеся буквами. Между последовательностями подряд идущих букв оставить хотя бы один пробел.
Из текста удалить все слова заданной длины, начинающиеся на согласную букву.
Удалить из текста его часть, заключенную между двумя символами, которые вводятся (например, между скобками "(" и ")" или между звездочками (*) и т.п.).
В тексте найти все пары слов, из которых одно является обращением другого.
Найти и напечатать, сколько раз повторяется в тексте каждое слово, которое встречается в нем.
В тексте найти и напечатать символы, встречающиеся наиболее часто.
Найти, каких букв, гласных или согласных, больше в каждом предложении текста.
В тексте найти количество слов, начинающихся и заканчивающихся гласной буквой.
Напечатать без повторения слова текста, у которых первая и последняя буква совпадают.
В тексте найти и напечатать все слова максимальной и все  слова минимальной длины.
Напечатать квитанцию об оплате за телеграмму, если стоимость одного слова задана.
В трех словах найти одинаковые буквы, которые встречаются во всех словах.
В тексте найти первую подстроку максимальной длины, не содержащую букв.
Задан небольшой русский текст, состоящий не более чем из 80 символов. Определить все согласные буквы встречающиеся не более, чем в двух словах.
Создайте свое собственное поведение по типу возобновления, используя цикл while, который будет повторяться, пока исключение больше не будет выбрасываться.
В следующих заданиях требуется ввести последовательность строк из текстового потока и выполнить указанные действия. При этом могут рассматриваться два варианта: каждая строка состоит из одного слова; каждая строка состоит из нескольких слов. Имена входного и выходного файлов могут быть введены как параметры командной строки.
Найти и вывести слова, для которых последняя буква одного слова совпадает с первой буквой следующего слова.
Найти наибольшее число цифр в строке, идущих подряд.
Определить частоту повторяемости слов в тексте.
Прочитать текст Java-программы и записать в другой файл в обратном порядке символы каждой строки.
Ввести строки из файла, записать в стек. Вывести строки в файл в обратном порядке.
Ввести число, занести его цифры в стек. Вывести в число, у которого цифры идут в обратном порядке.
Найти в стеке индексный массив для быстрого доступа к записям в бинарном файле.
Определить класс Set на основе множества целых чисел, n = размер. Создать методы для определения пересечения и объединения множеств.
Программа получает N параметров вызова (аргументы командной строки). Эти параметры – элементы вектора. Строится массив типа double, а на базе этого массива – объект класса DoubleVector. Далее программа выводит в консоль значения элементов вектора в виде: Вектор: 2.3  5.0  7.3. 
Списки (стеки) I(1..N) и U(1..N) содержат результаты N измерений тока и напряжения на неизвестном сопротивлении R. Найти приближённое число R методом наименьших квадратов.
Выполнить попарное суммирование произвольного конечного ряда чисел следующим образом: на первом этапе суммируются попарно рядом стоящие числа, на втором этапе суммируются результаты первого этапа и т.д. до тех пор, пока не останется одно число.
Сложить два многочлена заданной степени, если коэффициенты многочленов хранятся в объекте HashMap.
Умножить два многочлена заданной степени, если коэффициенты многочленов хранятся в списках.
Не используя вспомогательных объектов, переставить отрицательные элементы данного списка в конец, а положительные - в начало этого списка.
Во входном файле хранятся наименования некоторых объектов. Построить список C1, элементы которого содержат наименования и шифры данных объектов, причем элементы списка должны быть упорядочены по возрастанию шифров. Затем "сжать" список C1, удаляя дублирующие наименования объектов.
Во входном файле расположены два набора положительных чисел; между наборами стоит отрицательное число. Построить два списка C1 и С2, элементы которых содержат соответственно числа 1-го и 2-го набора таким образом, чтобы внутри одного списка числа были упорядочены по возрастанию. Затем объединить списки C1 и С2 в один упорядоченный список, изменяя только значения полей ссылочного типа.
Выбрать три разные точки заданного на плоскости множества точек, составляющие треугольник наибольшего периметра.
Найти такую точку заданного на плоскости множества точек, сумма расстояний от которой до остальных минимальна.
Выпуклый многоугольник задан на плоскости перечислением   координат вершин в порядке обхода его границы. Определить площадь многоугольника.
Из множества точек на плоскости, заданных координатами, выбрать точки, наиболее и наименее удаленные от прямой  Ax+By+C=0.
Ввести строки из файла, записать в стек. Вывести строки в файл в обратном порядке.
Ввести число, занести его цифры в стек. Вывести в число, у которого цифры идут в обратном порядке.
Найти в стеке индексный массив для быстрого доступа к записям в бинарном файле.
Создать стек из номеров записи. Организовать прямой доступ к элементам записи.
Организовать вычисления в виде стека.
Занести изображения в стек, затем просмотреть.
Задать два стека, поменять информацию местами.
Сложить два многочлена заданной степени, если коэффициенты многочленов хранятся в объекте HashMap.
Умножить два многочлена заданной степени, если коэффициенты многочленов хранятся в списках.
Лабораторная работа №2 Разработка визуального приложения.
Данная лабораторная работа посвящена построению приложений с использованием графического интерфейса библиотек awt и swing. Все задачи предполагают решение подзадач управления событиями и\или сложной динамикой отображения и требуют построения графического приложения. В сети Интернет (помимо ссылок, указанных в прошлой лабораторной работе) рекомендуется также:
[ Cкачайте файл, чтобы посмотреть ссылку ]
[ Cкачайте файл, чтобы посмотреть ссылку ]
[ Cкачайте файл, чтобы посмотреть ссылку ]
Библиотека Jung
Задания с использованием широко известной библиотеки Jung (Java Universal Network/Graph Framework) базируются на знаниях теории графов, полученных студентом в курсе «Дискретная математика». Учитывая отсутствие документации на русском языке ниже описаны основные возможности библиотеки Jung с указанием классов их реализующими. Документация и примеры предоставлены в электронном виде.
Средства визуализации
Библиотека JUNG предоставляет набор классов, предназначенных для инкапсуляции процесса визуализации графов и для удобства разработки, реализованных в виде трехуровневой архитектуры:
Классы, отвечающие за внутреннее представление графа в системе. В качестве примера реализации ориентированных и неориентированных графов, в системе реализованы классы DirectedSparseGraph и UndirectedSparseGraph.
Классы, отвечающие за расположение графа на экране (Layout), то есть за сопоставление вершинам графам определенных координат. Простейшей реализацией является класс StaticLayout. Более сложные классы позволяют реализовывать различные визуальные эффекты, связанные с расположением вершин.
Классы, отвечающие за непосредственное рисование объектов графа, таких как вершины, ребра и текстовые метки. Например, достаточно гибко настраиваемый PluggableRenderer.

Некоторые возможности средств разработки
Библиотека предоставляет большое количество всевозможных классов, предназначенных для повышения уровня процесса разработки.
Мышь
В библиотеке реализована модульная структура собственных классов предназначенных для обработки событий мыши. Благодаря чему возможно осуществление базовых операций над графами, а именно работы в режимах:
Редактирования (Editing), позволяющим добавлять и удалять новые ребра и вершины.
Переноса (Picking), позволяющим изменять положение вершины или группы вершин.
Преобразования (Transforming), в котором возможно применение преобразований ко всему графу целиком, в частности – вращение, растяжение вдоль оси и параллельный перенос.
UserData
Кроме того, поддерживает механизм присоединения свойств к объектам графа (UserData), позволяя тем самым уменьшить количество собственных классов, необходимых для реализации поставленной задачи. Свойства сохраняются в формате (ключ, значение) и в дальнейшем могут быть считаны, изменены или удалены.

Структурированная работа с объектами
JUNG включает в себя некоторое количество удобных классов, которые представляют собой пример реализации структурированной работы с объектами графа. Они реализованы в рамках пакета graph.decorators. Например:
Класс Indexer содержит методы, позволяющие создавать отображения между вершинами графа и целыми числами {0, 1, ... n-1}, где n – количество вершин в графе. Это позволяет работать с множествами вершин как с упорядоченными массивами.

Класс StringLabeller позволяет “прикреплять” к вершинам строковые метки к вершинам графа.

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

Алгоритмы
JUNG предоставляет огромное количество всевозможных алгоритмов для сетей и графов, которые являются наиболее сложной и быстро развивающейся частью библиотеки.
Операции над Графом/Матрицей
Матрицы являются одним из наиболее распространенных представлений графовых данных. GraphMatrixOperations состоит из двух классов операций: первый непосредственно реализует операции над матрицами, а второй класс представляет собой операции, включенные в [ Cкачайте файл, чтобы посмотреть ссылку ] для вычислительных операций над матрицами.
Кластеризация
Кластером является совокупность объектов, имеющих некоторое сходство между собой. В графах под сходство часто основано на топологических свойствах, таких как связанность вершин друг с другом, но может также зависеть и от свойств вершин и ребер. В библиотеке поддерживаются следующие классы:
BicomponentClusterer: Находит все двусвязные графы в неориентированном графе g, где двусвязный граф определен как максимальный индуцированный двусвязный подграф графа g
EdgeBetweennessClusterer: Вычисляет кластеры для графа, основанные на усредненном свойстве ребер
WeakComponentClusterer: Находит все слабые компоненты в графе g, где под слабой компонентой понимается максимально слабосвязанный подграф графа g
Топология, пути и потоки
Эти алгоритмы выполняют операции над графами (и вычисляют свойства) в соответствии с их топологией (то есть набором связей между вершинами). В библиотеке поддерживаются следующие классы:
BFSDistanceLabeler: Помечает каждую вершину в графе длинной кратчайшего невзвешенного пути от определенной вершины в графе
KNeighborhoodExtractor: Возвращает подграф графа, чьи вершины разделены не более чем k ребрами от определенной вершины в графе
DijkstraShortestPath: Помечает каждую вершину в графе длинной кратчайшего взвешенного пути от определенной вершины в этом графе
UnweightedShortestPath: Вычисляет кратчайший путь для невзвешенного графа
Значимости
Некоторые из алгоритмов предназначены для работы с Марковскими сетями: направленными графами с весами, в которых вершины представляют собой состояния, ребра представляют возможные переходы из одного состояния в другое, а веса ребер – вероятности такого перехода. Вероятность сопоставленная вершине v в такой сети есть конечная вероятность что оно окажется текущим.
BetweennessCentrality: Помечает каждую вершину и ребро в графе количеством кратчайших путей, проходящих через них. DegreeDistributionRanker: Помечает каждую вершину в соответствии с ее степенью.
PageRank: Помечает каждую вершину в модифицированной Марковской сети в соответствии со статической вероятностью.
PageRankWithPriors: Помечает каждую вершину в модифицированной Марковской сети в соответствии со статической вероятностью, в зависимости от указанного набора корневых вершин.
HITS: Помечает каждую вершину в графе в соответствии с "hubs-and-authorities".
HITSWithPriors: Помечает каждую вершину в графе в соответствии с "hubs-and-authorities", в зависимости от указанного набора корневых вершин.
KStepMarkov: Помечает каждую вершину в соответствии с быстрой аппроксимацией алгоритма PageRankWithPriors.
WeightedNIPaths: Помечает каждую вершину в графе в соответствии с номером и длиной непересекающихся путей, заканчивающихся на вершине соответствующей определенному набору корневых вершин.
Статистики
DegreeDistributions: Класс функций для анализа степени распределения множества вершин
GraphStatistics: Набор статистических измерений для структурных свойств графа.
Histogram: Базовый класс для представления распределения в виде гистограмм.
Задания к лабораторной работе №3
Создание приложения (к примеру «Записная книжка» или «Графический редактор») с использованием шаблона Abstract Factory/Абстрактная фабрика
Создания приложения с использованием библиотеки Jung, реализующего алгоритм генерации случайных графов( граф де-Бруйна)
Создание приложения (к примеру «Записная книжка» или «Графический редактор») с использованием шаблона Factory Method/Фабричный метод, Virtual Constructor
Создания приложения с использованием библиотеки Jung, реализующего алгоритм ПРИМА для построения минимального остового дерева
Создание приложения (к примеру «Записная книжка» или «Графический редактор») с использованием шаблона Builder/Строитель
Создания приложения с использованием библиотеки Jung, реализующего алгоритм генерации случайных графов (k-соседний граф)
Создание приложения (к примеру «Записная книжка» или «Графический редактор») с использованием шаблона Model-View-Controller (MVC)
Создания приложения с использованием библиотеки Jung, реализующего алгоритм генерации случайных графов (эвклидов граф)
Создание приложения (к примеру «Записная книжка» или «Графический редактор») с использованием шаблона Singleton/Одиночка
Создания приложения с использованием библиотеки Jung, реализующего алгоритм Дейкстры, не используя встроенный механизм библиотеки Jung
Создание приложения (к примеру «Записная книжка» или «Графический редактор») с использованием шаблона Composite/Компоновщик
Создания приложения с использованием библиотеки Jung, реализующего алгоритм построении минимального остового дерева (алгоритм Краскала)
Создание приложения (к примеру «Записная книжка» или «Графический редактор») с использованием шаблона Chain of Responsibility/Цепочка обязанностей
Создания приложения с использованием библиотеки Jung, реализующего алгоритм, вычисляющий среднее значение длины кратчайших путей из заданной вершины
Создание приложения (к примеру «Записная книжка» или «Графический редактор») с использованием шаблона Command / Команда, Action, Transaction
Создания приложения с использованием библиотеки Jung, реализующего поиск Эйлерова пути в графе
Создание приложения (к примеру «Записная книжка» или «Графический редактор») с использованием шаблона State/Состояние, Objects for States
Создания приложения с использованием библиотеки Jung, реализующего алгоритм раскраски графа.
Создание приложения (к примеру «Записная книжка» или «Графический редактор») с использованием шаблона Strategy/Стратегия SimplePolicy


Вопросы по синтаксису языка и объектно-ориентированному программированию
Ниже перечисленные вопросы по сложности расположены в произвольном порядке (их упорядоченность по темам). Это связано с тем, что подразумевается, что студент к началу работы над разбором познакомился с языком и ему остаётся только углубить понимание специфики и конструкций языка, кроме того студент к моменту изучения языка JAVA изучал как процедурные языки (PASCAL, С), так и знакомился с объектно-ориентированными (С#). А значит нужно ориентироваться на отличия JAVA от других языков и на темы, а не сложность изложения. При этом рекомендуется в сложных вопросах при их разборе обращаться к дополнительной литературе, предоставленной в электронном виде для чтения, в частности разбор спецификации Гослинга (одного из создателей языка), книги по Java от компании SUN, «Философия JAVA» Брюса Эккеля. Также рекомендуются следующие электронные ресурсы и пособия:
[ Cкачайте файл, чтобы посмотреть ссылку ] Примеры кода из Java Developers Almanac
Шилдт, Г. Java 2 v.5.0. [Электрон. ресурс] [ Cкачайте файл, чтобы посмотреть ссылку ]
Гослинг, Дж., Арнольд, К. Язык программирования Java [Электрон. ресурс] [ Cкачайте файл, чтобы посмотреть ссылку ]

Синтаксис и семантика языка
Вопрос 1: Каков будет результат выполнения программы
1. public class Test {
2. public Test() {
3. }
4.
5. public static void main(String[] args) {
6. Test test = new Test();
7. int i = 5;
8. while(i = 5){
9. System.out.println(i++);
10. }
11. }
12.
}
1 Компилятор выдаст сообщение об ошибке в строке 8
2 На консоль будут последовательно выведены значения 01234
3 На консоль будут последовательно выведены значения 43210
4 Программа откомпилируется,но на консоль ничего выведено не будет
Ответ: Правильный ответ 1. В операторе while может быть использовано только булево значение. В данном случае используется оператор присваивания,а не сравнения, т.о. компилятор выдаст ошибку. Так как здесь предложено выбрать только один ответ остальные ответы неверные

Вопрос 2: Приведенная ниже программа должна вывести на консоль Hello World! Выберите строки, которые нужно модифицировать в вашей программе, что бы получить правильный результат.
1. public class Test {
2. public Test() {
3. }
4. public static void main(String[] args) {
5. Test test = new Test();
6. String [] arr = {"H","e","l","l","o","
","w","o","r","l","d","!"};
7. String result = "";
8. int i= 0;
9. for(;;;){
10. result += arr[i++];
11. }
12. System.out.println(result);
13. }
14. }
1 Заменить строку 9 на for(i = 0; i < arr.length;){
2 Заменить строку 9 на for(int int i = 0; i < arr.length;){
3 Заменить строку 9 на for(i = 0; i < arr.length;i++){
4 Заменить строку 9 на for(i = 1; i <= arr.length;i++){
Ответ: Правильный ответ 1
Ответ 2 не верен так как переменная i уже определена в методе main. Здесь следует еще раз напомнить, что область видимости переменной (если она объявлена в цикле for) будет ограничиваться лишь телом цикла. Однако в данном случае перемена с таким именем уже объявлена в теле метода и соответственно находится в той же области видимости. Если переменная была бы объявлена, как переменная класса, то этот код откомпилировался бы вполне успешно. Ответ 3 не является верным так как, увеличение значения i в теле цикла будет произведено дважды, т.о. на печать будут выведены лишь четные элементы массива. Ответ 4 не является верным по двум причинам. Первая – элементы массива нумеруются с 0, соответственно первым будет выбран второй элемент массива, вторая – когда выполнится условие окончания цикла, будет нарушена граница массива и будет вызвано исключение IndexOfBoundException

Вопрос 3: Какая строка будет выдана на консоль после выполнения фрагмента кода
приведенного ниже.
1. public class Test {
2. public Test() {
3. }
4. public static void main(String[] args) {
5. int i,j;
6. lab: for(i = 0; i < 6; i++){
7. for (j = 3; j > 1; j--){
8. if(i == j){
9. System.out.println(" " + j);
10. break lab;
11. }
12. }
13. }
14. }
15. }
1. 2345
2. 234
3. 3
4. 2
Ответ: Правильный ответ 2
Условие if в данном примере будет выполнено, когда переменные i и j будут равны 2. После чего на консоль будет выведено 2 и выполнится оператор break. Т.к. break содержит ссылку на метку, то будет прерван не текущий цикл (внутренний, по переменной j), а цикл по переменной i (внешний), т.о. образом выполнение программы будет прекращено.

Вопрос 4: Дан код:
String str=new String("Java");
int i=1;
char j=3;
System.out.println(str.substring(i,j));
В результате при компиляции и запускке будет выведено:
1. Выведено: Ja
2. Выведено: av
3. Выведено: ava
4. Ошибка: не существует метода substring(int,char)
Ответ:2
Правильный ответ 2. См. Гослинга в предоставленной литературе 5.6 Числовое расширение. Если кратко, Числовые расширения используются для того, чтобы приводить операнды числовой операции к общему типу так, чтобы действие могло выполняться. В некоторых операциях, которые дают значения числового типа, одноместное числовое расширение применяется к отдельному операнду:
Если операнд имеет тип byte, short или char, одноместное числовое расширение расширяет его до значения типа int расширяющим преобразованием 13 LINK \l "5.1.2"14(§5.1.2)15.
Иначе, одноместный числовой операнд остается как есть и не преобразовывается.

Вопрос 5: Какой метод следует использовать, чтобы обнаружить позицию буквы v в строке str= "Java"?
1. mid(2,str);
2. str.charAt(2);
3. str.indexOf('v');
4. indexOf(str,'v');
Ответ: 3
Для решения этой или подобной задачи советую смотреть документацию по JAVA, представленной, например, по адресу [ Cкачайте файл, чтобы посмотреть ссылку ]. Там описывается какие функции какие значения возвращают для все стандартных классов платформы JAVA SE.


Вопрос 6: Дан код:
String str="ava";
char ch='J';
ch+=str;
System.out.println(ch);
В результате при компиляции и запуска будет выведено:
1. Java
2. ava
3. avaJ
4. J
5. Ошибка во время компиляции
Ответ: 5. Не определена операция += для char String. И String не может привести к int и char к String.

Вопрос 7:
Что будет результатом компиляции и выполнения следующего кода?
StringBuffer s= new StringBuffer("You Java");
s.insert(2, "like ");
System.out.print(s);

1. Yolike u Java
2. You like Java
3. Ylike ou Java
4. You Java like
5. Ошибка компиляции: метод insert() не объявлен для класса String-Buffer
Ответ: 1. Советую посмотреть справку по JAVA для StringBuffer. Класс StringBuffer является близнецом класса String, но, в отличие от последнего, содержимое и размеры объектов класса StringBuffer можно изменять. Метод insert в нём определён, индексирование для Java стандартное, т.е. с нуля.

Вопрос 8: Дан код:
public class Quest6 {
public static void main(String[] args){
int a[] = new int[]{1,2,3,};
System.out.print(a[1]);
} }
Что будет выведено при попытке компиляции и запуска программы?
1. Ошибка компиляции: не определен размер массива
2. Ошибка времени выполнения
3. Выведено: 1
4. Выведено: 2
5. Ошибка компиляции: неправильная инициализация
Ответ: 4
Если ошибка синтаксиса должно было бы быть 1, если во времени выполнение непозволительные аргументы или с неопределённой ссылкой -2, в данном случае ошибок нет.

Вопрос 9: Дан код:
public class Quest8{
static int j=2;
public static void result(int i){
i *= 10;
j += 2;
}
public static void main(String[] args){
char i = ’1’;
result(i);
System.out.println(i+" "+j);
} }
Что будет выведено при попытке компиляции и запуска программы?
1. 1 2
2. 10 2
3. Ошибка: параметр метода result() не сочетается с передаваемой переменной
4. 10 4
5. 1 4
Ответ: 5. Третий ответ неверен, т.к. char приводится к int (в этом его особенность и уникальность). 1(char) переводится к 1, ну а j прибавляется в функции ещё 2(2+2), а то что она static не должно смущать, потому как она как любая другая статическая переменная будет одна для всех классов, но изменять её значение можно.

Вопрос 10: Дан код:
public class Quest {
{System.out.print("1");}
static{System.out.print("2");}
Quest(){System.out.print("3");}
public static void main(String[] args) {
System.out.print("4");
} }
В результате при компиляции и запуске будет выведено:
1. 34
2. 24
3. 14
4. 4
5. 1234
6. 234
Ответ: 2. При запуске приложения выполняются только статические логические блоки класса приложения и тело метода main().

Вопрос 11: Какие из следующих утверждений истинные?
1. Частные методы не могут быть перегружены
2. Переопределенный метод не может включать исключения не обрабатываемые в базовом классе
3. Методы, объявленные как final, не могут быть переопределены
4. Статические методы не могут быть переопределены
Ответ: 3.

Вопрос: Дан код:
class Base {}
class A extends Base {}
public class Quest{
public static void main(String[] args){
Base b = new Base();
A ob = (A) b;
} }
В результате при компиляции и запуске будет выведено:
1. Ошибка во время выполнения
2. Ничего: компиляция и выполнение без ошибок
3. Ошибка во время компиляции
Ответ: 3. Во время выполнения при попытке преоббразования с сужением типа будет сгенерировано исключение ClassCastException

Вопрос 12: Дан код:
abstract class QuestBase {
abstract void show();
static int i;
}
public class Quest2 extends QuestBase {
public static void main(String[] args){
boolean[] a = new boolean[3];
for(i = 0; i < a.length; i++)
System.out.print(“ ” + a[i]);
} }
В результате при компиляции и запуске будет выведено:
1. Ошибка времени компиляции: Quest2 должен быть объявлен как abstract
2. Ошибка времени выполнения: IndexOutOfBounds
3. true true true
4. false false false
5. Ошибка: массив a использован прежде, чем проинициализирован
Ответ: 1
Код не будет откомпилирован, так как подкласс наследует абстрактный класс и при этом не реализует его абстрактный метод м сам не объявлен как абстрактный

Вопрос 13: Какие из объявлений корректны, если:
class Outer{
class Inner{
} }
1. new Outer.Inner();
2. Outer.new Inner();
3. new Outer.new Inner();
4. new Outer().new Inner()
5. Outer.Inner();
6. Outer().Inner()
7. Ни одно из приведенных
Ответ: 4
Объявить объект внутреннего(нестатического) класса можно, только предварительно создав объект внешнего класса. Конструкторы обоих классов должны вызываться так же, как и для всех других классов, т.е. С помощью оператора new.

Вопрос 14: Что будет выведено в результате компиляции и выполнения следующего кода:
abstract class Abstract {
abstract Abstract meth();
}
class Owner {
Abstract meth() {
class Inner extends Abstract {
Abstract meth() {
System.out.print("Inner ");
return new Inner();
} }
return new Inner();
} }
public abstract class Quest4 {
public static void main(String a[]) {
Owner ob = new Owner();
Abstract abs = ob.meth();
abs.meth();
} }
1. Inner
2. Inner Inner
3. Inner Inner Inner
4. Compile time error
5. Runtime error
6. Ошибка компиляции из-за двойного объявления meth() в классе Owner
Ответ: 1
В результате выполнения кода Owner ob = new Owner(); будет создан объект Owner. Его метод meth() создаст объкт типа Inner в результате выполнения кода Abstract abs = ob.meth(); При его выполнении на консоль ничего выведено не будет, так как метод meth() класса Inner, выводящий на консоль строку inner, будет вызван только один раз командой abs.meth()

Вопрос 15: Корректен ли следующий код? Если нет, то какие исправления можно предложить?
byte b[]={1, 2, 3};
Object o=b;
o=new String[]{“”, “a”, “b”};
String s[]=o;
Ответ: Нет. В 4 строке делается попытка неявного сужения типов от Object к
String[]. Такое действие нужно делать явно:
String s[]=(String[])o;

Вопрос 16: Корректно ли следующее обращение к переменной x?
public class Test {
static void perform() {
...
}
private Test x;
public static void main(String s[]) {
x.perform(); // корректно ли это выражение?
}
}
Ответ: Нет, не корректно. Хотя при обращении к статическим элементам через
имя переменной, используется лишь ее тип, а не значение, в данном
примере производится попытка обратиться к динамической переменной
из статического метода, чего делать нельзя, несмотря на то, что для
вычисления выражения требуется лишь тип переменной.


Вопрос 17: Можно ли при переопределении некоторого абстрактного метода perform()
использовать выражение super.perform()?
Ответ: Нет, выражение super.perform() означает полноценный вызов
родительского метода, что невозможно, если у него отсутствует тело, что
верно для абстрактных методов.

Вопрос 18
Как реализованы в классе Object методы equals(), toString(), hashCode() ?
Ответ:В классе Object методы equals(), toString() и hashCode() имеют следующие
реализации:
equals() – возвращает true, если ссылки на объекты совпадают
toString() – возвращает строку, которая составляется следующим образом:
название класса, символ @’, значение, возвращаемое вызовом метода
hashCode(), представленное в шестнадцатеричном виде
hashCode() – имеет native реализацию, возвращающую адрес, по которому
хранится объект.

Вопрос 19
Какие действия необходимо предпринять для установления TCP соединения между
двумя Java-приложениями?
Ответ: Во-первых, на стороне сервера надо создать экземпляр класса Server-
Socket с указанием порта, и затем вызвать у этого объекта метод accept().
При входе в этот метод поток исполнения приостанавливает свою работу
в ожидании подключения клиента.
Клиенту необходимо создать экземпляр класса Socket с указанием IP-
адреса и порта сервера. После успешного выполнения конструктора на
стороне сервера метод accept() вернет экземпляр класса Socket для
взаимодействия двух приложений.

Вопрос 20: Какие объекты могут быть клонированы?
Ответ: Если клонирование производится встроенным методом Object.clone(), то
такие классы необходимо специальным образом помечать, указывая, что
они реализуют интерфейс Cloneable. Кроме этого, класс может
переопределить метод clone() собственным образом, и обойтись без этого
интерфейса
Создание визуальных приложений
Вопрос 1
Дан код
import java.awt.*;
public class Quest2 extends Frame{
Quest2(){
Button yes = new Button("YES");
Button no = new Button("NO");
add(yes);
add(no);
setSize(100, 100);
setVisible(true);
}
public static void main(String[] args){
Quest2 q = new Quest();
} }
В результате при компиляции и запуска будет выведено:
a Две кнопки рядом, занимающие весь фрейм, YES слева и NO справа
b Одна кнопка YES, занимающая целый фрейм
c Одна кнопка NO, занимающая целый фрейм
d Две кнопки наверху фрейма, YES и NO
Ответ: с
Пояснение: по умолчанию у Frame менеджер компоновки BorderLayout а у BorderLayout если не указан второй аргумент, то элемент является BorderLayout.CENTER.

Вопрос 2
Какой менеджер компоновок размещает компоненты в таблице с ячейками равного размера?
a. FlowLayout
b. GridLayout
c. BorderLayout
d. CardLayout
Ответ: b
FlowLayout – менеджер поточной компоновки. CardLayout создает вкладки, содержимое которых отображается при выполнении щелчка на заголовке. BorderLayout позволяет позиционировать элементы в областях фиксированного размера, граничащих со сторонами фрейма, которые обозначаются параметрами: NORTH, SOUTH, EAST, WEST. Остальное пространство обозначается как CENTER. GridLayout разделяет фрейм на заданное количество рядов и колонок.

Вопрос 3
Какое выравнивание устанавливается по умолчанию для менеджера размещений FlowLayout?
а. Указывается явно
b. FlowLayout.RIGHT
c. FlowLayout.LEFT
d. FlowLayout.CENTER
e. FlowLayout.LEADING
Ответ: c

Вопрос 4
Cколько кнопок будет выведено в апплет:
import java.applet.*;
import java.awt.*;
public class Quest4 extends Applet{
Button b = new Button("Yes");
public void init(){
add(b);
add(b);
add(b);
add(new Button("No"));
add(new Button("No"));
add(new Button("No"));
}}
a. 1 кнопка с надписью ''Yes'' и 1 кнопка с надписью ''No''
b. 1 кнопка с надписью ''Yes'' и 3 кнопки с надписью ''No''
c. 3 кнопки с надписью ''Yes'' и 1 кнопка с надписью ''No''
d. 3 кнопки с надписью ''Yes'' и 3 кнопки с надписью ''No''
Ответ b
Пояснение: Команда add(b), вызванная во второй раз, пытается добавить на аплет уже существующий там объект. Команда add(new Button("No")) каждый раз добавляет новый объект


Вопрос 5
Объект JСheckBox объявлен следующим образом:
JCheckBox ob = new JCheckBox();
Какая из следующих команд зарегистрирует его в блоке прослушивания событий?
a. addItemListener(this);
b. addItemListener();
c. ни одна из приведенных
d. ob.addItemListener();
e. ob.addItemListener(this);
Ответ: e
Пояснение: Метод всегда вызывается объектом, который необходимо зарегистрировать. В качестве параметра должен передаваться объект приложения или аплета, в котором размещается данный компонент, если он реализует соответствующий интерфейс .

Вопрос 6
Что будет выведено в результате компиляции и выполнения следующего кода?
import java.awt.*;
class Quest5 extends Thread implements Runnable{
public static void main(String[] args) {
Component btn = new Button("Кнопка 1");
System.out.println(((Button) btn).getLabel());
} }
a. Кнопка 1
b. Ошибка компиляции: Quest5 должен наследоваться от Applet
c. Ошибка компиляции: не определен метод run() интерфейса
d. Ошибка компиляции: ссылка на Component не может быть инициализирована объектом Button
e. Ошибка времени выполнения
f. Ничего не будет выведено
Ответ: a
Пояснение: Объекты из пакета AWT могут объявляться и вызывать свои методы из любых приложений

Вопрос 6
Дан код:
< applet code=MyApplet.class width=200 height=200>
< param name=count value=5>
< /applet>
Какой код читает параметр count в переменную i?
a. int i = getIntParameter(''count'');
b. int i = getParameter(''count'');
c. int i = new Integer(getIntParameter(''count'')).intValue();
d. int i = new Integer(getParameter(''count''));
e. int i = new Integer(getParameter(''count'')).intValue();
Ответ: e

Вопрос 7
В пользовательском методе show() был изменен цвет фона (background) апплета. Какой метод должен быть вызван, чтобы это было визуализировано?
a. draw()
b. start()
c. repaint()
d. setColor()
e. setbgcolor()
Ответ: c
Пояснение: Для того чтобы изменения цвета фона стали видны пользователю, требуется перересовка всего атлета вызовом метода paint(). Это действие можно выполнить, вызвав методы repaint() или update().

Вопрос 8
Выбрать необходимое условие принадлежности класса к апплетам?
a. Наследник класса Applet и у него должен отсутствовать метод main()
b. Наследник класса Applet или его подкласса
c. Наследник класса Applet и в нем необходимо переопределить унаследованный от класса Applet метод paint()
d. Наследник класса Applet и в нем необходимо переопределить унаследованный от класса Applet метод init()
e. Наследник класса Applet и все его методы должны быть объявлены со спецификатором public
Ответ: b

Вопрос 9
Дан код:
import java.awt.*;
import java.awt.event.*;
public class Quest3 extends Frame implements WindowListener{
public Quest3(){
setSize(300,300);
setVisible(true);
}
public void windowClosing(WindowEvent e){
System.exit(0);
}
public static void main(String args[]){
Quest3 q = new Quest3 ();
} }
Что будет выведено в результате компиляции и запуска?
a. Ошибка компиляции
b. Компиляция и запуск с выводом пусого фрейма
c. Компиляция без запуска
d. Ошибка времени выполнения
Ответ: a
Пояснение: Попытка компилировать данный код приведёт к ошибке вследствии того, что часть методов интерфейса WindowListener не реализована в классе Quest3

Вопрос 10
Дан код:
class Quest implements Runnable{
int i=0;
public int run(){
System.out.println("i="+ ++i);
return i;
}}
public class Quest1 {
public static void main(String[] args) {
Quest ob = new Quest();
ob.run();
}}
В результате компиляции и запуска будет выведено:
a. Ошибка компиляции: неправильно определен метод run()
b. Ошибка времени выполнения: поток запускается методом start()
c. Ошибка компиляции: Объект ob нужно создавать, используя конструктор класса Thread.
d. i=1
e. i=0
Ответ: a
Пояснение: Объект потока создаётся только после вызова конструктора класса Thread или его подкласса, но к ошибке компиляции создание такого объкта, как в примере, не приведёт. Поток всегда запускается вызовом метода start(). Результатом же вызова метода run() будет выполнение кода метода run, никак не связанное с потоком. В данной ситуации ошибка компиляции произойдёт из-за того, что сигнатура метода run() в интерфейсе Runnable не совподает с его реализацией в классе Quest, т.е. метод не реализован и класс Quest должен быть объявлен как abstract

Вопрос 11
Дан код:
class Quest5 extends Thread {
Quest5 () { }
Quest5 (Runnable r) { super(r); }
public void run() {
System.out.print("YES ");
}
public static void main(String[] args) {
Runnable r = new Quest5(); //1
Quest5 t = new Quest5(r); //2
t.run();
} }

В результате компиляции и запуска будет выведено:
a. YES YES
b. Ошибка компиляции в строке //1.
c. Ошибка компиляции в строке //2.
d. YES
Ответ: d
Пояснение: При запуске приложения будет создано два потока r и t, но стартует только второй. Поток t инициирован с использованием ссылки на первый поток. Это обстоятельство в данном контексте не оказывает влияния на выполнение второго потока. В итоге метод run() будет вызван только один раз.

Вопрос 12
Дан код:
import java.util.*;
class Quest4 {
public static void main (String args[]) {
Object ob = new HashSet();
System.out.print((ob instanceof Set)+",");
System.out.print(ob instanceof SortedSet);
}}

Что произойдет при попытке компиляции и запуска программы?
a. true, false
b. true, true
c. false, true
d. false, false
e. ничего из вышеперечисленного
Ответ: a

Заголовок 1 Заголовок 2 Заголовок 3 Заголовок 415

Приложенные файлы

  • doc 23933673
    Размер файла: 537 kB Загрузок: 0

Добавить комментарий