Prova Final de Características das Linguagens de Programação – 2008-02 Atenção: nas questões 1 e 3 , cada opção errada assinalada descontará uma opção corretamente assinalada! 1a questão (2 pontos): Considere o código abaixo: class SophisticatedForDemo { public static void main(String[] args){ int[] mynumbers = {1,2,3,4,5,6,7,8,9,10}; for (int item : mynumbers) { System.out.println("Count is: " + item); } } } Assinale apenas as alternativas corretas: a) b) Há apenas um um erro de sintaxe: em for (int item : mynumbers); Há dois erros de sintaxes: um em for (int item : mynumbers) e o outro em ("Count is: " + item); c) O array deveria obrigatoriamente ter sido declarado como int mynumbers[] = {1,2,3,4,5,6,7,8,9,10};; d) Se acrescentarmos o comando System.out.println(mynumbers.length); logo após o comando System.out.println("Count is: " + item); teremos um erro de compilação, pois a variável mynumbers.length deveria ter sido declarada imediatamente após class SophisticatedForDemo {; e) O loop for do código acima seria corretamente substituído por: for(int i=1; i<11; i++){ System.out.println(mynumbers[i]) }; f) Todas as afirmações anteriores são incorretas; 2a questão (2 pontos): Considere o código a seguir de um applet, denominado UpdateApplet, que mantém um thread para automaticamente atualizar o seu display em intervalos regulares. //package exploringjava.threads; public class UpdateApplet extends java.applet.Applet implements Runnable { private Thread updateThread; int updateInterval = 1000; public void run() { while ( true ) { try { Thread.sleep( updateInterval ); } catch (InterruptedException e ) { return; } repaint(); } } public void start() { if ( updateThread == null ) { updateThread = new Thread(this); updateThread.start(); } } public void stop() { if ( updateThread != null ) { updateThread.stop(); updateThread = null; } } } Usando o mecanismo de herança codifique um applet que,alternadamente, a intervalos de um segundo, desenhe círculos vermelhos e amarelos no terminal. Dica: O método Graphics.fillOval (int x, int y, int width, int height); desenha uma oval com a cor corrente. 3a questão (3 pontos): Considere o código abaixo, que implementa um servidor para jogar jogo da velha com diversos clientes simultaneamente. Assuma que o protocolo existente entre o cliente e o servidor consiste de uma descrição do jogo em seu estágio atual [já incluindo a jogada do cliente e/ou servidor, seguida de um caráter de <new line> (\n)]. Assinale apenas as afirmações corretas após o código que se segue. import java.net.*; import java.io.*; import java.util.*; public class ServidorJogoDaVelha { public static void main( String argv[] ) throws IOException { ServerSocket ss = new ServerSocket( Integer.parseInt(argv[0]) ); while ( true ) new JogoDaVelhaConnection( ss.accept() ); } } class JogoDaVelhaConnection extends Thread { Socket sock; JogoDaVelhaConnection ( Socket s ) { sock = s; setPriority( NORM_PRIORITY - 1 ); start(); } public void run() { try { OutputStream out = sock.getOutputStream(); String req = new DataInputStream(sock.getInputStream()).readLine; // processa a requisição do cliente, isto é, comandos para // "ler" a descrição atual do jogo // (já incluída a jogada do cliente), e analisá-la; // Repare que, no início do jogo, o cliente simplesmente // realiza a conexão – solicitando jogar // e não envia nenhuma descrição do jogo. // A descrição inicial do jogo é, então, enviada pelo // servidor ao cliente. .... .... // o servidor responde adequadamente, isto é, envia para o cliente // uma nova descrição do jogo (já incluída a jogada-resposta do // servidor) ... ... // algo como: // PrintStream(out).println (“representação simbólica de uma descrição do // jogo”); nova sock.close(); } catch ( IOException e ) { System.out.println( "I/O error " + e ); } } } Afirmações: 1. O servidor jamais sairá do loop iniciado pelo comando “while (true)”. 2. Todos os comandos deste servidor podem ser executados em “paralelo”, devido à presença de múltiplos threads de execução. 3. Caso só exista apenas um cliente e após findo o jogo deste único cliente com o servidor, será executado o comando “sock.close()”, que fechará o socket entre o cliente e o servidor, terminando, assim, a execução do servidor. 4. O comando “setPriority( NORM_PRIORITY - 1 );” indica que o atendimento a cada cliente terá uma prioridade diferente, para evitar que o servidor entre em “deadlock”, em virtude de não ter como atender a mais de um cliente com a mesma prioridade. 5. Apenas um cliente de cada vez poderá executar o trecho correspondente aos comandos: OutputStream out = sock.getOutputStream(); String req = new DataInputStream(sock.getInputStream()).readLine; 6. Apenas um cliente de cada vez poderá executar o trecho correspondente aos comandos: JogoDaVelhaConnection ( Socket s ) { sock = s; setPriority( NORM_PRIORITY - 1 ); start(); 7. Somente podem ser executados em paralelo no servidor, os commandos compreendidos pelo método “run()”. 8. Caso já exista um servidor atuando na porta indicada por “argv[0]” o loop while ( true ) new JogoDaVelhaConnection( ss.accept() ); } não será executado. 4a questão (3 pontos): Considere a public class LinkedList<E> constante da Java™ Platform Standard Ed. 6. Empregando o conceito de Generics, desenvolva um programa que use LinkedList<E> para criar duas listas encadeadas, uma contendo apenas objetos do tipo Integer e outra objetos do tipo String. Adicione pelo menos 3 objetos a cada lista. Depois use os métodos de LinkedList<E> para recuperar o primeiro elemento e o último elemento de cada lista. Por fim mostre os elementos recuperados na tela do seu terminal.