clp-2011-01

Propaganda
Características das Linguagens de Programação - P2 – 04/07/2011
1a questão: O código a seguir é uma implementação – em desenvolvimento - de uma lista encadeada,
utilizando-se generics. Os métodos pickUpFIFOElement() e PickUpLIFOElement(), por esquecimento do
autor, não tratam a condição associada à lista vazia. Altere-os de forma a lançarem uma exceção
EmptyListException, no caso de tentarem retirar um elemento de uma lista vazia. Forneça também o
código associado à classe que implementa a exceção EmptyListException.
// lista encadeada → arquivo LinkedList.java
public class LinkedList <T> {
public Node<T> head;
public LinkedList() {
head = new Node<T> ();
head.link = head;
}
public void InsertElement(Node<T> avail) {
// insert new element after the first node.
avail.link = head.link;
head.link = avail;
}
public T pickUpFIFOElement() {
// recupera o primeiro elemento que foi inserido na lista.
Node<T> aux = head.link;
while (aux.link != head) {
aux = aux.link;}
return aux.info;
}
public T PickUpLIFOElement() {
// recupera o último elemento que foi inserido na lista.
Node<T> aux = head.link;
head.link = aux.link;
return aux.info;
}
}
// nodo da lista → arquivo Node.java
public class Node<T> {
T info;
Node<T> link;
public Node() {
this.info = null;
link = null;
}
public Node(T info) {
this.info = info;
link = null;
}
}
2a questão: Inclua modificações no código da classe LinkedList apresentada na questão anterior de
modo que uma lista encadeada só armazene e recupere objetos que sejam instâncias de subclasses da
classe Number (encontrada na Java API).
3a questão: A codificação de um Action Listener em java compreende as seguintes etapas:
1. Declarar uma classe manipuladora de eventos e especificar que a classe ou implementa a
interface ActionListener ou extends (herda de) uma classe que implementa a interface
ActionListener .
2. Registrar uma instância da classe manipuladora de eventos como um listener dos eventos
gerados por um ou mais componentes.
3. Incluir o código que implementa a listener interface.
Considere o código da interface gráfica abaixo, que trata alguns eventos gerados pelo usuário ao
interagir com a mesma. Identifique (sublinhando) os comandos identificados com as etapas acima e
numere-os de acordo com a etapa correspondente.
package event
/*
* Beeper.java requires no other files.
*/
import
import
import
import
import
java.awt.*;
javax.swing.JFrame;
javax.swing.JPanel;
javax.swing.JButton;
javax.swing.JComponent;
import
import
import
import
java.awt.Toolkit;
java.awt.BorderLayout;
java.awt.event.ActionListener;
java.awt.event.ActionEvent;
public class Beeper extends JPanel
implements ActionListener {
JButton button;
public Beeper() {
super(new BorderLayout());
button = new JButton("Click Me");
button.setPreferredSize(new Dimension(200, 80));
add(button, BorderLayout.CENTER);
button.addActionListener(this);
}
public void actionPerformed(ActionEvent e) {
Toolkit.getDefaultToolkit().beep();
}
/**
* Create the GUI and show it. For thread safety,
* this method should be invoked from the
* event-dispatching thread.
*/
private static void createAndShowGUI() {
//Create and set up the window.
JFrame frame = new JFrame("Beeper");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Create and set up the content pane.
JComponent newContentPane = new Beeper();
newContentPane.setOpaque(true); //content panes must be opaque
frame.setContentPane(newContentPane);
//Display the window.
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
//Schedule a job for the event-dispatching thread:
//creating and showing this application's GUI.
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
4a questão: Considere os dois threads t1 e t2 da classe TwoThreads (incompleta). O thread t1
compreende as tarefas T1A e T1B e o thread t2 as tarefas T2C e T2D. As tarefas T1A e T2C, assim
como as tarefas T1B e T2D podem ser executadas concorrentemente. No entanto a tarefa T2D só pode
ser executada após o término da tarefa T1A. Insira um código de sua autoria na classe TwoThreads
para garantir esta sincronização.
Sugestão: Use Guarded blocks.
public class TwoThreads {
private class T1AB implements Runnable {
long param1;
T1AB(long param1) {
this.param1 = param1;
}
public void run() {
// início da execução da tarefa T1A
//...
// término da execução da tarefa T1A
//...
// início da execução tarefa T1B
//...
// término da execução da tarefa T1B
}
}
private class T2CD implements Runnable {
long param2;
T2CD(long param2) {
this.param2 = param2;
}
public void run() {
// início da execução da tarefa T2C
//...
// término da execução da tarefa T2C
//...
// início da execução tarefa T2D
//...
// término da execução da tarefa T2D
}
}
public void activateThreads (){
// cria o thread t1 e inicia a sua execução
Thread t1 = new Thread(new T1AB(143));
t1.start();
// cria o thread t2 e inicia a sua execução
Thread t2 = new Thread(new T2CD(247));
t2.start();
}
public static void main(String[] args) {
new TwoThreads().activateThreads();
}
}
5a questão: Quais as diferenças entre Abstract Classes e Interfaces em Java.
Boa Sorte!
Prof. Oscar Luiz Monteiro de Farias
Download