Programação Orientada a Objetos com Java. Prof. Júlio Machado

Documentos relacionados
Algoritmos e Programação II. Coleções. Coleções. Baseado no material do Prof. Julio

Algoritmos e Programação 2. Objetos e Classes em Java. Classes. Revisão. Definições de classes incluem (geralmente):

Programação Orientada a Objetos

Sobrecarga. Algoritmos e Programação II. Aula 3 Sobrecarga

Orientação a Objetos AULA 09

Iteradores. Iteradores. Isabel Harb Manssour. Roteiro. Coleções

API e Coleções Java. Sérgio Luiz Ruivace Cerqueira

Vetores. IFSC/Florianópolis - Programação Orientada a Objetos + POO - prof. Herval Daminelli

Paradigmas de Programação. Java First-Tier: Aplicações. Orientação a Objetos em Java (I) Nomenclatura. Paradigma OO. Nomenclatura

Vetores. IFSC/Florianópolis - Programação Orientada a Objetos + POO - prof. Herval Daminelli

Array em Java. Figura 1 - Exemplo de um array de inteiros

Recursividade. Prof. Jesus José de Oliveira Neto

Prova 2 PMR3201 1o. semestre 2015 Prof. Thiago Martins

Programação Orientada a Objetos

Computação Eletrônica. Vetores e Matrizes. Prof: Luciano Barbosa. CIn.ufpe.br

Introdução a classes e objetos. Prof. Marcelo Roberto Zorzan Prof a. Rachel Reis

Algoritmos II prof. Daniel Oliveira

Lição 7 Array em Java

Introdução. Coleção HashMap Classe Java. Interesse

Coleções. Prof. Marcelo Roberto Zorzan

Prova 2 PMR3201 1o. semestre 2016 Prof. Thiago Martins

Classes e Objetos. Sintaxe de classe em Java

Linguagem de Programação III

Paradigmas da Programação PPROG. Linguagem JAVA. Contentores de Objetos

Java API. Giuliana Silva Bezerra

Variáveis Compostas. Vanessa Braganholo

