Задания к лабораторной работе №3
1. Создание приложения (к примеру «Записная книжка» или «Графический редактор») с использованием шаблона Abstract Factory/Абстрактная фабрика
2. Создания приложения с использованием библиотеки Jung, реализующего алгоритм генерации случайных графов( граф де-Бруйна)
3. Создание приложения (к примеру «Записная книжка» или «Графический редактор») с использованием шаблона Factory Method/Фабричный метод, Virtual Constructor
4. Создания приложения с использованием библиотеки Jung, реализующего алгоритм ПРИМА для построения минимального остового дерева
5. Создание приложения (к примеру «Записная книжка» или «Графический редактор») с использованием шаблона Builder/Строитель
6. Создания приложения с использованием библиотеки Jung, реализующего алгоритм генерации случайных графов (k-соседний граф)
7. Создание приложения (к примеру «Записная книжка» или «Графический редактор») с использованием шаблона Model-View-Controller(MVC)
8. Создания приложения с использованием библиотеки Jung, реализующего алгоритм генерации случайных графов (эвклидов граф)
9. Создание приложения (к примеру «Записная книжка» или «Графический редактор») с использованием шаблона Singleton/Одиночка
10. Создания приложения с использованием библиотеки Jung, реализующего алгоритм Дейкстры, не используя встроенный механизм библиотеки Jung
11. Создание приложения (к примеру «Записная книжка» или «Графический редактор») с использованием шаблона Composite/Компоновщик
|
|
12. Создания приложения с использованием библиотеки Jung, реализующего алгоритм построении минимального остового дерева (алгоритм Краскала)
13. Создание приложения (к примеру «Записная книжка» или «Графический редактор») с использованием шаблона Chain of Responsibility/Цепочка обязанностей
14. Создания приложения с использованием библиотеки Jung, реализующего алгоритм, вычисляющий среднее значение длины кратчайших путей из заданной вершины
15. Создание приложения (к примеру «Записная книжка» или «Графический редактор») с использованием шаблона Command/ Команда, Action, Transaction
16. Создания приложения с использованием библиотеки Jung, реализующего поиск Эйлерова пути в графе
17. Создание приложения (к примеру «Записная книжка» или «Графический редактор») с использованием шаблона State/Состояние, Objects for States
18. Создания приложения с использованием библиотеки Jung, реализующего алгоритм раскраски графа.
19. Создание приложения (к примеру «Записная книжка» или «Графический редактор») с использованием шаблона Strategy/Стратегия SimplePolicy
Вопросы по синтаксису языка и объектно-ориентированному программированию
Ниже перечисленные вопросы по сложности расположены в произвольном порядке (их упорядоченность по темам). Это связано с тем, что подразумевается, что студент к началу работы над разбором познакомился с языком и ему остаётся только углубить понимание специфики и конструкций языка, кроме того студент к моменту изучения языка JAVA изучал как процедурные языки (PASCAL, С), так и знакомился с объектно-ориентированными (С#). А значит нужно ориентироваться на отличия JAVA от других языков и на темы, а не сложность изложения. При этом рекомендуется в сложных вопросах при их разборе обращаться к дополнительной литературе, предоставленной в электронном виде для чтения, в частности разбор спецификации Гослинга (одного из создателей языка), книги по Java от компании SUN, «Философия JAVA» Брюса Эккеля. Также рекомендуются следующие электронные ресурсы и пособия:
|
|
1. http://javaalmanac.com/ Примеры кода из Java Developers Almanac
2. Шилдт, Г. Java 2 v.5.0. [Электрон. ресурс] http://bsu.iba.by/books/Java2v5.zip
Гослинг, Дж., Арнольд, К. Язык программирования Java [Электрон. ресурс] http://bsu.iba.by/books/goslingJava.zip
Синтаксис и семантика языка
Вопрос 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 расширяющим преобразованием (§5.1.2).
· Иначе, одноместный числовой операнд остается как есть и не преобразовывается.
Вопрос 5:Какой метод следует использовать, чтобы обнаружить позицию буквы v в строке str= "Java"?
1. mid(2,str);
2. str.charAt(2);
3. str.indexOf('v');
4. indexOf(str,'v');
Ответ:3
Для решения этой или подобной задачи советую смотреть документацию по JAVA, представленной, например, по адресу http://java.sun.com/javase/6/docs/api/. Там описывается какие функции какие значения возвращают для все стандартных классов платформы 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 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
Дата добавления: 2018-04-04; просмотров: 604; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!