Baixe o app para aproveitar ainda mais
Prévia do material em texto
Linguagem de Programação I Engenharia da Computação UNOESC ‐ Joaçaba Guilherme Rossetti Anzollin guianzollin@gmail.com 1. Conceitos de linguagens de programação, a tecnologia Java e o ambiente de desenvolvimento integrado NetBeans IDE. 2. Classes, objetos, atributos, métodos e outros conceitos básicos de OO. 3. Tipos de dados e identificadores, operadores. 4. Entrada e Saída. 5. Comandos de decisão, repetição e desvio. 6. Arrays. 7. Tratamento e lançamento de exceções. 8. Collections como estrutura de dados. 9. Interface gráfica com SWING. Linguagem de Programação I ‐ Conteúdo Três avaliações de A1 sendo: 1. Prova individual e sem consulta sobre o conteúdo parcial (25%). 2. Trabalho em grupo desenvolvido e apresentado em sala de aula (25%). 3. Prova individual e sem consulta abrangendo todo o conteúdo apresentado nas aulas (50%). O aluno que obter média de A1 maior ou igual a 7,0 estará aprovado. O aluno que obter média de A1 maior ou igual a 4,0 e menor que 7,0 deverá prestar avaliação de A2, que será uma prova individual e sem consulta abrangendo todo o conteúdo apresentado nas aulas. O aluno que obter média de A1 menor que 4,0 estará reprovado. Linguagem de Programação I ‐ Avaliação CORMEM, T. H. [et. al], Algoritmos: teoria e prática. 2ed. Rio de Janeiro: Elsevier, 2002. GOODRICH, M. Estruturas de dados e algoritmos em Java. 2ed. Porto Alegre: Bookman, 2002. MANZANO & OLIVIERA. Estudo Dirigido de Algoritmos. São Paulo: Érica, 1997. MANZANO, J. A N. G. Lógica estruturada para programação de computadores. São Paulo: Érica, 2001. PREISS, B. R. Estruturas de Dados e Algoritmos: padrões e projetos orientados a objetos com JAVA. Rio de Janeiro: Campus, 2002. PUGA, S. Lógica de programação e estrutura de dados: com aplicativos em Java. São Paulo: Pearson Education, 2004. DEITEL, H. M.; DEITEL, P. J. Java: como programar. 6. ed. São Paulo: Pearson Prentice Hall, 2005. Oracle Corporation. Java SE Documentation. Diponível em: <http://www.oracle.com/technetwork/java/javase/documentation/>. Acesso em: 18 julho 2011. Linguagem de Programação I ‐ Referências 1. Conceitos de linguagens de programação, a tecnologia Java e o ambiente de desenvolvimento integrado NetBeans IDE Método padronizado para expressar instruções para um computador. Permite ao programador especificar sobre quais dados o computador vai operar, como eles serão armazenados e quais ações serão tomadas em cada possível circunstância. Uma linguagem pode ser traduzida basicamente por interpretação ou compilação. Linguagem de Programação O programa vai sendo traduzido a medida que vai sendo executado. Geralmente mais lentas que as compiladas porém mais flexíveis pela interação imediata com o ambiente. Exemplos: JavaScript, PHP, Pearl, Python. Linguagem de Programação Interpretada O programa todo é traduzido em um código mais próximo da máquina e só depois executado. Exemplos: C, Pascal, Delphi, Java (utiliza máquina virtual para executar). Linguagem de Programação Compilada Linguagem de alto nível compilada (C++, Java) Instruções de maneira abstrata usando variáveis, mais legíveis pelo programador, uma instrução em linguagem de alto nível pode requerer várias em linguagem de máquina. Linguagem de Montagem (Assembly Language) Instruções simbólicas para linguagem de máquina, legíveis para o programador, cada instrução em linguagem de montagem representa uma instrução em linguagem de máquina. Linguagem de Máquina (Binário) Instruções da maneira mais básica, em formato binário, envolvendo movimentações de dados para registradores. compilador montador Linguagem de Programação Compilada Linguagem de alto nível compilada (C++, Java) X = X+Y; Linguagem de Montagem (Assembly Language) ADD X, Y Representação em Linguagem de Máquina 0011 000100 110001 Linguagem de Programação Compilada No início dos anos 90 a Sun Microsystems iniciou um projeto (The Green Project) para desenvolver soluções tecnológicas prevendo a convergência dos computadores com equipamento utilizados no dia‐a‐dia (eletrodomésticos por exemplo). Liderado por James Gosling, o Grenn Team desenvolveu um projeto chamado *7 (StarSeven), um equipamento com a habilidade de controlar diversos dispositivos e aplicações. A linguagem de programação desenvolvida para o *7 foi chamada de Oak Como o mercado de dispositivos não aderiu a tecnologia (não estava pronto), a ideia foi adequada para a internet que estava em plena ascensão A tecnologia Java Em 1995 foi então lançado o Java 1.0 com o objetivo de transformar o browser que até então só renderizava HTML em uma aplicação para realizar operações (applet). O navegador Netscape passaria então a incorporar a tecnologia Java. Em 2009 a Oracle adquiriu a Sun e continuou fortalecendo a marca Java. Atualmente Java não está somente presente na web e applet não é a principal aplicação da tecnologia. Desde celulares e diversos tipos de dispositivos portáteis a jogos, sistemas de navegação a sistemas de informação empresariais, Java está em todo lugar! A tecnologia Java Edições do Java • JSE ‐ Java Standard Edition ‐ inclui o ambiente de execução e as bibliotecas básicas de desenvolvimento. • JEE ‐ Java Enterprise Edition ‐ voltada para desenvolvimento de aplicações corporativas incluindo bibliotecas especialmente desenvolvidas para o acesso a servidores, a sistemas de e‐mail, a banco de dados, entre outros recursos. • JME ‐ Java Micro Edition ‐ voltada para desenvolvimento de aplicativos móveis ou portáteis. Como funciona a tecnologia Java • Ambiente de desenvolvimento (JDK ‐ Java Development Kit) • Ambiente de Execução (JRE ‐ Java Runtime Environment) – Máquina Virtual (JVM – Java Virtual Machine) – Biblioteca de classes JRE JDK • Compilador • Documentação • Bibliotecas de desenvolvimento Como funciona a tecnologia Java Outra linguagem (Delphi, C++, VB) Windows Linux Celular Compilador Código fonte Compilador Java Windows Linux Celular Código fonte MV windows MV linux MV celular bytecode Tecnologia Java Executável Descrição java Executa programas Java javac Compila programas Java javadoc Gera documentação pelos coment jar Compacta em um único arquivo javap Mostra o código de um .class jdb Debug de programas Java Appletviewer Visualizar applets sem navegador Algumas ferramentas Ciclo de Desenvolvimento em Java .java javac (compilar) java (executar) Programa .class O compilador javac • javac <opções> arquivo.java • Exemplo: – javac Exemplo.java Opções do compilador javac • ‐ classpath: Especifica o caminho para as classes / bibliotecas. • ‐ cp: [caminho] Especifica o caminho para as classes / bibliotecas. • ‐ d: [dir] Diretório para armazenar os arquivos compilados. • ‐ source: Localização dos fontes para serem compilados. • ‐ deprecation: Advertência para funções que não devem ser utilizadas. • ‐ g: Compila com tabelas de debug. • ‐ nowarn: Desativa as mensagens de warning. • ‐ verbose: Mostra detalhes da compilação. • ‐ depend: Compila todos os fontes, incluindo suas dependências. • ‐ target: Especifica a versão da JVM que irá executar o programa. • ‐ O: Otimização de código para gerar programas mais rápidos. • ‐ version: Informa a versão do javac. • ‐ help: Pequena ajuda com lista de opções. • ‐ X: Opções avançadas de compilação. • ‐ J: Passa um parâmetro fixo para o interpretador. O interpretador java • java <opções> arquivo.class • java <opções> ‐ jar arquivo.jar • Exemplo: – java Exemplo – java ‐jar Exemplo Opções do interpretador java • ‐ classpath: Especifica o caminho para as classes / bibliotecas.• ‐ cp: Especifica o caminho para as classes / bibliotecas. • ‐ verbose: Mostra detalhes da compilação. • ‐ version: Informa a versão do javac. • ‐ help: Pequena ajuda com lista de opções. • ‐ X: Opções avançadas de interpretação. • ‐ Xdebug: Permite o uso do depurador. • ‐ D =: Definição de propriedades com a chave nome = valor. Exemplo de código para teste class Exemplo{ public static void main(String[] args){ System.out.print("Hello world"); } } Exemplo.java 2. Classes, objetos, atributos, métodos e outros conceitos básicos de OO Programação Orientada a Objetos A linguagem Java segue o paradigma de programação orientada a objetos (POO), neste paradigma o programa se organiza na forma de uma coleção de objetos que possuem estrutura e comportamentos próprios, relacionando‐se entre si por características em comum, afinal todos são objetos. A grande diferença com o paradigma mais tradicional, de programação estruturada ou procedural, é que neste as estruturas de dados e rotinas são desenvolvidas de forma fracamente acopladas. Classes e Objetos Uma classe é onde define‐se um objeto. Através da definição de uma classe descreve‐se que propriedades o objeto terá (seus atributos) e seu comportamento (métodos). class Conta{ int numero; String titular; float saldo; void sacar(){ } void depositar(){ } void consultarSaldo(){ } } Classes e Objetos Objetos são instâncias de classes. É através deles que (praticamente) todo o processamento ocorre em sistemas implementados com linguagens de programação orientadas a objetos. class Programa{ public static void main(String[] args){ Conta conta1 = new Conta(); conta1.numero = 1; conta1.titular = "Pedro"; conta1.saldo = 100; conta1.sacar(); conta1.consultarSaldo(); } } Atributos e Métodos O conjunto de atributos descreve as propriedades da classe. Cada atributo é identificado por um nome e tem um tipo associado. Em uma linguagem de programação orientada a objetos pura, o tipo seria nome de uma outra classe. Na prática, a maior parte das linguagens de programação orientada a objetos oferecem um grupo de tipos primitivos (int, float, char, etc...). class Conta{ int numero; // int: tipo primitivo String titular; // String: classe float saldo; ... } Atributos e Métodos Os métodos definem as funcionalidades da classe, ou seja, o que será possível fazer com objetos dessa classe. Cada método é especificado por uma assinatura, composta por um identificador para o método (o nome do método), o tipo para o valor de retorno e sua lista de argumentos, sendo cada argumento identificado por seu tipo e nome. class Conta{ ... void sacar(float valor){ this.saldo = this.saldo - valor; } } Atributos e Métodos Uma classe pode ter vários métodos com o mesmo nome mas com assinaturas diferentes, recebendo diferentes argumentos. Isto é conhecido como sobrecarga ou overloading. class Conta{ ... // sem receber argumentos/parâmetros void sacar(){ } // recebendo o valor do saque void sacar(float valor){ this.saldo = this.saldo - valor; } } Modificadores de Acesso Modificadores de acesso (ou de visibilidade) são aplicados a atributos e métodos para definir se os mesmos poderão ser acessados ou não a partir de outras classes. • public: torna os atributos e métodos acessíveis a partir de qualquer classe. • private: torna os atributos e métodos acessíveis somente dentro da própria classe. • protected: torna os atributos e métodos acessíveis somente dentro da própria classe e de classes derivadas da mesma (herança). Modificadores de Acesso class Conta{ // atributos privados private int numero; private String titular; private float saldo; // métodos públicos public void sacar(float valor){ this.saldo = this.saldo - valor; } public void depositar(float valor){ this.saldo = this.saldo + valor; } public void consultarSaldo(){ System.out.print(this.saldo); } } Modificadores de Acesso class Programa{ public static void main(String[] args){ Conta conta1 = new Conta(); // não é mais possível acessar // diretamente os atributos // pois são private conta1.numero = 1; conta1.saldo = 100; conta1.titular = "Pedro"; // é possível acessar os métodos // pois são public conta1.consultarSaldo(); } } Getters e Setters A POO manda tornar atributos e métodos o mais privados possível para seguir um de seus principais conceitos: o encapsulamento. Encapsulamento significa separar o programa em partes onde só é visível o que é necessário em cada uma das partes. Se os atributos de uma classe devem ser privados (private) o único meio de acessá‐los é pelos métodos da classe. São criados então métodos para atribuir valores aos atributos (set) e para acessar os valores dos mesmos (get). Getters e Setters class Conta{ private int numero; private String titular; private float saldo; // Método set para o atributo número public void setNumero(int numero){ this.numero = numero; } // Método get para o atributo numero public int getNumero(){ return this.saldo; } ... } class Programa{ public static void main(String[] args){ Conta conta1 = new Conta(); // Atribuindo o valor “1” para o // atributo “numero” conta1.setNumero(1); // Acessando o valor do // atributo “numero” e imprimindo System.out.print(conta1.getNumero()); } } Getters e Setters Construtor Ao construir um objeto chamamos a palavra reservada new. Sempre quando o new é chamado ele executa o construtor da classe, que é um bloco declarado com o mesmo nome da classe (não é um método). Quando não é declarado um construtor em uma classe o Java cria um construtor padrão que não recebe nenhum parâmetro e seu corpo é vazio. A ideia é utilizar o construtor para inicializar os atributos quando é criado um objeto. class Conta{ private int numero; private String titular; private float saldo; // Construtor Conta(int numero, String titular, float saldo){ this.numero = numero; this.titular = titular; this.saldo = saldo; } ... } Construtor class Programa{ public static void main(String[] args){ // Construindo um objeto e já // passando o valor dos atributos Conta conta1 = new Conta(1, "Pedro", 100); } } Construtor Herança Herança é um meio de relacionamento entre duas classes sendo que uma herda os atributos e métodos da outra. class ContaCorrente extends Conta{ private float limite; // Construtor da subclasse ContaCorrente(int numero, String titular, float saldo, float limite){ // Chamando o construtor da // superclasse (Conta) super(numero,titular,saldo); // Atributo da subclasse this.limite = limite; } ... } Reescrita/Sobrescrita/Override Quando uma classe herda um método e altera seu comportamento. class ContaCorrente extends Conta{ ... // Sobrescrevendo o método // consultarSaldo da superclasse Conta public void consultarSaldo(){ System.out.print("Saldo da conta corrente:"); super.consultarSaldo(); } } Polimorfismo Capacidade de um objeto ser referenciado de várias formas (poli = muitas, morphos = formas). class Programa{ public static void main(String[] args){ ContaCorrente conta1 = new ContaCorrente(1, "Pedro", 100,1000); Conta conta2 = conta1; conta2.consultarSaldo(); // Qual método vai ser chamado? // O da subclasse ContaCorrente! } } Exercício 1 Crie a classe Cliente com os atributos listados abaixo e seus respectivos métodos getters (responsável pro retornar o valor do atributo) e setters (responsável por atribuir um valor recebido por parâmetro ao atributo): • código • nome • endereço • data de nascimento Crie uma classe principalonde será instanciado um objeto da classe Cliente atribuindo valores informados pelo usuário para todos seus atributos e ao final imprimindo os mesmos. Exercício 2 Crie as seguintes classes com seus devidos atributos, construtores e métodos getters e setters: 3. Tipos primitivos, identificadores e operadores Tipos primitivos e identificadores class Programa{ public static void main(String[] args){ byte inteiro = 1; int inteiro2 = -100; long inteiro3 = 10000000; double decimal = 10.001; char caractere = 'c'; boolean boleano = true; } } Tipo Identificador Atribuição Nome Tipo Tamanho byte Numérico inteiro 8 bits short Numérico inteiro 16 bits int Numérico inteiro 32 bits long Numérico inteiro 64 bits float Ponto flutuante 32 bits double Ponto flutuante 64 bits char Caractere 16 bits boolean Booleano 8 bits Tipos primitivos Casting Para que um número não inteiro (ou de maior precisão) seja arredondado e armazenado em um número inteiro (ou de menor precisão) é necessário que este primeiro seja moldado (casted). class Programa{ public static void main(String[] args){ double d3 = 3.14; // casting int i = (int) d3; // o código abaixo (sem o casting) // não iria compilar // int i= d3; } } • Começam com uma letra, underline ou cifrão; • Após o primeiro dígito podem conter números; • Java é case sensitive, então existe diferença entre maiúsculo e minúsculo; • Palavras reservadas (class, int, public, this ...) não podem ser identificadores. Identificadores Aritméticos unários Operador Nome Uso ++ Incremento id++; ‐‐ Decremento id‐‐; ‐ Negativo ‐id; + Positivo +id; Operadores Aritméticos sobre duas variáveis Operador Nome Uso + Adição id1 + id2 ; ‐ Subtração id1 ‐ id2 ; * Multiplicação id1 * id2 ; / Divisão id1 / id2 ; % Resto id1 % id2 ; Operadores Relacionais e Lógicos Operador Nome Uso > Maior id1 > id2 ; < Menor id1 < id2 ; >= Maior ou igual id1 >= id2 ; <= Menor ou igual id1 <= id2 ; == Igual id1 == id2 ; != Diferente id1 != id2 ; ! Não lógico (NOT) !id1 ; && E lógico (AND) id1 && id2 ; || OU lógico (OR) id1 || id2 ; instanceof Instância de Obj instanceof Classe Operadores Exercício 3 Criar a classe Calculo implementando os seguintes métodos para calcular as operações aritméticas básicas: • soma –recebendo dois valores e retornando a soma; • subtrai ‐ recebendo dois valores e retornando a diferença; • multiplica ‐ recebendo dois valores e retornando o produto; • divide ‐ recebendo dois valores e retornando a divisão; • inverteSinal ‐ recebendo um valor e invertendo seu sinal. Criar a classe Principal com o método main acessando os métodos da classe Calculo. 4. Entrada e Saída Entrada e Saída Entende‐se por entrada e saída o conjunto de mecanismos oferecidos para que um programa consiga, respectivamente, obter e fornecer informações de dispositivos externos ao seu ambiente de execução. Havendo um dispositivo de entrada de dados habilitado (um teclado por exemplo), o programa obtém dados deste dispositivo através de uma operação leitura. Da mesma fora, um dado pode ser enviado para um dispositivo de saída habilitado (um monitor por exemplo) através de uma operação escrita. A classe System Pertencente ao pacote java.lang, único pacote que por padrão já é importado em todas as classes. Dentre seus atributos existem o in, utilizado para entrada/leitura de bytes, e o out, utilizado para saída/escrita. class Programa{ public static void main(String[] args) throws Exception{ int i = System.in.read(); System.out.print(i); } } O pacote java.io O pacote java.io possui classes que definem o comportamento padrão dos fluxos de entrada (InputStream) e saída (OutputStream). import java.io.*; class Programa{ public static void main(String[] args) throws Exception{ InputStream is= System.in; System.out.print(is.read()); } } O pacote java.io Para recuperar os caracteres é necessário traduzir os bytes lidos de um fluxo de entrada. Existe a classe InputStreamReader que oferece tal funcionalidade. Além de utilizar InputStreamReader para manipular o byte lidos pode‐se usar também a classe BufferedReader para concatenar os caracteres e formar uma string através do método readLine. import java.io.*; class Programa{ public static void main(String[] args) throws Exception{ InputStream is = System.in; InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr); System.out.print(br.readLine()); } } O pacote java.io Para ler bytes de um arquivo, por exemplo, utiliza‐se uma classe filha de InputStream chamada FileInputStream para construir o objeto ao invés do atributo System.in. import java.io.*; class Programa{ public static void main(String[] args) throws Exception{ InputStream is = new FileInputStream( "c:\\arquivo.txt"); InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr); System.out.print(br.readLine()); } } O pacote java.io Realizando o processo inverso para escrever em um arquivo. Utilizando BufferedWriter (ao invés de BufferedReader), OutputStreamWriter (ao invés de InputStreamReader) e OutputStream (ao invés de InputStream). import java.io.*; class Programa{ public static void main(String[] args) throws Exception{ OutputStream os = new FileOutputStream( "c:\\saida.txt"); OutputStreamWriter osw = new OutputStreamWriter(os); BufferedWriter bw = new BufferedWriter(osw); bw.write("teste de saída/escrita"); bw.close(); } } A classe Scanner A partir do Java 5 pode‐se utilizar a classe Scanner do pacote java.util para entrada/leitura. Esta classe possui métodos específicos para ler cada tipo de dados. import java.util.*; class Programa{ public static void main(String[] args){ Scanner s = new Scanner(System.in); String x = s.next(); int y = s.nextInt(); float z = s.nextFloat(); System.out.println(x+y); System.out.println(y+z); } } Exercício 4 Criar a classe Contato (ao lado). Criar uma classe principal onde é instanciado um objeto da classe Contato e setados para os atributos valores informados pelo usuário. Ao final as informações do objeto devem ser salvas em um arquivo chamado contato.txt. 5. Comandos de decisão, repetição e desvio. Comandos de Decisão O comando if / else. class Programa{ public static void main(String[] args){ int var = 1; if(var > 0){ System.out.print("var é maior que 0"); } else{ System.out.print("var é menor ou igual a 0"); } } } Comandos de Decisão O comando switch / case. class Programa{ public static void main(String[] args){ int var = 1; switch(var){ case 1: System.out.print("var é igual a 1"); break; case 2: System.out.print("var é igual a 2"); break; default: System.out.print("var é diferente de 1 e 2"); } } } Comandos de Repetição O comando while. class Programa{ public static void main(String[] args){ int var = 1; while(var < 10){ System.out.println(var); var++; } } } Comandos de Repetição O comando do / while. class Programa{ public static void main(String[] args){ int var = 1; do{ System.out.println(var); var++; }while(var < 1); } } Comandos de Repetição O comando for. class Programa{ public static void main(String[] args){ for(int i=0 ; i<10 ; i++){ System.out.println(i); } } } Comandos de Desvio O comando break. class Programa{ public static void main(String[] args){ for(int i=0 ; i<10 ; i++){ if( i == 5 ) break; System.out.println(i); } } }Comandos de Desvio O comando continue. class Programa{ public static void main(String[] args){ for(int i=0 ; i<10 ; i++){ if( i == 5 ) continue; System.out.println(i); } } } Exercício 5 Criar a classe Pessoa (abaixo). Exercício 5 O método situacao() deve calcular o IMC conforme a fórmula abaixo: IMC = peso / (altura)² O retorno do método deve ser uma string informando: • Abaixo do peso: Se o IMC estiver abaixo de 19,1 para o sexo feminino e abaixo de 20,7 para o sexo masculino. • Peso ideal: Se o IMC estiver entre 19,1 e 25,8 para o sexo feminino e entre 20,7 e 26,4 para o sexo masculino. • Acima do peso: Demais situações. Exercício 6 Criar a classe Calculo (abaixo). Criar uma classe principal onde é instanciado um objeto da classe Calculo e perguntado ao usuário (em forma de um menu de opções) qual dos quatro métodos ele deseja chamar. Escolhido o método deve‐se perguntar também quais os parâmetros para sua chamada. . 6. Arrays Arrays Arrays são objetos que armazenam uma coleção de elementos. Tais elementos podem ser variáveis de tipos primitivos ou objetos. class Programa{ public static void main(String[] args){ // declara um array de inteiros e aloca memória // para 2 inteiros int[] meuArray = new int[2]; meuArray[0] = 100; // inicializa a 1ª posição meuArray[1] = 200; // inicializa a 2ª posição System.out.println("Posição 0: " + meuArray[0]); System.out.println("Posição 1: " + meuArray[1]); } } Arrays Os índices de um array variam de 0 até n‐1, sendo n o tamanho dado na criação do array. Ao tentar acessar uma posição fora desse alcance ocorre um erro. class Programa{ public static void main(String[] args){ // declara um array de inteiros com 2 posições int[] meuArray = new int[2]; // tenta atribuir um valor para a 3º posição meuArray[2] = 100; } } Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException … Arrays Quando é criado um array de uma classe, nele só ficam guardadas referências. Considere a classe abaixo. public class Conta{ private double saldo; public Conta(double saldo) { this.saldo = saldo; } public double getSaldo() { return saldo; } } Arrays Criando um array para objetos da classe Conta. class Programa{ public static void main(String[] args){ // array para referenciar 3 objetos de Conta Conta[] contas = new Conta[3]; // criando um objeto de Conta e atribuindo a // 2ª posição do array Conta conta1 = new Conta(1000.00); contas[1] = conta1; System.out.print(contas[1].getSaldo()); } } Arrays Foi criado um array de 3 posições sendo que somente uma delas (a segunda) está referenciando um objeto. null null contas conta1 Conta saldo 1000.00 Um array de tipos primitivos guarda valores, um array de objetos guarda referências. Arrays Percorrendo um array. class Programa{ public static void main(String[] args){ int[] numeros= new int[10]; // atribuindo valores para as posições do array for (int i=0 ; i<10 ; i++){ numeros[i] = i* 10; } // lendo valores das posições do array for (int i=0 ; i<numeros.length ; i++){ System.out.println(numeros[i]); } } } Arrays Percorrendo um array com duas dimensões. class Programa{ public static void main(String[] args){ int[][] matriz = new int[5][5]; for(int i=0 ; i<5 ; i++){ for(int j=0 ; j<5 ; j++){ matriz[i][j] = i+j; System.out.println( "matriz["+i+"]["+j+"]: "+matriz[i][j]); } } } } Arrays Percorrendo um array com duas dimensões. matriz[0][0] 0 + 0 = 0 matriz[0][1] 0 + 1 = 1 matriz[0][2] 0 + 2 = 2 matriz[0][3] 0 + 3 = 3 matriz[0][4] 0 + 4 = 4 matriz[1][0] 1 + 0 = 1 matriz[1][1] 1 + 1 = 2 matriz[1][2] 1 + 2 = 3 matriz[1][3] 1 + 3 = 4 matriz[1][4] 1 + 4 = 5 matriz[2][0] 2 + 0 = 2 matriz[2][1] 2 + 1 = 3 matriz[2][2] 2 + 2 = 4 matriz[2][3] 2 + 3 = 5 matriz[2][4] 2 + 4 = 6 matriz[3][0] 3 + 0 = 3 matriz[3][1] 3 + 1 = 4 matriz[3][2] 3 + 2 = 5 matriz[3][3] 3 + 3 = 6 matriz[3][4] 3 + 4 = 7 matriz[4][0] 4 + 0 = 4 matriz[4][1] 4 + 1 = 5 matriz[4][2] 4 + 2 = 6 matriz[4][3] 4 + 3 = 7 matriz[4][4] 4 + 4 = 8 Exercício 7 Crie uma classe principal onde será declarado um array de objetos da classe Conta (do exemplo anterior) sendo que o tamanho deste array deve ser informado pelo usuário. Para cada posição do array deve ser referenciado um objeto da Classe conta e o valor do atributo saldo de cada objeto deve ser informado pelo usuário. Ao final, o programa deve imprimir cada posição do array e o valor do atributo saldo do objeto referente a cada posição. 7. Tratamento e lançamento de exceções Erros ou situações anormais que não podem ser verificadas na compilação do programa. Quando ocorre uma exceção e a mesma não está sendo tratada no código fonte o programa é abortado/encerrado. A maioria das classes utilizadas para o tratamento de exceções são encontradas no pacote java.lang. Exceções • Exception: Para qualquer tipo de exceção; • ArithmeticException: Erros em processamento aritmético; • NumberFormatException: Conversão inadequada de uma string para um numérico; • ClassNotFoundException: Classe não encontrada durante a execução do programa; • IndexOutOfBounds: Tentativa de acessar um elemento além do limite de uma estrutura/array. Exemplo de classes para o tratamento de exceções • IOException: Erros em operações de Entrada e Saída, pacote java.io; • FileNotFoundException: Arquivo não encontrado, pacote java.io; • EOFException : Fim de arquivo encontrado; Exemplo de classes para o tratamento de exceções Problemas provocados por código mal escrito ou mal testado, acontecem em tempo de execução do programa: • Uma divisão por zero • Acesso a uma posição inválida de um array O compilador java NÃO EXIGE que tais exceções sejam tratadas no código. Vindas de java.lang.RuntimeException, por exemplo, IndexOutOfBoundsException, ArithmeticException. Exceções de Tempo de Execução – Runtime Exceptions / Unchecked Problemas que não dependem da lógica do programa, por exemplo: • Um arquivo não encontrado • Uma impressora que parou de responder • A rede que caiu O compilador java EXIGE que tais exceções sejam tratadas no código. Vindas de java.lang.Exception, por exemplo, ClassNotFoundException, FileNotFoundException , IOException. Exceções Verificadas – Checked Exceptions Problemas causados pela máquina virtual do JAVA: • Não é mais possível criar um objeto porque não há mais memória disponível Em 99% dos casos não devem ser tratados. Caso aconteça o programa deve ser mesmo encerrado e alternativas devem ser bucadas para solução do problema. Vindas de java.lang.Error, por exemplo, OutOfMemoryError. Erros – Errors Tratamento da exceção no próprio método em que ela pode ocorrer. • try : tenta executar os comandos que podem gerar a exceção; • catch : decide o que fazer se uma determinada exceção ocorrer (tratamento) ; • finally : decide o que fazer se a exceção que ocorrer não estiver sendo tratada em nenhum catch. Tratamento try / catch Exemplo sem tratamento de exceção Exception in thread "main" java.lang.ArithmeticException: / by zero public void imprimeDivisao(){ int x = 2; int y = 0; System.out.print( x/y ); } Tratamento try / catch Exemplo com tratamento de exceção public void imprimeDivisao(){ int x = 2; int y = 0; try{ System.out.print( x/y ); } catch(java.lang.ArithmeticException e){ System.out.print("Ocorreu uma divisão por zero"); } } Tratamento try / catch O comando throws indica que o tratamento da exceção deve ocorrer no método que chamar aquele em que ela pode acontecer.Tratamento throws import java.io.*; public class Entrada{ public String lerDados() throws IOException{ InputStream is = System.in; InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr); return br.readLine(); } } Tratando a exceção com try / cacth na chamada do método. Tratamento throws class Programa{ public static void main(String[] args){ Entrada entrada = new Entrada(); String retorno = new String(""); try{ retorno = entrada.lerDados(); } catch(java.io.IOException e){ System.out.print("Ocorreu um problema na entrada de dados."); } } } Retorna a mensagem padrão da exceção ocorrida. O método getMessage() class Programa{ public static void main(String[] args){ Entrada entrada = new Entrada(); String retorno = new String(""); try{ retorno = entrada.lerDados(); } catch(java.io.IOException e){ System.out.print("Ocorreu um problema na entrada de dados: "+e.getMessage()); } } } Através do comando throw (diferente de throws) pode‐se lançar uma exceção a partir de uma determinada situação. class Pessoa{ public String nome; public void setNome(String nome){ if(nome.equals("")){ throw new IllegalArgumentException("O nome não pode ser em branco."); } this.nome = nome; } } Lançamento de exceções Tratando a exceção que será lançada. class Programa{ public static void main(String[] args){ Pessoa pessoa = new Pessoa(); try{ pessoa.setNome(""); } catch(IllegalArgumentException e){ System.out.print(e.getMessage()); } } } Lançamento de exceções Criar a classe Divisao com os métodos divisao1 e divisao2, ambos recebendo dois valores e retornando o resultado da divisão porém com a seguinte diferença: • divisao1 tratará a exceção usando throws, assim quando for chamado deverá ser usado try / catch; • divisao2 tratará a exceção usando throw e informando uma mensagem personalizada de erro; Criar a classe Principal solicitando que o usuário entre com dois números (utilizando BufferedReader / InputStreamReader) e calculando a divisão usando os métodos da classe Divisao. Simular a divisão por zero. Exercício 8 8. Collections como estrutura de dados Porquê não utilizar somente arrays para criar estruturas de dados? – Não podemos redimensionar um array; – Não podemos buscar diretamente um elemento se não soubermos seu índice; – Apesar de sabermos o tamanho do array (size) não podemos saber quantas posições do array já foram populadas sem criar métodos auxiliares. Collections como estrutura de dados O Collections Framework (java.util.Collection) é um conjunto de classes e interfaces para representarem estruturas de dados mais avançadas. Collections como estrutura de dados Collection Map Set List Queue Interface genérica que não possui implementação, possui métodos comuns a todas as coleções. – int size() – boolean isEmpty() – boolean contains (Object elemento) – boolean add (Object elemento) – boolean remove (Object elemento) – boolean containsAll (Collection c) – boolean addAll (Collection c) – boolean removeAll (Collection c) Collection Conceito de conjunto, não permite duplicidade. Implementações: HashSet, TreeSet. import java.util.*; public class Exemplo{ public static void main(String args[]) { Set<String> set = new HashSet<String>(); set.add("B"); set.add("A"); set.add("C"); System.out.println(set); set.add("A"); System.out.println(set); } } Interface Set Garantindo a ordem de inserção: LinkedHashSet. Interface Set import java.util.*; public class Exemplo{ public static void main(String args[]) { Set<String> set = new LinkedHashSet<String>(); set.add("B"); set.add("A"); set.add("C"); System.out.println(set); set.add("A"); System.out.println(set); } } Ordenação crescente/alfabética : TreeSet. Interface Set import java.util.*; public class Exemplo{ public static void main(String args[]) { Set<String> set = new TreeSet<String>(); set.add("B"); set.add("A"); set.add("C"); System.out.println(set); set.add("A"); System.out.println(set); } } Removendo elemento: remove(elemento). Interface Set import java.util.*; public class Exemplo{ public static void main(String args[]) { Set<String> set = new TreeSet<String>(); set.add("B"); set.add("A"); set.add("C"); System.out.println(set); set.remove("A"); System.out.println(set); } } Conceito de lista, permite duplicidade. Implementações: ArrayList (não é um array), LinkedList. import java.util.*; public class Exemplo{ public static void main(String args[]) { List<String> lista = new ArrayList<String>(); lista.add("B"); lista.add("A"); lista.add("C"); System.out.println(lista); lista.add("A"); System.out.println(lista); } } Interface List Removendo um elemento – remove(elemento). import java.util.*; public class Exemplo{ public static void main(String args[]) { List<String> lista = new ArrayList<String>(); lista.add("B"); lista.add("A"); lista.add("C"); System.out.println(lista); lista.remove("A"); System.out.println(lista); } } Interface List Acessando um elemento – get(indice). import java.util.*; public class Exemplo{ public static void main(String args[]) { List<String> lista = new ArrayList<String>(); lista.add("B"); lista.add("A"); lista.add("C"); System.out.println(lista); System.out.println("Elemento 0:"+lista.get(0)); System.out.println("Elemento 1:"+lista.get(1)); } } Interface List Conceito de fila, permite duplicidade Sem parâmetros, remove/acessa sempre o primeiro elemento import java.util.*; public class Exemplo{ public static void main(String args[]) { Queue<String> lista = new LinkedList<String>(); lista.add("B"); lista.add("A"); lista.add("C");; System.out.println(lista); lista.remove(); System.out.println(lista); System.out.println(lista.element()); } } Interface Queue Conceito de chave‐valor. Implementações: HashMap, TreeMap. import java.util.*; public class Exemplo{ public static void main(String[] args) { Map map = new HashMap(); map.put(1,"A"); map.put(3,"C"); map.put(2,"B"); map.put(4,"D"); System.out.println(map); } } Interface Map Garantindo a ordem de inserção: LinkedHashMap. Interface Map import java.util.*; public class Exemplo{ public static void main(String[] args) { Map map = new LinkedHashMap(); map.put(1,"A"); map.put(3,"C"); map.put(2,"B"); map.put(4,"D"); System.out.println(map); } } Ordenação crescente: TreeMap. Interface Map import java.util.*; public class Exemplo{ public static void main(String[] args) { Map map = new TreeMap(); map.put(1,"A"); map.put(3,"C"); map.put(2,"B"); map.put(4,"D"); System.out.println(map); } } Removendo elemento pela chave – remove(chave). import java.util.*; public class Exemplo{ public static void main(String[] args) { Map map = new TreeMap(); map.put(1,"A"); map.put(3,"C"); map.put(2,"B"); map.put(4,"D"); System.out.println(map); map.remove(2); System.out.println(map); } } Interface Map Acessando elemento pela chave – get(chave). import java.util.*; public class Exemplo{ public static void main(String[] args) { Map map = new TreeMap(); map.put(1,"A"); map.put(3,"C"); map.put(2,"B"); map.put(4,"D"); System.out.println(map); System.out.println("Elemento 1:"+map.get(1)); System.out.println("Elemento 2:"+map.get(2)); } } Interface Map Verificando existência de elemento pela chave – containsKey(chave). import java.util.*; public class Exemplo{ public static void main(String[] args) { Map map = new TreeMap(); map.put(1,"A"); map.put(3,"C"); map.put(2,"B"); map.put(4,"D");System.out.println(map); System.out.println(map.containsKey(1)); System.out.println(map.containsKey(5)); } } Interface Map Verificando existência de elemento pelo valor – containsValue(chave). import java.util.*; public class Exemplo{ public static void main(String[] args) { Map map = new TreeMap(); map.put(1,"A"); map.put(3,"C"); map.put(2,"B"); map.put(4,"D"); System.out.println(map); System.out.println(map.containsValue("A")); System.out.println(map.containsValue("X")); } } Interface Map Criar a classe Exercicio6 criando o seguinte menu: >> MENU >> >> 1 – Incluir registro >> 2 – Consultar registro >> 3 – Remover registro >> 4 – Listar todos os registros >> 5 - Sair >> >> Digite a Opção: UsarMap armazenando a chave e o nome do registro. Exercício 9 Descrição das opções do menu: – Incluir registro: perguntar ao usuário a chave e o nome do registro e incluir no map. – Consultar registro: perguntar ao usuário a chave e imprimir o nome do registro, se existir. – Remover registro: perguntar ao usuário a chave e remover registro do map, se existir. – Listar todos os registros: imprimir todos os registros do map. – Sair: sair do programa. Exercício 9 9. Interface gráfica com SWING SWING é um conjunto de classes (ou framework) implementado para fornecer componentes de interface gráfica (janelas, botões, imagens, áreas de texto, etc.) Interface gráfica com SWING Criando uma janela (JFrame) import javax.swing.*; public class MeuJFrame extends JFrame { public MeuJFrame(){ // Título do JFrame this.setTitle("Título"); // Fronteiras (posição X e Y, largura e altura) this.setBounds(0,0,500,500); // Ação padrão ao fechar o JFrame this.setDefaultCloseOperation(EXIT_ON_CLOSE); // Definição do tipo de layout this.getContentPane().setLayout(null); } } Interface gráfica com SWING Criando uma janela (JFrame) class Exemplo{ public static void main(String[] args){ MeuJFrame obj = new MeuJFrame(); obj.setVisible(true); } } Interface gráfica com SWING Adicionando um rótulo de texto (JLabel) import javax.swing.*; public class MeuJFrame extends JFrame { private JLabel rotulo; public MeuJFrame(){ ... // Construindo o rótulo de texto rotulo = new JLabel(); // Setando a descrição do botão rotulo.setText("Texto"); // Fronteiras (posição X e Y, largura e altura) rotulo.setBounds(10, 10, 100, 30); // Adicionando rótulo ao JFrame this.add(rotulo); } } Interface gráfica com SWING Adicionando um campo de texto (JTextField) import javax.swing.*; public class MeuJFrame extends JFrame { private JTextField campo; public MeuJFrame(){ ... // Construindo o campo de texto campo = new JTextField(); // Fronteiras (posição X e Y, largura e altura) campo.setBounds(10, 50, 100, 30); // Adicionando campo ao JFrame this.add(campo); } } Interface gráfica com SWING Adicionando um botão (JButton) import javax.swing.*; public class MeuJFrame extends JFrame { private JButton botao; public MeuJFrame(){ ... // Construindo o botão botao = new JButton(); // Setando a descrição do botão botao.setText("botão"); // Fronteiras (posição X e Y, largura e altura) botao.setBounds(10, 100, 100, 50); // Adicionando botão ao JFrame this.add(botao); } } Interface gráfica com SWING Criar o seguinte JFrame com seus devidos componentes Exercício 10 Como os eventos funcionam: – Todo sistema operacional que suporta interface gráfica monitora eventos (cliques, movimentos do mouse, teclas pressionadas, etc.) – Quando um evento acontece o sistema operacional informa ao programa – O programa decide o que fazer com o evento de acordo com o que foi programado Interface gráfica com SWING ‐ Eventos São os eventos que controlam todas as interações do usuário com o programa (cliques, texto digitado, movimentos do mouse, etc.) Para se trabalhar com eventos no Java a partir dos componentes SWING podemos utilizar funcionalidades do pacote java.awt.event. import java.awt.event.*; Interface gráfica com SWING ‐ Eventos Cada componente da interface gráfica (janela, botão, campo de texto, etc.) conta com interfaces para ouvir (listen) quando um evento é gerado. Categoria Evento Interface Janelas Abrir, fechar, minimizar WindowListener Botões, menus, etc. Pressionar ou selecionar ActionListener Mouse Cliques MouseListener Arrastar ou soltar o clique MouseMotionListener Teclado Pressionar teclas KeyListener Foco dos componentes Mudança de foco (tab/enter) FocusListener Interface gráfica com SWING ‐ Eventos Cada interface tem métodos associados para tratar os diferentes eventos. Interface Método Evento WindowListener void windowOpened(WindowEvent e) Quando uma janela é aberta void windowClosed(WindowEvent e) Quando uma janela é fechada ActionListener void actionPerformed(ActionEvent e) Quando uma ação ocorre (botão pressionado, item selecionado) MouseListener voidmouseClicked(MouseEvent e) Quando o mouse é clicado sobre o componente voidmouseEntered(MouseEvent e) Quando o mouse entra em um componente KeyListener void keyPressed(KeyEvent e) Quando uma tecla é pressionada Interface gráfica com SWING ‐ Eventos Eventos do pacote java.awt.event: java.awt.event java.awt.event.ActionEvent java.awt.event.AdjustmentEvent java.awt.event.ComponentEvent java.awt.event.FocusEvent java.awt.event.ItemEvent java.awt.event.KeyEvent java.awt.event.MouseEvent java.awt.event.TextEvent java.awt.event.WindowEvent Interface gráfica com SWING ‐ Eventos import javax.swing.*; import java.awt.event.*; public class MeuJFrame extends JFrame { private JButton botao; private JTextField campo; public MeuJFrame(){ this.setTitle("Título"); this.setBounds(0,0,500,500); this.setDefaultCloseOperation(EXIT_ON_CLOSE); this.getContentPane().setLayout(null); ... Interface gráfica com SWING ‐ Eventos ... botao = new JButton(); botao.setText("botão"); botao.setBounds(10, 100, 100, 50); this.add(botao); campo = new JTextField(); campo.setBounds(10, 50, 100, 30); this.add(campo); // Adicionando um evento action ao botão botao.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt){ botao.setText(campo.getText()); } }); } // construtor } // classe Interface gráfica com SWING ‐ Eventos Para o JFrame criado no exercício 10 implementar os eventos de todos os botões responsáveis por jogar no campo de texto o valor do botão pressionado. Exercício 11
Compartilhar