Lista encadeada class No { Coleções. Enumeration. Lista encadeada (continuação) Enumeration Exemplo usando a classe Lista anterior

Agenda. O que é um array. Declaração de um array. Instanciação de um array. Acessando os elementos de um array. O tamanho de um array (length)

JAVA COLLECTIONS API: LISTAS

Tema 7. Colecções AULA TEÓRICA 6. Listas: ArrayList, LinkedList, Vector Ø Criação Ø Manipulação

Programação Orientada a Objetos. Collections - Java

Instituto Federal de Educação, Ciência e Tecnologia da Bahia Campus Irecê Disciplina: Linguagem Técnica II Prof o Jonatas Bastos

Heaps. Estrutura de Dados. Universidade Federal de Juiz de Fora Departamento de Ciência da Computação 1 / 35

Programação Orientada a Objetos com Java. Prof. Júlio Machado

Notas de Aula 07: vetores de objetos e coleções

Tratamento de Exceções

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

Análise de Programação

Aula 08 Estruturas de Condição. Disciplina: Fundamentos de Lógica e Algoritmos Prof. Bruno Gomes

Lógica de Programação e Algoritmos

LINGUAGEM C: ARRAY: VETORES E MATRIZES

Coleções em Java. Prof. Gustavo Willam Pereira ENG10082 Programação II. Créditos: Prof. Clayton Vieira Fraga Filho

Métodos Computacionais

Classes e Objetos INTRODUÇÃO À ORIENTAÇÃO A OBJETOS COM JAVA - MÓDULO II. Classes. Objetos. Um modelo para a criação de objetos

Arrays em Java. Prof. Renato Pimentel. GGI030 Programação Orientada a Objetos. Universidade Federal de Uberlândia Faculdade de Computação

Aula 5 POO 1 Encapsulamento. Profa. Elaine Faria UFU

UNIP - Ciência da Computação e Sistemas de Informação. Estrutura de Dados. AULA 5 Pilhas

Programação Orientada a Objetos. Aula 1.9 this e static. Prof. Bruno Moreno

Universidade de São Paulo

Arrays. Professor: Ricardo Luis dos Santos IFSUL Campus Sapucaia do Sul

Simulado de Linguagem de Programação Java

Recursividade. Objetivos do módulo. O que é recursividade

CI208 - Programação de Computadores. Aula 24: Arrays. Prof. MSc. Diego Roberto Antunes

ESTRUTURAS DE DADOS E ALGORITMOS LISTA LIGADA

Collections Framework

Sumário. Capítulo 1 Introdução 29. Capítulo 2 Utilizando Objetos 59

Introdução à Linguagem de Programação Java 1 INTRODUÇÃO À LINGUAGEM DE PROGRAMAÇÃO JAVA

JAVA. Professor: Bruno Toledo

ESTRUTURAS DE DADOS E ALGORITMOS LISTA LIGADA (ABORDAGEM RECURSIVA)

Programação: Vetores

Recursividade. Métodos iterativos. Prof. Cesar Augusto Tacla. Métodos iterativos utilizam estruturas de repetição

COMPORTAMENTOS - Observações

Tipos, Literais, Operadores

Tipos, Literais, Operadores

Aula 2 POO 1 Prática. Profa. Elaine Faria UFU

Interfaces POO. Prof. Marcio Delamaro

Linguagem de Programação III

Universidade Federal de Uberlândia Faculdade de Computação. Linguagem C: funções

Transcrição:

Programação Orientada a Objetos com Java Prof. Júlio Machado julio.machado@pucrs.br

TÉCNICA DE PROGRAMAÇÃO RECURSÃO

Recursão Algoritmo recursivo é aquele que contém, em sua descrição, uma ou mais chamadas a si mesmo Em termos de programação Uma rotina é recursiva quando ela chama a si mesma de forma direta ou indireta Indireta é quando uma rotina X contém uma chamada a outra rotina Y, que por sua vez contém uma chamada a X

Recursão A computação recursiva resolve um problema usando a solução do mesmo problema com entradas mais simples Exemplo 1 Cálculo recursivo do fatorial de um número fat (0) 1 fat (1) 1 fat ( n) n* fat ( n 1), n 2 Caso base: se o número é 0 ou 1, o resultado é 1 Passo da recursão: se o número é maior ou igual a 2, o resultado é o número multiplicado pelo fatorial do número decrescido de uma unidade

public static int fatorial(int n) { int fat = -1; //condição de erro if ((n==0) (n==1)) { fat = 1; } else if (n>=2) { fat = n * fatorial(n-1); } return fat; } Recursão

Recursão Exemplo 1: chamada de fatorial(3) A entrada é o valor 3 O método chama fatorial() com o valor 2 A entrada é o valor 2 O método chama fatorial() com o valor 1 A entrada é o valor 1 O método retorna o resultado = 1 O método retorna o resultado = 2*1 O método retorna o resultado = 3*2

Recursão int resultado = MyMath.fatorial(3); public static int fatorial(int n) { int fat = -1; if (n==0 n==1) fat = 1; else if(n>=2) fat=n*fatorial(n-1); return fat; }

Recursão int resultado = MyMath.fatorial(3); public static int fatorial(int n) { int fat = -1; if (n==0 n==1) fat = 1; else if(n>=2) fat=n*fatorial(n-1); return fat; 2 } public static int fatorial(int n) { int fat = -1; if (n==0 n==1) fat = 1; else if(n>=2) fat=n*fatorial(n-1); return fat; }

Recursão int resultado = MyMath.fatorial(3); public static int fatorial(int n) { int fat = -1; if (n==0 n==1) fat = 1; else if(n>=2) fat=n*fatorial(n-1); return fat; } public static int fatorial(int n) { int fat = -1; if (n==0 n==1) fat = 1; else if(n>=2) fat=n*fatorial(n-1); return fat; } 2 public static int fatorial(int n) { int fat = -1; if (n==0 n==1) fat = 1; else if(n>=2) fat=n*fatorial(n-1); return fat; } 1

Recursão int resultado = MyMath.fatorial(3); public static int fatorial(int n) { int fat = -1; if (n==0 n==1) fat = 1; else if(n>=2) fat=n*fatorial(n-1); return fat; 2 } public static int fatorial(int n) { int fat = -1; if (n==0 n==1) fat = 1; else if(n>=2) fat=n*fatorial(n-1); return fat; } 1 public static int fatorial(int n) { int fat = -1; if (n==0 n==1) fat = 1; else if(n>=2) fat=n*fatorial(n-1); return fat; }

Recursão int resultado = MyMath.fatorial(3); public static int fatorial(int n) { int fat = -1; if (n==0 n==1) fat = 1; else if(n>=2) fat=n*fatorial(n-1); return fat; 2 } public static int fatorial(int n) { int fat = -1; if (n==0 n==1) fat = 1; else if(n>=2) fat=n*fatorial(n-1); return fat; 2 1 }

Recursão int resultado = MyMath.fatorial(3); public static int fatorial(int n) { int fat = -1; if (n==0 n==1) fat = 1; else if(n>=2) fat=n*fatorial(n-1); return fat; } 2 public static int fatorial(int n) { int fat = -1; if (n==0 n==1) fat = 1; else if(n>=2) fat=n*fatorial(n-1); return fat; }

Recursão int resultado = MyMath.fatorial(3); public static int fatorial(int n) { int fat = -1; if (n==0 n==1) fat = 1; else if(n>=2) fat=n*fatorial(n-1); return fat; 3 2 }

Recursão int resultado = MyMath.fatorial(3); 6 public static int fatorial(int n) { int fat = -1; if (n==0 n==1) fat = 1; else if(n>=2) fat=n*fatorial(n-1); return fat; }

Recursão Exemplo 1: O cálculo do fatorial possui um exemplo nãorecursivo bastante trivial utilizando um laço de repetição A essa solução chamamos de solução iterativa! int f = 1; for (int i = n; i > 1; i--) f = f * i;

Recursão CUIDADO COM RECURSÃO INFINITA!!! Devemos garantir que uma chamada recursiva não criará um laço infinito Devemos sempre construir o algoritmo de modo que um caso base permita que a recursão termine

TÉCNICA DE PROGRAMAÇÃO EXCEÇÕES

Programação por Contratos Definição de responsabilidades Do usuário da classe Do desenvolvedor Aumenta a confiança Aumenta a eficiência

Programação por Contratos Na visão da Programação por Contrato : Uma operação deve seguir um contrato de serviços Um objeto que utiliza as operações de um outro objeto deve estar ciente do que o método promete realizar e do que o método não realiza

Programação por Contratos Uma das técnicas de programação por contratos envolve a declaração explícita de condições necessárias para a execução de uma operação Essas condições serão testadas antes da execução da operação Falhas nas condições podem ser indicadas ao programador através do conceito de exceções

Exceções Quando um método encontra uma situação anormal, ele informa tal anormalidade pelo lançamento (geração) de uma exceção Ex.: o método Interger.parseInt(String s), para converter strings para inteiros, irá lançar a exceção NumberFormatException se a String não possui somente dígitos de um número inteiro

Tipos de Exceções Java possui duas categorias básicas: Exceções verificadas O compilador verifica se o código lida com a exceção de forma explícita Usualmente relacionadas com condições externas, fora do controle do programador, mas que devem ser tratadas corretamente Ex.: IOException Exceções não-verificadas O compilador não verifica se seu código trata a exceção Usualmente correspondem a falhas de lógica de programação Ex.: NumberFormatException

Lançando Exceções Para lançar uma exceção dentro de um método que estamos desenvolvendo: Instanciar um objeto do tipo da exceção desejada Ex.: NullPointerException e = new NullPointerException( mensagem de erro ); Lançar a exceção via comando throw Ex.: throw e;

Exemplo: Classe Circulo -centrox:int -centroy:int -raio:int Circulo +Circulo(x:int, y:int, r:int) +area():double +circunferencia():double +diametro():int Construtor da classe deve validar as entradas Para os valores do centro somente aceitar valores que não sejam negativos Para o valor do raio somente aceitar valor positivo

Exemplo: Classe Circulo public class Circulo { private int centrox; private int centroy; private int raio; } public Circulo(int x, int y, int r){ if (x < 0) { IllegalArgumentException excecao = new IllegalArgumentException("Valor do centrox negativo"); throw excecao; } else centrox = x; if (y < 0)... }...

Cláusula throws Métodos que geram exceções verificadas devem obrigatoriamente declará-las no cabeçalho do método via cláusula throws Lista de exceções separadas por vírgulas Ex.: public void lerarquivo(string nomearq) throws FileNotFoundException {...}

Cláusula throws Métodos que geram exceções não-verificadas podem ou não declará-las no cabeçalho do método via cláusula throws Lista de exceções separadas por vírgulas Ex.: public Circulo(int x, int y, int r) throws IllegalArgumentException {...}

ARRANJOS

Arranjos Arranjos ou Arrays são estruturas que armazenam uma sequência de itens do mesmo tipo Tipos primitivos Objetos É uma estrutura estática Seu tamanho não pode ser alterado após a criação Java permite a criação de arranjos de múltiplas dimensões: Arranjo unidimensional = vetor Arranjo bidimensional = matriz

Arranjos Unidimensionais Declaração de um array é feita em duas etapas: Declaração da referência int[] valores; Instanciação do objeto valores = new int[5]; Em um única linha: int[] valores = new int[5];

Arranjos Unidimensionais Valores do arranjo são inicializados automaticamente: números : 0 boolean : false objetos : null

Arranjos Unidimensionais Dado um array de tamanho N: Primeira posição com índice 0 Última posição com índice N-1 Acesso a uma posição inválida acarreta uma exceção IndexOutOfBoundsException Para referenciar elementos: nome_do_array[índice] Exemplo: valores[0] valores[4]

Arranjos Unidimensionais É possível inicializar um array com valores literais. Exemplos: int[] valores = {1,2,3,4,5}; String[] nomes = {"eu","tu"};

Arranjos Unidimensionais O que acontece nos seguintes casos? (Lembrese que em Java temos referências para objetos!) int[] nums; nums = new int[10];... nums = new int[20]; nums referencia um novo objeto array, perdendo a referência para o array anterior int[] nums = {1,2,3}; int[] outros = nums; nums e outros referenciam o mesmo objeto array

Arranjos Unidimensionais Arrays de objetos contêm referências para os outros objetos Por exemplo, um array que armazena professores Professor[] lista = new Professor[10]; lista[0] = new Professor("Maria",13,12); lista[1] = new Professor("José",234,8);

Arranjos Unidimensionais Atributos e métodos de arrays: Definidos no pacote java.util Tamanho: length System.out.println(nums.length); Ordenação em ordem crescente: Arrays.sort(nome_do_array) Arrays.sort(nums);

Arranjos Unidimensionais Exemplo: import java.util.arrays; public class TesteArray { public static void main(string[] args) { int[] nums = {32, 15, 3, 23, 4, 0, 1}; for (int i = 0; i < nums.length; i++) { System.out.println("nums [ + i + "]=" + nums[i] + "\n"); } Arrays.sort(nums); for (int i = 0; i < nums.length; i++) { System.out.println("nums [" + i + "]=" + nums[i] + "\n"); } } }

Arranjos Unidimensionais Passagem de parâmetros: Arrays, como são objetos, os parâmetros são referências Especificar o nome do array sem colchetes int[] nums = new int[5]; modificaarray(nums); Parâmetro do método declarado como uma referência ao array public void modificaarray(int[] vals){...}

Arranjos Bidimensionais Declaração de um array é feita em duas etapas: Declaração da referência int[][] valores; Instanciação do objeto valores = new int[5][2]; Em um única linha: int[][] valores = new int[5][2]; Para referenciar elementos: nome_do_array[índicelinha][índicecoluna] Exemplo: valores[0][1] valores[4][0]

Arranjos Bidimensionais Inicialização: Valores literais int[][] valores = {{1,2},{3,4}};

Arranjos Bidimensionais Inicialização: Laços de repetição aninhados for(int i=0; i<numlinhas; i++) for(int j=0; j<numcolunas; j++) valores[i][j] = 0;

Matrizes Arranjos de duas dimensões são utilizados para representar a estrutura matemática conhecida como matriz

Matrizes Exemplos: Matriz 2x3 Matriz 2x2

Matrizes Adição Dado as matrizes A e B do tipo m por n, sua soma A + B é a matriz m por n computada adicionando os elementos correspondentes (A + B)[i,j] = A[i, j] + B[i,j]. Ex.:

Matrizes Multiplicação Multiplicação de duas matrizes é bem definida apenas se o número de colunas da matriz da esquerda é o mesmo número de linhas da matriz da direita. Se A é uma matriz m por n e B é uma matriz n por p, então seu produto AB é a matriz m por p dada por Ex.:

Matrizes Multiplicação por escalar Para multiplicar um número k qualquer por uma matriz n m A, basta multiplicar cada entrada A[i,j] de A por k. Assim, a matriz resultante B será também n m e B[i,j] = k.a[i,j]. Ex.:

COLEÇÕES

Coleções Java disponibiliza classes que facilitam o agrupamento e processamento de objetos em conjuntos: Coleções (Java Collections Framework) Estruturas de dados + algoritmos para sua manipulação Java Collections framework Arquitetura unificada para representar e manipular coleções, de forma independente dos detalhes de sua representação

Coleções O programador simplesmente utiliza as estruturas de dados sem se preocupar com a maneira como são implementadas. Vantagens: Reutilização de código Desempenho superior Maior velocidade de execução Algoritmos otimizados

Coleções Coleções: De forma simplificada, são objetos capazes de armazenar conjuntos de referências para outros objetos Listas, pilhas, filas, conjuntos, mapas, etc Correspondem a classes oferecidas na biblioteca padrão de Java

Implementações de Uso Geral Tabela hash Arranjo variável Árvore balanceada Lista encadeada Tabela hash + Lista encadeada Set HashSet TreeSet LinkedHashSet List ArrayList LinkedList Deque ArrayDeque LinkedList Map HashMap TreeMap LinkedHashMap

Listas Uma lista é uma coleção linear de elementos que podem ser percorridos sequencialmente e permite inserção e remoção de elementos em qualquer posição Conceitualmente, não possui um tamanho máximo

Listas Algumas operações: add(indice,objeto) adiciona um objeto na posição do índice add(objeto) adiciona um objeto na posição final da lista get(indice) retorna o objeto armazenado na posição do índice indicado remove(indice) remove e retorna o objeto armazenado na posição do índice indicado

Listas Algumas operações: clear() limpa a lista isempty() retorna verdadeiro se a lista está vazia size() retorna o número de elementos da lista

Listas Duas implementações diferentes para listas são as classes ArrayList<E> e LinkedList<E> Implementações com performance diferente para operações diferentes Vantagem: Escolhe-se o tipo de estrutura conforme a necessidade da aplicação, porém, a forma de usá-las é exatamente a mesma Declaração: Devemos informar o tipo dos elementos da lista ao declararmos uma coleção (genéricos) ArrayList<Tipo> umalista = new ArrayList<Tipo>(); LinkedList<Tipo> umalista = new LinkedList<Tipo>();

Listas Exemplo: Implementar um cofrinho de moedas com a capacidade de receber moedas e calcular o total depositado no cofrinho.

public class Cofrinho { } Listas private ArrayList<Moeda> moedas; public Cofrinho() { } Implementa uma coleção de Moeda como uma lista. moedas = new ArrayList<Moeda>(); Classe ArrayList foi escolhida como implementação de lista.

Mapas Um mapa é uma coleção que associa chaves a valores As chaves são valores sem repetição e são utilizadas como mecanismos de busca ao valor associado armazenado na coleção Um exemplo prático seria o cadastro de contatos de um celular O nome do contato seria a chave O objeto que guarda os telefone seria o valor Outro exemplo são os dicionários

Mapas Algumas operações: put(chave,valor) adiciona um valor associado a respectiva chave remove(chave) remove e retorna o valor associado a chave indicada get(chave) retorna o valor associado a chave indicada containskey(chave) retorna true se o mapa contém a chave containsvalue(valor) retorna true se o mapa contém o valor

Mapas Algumas operações: size() retorna o número de pares chave-valor armazenados isempty() retorna true se o mapa está vazio keyset() retorna um conjunto contendo todas as chaves do mapa values() retorna uma coleção contendo todos os valores do mapa

Mapas Duas implementações diferentes para listas são as classes HashMap<K,V> e TreeMap<K,V> Vantagem: Escolhe-se o tipo de estrutura conforme a necessidade da aplicação, porém, a forma de usá-las é exatamente a mesma Declaração: Devemos informar o tipo das chaves e valores ao declararmos uma coleção (genéricos) HashMap<String,Integer> mapa = new HashMap<String,Integer>();

Recursos The Java Tutorial http://download.oracle.com/javase/tutorial/index.html Java SE 6 API http://download.oracle.com/javase/6/docs/api