Escolar Documentos
Profissional Documentos
Cultura Documentos
Introduo Programao II
Lio 3
Tcnicas Avanadas de Programao
JEDITM
Autor Rebecca Ong Equipe Joyce Avestro Florence Balagtas Rommel Feria Rebecca Ong John Paul Petines Sun Microsystems Sun Philippines
Sistemas Operacionais Suportados NetBeans IDE 5.5 para os seguintes sistemas operacionais: Microsoft Windows XP Profissional SP2 ou superior Mac OS X 10.4.5 ou superior Red Hat Fedora Core 3 Solaris 10 Operating System (SPARC e x86/x64 Platform Edition) NetBeans Enterprise Pack, poder ser executado nas seguintes plataformas: Microsoft Windows 2000 Profissional SP4 Solaris 8 OS (SPARC e x86/x64 Platform Edition) e Solaris 9 OS (SPARC e x86/x64 Platform Edition) Vrias outras distribuies Linux Configurao Mnima de Hardware Nota: IDE NetBeans com resoluo de tela em 1024x768 pixel Sistema Operacional Microsoft Windows Linux Solaris OS (SPARC) Solaris OS (x86/x64 Platform Edition) Mac OS X Processador 500 MHz Intel Pentium III workstation ou equivalente 500 MHz Intel Pentium III workstation ou equivalente UltraSPARC II 450 MHz AMD Opteron 100 Srie 1.8 GHz PowerPC G4 Memria 512 MB 512 MB 512 MB 512 MB 512 MB HD Livre 850 MB 450 MB 450 MB 450 MB 450 MB
Configurao Recomendada de Hardware Sistema Operacional Microsoft Windows Linux Solaris OS (SPARC) Solaris OS (x86/x64 Platform Edition) Mac OS X Processador 1.4 GHz Intel Pentium III workstation ou equivalente 1.4 GHz Intel Pentium III workstation ou equivalente UltraSPARC IIIi 1 GHz AMD Opteron 100 Series 1.8 GHz PowerPC G5 Memria 1 GB 1 GB 1 GB 1 GB 1 GB HD Livre 1 GB 850 MB 850 MB 850 MB 850 MB
Requerimentos de Software NetBeans Enterprise Pack 5.5 executando sobre Java 2 Platform Standard Edition Development Kit 5.0 ou superior (JDK 5.0, verso 1.5.0_01 ou superior), contemplando a Java Runtime Environment, ferramentas de desenvolvimento para compilar, depurar, e executar aplicaes escritas em linguagem Java. Sun Java System Application Server Platform Edition 9. Para Solaris, Windows, e Linux, os arquivos da JDK podem ser obtidos para sua plataforma em http://java.sun.com/j2se/1.5.0/download.html Para Mac OS X, Java 2 Plataform Standard Edition (J2SE) 5.0 Release 4, pode ser obtida diretamente da Apple's Developer Connection, no endereo: http://developer.apple.com/java ( necessrio registrar o download da JDK). Para mais informaes: http://www.netbeans.org/community/releases/55/relnotes.html
Introduo Programao II
JEDITM
Auxiliadores especiais
Reviso Geral do texto para os seguintes Pases:
Brasil Tiago Flach Guin Bissau Alfredo C, Bunene Sisse e Buon Olossato Quebi ONG Asas de Socorro
Coordenao do DFJUG
Daniel deOliveira JUGLeader responsvel pelos acordos de parcerias Luci Campos - Idealizadora do DFJUG responsvel pelo apoio social Fernando Anselmo - Coordenador responsvel pelo processo de traduo e reviso, disponibilizao dos materiais e insero de novos mdulos Regina Mariani - Coordenadora responsvel pela parte jurdica Rodrigo Nunes - Coordenador responsvel pela parte multimdia Srgio Gomes Veloso - Coordenador responsvel pelo ambiente JEDITM (Moodle)
Agradecimento Especial
John Paul Petines Criador da Iniciativa JEDITM Rommel Feria Criador da Iniciativa JEDITM
Introduo Programao II
JEDITM
1. Objetivos
Esta lio introduz algumas tcnicas avanadas de programao. Veremos detalhes sobre recurso e tipos de dados abstratos. Ao final desta lio, o estudante ser capaz de: Definir e aplicar recurso na programao Diferenciar entre pilhas e filas Implementar pilhas e filas seqenciais Implementar pilhas e filas encadeadas Usar as classes Collection existentes
Introduo Programao II
JEDITM
2. Recurso
2.1. O que recurso?
Recurso uma tcnica poderosa para resoluo de problemas que pode ser aplicada quando a natureza do problema exigir repetio. Ainda que estes tipos de problemas sejam solucionveis utilizando a iterao (ex. uso de instrues de repetio como for, while e do-while). De fato, a iterao uma ferramenta mais eficiente se comparada recurso, mas a recurso prov uma soluo mais elegante para o problema. Na recurso, permitido aos mtodos chamarem a si mesmos. O dado passado no mtodo como argumento armazenado temporariamente em uma pilha antes que a chamada do mtodo seja completada.
Com a iterao, o processo termina quando a condio do lao falha. No caso de se utilizar recurso, o processo finalizado uma vez que for encontrada uma condio particular em que este seja satisfeito. Por exemplo, como observado na definio recursiva do fatorial, o caso mais simples quando a entrada o 1. O 1 para esse problema o caso bsico. O uso da iterao e da recurso pode em ambos os casos levar a laos infinitos se eles no forem usados corretamente. A vantagem da iterao sobre a recurso o desempenho. A iterao mais rpida se comparada recurso. Na recurso ocorre a passagem de parmetros para o mtodo, e isto pode consumir algum tempo de CPU. Entretanto, a recurso encoraja as boas prticas da engenharia de software pois, usualmente, resulta em um cdigo mais fcil de compreender e promove a reutilizao de uma soluo previamente implementada. Escolher entre iterao e recurso a melhor maneira de balancear um bom desempenho e uma boa engenharia de software.
Introduo Programao II 5
JEDITM
Introduo Programao II
JEDITM
Na soluo, 10 equivalente a 12 base 8. Aqui est outro exemplo. A entrada decimal 165 para ser convertida em base 16.
165 equivalente ao valor A5 na base 16. Note: A=10. Essa a soluo iterativa para esse problema. class DecToOthers { public static void main(String args[]) { int num = Integer.parseInt(args[0]); int base = Integer.parseInt(args[1]); printBase(num, base); } static void printBase(int num, int base) { int rem = 1; String digits = "0123456789abcdef"; String result = ""; /* o passo iterativo */ while (num!=0) { rem = num%base; num = num/base; result = result.concat(digits.charAt(rem)+""); } /* Imprimindo o inverso do resultado */ for(int i = result.length()-1; i >= 0; i--) { System.out.print(result.charAt(i)); } } } Agora, essa a recurso equivalente da soluo acima. class DecToOthersRecur { static void printBase(int num, int base) { String digits = "0123456789abcdef"; /* Passo recursivo*/ if (num >= base) { printBase(num/base, base); } /* Caso bsico: num < base */ System.out.print(digits.charAt(num%base)); } public static void main(String args[]) { int num = Integer.parseInt(args[0]); int base = Integer.parseInt(args[1]); printBase(num, base); } } Para atingir uma melhor compreenso do cdigo, observe o conjunto de entrada. Aqui esto alguns exemplos de entrada.
Introduo Programao II 7
JEDITM
a) Num: 10, base: 2 1010 b) Num: 100, base: 8 144 c) Num: 200, base: 9 242
Introduo Programao II
JEDITM
3.2. Pilhas
Uma pilha um conjunto de elementos de dados onde manipulao desse elemento permitida somente no topo (top) da pilha. A pilha uma coleo de dados ordenado o qual a disciplina ltimo a entrar o primeiro a sair (do ingls: last in, first out - LIFO) imposta. Pilhas so usadas para uma variedade de aplicaes como o reconhecimento de padres e a converso entre as notaes infixa, ps-fixa e pr-fixa. As duas operaes associadas s pilhas so a de adicionar (push) e a de remover (pop). Push simplesmente insere o elemento no topo da pilha e, por outro lado, pop remove o elemento do topo da pilha. Para compreender como as pilhas trabalham, imagine adicionar ou remover um prato de uma pilha de pratos sua natureza, instintivamente, sugere que seja removido somente o que est no topo da pilha porque do contrrio, existe um perigo de que todos os pratos caiam. Aqui est um exemplo ilustrando como uma pilha funciona. n-1 ... 6 5 4 3 2 1 0
Top
bottom
A pilha est cheia se o topo alcana a clula n-1. Se o topo igual a n-1, o indcio de que a pilha est cheia.
3.3. Filas
A fila outro exemplo de TDA. Fila uma coleo ordenada de elementos o qual prima pela disciplina primeiro a entrar o primeiro a sair (do ingls: first-in, first-out - FIFO). As aplicaes da fila incluem escalonamento de servios do sistema operacional, sorteamento topolgico e o grafo transversal. Enfileirar (enqueue) e Desenfileirar (dequeue) so operaes associadas com as filas. Enqueue se refere ao modo de inserir no final da fila e, por outro lado, dequeue, o de remover o elemento do incio da fila. Para recordar como uma fila trabalha, pense no significado literal de uma fila uma linha. Suponha uma fila de um banco e estamos esperando para ser atendido. Se uma pessoa chegar ela dever ficar no final da fila. Caso contrrio haveria, provavelmente, algum desentendimento. Essa a maneira que funciona a insero (enqueue). Dessa forma,
Introduo Programao II 9
JEDITM
necessrio que a primeira pessoa seja atendida para somente depois ser a vez da segunda pessoa da fila, e assim sucessivamente. Essa a maneira que trabalha a remoo (dequeue). Aqui est um exemplo de como a fila funciona. 0 1 2 Eve front 3 Jayz 4 KC 5 Jojo 6 Toto 7 Kyla 8 DMX end 9 ... Insere Deleta n-1
A fila est vazia se o final menor do que o incio. Por outro lado, a fila est cheia quando o final igual a n-1.
/* Recebe o tamanho inicial da pilha */ public StackDemo(int size) { memSpace = new int[size]; limit = size; } /* Adiciona um elemento */ public boolean push(int value) { top++; if (top < limit) { memSpace[top] = value; } else { top--; return false; } return true; } /* Remove um elemento retornando a quantidade de elementos restantes * public int pop() { int temp = -1; if (top >= 0) {
Introduo Programao II 10
JEDITM
} public static void main(String args[]) { StackDemo stackDemo = new StackDemo(3); stackDemo.push(1); stackDemo.push(2); stackDemo.push(3); stackDemo.push(4); System.out.println(stackDemo.pop()); System.out.println(stackDemo.pop()); System.out.println(stackDemo.pop()); System.out.println(stackDemo.pop()); }
Introduo Programao II
11
JEDITM
Figura 3: Um n
Aqui est um exemplo de uma lista encadeada no vazia com trs ns.
Esta uma classe que demonstra como implementar um n. Pode ser usada para criar uma lista encadeada: class Node { int data; /* dados inteiro contidos em um n */ Node nextNode; /* o prximo n da lista */ } class NodeDemo { public static void main(String args[]) { Node emptyList = null; /* cria uma lista vazia */ /* N cabea para o primeiro n da lista */ Node head = new Node(); /* inicializa o primeiro n da lista */ head.data = 5; head.nextNode = new Node(); head.nextNode.data = 10; /* marca nulo para o final de fila */ head.nextNode.nextNode = null; /* imprime elementos da lista */ Node currNode = head; while (currNode != null) { System.out.println(currNode.data); currNode = currNode.nextNode; } } } Trecho da execuo do mtodo TestNode.
Introduo Programao II
12
JEDITM
Introduo Programao II
13
JEDITM
Introduo Programao II
14
JEDITM
Introduo Programao II
15
JEDITM
Os fundamentos dos tipos de dados abstratos mostrados como o bsico das listas encadeadas, pilhas e filas. Esses tipos de dados abstratos j esto implementados e includos no Java. As classes pilha e lista encadeada esto disponveis para uso sem exigir um completo entendimento desses conceitos. Entretanto, como cientista da computao, importante que compreendamos os tipos de dados abstratos. Na verdade, uma explanao detalhada foi dada na sesso anterior. Com a liberao da verso do J2SE 5.0, a interface de Filas ( Queue) foi disponibilizada. Para mais detalhes dessas classes e interfaces, por favor, veja a documentao da Java API. Java prov outras colees de classes e interfaces, as quais esto disponveis no pacote java.util. Exemplos de classes Collections incluem LinkedList, ArrayList, HashSet e TreeSet. Essas classes so implementaes de diferentes colees e interfaces. A hierarquia das colees de interface inicia-se com a interface Collection. Uma Collection apenas um grupo de objetos que so conhecidos e seus elementos. Colees podem permitir duplicidades e no exigir uma ordem especfica. O SDK no prov nenhuma implementao dessas interfaces, mas sub-interfaces diretas, a interface Set e a interface List esto disponveis. Agora, qual a diferena entre essas duas interfaces? Um Set uma coleo no ordenada que no contm duplicidade. Por outro lado, um List uma coleo ordenada de elementos onde duplicidades so permitidas. HashSet, LinkedHashSet e TreeSet so algumas implementaes de classes conhecidas da interface Set. ArrayList, LinkedList e Vector so algumas implementaes de classes conhecidas da interface List. <Interface Raiz> Collection <interface> Set <Implementada pelas classes> HashSet LinkedHashSet TreeSet <interface> List <Implementada pelas classes> ArrayList LinkedList Vector
A seguir est uma lista dos mtodos de uma coleo providas na API Collections do Java 2 Platform SE v1.4.1. Em Java 2 Platform SE v1.5.0, esses mtodos foram modificados para acomodar tipos genricos. Tipos genricos no sero discutidos ainda. aconselhvel considerar esses mtodos primeiramente. Recomendo que os novos mtodos da coleo sejam consultados uma vez que compreenda os tipos genricos, os quais so discutidos no prximo captulo. Mtodos da Collection public boolean add(Object o) Insere o objeto enviado como argumento na coleo. Retorna verdadeiro se o objeto foi adicionado com sucesso. public void clear() Remove todos os elementos da coleo. public boolean remove(Object o) Remove o objeto enviado como argumento na coleo. Retorna verdadeiro se o objeto se o objeto foi encontrado e removido com sucesso. public boolean contains(Object o) Retorna verdadeiro se a coleo contm o objeto enviado no argumento. public boolean isEmpty() Retorna verdadeiro se a coleo estiver vazia. public int size()
Introduo Programao II
16
JEDITM
Retorna o nmero de elementos na coleo. public Iterator iterator() Retorna um objeto do tipo Iterator que permite percorrer os elementos da coleo.
Tabela 4: Mtodos da classe Collection
Por favor, consulte a documentao da API para uma lista mais completa dos mtodos encontrados nas interfaces Collection, List e Set. Java SDK apresenta diversas formas de implementao de uma lista encadeada. A classe LinkedList contm mtodos que permitem que listas encadeadas sejam usadas como pilhas, filas ou algum outro TDA. O cdigo a seguir mostra como usar a classe LinkedList. import java.util.*; class LinkedListDemo { public static void main(String args[]) { LinkedList list = new LinkedList(); list.add(new Integer(1)); list.add(new Integer(2)); list.add(new Integer(3)); list.add(new Integer(1)); System.out.println(list + ", size = " + list.size()); list.addFirst(new Integer(0)); list.addLast(new Integer(4)); System.out.println(list); System.out.println(list.getFirst() + ", " + list.getLast()); System.out.println(list.get(2) + ", " + list.get(3)); list.removeFirst(); list.removeLast(); System.out.println(list); list.remove(new Integer(1)); System.out.println(list); list.remove(2); System.out.println(list); } } O ArrayList uma verso redimensionvel de um array. Ela implementa a interface List. Analise o cdigo a seguir. import java.util.*; class ArrayListDemo { public static void main(String args[]) { ArrayList al = new ArrayList(2); System.out.println(al + ", size = " + al.size()); al.add("R"); al.add("U"); al.add("O"); System.out.println(al + ", size = " + al.size()); al.remove("U"); System.out.println(al + ", size = " + al.size()); ListIterator li = al.listIterator(); while (li.hasNext()) System.out.println(li.next()); Object a[] = al.toArray(); for (int i=0; i<a.length; i++) System.out.println(a[i]); }
Introduo Programao II
17
JEDITM
} O HashSet um tipo de implementao da interface Set que usa uma tabela hash. O uso de uma tabela hash permite buscar os elementos de forma fcil e rpida. A tabela usa uma frmula que determina onde um objeto est armazenado. HashSet foi utilizado na seguinte classe: import java.util.*; class HashSetDemo { public static void main(String args[]) { HashSet hs = new HashSet(5); System.out.println(hs.add("one")); System.out.println(hs.add("two")); System.out.println(hs.add("one")); System.out.println(hs.add("three")); System.out.println(hs.add("four")); System.out.println(hs.add("five")); System.out.println(hs); } } O TreeSet uma implementao da interface Set que usa uma rvore. Esta classe assegura que o conjunto ser organizado em uma ordem ascendente. Observe como a classe TreeSet foi usada no seguinte cdigo fonte. import java.util.*; class TreeSetDemo { public static void main(String args[]) { TreeSet ts = new TreeSet(); ts.add("one"); ts.add("two"); ts.add("three"); ts.add("four"); System.out.println(ts); } }
Introduo Programao II
18
JEDITM
Instituto CTS Patrocinador do DFJUG. Sun Microsystems Fornecimento de servidor de dados para o armazenamento dos vdeo-aulas. Java Research and Development Center da Universidade das Filipinas Criador da Iniciativa JEDITM. DFJUG Detentor dos direitos do JEDITM nos pases de lngua portuguesa. Banco do Brasil Disponibilizao de seus telecentros para abrigar e difundir a Iniciativa JEDITM. Politec Suporte e apoio financeiro e logstico a todo o processo. Borland Apoio internacional para que possamos alcanar os outros pases de lngua portuguesa. Instituto Gaudium/CNBB Fornecimento da sua infra-estrutura de hardware de seus servidores para que os milhares de alunos possam acessar o material do curso simultaneamente.
Introduo Programao II
19