Algoritmos e Programação
|
|
|
- Benedita Leveck de Miranda
- 10 Há anos
- Visualizações:
Transcrição
1 Algoritmos e Programação por Prof. Dr. Paulo Roberto Gomes Luzzardi facebook: Paulo Roberto Gomes Luzzardi WhatsApp: [email protected] e [email protected] (Senac): [email protected] DropBox: Hostinger: e (Home Page) OS X Server (Apple): (Home Page) Versão Bibliografia recomendada DEITEL, H. M. and DEITEL, P. J. Java: como programar, 8. ed.: São Paulo: Pearson, 2010 (ISBN ). Pelotas, segunda-feira, 5 de outubro de 2015 (11:03:19 am)
2 Sumário 1. Projeto de Classes Escrevendo uma classe em Java (Conceitos básicos) Tipos de Atributos Sobrecarga de Métodos Referência this Lista de exercícios: Classes Interface e Polimorfismo Interface Polimorfismo Lista de Exercícios: Interface e Polimorfismo Herança em Java Herança simples Controle de acesso na definição de uma classe derivada Tipos de acessos (especificadores de acesso) Lista de exercícios: Herança Métodos de entrada e saída de dados Entrada de dados via teclado Saída de dados via tela Saída formatada (System.out.printf) Lista de Exercícios: Métodos de Entrada e Saída Interfaces e Containers (Classes existentes em Java) Coleções (Collection FrameWork) Interfaces Vector (Vetor) (Classe Obsoleta) LinkedList (Lista Encadeada Simples) Arrays (array) ArrayList (lista de array) Lista de exercícios: Vector, ArrayList e LinkedList ArrayList bidimensional Strings (Cadeia de Caracteres) Métodos para manipular Strings Lista de exercícios: Strings Classe Object Classe Iterator Classe LinkedHashSet Classe Genérica em Java Fila Prioritária (PriorityQueue) Listas Lineares: Pilhas, Filas e Deques Implementação de uma Pilha (Stack) Implementação de uma Fila (Queue) Implementação de um Deque (ArrayDeque) Lista de Exercícios: Listas Lineares (Pilhas, Filas e Deques) Mapas (Maps) Conceitos básicos sobre Mapas Lista de Exercícios: Mapas
3 8. Processamento de fluxos de dados, caracteres e objetos (Arquivos) Métodos para manipular arquivos em Java Abertura de um arquivo texto Listar um diretório Manipulação de um arquivo de palavras Arquivo Texto Lista de exercícios: Arquivos (Files) Acesso randômico em arquivos texto Arquivo binário de objetos em Java Leitura e gravação de objetos (registro) em Arquivos Gravação de objetos em um arquivo binário de objetos Leitura objetos em um arquivo binário de objetos Noções de desenvolvimento de aplicações em camadas (MVC) Conceitos Primeiro exemplo da utilização do MVC (ProgMVCPessoa) Segundo exemplo da utilização do MVC (ProgMVCPessoa2) Conceitos gerais Como é calculado o hashcode no Java Lista Encadeada Simples em Java Lista Encadeada de Inteiros Lista Encadeada Genérica (String, Integer ou Double) Lista Duplamente Encadeada em Java Classe entrada de inteiros e reais em Java sem erro na digitação Alguns programas exemplos em Java Torre de Hanoi (Pilha - Stack) Analisador de Expressões usando Stack Calculadora Polonesa Reversa Jogo Quebra-Cabeças Anexos: Solução dos problemas propostos no Livro Anexo 1.4 Solução da Lista: Classes ProgCirculo ProgPeso ProgValidaCPF ProgDiaSemana ProgTestData ProgVetorSort ProgPessoa ProgPessoa ProgPessoas ProgAgenda Anexo 2.3 Solução da Lista: Interface e Polimorfismo ProgInterface_ ProgInterface_ ProgInterface_ Anexo 3.4 Solução da Lista: Herança Herança (Primeiro) Herança (Segundo)
4 3.4.3 Herança (Terceiro) Anexo 4.4 Solução da Lista: Entrada e Saída Bufferizada ProgBuffer_ ProgBuffer_ Anexo Solução da Lista: Vector, ArrayList e LinkedList ProgVector_ ProgVector_ ProgVector_ ProgVector_ ProgVector_ ProgVector_ ProgVector_ ProgVector_ ProgVector_ ProgVector_ ProgVector_ ProgVector_ ProgVector_ ProgVector_ ProgVector_ ProgVector_ Anexo Solução da Lista: Strings ProgString_ ProgString_ ProgString_ ProgString_ ProgString_ ProgString_ ProgString_ ProgString_ Anexo 6.4 Solução da Lista: Listas Lineares ProgLista_ ProgLista_ ProgLista_ ProgLista_ ProgLista_ ProgLista_ ProgLista_ ProgLista_ ProgLista_ ProgLista_ ProgLista_ ProgLista_ ProgLista_ ProgLista_ ProgLista_ Anexo 7.2 Solução da Lista: Mapas
5 7.2.1 ProgMap_ ProgMap_ ProgMap_ ProgMap_ ProgMap_ Anexo 8.6 Solução da Lista: Arquivos (File) ProgFile_ ProgFile_ ProgFile_ ProgFile_ ProgFile_ ProgFile_ ProgFile_ ProgFile_ ProgFile_ ProgFile_ ProgFile_ ProgFile_ Lista de Figuras Figura 1: Estrutura de dados da classe Vetor... 8 Figura 2: Exemplo de Herança em java Figura 3: Objetos gráficos: Linha e Retângulo Figura 4: LinkedList - Lista Encadeada Simples Figura 5: Representação gráfica de uma String Figura 6: Representação de uma Fila e uma Pilha Figura 7: Representação visual de um Deque Figura 8: Representação gráfica de uma Tabela Hash (Hashtable) Figura 9: Exemplo de um arquivo texto Figura 10: Editor hexadecimal mostrando o arquivo texto Figura 11: Editor hexadecimal mostrando o arquivo binário Figura 12: Exemplo de MVC Figura 13: Exemplo de MVC Figura 14: Lista Encadeada Simples Figura 15: Alocação de elementos na Memória RAM Figura 16: Lista Duplamente Encadeada Figura 17: Jogo Torre de Hanoi Figura 18: Jogo Quebra-Cabeças Lista de Tabelas Tabela 1: Tipos de Ícones Tabela 2: Comandos de formatação Tabela 3: Especificadores de largura do campo Tabela 4: Lista de Container Tabela 5: Tipos de dados do Java
6 Legenda de Cores Vermelho <enter>: Entrada de dados do programa Azul: Saída do programa (Resultado do teste do Programa) Verde: Texto em destaque Marinho: Código em Java Preto: Texto normal Preto: Método em destaque Itálico: Palavra em Inglês Negrito: Texto em destaque Sublinado: Observações 6
7 1. Projeto de Classes A seguir são descritas algumas características da orientação a objetos em Java. 1.1 Escrevendo uma classe em Java (Conceitos básicos) O paradigma orientado à objetos possui cinco componentes básicos: objetos (possuem atributos e métodos), mensagens (chamadas aos métodos), classes (tipo de dado), instâncias (criação de objetos de uma classe específica new alocação de memória) e métodos (funções definidas pelo programador que manipulam os atributos). Objetos, mensagens, classes, instâncias e métodos Objetos são entidades lógicas que contém atributos (dados armazenados em variáveis) e métodos (funções) que manipulam estes dados. Um objeto pode ser definido através de um tipo de dado chamado classe (class). Resumindo: a) Atributos: São as variáveis definidas/declaradas para cada objeto. b) Métodos: São as funções definidas pelo programador que servirão para manipular os atributos. c) Mensagens: São as chamadas dos métodos. d) Classe: É um tipo de dado definido por class. Uma classe não é um objeto, é sim uma descrição do objeto. e) Instância: Os objetos são instâncias de uma classe, ou seja, é criado um objeto pertencente a uma classe específica. O objeto pode responder chamadas dos métodos e armazenar informações nos atributos. Resumidamente, objetos são instâncias de classes que respondem as mensagens através dos métodos escritos pelo programador. Uma linguagem de programação orientada à objetos pode suportar ou implementar seis propriedades: abstração, encapsulamento, polimorfismo, herança, associação (quando uma 7
8 classe possui atributos do tipo de outra classe - agregação e composição) e classes abstratas e concretas. 1.2 Tipos de Atributos São variáveis definidas e declaradas nas classes. Existem três tipos de atributos: Atributo do objeto: É individual para cada objeto, ou seja, cada objeto pode possuir um valor diferente; Atributo da classe: É estático (static), ou seja, coletivo, igual para todos os objetos da classe; Atributo constante: Idêntico aos atributos da classe, somente não podem ser alterados por serem constantes (final). // Classe: Atributos.java package progatributos; public class Atributos { private int x; private static int y; private final int z = 3; // atributo do objeto (cada objeto tem o seu) // atributo da classe (todos tem igual, mas pode ser alterado) // atributo constante (todos os objetos tem o mesmo valor, não pode ser alterado Atributos(int x) { this.x = x; public void setatributoy(int y) { Atributos.y = y; // this.y = y; public void exibeatributos() { System.out.println("x = " + x); System.out.println("y = " + y); System.out.println("z = " + z); System.out.println(); // Programa Principal: ProgAtributos.java package progatributos; public class ProgAtributos { Atributos atrib1 = new Atributos(1); Atributos atrib2 = new Atributos(3); Atributos atrib3 = new Atributos(5); atrib1.setatributoy(7); // altera atributo Y e esta mudança vale para todos os objetos atrib1.exibeatributos(); atrib2.exibeatributos(); 8
9 atrib3.exibeatributos(); Resultado do Programa: x = 1 y = 7 z = 3 x = 3 y = 7 z = 3 x = 5 y = 7 z = 3 Considere a seguinte estrutura de dados da Figura 1, onde há um vetor de max elementos e um atributo n que controla a quantidade de elementos presentes no vetor num dado momento. Esta estrutura é utilizada na classe Vetor definida a seguir. Figura 1: Estrutura de dados da classe Vetor Programa Exemplo: Classe Vetor, que possui a estrutura de dados exibida na Figura 1, e que possui os seguintes atributos: private int n; private final int[] vetor; private final int max; // número de elementos no vetor // vetor que armazena os elementos // máximo número de elementos no vetor // Classe: Vetor.java package progvetor; public class Vetor { // atributos da classe private int n; private final int[] vetor; private final int max; 9
10 // construtor Vetor(int numeroelementos) { max = numeroelementos; vetor = new int[max]; // alocação de max número de elementos n = 0; // add public void add(int valor) { if (n < max) { vetor[n] = valor; n++; else { System.out.println("Erro: Excedeu Limite do Vetor"); // exibe public void exibe() { System.out.print("Vetor: ["); for (int i = 0; i < n; i++) { System.out.print(vetor[i] + ", "); System.out.println("\b\b]"); // apaga o último espaço em branco e a última vírgula // \b retrocesso ou BackSpace // numeroelementosvetor public int numeroelementosvetor() { return(n); // Programa Principal: ProgVetor.java package progvetor; public class ProgVetor { Vetor vetor = new Vetor(5); // 5 é o número de elementos no vetor estático da classe vetor.add(10); vetor.add(20); vetor.add(30); vetor.add(40); vetor.add(50); vetor.exibe(); vetor.add(60); vetor.exibe(); System.out.println("Total de Elementos: " + vetor.numeroelementosvetor()); Resultado do Programa: Vetor: [10, 20, 30, 40, 50] Erro: Excedeu Limite do Vetor Vetor: [10, 20, 30, 40, 50] 10
11 Total de Elementos: 5 Tente implementar os seguintes métodos para a classe Vetor : int valor = vetor.del(); if (valor!= -999) { System.out.println("Valor Excluído: " + valor); else { System.out.println("ERRO: Vetor Vazio"); vetor.exibe(); System.out.println("Total de Elementos: " + vetor.length()); int pri = vetor.primeiro(); System.out.println("Primeiro: " + pri); int ult = vetor.ultimo(); System.out.println("Último: " + ult); int elemento = 20; boolean flag = vetor.existe(elemento); if (flag) { System.out.println("Existe elemento: " + elemento); else { System.out.println("Não Existe elemento 20"); Resultado do Programa: Vetor: [10, 20, 30, 40, 50] Erro: Excedeu Limite do Vetor Vetor: [10, 20, 30, 40, 50] Total de Elementos: 5 Valor Excluído: 50 Vetor: [10, 20, 30, 40] Total de Elementos: 4 Primeiro: 10 Último: 40 Existe elemento: 20 Exemplo de classe (Lista) aonde os elementos são inseridos a partir da posição zero do vetor e há uma variável n que controla o número de elementos da lista. // Programa Principal: ProgLista.java package testalista; import java.util.scanner; public class TestaLista { final int SUCESSO = 0; final int CHEIA = -1; final int VAZIA = -2; final int EXCEDEU = -3; final int POSICAO = - 4; final int VALOR = -5; 11
12 Scanner input = new Scanner(System.in); Lista lista = new Lista(7); String s; char op; do { do { int[] valores = lista.exibelista(); int n = lista.numeroelementoslista(); exibelista(n, valores); do { System.out.print("[I]nserir, [R]emover, remove[a]ll, [P]esquisa, Pr[O]cura, [S]ort, In[v]erte ou [Q]uit: "); s = input.nextline(); while (s.isempty()); op = s.charat(0); if (op == 'Q' op == 'q') { System.exit(1); while (!"IiRrAaPpOoSsVv".contains(s)); // while (!"IRAPOSV".equalsIgnoreCase(s)); switch (op) { case 'I': case 'i': System.out.print("Valor: "); s = input.nextline(); Integer valor = Integer.parseInt(s); int erro = lista.inserelista(valor); ImprimeErro(erro); case 'R': case 'r': erro = lista.removelista(); if (erro!= 0) { System.out.println("Valor Removido: " + erro); else { ImprimeErro(VAZIA); case 'A': case 'a': lista.removealllista(); case 'O': case 'o': System.out.print("Valor: "); s = input.nextline(); valor = Integer.parseInt(s); int posicao = lista.procuralista(valor); if (posicao!= -5) { System.out.println("Posição: " + posicao); else { ImprimeErro(POSICAO); case 'P': case 'p': System.out.print("Posição: "); s = input.nextline(); posicao = Integer.parseInt(s); valor = lista.pesquisalista(posicao); 12
13 if (valor!= -4) { System.out.println("Valor Pesquisado: " + valor); else { ImprimeErro(VALOR); case 'S': case 's': lista.sort(); case 'V': case 'v': lista.invertelista(); while (true); // método estático static void exibelista(int n, int[] valores) { System.out.print("Lista: "); if (n == 0) { System.out.print("Vazia"); else { System.out.print("(" + n + ") "); for (int i = 0; i < n; i++) { System.out.print(valores[i] + " "); System.out.println(""); static void ImprimeErro(int erro) { final String SUCESSO = "Okay, operação realizada com sucesso"; // 0 final String CHEIA = "ERRO: Lista Cheia"; // -1 final String VAZIA = "ERRO: Lista Vazia"; // -2 final String EXCEDEU = "Erro: Excedeu o Limite Máximo"; // -3 final String POSICAO = "Erro: Posição Inválida"; // -4 final String VALOR = "Erro: Valor não Encontrado"; // -5 switch (erro) { case 0: System.out.println(SUCESSO); case -1: System.out.println(CHEIA); case -2: System.out.println(VAZIA); case -3: System.out.println(EXCEDEU); case -4: System.out.println(POSICAO); case -5: System.out.println(VALOR); 13
14 default: System.out.println("Atenção: Erro Desconhecido"); // Pesquisa -> Posição: > Resultado: Valor: 30 ou ERRO: Não Encontrado // Procura -> Valor: > Resultado: Posição:?? ou ERRO: Não Encontrado // removeall ---> Eliminar todos os valores // Classe: Lista.java package testalista; import java.util.arrays; public class Lista { // atributos da classe private int n; private final int[] vetor; private final int max; // construtor Lista(int numeromaxelementos) { n = 0; max = numeromaxelementos; vetor = new int[max + 1]; // métodos public int [] exibelista() { return(vetor); public int inserelista(int valor) { if (n < max) { vetor[n] = valor; n++; return(0); // SUCESSO else { return(-3); // EXCEDEU public int removelista() { int valor = vetor[n]; if (n > 0) { n--; return(valor); else { return(-2); // VAZIA public void removealllista() { n = 0; public int procuralista(int valor) { 14
15 if (n!= 0) { for (int i = 1; i < n; i++) { if (vetor[i] == valor) { return (i); return (-5); // Valor não encontrado public int pesquisalista(int posicao) { if (posicao >= 0 && posicao < n) { return (vetor[posicao]); else { return (-4); // Posição Inválida public void sort() { Arrays.sort(vetor, 0, n); // início e fim public void invertelista() { int i = 0; for (int j = n-1; j >= n / 2; j--) { int temp = vetor[i]; vetor[i] = vetor[j]; i++; vetor[j] = temp; public int numeroelementoslista() { return(n); Resultado do Programa: Lista: Vazia [I]nserir, [R]emover, remove[a]ll, [P]esquisa, Pr[O]cura, [S]ort, In[v]erte ou [Q]uit: i <enter> Valor: 100 <enter> Okay, operação realizada com sucesso Lista: (1) 100 [I]nserir, [R]emover, remove[a]ll, [P]esquisa, Pr[O]cura, [S]ort, In[v]erte ou [Q]uit: i <enter> Valor: 200 <enter> Okay, operação realizada com sucesso Lista: (2) [I]nserir, [R]emover, remove[a]ll, [P]esquisa, Pr[O]cura, [S]ort, In[v]erte ou [Q]uit: i <enter> Valor: 300 <enter> Okay, operação realizada com sucesso Lista: (3) [I]nserir, [R]emover, remove[a]ll, [P]esquisa, Pr[O]cura, [S]ort, In[v]erte ou [Q]uit: Exemplo de classe (Lista) aonde os elementos são inseridos a partir da metade do vetor, podendo ser inserido pela esquerda ou direita. Note que a lista é centralizada sempre que necessário. 15
16 // Programa Principal: ProgListaMetade.java package testalistametade; import java.util.scanner; public class TestaListaMetade { final int SUCESSO = 0; final int CHEIA = -1; final int VAZIA = -2; final int EXCEDEU = -3; final int POSICAO = -4; final int VALOR = -5; Scanner input = new Scanner(System.in); System.out.print("Número de Elementos: "); String s = input.nextline(); String r; int numeroelementos = Integer.parseInt(s); Lista lista = new Lista(numeroElementos); char op, ch = 'T'; do { do { int[] valores = lista.exibelista(); int n = lista.numeroelementoslista(); int inic = lista.iniciolista(); int fim = lista.fimlista(); ExibeLista(n, inic, fim, valores); do { System.out.print("[I]nserir, [R]emover, remove[a]ll, [P]esquisa, Pr[O]cura, [S]ort, In[v]erte ou [Q]uit: "); s = input.nextline(); while (s.isempty()); op = s.charat(0); if (op == 'Q' op == 'q') { System.exit(1); if ("IiRr".contains(s)) { do { System.out.print("[E]squerda ou [D]ireita: "); r = input.nextline(); ch = r.charat(0); while (!"EeDd".contains(r)); while (!"IiRrAaPpOoSsVv".contains(s)); // while (!"IRAPOSV".equalsIgnoreCase(s)); switch (op) { case 'I': case 'i': System.out.print("Valor: "); s = input.nextline(); Integer valor = Integer.parseInt(s); switch (ch) { case 'E': case 'e': lista.inserelistaesquerda(valor); case 'D': 16
17 case 'd': lista.inserelistadireita(valor); case 'R': case 'r': switch (ch) { case 'E': case 'e': valor = lista.removelistaesquerda(); if (valor!= VAZIA) { System.out.println("Valor Removido: " + valor); else { ImprimeErro(VAZIA); case 'D': case 'd': valor = lista.removelistadireita(); if (valor!= VAZIA) { System.out.println("Valor Removido: " + valor); else { ImprimeErro(VAZIA); case 'A': case 'a': lista.removealllista(); case 'O': case 'o': System.out.print("Valor: "); s = input.nextline(); valor = Integer.parseInt(s); int posicao = lista.procuralista(valor); if (posicao!= -1) { System.out.println("Posição: " + posicao); else { ImprimeErro(POSICAO); case 'P': case 'p': System.out.print("Posição: "); s = input.nextline(); posicao = Integer.parseInt(s); valor = lista.pesquisalista(posicao); if (valor!= -1) { System.out.println("Valor Pesquisado: " + valor); else { ImprimeErro(VALOR); case 'S': case 's': lista.sort(); 17
18 case 'V': case 'v': lista.invertelista(); while (true); // método estático static void ExibeLista(int n, int inic, int fim, int[] valores) { System.out.print("Lista: "); if (n == 0) { System.out.print("Vazia"); else { System.out.print("(" + n + ") "); for (int i = inic; i <= fim; i++) { System.out.print(valores[i] + " "); System.out.println(""); static void ImprimeErro(int erro) { final String SUCESSO = "Okay, operação realizada com sucesso"; // 0 final String CHEIA = "ERRO: Lista Cheia"; // -1 final String VAZIA = "ERRO: Lista Vazia"; // -2 final String EXCEDEU = "Erro: Excedeu o Limite Máximo"; // -3 final String POSICAO = "Erro: Posição Inválida"; // -4 final String VALOR = "Erro: Valor não Encontrado"; // -5 switch (erro) { case 0: System.out.println(SUCESSO); case -1: System.out.println(CHEIA); case -2: System.out.println(VAZIA); case -3: System.out.println(EXCEDEU); case -4: System.out.println(POSICAO); case -5: System.out.println(VALOR); default: System.out.println("Atenção: Erro Desconhecido"); // Pesquisa -> Posição: > Resultado: Valor: 30 ou ERRO: Não Encontrado // Procura -> Valor: > Resultado: Posição:?? ou ERRO: Não Encontrado // removeall ---> Eliminar todos os valores 18
19 // Classe: Lista.java package testalistametade; import java.util.arrays; public class Lista { // atributos da classe private int n = 0; private int inic; private int fim; private final int[] vetor; private final int max; // construtor Lista(int numeromaxelementos) { n = 0; max = numeromaxelementos; inic = max / 2; fim = max / 2; vetor = new int[max]; // métodos public int[] exibelista() { // retirar depois System.out.print("Lista: "); if (n == 0) { System.out.print("Vazia"); else { System.out.print("(" + inic + " " + fim + ") "); for (int i = 0; i < max; i++) { System.out.print(vetor[i] + " "); System.out.println(""); // return (vetor); public int inserelistadireita(int valor) { if (fim < max - 1) { if (n > 0) { fim++; vetor[fim] = valor; n++; return (0); // SUCESSO else { if (centralizalista()) { fim++; vetor[fim] = valor; n++; return (0); return (-3); // EXCEDEU 19
20 public int inserelistaesquerda(int valor) { if (inic > 0) { if (n > 0) { inic--; vetor[inic] = valor; n++; return (0); // SUCESSO else { if (centralizalista()) { inic--; vetor[inic] = valor; n++; return (0); return (-3); // EXCEDEU public int removelistadireita() { if (n > 0) { int valor = vetor[fim]; fim--; n--; return(valor); else { return(-2); public int removelistaesquerda() { if (n > 0) { int valor = vetor[inic]; inic++; n--; return(valor); else { return(-2); public void removealllista() { n = 0; inic = max / 2; fim = max / 2; public int procuralista(int valor) { if (n!= 0) { for (int i = inic; i <= fim; i++) { if (vetor[i] == valor) { return (i); return (-5); 20
21 public int pesquisalista(int posicao) { if (posicao >= inic && posicao <= fim) { return (vetor[posicao]); else { return (-4); public void sort() { Arrays.sort(vetor, inic, fim+1); // início e fim public void invertelista() { int i = inic; for (int j = fim; j >= inic + (fim - inic) / 2; j--) { int temp = vetor[i]; vetor[i] = vetor[j]; i++; vetor[j] = temp; public int numeroelementoslista() { return (n); public int iniciolista() { return (inic); public int fimlista() { return (fim); private boolean centralizalista() { int brancos = max - n; int deslocamentos = brancos / 2; if (deslocamentos < 1) { return (false); if (fim == max - 1) { // desloca para esquerda int j = deslocamentos; for (int i = inic; i <= fim; i++) { vetor[j] = vetor[i]; j++; inic = inic - deslocamentos - 1; fim = inic + n - 1; else { // desloca para direita deslocamentos++; int j = fim + deslocamentos; for (int i = fim; i >= inic; i--) { vetor[j] = vetor[i]; j--; fim = fim + deslocamentos; inic = inic + deslocamentos; 21
22 return (true); Resultado do Programa: Lista: (5 6) Lista: (2) [I]nserir, [R]emover, remove[a]ll, [P]esquisa, Pr[O]cura, [S]ort, In[v]erte ou [Q]uit: i <enter> [E]squerda ou [D]ireita: d <enter> Valor: 300 <enter> Lista: (5 7) Lista: (3) [I]nserir, [R]emover, remove[a]ll, [P]esquisa, Pr[O]cura, [S]ort, In[v]erte ou [Q]uit: i <enter> [E]squerda ou [D]ireita: d <enter> Valor: 400 <enter> Lista: (5 8) Lista: (4) [I]nserir, [R]emover, remove[a]ll, [P]esquisa, Pr[O]cura, [S]ort, In[v]erte ou [Q]uit: i <enter> [E]squerda ou [D]ireita: d <enter> Valor: 500 <enter> Lista: (5 9) Lista: (5) [I]nserir, [R]emover, remove[a]ll, [P]esquisa, Pr[O]cura, [S]ort, In[v]erte ou [Q]uit: i <enter> [E]squerda ou [D]ireita: d <enter> Valor: 600 <enter> Lista: (5 10) Lista: (6) [I]nserir, [R]emover, remove[a]ll, [P]esquisa, Pr[O]cura, [S]ort, In[v]erte ou [Q]uit: i <enter> [E]squerda ou [D]ireita: d <enter> Valor: 700 <enter> Lista: (2 8) // Note, lista centralizada + lixo (verde claro) Lista: (7) [I]nserir, [R]emover, remove[a]ll, [P]esquisa, Pr[O]cura, [S]ort, In[v]erte ou [Q]uit: Uma linguagem de programação orientada à objetos pode suportar e/ou implementar seis (6) propriedades: abstração, encapsulamento, polimorfismo, herança, associação (agregação e composição) e classes abstratas e concretas. Abstração Objetos devem representar dados do mundo real. Encapsulamento ( encapsulação ) Os objetos possuem internamente atributos e métodos agrupados no mesmo local, onde os métodos manipulam os atributos. Esta característica protege os dados (atributos) de alterações indevidas, somente os membros da classe podem acessar os atributos, desde que 22
23 eles sejam privados (private) ou protegidos (protected) (caso das classes derivadas, que herdam o direito de acesso aos atributos). Polimorfismo (grego: muitas formas ) É a capacidade de objetos diferentes reagirem segundo a sua função a uma ordem padrão. Significa que o nome de um objeto pode ser utilizado para vários propósitos ligeiramente diferentes, ou seja,... uma interface, vários métodos.... A característica de polimorfismo é utilizada principalmente em sobrecarga de métodos e operadores e classes abstratas, onde os métodos são declarados mas não definidos. Como tipos de polimorfismo tem-se: (a) Universal (inclusão [como em Java, por exemplo, List lista = new LinkedList();] e paramétrico [templates como em C++]) e (b) ad-hoc (sobrecarga de métodos e operadores). Java não possui sobrecarga de operadores. Sobrecarga de Operador: Permite sobrecarregar operadores para realizar diferentes tipos de operações; Sobrecarga de Método: Permite que um método retorne diferentes tipos de informações e aceite argumentos de vários tipos, inclusive com quantidade diferentes de argumentos; Classes abstratas e concretas: Permite representar entidades e conceitos abstratos, sendo sempre uma superclasse (ou classe Base) e não permite ser instanciada, a classe abstrata apenas define um modelo (template) para uma funcionalidade e fornece uma implementação incompleta que é herdada pelas classes derivadas. Cada classe derivada implementa as funcionalidades da classe abstrata. Uma classe abstrata pode possuir métodos abstratos, mas os métodos são escritos nas classes derivadas concretas. Métodos abstratos definem apenas a forma do método não contendo nenhum tipo de código. Classes concretas implementam todos os métodos e podem ser instanciadas. Herança 23
24 É o processo pelo qual uma classe de objetos pode adquirir as propriedades de outra classe de objetos, em outras palavras, um objeto herda as características de outro (herança simples) ou vários objetos (herança múltipla). A classe base é chamada de superclasse, enquanto a classe derivada pode ser chamada de subclasse. Associação É um vínculo que permite que objetos de uma ou mais classes se relacionem entre si. Esta associação pode ser: unária (o vínculo é entre objetos da mesma classe), binária (vínculo ocorre entre dois objetos de classes diferentes) ou múltipla (vínculo ocorre entre mais de 2 objetos de classes diferentes). Cada associação pode possuir características de (a) cardinalidade ou multiplicidade (indica quantos objetos são possíveis em cada associação) e (b) navegação (existe a possibilidade dos objetos acessarem outros objetos da mesma associação). Uma associação pode ser de duas formas: agregação (relacionamento com características onde existe um grau menos intenso de coesão entre os elementos, pode haver um certo grau de independência) ou composição (relacionamento com características onde existe um alto grau de coesão e total grau de dependência entre os elementos). Classes Abstratas e Concretas É criada para representar entidades e conceitos abstratos. Uma classe abstrata é sempre uma superclasse ou classe base que não possui instâncias. Ela define apenas o modelo (como um template em C++) para uma funcionalidade e fornece uma implementação incompleta chamada de parte genérica sendo compartilhada por um conjunto de classes derivadas ou subclasses. Classes derivadas completam as funcionalida-des da classe abstrata anexando um comportamento específico. Classes abstratas possuem métodos abstratos. Esses métodos são implementados nas suas classes derivadas concretas com o objetivo de definir o comportamento específico. O método abstrato define apenas a assinatura do método não contendo nenhum código. Classes concretas implementam seus métodos e permitem instanciar objetos. Classes concretas não possuem métodos abstratos quando são classes derivadas de uma classe abstrata. 24
25 Vantagens da Orientação à Objetos: (a) reutilização de código, (b) proteção aos dados; (c) organização ou estruturação dos dados em forma de classes e objetos; (d) sobrecarga de métodos e de operadores; (e) criação de pacotes de classes; (f) ter um conjunto de pacotes prédefinidos (api s: java2d, java3d, swing, awt, etc) e (g) permitir ao desenvolvedor criar seus próprios pacotes. API: Application Programming Interface ou Interface de Programação de Aplicativos. É um conjunto de padrões de programação que permitem a construção de aplicativos. Em Java, o programador pode criar suas próprias classes. Uma classe possui duas partes distintas: atributos (variáveis) e métodos (funções ou procedimentos) que manipulam estes atributos. 1.3 Sobrecarga de Métodos Java permite que métodos estáticos (e construtores) sejam sobrecarregados, desta forma, o retorno, número de argumentos ou mesmo o tipo de dados dos argumentos podem ser diferentes. Dependendo da chamada do método, o Java identifica qual método (ou construtor) sobrecarregado deve ser executado. Teoricamente, é uma especificação que pode ter várias implementações com características diferentes. // Programa Principal: ProgSobreCarga.java package progsobrecarga; public class ProgSobreCarga { imprime("pelotas-rs"); imprime(123.45); imprime(123.45f); imprime(123); imprime('a'); static void imprime(string s) { System.out.println("String: " + s); static void imprime(double d) { System.out.println("Double: " + d); static void imprime(float f) { System.out.println("Float: " + f); 25
26 static void imprime(integer i) { System.out.println("Inteiro: " + i); static void imprime(character ch) { System.out.println("Caracter: " + ch); Resultado do Programa: String: Senac-RS Double: Float: Inteiro: 123 Caracter: A // Programa Principal: ProgPolimorfismo.java package progpolimorfismo; public class ProgPolimorfismo { pixel(1, 2); pixel(1, 2, 3); pixel(1.0, 2.0, 3.0); pixel('a', 'B', 'C'); public static void pixel(int x, int y) { System.out.printf("x = %d y = %d\n", x, y); public static void pixel(int x, int y, int z) { System.out.printf("x = %d y = %d z = %d\n", x, y, z); public static void pixel(double x, double y, double z) { System.out.printf("x = %.2f y = %.2f z = %.2f\n", x, y, z); public static void pixel(char x, char y, char z) { System.out.printf("x = %c y = %c z = %c\n", x, y, z); Resultado do Programa: x = 1 y = 2 x = 1 y = 2 z = 3 x = 1,00 y = 2,00 z = 3,00 x = A y = B z = C 1.4 Referência this 26
27 Em Java, quando um método de uma classe é chamado, é passado automaticamente um argumento que é uma referência para o objeto que gerou a chamada. Esta referência é chamada this, ou seja, a referência this referencia o objeto que chamou o método. Cada objeto tem acesso a uma referência a ele próprio, chamada this. Esta referência faz referências aos atributos e métodos de um objeto. Programa exemplo: Utilização da referência this em uma classe. // Classe: Data.java package progdata; import java.text.decimalformat; public class Data { // atributos da classe private int dia, mes, ano; // construtor Data(int dia, int mes, int ano) { this.dia = dia; this.mes = mes; this.ano = ano; // sobrecarga do método tostring public String tostring() { DecimalFormat form = new DecimalFormat("00"); String data = "Data: " + form.format(dia) + "/" + form.format(mes) + "/" + ano; return (data); // Programa Principal: ProgData.java package progdata; public class ProgData { Data data = new Data(5, 8, 2014); System.out.println(data); Resultado do Programa: Data: 05/08/2014 Solução do programa proposto acima: Classe Vetor e seus métodos. 27
28 // Classe: Vetor.java package progvetor1; public class Vetor { // atributos da classe private final int[] vetor; private int n; private final int max; // construtor Vetor(int numeroelementos) { max = numeroelementos; vetor = new int[max]; n = 0; // add public void add(int valor) { if (n < max) { vetor[n] = valor; n++; else { System.out.println("Erro: Excedeu Limite do Vetor"); // del public int del() { if (n!= 0) { int valor = vetor[n - 1]; n--; return (valor); else { System.out.println("Erro: Vetor Vazio"); return (-999); // length public int length() { return (n); // primeiro public int primeiro() { if (n!= 0) { return (vetor[0]); else { return (-999); // ultimo public int ultimo() { int ultimo = n - 1; if (n!= 0) { return (vetor[ultimo]); else { 28
29 return (-999); // existe public boolean existe(int elemento) { for (int i = 0; i < n; i++) { if (elemento == vetor[i]) { return (true); return (false); // exibe public void exibe() { System.out.print("Vetor: ["); for (int i = 0; i < n; i++) { System.out.print(vetor[i] + ", "); System.out.println("\b\b]"); // numeroelementosvetor public int numeroelementosvetor() { return (n); // Programa Principal: ProgVetor1.java package progvetor1; public class ProgVetor1 { Vetor vetor = new Vetor(5); // 5 é o número de elementos do vetor estático da classe vetor.add(10); vetor.add(20); vetor.add(30); vetor.add(40); vetor.add(50); vetor.exibe(); vetor.add(60); vetor.exibe(); System.out.println("Total de Elementos: " + vetor.numeroelementosvetor()); int valor = vetor.del(); if (valor!= -999) { System.out.println("Valor Excluído: " + valor); else { System.out.println("ERRO: Vetor Vazio"); vetor.exibe(); System.out.println("Total de Elementos: " + vetor.length()); int primeiro = vetor.primeiro(); System.out.println("Primeiro: " + primeiro); int ultimo = vetor.ultimo(); System.out.println("Último: " + ultimo); 29
30 int elemento = 20; boolean flag = vetor.existe(elemento); if (flag) { System.out.println("Existe elemento: " + elemento); else { System.out.println("Não Existe elemento 20"); 1.5 Lista de exercícios: Classes Dado o seguinte programa principal, implemente a classe Circulo e seus métodos: // Programa Principal: ProgCirculo.java package progcirculo; public class ProgCirculo { Circulo circ = new Circulo(); circ.setraio(3); circ.calculaarea(); double area = circ.getarea(); System.out.printf("Área: %.2f\n", area); Observação: area = pi. raio 2 onde pi é Círculo double area, raio setraio calculaarea getarea Diagrama de classe Resultado do Programa: Área: 28, Dado o seguinte programa principal, implemente a classe PesoIdeal e seus métodos: // Programa Principal: ProgPeso.java package progpeso; public class ProgPeso { PesoIdeal pihomem = new PesoIdeal('H', 1.67); PesoIdeal pimulher = new PesoIdeal('m', 1.65); pihomem.calculapesoideal(); System.out.printf("Peso Ideal Homem: %.2f\n", pihomem.getpesoideal()); 30
31 pimulher.calculapesoideal(); System.out.printf("Peso Ideal Mulher: %.2f\n", pimulher.getpesoideal()); Resultado do Programa: Peso Ideal Homem: 63,41 Peso Ideal Mulher: 57,77 Cálculo do Peso Ideal: PIH = 72,7 x altura 58 e PIM = 62,1 x altura 44,7 PesoIdeal double altura, pesoideal char sexo calculapesoideal getpesoideal Diagrama de classe Dado o seguinte programa principal, implemente a classe CPF e seus métodos: // Programa Principal: ProgValidaCPF.java package progvalidacpf; public class ProgValidaCPF { String s = " "; CPF cpf = new CPF(s); int digitoverificador = cpf.verificacpf(); System.out.printf("Digito verificador: %02d\n", digitoverificador); System.out.printf("CPF: %s-%02d\n", s, digitoverificador); Resultado do Programa: Digito verificador: 09 CPF: CPF String cpf int digito verificacpf Diagrama de classe Como calcular os Dígitos do CPF: Entrada: CPF: ) Primeiramente pega-se os dígitos da base do CPF e se faz a soma da multiplicação individual dos dígitos, iniciando por 10 e indo até 2 como exemplificado abaixo: x x x x x x x x x
32 = 210 2) O valor do primeiro dígito é o resultado da subtração de 11 pelo resto da divisão da soma acima por 11. Se este valor for 10 ou 11, o dígito é 0 (zero), do contrário é o próprio valor. No exemplo em questão o dígito encontrado é calculado conforme vê-se a seguir: 11 - (210 % 11) = 10 3) O cálculo do segundo dígito é feito da mesma forma que o primeiro, porém com os 9 dígitos da base do CPF e o primeiro dígito verificador encontrado, iniciando por 11 e indo até x x x x x x x x x x = 255 4) O valor do segundo dígito é o resultado da subtração de 11 pelo resto da divisão da soma acima por 11. Se este valor for 10 ou 11, o dígito é 0 (zero), do contrário é o próprio valor. No exemplo em questão o dígito encontrado é calculado conforme vê-se a seguir: 11 - (255 % 11) = 9 Saída: CPF válido é ou Dado o seguinte programa, implemente a classe DiaSemana e seus métodos: // Programa Principal: ProgDiaSemana.java package progdiasemana; public class ProgDiaSemana { DiaSemana dia = new DiaSemana(10, 2, 1962); dia.verificadiasemana(); dia.exibediasemana(); Resultado do Programa: Dia da Semana: Sábado DiaSemana int dia, mes, ano String semama verificadiasemana exibediasemana Diagrama de classe Como calcular o Dia da Semana: Deve-se calcular o Dia do Século: Para qualquer cálculo com datas é essencial que se disponha do Dia do Século para a(s) data(s) em questão. O Dia do Século é o número de dias decorridos desde o início do século (1º de janeiro de 1901) até a data em questão. Se usa 32
33 como referência 1901 porque a maioria das datas com as quais se trabalha ainda são do século passado. Lá por 2040 ou mais poderá se mudar para A fórmula (válida para datas entre 1901 e 2099) é a seguinte: numerodias = (ano ) * (ano ) DIV 4 + dia + (mês - 1) * 31 - [(mês * ) DIV 10] * [(mês + 12) DIV 15] + [(4 - ano MOD 4) DIV 4] * [(mês + 12) DIV 15] Dados de Teste: Dia: 10 Mês: 2 Ano: 1962 numerodias = (para a data acima) Onde: DIV é a divisão inteira e MOD é o resto inteiro da divisão Verificação do Dia da Semana: Para saber o diasemana basta dividir o numerodias por 7 e entrar com o resto inteiro da divisão na tabela abaixo: 0 Segunda 1 Terça 2 Quarta 3 Quinta 4 Sexta 5 Sábado 6 Domingo Resultado do Programa: (Saída) 10/02/1962 é um(a) Sábado Observação: DIV é divisão inteira de dois números e MOD é o resto inteiro da divisão de dois números Dado o seguinte programa principal, implemente a classe Data e seus métodos: // Programa Principal: ProgTestData.java package progtestdata; public class ProgTestData { Data data = new Data(); data.setdata(25, 8, 2014); data.extenso(); Resultado do Programa: Data: 25 de agosto de 2014 Data int dia, mes, ano setdata extenso Diagrama de classe 33
34 1.5.6 Implemente os métodos forcabruta e bublesort na classe Vetor vista anteriormente (Fonte: ProgVetor). // Programa Principal: ProgVetorSort.java package progvetorsort; public class ProgVetorSort { Vetor vetor = new Vetor(5); vetor.add(40); vetor.add(20); vetor.add(30); vetor.add(50); vetor.add(10); vetor.exibe(); vetor.add(60); vetor.exibe(); vetor.forcabruta(); vetor.exibe(); vetor.bubblesort(); vetor.exibe(); Resultado do Programa: Vetor: [ ] ERRO: Excedeu o Limite do Vetor Vetor: [ ] Vetor: [ ] Vetor: [ ] Dado o seguinte programa principal, implemente a classe Pessoa e seus métodos. // Programa Principal: ProgPessoa.java package progpessoa; public class ProgPessoa { Pessoa p1 = new Pessoa(); Pessoa p2 = new Pessoa(); Pessoa p3 = new Pessoa(); p1.setdados("paulo Roberto", 1962, 'm'); p2.setdados("renato Luis", 1965, 'm'); p3.setdados("francisco Carlos", 1959, 'm'); p1.calculaidade(); p2.calculaidade(); p3.calculaidade(); p1.exibepessoa(); p2.exibepessoa(); p3.exibepessoa(); 34
35 Resultado do Programa: Nome: Paulo Roberto Idade: 52 ano(s) Sexo: Masculino Nome: Renato Luis Idade: 49 ano(s) Sexo: Masculino Nome: Francisco Carlos Idade: 55 ano(s) Sexo: Masculino Pessoa String nome int ano int idade char sexo setdados calculaidade exibepessoa Diagrama de classe Dado o seguinte programa principal, implemente a classe Pessoa e seus métodos. // Programa Principal: ProgPessoa2.java package progpessoa2; public class ProgPessoa2 { Pessoa [] pessoa = new Pessoa[3]; pessoa[0] = new Pessoa(); pessoa[0].setdados("paulo Roberto", 1962, 'm'); pessoa[0].calculaidade(); pessoa[0].exibepessoa(); pessoa[1] = new Pessoa(); pessoa[1].setdados("renato Luis", 1965, 'm'); pessoa[1].calculaidade(); pessoa[1].exibepessoa(); pessoa[2] = new Pessoa(); pessoa[2].setdados("francisco Carlos", 1959, 'm'); pessoa[2].calculaidade(); pessoa[2].exibepessoa(); Resultado do Programa: Nome: Paulo Roberto Idade: 52 ano(s) Sexo: Masculino Nome: Renato Luis Idade: 49 ano(s) 35
36 Sexo: Masculino Nome: Francisco Carlos Idade: 55 ano(s) Sexo: Masculino Pessoa String nome int ano int idade char sexo setdados calculaidade exibepessoa Diagrama de classe Dado o seguinte programa principal, implemente a classe Pessoa e seus métodos. // Programa Principal: ProgPessoas.java package progpessoas; public class ProgPessoas { Pessoa pessoa = new Pessoa(7); pessoa.inseredados("beatriz", 11); pessoa.inseredados("debora", 13); pessoa.inseredados("fátima", 15); pessoa.inseredados("geni", 16); pessoa.inseredados("carla", 12); pessoa.inseredados("eva", 14); pessoa.inseredados("ana", 10); pessoa.exibedados(); pessoa.sort(); pessoa.exibedados(); Resultado do Programa: Lista de Pessoas Nome: Beatriz Idade: 11 Nome: Debora Idade: 13 Nome: Fátima Idade: 15 Nome: Geni Idade: 16 Nome: Carla Idade: 12 Nome: Eva Idade: 14 Nome: Ana Idade: 10 Lista de Pessoas Nome: Ana Idade: 10 Nome: Beatriz Idade: 11 Nome: Carla Idade: 12 Nome: Debora Idade: 13 Nome: Eva Idade: 14 Nome: Fátima Idade: 15 Nome: Geni Idade: 16 36
37 Pessoa String [] nome int [] idade int n int max inseredados exibedados sort Diagrama de classe Dado o seguinte programa principal, implemente a classe Agenda e seus métodos. // Programa Principal: ProgAgenda.java package progagenda; public class ProgAgenda { Agenda agenda = new Agenda(5); agenda.inseretelefone("ana", " "); agenda.inseretelefone("beatriz", " "); agenda.inseretelefone("carla", " "); agenda.inseretelefone("debora", " "); agenda.inseretelefone("eva", " "); agenda.inseretelefone("fátima", " "); String fone = " "; String nome = agenda.consultanome(fone); if (nome.compareto("")!= 0) { System.out.println("Nome: " + nome + " - Telefone: " + fone); else { System.out.println("ERRO: Usuário não Encontrado"); fone = " "; nome = agenda.consultanome(fone); if (nome.compareto("")!= 0) { System.out.println("Nome: " + nome + " - Telefone: " + fone); else { System.out.println("ERRO: Usuário não Encontrado"); Resultado do Programa: ERRO: Excedeu limite da Agenda Nome: Eva - Telefone: ERRO: Usuário não Encontrado Agenda String [] nome String [] fone int n int max inseretelefone consultanome Diagrama de classe 37
38 Dado o seguinte programa principal, implemente a classe Calculadora e seus métodos. // Programa Principal: ProgCalculadora.java package progcalculadora; public class ProgCalculadora { Calculadora calc = new Calculadora(); calc.entradadados(); calc.operacalculadora(); calc.exiberesultadocalculadora(); Observação: A calculadora deve ter as seguintes operações: [+] adição [-] subtração [*] multiplicação [/] divisão [R] Raiz Quadrada [P] Potência [S] Seno [C] Cosseno [T] Tangente Calculadora double x double y char operador double resposta entradadados operacalculadora exiberesultadocalculadora Diagrama de classe Exemplo para testar o programa: Digite um Valor: 3 <enter> Operação [+-*/RrPpSsCcTt]: + <enter> Digite outro Valor: 4 <enter> Primeiro Valor: 3.0 Operador: [Adição] Segundo Valor : 4.0 Resultado da Operação: 7.0 Exemplo da definição de uma classe Data : // Classe: Data.java package progtestadata; 38
39 public class Data { // atributos da classe private final int dia; private final int mes; private final int ano; // construtor da classe public Data(int dia, int mes, int ano) { this.dia = dia; this.mes = mes; this.ano = ano; // sobrecarga do método // método tostring sobrecarregado public String tostring() { return("data: " + this.dia + "/" + this.mes + "/" + this.ano); Programa exemplo: Programa que utiliza a classe Data definida anteriormente: // Programa Principal: ProgTestaData.java package progtestadata; public class ProgTestaData { Data data = new Data(16, 3, 2010); // construtor irá receber 3 argumentos System.out.println(data); Resultado do Programa: Data: 16/3/2010 Exemplo da definição de uma classe Calculadora : // Classe: Calculadora.java package progcalculadora; import java.util.scanner; public class Calculadora { // atributos da classe private double x; private double y; private double resultado; private char operador; // construtor // métodos públicos da classe 39
40 public void entradadados() { Scanner input = new Scanner(System.in); System.out.print("Digite um Valor: "); String s = input.nextline(); s = s.replaceall("[^0-9\\-.]", ""); // eliminação de letras digitadas de forma indevida x = Double.parseDouble(s); // que não podem ser convertidas para double do { System.out.print("Operação [+-*/RrPpSsCcTt]: "); s = input.nextline(); operador = s.charat(0); while (!strchr("+-*/rrppsscctt", operador)); if (strchr("+-*/pp", operador)) { System.out.print("Digite outro Valor: "); s = input.nextline(); s = s.replaceall("[^0-9\\-.]", ""); // eliminação de letras digitadas de forma indevida y = Double.parseDouble(s); // que não podem ser convertidas para double public void operacalculadora() { switch (operador) { case '+': resultado = add(); case '-': resultado = sub(); case '*': resultado = mul(); case '/': resultado = div(); case 'P': case 'p': resultado = pot(); case 'R': case 'r': resultado = raiz(); case 'S': case 's': resultado = sen(); case 'C': case 'c': resultado = cos(); case 'T': case 't': resultado = tan(); public void exiberesultadocalculadora() { String nomeoperador; 40
41 System.out.println("Primeiro Valor: " + x); switch (operador) { case '+': nomeoperador = "Adição"; case '-': nomeoperador = "Subtração"; case '*': nomeoperador = "Multiplicação"; case '/': nomeoperador = ("Divisão"); case 'R': case 'r': nomeoperador = "Raiz Quadrada"; case 'P': case 'p': nomeoperador = "Potência"; case 'S': case 's': nomeoperador = "Seno"; case 'C': case 'c': nomeoperador = "Cosseno"; case 'T': case 't': nomeoperador = "Tangente"; default: nomeoperador = "Operador Inválido"; System.out.printf("Operação realizada: [%s]\n", nomeoperador); System.out.println("Segundo Valor : " + y); System.out.println("Resultado da Operação: " + resultado); // métodos privados da classe private double add() { return (x + y); private double sub() { return (x - y); private double mul() { return (x * y); private double div() { return (x / y); private double pot() { return (Math.pow(x, y)); private double raiz() { return (Math.sqrt(x)); private double sen() { double rads = converteradianos(x); 41
42 return (Math.sin(rads)); private double cos() { double rads = converteradianos(x); return (Math.cos(rads)); private double tan() { double rads = converteradianos(x); return (Math.tan(rads)); // métodos estáticos da classe private static boolean strchr(string s, char ch) { int n = s.length(); for (int i = 0; i < n; i++) { if (s.charat(i) == ch) { return (true); return (false); private static double converteradianos(double graus) { double rads = Math.PI * graus / 180.0; return (rads); Programa exemplo: Utiliza a classe Calculadora e seus métodos definidos acima: // Programa Principal: ProgCalculadora.java package progcalculadora; public class ProgCalculadora { Calculadora calc = new Calculadora(); // classe não recebe argumentos, não é necessário ela ter construtor calc.entradadados(); calc.operacalculadora(); calc.exibecalculadora(); Programa exemplo: Mostra outra forma de utilizar a função strchr oriunda da linguagem de programação C e C++ utilizando o método indexof do Java. // Programa Principal: ProgstrChr.java package progstrchr; import java.util.scanner; public class ProgstrChr { 42
43 Scanner entrada = new Scanner(System.in); String nome, s; do { System.out.print("Nome: "); nome = entrada.nextline(); int n = nome.length(); System.out.println(nome + " seu nome tem " + n + " caracteres"); do { System.out.print("Continua [S/N]? " ); s = entrada.nextline(); while ("SsNn".indexOf(s) == -1); while ("Nn".indexOf(s) == -1); // ou... while ("S".equalsIgnoreCase(s)); Exemplo para testar o programa: Nome: Paulo Roberto Gomes Luzzardi <enter> Paulo Roberto Gomes Luzzardi seu nome tem 28 caracteres Continua [S/N]? N <enter> Modificadores de Acesso: public: Os atributos e métodos tornam-se públicos, ou seja, qualquer outro método pode chamar ou utilizar estes atributos e/ou métodos. private: Somente os métodos da classe (membros) da classe podem chamar ou utilizar atributos ou métodos privados. protected: Utilizado em herança simples de classe (construção de subclasses), ou seja, uma subclasse herda todos os atributos e métodos da classe base (superclasse). Deixa acessível os atributos e/ou métodos para todas as outras classes (classe base) e subclasses (classe derivada). 43
44 2. Interface e Polimorfismo 2.1 Interface Uma interface é uma especificação que define um determinado conjunto de métodos que serão implementados nas classes desta interface. Para uma interface ser integralmente abstrata, seus métodos devem ser definidos como abstract e as variáveis por padrão são sempre constantes (static final). Uma interface é definida através da palavra reservada interface e uma classe para implementar uma interface usa a palavra reservada implements. Como Java não possui herança múltipla, a implementação de interfaces supram esta carência, como uma classe só pode herdar apenas uma vez, pode-se implementar inúmeras interfaces. As classes que implementam uma interface terão obrigatoriamente que ter todos os métodos da interface ou se transformar em uma classe abstrata. // Programa Principal: ProgInterface.java package proginterface; public class ProgInterface { Homem homem = new Homem("Paulo Roberto"); Mulher mulher = new Mulher("Adriane Maria"); homem.exibenome(); homem.exibesexo(); mulher.exibenome(); mulher.exibesexo(); // Classe: Pessoa.java package proginterface; public interface Pessoa { public abstract void exibenome(); public abstract void exibesexo(); // Classe: Homem.java package proginterface; public class Homem implements Pessoa { 44
45 // atributos da classe private final String nome; private static final char sexo = 'm'; Homem(String nome) { this.nome = // método exibenome sobrecarregado public void exibenome() { System.out.println("Homem: " + // método exibesexo sobrecarregado public void exibesexo() { System.out.println("Sexo: Masculino -> " + sexo); // Classe: Mulher.java package proginterface; public class Mulher implements Pessoa{ // atributos da classe private final String nome; private static final char sexo = 'f'; Mulher(String nome) { this.nome = // método exibenome sobrecarregado public void exibenome() { System.out.println("Mulher: " + // método exibesexo sobrecarregado public void exibesexo() { System.out.println("Sexo: Feminino -> " + sexo); Resultado do Programa: Homem: Paulo Roberto Sexo: Masculino -> m Mulher: Adriane Maria Sexo: Feminino -> f // Programa Principal: ProgPixel.java package progpixel; public class ProgPixel { Pixel2D pixel2d = new Pixel2D(3, 4); Pixel3D pixel3d = new Pixel3D(5, 6, 7); 45
46 pixel2d.exibe(); pixel2d.setx(7); pixel2d.sety(8); pixel2d.exibe(); pixel3d.exibe(); pixel3d.setx(1); pixel3d.sety(2); pixel3d.setz(3); pixel3d.exibe(); // Interface: Pixel.java package progpixel; public interface Pixel { public abstract void setx(int x); public abstract void sety(int y); public abstract void setz(int z); public abstract void exibe(); // Classe: Pixel2D.java package progpixel; public class Pixel2D implements Pixel { private int x; private int y; Pixel2D(int x, int y) { this.x = x; this.y = public void setx(int x) { this.x = public void sety(int y) { this.y = public void setz(int z) public void exibe() { System.out.printf("x = %d y = %d\n", x, y); // Classe: Pixel3D.java 46
47 package progpixel; public class Pixel3D implements Pixel { private int x; private int y; private int z; Pixel3D(int x, int y, int z) { this.x = x; this.y = y; this.z = public void setx(int x) { this.x = public void sety(int y) { this.y = public void setz(int z) { this.z = public void exibe() { System.out.printf("x = %d y = %d z = %d\n", x, y, z); Resultado do Programa: x = 3 y = 4 x = 7 y = 8 x = 5 y = 6 z = 7 x = 1 y = 2 z = Polimorfismo Conforme dito anteriormente, Polimorfismo, do grego: muitas formas, é a capacidade de objetos diferentes reagirem segundo a sua função a uma ordem padrão. Significa que o nome de um objeto pode ser utilizado para vários propósitos ligeiramente diferentes, ou seja,... uma interface, vários métodos.... A característica de polimorfismo é utilizada principalmente em sobrecarga de métodos e operadores e classes abstratas, onde os métodos são declarados abstratos mas não definidos. Como tipos de polimorfismo tem-se: (a) Universal (inclusão [como em Java, por exemplo, List lista = new LinkedList();] e paramétrico [templates 47
48 como em C++]) e (b) ad-hoc (sobrecarga de métodos e operadores). Java não possui sobrecarga de operadores. Sobrecarga de Operador: Permite sobrecarregar operadores para realizar diferentes tipos de operações; Sobrecarga de Método: Permite que um método retorne diferentes tipos de informações e aceite argumentos de vários tipos, inclusive com quantidade diferentes de argumentos; Classes abstratas e concretas: Permite representar entidades e conceitos abstratos, sendo sempre uma superclasse (ou classe Base) e não permite ser instanciada, a classe abstrata apenas define um modelo (template) para uma funcionalidade e fornece uma implementação incompleta que é herdada pelas classes derivadas. Cada classe derivada implementa as funcionalidades da classe abstrata. Uma classe abstrata pode possuir métodos abstratos, mas os métodos são escritos nas classes derivadas concretas. Métodos abstratos definem apenas a forma do método não contendo nenhum tipo de código. Classes concretas implementam todos os métodos e podem ser instanciadas. Polimorfismo é o princípio no qual duas ou mais classes derivadas de uma mesma classe base podem implementar métodos que têm a mesma especificação, mas tem comportamentos diferentes, especializadas para cada uma das classes derivadas, utilizando uma referência a cada um dos objetos da classe base. Polimorfismo significa várias formas, onde um objeto pode se comportar de formas ligeiramente diferentes ao receber uma mensagem. Através do mecanismo de sobrecarga, dois métodos de uma classe podem ter o mesmo nome, desde que suas implementações sejam diferentes, entretanto isso não é considerado polimorfismo em Java. No polimorfismo é necessário que os métodos tenham exatamente a mesma especificação, sendo utilizado um mecanismo de redefinição de métodos nas classes derivadas. // Programa Principal: ProgPolimorfismo.java package progpolimorfismo; 48
49 public class ProgPolimorfismo { Pessoa homem = new Homem(1.64, 'm'); System.out.printf("Peso Ideal: %.2f (%s)\n", homem.calculapesoideal(), homem.getsexo()); Pessoa mulher = new Mulher(1.64, 'f'); System.out.printf("Peso Ideal: %.2f (%s)\n", mulher.calculapesoideal(), mulher.getsexo()); // Classe Base: Pessoa.java package progpolimorfismo; abstract class Pessoa { protected Double altura; protected Character sexo; public abstract Double calculapesoideal(); public abstract String getsexo(); // Classe Derivada: Homem.java package progpolimorfismo; class Homem extends Pessoa { Homem(Double altura, Character sexo) { this.altura = altura; this.sexo = public Double calculapesoideal() { Double pesoideal = 72.7 * altura ; return public String getsexo() { return("masculino"); // Classe Derivada: Mulher.java package progpolimorfismo; class Mulher extends Pessoa{ Mulher(Double altura, Character sexo) { this.altura = altura; this.sexo = public Double calculapesoideal() { Double pesoideal = 62.1 * altura ; return (pesoideal); 49
50 @Override public String getsexo() { return("feminino"); Resultado do Programa: Peso Ideal: 61,23 (Masculino) Peso Ideal: 57,14 (Feminino) 2.3 Lista de Exercícios: Interface e Polimorfismo Dado o seguinte programa principal: // Programa Principal: ProgInterface_1.java package proginterface_1; public class ProgInterface_1 { Cardeal cardeal = new Cardeal("Cardeal", "Vermelho", "Cinza"); CardealBanhado cardealbanhado = new CardealBanhado("Cardeal Banhado", "Vermelho", "preto"); cardeal.exibenome(); cardeal.exibecores(); cardealbanhado.exibenome(); cardealbanhado.exibecores(); e a seguinte interface (Passaro): // Interface: Passaro.java package proginterface_1; public interface Passaro { public final int patas = 2; public abstract void exibenome(); public abstract void exibecores(); // não pode ser private Complemente o código do programa criando as classes Cardeal e CardealBanhado para que o programa tenha o seguinte resultado na sua execução: Resultado do Programa: Nome do Pássaro: Cardeal Número de Patas: 2 Cor do Topete: Vermelho 50
51 Cor do Corpo: Cinza Nome do Pássaro: Cardeal Banhado Número de Patas: 2 Cor do Topete: Vermelho Cor do Corpo: preto Dado o seguinte programa principal: // Programa Principal: ProgInterface_2.java package proginterface_2; public class ProgInterface_2 { Homem homem = new Homem(); Mulher mulher = new Mulher(); homem.setdados("paulo Roberto", 52, 'm'); mulher.setdados("adriane Maria", 45, 'f'); System.out.println(homem); System.out.println(mulher); e a seguinte interface (Pessoa): // Interface: Pessoa.java package proginterface_2; public interface Pessoa { public abstract void setdados(string nome, int idade, char sexo); public abstract String tostring(); Resultado do Programa: Homem: Paulo Roberto Idade: 52 Sexo: MASCULINO Mulher: Adriane Maria Idade: 45 Sexo: FEMININO 51
52 3. Herança em Java A ideia básica da herança é que uma classe herde as características de outra classe. Java possui apenas herança simples, ou seja, não permite herança múltipla. 3.1 Herança simples A herança simples permite que uma classe incorpore os atributos e métodos (características) de outra classe, ou seja, permite a construção de uma hierarquia de classes. Lembre: Java não possui herança múltipla, ou seja, tipo de herança em que uma classe derivada herda características de várias classes Base. O primeiro passo envolve a definição de uma classe base (superclasse) que define as características comuns à todos os objetos derivados desta classe. As classes oriundas da classe base são chamadas classes derivadas ou extensão da classe (subclasse) (Figura 2). Figura 2: Exemplo de Herança em Java Uma classe derivada herda todas as características da classe base e pode ter novas características adicionadas a ela. Uma classe derivada segue a seguinte diretriz em relação a classe base: classe_derivada é um(a) classe_base; Como verificar um caso de Herança: um cardial é um pássaro // classe base: pássaro // classe derivada: cardial 52
53 Especificadores de acesso: ü public (público) ü ü ü Quem tem acesso à classe tem acesso também a qualquer membro público. É raro ter atributos públicos, mas é comum ter métodos públicos. Qualquer método tem acesso. ü private (privado) ü ü Um membro privado não é acessível fora da classe, somente pelos membros da classe. A intenção é permitir que apenas quem escreve a classe possa usar esse membro. ü protected (protegido) ü ü O membro protegido é acessível à classe e a suas sub-classes (classes derivadas). A intenção é dar acesso aos programadores que estenderão sua classe. 3.2 Controle de acesso na definição de uma classe derivada Quando uma classe derivada é definida, ou seja, na definição de herança simples, seus membros (atributos e métodos) são declarados internamente e o acesso a estes pode ser público (public), privativo (private) ou protegido (protected). O acesso a membros protegidos é igual ao acesso a membros privativos, exceto para o acesso das classes derivadas da classe. A forma geral de especificar herança simples é: Especificador_de_acesso class nome_classe_derivada extends nomeclasse_base { // atributos da classe derivada // métodos da classe derivada Quando uma classe herda as características de outra classe, todos os membros da classe base tornam-se membros da classe derivada. O tipo de acesso da classe base dentro da classe derivada é determinado pelo especificador de acesso. Qualquer que seja o especificador de acesso, membros privativos da classe base continuam sendo propriedade privada da classe base, e não podem ser acessados por classes derivadas. Quando o especificador de acesso é public, todos os membros públicos da classe base tornam-se membros públicos da classe derivada, e os membros protegidos da classe base tornam-se membros protegidos da classe derivada. Esta é a diferença que existe entre membros privativos e membros protegidos. 53
54 Quando o especificador de acesso é private, todos os membros públicos e protegidos da classe base tornam-se membros privativos da classe derivada, ou seja, a classe derivada não pode transferir seus privilégios de acesso a outras classes. Quando o especificador de acesso é protected, todos os membros públicos e protegidos da classe base tornam-se membros protegidos da classe derivada. Programa exemplo: O objetivo deste programa, a seguir, é demonstrar a utilização de herança simples onde os atributos da classe base são privados. // Programa Principal: ProgHeranca.java package progheranca; public class ProgHeranca { Derivada objeto = new Derivada(3); int resp; objeto.setatributos(1, 2); resp = objeto.soma(); System.out.println("Somador (x + y + z): " + objeto.somador(resp)); // Classe Base: Base.java package progheranca; public class Base { private int x, y; // atributos privados public void setatributos(int a, int b) { x = a; y = b; System.out.println("x = " + x); System.out.println("y = " + y); public int soma() { System.out.println("Soma (x + y): " + (x + y)); return(x + y); // Classe Derivada: Derivada.java package progheranca; public class Derivada extends Base { private int z; 54
55 Derivada(int x) { z = x; System.out.println("z = " + z); public int somador(int soma) { return(soma + z); // não é possível acessar x e y pois são privados da classe base Resultado do Programa: z = 3 x = 1 y = 2 Soma (x + y): 3 Somador (x + y + z): 6 Responda: Porque o atributo z é exibido primeiro? Base int x int y setatributos(int a, int b); soma(); Classe base (superclasse) Derivada int z int somador(int soma); Classe derivada (subclasse) 3.3 Tipos de acessos (especificadores de acesso) ü ü public (público): Todos os atributos da classe base são públicos na classe derivada. private (privado): Os atributos só podem ser acessados pelos métodos que fazem parte da classe. ü protected (protegido): Os atributos podem ser acessados pelos métodos de classes derivadas. Programa exemplo: O objetivo do próximo programa é demonstrar a utilização de herança simples tendo os atributos da classe base como protegidos. // Programa Principal: ProgHeranca2.java package progheranca2; public class ProgHeranca2 { 55
56 Derivada objeto = new Derivada(3); int resp; objeto.setatributos(1, 2); resp = objeto.soma(); System.out.println("Somador (x + y + z): " + objeto.somador(resp)); // Classe Base: base.java package progheranca2; public class Base { protected int x, y; // atributos protegidos public void setatributos(int a, int b) { x = a; y = b; System.out.println("x = " + x); System.out.println("y = " + y); public int soma() { System.out.println("Soma (x + y): " + (x + y)); return(x + y); // Classe Derivada: Derivada.java package progheranca2; public class Derivada extends Base { private int z; Derivada(int x) { z = x; System.out.println("z = " + z); public int somador(int soma) { return(x + y + z); // é possível acessar x e y pois são protegidos na classe base Resultado do Programa: z = 3 x = 1 y = 2 Soma (x + y): 3 Somador (x + y + z): 6 O comando Super faz uma chamada formal ao construtor padrão da classe-pai. A seguir, o programa exemplo mostra a utilização do comando Super. 56
57 // Classe Derivada: Derivada.java package progheranca3; public class Derivada extends Base { private int z; Derivada(int x) { super(10, 20); // chamada formal ao construtor da classe pai //super(); z = x; System.out.println("z = " + z); public int somador(int soma) { return(x + y + z); // é possível acessar x e y pois são privados a classe base protected void finalize() { // chamada do destrutor formal da classe System.out.println("Derivada: Final"); // Classe Base: Base.java /* A palavra-chave super permite acesso ao construtor da superclasse (base). Note que se não houver, no construtor da subclasse, nenhuma chamada explicita ao construtor da superclasse, o construtor sem argumento é chamado por default. Se for incluída uma chamada ao construtor da superclasse, ela deve ser o primeiro comando executado no construtor da subclasse */ package progheranca3; public class Base { protected int x, y; // atributos protegidos Base() { // construtor default this.x = 0; this.y = 0; System.out.println("x = " + this.x + " - y = " + this.y); Base(int a, int b) { // construtor sobrecarregado this.x = a; this.y = b; System.out.println("x = " + this.x + " - y = " + this.y); public void setatributos(int a, int b) { x = a; y = b; System.out.println("x = " + x); System.out.println("y = " + y); protected int soma() { System.out.println("Soma (x + y): " + (x + y)); 57
58 return(x + y); // Programa Principal: ProgHeranca3.java package progheranca3; public class ProgHeranca3 { Derivada objeto = new Derivada(3); int resp; objeto.setatributos(1, 2); resp = objeto.soma(); System.out.println("Somador (x + y + z): " + objeto.somador(resp)); Resultado do Programa: x = 10 - y = 20 z = 3 x = 1 y = 2 Soma (x + y): 3 Somador (x + y + z): Lista de exercícios: Herança Herança (primeiro) Dado os seguintes códigos em Java: // Programa Principal: ProgTestaHeranca.java package progtestaheranca; public class ProgTestaHeranca { Cliente cliente = new Cliente("Paulo Roberto", " ", ); cliente.imprimepessoa(); cliente.imprimecliente(); // Classe: Pessoa.java package progtestaheranca; public class Pessoa { protected String nome; 58
59 protected String cpf; Pessoa() { this.nome = "xxxx"; this.cpf = "xxx.xxx.xxx-xx"; Pessoa(String nome, String cpf) { this.nome = nome; this.cpf = cpf; public void imprimepessoa() { System.out.println("Nome: " + nome); System.out.println("CPF: " + cpf); // Classe: Cliente.java package progtestaheranca; public class Cliente extends Pessoa { private double conta; Cliente(String nome, String cpf, double conta) { this.conta = conta; public void imprimecliente() { System.out.println("Conta: " + conta); Resultado esperado do programa: Nome: Paulo Roberto CPF: Conta: Resultado real do programa: Nome: xxxx CPF: xxx.xxx.xxx-xx Conta: Que modificações devem ser feitas no código fonte para que o resultado do programa seja o esperado? Herança (segundo) 59
60 Dado a classe base Pessoa e o programa principal TestaHomem (nada deve ser alterado nestas duas classes), construa as classes derivadas Homem e Mulher que contenha os atributos e métodos abaixo descritos: // Classe: Pessoa.java package progtestahomem; public class Pessoa { protected double altura; protected char sexo; Pessoa() { this.altura = 0.0; this.sexo = 'g'; Pessoa(double altura, char sexo) { this.altura = altura; this.sexo = sexo; public void imprimepessoa() { System.out.println("Altura: " + altura); System.out.println("Sexo: " + sexo); Pessoa double altura char sexo imprimepessoa Classe base (superclasse) Homem double pesoidealhomem calculapesoidealhomem imprimepesoidealhomem Classe derivada (subclasse) Mulher double pesoidealmulher calculapesoidealmulher imprimepesoidealmulher Classe derivada (subclasse) // Programa Principal: ProgTestaHomem.java package progtestahomem; public class ProgTestaHomem { Homem homem = new Homem(1.64, 'm'); Mulher mulher = new Mulher(1.59, 'f'); homem.calculapesoidealhomem(); homem.imprimepessoa(); 60
61 homem.imprimepesoidealhomem(); mulher.calculapesoidealmulher(); mulher.imprimepessoa(); mulher.imprimepesoidealmulher(); Resultado do Programa: Altura: 1.64 Sexo: m Peso Ideal (Homem): 61,23 Altura: 1.59 Sexo: f Peso Ideal (Mulher): 54, Herança (terceiro) Dados os seguintes códigos em Java (que não devem ser alterados de forma alguma): // Programa Principal: ProgTestaObjetos.java package progtestaobjetos; public class ProgTestaObjetos { Linha linha = new Linha(1, 2, 3, 4); Retangulo retangulo = new Retangulo(1, 2, 3, 4); linha.imprimelinha("linha"); retangulo.imprimeretangulo("retângulo"); // Classe Base: Ponto.java package progtestaobjetos; public class Ponto { protected int x; protected int y; Ponto() { x = 0; y = 0; Ponto(int x, int y) { this.x = x; this.y = y; public void imprimeponto() { System.out.println("x = " + x + " - y = " + y); 61
62 // Classe Derivada: Linha.java package progtestaobjetos; public class Linha extends Ponto { private final Ponto p1; private final Ponto p2; Linha (int xi, int yi, int xf, int yf) { p1 = new Ponto(xi, yi); p2 = new Ponto(xf, yf); public void imprimelinha() { p1.imprimeponto("p1"); p2.imprimeponto("p2"); Implemente a classe derivada Retangulo (Figura 3) para que o programa funcione conforme o resultado do programa abaixo: Resultado do Programa: Linha: x = 1 - y = 2 x = 3 - y = 4 Retângulo: x = 1 - y = 2 x = 3 - y = 2 x = 3 - y = 4 x = 1 - y = 4 Figura 3: Objetos gráficos: Linha e Retângulo 62
63 4. Métodos de entrada e saída de dados A seguir, são mostrados basicamente três (3) métodos (maneiras/formas) que permitem fazer entrada de dados via teclado e saída de dados via monitor (tela) em Java. 4.1 Entrada de dados via teclado Scanner: A seguir é visto um programa exemplo onde a entrada de dados utilizando a classe Scanner e seus métodos. Programa exemplo: Mostra a entrada de dados, via teclado, em terminal de texto, utilizando a classe Scanner e alguns de seus métodos. // Programa Principal: ProgScanner.java package progscanner; import java.util.scanner; public class ProgScanner { Scanner input = new Scanner (System.in); System.out.print("Inteiro: "); String s = input.nextline(); Integer x = Integer.parseInt(s); System.out.println("Valor: " + x); // lê uma string via teclado // converte a String para inteiro Exemplo para testar o programa: Inteiro: 7 <enter> Valor: 7 A seguir, o programa exemplo, mostra como fazer a leitura de int, float, double ou byte via teclado. // Programa Principal: ProgEntradaDados.java package progentradadados; import java.util.scanner; public class ProgEntradaDados { Scanner input = new Scanner(System.in); 63
64 System.out.print("Digite um Inteiro: "); Integer inteiro = input.nextint(); System.out.println("INTEIRO: " + inteiro + " -> SizeOf: " + sizeof(inteiro) + " Byte(s)"); System.out.print("Digite um Float: "); Float numfloat = input.nextfloat(); System.out.println("FLOAT: " + numfloat + " -> SizeOf: " + sizeof(numfloat) + " Byte(s)"); System.out.print("Digite um Double: "); Double numdouble = input.nextdouble(); System.out.println("DOUBLE: " + numdouble + " -> SizeOf: " + sizeof(numdouble) + " Byte(s)"); System.out.print("Digite um Byte: "); Byte numbyte = input.nextbyte(); System.out.println("BYTE: " + numbyte + " -> SizeOf: " + sizeof(numbyte) + " Byte(s)"); // métodos estáticos sobrecarregados public static int sizeof(boolean b) { return(1); public static int sizeof(byte b) { return(1); public static int sizeof(character c) { return(2); public static int sizeof(short s) { return(2); public static int sizeof(integer i) { return(4); public static int sizeof(long l) { return(8); public static int sizeof(float f) { return(4); public static int sizeof(double d) { return(8); Exemplo para testar o programa: Digite um Inteiro: 123 <enter> INTEIRO: 123 -> SizeOf: 4 Byte(s) Digite um Float: 123,45 <enter> FLOAT: > SizeOf: 4 Byte(s) Digite um Double: 123,45 <enter> DOUBLE: > SizeOf: 8 Byte(s) 64
65 Digite um Byte: 123 <enter> BYTE: 123 -> SizeOf: 1 Byte(s) Swing: A seguir, é visto um programa exemplo de entrada de dados utilizando a classe swing e seus métodos. Programa exemplo: A entrada de dados, via teclado, é feita em caixa de diálogo gráfica sobreposta a interface utilizando a classe swing e alguns dos seus métodos. // Programa Principal: ProgSwing.java package progswing; import javax.swing.*; // carrega toda o pacote swing public class ProgSwing { String s = JOptionPane.showInputDialog("Digite um Número: "); int x = Integer.parseInt(s); JOptionPane.showMessageDialog(null, "Inteiro: " + x, "Resultado", JOptionPane.PLAIN_MESSAGE); // JOptionPane.showMessageDialog(null, "Inteiro: " + x); // funciona também, pois os dois últimos argumentos podem ser suprimidos BufferReader e InputStreamReader: A seguir é visto um programa exemplo de entrada de dados utilizando o pacote java.io com as classes BufferReader e InputStreamReader e seus métodos. Programa exemplo: Entrada de dados via teclado em terminal de texto utilizando as bibliotecas BufferedReader e InputStreamReader e alguns dos seus métodos mais importantes. // Programa Principal: ProgBuffer.java package progbuffer; import java.io.bufferedreader; import java.io.ioexception; import java.io.inputstreamreader; public class ProgBuffer { public static void main(string[] args) throws IOException { BufferedReader userinput = new BufferedReader (new InputStreamReader(System.in)); System.out.print("Nome: "); String nome = userinput.readline(); Integer n = nome.length(); 65
66 System.out.println("Nome: " + nome + " tem " + nome.length() + " caracteres"); Resultado do Programa: Nome: Paulo Roberto <enter> Nome: Paulo Roberto tem 13 caracteres Observação: O programa, a seguir, serve para o pessoal que vai para a Maratona de Programação e precisa ler vários dados em apenas uma linha. // Programa Principal: ProgBufferReader.java package progbufferreader; import java.io.bufferedreader; import java.io.bufferedwriter; import java.io.ioexception; import java.io.inputstreamreader; import java.io.outputstreamwriter; public class ProgBufferReader { public static void main(string[] args) throws IOException { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out)); String text = in.readline(); String [] partes = text.split(" "); int n = partes.length; for (int i = 0;i < n;i++) { int t = Integer.parseInt(partes[i]); out.write("valor: " + t); out.newline(); out.flush(); Entrada: <enter> Saída: Valor: 10 Valor: 20 Valor: Saída de dados via tela A seguir é visto um programa exemplo de saída de dados na tela utilizando o método System.out.print. Programa exemplo: Mostrando a saída de dados, via tela, utilizando os métodos System.out.print, System.out.println ou System.out.printf. 66
67 // Programa Principal: ProgPrint.java package progprint; import java.util.scanner; public class ProgPrint { Scanner entrada = new Scanner (System.in); String s; int x; System.out.print("Inteiro: "); s = entrada.nextline(); x = Integer.parseInt(s); System.out.println("Valor: " + x); System.out.printf("Valor: %03d\n ", x); Entrada: Inteiro: 16 <enter> Saída: Valor: 16 Valor: 016 A seguir é visto um exemplo de saída de dados na tela utilizando a classe swing e seus principais métodos. Programa exemplo: Mostra a saída de dados, via tela, em caixa de diálogo gráfica sobreposta a interface usando a classe swing e alguns dos seus métodos. // Programa Principal: ProgSwingSaida.java package progswingsaida; import javax.swing.*; // carrega toda a biblioteca swing public class ProgSwingSaida { String s; s = JOptionPane.showInputDialog("Digite um Número: "); int x = Integer.parseInt(s); JOptionPane.showMessageDialog(null, "Inteiro: " + x, "Resultado", JOptionPane.PLAIN_MESSAGE); Sintaxe: JOptionPane.showMessageDialog(null, x = + x, Título, JOptionPane.PLAIN_MESSAGE); null significa que a mensagem será centralizada x = + x significa que sairá na caixa de dialogo x = 5 (por exemplo) Título significa o título da caixa de diálogo JOptionPane.PLAIN_MESSAGE significa caixa sem ícone 67
68 Tipo de Ícone Ícone de erro Ícone de informação i Ícone de advertência! Ícone de pergunta? Sem ícone Tabela 1: Tipos de Ícones Tipo de Mensagem JOptionPane.ERROR_MESSAGE JOptionPane.INFORMATION_MESSAGE JOptionPane.WARNING_MESSAGE JOptionPane.QUESTION_MESSAGE JOptionPane.PLAIN_MESSAGE 4.3 Saída formatada (System.out.printf) Como na linguagem de programação C, as saídas (impressões) na tela podem ser formatadas em Java utizando-se o método System.out.printf. Sintaxe: System.out.printf ("string de controle", lista de variáveis); String de controle: Formada pelos caracteres que o método imprime na tela, e pelos comandos de formatação (%c, %s, %d, %f) que definem a maneira como as variáveis serão impressas e caracteres especiais (\n, \t,...). Tabela 2: Comandos de formatação Código Tipo Formato %s String String (vetor de caracteres) %d int Inteiro decimal com sinal %i int Inteiro decimal com sinal %o int Inteiro octal sem sinal %u int Inteiro decimal sem sinal %x int Inteiro hexadecimal sem sinal (com a, b, c, d, e, f) %X int Inteiro hexadecimal sem sinal (com A, B, C, D, E, F) %f float Valor com sinal da forma [-]dddd.dddd %e float Valor com sinal da forma [-]d.dddd e [+/-]ddd %g float Valor com sinal na forma e ou f baseado na precisão do valor dado %E float Mesmo que e, mas com E para expoente %G float Mesmo que g, mas com E para expoente %c char Um caracter %% nada O caracter % é impresso Flags (Bandeiras): ü (-) Alinha o resultado à esquerda. Preenche o restante do campo com brancos. Se não é colocado, alinha o resultado à direita e preenche o restante à esquerda com zeros ou brancos. ü (+) O resultado sempre começa com o sinal + ou - ü (#) Especifica que o argumento será impresso usando uma das formas alternativas Formas alternativas: ü 0 É colocado zeros (0) antes do argumento ü x ou X É colocado 0x (ou 0X) antes do argumento 68
69 Especificadores de largura do campo a ser impresso (exemplos): Tabela 3: Especificadores de largura do campo Prefixo 6d 6o 8x 10.2e 10.2f %-+# x0022b +5.50e %-+# x22b +5.50e % b +5.50e % b +5.50e %-# x00022b 05.50e %-# x22b 5.50e % b 05.50e % b 5.50e %+# x0022b +5.50e %+# x22b +5.50e % b +5.50e % b +5.50e %# x00022b 05.50e %# x22b 5.50e % b 05.50e % b 5.50e Lista de Exercícios: Métodos de Entrada e Saída Escreva um programa em Java que lê n valores inteiros (todos na mesma linha separados por um espaço em branco + <enter>). Imprima a quantidade de valores digitados, a média dos valores, o maior e o menor valor (conforme exemplo abaixo). Entrada: <enter> Saída: Quantidade de Valores Digitados: 9 Média: 50.0 Maior: 90 Menor: Escreva um programa em Java que recebe via teclado: número de elementos e os n elementos inteiros. O programa deve ordenar e imprimir na tela os valores em ordem crescente (conforme exemplos abaixo). Entrada: 7 <enter> <enter> Saída: Entrada: 7 <enter> <enter> ou Saída: Erro na Entrada dos valores 69
70 5. Interfaces e Containers (Classes existentes em Java) Java possui diversas classes pré-existentes chamadas container. Um container ou coleção é simplesmente um objeto que agrupa múltiplos elementos em uma única unidade. As coleções são utilizadas para armazenar, recuperar e manipular dados agregados. (Tabela 4): A seguir pode-se ver algumas classes, coleções ou implementações existentes em Java Tabela 4: Lista de Container Container Descrição Array DList SList HashMap OrderedMap HashSet OrderedSet PriorityQueue Queue Stack Deque Array expansível Lista Duplamente Encadeada Lista Encadeada Simples fast associative container associative container fast set or multiset set or multiset array-based heap Fila (Interface) Pilha Fila Dupla (duas entradas e duas saídas) 5.1 Coleções (Collection FrameWork) Pacote: import java.util.*; Uma coleção é um objeto que representa um grupo de objetos. Uma Collection Framework é uma arquitetura para representar e manipular coleções independentes dos detalhes de sua implementação. Uma coleção é composta de Interfaces e Implementações. 5.2 Interfaces Uma interface é uma especificação de uma classe, ou seja, é um modelo para classes desta interface. Cada classe de uma interface implementa os métodos de uma forma diferente do modelo da interface. 70
71 Interfaces e suas Implementações (apenas as principais implementações) Sets (Conjuntos): Não aceitam valores repetidos, ou seja, os valores armazenados no conjunto são únicos: o HashSet: É o mais rápido, usando uma HashTable, onde seus elementos não são ordenados; o o LinkedHashSet: Os elementos continuam na ordem que são inseridos; TreeSet: Implementa um algoritmo conhecido por red-black tree, ou seja, uma Lists (Listas): árvore rubro-negra. o Vector: Classe obsoleta que implementa um vetor dinâmico, ou seja, não é necessário especificar o tamanho do vetor (usa uma lista encadeada simples); o o Stack: Implementa uma pilha dinâmica; LinkedList: Implementa uma lista encadeada simples, ou seja, uma lista dinâmica; o ArrayList: Implementa um vetor dinâmico, ou seja, não é necessário especificar o tamanho do vetor (usa uma lista encadeada simples). Queue (Filas): Implementa uma fila dinâmica através de uma lista encadeada simples. o LinkedList: Lista encadeada simples. Maps (Mapas): o o o o HashTable: Mapa em ordem ascendente; HashMap: Mapa em ordem ascendente; LinkedHashMap: Mapa em ordem de inclusão; TreeMap: Mapa em ordem ascendente. A seguir são descritos alguns destes elementos: 5.3 Vector (Vetor) (Classe Obsoleta) import java.util.vector; A classe Vector é utilizada para armazenar elementos em uma estrutura similar a um vetor. Esta classe permite armazenar elementos dinamicamente, ou seja, uma lista de elementos 71
72 sem limite de tamanho pré-definido. O único tamanho a ser respeitado é a área de memória livre na memória RAM. A seguir são descritos os principais métodos da classe Vector. Sintaxe: void add(int posição, Object objeto); Insere o objeto na posição do Vetor. Sintaxe: boolean add(object objeto); Anexa o objeto no final do Vetor. Sintaxe: boolean addall(collection coleção); Anexa todos os elementos da coleção no final do Vetor, na ordem que eles são retornados pelo iterador da coleção. Sintaxe: boolean addall(int posição, Collection coleção); Insere todos os elementos na coleção no Vetor na posição. Sintaxe: void addelement(object objeto); Adiciona o objeto no fim do Vetor, aumentando seu tamanho em um. Sintaxe: int capacity(); Retorna a capacidade corrente do Vetor. Sintaxe: void clear(); Remove todos os elementos do Vetor. Sintaxe: Object clone(); Retorna uma cópia do Vetor. Sintaxe: boolean contains(object objeto); Testa se um objeto é um componente do Vetor. Sintaxe: boolean containsall(collection coleção); Retorna true se o Vetor contém todos os elementos da coleção. Sintaxe: void copyinto(object[] array); Copia os componentes do Vetor para o array. Sintaxe: Object elementat(int posição); Retorna o componente armazenado na posição. Sintaxe: Enumeration elements(); Retorna uma enumeração dos componentes do Vetor. Sintaxe: void ensurecapacity(int capacidademinima); Aumenta a capacidade do Vetor para armazenar o número de componentes dado pelo argumento capacidademinima. Sintaxe: boolean equals(object objeto); Compara (igualdade) o objeto com os elementos do Vetor. Sintaxe: Object firstelement(); Retorna o primeiro elemento (item de posição 0) do Vetor. Sintaxe: Object get(int posicao); Retorna o elemento armazenado na posição do Vetor. 72
73 Sintaxe: int hashcode(); Retorna o código hash do Vetor. Sintaxe: int indexof(object objeto); Procura e retorna a posição da primeira ocorrência de um elemento, testando a igualdade pelo método equals. Retorna -1 se não houver o objeto. Sintaxe: int indexof(object objeto, int posicao); Procura e retorna a posição da primeira ocorrência do objeto, começando a busca pela posição, e testando pela igualdade usando o método equals. Sintaxe: void insertelementat(object objeto, int posicao); Insere o objeto como um componente no Vetor na posição. Sintaxe: boolean isempty(); Testa se o Vetor não tem componentes, ou seja, se está vazia (true) ou não (false). Sintaxe: Object lastelement(); Retorna o último componente do Vetor. Sintaxe: int lastindexof(object objeto); Retorna a posição da última ocorrência do objeto no Vetor. Sintaxe: int lastindexof(object objeto, int posição); Retorna a posição da última ocorrência do objeto no Vetor, começando na posição. Sintaxe: Object remove(int posição); Remove o elemento da posição no Vetor. Sintaxe: boolean remove(object objeto); Remove a primeira ocorrência do objeto no Vetor, se o Vetor não contém o elemento, ele não é alterado. Sintaxe: boolean removeall(collection coleção); Remove do Vetor todos os elementos que contém a coleção. Sintaxe: void removeallelements(); Remove todos os elementos do Vetor e seta o tamanho em zero. Sintaxe: boolean removeelement(object objeto); Remove a primeira ocorrência do objeto do Vetor. Sintaxe: void removeelementat(int posição); Deleta o elemento na posição. Sintaxe:protected void removerange(int fromindex, int toindex); Remove da lista todos os elementos escolhidos entre o fromindex (inclusive) e toindex (exclusive). Sintaxe: boolean retainall(collection coleção); Mantém somente os elementos do Vetor que contém a coleção. Sintaxe: Object set(int posição, Object objeto); Troca o elemento da posição do Vetor com o elemento. Sintaxe: void setelementat(object objeto, int posição); Seta o objeto na posição do Vetor pelo objeto especificado. Sintaxe: void setsize(int newsize); Seta o tamanho do Vetor. 73
74 Sintaxe: int size(); Retorna o número de elementos do Vetor. Sintaxe: List sublist(int fromindex, int toindex); Retorna uma lista da porção da Lista entre fromindex (inclusive) e toindex (exclusive). Sintaxe: Object[] toarray(); Retorna um array contendo todos os elementos no Vetor. Sintaxe: Object[] toarray(object[] objeto); Retorna um array contendo todos os elementos no Vetor. Sintaxe: String tostring(); Retorna uma string do Vetor, contendo uma representação de cada elemento. Sintaxe: void trimtosize(); Ajusta a capacidade do Vetor para a atual dimensão do Vetor. Programa Exemplo: Mostra a utilização de vetor utilizando a classe Vector e alguns dos seus métodos. // Programa Principal: ProgVector.java package progvector; import java.util.scanner; import java.util.vector; public class ProgVector { Vector vetor = new Vector(); Scanner input = new Scanner(System.in); int u = -1, nodo; do { u++; System.out.print("Nodo: "); String s = input.nextline(); nodo = Integer.parseInt(s); if (nodo!= 0) { vetor.add(nodo); // vetor.add(u, nodo); onde u é o último elemento while (nodo!= 0); int n = vetor.size(); for (int i = 0; i < n;i++) { System.out.println("Elemento: " + vetor.get(i) + " "); System.out.println("Número de Elementos: " + n); System.out.println("Vector: " + vetor); Exemplo para testar o programa: Nodo: 10 <enter> Nodo: 20 <enter> Nodo: 30 <enter> 74
75 Nodo: 40 <enter> Nodo: 50 <enter> Nodo: 60 <enter> Nodo: 0 <enter> Elemento: 10 Elemento: 20 Elemento: 30 Elemento: 40 Elemento: 50 Elemento: 60 Número de Elementos: 6 Vector: [10, 20, 30, 40, 50, 60] Programa Exemplo: Mostra um vetor utilizando a classe Vector, inserindo em uma determinada posição escolhida pelo usuário (note que os elementos tem que ser inseridos numa ordem crescente de 0 n, sem pular nenhuma posição). // Programa Principal: ProgVector2.java package progvector2; import java.util.scanner; import java.util.vector; public class ProgVector2 { Vector vetor = new Vector(); Scanner input = new Scanner(System.in); int nodo, pos; do { System.out.print("Nodo: "); String s = input.nextline(); nodo = Integer.parseInt(s); if (nodo!= 0) { System.out.print("Posição: "); s = input.nextline(); pos = Integer.parseInt(s); if (pos >= 0 && pos <= vetor.size()) { vetor.add(pos, nodo); else { System.out.println("ERRO: Posição Inválida "); exibevector(vetor); while (nodo!= 0); int n = vetor.size(); for (int i = 0; i < n;i++) { System.out.println("Elemento: "+ vetor.get(i) + " "); System.out.println("Número de Elementos: " + n); System.out.println("Vector: " + vetor); 75
76 // exibevector static void exibevector(vector vetor) { System.out.printf("Indice: "); for (int i = 0;i < vetor.size();i++) { System.out.printf("%2d ", i); System.out.println(); System.out.print(" Vetor: "); for (Object i : vetor) { System.out.printf("%2d ", i); System.out.println(); Exemplo para testar o programa: Nodo: 10 <enter> Posição: 0 <enter> Indice: 0 Vetor: 10 Nodo: 20 <enter> Posição: 1 <enter> Indice: 0 1 Vetor: Nodo: 30 <enter> Posição: 2 <enter> Indice: Vetor: Nodo: 40 <enter> Posição: 6 <enter> ERRO: Posição Inválida Indice: Vetor: Nodo: 0 <enter> Indice: Vetor: Elemento: 10 Elemento: 20 Elemento: 30 Número de Elementos: 3 Vector: [10, 20, 30] 5.4 LinkedList (Lista Encadeada Simples) import java.util.linkedlist; A lista LinkedList é utilizada para armazenar elementos em uma lista encadeada simples (Figura 4), ou seja, lista alocada dinamicamente, onde a lista cresce enquanto houver memória livre. 76
77 Figura 4: LinkedList - Lista Encadeada Simples A seguir são descritos os principais métodos de uma LinkedList. Sintaxe: void add (int posição, Object objeto); Insere o objeto na posição da lista. Sintaxe: boolean add (Objetc objeto); Anexa o objeto no final da lista. Sintaxe: boolean addall (Collection coleção); Anexa todos os elementos da coleção no final da lista, na ordem que eles são retornados do iterador da coleção. Sintaxe: boolean addall (int posição, Collection coleção); Insere todos os elementos da coleção dentro da lista, começando na posição. Sintaxe: void addfirst (Object objeto); Insere o objeto no começo da lista. Sintaxe: void addlast (Object objeto); Anexa o objeto no final da lista. Sintaxe: void clear (); Remove todos os elementos da lista. Sintaxe: Object clone (); Retorna uma cópia da lista. Sintaxe: boolean contains (Object objeto); Retorna verdadeiro (true) se a lista contém o objeto. Sintaxe: Object get (int posição); Retorna o objeto da posição na lista. Sintaxe: Object getfirst (); Retorna o primeiro objeto da lista. Sintaxe: Object getlast (); Retorna o último objeto da lista. Sintaxe: int indexof (Object objeto); Retorna a posição do objeto na lista ou (-1) se a lista não contém este objeto. Sintaxe: int lastindexof (Object objeto); Retorna a última posição do objeto na lista ou (-1) se a lista não contém este objeto. 77
78 Sintaxe: ListIterator listiterator (int posição); Retorna um iterador da lista dos elementos da lista, começando na posição na lista. Sintaxe: Object remove (int posição); Remove o objeto da posição na lista. Sintaxe: boolean remove (Object objeto); Remove a primeira ocorrência do objeto na lista. Sintaxe: Object removefirst (); Remove e retorna o primeiro objeto da lista. Sintaxe: Object removelast (); Remove e retorna o último objeto da lista. Sintaxe: Object set (int posição, Object objeto); Troca o objeto da posição na lista pelo o objeto especificado. Sintaxe: int size (); Retorna o número de elementos na lista. Sintaxe: Object [] toarray (); Retorna um array (vetor) contendo todos os elementos da lista. Sintaxe: Object [] toarray (Object [] objeto); Retorna um array (vetor) contendo todos os objetos da lista. Programa Exemplo: Mostra uma LinkedList e alguns de seus métodos inserindo inteiros. // Programa Principal: ProgLinkedList.java package proglinkedlist; import java.util.linkedlist; import java.util.scanner; public class ProgLinkedList { LinkedList lista = new LinkedList(); Scanner input = new Scanner(System.in); int valor; char op; do { exibelista(lista); System.out.print("Valor: "); String s = input.nextline(); valor = Integer.parseInt(s); if (valor!= 0) { do { System.out.print("[F]irst, [L]ast ou [A]dd: "); s = input.nextline(); op = s.charat(0); while ("FfLlAa".indexOf(op) == -1); switch (op) { case 'F': case 'f': lista.addfirst(valor); 78
79 case 'L': case 'l': lista.addlast(valor); case 'A': case 'a': lista.add(valor); while (valor!= 0); exibelista(lista); // exibelista public static void exibelista(linkedlist lista) { int n = lista.size(); System.out.print("LinkedList: ["); for (int i = 0;i < n;i++) { System.out.print(lista.get(i) + " "); System.out.println("]"); Exemplo para testar o programa: LinkedList: [] Valor: 10 <enter> [F]irst, [L]ast ou [A]dd: f <enter> LinkedList: [10 ] Valor: 20 <enter> [F]irst, [L]ast ou [A]dd: l <enter> LinkedList: [10 20 ] Valor: 30 <enter> [F]irst, [L]ast ou [A]dd: a <enter> LinkedList: [ ] Valor: 0 <enter> LinkedList: [ ] Programa Exemplo: Mostra uma LinkedList e alguns dos seus métodos inserindo inteiros e ordenando-os. // Programa Principal: ProgLinkedList2.java package proglinkedlist2; import java.util.arrays; import java.util.linkedlist; public class ProgLinkedList2 { LinkedList lista = new LinkedList(); lista.add(40); 79
80 lista.add(20); lista.add(60); lista.add(10); lista.add(30); lista.add(50); Object[] listaordenada = lista.toarray(); Arrays.sort(listaOrdenada); System.out.print("LinkedList Ordenada: ["); for (Object i : listaordenada) { System.out.print(i + " "); System.out.printf("\b\b]\n"); // olhe a explicação abaixo Resultado do Programa: LinkedList Ordenada: [10, 20, 30, 40, 50, 60] Observação: O comando for acima é chamado de foreach. A sintaxe é descrita abaixo: Foreach (para cada ) Sintaxe: for (Tipo_dado variávelcontrole : coleção ) { System.out.println(variávelControle); Diferenças entre Classe e Interface Uma interface em Java é uma classe abstrata onde todos os métodos são abstratos (abstract) e públicos (public), e todos os atributos são estáticos (static) e constantes tipadas (final). Ela é semelhante a especificação de uma classe abstrata pura, com uma diferença: os métodos das classes abstratas podem ou não ser implementados nas classes que a estendem, já os métodos das interfaces tem que ser obrigatoriamente implementados nas classes que as implementam. Uma interface permite estabelecer uma padronização que deve ser obedecida pela classe que a implementa. Quando uma classe implementa uma interface, ela deve garantir que todas as funcionalidades especificadas pela interface estarão presentes na classe. A sintaxe da declaração de uma interface é parecida na definição de classes, porém seu corpo define apenas as assinaturas dos métodos e constantes contidos na interface. 80
81 5.5 Arrays (array) import java.util.arrays; A classe Arrays pode ser utilizada em variáveis do tipo vetor e permite copiar, ordenar, buscar e manipular vetores. Note que não se declara vetores do tipo Arrays. Programa Exemplo: Demonstra a utilização da classe Arrays e alguns de seus métodos. // Programa Principal: ProgArraysTeste.java package progarraysteste; import java.util.arrays; public class ProgArraysTeste { int[] vetor = {60, 30, 50, 20, 40, 10; System.out.println("Número de Elementos do Vetor: " + vetor.length); System.out.println("Vetor Original: " + Arrays.toString(vetor)); Arrays.sort(vetor); System.out.println("Vetor Ordenado: " + Arrays.toString(vetor)); int chaveprocura = 30; int indice = Arrays.binarySearch(vetor, chaveprocura); // vetor deve estar ordenado System.out.println("Chave: " + chaveprocura); System.out.println("Índice do Elemento Chave: " + indice); Resultado do Programa: Número de Elementos do Vetor: 6 Vetor Original: [60, 30, 50, 20, 40, 10] Vetor Ordenado: [10, 20, 30, 40, 50, 60] Chave: 30 Índice do Elemento Chave: 2 A seguir são descritos os principais métodos da classe Arrays. Sintaxe: static int binarysearch(byte[] vetor, byte chave); Procura em um vetor de byte pela chave utilizando algoritmo de busca binária. Sintaxe: static int binarysearch(char[] vetor, char chave); Procura em um vetor de char pela chave utilizando algoritmo de busca binária. Sintaxe: static int binarysearch(double[] vetor, double chave); Procura em um vetor de double pela chave utilizando algoritmo de busca binária. Sintaxe: static int binarysearch(float[] vetor, float chave); Procura em um vetor de float pela chave utilizando algoritmo de busca binária. 81
82 Sintaxe: static int binarysearch(int[] vetor, int chave); Procura em um vetor de int pela chave utilizando algoritmo de busca binária. Sintaxe: static int binarysearch(long[] vetor, long chave); Procura em um vetor de long pela chave utilizando algoritmo de busca binária. Sintaxe: static int binarysearch(object[] vetor, Object chave); Procura em um vetor de Object pela chave utilizando algoritmo de busca binária. Sintaxe: static int binarysearch(short[] vetor, short chave); Procura em um vetor de short pela chave utilizando algoritmo de busca binária. Sintaxe: static boolean deepequals(object[] obj1, Object[] obj2); Retorna true se os dois arrays de objetos são iguais. Sintaxe: static int deephashcode(object[] objeto); Retorna o código hash baseado na localização do array de objetos. Sintaxe: static String deeptostring(object[] objeto); Retorna em forma de string a localização do array de objetos. Sintaxe: static boolean equals(boolean[] vetor1, boolean[] vetor2); Retorna true se os dois arrays de boolean são iguais. Sintaxe: static boolean equals(byte[] vetor1, byte[] vetor2); Retorna true se os dois arrays de byte são iguais. Sintaxe: static boolean equals(char[] vetor1, char[] vetor2); Retorna true se os dois arrays de char são iguais. Sintaxe: static boolean equals(double[] vetor1, double[] vetor2); Retorna true se os dois arrays de double são iguais. Sintaxe: static boolean equals(float[] vetor1, float[] vetor2); Retorna true se os dois arrays de float são iguais. Sintaxe: static boolean equals(int[] vetor1, int[] vetor2); Retorna true se os dois arrays de int são iguais. Sintaxe: static boolean equals(long[] vetor1, long[] vetor2); Retorna true se os dois arrays de long são iguais. Sintaxe: static boolean equals(object[] vetor1, Object[] vetor2); Retorna true se os dois arrays de Object são iguais. Sintaxe: static boolean equals(short[] vetor1, short[] vetor2); Retorna true se os dois arrays de short são iguais. Sintaxe: static void fill(boolean[] vetor, boolean valor); Atribui um valor booleano para cada elemento do vetor de booleanos. Sintaxe: static void fill(boolean[] vetor, int fromindex, int toindex, boolean valor); Atribui um valor booleano para cada elemento da faixa do vetor de booleanos. Sintaxe: static void fill(byte[] vetor, byte valor); Atribui um valor byte para cada elemento do vetor de bytes. Sintaxe: static void fill(byte[] vetor, int fromindex, int toindex, byte valor); Atribui um valor byte para cada elemento da faixa do vetor de bytes. 82
83 Sintaxe: static void fill(char[] vetor, char valor); Atribui um valor char para cada elemento do vetor de caracteres. Sintaxe: static void fill(char[] vetor, int fromindex, int toindex, char valor); Atribui um valor char para cada elemento da faixa do vetor de caracteres. Sintaxe: static void fill(double[] vetor, double valor); Atribui um valor double para cada elemento do vetor de double. Sintaxe: static void fill(double[] vetor, int fromindex, int toindex, double valor); Atribui um valor double para cada elemento da faixa do vetor de double. Sintaxe: static void fill(float[] vetor, float valor); Atribui um valor float para cada elemento do vetor de float. Sintaxe: static void fill(float[] vetor, int fromindex, int toindex, float valor); Atribui um valor float para cada elemento da faixa do vetor de float. Sintaxe: static void fill(int[] vetor, int valor); Atribui um valor int para cada elemento do vetor de inteiros Sintaxe: static void fill(int[] vetor, int fromindex, int toindex, int valor); Atribui um valor int para cada elemento da faixa do vetor de inteiros. Sintaxe: static void fill(long[] vetor, int fromindex, int toindex, long valor); Atribui um valor long para cada elemento da faixa do vetor de inteiros longos. Sintaxe: static void fill(long[] vetor, long valor); Atribui um valor long para cada elemento do vetor de long. Sintaxe: static void fill(object[] vetor, int fromindex, int toindex, Object valor); Atribui um valor Object para cada elemento da faixa do vetor de objetos. Sintaxe: static void fill(object[] vetor, Object valor); Atribui um valor Object para cada elemento do vetor de Object. Sintaxe: static void fill(short[] vetor, int fromindex, int toindex, short valor); Atribui um valor short para cada elemento da faixa do vetor de inteiros curtos. Sintaxe: static void fill(short[] vetor, short val); Atribui um valor short para cada elemento do vetor de inteiros curtos. Sintaxe: static int hashcode(boolean[] vetor); Retorna o código hash com base no conteúdo do vetor de booleanos. Sintaxe: static int hashcode(byte[] vetor); Retorna o código hash com base no conteúdo do vetor de byte. Sintaxe: static int hashcode(char[] vetor); Retorna o código hash com base no conteúdo do vetor de caracteres. Sintaxe: static int hashcode(double[] vetor); Retorna o código hash com base no conteúdo do vetor de double. Sintaxe: static int hashcode(float[] vetor); Retorna o código hash com base no conteúdo do vetor de float. 83
84 Sintaxe: static int hashcode(int[] vetor); Retorna o código hash com base no conteúdo do vetor de inteiros. Sintaxe: static int hashcode(long[] vetor); Retorna o código hash com base no conteúdo do vetor de inteiros longos. Sintaxe: static int hashcode(object[] vetor); Retorna o código hash com base no conteúdo do vetor de objetos. Sintaxe: static int hashcode(short[] vetor); Retorna o código hash com base no conteúdo do vetor inteiros curtos. Sintaxe: static void sort(byte[] vetor); Ordena o vetor de byte em ordem ascendente numérica. Sintaxe: static void sort(byte[] vetor, int fromindex, int toindex); Ordena a faixa do vetor de byte em ordem ascendente numérica. Sintaxe: static void sort(char[] vetor); Ordena o vetor de char em ordem ascendente numérica. Sintaxe: static void sort(char[] vetor, int fromindex, int toindex); Ordena a faixa do vetor de char em ordem ascendente numérica. Sintaxe: static void sort(double[] vetor); Ordena o vetor de double em ordem ascendente numérica. Sintaxe: static void sort(double[] vetor, int fromindex, int toindex); Ordena a faixa do vetor de double em ordem ascendente numérica. Sintaxe: static void sort(float[] vetor); Ordena o vetor de float em ordem ascendente numérica. Sintaxe: static void sort(float[] vetor, int fromindex, int toindex); Ordena a faixa do vetor de float em ordem ascendente numérica. Sintaxe: static void sort(int[] vetor); Ordena o vetor de int em ordem ascende numérica. Sintaxe: static void sort(int[] vetor, int fromindex, int toindex); Ordena a faixa do vetor de int em ordem ascendente numérica. Sintaxe: static void sort(long[] vetor); Ordena o vetor de long em ordem ascendente numérica. Sintaxe: static void sort(long[] vetor, int fromindex, int toindex); Ordena a faixa do vetor de long em ordem ascendente numérica. Sintaxe: static void sort(object[] vetor); Ordena o vetor de Object em ordem ascendente numérica, de acordo com a ordem natural dos elementos. Sintaxe: static void sort(object[] vetor, int fromindex, int toindex); Ordena a faixa do vetor de Object em ordem ascendente numérica. Sintaxe: static void sort(short[] vetor); Ordena o vetor de short em ordem ascendente numérica. Sintaxe: static void sort(short[] vetor, int fromindex, int toindex); Ordena a faixa do vetor de short em ordem ascendente numérica. 84
85 Sintaxe: static String tostring(boolean[] vetor) Retorna uma string com o conteúdo do vetor de boleanos. Sintaxe: static String tostring(byte[] vetor); Retorna uma string com o conteúdo do vetor de byte. Sintaxe: static String tostring(char[] vetor); Retorna uma string com o conteúdo do vetor de char. Sintaxe: static String tostring(double[] vetor); Retorna uma string com o conteúdo do vetor de double. Sintaxe: static String tostring(float[] vetor); Retorna uma string com o conteúdo do vetor de float. Sintaxe: static String tostring(int[] vetor); Retorna uma string com o conteúdo do vetor de int. Sintaxe: static String tostring(long[] vetor); Retorna uma string com o conteúdo do vetor de inteiros longos. Sintaxe: static String tostring(object[] vetor); Retorna uma string com o conteúdo do vetor de objetos. Sintaxe: static String tostring(short[] vetor); Retorna uma string com o conteúdo do vetor de inteiros curtos. Programa Exemplo: Utiliza a classe Arrays e alguns métodos que permitem ordenar (sort) e listar um vetor. // Programa Principal: ProgArrays.java package progarrays; import java.util.arrays; import java.util.scanner; public class ProgArrays { final int MAX = 10; int [] vetor = new int[max]; Scanner input = new Scanner(System.in); int u = -1, n = 0, valor; do { u++; n++; System.out.print("Valor: "); String s = input.nextline(); valor = Integer.parseInt(s); if (valor!= 0) { vetor[u] = valor; else { u--; // último elemento // número de elementos 85
86 while (valor!= 0 && n < MAX); Arrays.sort(vetor, 0, u); // vetor, início, fim String extenso = Arrays.toString(vetor); System.out.println("Array: " + extenso); Exemplo para testar o programa: Valor: 10 <enter> Valor: 20 <enter> Valor: 30 <enter> Valor: 40 <enter> Valor: 50 <enter> Valor: 0 <enter> Array: [10, 20, 30, 40, 50, 0, 0, 0, 0, 0] 5.6 ArrayList (lista de array) A classe ArrayList possui os mesmos métodos da classe Vector e permite armazenar elementos como se fosse um vetor dinâmico, ou seja, sem limite da quantidade de elementos. Programa Exemplo: Mostra dois arrays que armazenam respectivamente: nomes e idades, note que não há ligação física entre eles, somente uma ligação lógica. // Programa Principal: ProgArrayList.java package progarraylist; import java.util.arraylist; public class ProgArrayList { ArrayList <String> nome = new ArrayList <> (); // ArrayList nome = new ArrayList(); // funciona assim também nome.add("paulo Roberto"); nome.add("renato Luis"); nome.add("francisco Carlos"); nome.add("ana Maria"); nome.add("julia Helena"); ArrayList <Integer> idade = new ArrayList (); idade.add(48); idade.add(46); idade.add(50); idade.add(53); idade.add(52); int n = nome.size(); 86
87 for (int i = 0;i < n;i++) { System.out.printf("Nome: %-20s Idade: %d\n", nome.get(i), idade.get(i)); Resultado do Programa: Nome: Paulo Roberto Idade: 48 Nome: Renato Luis Idade: 46 Nome: Francisco Carlos Idade: 50 Nome: Ana Maria Idade: 53 Nome: Julia Helena Idade: 52 Programa Exemplo: Mostra uma forma abreviada de listar um ArrayList, chamada foreach. // Programa Principal: ProgArrayListView.java package progarraylistview; import java.util.arraylist; public class ProgArrayListView { ArrayList lista = new ArrayList(); lista.add("ana"); lista.add("beatriz"); lista.add("carla"); lista.add("débora"); for (Object i : lista) { // foreach... para cada... System.out.println(i); Resultado do Programa: Ana Beatriz Carla Débora Programa Exemplo: Um vetor utilizando a classe Vector e a classe ArrayList, inserindo inteiros e caracteres. O programa utiliza o método toarray para criar um array de objetos (Object). // Programa Principal: ProgtoArray.java package progtoarray; import java.util.arraylist; import java.util.vector; 87
88 public class ProgtoArray { ArrayList <Integer> lista = new ArrayList(); lista.add(10); lista.add(30); lista.add(40); lista.add(1, 20); System.out.println("ArrayList: " + lista); Object [] objeto = lista.toarray(); System.out.print("Objetos: "); for(int i = 0;i < lista.size();i++) { System.out.print(objeto[i] + " "); System.out.println(); Vector vetor = new Vector(); vetor.add('a'); vetor.add('c'); vetor.add('d'); vetor.add(1, 'B'); System.out.println("Vector: " + vetor); Object [] objet = vetor.toarray(); System.out.print("Objetos: "); for(int i = 0;i < vetor.size();i++) { System.out.print(objet[i] + " "); System.out.println(); Resultado do Programa: ArrayList: [10, 20, 30, 40] Objetos: Vector: [A, B, C, D] Objetos: A B C D Lista de exercícios: Vector, ArrayList e LinkedList Escreva um programa em Java que recebe via teclado um conjunto de letras. Armazene todas as letras em um vetor de letras (Vector ou ArrayList) até que o usuário digite um F ou f. Logo após copie todas as letras (em ordem inversa) para outro vetor (inverso). Ao final imprima os dois vetores. Entrada: Letra: L <enter> Letra: I <enter> Letra: M <enter> Letra: A <enter> Letra: f <enter> 88
89 Saída: [L, I, M, A] [A, M, I, L] Escreva um programa em Java que recebe via teclado: número de idades e as respectivas idades. Armazene todas as idades em um vetor de idades (Vector ou ArrayList). Logo após a entrada de todas as idades, o programa deve receber via teclado: idade para consulta. O programa deve imprimir na tela, o número de idades antes da idade de consulta e o número de idades depois da idade de consulta. Exemplo para testar o programa: Número de idades: 6 <enter> Idade: 30 <enter> Idade: 60 <enter> Idade: 10 <enter> Idade: 50 <enter> Idade: 20 <enter> Idade: 40 <enter> Idade para consulta: 50 <enter> Antes: 3 Depois: 2 Continua [S/N]? n <enter> Escreva um programa em Java que recebe via teclado um conjunto de números inteiros. Armazene todos os números inteiros em um vetor (Vector ou ArrayList) até que o usuário digite 0 (zero). Logo após permita ao usuário consultar um número informando o seu valor. O programa deve imprimir na tela a posição do número no vetor ou ERRO: Número não encontrado (O programa termina quando o usuário digitar 0 (zero) na entrada) (veja o exemplo abaixo): Exemplo para testar o programa: Número: 50 <enter> Número: 30 <enter> Número: 20 <enter> Número: 10 <enter> Número: 40 <enter> Número: 0 <enter> Valor: 20 <enter> Posição no vetor: 2 Valor: 40 <enter> Posição no vetor: 4 Valor: 60 <enter> ERRO: Número não encontrado Valor: 0 <enter> Escreva um programa em Java que recebe via teclado "n" conceitos (A, B, C, D e E) até que o usuário digite F ou f. Armazene todos os conceitos em um vetor de conceitos (Vector ou ArrayList). Imprima na tela o número de alunos: aprovados (A, B e C), reprovados (D) e os infreqüentes (E). Entrada: Conceito: B <enter> Conceito: A <enter> Conceito: E <enter> Conceito: B <enter> Conceito: D <enter> Conceito: C <enter> Conceito: A <enter> Conceito: E <enter> 89
90 Conceito: f <enter> Saída: 5 Aprovado(s) 1 Reprovado(s) 2 Infreqüente (s) Escreva um programa em Java que recebe via teclado n nomes e armazena num vetor de nomes (Vector ou ArrayList). A entrada dos nomes termina quando o usuário digitar apenas <enter>. Logo após a entrada de todos os nomes o programa deve permitir a entrada via teclado de uma letra. O programa deve imprimir na tela todos os nomes que começam com a letra especificada pelo usuário. O programa termina quanto o usuário digitar (nada) na entrada da letra (conforme exemplos abaixo): Exemplo para testar o programa: Nome: Paulo <enter> Nome: Roberto <enter> Nome: Renato <enter> Nome: Pedro <enter> Nome: Fabio <enter> Nome: <enter> Letra: R <enter> Nome: Roberto Nome: Renato Letra: P <enter> Nome: Paulo Nome: Pedro Letra: T <enter> Letra: <enter> Escreva um programa em Java que recebe via teclado n nomes e idades, armazenando em dois vetores (Vector ou ArrayList). A entrada dos dados termina quando o usuário digitar 'N' ou 'n' na pergunta "Continua [S/N]?". Logo após a entrada de todos os dados o programa deve imprimir na tela todos os nomes e idades desde o mais velho até o mais novo. Entrada: Nome: Ana <enter> Idade: 12 <enter> Continua [S/N]? s <enter> Nome: Beatriz <enter> Idade: 13 <enter> Continua [S/N]? s <enter> Nome: Carla <enter> Idade: 14 <enter> Continua [S/N]? N <enter> Saída: Carla 14 Beatriz 13 Ana Escreva um programa em Java que recebe via teclado n nomes armazenando em um vetor de nomes (Vector ou ArrayList). A entrada dos dados termina quando o usuário digitar apenas "enter". Logo após a entrada de todos os dados, o programa deve imprimir na tela todos os nomes em ordem alfabética de A à Z (conforme exemplo abaixo). Entrada: Nome: Beatriz <enter> Nome: Ana <enter> Nome: Debora <enter> 90
91 Nome: Carla <enter> Nome: Eva <enter> Nome: Geni <enter> Nome: Fernanda <enter> Nome: <enter> Saída: ArrayList: [Ana, Beatriz, Carla, Debora, Eva, Fernanda, Geni] Escreva um programa em Java que recebe via teclado n idades, armazenando-as em um vetor (Vector ou ArrayList) até que o usuário digite 0 (zero). O programa deve então imprimir na tela: (a) as idades em ordem crescente; (b) maior idade; (c) menor idade e (d) a média de idades(conforme exemplo abaixo). Entrada: Idade: 49 <enter> Idade: 51 <enter> Idade: 48 <enter> Idade: 50 <enter> Idade: 0 <enter> Saída: Idades Ordenadas: Maior Idade: 51 Menor Idade: 48 Média de Idades: Escreva um programa em Java que lê um vetor 5 elementos contendo o gabarito da LOTO. A seguir, ler outro vetor de 10 elementos contendo uma aposta qualquer (exatamente conforme o exemplo abaixo, ou seja, os dados devem estar em duas linhas, um ao lado do outro). A seguir imprima quantos pontos fez o apostador (conforme exemplo abaixo). Os vetores devem ser armazenados em um Vector ou ArrayList Entrada: Saída: <enter> (gabarito) <enter>(aposta) 3 ponto(s) Escreva um programa em Java que lê o número de palpites para a megasena. O programa deve então gerar n palpites para o Jogo da MegaSena (sem repetição em cada palpite e ordenados em ordem crescente). O programa deve exibir na tela estes palpites (conforme exemplo abaixo). Entrada: Número de Palpites para a MegaSena: 4 <enter> Saída: Palpite para MegaSena é [4, 22, 43, 55, 93, 99] Palpite para MegaSena é [17, 39, 57, 74, 81, 98] Palpite para MegaSena é [5, 9, 15, 18, 63, 93] Palpite para MegaSena é [14, 20, 42, 48, 80, 88] Observação: Note que cada palpite deve estar armazenado em um Vector ou ArrayList Escreva um programa em Java que armazena n números inteiros em uma Lista Encadeada Simples (LinkedList). O programa possui três funções básicas: [I]ncluir, [C]onsultar e [R]emover, todas elas em ambos os lados da lista encadeada: [E]squerda e [D]ireita (conforme exemplo abaixo). 91
92 Exemplo para testar o programa: [I]ncluir, [C]onsultar, [R]emover ou [F]im: i <enter> [E]squerda ou [D]ireita e <enter> Dado: 10 LinkedList: [10] [I]ncluir, [C]onsultar, [R]emover ou [F]im: i <enter> [E]squerda ou [D]ireita d <enter> Dado: 20 LinkedList: [10, 20] [I]ncluir, [C]onsultar, [R]emover ou [F]im: i <enter> [E]squerda ou [D]ireita d <enter> Dado: 30 LinkedList: [10, 20, 30] [I]ncluir, [C]onsultar, [R]emover ou [F]im: r <enter> [E]squerda ou [D]ireita e <enter> Dado Removido à esquerda: 10 LinkedList: [20, 30] [I]ncluir, [C]onsultar, [R]emover ou [F]im: r <enter> [E]squerda ou [D]ireita e <enter> Dado Removido à esquerda: 20 LinkedList: [30] [I]ncluir, [C]onsultar, [R]emover ou [F]im: r <enter> [E]squerda ou [D]ireita e <enter> Dado Removido à esquerda: 30 LinkedList: [] [I]ncluir, [C]onsultar, [R]emover ou [F]im: r <enter> [E]squerda ou [D]ireita e <enter> ERRO: Lista Vazia LinkedList: [] [I]ncluir, [C]onsultar, [R]emover ou [F]im: r <enter> [E]squerda ou [D]ireita d <enter> ERRO: Lista Vazia LinkedList: [] [I]ncluir, [C]onsultar, [R]emover ou [F]im: f <enter> Complemente o programa anterior com a função de Incluir, consultar e remover em uma posição escolhida pelo usuário, ou seja, [E]squerda, [P]osição ou [D]ireita (conforme exemplo abaixo). Exemplo para testar o programa: [I]ncluir, [C]onsultar, [R]emover ou [F]im: i <enter> [E]squerda, [P]osição [D]ireita: e <enter> Dado: 10 <enter> LinkedList: [10] [I]ncluir, [C]onsultar, [R]emover ou [F]im: i <enter> [E]squerda, [P]osição [D]ireita: d <enter> Dado: 20 LinkedList: [10, 20] [I]ncluir, [C]onsultar, [R]emover ou [F]im: i <enter> [E]squerda, [P]osição [D]ireita: d <enter> Dado: 40 LinkedList: [10, 20, 40] [I]ncluir, [C]onsultar, [R]emover ou [F]im: i <enter> [E]squerda, [P]osição [D]ireita: p <enter> Dado: 30 <enter> Posição: 2 <enter> 92
93 LinkedList: [10, 20, 30, 40] [I]ncluir, [C]onsultar, [R]emover ou [F]im: c <enter> [E]squerda, [P]osição [D]ireita: p <enter> Posição: 2 <enter> Dado Consultado: 30 LinkedList: [10, 20, 30, 40] [I]ncluir, [C]onsultar, [R]emover ou [F]im: r <enter> [E]squerda, [P]osição [D]ireita: p <enter> Posição: 3 <enter> Dado Removido da Posição: 40 LinkedList: [10, 20, 30] [I]ncluir, [C]onsultar, [R]emover ou [F]im: r <enter> [E]squerda, [P]osição [D]ireita: p <enter> Posição: 6 <enter> ERRO: Posição Inválida LinkedList: [10, 20, 30] [I]ncluir, [C]onsultar, [R]emover ou [F]im: f <enter> Escreva um programa em Java que armazena n números inteiros em uma Lista Encadeada Simples (LinkedList). O programa possui três funções básicas: [I]ncluir, [E]lemento e [R]emover, as funções Incluir e Remover em ambos os lados da lista encadeada: [E]squerda ou [D]ireita e a função Elemento deve listar o ANTECESSOR e o SUCESSOR deste elemento (ou SEM ANTECESSOR e/ou SEM SUCESSOR ) (conforme exemplo abaixo). Exemplo para testar o programa: [I]ncluir, [E]lemento, [R]emover ou [F]im: i <enter> [E]squerda ou [D]ireita e <enter> Dado: 10 <enter> LinkedList: [10] [I]ncluir, [E]lemento, [R]emover ou [F]im: i <enter> [E]squerda ou [D]ireita d <enter> Dado: 20 <enter> LinkedList: [10, 20] [I]ncluir, [E]lemento, [R]emover ou [F]im: i <enter> [E]squerda ou [D]ireita d <enter> Dado: 30 <enter> LinkedList: [10, 20, 30] [I]ncluir, [E]lemento, [R]emover ou [F]im: e <enter> Elemento a Pesquisar: 20 <enter> Antecessor: 10 Sucessor: 30 LinkedList: [10, 20, 30] [I]ncluir, [E]lemento, [R]emover ou [F]im: e <enter> Elemento a Pesquisar: 10 <enter> ERRO: SEM ANTECESSOR Sucessor: 20 LinkedList: [10, 20, 30] [I]ncluir, [E]lemento, [R]emover ou [F]im: e <enter> Elemento a Pesquisar: 30 <enter> Antecessor: 20 ERRO: SEm SUCESSOR LinkedList: [10, 20, 30] [I]ncluir, [E]lemento, [R]emover ou [F]im: f <enter> 93
94 Escreva um programa em Java que armazena n números inteiros em uma Lista Encadeada Simples (LinkedList). O programa possui quatro funções básicas: [I]ncluir, [E]lemento, [P]esquisar e [R]emover. As funções Incluir e Remover em ambos os lados da lista encadeada: [E]squerda e [D]ireita. A função Elemento verifica o Antecessor e o Sucessor de um determinado elemento. A função Pesquisar pesquisa um determinado elemento pelo índice(conforme exemplo abaixo). Exemplo para testar o programa: [I]ncluir, [E]lemento, [R]emover, [P]esquisar ou [F]im: i <enter> [E]squerda ou [D]ireita: e <enter> Dado: 10 <enter> Indices: 0 LinkedList: [10] [I]ncluir, [E]lemento, [R]emover, [P]esquisar ou [F]im: i <enter> [E]squerda ou [D]ireita: d <enter> Dado: 20 <enter> Indices: 0 1 LinkedList: [10, 20] [I]ncluir, [E]lemento, [R]emover, [P]esquisar ou [F]im: i <enter> [E]squerda ou [D]ireita: d <enter> Dado: 30 <enter> Indices: LinkedList: [10, 20, 30] [I]ncluir, [E]lemento, [R]emover, [P]esquisar ou [F]im: i <enter> [E]squerda ou [D]ireita: d <enter> Dado: 40 <enter> Indices: LinkedList: [10, 20, 30, 40] [I]ncluir, [E]lemento, [R]emover, [P]esquisar ou [F]im: p <enter> Indice: 2 <enter> Dado Pesquisado pelo Indice: 30 Indices: LinkedList: [10, 20, 30, 40] [I]ncluir, [E]lemento, [R]emover, [P]esquisar ou [F]im: p <enter> Indice: 8 <enter> ERRO: Indice Inexistente Indices: LinkedList: [10, 20, 30, 40] [I]ncluir, [E]lemento, [R]emover, [P]esquisar ou [F]im: f <enter> Escreva um programa em Java que armazena n números inteiros em uma Lista Encadeada Simples (LinkedList). O programa possui três funções básicas: [I]ncluir, [S]ort e [C]lear All. A função Incluir inclui em ambos os lados da lista encadeada: [E]squerda e [D]ireita. A função Sort ordena a lista encadeada. A função Clear All remove todos os elementos(conforme exemplo abaixo). Exemplo para testar o programa: [I]ncluir, [S]ort, [C]lear All ou [F]im: i <enter> [E]squerda ou [D]ireita: e <enter> Dado: 10 <enter> Indices: 0 LinkedList: [10] [I]ncluir, [S]ort, [C]lear All ou [F]im: i <enter> [E]squerda ou [D]ireita: d <enter> 94
95 Dado: 40 <enter> Indices: 0 1 LinkedList: [10, 40] [I]ncluir, [S]ort, [C]lear All ou [F]im: i <enter> [E]squerda ou [D]ireita: d <enter> Dado: 50 <enter> Indices: LinkedList: [10, 40, 50] [I]ncluir, [S]ort, [C]lear All ou [F]im: i <enter> [E]squerda ou [D]ireita: d <enter> Dado: 30 <enter> Indices: LinkedList: [10, 40, 50, 30] [I]ncluir, [S]ort, [C]lear All ou [F]im: i <enter> [E]squerda ou [D]ireita: d <enter> Dado: 20 <enter> Indices: LinkedList: [10, 40, 50, 30, 20] [I]ncluir, [S]ort, [C]lear All ou [F]im: i <enter> [E]squerda ou [D]ireita: e <enter> Dado: 60 <enter> Indices: LinkedList: [60, 10, 40, 50, 30, 20] [I]ncluir, [S]ort, [C]lear All ou [F]im: s <enter> Indices: LinkedList: [10, 20, 30, 40, 50, 60] [I]ncluir, [S]ort, [C]lear All ou [F]im: c <enter> Indices: LinkedList: [] [I]ncluir, [S]ort, [C]lear All ou [F]im: f <enter> Escreva um programa em Java que armazena n números inteiros em um vetor (Vector, ArrayList ou LinkedList), mantendo-os ordenados conforme a entrada das informações (conforme exemplo abaixo). O programa deve ir exibindo os elementos na tela a cada nova entrada. A entrada das informações termina quando o usuário digitar zero (0). Exemplo para testar o programa: Info: 10 <enter> ArrayList: [10] Info: 30 <enter> ArrayList: [10, 30] Info: 40 <enter> ArrayList: [10, 30, 40] Info: 20 <enter> ArrayList: [10, 20, 30, 40] Info: 5 <enter> ArrayList: [5, 10, 20, 30, 40] Info: 60 <enter> ArrayList: [5, 10, 20, 30, 40, 60] Info: 50 <enter> ArrayList: [5, 10, 20, 30, 40, 50, 60] Info: 20 <enter> ERRO: Informação Repetida ArrayList: [5, 10, 20, 30, 40, 50, 60] Info: 0 <enter> ArrayList: [5, 10, 20, 30, 40, 50, 60] 95
96 5.7 ArrayList bidimensional Em Java é possível criar um array bidimensional usando a classe ArrayList. Programa Exemplo: Mostra a utilização de um ArrayList bidimensional. // Programa Principal: ProgArrayList2D.java package progarraylist2d; import java.util.arraylist; public class ProgArrayList2D { final int numerolinhas = 7; final int numerocolunas = 5; ArrayList[][] tabela = new ArrayList[numeroLinhas][numeroColunas]; int x = 10; for (int i = 0; i < numerolinhas; i++) { int n = x; for (int j = 0; j < numerocolunas; j++) { tabela[i][j] = new ArrayList(); tabela[i][j].add(n); n = n + 10; x++; for (int i = 0; i < numerolinhas; i++) { for (int j = 0; j < numerocolunas; j++) { System.out.print(tabela[i][j]); System.out.println(); Resultado do Programa: [10][20][30][40][50] [11][21][31][41][51] [12][22][32][42][52] [13][23][33][43][53] [14][24][34][44][54] [15][25][35][45][55] [16][26][36][46][56] Programa Exemplo: Escreva um programa em Java que lê duas matrizes: A e B e gera uma matriz C que é a multiplicação da matriz A com a matriz B. Todas as matrizes devem ser ArrayList s. // Programa Principal: ProgMultMatriz.java package progmultmatriz; 96
97 import java.util.arraylist; import java.util.scanner; public class ProgMultMatriz { int ma, na, mb, nb; Scanner entrada = new Scanner(System.in); String s; System.out.print("Número de Linhas da Matriz A (ma): "); s = entrada.nextline(); ma = Integer.parseInt(s); System.out.print("Número de Colunas da Matriz A(nA): "); s = entrada.nextline(); na = Integer.parseInt(s); System.out.print("Número de Linhas da Matriz B(mB): "); s = entrada.nextline(); mb = Integer.parseInt(s); System.out.print("Número de Colunas da Matriz B(nB): "); s = entrada.nextline(); nb = Integer.parseInt(s); if (na!= mb) { System.out.println("Erro Fatal: Multiplicação Impossível"); System.out.println("Número de Colunas de A (na) tem que ser igual número de linhas de B (mb)"); System.exit(0); ArrayList[][] a = new ArrayList[ma][na]; ArrayList[][] b = new ArrayList[mb][nb]; ArrayList[][] c = new ArrayList[ma][nb]; System.out.println("Matriz A"); for (int lin = 0; lin < ma; lin++) { for (int col = 0; col < na; col++) { a[lin][col] = new ArrayList(); System.out.print("A[" + (lin + 1) + ", " + (col + 1) + "]: "); s = entrada.nextline(); a[lin][col].add(integer.parseint(s)); System.out.println("Matriz B"); for (int lin = 0; lin < mb; lin++) { for (int col = 0; col < nb; col++) { b[lin][col] = new ArrayList(); System.out.print("B[" + (lin + 1) + ", " + (col + 1) + "]: "); s = entrada.nextline(); b[lin][col].add(integer.parseint(s)); System.out.println("Matriz C = A x B"); for (int lin = 0; lin < ma; lin++) { for (int col = 0; col < nb; col++) { int soma = 0; for (int k = 0; k < na; k++) { c[lin][col] = new ArrayList(); String A = ""; 97
98 A = A + a[lin][k].get(0); String B = ""; B = B + b[k][col].get(0); soma = soma + Integer.parseInt(A) * Integer.parseInt(B); c[lin][col].add(soma); for (int lin = 0; lin < ma; lin++) { for (int col = 0; col < nb; col++) { System.out.println("C[" + (lin + 1) + ", " + (col + 1) + "]: " + c[lin][col]); Exemplo para testar o programa: Número de Linhas da Matriz A (ma): 2 <enter> Número de Colunas da Matriz A(nA): 2 <enter> Número de Linhas da Matriz B(mB): 2 <enter> Número de Colunas da Matriz B(nB): 3 <enter> Matriz A A[1, 1]: 1 <enter> A[1, 2]: 2 <enter> A[2, 1]: 3 <enter> A[2, 2]: 4 <enter> Matriz B B[1, 1]: 1 <enter> B[1, 2]: 2 <enter> B[1, 3]: 3 <enter> B[2, 1]: 4 <enter> B[2, 2]: 5 <enter> B[2, 3]: 6 <enter> Matriz C = A x B C[1, 1]: [9] C[1, 2]: [12] C[1, 3]: [15] C[2, 1]: [19] C[2, 2]: [26] C[2, 3]: [33] Programa Exemplo: Escreva um programa em Java que leia uma matriz A (3 x 4) e cria 2 vetores SL e SC de 3 e 4 elementos que contenham respectivamente a soma das linhas (SL) e a soma das colunas (SC). Imprimir os vetores SL e SC. // Programa Principal: ProgArrayList2D_2.java package progarraylist2d_2; import java.util.arraylist; import java.util.scanner; public class ProgArrayList2D_2 { Scanner entrada = new Scanner(System.in); final int numerolinhas = 3, numerocolunas = 4; 98
99 ArrayList <Integer> [][] a = new ArrayList[numeroLinhas][numeroColunas]; ArrayList <Integer> [] sl = new ArrayList[numeroLinhas]; ArrayList <Integer> [] sc = new ArrayList[numeroColunas]; for (int l = 0; l < numerolinhas; l++) { for (int c = 0; c < numerocolunas; c++) { a[l][c] = new ArrayList(); // instanciar cada elemento System.out.print("a [" + (l + 1) + "," + (c + 1) + "]: "); String s = entrada.nextline(); a[l][c].add(integer.parseint(s)); int k = 0; for (int l = 0; l < numerolinhas; l++) { int soma = 0; for (int c = 0; c < numerocolunas; c++) { soma = soma + a[l][c].get(0).hashcode(); sl[k] = new ArrayList(); // instanciar cada elemento sl[k].add(soma); k++; System.out.println(); for (k = 0; k < numerolinhas; k++) { System.out.println("sl[" + (k + 1) + "]: " + sl[k]); k = 0; for (int c = 0; c < numerocolunas; c++) { int soma = 0; for (int l = 0; l < numerolinhas; l++) { soma = soma + a[l][c].get(0).hashcode(); sc[k] = new ArrayList(); // instanciar cada elemento sc[k].add(soma); k++; System.out.println(); for (k = 0; k < numerocolunas; k++) { System.out.println("sc[" + (k + 1) + "]: " + sc[k]); System.out.println(); Exemplo para testar o programa: a [1,1]: 1 <enter> a [1,2]: 2 <enter> a [1,3]: 3 <enter> a [1,4]: 4 <enter> a [2,1]: 5 <enter> a [2,2]: 6 <enter> a [2,3]: 7 <enter> a [2,4]: 8 <enter> a [3,1]: 9 <enter> 99
100 a [3,2]: 10 <enter> a [3,3]: 11 <enter> a [3,4]: 12 <enter> sl[1]: [10] sl[2]: [26] sl[3]: [42] sc[1]: [15] sc[2]: [18] sc[3]: [21] sc[4]: [24] Programa Exemplo: Escreva um programa em Java que gera uma matriz A (12 x 13) e divide todos os elementos de cada uma das 12 linhas de A pelo valor do maior elemento daquela linha. Imprimir a matriz A modificada. // Programa Principal: ProgArrayList2D_3.java package progarraylist2d_3; import java.util.arraylist; public class ProgArrayList2D_3 { final int numerolinhas = 12, numerocolunas = 13; ArrayList<Double>[][] a = new ArrayList[numeroLinhas][numeroColunas]; double x = 1.0; // ArrayList 2D // gera matriz A for (int l = 0; l < numerolinhas; l++) { for (int c = 0; c < numerocolunas; c++) { a[l][c] = new ArrayList(); if (c == 0) { a[l][c].add(x); x++; else { a[l][c].add(1.0); // lista o ArrayList 2D (matriz a) System.out.println("Matriz Original: "); for (int l = 0; l < numerolinhas; l++) { for (int c = 0; c < numerocolunas; c++) { System.out.printf("%4.1f ", a[l][c].get(0)); System.out.println(); ArrayList<Double>[] maior = new ArrayList[numeroLinhas]; // ArrayList 1D System.out.println("\nMatriz Modificada: "); 100
101 for (int l = 0; l < numerolinhas; l++) { maior[l] = new ArrayList(); maior[l].add(0.0); for (int c = 0; c < numerocolunas; c++) { if (a[l][c].get(0) > maior[l].get(0)) { maior[l].remove(0); maior[l].add(a[l][c].get(0)); for (int l = 0; l < numerolinhas; l++) { for (int c = 0; c < numerocolunas; c++) { double div = a[l][c].get(0) / maior[l].get(0); a[l][c] = new ArrayList(); a[l][c].add(div); for (int l = 0; l < numerolinhas; l++) { System.out.printf("%4.1f -> ", maior[l].get(0)); for (int c = 0; c < numerocolunas; c++) { System.out.printf("%.2f ", a[l][c].get(0)); System.out.println(); Resultado do Programa: Matriz Original: 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 2,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 3,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 4,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 5,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 6,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 7,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 8,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 9,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 10,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 11,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 12,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 1,0 Matriz Modificada: 1,0 -> 1,00 1,00 1,00 1,00 1,00 1,00 1,00 1,00 1,00 1,00 1,00 1,00 1,00 2,0 -> 1,00 0,50 0,50 0,50 0,50 0,50 0,50 0,50 0,50 0,50 0,50 0,50 0,50 3,0 -> 1,00 0,33 0,33 0,33 0,33 0,33 0,33 0,33 0,33 0,33 0,33 0,33 0,33 4,0 -> 1,00 0,25 0,25 0,25 0,25 0,25 0,25 0,25 0,25 0,25 0,25 0,25 0,25 5,0 -> 1,00 0,20 0,20 0,20 0,20 0,20 0,20 0,20 0,20 0,20 0,20 0,20 0,20 6,0 -> 1,00 0,17 0,17 0,17 0,17 0,17 0,17 0,17 0,17 0,17 0,17 0,17 0,17 7,0 -> 1,00 0,14 0,14 0,14 0,14 0,14 0,14 0,14 0,14 0,14 0,14 0,14 0,14 8,0 -> 1,00 0,13 0,13 0,13 0,13 0,13 0,13 0,13 0,13 0,13 0,13 0,13 0,13 9,0 -> 1,00 0,11 0,11 0,11 0,11 0,11 0,11 0,11 0,11 0,11 0,11 0,11 0,11 10,0 -> 1,00 0,10 0,10 0,10 0,10 0,10 0,10 0,10 0,10 0,10 0,10 0,10 0,10 11,0 -> 1,00 0,09 0,09 0,09 0,09 0,09 0,09 0,09 0,09 0,09 0,09 0,09 0,09 12,0 -> 1,00 0,08 0,08 0,08 0,08 0,08 0,08 0,08 0,08 0,08 0,08 0,08 0,08 101
102 5.8 Strings (Cadeia de Caracteres) Java possui um classe que permite a manipulação de Strings (cadeia de caracteres) chamada String. Uma string é um tipo de dado que permite armazenar e manipular um conjunto de caracteres, números e caracteres especiais (Figura 5). Declaração e inicialização: String s = Pelotas ; String r = null; String str = ; Figura 5: Representação gráfica de uma String Onde: p é o índice do primeiro caracter (ou seja, zero) Character primeirocaracter = s.charat(0); n é o número de caracteres da String int n = s.length(); u é o índice do último caracter da String int u = n 1; Character ultimocaracter = s.charat(u); ou Character primeirocaracter = s.charat(n-1); Observação: Note que igualmente a um vetor (array), Vector, ArrayList, LinkedList, o primeiro caracter da String encontra-se na posição zero (0), por isto nunca pode-se acessar o elemento n da String e sim o elemento de índice u. Forma alternativa (Utilizar com um vetor de caracteres): char[] s = {'P', 'e', 'l', 'o', 't', 'a', 's'; System.out.println(s); System.out.println(Arrays.toString(s)); char caracteres[] = {'A', 'B', 'C', 'D', 'E', 'F'; String string = new String(caracteres); System.out.println("string: " + string); int n = string.length(); for (int i = 0; i < n; i++) { 102
103 System.out.println("Código ASCII: " + string.codepointat(i)); for (char ch : string.tochararray()) { // foreach System.out.println("Caracter: " + ch); Resultado do Programa: Pelotas [P, e, l, o, t, a, s] string: ABCDEF Código ASCII: 65 Código ASCII: 66 Código ASCII: 67 Código ASCII: 68 Código ASCII: 69 Código ASCII: 70 Caracter: A Caracter: B Caracter: C Caracter: D Caracter: E Caracter: F Métodos para manipular Strings String. A seguir são descritos os principais métodos que permitem manipular objetos do tipo Sintaxe: char charat(int posição); Retorna o caracter contido na posição. Modo de usar: String s = Pelotas ; char ch = s.charat(0); // ch = P ; Sintaxe: int compareto(object objeto); Compara a string com um objeto. Sintaxe: int compareto(string outrastring); Compara duas strings lexicograficamente (caracter à caracter). Sintaxe: int comparetoignorecase(string string); Compara duas strings lexicograficamente, ignorando diferenças entre maíusculas e minúsculas. Sintaxe: String concat(string string); Concatena a string no fim da outra string. Sintaxe: boolean contentequals(string stringbuffer); Retorna true se e somente se a string representa a mesma sequência de caracteres do que a stringbuffer. Sintaxe: static String copyvalueof(char[] vetor); Retorna uma string que representa a sequência de caracteres do vetor de careacteres. Sintaxe: static String copyvalueof(char[] vetor, int offset, int count); Retorna uma string que representa uma sequência de caracteres do vetor. Sintaxe: boolean endswith(string sufixo); 103
104 Testa se a string termina com o sufixo especificado. Sintaxe: boolean equals(object objeto); Compara a string com o objeto. Sintaxe: boolean equalsignorecase(string outrastring); Compara a string com a outrastring, ignorando maiúsculas e minúsculas. Sintaxe: byte[] getbytes(); Codifica a string em uma sequência de bytes usando o conjunto de caracteres, armazenando o resultado em um novo vetor de bytes. Sintaxe: byte[] getbytes(string charsetname); Codifica a string em uma sequência de bytes usando o conjunto de caracteres do nome, armazenando o resultado dentro do novo vetor. Sintaxe: void getchars(int fontebegin, int fonteend, char[] destino, int destinobegin); Cópia a seqüência de caracteres para um vetor de caracteres destino. Sintaxe: int hashcode(); Retorna o código hash da string. Sintaxe: int indexof(int caracter); Retorna o índice dentro da string da primeira ocorrência do caracter especificado ou -1 se não encontrar. Sintaxe: int indexof(int caracter, int fromindex); Retorna o índice dentro da string da primeira ocorrência do caracter, iniciando a busca no índice. Sintaxe: int indexof(string string); Retorna o índice dentro da string da primeira ocorrência da substring. Sintaxe: int indexof(string string, int fromindex); Retorna o índice dentro da string da primeira ocorrência da substring, iniciando a busca no índice. Sintaxe: String intern(); Retorna uma representação canônica da string objeto (forma mais simples). Sintaxe: int lastindexof(int caracter); Retorna o índice dentro da string da última ocorrência do caracter. Sintaxe: int lastindexof(int caracter, int fromindex); Retorna o índice dentro da string da última ocurrência do caracter, pesquisando para trás começando no índice. Sintaxe: int lastindexof(string string); Retorna o índice dentro da string da ocorrência mais à direita da subseqüência. Sintaxe: int lastindexof(string string, int fromindex); Retorna o índice dentro da string da última ocorrência da substring, buscando para trás começando o índice. Sintaxe: int length(); Retorna o comprimento da string, ou seja, o número de caracteres presentes na string no momento. Sintaxe: boolean matches(string expressaoregular); Diz se a string corresponde a uma expressão regular ou não. Sintaxe: boolean regionmatches(boolean ignorecase, int toffset, String other, int ooffset, int len); Testa se duas regiões das strings são iguais. Sintaxe: boolean regionmatches(int toffset, String other, int ooffset, int len); 104
105 Testa se duas regiões das strings são iguais. Sintaxe: String replace(char velhocaracter, char novocaracter); Retorna uma nova string resultante da troca de todas as ocorrências do velhocaracter nesta string com novocaracter. Sintaxe: String replaceall(string expressaoregular, String replacement); Substitui cada subseqüência da seqüência de caracteres que corresponde a expressão regular com a substituição dada. Sintaxe: String replacefirst(string expressaoregular, String replacement); Substitui as primeiras substrings dessa string que corresponde à expressão regular com a substituição dada. Sintaxe: String[] split(string expressaoregular); Divide a string em pedaços (substrings) em torno da expressão regular. Sintaxe: String[] split(string expressaoregular, int limite); Divide a string em pedaços em torno da expressão regular. Sintaxe: boolean startswith(string prefixo); Testa se esta string começa com o prefixo. Sintaxe: boolean startswith(string prefixo, int toffset); Testa se a string começa com o prefixo começando pelo índice. Sintaxe: CharSequence subsequence(int beginindex, int endindex); Retorna uma nova string de caracteres que é uma subseqüência desta seqüência. Sintaxe: String substring(int beginindex); Retorna uma nova string que é uma substring desta string. Sintaxe: String substring(int beginindex, int endindex); Retorna uma nova string que é uma substring desta string. Sintaxe: char[] tochararray(); Converte a string em um novo vetor de caracteres. Sintaxe: String tolowercase(); Converte todos os caracteres da string para minúsculos. Sintaxe: String tostring(); Retorna o objeto como string. Sintaxe: String touppercase(); Converte todos os caracteres da string para maiúsculos. Sintaxe: String trim(); Retorna uma cópia da string. Sintaxe: static String valueof(boolean flag); Retorna uma representação string do argumento boolean. Sintaxe: static String valueof(char caracter); Retorna uma representação string do argumento char. Sintaxe: static String valueof(char[] vetor); Retorna uma representação string do argumento char []. Sintaxe: static String valueof(char[] vetor, int offset, int count); Retorna uma representação string do argumento char []. 105
106 Sintaxe: static String valueof(double realdouble); Retorna uma representação string do argumento double. Sintaxe: static String valueof(float realfloat); Retorna uma representação string do argumento float. Sintaxe: static String valueof(int inteiro); Retorna uma representação string do argumento int. Sintaxe: static String valueof(long longo); Retorna uma representação string do argumento long. Sintaxe: static String valueof(object objeto); Retorna uma representação string do argumento Object. Exemplos: a) Exemplo do uso dos métodos touppercase e tolowercase: // Programa Principal: ProgToUpperCase.java package progtouppercase; public class ProgToUpperCase { String s = "Paulo Roberto Gomes Luzzardi"; System.out.println("Nome: " + s); System.out.println("Nome: " + s.touppercase()); System.out.println("Nome: " + s.tolowercase()); Resultado do Programa: Nome: Paulo Roberto Gomes Luzzardi Nome: PAULO ROBERTO GOMES LUZZARDI Nome: paulo roberto gomes luzzardi b) Exemplo do uso de length, charat e indexof: // Programa Principal: ProgInverte.java package proginverte; import java.util.scanner; public class ProgInverte { Scanner input = new Scanner(System.in); String s; int n; char op; do { System.out.print("Nome: "); s = input.nextline(); 106
107 System.out.print("Invertido: "); n = s.length(); // número de caracteres da String s for (int i = n-1;i >= 0;i--) { System.out.print(s.charAt(i)); // acesso a cada caracter da String s System.out.println(); do { System.out.print("Continua [S/N]? "); s = input.nextline(); op = s.charat(0); while ("SsNn".indexOf(op) == -1); // verifica se op é SsNn while ("Ss".indexOf(op)!= -1); // while ("S".equalsIgnoreCase(s)); Exemplo para testar o orograma: Nome: pelotas <enter> Invertido: satolep Continua [S/N]? s <enter> Nome: satolep <enter> Invertido: pelotas Continua [S/N]? N <enter> c) Exemplo do uso de String.format: // Programa Principal: ProgStringFormat.java package progstringformat; public class ProgStringFormat { float numero = f; String formato = String.format("%.3f", numero); //JOptionPane.showMessageDialog(null, "numero: " + formato); System.out.printf("Número: %.4f\n", numero); System.out.println("Número Formatado: " + formato); Resultado do Programa: Número: 123,4568 Número Formatado: 123, Lista de exercícios: Strings Escreva um programa em Java que recebe via teclado um nome. Logo após a entrada do nome imprima: número de letras maiúsculas, número de letras minúsculas, número de vogais e o número de consoantes, conforme exemplo abaixo: Entrada: Nome: Faculdade de Tecnologia Senac <enter> Saída: (3) maiúscula(s) (23) minúscula(s) 107
108 (12) vogais(s) (14) consoante(s) Escreva um programa em Java que recebe via teclado uma palavra e uma letra. Logo após a entrada do nome e da letra imprima o número de letras que existe no nome ou ERRO: Não existe a letra (?) na palavra (?), conforme exemplo abaixo: Exemplo para testar o programa: Palavra: Luzzardi <enter> Letra: z <enter> 2 letra(s) Continua [S]im ou [N]ão? S <enter> Palavra: Luzzardi <enter> Letra: w <enter> ERRO: Não existe a letra (w) na palavra (Luzzardi) Continua [S]im ou [N]ão? N <enter> Observação: O programa deve ser encerrado quando o usuário digitar N ou n na pergunta: Continua [S]im ou [N]ão? Escreva um programa em Java que recebe via teclado uma palavra e uma posição. O programa deve imprimir na tela, a letra antecessora, a letra (da referida posição) e a letra sucessora, conforme exemplo abaixo: Entrada: Saída: Palavra: Universidade <enter> Posição: 7 <enter> Antecessora: s Letra: i Sucessora: d Observação: O programa deve imprimir na tela as seguintes mensagens de erro, se for o caso: Letra antecessora não existe, Letra sucessora não existe ou Posição inválida Escreva um programa em Java que recebe via teclado um nome. O programa deve imprimir, na tela, as palavras do nome em ordem inversa, uma por linha, conforme exemplo abaixo: Entrada: Nome: Paulo Roberto Gomes Luzzardi <enter> Saída: Luzzardi Gomes Roberto Paulo Escreva um programa em Java que recebe via teclado um nome. Logo após a entrada do nome o programa deve imprimir (EM LETRA MAIÚSCULA) o sobrenome da pessoa, conforme exemplos abaixo: Exemplo para testar o programa: Sobrenome: LUZZARDI Sair [S/N]? N <enter> Nome: Renato Souza <enter> Sobrenome: SOUZA Sair [S/N]? s <enter> Observação: O programa termina quando o usuário digitar S ou s na pergunta: Sair [S/N]? 108
109 Escreva um programa em Java que recebe via teclado um nome. Logo após a entrada do nome o programa deve imprimir na tela: sobrenome, primeiro nome e demais nomes abreviados, conforme exemplos abaixo: Exemplo para testar o programa: Nome: Paulo Roberto Gomes Luzzardi <enter> Autor: Luzzardi, Paulo R. G. Sair [S/N]? N <enter> Nome: Renato Lima Souza <enter> Autor: Souza, Renato L. Sair [S/N]? s <enter> Observação: O programa termina quando o usuário digitar S ou s na pergunta: Sair [S/N]? Escreva um programa em Java que recebe via teclado o nome de um estado. Logo após a entrada do nome do estado imprima: a sigla do estado (2 letras maiúsculas), conforme exemplos abaixo: Exemplo para testar o programa: Estado: Rio Grande do Sul <enter> Sigla: RS Estado: são paulo <enter> Sigla: SP Estado: rio de janeiro <enter> Sigla: RJ Estado: <enter> Observação: O programa encerra quando o usuário digitar apenas <enter> na entrada do nome do estado Escreva um programa em Java que recebe via teclado uma palavra, início e fim. Logo após a entrada de todos os dados imprima a string resultante ou ERRO: Fim inválido ou Início inválido, conforme exemplos abaixo: Exemplo para testar o programa: Palavra: universidade <enter> Início: 7 <enter> Fim: 11 <enter> String resultante: idade Continua [S/N]? s <enter> Palavra: eletricidade <enter> Início: 7 <enter> Fim: 15 <enter> ERRO: Fim Inválido Continua [S/N]? N <enter> Observação: O programa termina quando o usuário digitar N ou n na pergunta: Continua [S/N]?. 5.9 Classe Object Em Java, todas as classes, sem nenhuma exceção, herdam direta ou indiretamente todos os métodos da classe Object, pois ela é a superclasse de qualquer outra classe. A seguir são descritos os métodos da classe Object. 109
110 Sintaxe: protected Object clone(); Cria e retorna uma cópia do objeto. Sintaxe: boolean equals(object objeto); Indica se um objeto é igual a outro. Sintaxe: protected void finalize(); Chama o coletor de lixo (garbage coletor) do objeto quando o coletor de lixo determina que não há mais referências ao objeto. Sintaxe: Class getclass(); Retorna a classe runtime do objeto. Sintaxe: int hashcode(); Retorna o valor do código hash do objeto. Sintaxe: void notify(); Aguarda uma thread que está esperando o monitor do objeto. Sintaxe: void notifyall(); Aguarda todas as threads que estão esperando o monitor do objeto. Sintaxe: String tostring(); Retorna uma string do objeto. Sintaxe: void wait(); Faz a thread corrente esperar até que outra thread invoque os métodos notify() ou notifyall() deste objeto. Sintaxe: void wait(long timeout); Faz a thread corrente esperar até que outra thread invoque os métodos notify() ou notifyall() deste objeto ou um período especificado de tempo tiver decorrido. Sintaxe: void wait(long timeout, int nanos); Faz a thread corrente esperar até que outra thread invoque os métodos notify() ou notifyall() deste objeto, ou outra thread interrompa a corrente thread, ou um período especificado de tempo tiver decorrido. Pacote: java.lang.object (não é necessário fazer a chamada implícita deste pacote) // Programa Principal: ProgObject.java package progobject; public class ProgObject { public static void main(string[] args) throws Exception { Object objeto = new Object(); objeto = "Paulo Roberto"; System.out.println("Objeto: " + objeto); objeto = 48; System.out.println("Objeto: " + objeto); Resultado do Programa: Objeto: Paulo Roberto Objeto:
111 // Programa Principal: ProgObjeto.java package progobjeto; import java.util.stack; public class ProgObjeto { public static void main(string[] args) throws Exception { Object objeto = "Paulo Roberto"; System.out.println("Objeto String: " + objeto); objeto = 48; System.out.println("Objeto Inteiro: " + objeto); Stack pilha = new Stack(); pilha.push(123); objeto = pilha.pop(); System.out.println("Objeto Pilha: " + objeto); Integer valor = objeto.hashcode(); System.out.println("Valor: " + valor); Resultado do Programa: Objeto String: Paulo Roberto Objeto Inteiro: 48 Objeto Pilha: 123 Valor: 123 // Programa Principal: ProgNovoObjeto.java package prognovoobjeto; import java.util.scanner; public class ProgNovoObjeto { public static void main(string[] args) throws Exception { Scanner entrada = new Scanner(System.in); String s; int n; System.out.print("Numero de Objetos: "); s = entrada.nextline(); n = Integer.parseInt(s); Object [] objeto = new Object[n]; for (int i = 0;i < n;i++) { System.out.print("Nome: "); s = entrada.nextline(); objeto[i] = s; for (int i = n-1;i >= 0;i--) { System.out.println("String: " + objeto[i]); // vetor de objetos 111
112 Exemplo para testar o programa: Número de Objetos: 4 <enter> Nome: paulo <enter> Nome: roberto <enter> Nome: gomes <enter> Nome: luzzardi <enter> String: luzzardi String: gomes String: roberto String: paulo 5.10 Classe Iterator Iterator é um padrão de projeto que permite simplificar a iteração com um conjunto de objetos, tendo como função encapsular a iteração sobre objetos, simplificando desta forma, a manipulação de uma coleção de objetos. A seguir são descritos os métodos da classe Iterator. Sintaxe: boolean hasnext(); Retorna true se a iteração possui mais elementos. Sintaxe: E next(); Retorna o próximo elemento da iteração. Sintaxe: void remove(); Remove da coleção o último elemento retornado pelo iterador. Observação: Olhe o exemplo de utilização do Iterator da próxima seção (5.11) Classe LinkedHashSet LinkedHashSet é uma das implementações da interface Set (conjunto). Esta implementação estende a implementação HashSet, adicionando uma ordem de iteração nos elementos, usando o Iterator. A ordem de inserção é a ordem dos elementos do conjunto. Utiliza uma lista duplamente encadeada para manter a ordem. A seguir são descritos os principais métodos da classe LinkedHashSet (HashSet, AbstractSet, AbstractCollection, Object e Set). Sintaxe: boolean add(e elemento); Adiciona o elemento no conjunto, se ele ainda não existir. Sintaxe: boolean remove(object objeto); Remove o objeto especificado do conjunto. 112
113 Sintaxe: void clear(); Remove todos os elementos do conjunto. Sintaxe: Object clone(); Retorna um clone do conjunto para um determinado objeto. Sintaxe: boolean contains (Object objeto); Retorna true se o objeto especificado existe, caso contrário retorna false. Sintaxe: int size (); Retorna o número de elementos do conjunto. Sintaxe: boolean isempty (); Retorna true se o conjunto está vazio. Sintaxe: boolean equals (Object objeto); Compara dois objetos e retorna true se são iguais ou false se são diferentes. Sintaxe: int hashcode (); Retorna o hashcode do conjunto. Sintaxe: boolean removeall (Collection <?> coleção); Remove todos os elementos da coleção. // Programa Principal: ProgLinkedHashSet1.java package proglinkedhashset1; import java.util.iterator; import java.util.linkedhashset; public class ProgLinkedHashSet1 { LinkedHashSet<String> lista = new LinkedHashSet<>(); lista.add("ana"); lista.add("beatriz"); lista.add("carla"); lista.add("debora"); lista.add("eva"); Iterator<String> iterator = lista.iterator(); System.out.print("LinkedHashSet: ["); while (iterator.hasnext()) { System.out.print(iterator.next() + ", "); System.out.println( \b\b] ); Resultado do Programa: LinkedHashSet: [Ana, Beatriz, Carla, Debora, Eva] // Programa Principal: ProgLinkedHashSet2.java package proglinkedhashset2; import java.util.iterator; import java.util.linkedhashset; 113
114 public class ProgLinkedHashSet2 { LinkedHashSet<Integer> lista = new LinkedHashSet<>(); lista.add(100); lista.add(200); lista.add(300); lista.add(400); lista.add(500); int n = lista.size(); System.out.println("Número de Elementos do Conjunto: " + n); int somatotal = 0; Iterator<Integer> iterator = lista.iterator(); System.out.print("LinkedHashSet: ["); while (iterator.hasnext()) { int elemento = iterator.next(); somatotal = somatotal + elemento; System.out.print(elemento + ", "); System.out.println("\b\b]"); System.out.println("Soma Total dos Elementos do Conjunto: " + somatotal); double media = (double) somatotal / n; System.out.println("Média do Conjunto: " + media); Resultado do Programa: Número de Elementos do Conjunto: 5 LinkedHashSet: [100, 200, 300, 400, 500] Média do Conjunto: Classe Genérica em Java É possível em Java definir e utilizar uma classe genérica. Veja o exemplo a seguir aonde há uma classe genérica Nodo : // Classe Genérica: Nodo.java package progclassegenerico_1; public class Nodo <E> { private E element; public void add(e element) { this.element = element; public E get() { return element; // Programa Principal: ProgClasseGenerica_1.java 114
115 package progclassegenerico_1; public class ProgClasseGenerico { Nodo <Integer> inteiro = new Nodo<>(); inteiro.add(123); System.out.println("Inteiro: " + inteiro.get()); Nodo <Double> real = new Nodo<>(); real.add(123.45); System.out.println("Double: " + real.get()); Nodo <String> string = new Nodo<>(); string.add("paulo"); System.out.println("String: " + string.get()); Nodo <Character> caracter = new Nodo<>(); caracter.add('a'); System.out.println("Caracter: " + caracter.get()); Nodo <Float> numfloat = new Nodo<>(); numfloat.add(1.23f); System.out.println("Float: " + numfloat.get()); Resultado do Programa: Inteiro: 123 Double: String: Paulo Caracter: A Float: 1.23 // Classe Genérica: Pixel.java package progclassegenerica_2; public class Pixel <E>{ private E x; private E y; private int cor; public void add(e x, E y, int cor) { this.x = x; this.y = y; this.cor = cor; public E getx() { return this.x; public E gety() { return this.y; public int getcor() { 115
116 return this.cor; // Programa Principal: ProgClasseGenerica_2.java package progclassegenerica_2; public class ProgClasseGenerica_2 { Pixel <Integer> pixelint = new Pixel<>(); pixelint.add(100, 200, 3); System.out.println("x: " + pixelint.getx()); System.out.println("y: " + pixelint.gety()); System.out.println("Cor: " + pixelint.getcor()); Pixel <Double> pixeldouble = new Pixel<>(); pixeldouble.add(50.70, , 4); System.out.println("x: " + pixeldouble.getx()); System.out.println("y: " + pixeldouble.gety()); System.out.println("Cor: " + pixeldouble.getcor()); Resultado do Programa: x: 100 y: 200 Cor: 3 x: 50.7 y: Cor: Fila Prioritária (PriorityQueue) É possível em Java definir e utilizar uma Fila com Prioridade através da classe PriorityQueue, ou seja, definir a ordem de retirada da Fila. PriorityQueue é uma Fila que possui uma forma prioritária na remoção dos seus elementos, ou seja, esta forma pode ser ascendente (crescente) ou descendente (decrescente) Veja exemplo ProgPriorityQueue abaixo. Construtores A seguir são descritos os principais construtores e métodos da classe PriorityQuere. PriorityQueue() Cria uma PriorityQueue com capacidade de 11 elementos de acordo com uma ordem natural dos seus elementos. PriorityQueue(Collection <? extends E> c) Cria uma PriorityQueue contebdo os elementos de uma coleção. 116
117 PriorityQueue(Comparator <? Super E> comparator) Cria uma PriorityQueue com capacidade inicial padrão e cujos elementos são ordenados de acordo com o comparador especificado. PriorityQueue(int capacidadeinicial) Cria uma PriorityQueue com capacidade inicial especificada que ordena os elementos de acordo com sua Ordem natural. PriorityQueue(int capacidadeinicial, Comparator<? Super E> comparator) Cria uma PriorityQueue com capacidade inicial especificada que ordena os elementos de acordo com o comparador especificado. PriorityQueue(PriorityQueue<? Extends E> c) Cria uma PriorityQueue contendo os elementos da PriorityQueue especificada. PriorityQueue(SortedSet<? Extends E> c) Cria uma PriorityQueue contendo os elementos da SortedSet especificada. Sintaxe: public boolean add(e element); Insere o elemento na Fila de Prioridade. Sintaxe: void clear(); Remove todos os elementos da PriorityQueue. Sintaxe: Comparator <? super E> comparator (); Retorna um comparador utilizado para ordenar os elementos da fila ou null se esta fila é classificada de acordo com a ordenação natural de seus elementos. Sintaxe: boolean contains(object objeto); Retorna true se a Fila contém o objeto especificado. Sintaxe: Iterator <E> iterator (); Retorna um iterador sobre os elementos da Fila. Sintaxe: boolean offer (E element); Insere o elemento especificado na PriorityQueue. Sintaxe: E peek (); Recupera, mas não remove, o primeiro da Fila ou retorna null se a Fila está vazia. Sintaxe: E poll (); Recupera e remove o primeiro da Fila ou retorna null se a Fila está vazia. Sintaxe: boolean remove (Object objeto); Remove uma instância do objeto especificado desta Fila, se ele existir na Fila. Sintaxe: int size (); Retorna o número de elementos desta coleção. Sintaxe: Object [] toarray (); Retorna um array contendo todoso os elementos da Fila. Sintaxe: <T> T[] toarray (T[] array); Retorna um array contendo todos os elementos desta Fila; o tipo retornado é o mesmo tipo do array especificado. 117
118 // Programa Principal: ProgFilaPrioridade.java package progfilaprioridade; import java.util.priorityqueue; public class ProgFilaPrioridade { PriorityQueue fila = new PriorityQueue(); // aloca 11 elementos fila.offer(20); fila.offer(40); fila.offer(10); fila.offer(30); System.out.println("Fila: " + fila); System.out.println("Menor Elemento Prioritário: " + (Integer) fila.poll()); System.out.print("PriorityQueue: ["); while (!fila.isempty()) { Integer nodo = (Integer) fila.poll(); System.out.print(nodo + ", "); System.out.println("\b\b]"); // remove o menor elemento Resultado do Programa: Fila: [10, 30, 20, 40] Menor Elemento Prioritário: 10 PriorityQueue: [20, 30, 40] A seguir, o programa exemplo, mostra uma Fila de Prioridade com prioridade do mais VELHO ao mais MOÇO. // Classe: Pessoa.java package progpriorityqueue; class Pessoa { // atributos da classe private String nome; public int idade; // construtor public Pessoa(String nome, int idade) { this.nome = nome; this.idade = public String tostring() { return("[" + nome + " tem " + idade + " anos]"); // Programa Principal: ProgPriorityQueue.java 118
119 package progpriorityqueue; import java.util.priorityqueue; public class ProgPriorityQueue { // ordem descendente PriorityQueue <Pessoa> fila = new PriorityQueue<>((Pessoa p1, Pessoa p2) -> p2.idade - p1.idade); // ordem ascendente // PriorityQueue <Pessoa> fila = new PriorityQueue<>((Pessoa p1, Pessoa p2) -> p1.idade - p2.idade); fila.offer(new Pessoa("Paulo Roberto", 52)); fila.offer(new Pessoa("Renato Luis", 49)); fila.offer(new Pessoa("Ana Maria", 56)); fila.offer(new Pessoa("Francisco Carlos", 54)); fila.offer(new Pessoa("Julia Helena", 55)); System.out.println("Fila Prioritária: " + fila); while (!fila.isempty()) { System.out.println(fila.poll()); Resultado do Programa: Fila Prioritária: [[Ana Maria, 56 anos], [Julia Helena, 55 anos], [Paulo Roberto, 52 anos], [Renato Luis, 49 anos], [Francisco Carlos, 54 anos]] [Ana Maria, 56 anos] [Julia Helena, 55 anos] [Francisco Carlos, 54 anos] [Paulo Roberto, 52 anos] [Renato Luis, 49 anos] 119
120 6. Listas Lineares: Pilhas, Filas e Deques A seguir é visto a implementação de uma Pilha, uma Fila e um Deque implementados utizando as classes existentes em Java: Stack, Queue e ArrayDeque. Pilha: Estrutura linear organizada de forma que a entrada e a saída dos dados é feita na mesma extremidade (Figura 6). Forma de acesso: LIFO (Last Input First Output), ou seja, o último elemento a entrar na pilha é o primeiro a sair dela. Fila: Estrutura linear organizada de forma que a entrada dos dados é feita por uma extremidade da lista linear e, a saída, é feita na outra extremidade (Figura 6). Forma de acesso: FIFO (First Input First Output), ou seja, o primeiro elemento a entrar na fila é o primeiro a sair da fila. Figura 6: Representação de uma Fila e uma Pilha Funcionamento da Pilha acima: Funcionamento da Fila acima: Entrada: 10, 20 e 30 (push) Saída: 30, 20 e 10 (pop) Entrada: 10, 20 e 30 (inserefila) Saída: 10, 20 e 30 (removefila) 120
121 6.1 Implementação de uma Pilha (Stack) A seguir é mostrado a implementação de Pilha usando a classe Pilha e Stack (escrita pelo programador). Programa exemplo: Permite inserir números inteiros em uma Pilha usando uma classe Pilha implementada pelo programador. Quando o número digitado for igual à zero (0), todos os números da pilha são listados. // Classe: Pilha.java package progpilha; public class Pilha { // atributos da classe private int topo; private final int[] dados; // construtor Pilha(int numelementos) { dados = new int[numelementos]; topo = -1; // push public void push(int i) { int max = dados.length - 1; if (topo < max) { topo++; dados[topo] = i; else { System.out.println("Erro: Pilha Cheia"); // pop public int pop() { if (topo!= 0) { int valor = dados[topo]; topo--; return (valor); else { return (0); // exibe public void exibepilha() { System.out.print("Pilha: ["); for (int i = 0; i <= topo; i++) { System.out.print(dados[i] + ", "); 121
122 if (topo == -1) { System.out.println("]"); else { System.out.println("\b\b]"); // Programa Principal: ProgPilha.java package progpilha; import java.util.scanner; public class ProgPilha { Pilha pilha = new Pilha(5); Scanner entrada = new Scanner(System.in); String s; int nodo; do { pilha.exibepilha(); System.out.print("Elemento: "); s = entrada.nextline(); nodo = Integer.parseInt(s); if (nodo!= 0) pilha.push(nodo); while (nodo!= 0); pilha.exibepilha(); Exemplo para testar o programa: Pilha: [] Elemento: 10 <enter> Pilha: [10] Elemento: 20 <enter> Pilha: [10, 20] Elemento: 30 <enter> Pilha: [10, 20, 30] Elemento: 40 <enter> Pilha: [10, 20, 30, 40] Elemento: 50 <enter> Pilha: [10, 20, 30, 40, 50] Elemento: 60 <enter> Erro: Pilha Cheia Pilha: [10, 20, 30, 40, 50] Elemento: 0 Pilha: [10, 20, 30, 40, 50] 122
123 Stack (Pilha) import java.util.stack; A classe Stack é utilizada para armazenar elementos em uma Pilha. A seguir são descritos os principais métodos da classe Stack. Sintaxe: boolean isempty(); Testa se a pilha está vazia. Sintaxe: Object peek(); Verifica o objeto que está no topo da pilha sem removê-lo da pilha. Sintaxe: Object pop(); Remove o objeto do topo da pilha e retorna o valor do objeto. Sintaxe: Object push(object objeto); Insere o objeto no topo da pilha. Sintaxe: int search(object objeto); Retorna a posição que o objeto se encontra da pilha. Programa Exemplo: Mostra uma pilha utilizando a classe Stack e seus principais métodos de manipulação. // Programa Principal: ProgStack2.java package progstack2; import java.util.scanner; import java.util.stack; public class ProgStack2 { Stack pilha = new Stack(); Scanner input = new Scanner(System.in); int nodo, n = 0; do { System.out.print("Nodo: "); String s = input.nextline(); nodo = Integer.parseInt(s); if (nodo!= 0) { pilha.push(nodo); n++; while (nodo!= 0); System.out.println("Stack: " + pilha); String extenso = ""; while (!pilha.empty()) { extenso = extenso + pilha.pop() + ", "; if (n == 0) { extenso = "]"; 123
124 else { extenso = extenso + "\b\b]"; System.out.println("Pilha: [" + extenso); Exemplo para testar o programa: Nodo: 10 <enter> Nodo: 20 <enter> Nodo: 30 <enter> Nodo: 40 <enter> Nodo: 50 <enter> Nodo: 60 <enter> Nodo: 0 <enter> Stack: [10, 20, 30, 40, 50, 60] Pilha: [60, 50, 40, 30, 20, 10] Programa Exemplo: Mostra uma pilha utilizando a classe Stack e seus principais métodos de manipulação. A diferença do programa ProgStack2 é a forma de retirar e imprimir os elementos da Pilha. No ProgStack2 foi utilizado uma String, no ProgStack3, foi usado um cast para Integer. // Programa Principal: ProgStack3.java package progstack3; import java.util.scanner; import java.util.stack; public class ProgStack3 { Stack pilha = new Stack(); Scanner input = new Scanner(System.in); int nodo, n = 0; do { System.out.print("Nodo: "); String s = input.nextline(); nodo = Integer.parseInt(s); if (nodo!= 0) { pilha.push(nodo); n++; while (nodo!= 0); System.out.println("Stack: " + pilha); System.out.print("Pilha: ["); while (!pilha.empty()) { Integer info = (Integer) pilha.pop(); System.out.print(info + ", "); System.out.println("\b\b]"); // cast para Integer 124
125 Exemplo para testar o programa: Nodo: 10 <enter> Nodo: 20 <enter> Nodo: 30 <enter> Nodo: 40 <enter> Nodo: 50 <enter> Nodo: 60 <enter> Nodo: 0 <enter> Stack: [10, 20, 30, 40, 50, 60] Pilha: [60, 50, 40, 30, 20, 10] Programa Exemplo: Uma pilha utilizando a classe Stack e alguns dos seus métodos, permitindo procurar um elemento na pilha e retornando sua posição. Considere que a primeira posição é zero (0). // Programa Principal: ProgStack.java package progstack; import java.util.scanner; import java.util.stack; public class ProgStack { Stack pilha = new Stack(); Scanner input = new Scanner(System.in); int valor; do { System.out.print("Valor: "); String s = input.nextline(); valor = Integer.parseInt(s); if (valor!= 0) { pilha.push(valor); while (valor!= 0); do { System.out.print("Procurar: "); String s = input.nextline(); valor = Integer.parseInt(s); if (valor!= 0) { int posicao = pilha.search(valor); // procura elemento que contém o valor if (posicao == -1) { System.out.println("ERRO: Elemento não encontrado"); else { System.out.println("Posição: " + posicao); while (valor!= 0); 125
126 Exemplo para testar o programa: Valor: 10 <enter> Valor: 20 <enter> Valor: 30 <enter> Valor: 40 <enter> Valor: 50 <enter> Valor: 0 <enter> Procurar: 30 <enter> Posição: 3 Procurar: 80 <enter> ERRO: Elemento não encontrado Procurar: 0 <enter> 6.2 Implementação de uma Fila (Queue) (LinkedList). A seguir é visto uma implementação de uma Fila usando a classe Fila e Queue Programa exemplo: Permite inserir números inteiros em uma Fila utilizando uma classe Fila implementada pelo programador. Quando o número digitado for igual à zero (0), todos os números da fila são listados. // Classe: Fila.java package progfila; public class Fila { // atributos da classe private int inic, fim, n; private final int [] dados; // construtor Fila(int numelementos) { inic = -1; fim = 0; n = 0; dados = new int[numelementos]; // inserefila public void inserefila(int i) { int max = dados.length; if (n < max) { dados[fim] = i; fim++; n++; else System.out.println("Erro: Fila Cheia"); // retirafila public int retirafila() { 126
127 if (n!= 0) { inic++; n--; return(dados[inic]); else return(0); // isemptyfila public boolean isemptyfila() { if (n!= 0) { return(false); else { return(true); // Programa Principal: ProgFila.java package progfila; import java.util.scanner; public class ProgFila { Fila fila = new Fila(5); Scanner entrada = new Scanner(System.in); int nodo, nodos = 0; do { System.out.print("Elemento: "); String s = entrada.nextline(); nodo = Integer.parseInt(s); if (nodo!= 0) { fila.inserefila(nodo); nodos++; while (nodo!= 0); String extenso = ""; System.out.print("Fila: ["); nodo = fila.retirafila(); if (nodo!= 0) { extenso = extenso + nodo + ", "; while (!fila.isemptyfila()) { nodo = fila.retirafila(); extenso = extenso + nodo + ", "; if (nodos == 0) { System.out.print(extenso + "]\n"); else { System.out.print(extenso + "\b\b]\n"); 127
128 Exemplo para testar o programa: Elemento: 10 <enter> Elemento: 20 <enter> Elemento: 30 <enter> Elemento: 40 <enter> Elemento: 50 <enter> Elemento: 60 <enter> Erro: Fila Cheia Elemento: 0 <enter> Fila: [10, 20, 30, 40, 50] Queue (Fila) import java.util.queue; A interface Queue é utilizada para armazenar elementos em uma Fila. A seguir são descritos os principais métodos da interface Queue. Sintaxe: E element(); Recupera, mas não remove, o primeiro da fila. Sintaxe: boolean offer(e elemento); Insere o elemento dentro desta fila, se possível. Sintaxe: E peek(); Recupera, mas não remove, o primeiro da fila, retornando null se esta fila está vazia. Sintaxe: E poll(); Recupera e remove o primeiro da fila, ou null se esta fila está vazia. Sintaxe: E remove(); Recupera e remove o primeiro da fila. Sintaxe: boolean isempty() Retorna true se a Fila está vazia ou false se ela não está vazia Programa Exemplo: Mostra uma fila utilizando a classe Queue e LinkedList e seus principais métodos. // Programa Principal: ProgQueue.java package progqueue; import java.util.linkedlist; import java.util.queue; import java.util.scanner; public class ProgQueue { Queue fila = new LinkedList(); // Fila é implementada como uma Lista Encadeada Simples (LinkedList) Scanner input = new Scanner(System.in); String extenso = ""; 128
129 int nodo; do { System.out.print("Nodo: "); String s = input.nextline(); nodo = Integer.parseInt(s); if (nodo!= 0) { fila.offer(nodo); while (nodo!= 0); System.out.println("Queue: " + fila); if (!fila.isempty()) { do { extenso = extenso + fila.poll() + ", "; while (!fila.isempty()); if (extenso.equals("")) { System.out.println("Fila: []"); else { System.out.println("Fila: [" + extenso + "\b\b]"); Exemplo para testar o programa: Nodo: 10 <enter> Nodo: 20 <enter> Nodo: 30 <enter> Nodo: 40 <enter> Nodo: 50 <enter> Nodo: 0 <enter> Queue: [10, 20, 30, 40, 50] Fila: [10,20, 30, 40, 50] Programa Exemplo: Mostra uma Fila utilizando a classe Queue e LinkedList e seus principais métodos. A diferença do ProgQueue é que neste os elementos são retirados da Fila usando-se um cast para Integer e não usando uma String temporária. // Programa Principal: ProgQueue2.java package progqueue2; import java.util.linkedlist; import java.util.queue; import java.util.scanner; public class ProgQueue2 { Queue fila = new LinkedList(); // Fila é implementada com uma Lista Encadeada Simples Scanner input = new Scanner(System.in); Integer nodo; do { System.out.print("Nodo: "); 129
130 String s = input.nextline(); nodo = Integer.parseInt(s); if (nodo!= 0) { fila.offer(nodo); while (nodo!= 0); System.out.println("Queue: " + fila); System.out.print("Fila: ["); if (!fila.isempty()) { do { nodo = (Integer) fila.poll(); System.out.print(nodo + ", "); while (!fila.isempty()); System.out.println("\b\b]"); else { System.out.println("]"); // cast para Integer Exemplo para testar o programa: Nodo: 10 <enter> Nodo: 20 <enter> Nodo: 30 <enter> Nodo: 40 <enter> Nodo: 50 <enter> Nodo: 0 <enter> Queue: [10, 20, 30, 40, 50] Fila: [10,20, 30, 40, 50] Observação: No programa exemplo acima, a Fila (Queue) foi implementada como uma lista encadeada simples (LinkedList). 6.3 Implementação de um Deque (ArrayDeque) e ArrayDeque. A seguir é visto uma implementação de um Deque (Figura 7) utilizando a classe Deque Figura 7: Representação visual de um Deque 130
131 Programa exemplo: Permite inserir números inteiros em um Deque (pelos lados esquerdo ou direito) utilizando uma classe Deque implementada pelo programador. Para finalizar a entrada dos dados, digite zero (0). // Classe: Deque.java package progdeque; public class Deque { private final int[] vetor; private int inic; private int fim; private int n; // construtor public Deque(int numeroelementos) { inic = -1; fim = 0; n = 0; vetor = new int[numeroelementos]; // inseredequedireita public void inseredequedireita(int i) { int max = vetor.length; if (n < max) { vetor[fim] = i; fim++; n++; else { System.out.println("Erro: Deque Cheia à Direita"); // inseredequeesquerda public void inseredequeesquerda(int valor) { int max = vetor.length; if (n < max) { for (int i = n; i > 0; i--) { vetor[i] = vetor[i - 1]; vetor[0] = valor; fim++; n++; else { System.out.println("Erro: Deque Cheia à Esquerda"); // retiradequedireita public int retiradequedireita() { if (n!= 0) { fim--; 131
132 int valor = vetor[fim]; n--; return (valor); else { return (0); // retiradequeesquerda public int retiradequeesquerda() { if (n!= 0) { inic++; n--; return (vetor[inic]); else { return (0); // emptydeque public boolean emptydeque() { if (n == 0) { return (true); else { return (false); // exibedeque public void exibedeque() { System.out.print("Deque: ["); if (n == 0) { System.out.println("]"); else { for (int i = 0; i < n; i++) { System.out.print(vetor[i] + ", "); System.out.println("\b\b]"); // Programa Principal: ProgDeque.java package progdeque; import java.util.scanner; public class ProgDeque { Deque deque = new Deque(5); Scanner input = new Scanner(System.in); int nodo; char op; do { deque.exibedeque(); System.out.print("Elemento: "); 132
133 String s = input.nextline(); nodo = Integer.parseInt(s); if (nodo!= 0) { do { System.out.print("[E]squerda ou [D]ireita: "); s = input.nextline(); op = s.charat(0); while ("EeDd".indexOf(op) == -1); if (nodo!= 0) { switch (op) { case 'E': case 'e': deque.inseredequeesquerda(nodo); case 'D': case 'd': deque.inseredequedireita(nodo); while (nodo!= 0); do { int esquerda = deque.retiradequeesquerda(); if (esquerda == 0) { System.out.println("Deque: Vazia à esquerda"); else { System.out.println("Esquerda: " + esquerda); int direita = deque.retiradequedireita(); if (esquerda == 0) { System.out.println("Deque: Vazia à direita"); else { System.out.println("Direita: " + direita); while (!deque.emptydeque()); Exemplo para testar o programa: Deque: [] Elemento: 10 <enter> [E]squerda ou [D]ireita: e <enter> Deque: [10] Elemento: 20 <enter> [E]squerda ou [D]ireita: d <enter> Deque: [10, 20] Elemento: 30 <enter> [E]squerda ou [D]ireita: d <enter> Deque: [10, 20, 30] Elemento: 40 <enter> [E]squerda ou [D]ireita: d <enter> Deque: [10, 20, 30, 40] Elemento: 50 <enter> [E]squerda ou [D]ireita: d <enter> Deque: [10, 20, 30, 40, 50] Elemento: 60 <enter> [E]squerda ou [D]ireita: d <enter> 133
134 Erro: Deque Cheia à Direita Deque: [10, 20, 30, 40, 50] Elemento: 60 <enter> [E]squerda ou [D]ireita: e <enter> Erro: Deque Cheia à Esquerda Deque: [10, 20, 30, 40, 50] Elemento: 0 <enter> Esquerda: 10 Direita: 50 Esquerda: 20 Direita: 40 Esquerda: 30 Direita: 0 Java possui classes pré-definidas para trabalhar com Deque: ArrayDeque, LinkedBlockingDeque e LinkedList. Construtores: ArrayDeque() Construi um deque em um array vazio com 16 elementos. ArrayDeque(int numeroelements); Construi um deque em um array vazio com numeroelements elementos. A seguir são descritos os métodos da classe ArrayDeque. Sintaxe: boolean add(e elemento); Insere o elemento no fim do deque. Sintaxe: void addfirst(e elemento); Insere o elemento no início do deque. Sintaxe: void addlast(e elemento); Insere o elemento do final do deque. Sintaxe: void clear(); Remove todos os elementos do deque. Sintaxe: ArrayDeque<E> clone(); Retorna uma cópia do deque. Sintaxe: boolean contains(object objeto); Retorna true se o deque contém o objeto. Sintaxe: Iterator<E> descendingiterator(); Retorna um iterator sobre os elementos no deque em ordem sequencial reversa. Sintaxe: E element(); Recupera, mas não remove, o elemento corrente da fila representada pelo deque. Sintaxe: E getfirst(); Recupera, mas não remove, o primeiro elemento do deque. Sintaxe: E getlast(); Recupera, mas não remove, o último elemento do deque. 134
135 Sintaxe: boolean isempty(); Retorna true se o deque não contém elementos. Sintaxe: Iterator <E> iterator(); Retorna o iterator sobre os elementos do deque. Sintaxe: boolean offer(e elemento); Insere o elemento no fim do deque. Sintaxe: boolean offerfirst(e elemento); Insere o elemento no início do deque. Sintaxe: boolean offerlast(e elemento); Insere o elemento no final do deque. Sintaxe: E peek(); Recupera, mas não remove, o elemento corrente da fila representada pelo deque ou retorna null se o deque está vazio. Sintaxe: E peekfirst(); Recupera, mas não remove, o primeiro elemento do deque, ou retorna null se o deque está vazio. Sintaxe: E peeklast(); Recupera, mas não remove, o último elemento do deque ou retorna null se o deque está vazio. Sintaxe: E poll(); Recupera e remove o elemento corrente da fila representada pelo deque ou retorna null se este deque está vazio. Sintaxe: E pollfirst(); Recupera e remove o primeiro elemento do deque ou retorna null se o deque está vazio. Sintaxe: E polllast(); Recupera e remove o último elemento do deque ou retorna null se o deque está vazio. Sintaxe: E pop(); Retira um elemento na pilha representada por este deque. Sintaxe: void push(e elemento); Insere um elemento na pilha representada por este deque. Sintaxe: E remove(); Recupera e remove o cabeça da fila representado por este deque. Sintaxe: boolean remove(object objeto); Remove a instância de um objeto deste deque. Sintaxe: E removefirst(); Recupera e remove o primeiro elemento do deque. Sintaxe: boolean removefirstoccurrence(object objeto); Remove a primeira ocorrência do objeto do deque (quando percorre o deque do primeiro ao último). Sintaxe: E removelast(); Recupera e remove o último elemento do deque. Sintaxe: boolean removelastoccurrence(object objeto); Remove a última ocorrência do objeto do deque (quando percorre o deque do primeiro ao último). Sintaxe: int size(); 135
136 Retorna o número de elementos do deque. Sintaxe: Object[] toarray(); Retorna um array contendo todos os elementos do deque em ordem crescente (do primeiro até o último elemento). Sintaxe: <T> T[] toarray(t[] array); Retorna um array contendo todos os elementos do deque em ordem crescente (do primeiro até o último elemento); o tipo do array retornado é aquele especificado pelo array. A seguir é demonstrado a utilização de um Deque através da classe ArrayDeque e seus principais métodos. Pacote: import java.util.arraydeque; // Programa Principal: ProgArrayDeque.java package progarraydeque; import java.util.arraydeque; import java.util.scanner; public class ProgArrayDeque { ArrayDeque deque = new ArrayDeque(); Scanner entrada = new Scanner(System.in); String s; char tecla = 'f', op = 'f'; int = 0; Integer nodo; // aloca com 16 elementos do { System.out.println("Deque: " + deque); System.out.print("[I]ncluir, [C]onsultar, [E]xcluir ou [F]inalizar: "); do { s = entrada.nextline(); if (!s.equals("")) { tecla = s.charat(0); while (!strchr("iicceeff", tecla)); if (!strchr("ff", tecla)) { System.out.print("[E]squerda ou [D]ireita: "); do { s = entrada.nextline(); if (!s.equals("")) { op = s.charat(0); while (!strchr("eedd", op)); switch (tecla) { case 'I': case 'i': System.out.print("Nodo: "); s = entrada.nextline(); nodo = Integer.parseInt(s); if (strchr("ee", op)) { deque.addfirst(nodo); 136
137 else { deque.addlast(nodo); n++; if (n > 16) { System.out.println("ERRO: Deque Cheio"); System.exit(1); case 'C': case 'c': if (!deque.isempty()) { if (strchr("ee", op)) { nodo = (Integer) deque.peekfirst(); else { nodo = (Integer) deque.peeklast(); System.out.println("Consultado: " + nodo); else { System.out.println("ERRO: Deque Vazio"); case 'E': case 'e': if (!deque.isempty()) { if (strchr("ee", op)) { nodo = (Integer) deque.pollfirst(); else { nodo = (Integer) deque.polllast(); System.out.println("Excluiu: " + nodo); n--; else { System.out.println("ERRO: Deque Vazio"); while (!strchr("ff", tecla)); // cast // cast // strchr static boolean strchr(string s, char tecla) { int n = s.length(); for (int i = 0;i < n;i++) { if (s.charat(i) == tecla) { return(true); return(false); Exemplo para testar o programa: Deque: [] 137
138 [I]ncluir, [C]onsultar, [E]xcluir ou [F]inalizar: i <enter> [E]squerda ou [D]ireita: e <enter> Nodo: 10 <enter> Deque: [10] [I]ncluir, [C]onsultar, [E]xcluir ou [F]inalizar: i <enter> [E]squerda ou [D]ireita: d <enter> Nodo: 20 <enter> Deque: [10, 20] [I]ncluir, [C]onsultar, [E]xcluir ou [F]inalizar: i <enter> [E]squerda ou [D]ireita: d <enter> Nodo: 30 <enter> Deque: [10, 20, 30] [I]ncluir, [C]onsultar, [E]xcluir ou [F]inalizar: f <enter> 6.4 Lista de Exercícios: Listas Lineares (Pilhas, Filas e Deques) Escreva um programa em Java que leia um nome via teclado. Logo após a entrada utilize uma Pilha (caracteres) para armazenar as letras da abreviatura deste nome. Exiba a abreviatura invertida do nome extraída da pilha, a pilha vazia e ainda o número de letras da abreviatura, conforme exemplo abaixo. Entrada: Saída: Nome: paulo roberto gomes luzzardi <enter> Abreviatura: LGRP Pilha: [] Total de Letras: Escreva um programa em Java que leia um nome via teclado. Logo após a entrada utilize uma Fila (caracteres) para armazenar e exibir (na tela do computador) todos os carateres deste nome SEM ESPAÇOS EM BRANCO e ainda o número de espaços eliminados na exibição, conforme exemplo abaixo. Entrada: Saída: Nome: paulo roberto gomes luzzardi <enter> Nome Modificado: paulorobertogomesluzzardi Número de Espaços eliminados: Escreva um programa em Java que lê nomes via teclado. Para cada nome digitado pelo usuário, armazene em uma Pilha [f] para feminino, [m] para masculino ou [i] para indeterminado, conforme exemplo abaixo. Ao final imprima a Pilha, o total de homens, o total de mulheres e o total de indeterminados. Entrada: Nome: Debora <enter> Nome: Carla <enter> Nome: Beatriz <enter> Nome: Paulo <enter> Nome: Renato <enter> Nome: <enter> Saída: Pilha: [m, m, i, f, f] 2 homens 2 mulheres 1 indeterminados 138
139 6.4.4 Escreva um programa em Java que recebe n nomes via teclado (até que o usuário digite apenas <enter>). Insira todos os nomes ORDENADOS em uma Fila de Strings (conforme exemplo abaixo). Ao final, o programa deve exibir a Fila contendo os nomes em ordem alfabética (a saída dos dados deve ser exatamente igual ao exemplo abaixo). Entrada: Saída: Nome: Debora <enter> Nome: Carla <enter> Nome: Eva <enter> Nome: Beatriz <enter> Nome: Ana <enter> Nome: <enter> Fila: [Ana, Beatriz, Carla, Debora, Eva] Escreva um programa em Java que recebe via teclado: valor e quantidade. O programa deve inserir ambos valores em uma Fila (conforme exemplo abaixo). Ao final, o programa deve exibir a Fila e após extrair todos os valores e quantidades imprimindo-os na tela conforme suas quantidades (conforme exemplo abaixo) e ainda o total de valores impressos. Entrada: Valor: 10 <enter> Quantidade: 3 <enter> Valor: 20 <enter> Quantidade: 4 <enter> Valor: 30 <enter> Quantidade: 2 <enter> Valor: 0 <enter> // saída do programa Saída: Fila: [10, 3, 20, 4, 30, 2] Saída: Total de Valores Impressos: Escreva um programa em Java que recebe n nomes via teclado (até que o usuário digite apenas <enter>). Para cada nome digitado, insira a quantidade de caracteres de cada palavra em uma Pilha de inteiros (conforme exemplo abaixo). Ao final, o programa deve exibir: (a) Pilha criada com as referidas quantidades, o total de caracteres contidos na pilha de quantidades, o total de nomes digitadas pelo usuário e a pilha vazia após as contagens (a saída dos dados deve ser exatamente igual ao exemplo abaixo). Entrada: Nome: Paulo <enter> Nome: Roberto <enter> Nome: Gomes <enter> Nome: Luzzardi <enter> Nome: <enter> Saída: Pilha: [ ] Total de Caracteres: 25 letra(s) Total de Nomes: 4 Pilha: [] Escreva um programa em Java que lê um nome qualquer via teclado. Logo após a entrada utilize uma Pilha (caracteres) e uma Fila (caracteres) para armazenar apenas as consoantes (Fila) e as vogais (Pilha) deste nome, respectivamente. Exiba a Fila e a Pilha gerada, conforme exemplo abaixo. 139
140 Entrada: Nome: paulo roberto gomes luzzardi <enter> Saída: Fila: [p, l, r, b, r, t, g, m, s, l, z, z, r, d] Pilha: [i, a, u, e, o, o, e, o, o, u, a] Escreva um programa em Java que lê um nome qualquer via teclado. Logo após a entrada utilize uma pilha ou uma fila (caracteres) para exibir o nome invertido, conforme exemplo abaixo. Entrada: Saída: Nome: paulo roberto gomes luzzardi <enter> Nome Invertido: idrazzul semog otrebor oluap Escreva um programa em Java que lê um nome via teclado. Logo após a entrada utilize uma Pilha (caracteres) e uma Fila (caracteres) para armazenar apenas as consoantes (Fila) e as vogais (Pilha) deste nome, respectivamente. Exiba a Fila, o total de consoantes, Pilha, o total de vogais e o total de letras, exatamente conforme o exemplo abaixo. Entrada: Nome: paulo roberto gomes luzzardi <enter> Saída: Fila: [p, l, r, b, r, t, g, m, s, l, z, z, r, d] Total de Consoantes: 14 Fila: [] Pilha: [a, u, o, o, e, o, o, e, u, a, i] Total de Vogais: 11 Pilha: [] Total de Letras: Escreva um programa em Java que lê um nome qualquer via teclado. Logo após a entrada utilize uma Fila para inserir todas as palavras no nome e uma Pilha para armazenar apenas iniciais de cada palavra do nome. Exiba a Fila e a Pilha gerada, conforme exemplo abaixo. Entrada: Saída: Nome: Paulo Roberto Gomes Luzzardi <enter> Fila: [Paulo, Roberto, Gomes, Luzzardi] <- fim da fila Pilha: [P, R, G, L] <- topo da pilha Implemente um programa em Java que possui duas pilhas: p1 e p2. Insira n números na pilha (p1), para cada valor inserido na pilha (p1), duplique e armazene o valor na segunda pilha (p2). Quando o usuário digitar 0 (zero), o programa deve imprimir ambas as pilhas e o conteúdo das duas pilhas em ordem crescente. Entrada: Valor: 10 <enter> Valor: 20 <enter> Valor: 30 <enter> Valor: 0 <enter> p1 p2 Saída: p1: [10, 20, 30] p2: [20, 40, 60] Pilhas:
141 Implemente um programa em Java que possui duas filas: f1 e f2. Insira n números na fila (f1) até que o usuário digite 0 (zero). O programa deve então excluir todos os valores da fila (f1) e inseri-los na fila (f2) triplicando cada valor. Ao final o programa deve imprimir ambas as filas, o maior e o menor valor de ambas as filas. Entrada: Valor: 10 <enter> Valor: 20 <enter> Valor: 30 <enter> Valor: 0 <enter> f1 f2 Saída: f1: [] f2: [30, 60, 90] Maior: 90 Menor: Escreva um programa em Java que lê uma palavra via teclado. Logo após a entrada utilize uma pilha para inverter e exibir esta palavra na tela e ainda o número de letras da palavra (conforme exemplo abaixo). Entrada: Saída: Palavra: pelotas <enter> Palavra Invertida: satolep Total de Letras: Escreva um programa em Java que recebe via teclado: valor inicial, valor final e intervalo. O programa deve inserir n valores em uma Fila (desde o valor inicial até o valor final levando em consideração o intervalo entre eles)(conforme exemplo abaixo). Ao final, o programa deve exibir a Fila criada com estes valores. O programa acaba quando o valor inicial for igual a zero. Exemplo para testar o programa: Valor Inicial: 10 <enter> Valor Final: 70 <enter> Intervalo: 10 <enter> Fila: [10, 20, 30, 40, 50, 60, 70] Valor Inicial: 60 <enter> Valor Final: 20 <enter> Intervalo: 5 <enter> Fila: [60, 55, 50, 45, 40, 35, 30, 25, 20] Valor Inicial: 0 <enter> Escreva um programa em Java que recebe n valores inteiros via teclado. O programa deve inserir cada inteiro em uma Pilha (Stack) e dobrar o valor e inserir em uma Fila (Queue). Ao final, o programa deve exibir na tela todas as informações contidas no exemplo abaixo. O programa termina quando o usuário digitar zero (0) na entrada das informações. Entrada: Nodo: 100 <enter> Nodo: 200 <enter> Nodo: 300 <enter> Nodo: 0 <enter> 141
142 Saída: Pilha: [100, 200, 300] Topo da Pilha: 300 Base da Pilha: 100 Número de Elementos da Pilha: 3 Fila: [200, 400, 600] Primeiro Elemento da Fila: 200 Número de Elementos da Fila: 3 ou Entrada: Nodo: 0 <enter> Saída: Pilha: [] Fila: [] 142
143 7. Mapas (Maps) 7.1 Conceitos básicos sobre Mapas Maps associam chaves à valores, onde as chaves devem ser únicas, mas os valores não. Maps utilizam o conceito de Tabelas Hash (Figura 8), onde as Tabelas Hash são estruturas que permitem associar uma chave a um valor. Elas permitem acesso aos valores através de sua chave associada. Uma chave é calculada através de uma função em uma posição na Tabela Hash. Tanto a localização (armazenamento) e a recuperação da chave é feita da mesma forma, ou seja, através de um cálculo matemático. Figura 8: Representação gráfica de uma Tabela Hash (Hashtable) Java utiliza a classe HashTable para manipular este tipo de estrutura de dados complexa. Para manipular elementos na tabela Hash, são usados os seguintes métodos: Sintaxe: public V put(k chave, V valor); Armazena um par de objetos na tabela Hash. Sintaxe: public V get(object chave) Retorna o objeto associado ao objeto chave. Sintaxe: public V remove(object chave); Remove o par de objetos com a chave. Sintaxe: public boolean containskey(object chave). Consulta se uma determinada chave existe na tabela. Sintaxe: public boolean contains(object valor); Verifica se um determinado valor está presente na tabela associado a qualquer chave. Sintaxe: public int size(); Retorna o número de pares de elementos na tabela. Alguns tipos de Maps: HashTable (ordem ascendente), HashMap (ordem ascendente), TreeMap (ordem ascendente) e LinkedHashMap (ordem de inclusão). Exemplos de Mapas com HashTable: (Observação: pacote obsoleto) 143
144 // Programa Principal: ProgHashTable.java package proghashtable; import java.util.hashtable; public class ProgHashTable { public static void main(string args[]) { Hashtable pessoa = new Hashtable(); pessoa.put(20, "Beatriz"); // chave, valor pessoa.put(30, "Carla"); // chave, valor pessoa.put(10, "Ana"); // chave, valor System.out.println("Tamanho da Hashtable: " + pessoa.size()); System.out.println("Tabela Hash: " + pessoa.tostring()); pessoa.clear(); Resultado do Programa: Tamanho da Hashtable: 3 Tabela Hash: {10=Ana, 20=Beatriz, 30=Carla Exemplos de Mapas com HashMap: // Programa Principal: ProgMap1.java package progmap1; import java.util.hashmap; import java.util.map; public class ProgMap1 { Map <Integer, String> mapa = new HashMap<>(); mapa.put(2, "Beatriz"); mapa.put(5, "Eva"); mapa.put(1, "Ana"); mapa.put(3, "Carla"); mapa.put(4, "Debora"); System.out.println("Mapa: " + mapa.tostring()); Resultado do Programa: Mapa: {1=Ana, 2=Beatriz, 3=Carla, 4=Debora, 5=Eva // Programa principal: ProgMap2.java package progmap2; import java.util.hashmap; import java.util.map; 144
145 public class ProgMap2 { Map <Integer, String> mapa = new HashMap<>(); mapa.put(4, "Debora"); mapa.put(2, "Beatriz"); mapa.put(5, "Eva"); mapa.put(1, "Ana"); mapa.put(3, "Carla"); System.out.println("Chaves: " + mapa.keyset()); System.out.println("Valores: " + mapa.values()); Resultado do Programa: Chaves: [1, 2, 3, 4, 5] Valores: [Ana, Beatriz, Carla, Debora, Eva] // Programa Principal: ProgMap3.java package progmap3; import java.util.hashmap; import java.util.map; import java.util.set; import java.util.treeset; public class ProgMap3 { Map <String, Integer> mapa = new HashMap<>(); mapa.put("eva", 5); mapa.put("beatriz", 2); mapa.put("carla", 3); mapa.put("ana", 1); mapa.put("debora", 4); Set <String> keys = mapa.keyset(); // carrega as chaves TreeSet <String> sortedkeys = new TreeSet<> (keys); // ordena as chaves for (String key : sortedkeys) { // exibe as chaves em ordem System.out.println("Chave: " + mapa.get(key) + " Pessoa: " + key); Resultado do Programa: Chave: 1 Pessoa: Ana Chave: 2 Pessoa: Beatriz Chave: 3 Pessoa: Carla Chave: 4 Pessoa: Debora Chave: 5 Pessoa: Eva // Programa Principal: ProgMap4.java package progmap4; import java.util.hashmap; import java.util.map; 145
146 public class ProgMap4 { Map<Integer, String> mapa = new HashMap<>(); mapa.put(5, "Eva"); mapa.put(2, "Beatriz"); mapa.put(3, "Carla"); mapa.put(1, "Ana"); mapa.put(4, "Debora"); int n = mapa.size(); for (int i = 1; i <= n; i++) { System.out.println("Chave: " + i + " Pessoa: " + mapa.get(i)); Resultado do Programa: Chave: 1 Pessoa: Ana Chave: 2 Pessoa: Beatriz Chave: 3 Pessoa: Carla Chave: 4 Pessoa: Debora Chave: 5 Pessoa: Eva // Programa Principal: ProgMap5.java package progmap_5; import java.util.hashmap; import java.util.map; public class ProgMap_5 { Map<String, String> mapa = new HashMap<>(); mapa.put("e", "Eva"); mapa.put("b", "Beatriz"); mapa.put("c", "Carla"); mapa.put("a", "Ana"); mapa.put("d", "Debora"); System.out.println("Número de Elementos do Mapa: " + mapa.size()); System.out.println("Mapa: " + mapa); // listando todo o mapa System.out.print("Chaves: "); // listando as chaves for (String st : mapa.keyset()) { System.out.print(st + " "); System.out.print("\nValores: "); // listando os valores for (String st : mapa.values()) { System.out.print(st + " "); System.out.println(); // listando o número de elementos do mapa Resultado do Programa: Número de Elementos do Mapa: 5 146
147 Mapa: {D=Debora, E=Eva, A=Ana, B=Beatriz, C=Carla Chaves: D E A B C Valores: Debora Eva Ana Beatriz Carla Exemplos de Mapas com TreeMap: // Programa Principal: ProgTreeMap.java package progtreemap; import java.util.treemap; public class ProgTreeMap { TreeMap<String, Integer> alunos = new TreeMap<>(); alunos.put("carla", 17); alunos.put("debora", 18); alunos.put("beatriz", 19); alunos.put("ana", 20); // ordem ascendente for (String key : alunos.keyset()) { System.out.printf("%-7s -> %2d\n",key, alunos.get(key)); System.out.println("keySet: " + alunos.keyset()); alunos.clear(); Resultado do Programa: Ana -> 20 Beatriz -> 19 Carla -> 17 Debora -> 18 keyset: [Ana, Beatriz, Carla, Debora] // Programa Principal: ProgLinkedHashMap.java package proglinkedhashmap; import java.util.linkedhashmap; public class ProgLinkedHashMap { LinkedHashMap pessoa = new LinkedHashMap(); pessoa.put("carla", 67.12); pessoa.put("debora", 70.23); pessoa.put("ana", 56.13); pessoa.put("beatriz", 57.45); pessoa.put("eva", 59.12); System.out.println("Mapa: " + pessoa.tostring()); for (Object key : pessoa.keyset()) { System.out.printf("%-7s -> %.2f\n", key, pessoa.get(key)); 147
148 Resultado do Programa: Mapa: {Carla=67.12, Debora=70.23, Ana=56.13, Beatriz=57.45, Eva=59.12 Carla -> 67,12 Debora -> 70,23 Ana -> 56,13 Beatriz -> 57,45 Eva -> 59, Lista de Exercícios: Mapas Escreva um programa em Java que utiliza uma LinkedHashMap e tenha o seguinte resultado: Resultado do Programa: Carla -> (2) Eva -> (4) Ana -> (0) Beatriz -> (1) Debora -> (3) Mapa: Ana Beatriz Carla Debora Eva Escreva um programa em Java que utiliza uma TreeMap e tenha o seguinte resultado: Resultado do Programa: Ana -> A Beatriz -> B Carla -> C Debora -> D keyset: [Ana, Beatriz, Carla, Debora] Escreva um programa em Java que utiliza uma Map e tenha o seguinte resultado: Resultado do Programa: Chave: 1 Pessoa: Ana Bytes: 3 Chave: 2 Pessoa: Beatriz Bytes: 7 Chave: 3 Pessoa: Carla Bytes: 5 Chave: 4 Pessoa: Debora Bytes: 6 Chave: 5 Pessoa: Eva Bytes: Escreva um programa em Java que utiliza uma HashTable e tenha o seguinte resultado: Resultado do Programa: Tamanho da Hashtable: 3 Chaves: [10, 20, 30] Valor: [Ana, Beatriz, Carla] Escreva um programa em Java que utiliza um Map (HashMap) e tenha o seguinte resultado: 148
149 Resultado do Programa: Número de Elementos do Mapa: 5 Mapa: {D=Debora, E=Eva, A=Ana, B=Beatriz, C=Carla Chaves: [D, E, A, B, C] Valores: [Debora, Eva, Ana, Beatriz, Carla] 149
150 8. Processamento de fluxos de dados, caracteres e objetos (Arquivos) Fluxos de dados ou streams são utilizados para manipulação de arquivos em Java. Arquivos são abstrações utilizadas para que um programa interaja com os dispositivos de saída, conectados ao computador, através de operações de gravação e leitura de dados. Este conceito virtual foi extraído do conceito real da utilização de arquivos físicos (armários cinzas de ferro), onde abria-se as gavetas, coloca-se e retira-se fichas de dentro dele. Java descreve um arquivo como se fosse um fluxo sequencial de caracteres (terminado por EOF End Of File) ou bytes (pelo número total de bytes). Há dois tipos de arquivos em Java: Binário: Baseado em stream de bytes, onde um conjunto de bytes é escrito e lido do disco em blocos (Figura 11). Texto: Baseado em uma fila (stream) de caracteres (Figuras 9 e 10). Caracteres são armazenados e recuperados como uma sequência de caracteres separada por linhas terminadas por um caractere de fim de linha (\n) e uma marca no final do arquivo EOF (End Of File). Figura 9: Exemplo de um arquivo texto 150
151 Figura 10: Editor hexadecimal mostrando o arquivo texto Note que num arquivo texto é possível distinguir e interpretar os caracteres presentes no arquivo, ou seja, eles são codificados na linguagem natural das pessoas (texto legível visto acima à direita da Figura 10), onde cada caracter ocupa um byte na memória (8 bits). Figura 11: Editor hexadecimal mostrando o arquivo binário Note que num arquivo binário não é possível distinguir e interpretar os caracteres presentes no arquivo, ou seja, eles não são codificados na linguagem natural das pessoas 151
152 (texto ilegível visto acima à direita da Figura 11) e sim como um conjunto de bytes representando cada caracter. Observação: Os códigos acima estão em hexadecimal, onde 0x41 é 65 em decimal (ou letra A), por exemplo. Em Java é possível manipular arquivos através da classe File (Arquivo). 8.1 Métodos para manipular arquivos em Java A seguir são descritos os principais métodos para manipular arquivos em Java: Sintaxe: boolean canread(); Testa se o aplicativo pode ler o arquivo indicado pelo pathname (caminho). Sintaxe: boolean canwrite(); Testa se o aplicativo pode modificar o arquivo indicado pelo pathname (caminho). Sintaxe: int compareto(file nomecaminho); Compara dois pathnames lexicograficamente. Sintaxe: int compareto(object objeto); Compara o pathname com outro objeto. Sintaxe: boolean createnewfile(); Cria um novo arquivo vazio com o nome do pathname, se e somente se um arquivo com este nome ainda não existe. Sintaxe: static File createtempfile(string prefixo, String sufixo); Cria um arquivo vazio no diretório de arquivos temporários, usando o prefixo e o sufixo dado para gerar o seu nome. Sintaxe: static File createtempfile(string prefixo, String sufixo, File diretório); Cria um novo arquivo vazio no diretório especificado, usando o prefixo e o sufixo dado pela string para gerar o seu nome. Sintaxe: boolean delete(); Deleta o arquivo ou diretório informado no pathname. Sintaxe: void deleteonexit(); Solicita que o arquivo ou diretório indicado por este pathname seja excluído quando a máquina virtual termina. Sintaxe: boolean equals(object objeto); Testa se o pathname é igual ao objeto indicado. Sintaxe: boolean exists(); Testa se o arquivo ou diretório indicado para este pathname existe. Sintaxe: File getabsolutefile(); Retorna a forma absoluta do pathname. Sintaxe: String getabsolutepath(); Retorna uma string absoluta do pathname. Sintaxe: File getcanonicalfile(); Retorna a forma canônica do pathname. Sintaxe: String getcanonicalpath(); 152
153 Retorna uma string canônica do pathname. 153
154 Sintaxe: String getname(); Retorna o nome do arquivo ou diretório indicado pelo pathname. Sintaxe: String getparent(); Retorna uma string do caminho pai, o caminho abstrato, ou nulo se este caminho não é nome de um diretório pai. Sintaxe: File getparentfile(); Retorna o caminho abstrato pai do caminho, ou nulo se este caminho não é nome de um diretório pai. Sintaxe: String getpath(); Converte este pathname em uma string do pathname. Sintaxe: int hashcode(); Calcula o código hash para este pathname. Sintaxe: boolean isabsolute(); Testa se este pathname é absoluto Sintaxe: boolean isdirectory(); Testa se o arquivo indicado por este caminho (pathname) é um diretório. Sintaxe: boolean isfile(); Testa se o arquivo indicado por este caminho (pathname) é um arquivo (file). Sintaxe: boolean ishidden(); Testa se o arquivo indicado por este caminho (pathname) é um arquivo escondido. Sintaxe: long lastmodified(); Retorna o tempo em que o arquivo indicado por este caminho foi modificado pela última vez. Sintaxe: long length(); Retorna o comprimento do arquivo indicado pelo pathname. Sintaxe: String[] list(); Retorna um vetor de strings com os nomes dos arquivos e diretórios no diretório indicado por este caminho. Sintaxe: String[] list(filenamefilter filtro); Retorna um vetor de strings com os nomes de arquivos e diretórios no diretório indicado por este caminho que satisfaçam o filtro. Sintaxe: File[] listfiles(); Retorna um vetor de pathname indicando os arquivos no diretório indicado por este caminho. Sintaxe: File[] listfiles(filefilter filtro); Retorna um vetor de pathname indicando os arquivos e diretórios no diretório indicado por este caminho que satisfaçam o filtro. Sintaxe: File[] listfiles(filenamefilter filtro); Retorna um vetor de pathname indicando os arquivos e diretórios no diretório indicado por este caminho que satisfaçam o filtro. Sintaxe: static File[] listroots(); Lista o sistema de arquivos disponíveis principais (root). Sintaxe: boolean mkdir(); Cria o diretório chamado por este caminho. Sintaxe: boolean mkdirs(); Cria o diretório chamado por este pathname, incluindo os diretórios pai necessários, mas inexistentes. 154
155 Sintaxe: boolean renameto(file dest); Renomeia o arquivo indicado pelo pathname. Sintaxe: boolean setlastmodified(long time); Define o tempo da última modificação do arquivo ou diretório chamado por este caminho. Sintaxe: boolean setreadonly(); Marca o arquivo ou diretório chamado por este caminho que só são permitidas operações de leitura. Sintaxe: String tostring(); Retorna uma string pathname deste caminho. Sintaxe: URI touri(); Constrói um arquivo URI que representa esse caminho. Sintaxe: URL tourl(); Converte este caminho em um arquivo: URL. 8.2 Abertura de um arquivo texto em Java. A seguir são vistos alguns programas exemplos mostrando a manipulação de arquivos Programa exemplo: Abre um arquivo texto e exibe o número de bytes do referido arquivo. // Programa Principal: ProgAbreTexto.java package progabretexto; import java.io.file; public class ProgAbreTexto { String nomearquivo = "/Users/pluzzardi/luzzardi.txt"; File arqtexto = new File(nomeArquivo); if (arqtexto.exists()) { long bytes = arqtexto.length(); System.out.println("Arquivo: " + nomearquivo); System.out.println("Bytes: " + bytes); else { System.out.println("ERRO: Arquivo não existe"); Resultado do Programa: Arquivo: /Users/pluzzardi/luzzardi.txt Bytes:
156 8.3 Listar um diretório Programa exemplo: Exibe na tela (lista) os arquivos e diretórios do pathname (caminho) especificado. // Programa Principal: ProgListaDiretorio.java package proglistadiretorio; import java.io.file; public class ProgListaDiretorio { File diretorio = new File("//Users//pluzzardi"); String [] arquivos = diretorio.list(); for (String arquivo : arquivos) { File filho = new File(diretorio, arquivo); System.out.println(filho.getAbsolutePath()); Resultado do Programa: /Users/pluzzardi/.bash_history /Users/pluzzardi/.CFUserTextEncoding /Users/pluzzardi/.config /Users/pluzzardi/.cups /Users/pluzzardi/.dropbox /Users/pluzzardi/.DS_Store /Users/pluzzardi/.gbas /Users/pluzzardi/.local /Users/pluzzardi/.netbeans-derby /Users/pluzzardi/.ssh /Users/pluzzardi/.Trash /Users/pluzzardi/.viminfo /Users/pluzzardi/Desktop /Users/pluzzardi/Documents /Users/pluzzardi/Downloads /Users/pluzzardi/Dropbox /Users/pluzzardi/frutas.luz /Users/pluzzardi/Frutas.txt /Users/pluzzardi/Leitura.zip /Users/pluzzardi/Library /Users/pluzzardi/luzzardi.dat /Users/pluzzardi/Luzzardi.txt /Users/pluzzardi/Movies /Users/pluzzardi/Music /Users/pluzzardi/NetBeansProjects /Users/pluzzardi/nomes.sort /Users/pluzzardi/nomes.txt /Users/pluzzardi/palavras.dat /Users/pluzzardi/pessoa.dat /Users/pluzzardi/pessoas.dat 156
157 /Users/pluzzardi/Pictures /Users/pluzzardi/Projects /Users/pluzzardi/Public Programa exemplo: Exibe na tela (lista) os arquivos e diretórios do pathname especificado pelo usuário. // Programa Principal: ProgListaDiretorioUsuario.java package proglistadiretoriousuario; import java.io.file; import java.util.scanner; public class ProgListaDiretorioUsuario { Scanner entrada = new Scanner(System.in); System.out.print("Pathname: "); String nomediretorio = entrada.nextline(); File diretorio = new File(nomeDiretorio); String [] arquivos = diretorio.list(); for (int i = 0;i < arquivos.length;i++) { File filho = new File(diretorio, arquivos[i]); System.out.println(filho.getAbsolutePath()); Resultado do Programa: Pathname: /Users/pluzzardi /Users/pluzzardi/.bash_history /Users/pluzzardi/.CFUserTextEncoding /Users/pluzzardi/.config /Users/pluzzardi/.cups /Users/pluzzardi/.dropbox /Users/pluzzardi/.DS_Store /Users/pluzzardi/.gbas /Users/pluzzardi/.local /Users/pluzzardi/.netbeans-derby /Users/pluzzardi/.ssh /Users/pluzzardi/.Trash /Users/pluzzardi/.viminfo /Users/pluzzardi/Desktop /Users/pluzzardi/Documents /Users/pluzzardi/Downloads /Users/pluzzardi/Dropbox /Users/pluzzardi/frutas.luz /Users/pluzzardi/Frutas.txt /Users/pluzzardi/Leitura.zip /Users/pluzzardi/Library /Users/pluzzardi/luzzardi.dat /Users/pluzzardi/Luzzardi.txt /Users/pluzzardi/Movies 157
158 /Users/pluzzardi/Music /Users/pluzzardi/NetBeansProjects /Users/pluzzardi/nomes.sort /Users/pluzzardi/nomes.txt /Users/pluzzardi/palavras.dat /Users/pluzzardi/pessoa.dat /Users/pluzzardi/pessoas.dat /Users/pluzzardi/Pictures /Users/pluzzardi/Projects /Users/pluzzardi/Public 8.4 Manipulação de um arquivo de palavras A seguir são mostrados alguns programas exemplos que manipulam um arquivo contendo palavras (palavras.dat). Veja o formato no exemplo abaixo: 5 carambola beringela abacate ervilha damasco Programa exemplo: Permite criar um arquivo de palavras (palavras.dat) permitindo a gravação destas palavras no arquivo. // Programa Principal: ProgCriaPalavras.java package progcriapalavras; import java.io.file; import java.io.filewriter; import java.util.scanner; public class ProgCriaPalavras { public static void main(string[] args) throws Exception { Scanner entrada = new Scanner(System.in); String diretorio = "/Users/pluzzardi"; File arquivo = new File(diretorio, "palavras.dat"); if (!arquivo.exists()) { // proteção para não apagar o arquivo já criado try (FileWriter file = new FileWriter(arquivo)) { System.out.print("Número de Palavras: "); String s = entrada.nextline(); int numpalavras = Integer.parseInt(s); file.write((byte)numpalavras); file.write('\n'); for (int i = 1;i <= numpalavras;i++) { System.out.print("Palavra: "); byte a = (byte) System.in.read(); while(a!= '\n') { file.write(a); a = (byte) System.in.read(); 158
159 file.write('\n'); file.close(); else { System.out.println("ERRO: Arquivo já existe"); Exemplo de gravação no arquivo palavras.dat : Número de palavras: 5 <enter> Palavra: carambola <enter> Palavra: beringela <enter> Palavra: abacate <enter> Palavra: ervilha <enter> Palavra: damasco <enter> Arquivo gerado: palavras.dat 5 carambola beringela abacate ervilha damasco Observação: Se o programa for executado novamente, dará a seguinte mensagem: ERRO: Arquivo já existe, isto protege o arquivo criado anteriormente Programa exemplo: Permite abrir o arquivo de palavras (palavras.dat) e exibe-os na tela. // Programa Principal: ProgCarregaPalavras.java package progcarregapalavras; import java.io.file; import java.io.filereader; public class ProgCarregaPalavras { public static void main(string[] args) throws Exception { String diretorio = "/Users/pluzzardi"; File arquivo = new File(diretorio, "palavras.dat"); byte a; if (arquivo.exists()) { try (FileReader file = new FileReader(arquivo)) { int numpalavras = file.read(); file.read(); for (int i = 1;i <= numpalavras;i++) { System.out.print("Palavra: "); 159
160 a = (byte) file.read(); while(a!= '\n') { System.out.printf("%c", a); a = (byte) file.read(); System.out.println(); file.close(); else { System.out.println("ERRO: Arquivo não existe"); Resultado do Programa: Palavra: carambola Palavra: beringela Palavra: abacate Palavra: ervilha Palavra: damasco Programa exemplo: Permite consultar o arquivo de palavras (palavras.dat). Para tanto é solicitado, ao usuário, o número do registro para ser calculado a posição deste registro no arquivo. Logo após o registro é exibido na tela. // Programa Principal: ProgCarregaPalavrasUsuario.java package progcarregapalavrasusuario; import java.io.*; import java.util.*; public class ProgCarregaPalavrasUsuario { public static void main(string[] args) throws Exception { Scanner entrada = new Scanner(System.in); String s; String diretorio = "/Users/pluzzardi"; File arquivo = new File(diretorio, "palavras.dat"); FileInputStream in = new FileInputStream(arquivo); InputStreamReader conversor = new InputStreamReader(in); BufferedReader buffer = new BufferedReader(conversor); FileReader file = new FileReader(arquivo); if (arquivo.exists()) { System.out.println("Arquivo: " + arquivo); int numpalavras = file.read(); String temp = buffer.readline(); // descarta a primeira linha System.out.println("Total de Palavras: " + numpalavras); String [] linha = new String[numPalavras + 1]; for (int i = 0;i < numpalavras;i++) { linha[i] = buffer.readline(); 160
161 buffer.close(); in.close(); file.close(); int pos; do { System.out.print("Posição [1.." + numpalavras + "] ou [0] Sair: "); s = entrada.nextline(); pos = Integer.parseInt(s); if (pos >= 1 && pos <= numpalavras) { System.out.println("Palavra: " + linha[pos - 1]); else { if (pos!= 0) { System.out.println("ERRO: Posição Inválida"); while (pos!= 0); else { System.out.println("ERRO: Arquivo não existe"); Resultado do Programa: Arquivo: /Users/pluzzardi/palavras.dat Total de Palavras: 5 Posição [1..5] ou [0] Sair: 1 <enter> Palavra: carambola Posição [1..5] ou [0] Sair: 2 <enter> Palavra: beringela Posição [1..5] ou [0] Sair: 3 <enter> Palavra: abacate Posição [1..5] ou [0] Sair: 4 <enter> Palavra: ervilha Posição [1..5] ou [0] Sair: 5 <enter> Palavra: damasco Posição [1..5] ou [0] Sair: 6 <enter> ERRO: Posição Inválida Posição [1..5] ou [0] Sair: 0 <enter> 8.5 Arquivo Texto A seguir é mostrado um programa que lê um arquivo texto contendo: a) Total de Palavras; b) Lista de Palavras (nome de frutas). 161
162 Arquito Texto: Frutas.txt 15 abacaxi abacate banana pitanga goiaba morango carambola kiwi laranja bergamota tomate uva caqui lima jaca // Programa Principal: ProgLeitura.java package progleitura; import java.io.*; public class ProgLeitura { int linhas = 0; int max = 0; String palavras [], linha; String nomearquivo = "/Users/pluzzardi/Frutas.txt"; try { FileReader arqtexto = new FileReader(nomeArquivo); BufferedReader leitor = new BufferedReader(arqTexto); max = Integer.parseInt(leitor.readLine()); palavras = new String[max]; System.out.println("Total de palavras: " + max); int i = 0; while ((linha = leitor.readline())!= null) { palavras[i] = linha; System.out.println("Palavra: " + palavras[i]); linhas++; i++; int n = (int) (Math.random() * max); System.out.println("Palavra Sorteada: " + palavras[n]); catch(ioexception e){ System.out.println("Erro: Problema com o Arquivo "); Resultado do Programa: Total de palavras:
163 Palavra: abacaxi Palavra: abacate Palavra: banana Palavra: pitanga Palavra: goiaba Palavra: morango Palavra: carambola Palavra: kiwi Palavra: laranja Palavra: bergamota Palavra: tomate Palavra: uva Palavra: caqui Palavra: lima Palavra: jaca Palavra Sorteada: carambola A seguir é mostrado um outro programa que lê um arquivo texto exibindo: (a) número de linhas e (b) número de bytes. // Programa Principal: ProgBytes.java package progbytes; import java.io.*; import java.util.scanner; public class ProgBytes { int linhas = 0; long bytes = 0; String buffer; Scanner input = new Scanner(System.in); String nomearquivo; System.out.print("Nome do Arquivo: "); nomearquivo = input.nextline(); try { FileReader arqtexto = new FileReader(nomeArquivo); BufferedReader leitor = new BufferedReader(arqTexto); int i = 0; while ((buffer = leitor.readline())!= null) { bytes = bytes + buffer.length(); linhas++; i++; System.out.println(linhas + " Linha(s)"); System.out.println(bytes + " Byte(s)"); catch(ioexception e){ System.out.println("Erro: Problema com o Arquivo"); 163
164 Resultado do Programa: Nome do Arquivo: /Users/pluzzardi/NetBeansProjects/Bytes/src/bytes/bytes.java <enter> 37 Linha(s) 987 Byte(s) A seguir é mostrado um outro programa que lê um arquivo texto exibindo: a) Todas as linhas do arquivo texto com seu respectivo número; b) Número de Linhas; c) Número de Bytes. // Programa Principal: ProgListar.java package proglistar; import java.io.*; import java.util.scanner; public class ProgListar { int linhas = 0; long bytes = 0; String buffer; Scanner input = new Scanner(System.in); String nomearquivo; System.out.print("Nome do Arquivo: "); nomearquivo = input.nextline(); try { FileReader arqtexto = new FileReader(nomeArquivo); BufferedReader leitor = new BufferedReader(arqTexto); int i = 0; while ((buffer = leitor.readline())!= null) { bytes = bytes + buffer.length(); linhas++; System.out.printf("%2d: %s\n", linhas, buffer); i++; System.out.println(linhas + " Linha(s)"); System.out.println(bytes + " Byte(s)"); catch(ioexception e){ System.out.println("Erro: Problema com o Arquivo"); Resultado do Programa: Nome do Arquivo: /Users/pluzzardi/Frutas.txt <enter> 1: 15 2: abacaxi 164
165 3: abacate 4: banana 5: pitanga 6: goiaba 7: morango 8: carambola 9: kiwi 10: laranja 11: bergamota 12: tomate 13: uva 14: caqui 15: lima 16: jaca 16 Linha(s) 93 Byte(s) A seguir é mostrado um outro programa que lê um arquivo texto e o número de uma linha e exibe a linha especificada: // Programa Principal: ProgLinha.java package proglinha; import java.io.*; import java.util.scanner; public class ProgLinha { int linha = 0, numlinha; String s, buffer; Scanner input = new Scanner(System.in); String nomearquivo; boolean listou = false; System.out.print("Nome do Arquivo: "); nomearquivo = input.nextline(); try { FileReader arqtexto = new FileReader(nomeArquivo); BufferedReader leitor = new BufferedReader(arqTexto); System.out.print("Número da Linha: "); s = input.nextline(); numlinha = Integer.parseInt(s); int i = 0; while ((buffer = leitor.readline())!= null) { linha++; if (linha == numlinha) { System.out.printf("%2d: %s\n", linha, buffer); listou = true; i++; catch(ioexception e){ System.out.println("Erro: Problema com o Arquivo"); if (!listou) { 165
166 System.out.println("ERRO: Linha não Encontrada"); Resultado do Programa: Nome do Arquivo: /Users/pluzzardi/Frutas.txt <enter> Número da Linha: 5 <enter> 5: pitanga O seguinte programa mostra como gravar três informações em um arquivo texto (Pessoa.dat): nome, idade e sexo de diversas pessoas. // Programa Principal: ProgWriteDados.java package progwritedados; import java.io.file; import java.io.filewriter; import java.util.scanner; public class ProgWriteDados { public static void main(string[] args) throws Exception { Scanner entrada = new Scanner(System.in); String s; String diretorio = "/Users/pluzzardi/"; File arquivo = new File(diretorio, "Pessoa.dat"); if (!arquivo.exists()) { try (FileWriter file = new FileWriter(arquivo)) { do { System.out.print("Nome: "); String nome = entrada.nextline(); file.write(nome); file.write(":"); System.out.print("Idade: "); String idade = entrada.nextline(); file.write(idade); file.write(":"); System.out.print("Sexo [M/F]: "); s = entrada.nextline(); char sexo = s.charat(0); file.write(sexo); file.write(":"); System.out.print("Continua [S/N]? "); do { s = entrada.nextline(); while (!"SsNn".contains(s)); while ("S".equalsIgnoreCase(s)); file.close(); else { System.out.println("ERRO: Arquivo já existe"); 166
167 Exemplo para testar o programa: Nome: Paulo Roberto <enter> Idade: 51 <enter> Sexo [M/F]: m <enter> Continua [S/N]? s <enter> Nome: Renato Luis <enter> Idade: 49 <enter> Sexo [M/F]: m <enter> Continua [S/N]? s <enter> Nome: Francisco Carlos <enter> Idade: 53 <enter> Sexo [M/F]: m <enter> Continua [S/N]? n <enter> O seguinte programa mostra como recarregar as três informações gravadas em um arquivo texto acima (Pessoa.dat). // Programa Principal: ProgReadDados.java package progreaddados; import java.io.file; import java.io.filereader; import java.io.bufferedreader; import java.io.fileinputstream; import java.io.inputstreamreader; import java.util.scanner; public class ProgReadDados { public static void main(string[] args) throws Exception { Scanner entrada = new Scanner(System.in); String diretorio = "/Users/pluzzardi/"; File arquivo = new File(diretorio, "Pessoa.dat"); FileInputStream in = new FileInputStream(arquivo); InputStreamReader conversor = new InputStreamReader(in); BufferedReader buffer = new BufferedReader(conversor); if (arquivo.exists()) { try (FileReader file = new FileReader(arquivo)) { String linha = buffer.readline(); // lê todos os dados System.out.println("Linha: " + linha); String[] partes = linha.split(":"); int n = partes.length; System.out.println("Partes: " + n); for (int i = 0; i < n; i = i + 3) { System.out.println("Nome: " + partes[i]); System.out.println("Idade: " + Integer.parseInt(partes[i + 1])); System.out.println("Sexo: " + partes[i + 2]); buffer.close(); else { System.out.println("ERRO: Arquivo já existe"); 167
168 Resultado do Programa: Linha: Paulo Roberto:52:m:Rento Luis:49:m:Francisco Carlos:54:m: Partes: 9 Nome: Paulo Roberto Idade: 52 Sexo: m Nome: Rento Luis Idade: 49 Sexo: m Nome: Francisco Carlos Idade: 54 Sexo: m O programa a seguir mostra como anexar (append) mais informações ao arquivo texto (Pessoa.dat) já existente, sem sobre-escrevê-lo. // Programa Principal: ProgAppendDados.java package progappenddados; import java.io.file; import java.io.ioexception; import java.io.*; import java.util.scanner; public class ProgAppendDados { public static void main(string[] args) throws IOException { Scanner entrada = new Scanner(System.in); String s; String diretorio = "/Users/pluzzardi/"; File arquivo = new File(diretorio, "Pessoa.dat"); if (arquivo.exists()) { try (FileWriter file = new FileWriter(arquivo, true)) { // true indica append, ou seja, anexar no fim do arquivo do { // o arquivo não é sobre-escrito, ou seja, ele não é apagado. Os dados antigos System.out.print("Nome: "); // são mantidos e os novos anexados ao fim do arquivo String nome = entrada.nextline(); file.write(nome); file.write(":"); System.out.print("Idade: "); String idade = entrada.nextline(); file.write(idade); file.write(":"); System.out.print("Sexo [M/F]: "); s = entrada.nextline(); char sexo = s.charat(0); file.write(sexo); file.write(":"); System.out.print("Continua [S/N]? "); do { s = entrada.nextline(); while (!"SsNn".contains(s)); while ("S".equalsIgnoreCase(s)); else { System.out.println("ERRO: Arquivo não existe"); 168
169 Exemplo para testar o programa: Nome: Ana Maria <enter> Idade: 56 <enter> Sexo [M/F]: f <enter> Continua [S/N]? s <enter> Nome: Julia Helena <enter> Idade: 55 <enter> Sexo [M/F]: f <enter> Continua [S/N]? n <enter> Resultado do Programa: (ProgReadDados) Linha: Paulo Roberto:52:m:Rento Luis:49:m:Francisco Carlos:54:m:Ana Maria:56:f:Julia Helena:55:f Partes: 15 Nome: Paulo Roberto Idade: 52 Sexo: m Nome: Rento Luis Idade: 49 Sexo: m Nome: Francisco Carlos Idade: 54 Sexo: m Nome: Ana Maria Idade: 56 Sexo: f Nome: Julia Helena Idade: 55 Sexo: f 8.6 Lista de exercícios: Arquivos (Files) Escreva um programa em Java que recebe via teclado o nome de um arquivo texto. O programa deve imprimir na tela o número de bytes (caracteres) e o número de linhas do arquivo ou ERRO: Arquivo não existe. Entrada: Saída: Nome do arquivo texto: lista.java <enter> (12345) Bytes (44) Linhas ou ERRO: Arquivo não existe Escreva um programa em Java que recebe via teclado o nome de um arquivo texto. O programa deve permitir ao usuário consultar o arquivo através da entrada via teclado do número da linha. O programa deve imprimir a linha especificada ou ERRO: Linha não existe (zero para abandonar). 169
170 Exemplo para testar o programa: Nome do arquivo texto: lista.java <enter> Número de linha: 7 <enter> 7: int i, j, k; Número de linha: 70 <enter> ERRO: Linha não existe Número de linha: 0 <enter> // saída do programa ERRO: Arquivo não existe Escreva um programa em Java que recebe via teclado o nome de dois arquivos texto (origem e destino). O programa deve copiar o conteúdo do arquivo origem para o arquivo destino. Entrada: Saída: Arquivo origem: lista.java <enter> Arquivo destino: lista.tmp <enter> (20345) Bytes copiados Escreva um programa em Java que recebe via teclado o nome do arquivo texto fonte e o nome do arquivo texto destino. O programa deve converter o arquivo para maiúsculo ou minúsculo (conforme escolha do usuário) gerando o arquivo texto destino. Entrada: Saída: Arquivo fonte: lista.java <enter> Arquivo destino: lista.tmp <enter> [+] Maiúsculo ou [-] Minúsculo: + <enter> (1234) Bytes convertidos Escreva um programa em Java que recebe via teclado o nome de um arquivo texto e uma palavra. O programa deve imprimir todas as linhas que possuem esta palavra. Entrada: Nome do arquivo texto: palavra.java <enter> Palavra: if <enter> Saída: 23: if (a == b) { 33: if (ch == '\n') { 37: if (compara(linha,palavra)) { 41: if (ch!= '\n') { 59: if (linha[i] == palavra[0]) { 65: if (linha[k]!= palavra[j]) { 69: if (achei) { ou Erro: Palavra não existe Escreva um programa em Java que recebe via teclado o nome de um arquivo texto. O programa deve permitir ao usuário consultar o arquivo através da entrada via teclado do número inicial e número final. O programa deve imprimir desde a linha inicial até a linha final ou ERRO: Linhas não existem. Entrada: Nome do arquivo texto: lista.java <enter> Número inicial: 7 <enter> Número final: 9 <enter> Saída: 7: int i, j, k; 170
171 8: char tecla; 9: long bytes = 0; ou Entrada: Saída: Número inicial: 70 <enter> Número final: 90 <enter> ERRO: Linhas não existem Escreva um programa em Java (grava.java) que recebe via teclado o nome de um arquivo texto. O programa deve permitir ao usuário inserir nomes neste arquivo via teclado. O programa termina quando o usuário digitar <enter> na entrada do nome. Exemplo para testar o programa: Nome do arquivo texto: nomes.txt <enter> Nome: Beatriz <enter> Nome: Eva <enter> Nome: Debora <enter> Nome: Carla <enter> Nome: Fatima <enter> Nome: Ana <enter> Nome: <enter> Escreva um programa em Java (ler.java) que recebe via teclado o nome de um arquivo texto. O programa deve ler e imprimir na tela todos os nomes armazenados no arquivo pelo programa "grava.java". Entrada: Saída: Nome do arquivo texto: nomes.txt <enter> Nome: Beatriz Nome: Eva Nome: Debora Nome: Carla Nome: Fatima Nome: Ana Escreva um programa em Java (sort.java) que recebe via teclado o nome de um arquivo texto origem e um destino. O programa deve ler, ordenar e gravar novamente os nomes no arquivo destino. Exemplo para testar o programa: Nome do arquivo texto origem: nomes.txt <enter> Nome do arquivo texto destino: nomes.srt <enter> Ok, arquivo ordenado e copiado Observação: Utilize o programa anterior (ler.java) para ver os nomes ordenados Escreva um programa em Java que recebe via teclado o nome de um arquivo texto. O programa deve permitir ao usuário inserir nome, idade e sexo ([M]asculino ou [F]eminino) neste arquivo via teclado. O programa termina quando o usuário digitar <enter> na entrada do nome. 171
172 Exemplo para testar o programa: Nome do arquivo texto: dados.txt <enter> Nome: Paulo Roberto <enter> Idade: 41 <enter> Sexo [M/F]: m <enter> Nome: Renato Luis <enter> Idade: 38 <enter> Sexo [M/F]: m <enter> Nome: Ana Maria <enter> Idade: 44 <enter> Sexo [M/F]: f <enter> Nome: <enter> Escreva um programa em Java que recebe via teclado o nome de um arquivo texto. O programa deve ler e imprimir na tela todos os dados (nome, idade e sexo) armazenados no arquivo pelo programa "8.6.10" (veja exemplo abaixo). Entrada: Saída: Nome do arquivo texto: dados.txt <enter> Nome: Paulo Roberto Idade: 41 Sexo: MASCULINO Nome: Renato Luis Idade: 38 Sexo: MASCULINO Nome: Ana Maria Idade: 44 Sexo: FEMININO Escreva um programa em Java que recebe via teclado o nome de um arquivo texto. O programa deve verificar a quantidade de homens e a quantidade de mulheres no aquivo criado pelo programa " ". Entrada: Saída: Nome do arquivo texto: dados.txt <enter> (2) Homens (1) Mulheres 8.7 Acesso randômico em arquivos texto É possível acessar um arquivo texto de forma randômica (aleatória), ou seja, não puramente sequencial como é o padrão. Desta forma, pode-se acessar qualquer linha de um arquivo texto. // Programa Principal: ProgRadomTexto.java package prograndomtexto; import java.io.randomaccessfile; import java.io.ioexception; import java.util.scanner; 172
173 public class ProgRandomTexto { Scanner input = new Scanner(System.in); String linha; System.out.print("Nome do Arquivo Texto: "); String nomearquivo = input.nextline(); try { int nl; RandomAccessFile file = new RandomAccessFile(nomeArquivo, "r"); do { boolean encontroulinha = false; System.out.print("Linha: "); String s = input.nextline(); nl = Integer.parseInt(s); int linhas = 0; while ((linha = file.readline())!= null) { linhas++; if (nl == linhas) { System.out.println(nl + ": " + linha); encontroulinha = true; if (!encontroulinha) { System.out.println("ERRO: Linha não existe"); file.seek(0); // volta para a primeira linha while (nl!= 0); file.close(); catch (IOException e) { System.out.println("Erro: Problema com o Arquivo"); Exemplo para testar o programa: Nome do Arquivo Texto: /Users/pluzzardi/Frutas.txt <enter> Linha: 3 <enter> 3: abacate Linha: 5 <enter> 5: pitanga Linha: 99 <enter> ERRO: Linha não existe Linha: 0 <enter> ERRO: Linha não existe 8.8 Arquivo binário de objetos em Java Em Java é possível gravar e carregar dados em arquivos binários que nada mais são que são filas de bytes. Abaixo são vistos dois programas: (a) BinaryWrite grava dados (nome idade 173
174 e sexo) que são armazenados em um ArrayList e (b) programa BinaryRead recupera os dados (como uma lista de dados) gravados no arquivo binário gerado pelo programa BinaryWrite. // Programa Principal: ProgBinaryWrite.java package progbinarywrite; import java.io.file; import java.io.objectoutputstream; import java.io.fileoutputstream; import java.io.ioexception; import java.util.arraylist; import java.util.scanner; public class ProgBinaryWrite { public static void main(string[] args) throws IOException { Scanner input = new Scanner(System.in); String s; ArrayList pessoa = new ArrayList(); System.out.print("Nome do Arquivo Binário: "); String nomearquivo = input.nextline(); try { File file = new File(nomeArquivo); try (ObjectOutputStream output = new ObjectOutputStream(new FileOutputStream(file))) { do { System.out.print("Nome: "); String nome = input.nextline(); System.out.print("Idade: "); s = input.nextline(); int idade = Integer.parseInt(s); System.out.print("Sexo [M/F]: "); s = input.nextline(); char sexo = s.charat(0); pessoa.add(nome); pessoa.add(idade); pessoa.add(sexo); do { System.out.print("Continua [S/N]? "); s = input.nextline(); while (!"SsNn".contains(s)); while (!"Nn".contains(s)); output.writeobject(pessoa); // grava ArrayList catch (IOException NumberFormatException e) { System.out.println(e.toString()); Exemplo para testar o programa: Nome do Arquivo Binário: /Users/pluzzardi/pessoa.dat <enter> Nome: Paulo <enter> Idade: 51 <enter> 174
175 Sexo [M/F]: m <enter> Continua [S/N]? s <enter> Nome: Renato <enter> Idade: 49 <enter> Sexo [M/F]: M <enter> Continua [S/N]? s <enter> Nome: Francisco <enter> Idade: 53 <enter> Sexo [M/F]: m <enter> Continua [S/N]? s <enter> Nome: Ana <enter> Idade: 55 <enter> Sexo [M/F]: f <enter> Continua [S/N]? s <enter> Nome: Julia <enter> Idade: 54 <enter> Sexo [M/F]: F <enter> Continua [S/N]? N <enter> // Programa Principal: ProgBinaryRead.java package progbinaryread; import java.io.file; import java.io.fileinputstream; import java.io.ioexception; import java.io.objectinputstream; import java.util.scanner; public class ProgBinaryRead { Scanner entrada = new Scanner(System.in); System.out.print("Nome do Arquivo Binário: "); String nomearquivo = entrada.nextline(); try { File file = new File(nomeArquivo); ObjectInputStream input = new ObjectInputStream(new FileInputStream(file)); Object pessoa = input.readobject(); System.out.println(pessoa.toString()); catch (IOException ClassNotFoundException e) { System.out.println(e.toString()); Entrada: Nome do Arquivo Binário: /Users/pluzzardi/pessoa.dat <enter> Saída: [Paulo, 51, m, Renato, 49, M, Francisco, 53, m, Ana, 55, f, Julia, 54, F] 8.9 Leitura e gravação de objetos (registro) em Arquivos Em Java é possível ler e gravar dados organizados em registros. Um registro é um conjuntos de campos, onde campos são qualquer tipo em Java. 175
176 public class Registro { Object nome; Object idade; Object sexo; nome idade sexo Gravação de objetos em um arquivo binário de objetos O programa abaixo permite gravar em um arquivo binário de objetos as seguintes informações: nome, idade e sexo. file.addfile("paulo Roberto", 50, 'm'); file.addfile("adriane Maria", 42, 'f'); file.addfile("paola", 13, 'f'); // Classe: Registro.java package progwritefileregistro; public class Registro { Object nome; Object idade; Object sexo; Registro(String nome, int idade, char sexo) { this.nome = nome; this.idade = idade; this.sexo = sexo; // Programa Principal: FileObjeto.java package progwritefileregistro; import java.io.fileoutputstream; import java.io.ioexception; import java.io.objectoutputstream; public class FileObjeto { // atributos da classe String nomefile; private ObjectOutputStream fileout; FileObjeto(String nomearquivo) { nomefile = nomearquivo; try { fileout = new ObjectOutputStream(new FileOutputStream(nomeFile)); System.out.println("Ok, Arquivo criado: " + nomefile); catch (IOException ioexception) { System.out.println("ERRO Fatal: Problema na criação do Arquivo: " + nomefile); 176
177 // addfile public void addfile(string nome, int idade, char sexo) throws IOException, ClassNotFoundException { Registro registro = new Registro(nome, idade, sexo); fileout.writeobject(registro.nome); fileout.writeobject(registro.idade); fileout.writeobject(registro.sexo); // closefile public void closefile() { try { if (fileout!= null) { fileout.close(); System.out.println("Ok, Arquivo fechado: " + nomefile); catch (IOException ioexception) { System.out.println("ERRO Fatal: Impossível fechar o arquivo: " + nomefile); System.exit(1); // Programa Principal: ProgWriteFileRegistro.java package progwritefileregistro; import java.io.ioexception; import java.util.scanner; public class ProgWriteFileRegistro { public static void main(string[] args) throws IOException, ClassNotFoundException { Scanner input = new Scanner(System.in); System.out.print("Nome do Arquivo Binário: "); String nomearquivo = input.nextline(); FileObjeto file = new FileObjeto(nomeArquivo); file.addfile("paulo Roberto", 50, 'm'); file.addfile("adriane Maria", 42, 'f'); file.addfile("paola", 13, 'f'); file.closefile(); Entrada: Nome do Arquivo Binário: /Users/pluzzardi/Objeto.dat <enter> Saída: Ok, Arquivo criado: /Users/pluzzardi/Objeto.dat Ok, Arquivo fechado: /Users/pluzzardi/Objeto.dat Observação: Por questões didáticas, simplificação, não foi testado se o arquivo binário existe, ou seja, se ele existir, será sobre-escrito. 177
178 Solução 2: Nesta solução o usuário digita os nomes, idades e sexo das pessoas. // Classe: Registro.java package progwritefileregistro2; public class Registro { Object nome; Object idade; Object sexo; Registro(String nome, int idade, char sexo) { this.nome = nome; this.idade = idade; this.sexo = sexo; // Programa Principal: FileObjeto.java package progwritefileregistro2; import java.io.fileoutputstream; import java.io.ioexception; import java.io.objectoutputstream; public class FileObjeto { // atributos da classe String nomefile; private ObjectOutputStream fileout; FileObjeto(String nomearquivo) { nomefile = nomearquivo; try { fileout = new ObjectOutputStream(new FileOutputStream(nomeFile)); System.out.println("Ok, Arquivo criado: " + nomefile); catch (IOException ioexception) { System.out.println("ERRO Fatal: Problema na criação do Arquivo: " + nomefile); // addfile public void addfile(registro registro) throws IOException, ClassNotFoundException { fileout.writeobject(registro.nome); fileout.writeobject(registro.idade); fileout.writeobject(registro.sexo); // closefile public void closefile() { try { if (fileout!= null) { fileout.close(); System.out.println("Ok, Arquivo fechado: " + nomefile); catch (IOException ioexception) { 178
179 System.out.println("ERRO Fatal: Impossível fechar o arquivo: " + nomefile); System.exit(1); // Programa Principal: ProgWriteFileRegistro2.java package progwritefileregistro2; import java.io.ioexception; import java.util.scanner; public class ProgWriteFileRegistro2 { public static void main(string[] args) throws IOException, ClassNotFoundException { Scanner input = new Scanner(System.in); char ch; System.out.print("Nome do Arquivo: "); String nomearquivo = input.nextline(); FileObjeto file = new FileObjeto(nomeArquivo); do { System.out.print("Nome: "); String nome = input.nextline(); System.out.print("Idade: "); String s = input.nextline(); int idade = Integer.parseInt(s); System.out.print("sexo [M]asculino ou [F]eminino: "); s = input.nextline(); char sexo = s.charat(0); Registro registro = new Registro(nome, idade, sexo); file.addfile(registro); System.out.print("Continua [S/N]? "); do { s = input.nextline(); ch = s.charat(0); while (!strchr("ssnn", ch)); while (strchr("ss", ch)); file.closefile(); // strchr static boolean strchr(string s, char ch) { int n = s.length(); for (int i = 0;i < n;i++) { if (s.charat(i) == ch) { return(true); return(false); Exemplo para testar o programa: Nome do Arquivo: /Users/pluzzardi/luz.dat <enter> Ok, Arquivo criado: /Users/pluzzardi/luz.dat 179
180 Nome: Paulo Roberto <enter> Idade: 51 <enter> sexo [M]asculino ou [F]eminino: m <enter> Continua [S/N]? s <enter> Nome: Renato Luis <enter> Idade: 49 <enter> sexo [M]asculino ou [F]eminino: m <enter> Continua [S/N]? s <enter> Nome: Francisco Carlos <enter> Idade: 53 <enter> sexo [M]asculino ou [F]eminino: m <enter> Continua [S/N]? n <enter> Ok, Arquivo fechado: /Users/pluzzardi/luz.dat Leitura objetos em um arquivo binário de objetos O programa abaixo permite carregar (ler) de um arquivo binário de objetos com as seguintes informações: nome, idade e sexo. // Classe: Registro.java package progreadfileregistro; public class Registro { Object nome; Object idade; Object sexo; // Programa Principal: FileObjeto.java package progreadfileregistro; import java.io.fileinputstream; import java.io.ioexception; import java.io.objectinputstream; import java.io.eofexception; public class FileObjeto { // atributos da classe String nomefile; private ObjectInputStream filein; // construtor FileObjeto(String nomearquivo) { nomefile = nomearquivo; try { filein = new ObjectInputStream(new FileInputStream(nomeFile)); System.out.println("Ok, Arquivo Aberto: " + nomefile); catch (IOException ioexception) { System.out.println("ERRO Fatal: Problema na Abertura do Arquivo: " + nomefile); System.exit(1); // getfile public void getfile() throws IOException, ClassNotFoundException { 180
181 Registro registro = new Registro(); System.out.println("Nome Idade Sexo"); try { while (true) { registro.nome = filein.readobject(); registro.idade = filein.readobject(); registro.sexo = filein.readobject(); System.out.printf("%-20s %2d %c\n", registro.nome, registro.idade, registro.sexo); catch (EOFException endoffileexception) { // closefile public void closefile() { try { if (filein!= null) { filein.close(); System.out.println("Ok, Arquivo fechado: " + nomefile); catch (IOException ioexception) { System.out.println("ERRO Fatal: Impossível fechar o arquivo: " + nomefile); System.exit(1); // Programa Principal: ProgReadFileRegistro.java package progreadfileregistro; import java.io.ioexception; import java.util.scanner; public class ProgReadFileRegistro { public static void main(string[] args) throws IOException, ClassNotFoundException { Scanner input = new Scanner(System.in); System.out.print("Nome do Arquivo Binário: "); String nomearquivo = input.nextline(); FileObjeto file = new FileObjeto(nomeArquivo); file.getfile(); file.closefile(); Entrada: Saída: Nome do Arquivo Binário: /Users/pluzzardi/Objeto.dat <enter> Ok, Arquivo Aberto: /Users/pluzzardi/Objeto.dat Nome Idade Sexo Paulo Roberto 50 m Adriane Maria 42 f Paola 13 f Ok, Arquivo fechado: /Users/pluzzardi/Objeto.dat ou 181
182 Entrada: Saída: Nome do Arquivo: /Users/pluzzardi/luz.dat <enter> Ok, Arquivo Aberto: /Users/pluzzardi/luz.dat Nome Idade Sexo Paulo Roberto 51 m Renato Luis 49 m Francisco Carlos 53 m Ok, Arquivo fechado: /Users/pluzzardi/luz.dat 182
183 9. Noções de desenvolvimento de aplicações em camadas (MVC) 9.1 Conceitos Model View Controller (MVC Modelo Visão Controlador) é um modelo de arquitetura de programa que divide a representação da informação e da interação. O model (modelo) contém os dados da aplicação, as regras de negócios, a lógica e os métodos. Uma view (visão) pode ser qualquer saída ou impressão da representação dos dados. Pode-se possuir várias visões da mesma informação. O controller (controlador) faz a mediação da entrada, convertendo-a em comandos para o modelo ou visão. As vantagens do MVC são resusabilidade de código e separação de conceitos. Resumindo, as partes presentes no MVC tem as seguintes funções: Controller enxerga a view e reconhece o model. Recebe requisições do usuário da view e envia para o model executar as requisições. Model recebe as requisições e as executa, atualizando os dados da aplicação. View analisa o model e espera os dados serem atualiza-dos, mostrando os dados atualizados. Vantagens do modelo Model View Controller: 1. É fácil manter, testar e atualizar. 2. É simples incluir novos dados, apenas pela inclusão de seus visualizadores e controles. 3. Torna a aplicação escalável. 4. Desenvolvimento paralelo do model, view e controller por serem independentes. Desvantagens do modelo Model View Controller: 1. Necessita quantidade maior de tempo para analisar e modelar o sistema. 2. Necessita pessoas especializadas. 3. Não recomendável para aplicações pequenas. 183
184 9.2 Primeiro exemplo da utilização do MVC (ProgMVCPessoa) A seguir é visto e descrito a utilização do MVC em Java (Figura 12). O programa ProgMVCPessoa trabalha com as seguintes informações de uma pessoa (nome, idade e sexo). Figura 12: Exemplo de MVC // Pacote: entity // Classe: Pessoa.java package entity; public final class Pessoa { // atributos da classe private String nome; private int idade; 184
185 private char sexo; // construtores da classe public Pessoa() { setnome("xxxxxxxxxx"); setidade(-99); setsexo('x'); public Pessoa(String nome, int idade, char sexo) { setnome(nome); setidade(idade); setsexo(sexo); // métodos públicos da classe public void setnome(string nome) { this.nome = nome; public void setidade(int idade) { this.idade = idade >= 0 && idade <= 110? idade : -99; public void setsexo(char sexo) { if (strchr("mmff", sexo)) { this.sexo = sexo; else { this.sexo = 'x'; public String getnome() { return (nome); public int getidade() { return (idade); public char getsexo() { return (sexo); // métodos estáticos da classe static boolean strchr(string s, char ch) { int n = s.length(); for (int i = 0; i < n; i++) { if (s.charat(i) == ch) { return (true); return (false); 185
186 // Pacote: pessoaview // Classe: PessoaView.java package pessoaview; import entity.pessoa; import service.pessoaservice; public final class PessoaView { // atributos da classe PessoaService pessoaservice; // construtor da classe PessoaView() { pessoaservice = new PessoaService("Paulo Roberto", 152, 't'); exibeview(pessoaservice); PessoaService pessoaservice = new PessoaService(); pessoaservice.alterapessoa("renato Luis", 49, 'm'); exibeview(pessoaservice); // métodos públicos da classe public void exibeview(pessoa pessoa) { System.out.println("Nome: " + pessoa.getnome()); if (pessoa.getidade()!= -99) { System.out.println("Idade: " + pessoa.getidade()); else { System.out.println("ERRO: Idade Inválida"); if (pessoa.getsexo()!= 'x') { System.out.println("Sexo: " + pessoa.getsexo()); else { System.out.println("ERRO: Sexo Inválido"); public void exibeview(pessoaservice pessoa) { System.out.println("Nome: " + pessoa.getpessoa().getnome()); if (pessoa.getpessoa().getidade()!= -99) { System.out.println("Idade: " + pessoa.getpessoa().getidade()); else { System.out.println("ERRO: Idade Inválida"); if (pessoa.getpessoa().getsexo()!= 'x') { System.out.println("Sexo: " + pessoa.getpessoa().getsexo()); else { System.out.println("ERRO: Sexo Inválido"); // Programa Principal: Principal.java package pessoaview; public class Principal { 186
187 new PessoaView(); // Pacote: service // Classe: PessoaService.java package service; import entity.pessoa; public class PessoaService { // atributos da classe private Pessoa pessoa; // construtor da classe public PessoaService() { pessoa = new Pessoa(); public PessoaService(String nome, int idade, char sexo) { pessoa = new Pessoa(); alterapessoa(nome, idade, sexo); // métodos públicos da classe public void alterapessoa(string nome, int idade, char sexo) { pessoa.setnome(nome); pessoa.setidade(idade); pessoa.setsexo(sexo); public Pessoa getpessoa() { return(pessoa); Resultado do Programa: Nome: Paulo Roberto ERRO: Idade Inválida ERRO: Sexo Inválido Nome: Renato Luis Idade: 49 Sexo: m 9.3 Segundo exemplo da utilização do MVC (ProgMVCPessoa2) A seguir é visto e descrito a utilização do MVC em Java (Figura 13). O programa ProgMVCPessoa trabalha com as seguintes informações de uma pessoa (nome, idade e sexo) e permite ao usuário digitar estas informações via teclado. 187
188 Figura 13: Exemplo de MVC // Pacote: entity // Classe: Pessoa.java package entity; public final class Pessoa { // atributos da classe private String nome; private int idade; private char sexo; // construtores da classe public Pessoa() { setnome("xxxxxxxxxx"); setidade(-99); setsexo('x'); public Pessoa(String nome, int idade, char sexo) { setnome(nome); setidade(idade); setsexo(sexo); // métodos públicos da classe public void setnome(string nome) { 188
189 this.nome = nome; public void setidade(int idade) { this.idade = idade >= 0 && idade <= 110? idade : -99; public void setsexo(char sexo) { if (strchr("mmff", sexo)) { this.sexo = sexo; else { this.sexo = 'x'; public String getnome() { return (nome); public int getidade() { return (idade); public char getsexo() { return (sexo); // métodos públicos da classe static boolean strchr(string s, char ch) { int n = s.length(); for (int i = 0; i < n; i++) { if (s.charat(i) == ch) { return (true); return (false); // Pacote: pessoaview // Classe: PessoaView.java package pessoaview; import entity.pessoa; import service.pessoaservice; import static util.utilidade.*; public final class PessoaView { // atributos da classe PessoaService pessoaservice; // construtor da classe PessoaView() { String nome = lerstring("digite seu Nome: "); int idade = lerinteiro("digite sua Idade: "); char sexo = lerchar("seu Sexo [M]asculino ou [F]eminino: "); pessoaservice = new PessoaService(nome, idade, sexo); 189
190 exibeview(pessoaservice); PessoaService pessoaservice = new PessoaService(); nome = lerstring("digite seu Nome: "); idade = lerinteiro("digite sua Idade: "); sexo = lerchar("sexo [M]asculino ou [F]eminino: "); pessoaservice.alterapessoa(nome, idade, sexo); exibeview(pessoaservice); // métodos públicos da classe public void exibeview(pessoa pessoa) { System.out.println("Nome: " + pessoa.getnome()); if (pessoa.getidade()!= -99) { System.out.println("Idade: " + pessoa.getidade()); else { System.out.println("ERRO: Idade Inválida"); if (pessoa.getsexo()!= 'x') { System.out.println("Sexo: " + pessoa.getsexo()); else { System.out.println("ERRO: Sexo Inválido"); public void exibeview(pessoaservice pessoa) { System.out.println("Nome: " + pessoa.getpessoa().getnome()); if (pessoa.getpessoa().getidade()!= -99) { System.out.println("Idade: " + pessoa.getpessoa().getidade()); else { System.out.println("ERRO: Idade Inválida"); if (pessoa.getpessoa().getsexo()!= 'x') { System.out.println("Sexo: " + pessoa.getpessoa().getsexo()); else { System.out.println("ERRO: Sexo Inválido"); // Programa Principal: Principal.java package pessoaview; public class Principal { new PessoaView(); // Pacote: service // Classe: PessoaService.java package service; import entity.pessoa; public class PessoaService { 190
191 // atributos da classe private Pessoa pessoa; // construtor da classe public PessoaService() { pessoa = new Pessoa(); public PessoaService(String nome, int idade, char sexo) { pessoa = new Pessoa(); alterapessoa(nome, idade, sexo); // métodos públicos da classe public void alterapessoa(string nome, int idade, char sexo) { pessoa.setnome(nome); pessoa.setidade(idade); pessoa.setsexo(sexo); public Pessoa getpessoa() { return(pessoa); // Pacote: util // Classe: Utilidade.java package util; import java.util.scanner; public class Utilidade { public static String lerstring(string mensagem) { Scanner input = new Scanner(System.in); System.out.print(mensagem); String s = input.nextline(); return(s); public static int lerinteiro(string mensagem) { Scanner input = new Scanner(System.in); System.out.print(mensagem); String s = input.nextline(); int inteiro = Integer.parseInt(s); return(inteiro); public static char lerchar(string mensagem) { Scanner input = new Scanner(System.in); System.out.print(mensagem); String s = input.nextline(); char ch = s.charat(0); return(ch); 191
192 Entrada: Saída: Digite seu Nome: Paulo Roberto <enter> Digite sua Idade: 52 <enter> Seu Sexo [M]asculino ou [F]eminino: m <enter> Nome: Paulo Roberto Idade: 52 Sexo: m ou Entrada: Saída: Digite seu Nome: Adriane Maria <enter> Digite sua Idade: 44 <enter> Sexo [M]asculino ou [F]eminino: f <enter> Nome: Adriane Maria Idade: 44 Sexo: f 192
193 10. Conceitos gerais 10.1 Como é calculado o hashcode no Java A seguir é visto um pequeno programa que mostra o cálculo do hashcode de uma string (String) e/ou de um objeto (Object) em Java. // Programa Principal: ProgHash.java package proghash; public class ProgHash { String s = "abcdef"; Object objeto = "abcdef"; int n = s.length(); System.out.println("HashCode: " + s.hashcode()); int hash = 0; for (int i = 0;i < s.length();i++) { hash = 31 * hash + s.charat(i); System.out.println("Hash calculado: " + hash); System.out.println("HashCode objeto: " + objeto.hashcode()); Resultado do Programa: HashCode: Hash calculado: HashCode objeto: Observação: Note que o resultado deu negativo pois extrapolou o máximo dos inteiros positivos (int). Veja na Tabela 5, abaixo, a faixa de valores ddos números inteiros. Tabela 5: Tipos de dados do Java Tipo Bytes Bits Faixa de valores boolean 1 8 true ou false char à byte à 127 short à int à long E63 à 2E63 float e-46 à e+38 double e-324 à e
194 11. Lista Encadeada Simples em Java 11.1 Lista Encadeada de Inteiros A implementação de uma Lista Encadeada permite alocacar dinamicamente elementos na memória RAM, ou seja, a lista linear de elementos cresce com a execução do programa enquanto houver memória livre. Operações como inserção e remoção são mais simples. Este tipo de estrutura se chama Lista Encadeada Simples ou Lista Encadeada (Figura 14). Figura 14: Lista Encadeada Simples Funcionamento: Nas listas encadeadas simples ou duplamente encadeadas, aonde os elementos são alocados dinamicamente, elas crescem com a necessidade do usuário. Por outro lado, o programador não precisa estipular um tamanho fixo para elas, pois elas podem crescer enquanto houver memória livre, ou seja, os elementos alocados e armazenados podem estar em qualquer posição da área de dados da memória RAM (Random Access Memory) [Figura 15]. Desta forma, os elementos precisam estar conectados por uma ligação entre os nodos da lista, esta ligação se chama elo. Em Java este elo é uma referência. Além disso, é necessário armazenar, pelo menos, a referência do primeiro elemento da lista, para se ter acesso aos demais elementos da lista. E para facilitar, pode-se ainda armazenar o número de elementos da lista (e o último), pois para obter esta informação, seria necessário percorrer toda a lista contando os elementos. Esta operação é muito dispendiosa se a lista for muito grande. public class Nodo { public int info; public Nodo elo; // info: informação que será armazenada na memória RAM // ß guarda a referência do próximo elemento 194
195 Observação: Note que esta lista encadeada simples (acima) funcionará como uma pilha, pois ela cresce para a esquerda, ou seja, toda inserção e remoção é realizada apenas num extremo (lado esquerdo). Figura 15: Alocação de elementos na Memória RAM A Figura 15 acima, mostra a diferença entre alocação estática de memória e a alocação dinâmica de memória. Note que na estática (lado esquerdo) há contiguidade física, ou seja, os elementos estão um ao lado do outro, por causa disto é possível indexar cada elemento de um vetor, ou seja, x[0], x[1], x[n]. Note que na dinâmica (lado direito) é necessário (obrigatório) armazenar a referência do primeiro elemento e o primeiro elemento necessita ter um elo para o segundo e assim sucessivamente, até que o último elemento não aponta para nenhum elemento (referência do último é null). Note que o vetor x alocado estaticamente é: short []x = {10, 20, 30, 40, 50, 60, 70, 80; Observação: Cada elemento do tipo short ocupa 2 bytes na memória RAM Note que a lista encadeada simples é: // onde 10 é o primeiro // 50 é o último elemento 195
196 Problema proposto: Escrever um programa em Java que permite inserir, excluir, consultar dados em uma lista encadeada simples. Programa exemplo: Demonstra a inclusão, exclusão e consulta de números inteiros em uma lista encadeada simples utilizando as classes: Nodo e ListaSimples escritas pelo programador. // Classe: Nodo.java package progsimples; public class Nodo { public int info; public Nodo elo; // Classe: ListaSimples.java package progsimples; public class ListaSimples { // atributos da classe private int n; private Nodo primeiro; // construtor ListaSimples() { primeiro = null; n = 0; // métodos públicos da classe // incluir public void incluir(int valor) { Nodo ref = new Nodo(); ref.info = valor; if (n!= 0) { ref.elo = primeiro; n++; primeiro = ref; // excluir public int excluir() { if (n == 0) { return (-999); else { Nodo ref = primeiro; int valor = ref.info; primeiro = ref.elo; n--; 196
197 if (n == 0) { primeiro = null; return (valor); // pesquisar public int pesquisar(int valor) { if (n!= 0) { Nodo ref = primeiro; int posicao = 1; while (ref!= null) { if (ref.info == valor) { return (posicao); ref = ref.elo; posicao++; else { System.out.println("ERRO: Lista Vazia"); return (-1); // exibir public void exibir() { Nodo ref = primeiro; System.out.print("Lista Encadeada Simples: ["); if (n == 0) { System.out.println("Vazia]"); else { while (ref!= null) { System.out.print(ref.info + " "); ref = ref.elo; System.out.println("\b]"); // exibirdescritor public void exibedescritor() { System.out.println("Descritor: " + primeiro + " " + n + " "); // removeall public void removeall() { primeiro = null; n = 0; System.gc(); // consultar public int consultar() { if (n == 0) { return (-999); else { Nodo ref = primeiro; int valor = ref.info; 197
198 return (valor); // métodos privados da classe // métodos estáticos da classe // Classe: ProgSimples.java package progsimples; import java.util.scanner; public class ProgSimples { ListaSimples simples = new ListaSimples(); Scanner input = new Scanner(System.in); char op; int valor, posicao; do { simples.exibedescritor(); simples.exibir(); do { System.out.print("[I]ncluir, [E]xcluir, [P]esquisar, [C]onsultar, [R]emoveAll ou [F]im: "); String s = input.nextline(); op = s.charat(0); while (!strchr("iieeccpprrff", op)); if (strchr("ff", op)) { System.exit(0); switch (op) { case 'I': case 'i': System.out.print("Valor: "); String s = input.nextline(); valor = Integer.parseInt(s); simples.incluir(valor); case 'E': case 'e': valor = simples.excluir(); if (valor!= -999) { System.out.println("Valor Excluído à Esquerda: " + valor); else { System.out.println("ERRO: Lista vazia à Esquerda"); case 'P': case 'p': System.out.print("Valor à Pesquisar: "); s = input.nextline(); int valorpesquisar = Integer.parseInt(s); posicao = simples.pesquisar(valorpesquisar); if (posicao!= -1) { System.out.println("Posição do Valor pesquisado: " + posicao); else { 198
199 System.out.println("ERRO: Valor não encontrado"); case 'R': case 'r': simples.removeall(); case 'C': case 'c': valor = simples.consultar(); if (valor!= -999) { System.out.println("Valor Consultado à Esquerda: " + valor); else { System.out.println("ERRO: Lista vazia à Esquerda"); while (!strchr("ff", op)); public static boolean strchr(string s, char ch) { int n = s.length(); for (int i = 0; i < n; i++) { if (s.charat(i) == ch) { return (true); return (false); Exemplo para testar o programa: Descritor: null 0 Lista Encadeada Simples: [Vazia] [I]ncluir, [E]xcluir, [P]esquisar, [C]onsultar, [R]emoveAll ou [F]im: i <enter> Valor: 10 <enter> Descritor: progsimples.nodo@77eec5fe 1 Lista Encadeada Simples: [10] [I]ncluir, [E]xcluir, [P]esquisar, [C]onsultar, [R]emoveAll ou [F]im: i <enter> Valor: 20 <enter> Descritor: progsimples.nodo@5d08e435 2 Lista Encadeada Simples: [20 10] [I]ncluir, [E]xcluir, [P]esquisar, [C]onsultar, [R]emoveAll ou [F]im: i <enter> Valor: 30 <enter> Descritor: progsimples.nodo@72be834a 3 Lista Encadeada Simples: [ ] [I]ncluir, [E]xcluir, [P]esquisar, [C]onsultar, [R]emoveAll ou [F]im: i <enter> Valor: 40 <enter> Descritor: progsimples.nodo@399daa20 4 Lista Encadeada Simples: [ ] [I]ncluir, [E]xcluir, [P]esquisar, [C]onsultar, [R]emoveAll ou [F]im: e <enter> Valor Excluído à Esquerda: 40 Descritor: progsimples.nodo@72be834a 3 Lista Encadeada Simples: [ ] [I]ncluir, [E]xcluir, [P]esquisar, [C]onsultar, [R]emoveAll ou [F]im: p <enter> Valor à Pesquisar: 20 <enter> Posição do Valor pesquisado: 2 199
200 Descritor: 3 Lista Encadeada Simples: [ ] [I]ncluir, [E]xcluir, [P]esquisar, [C]onsultar, [R]emoveAll ou [F]im: c <enter> Valor Consultado à Esquerda: 30 Descritor: progsimples.nodo@72be834a 3 Lista Encadeada Simples: [ ] [I]ncluir, [E]xcluir, [P]esquisar, [C]onsultar, [R]emoveAll ou [F]im: e <enter> Valor Excluído à Esquerda: 30 Descritor: progsimples.nodo@5d08e435 2 Lista Encadeada Simples: [20 10] [I]ncluir, [E]xcluir, [P]esquisar, [C]onsultar, [R]emoveAll ou [F]im: e <enter> Valor Excluído à Esquerda: 20 Descritor: progsimples.nodo@77eec5fe 1 Lista Encadeada Simples: [10] [I]ncluir, [E]xcluir, [P]esquisar, [C]onsultar, [R]emoveAll ou [F]im: e <enter> Valor Excluído à Esquerda: 10 Descritor: null 0 Lista Encadeada Simples: [Vazia] [I]ncluir, [E]xcluir, [P]esquisar, [C]onsultar, [R]emoveAll ou [F]im: f <enter> 11.2 Lista Encadeada Genérica (String, Integer ou Double) A seguir, a Lista Simples Genérica permite armazenar elementos dos seguintes tipos de dados: String, Integer, Double ou Character. Sintaxe: ListaSimplesGenerica <String> simples = new ListaSimplesGenerica<>(); // Classe: Nodo.java package progsimples; public class Nodo<E> { E element; Nodo<E> elo; // Classe: ListaSimplesGenerica.java package progsimples; public class ListaSimplesGenerica <E>{ // atributos da classe private int n; private Nodo primeiro; // construtor ListaSimplesGenerica() { primeiro = null; n = 0; // métodos públicos da classe // incluir public void incluir(object valor) { Nodo ref = new Nodo(); 200
201 ref.element = valor; if (n!= 0) { ref.elo = primeiro; n++; primeiro = ref; // excluir public Object excluir() { if (n == 0) { return (-999); else { Nodo ref = primeiro; Object valor = ref.element; primeiro = ref.elo; n--; if (n == 0) { primeiro = null; return (valor); // pesquisar public int pesquisar(object valor) { if (n!= 0) { Nodo ref = primeiro; int posicao = 1; while (ref!= null) { if (ref.element.equals(valor)) { return (posicao); ref = ref.elo; posicao++; else { System.out.println("ERRO: Lista Vazia"); return (-1); // exibir public void exibir() { Nodo ref = primeiro; System.out.print("Lista Encadeada Simples: ["); if (n == 0) { System.out.println("Vazia]"); else { while (ref!= null) { System.out.print(ref.element + " "); ref = ref.elo; System.out.println("\b]"); // exibirdescritor public void exibedescritor() { 201
202 System.out.println("Descritor: " + primeiro + " " + n + " "); // removeall public void removeall() { primeiro = null; n = 0; System.gc(); // consultar public Object consultar() { if (n == 0) { return (-999); else { Nodo ref = primeiro; Object valor = ref.element; return (valor); // métodos privados da classe // métodos estáticos da classe // Classe: ProgListaSimplesGenerica.java package progsimples; import java.util.scanner; public class ProgSimplesGenerica { ListaSimplesGenerica<String> simples = new ListaSimplesGenerica<>(); // troque String por Integer ou Double e teste novamente Scanner input = new Scanner(System.in); char op; int posicao; Object valor; do { simples.exibedescritor(); simples.exibir(); do { System.out.print("[I]ncluir, [E]xcluir, [P]esquisar, [C]onsultar, [R]emoveAll ou [F]im: "); String s = input.nextline(); op = s.charat(0); while (!strchr("iieeccpprrff", op)); if (strchr("ff", op)) { System.exit(0); switch (op) { case 'I': case 'i': System.out.print("Valor: "); String s = input.nextline(); simples.incluir(s); 202
203 case 'E': case 'e': valor = simples.excluir(); if (valor.hashcode()!= -999) { System.out.println("Valor Excluído à Esquerda: " + valor); else { System.out.println("ERRO: Lista vazia à Esquerda"); case 'P': case 'p': System.out.print("Valor à Pesquisar: "); String valorpesquisar = input.nextline(); posicao = simples.pesquisar(valorpesquisar); if (posicao!= -1) { System.out.println("Posição do Valor pesquisado: " + posicao); else { System.out.println("ERRO: Valor não encontrado"); case 'R': case 'r': simples.removeall(); case 'C': case 'c': valor = simples.consultar(); if (valor.hashcode()!= -999) { System.out.println("Valor Consultado à Esquerda: " + valor); else { System.out.println("ERRO: Lista vazia à Esquerda"); while (!strchr("ff", op)); public static boolean strchr(string s, char ch) { int n = s.length(); for (int i = 0; i < n; i++) { if (s.charat(i) == ch) { return (true); return (false); Exemplo para testar o programa: Descritor: null 0 Lista Encadeada Simples: [Vazia] [I]ncluir, [E]xcluir, [P]esquisar, [C]onsultar, [R]emoveAll ou [F]im: i <enter> Valor: Ana <enter> Descritor: progsimples.nodo@6d6f6e28 1 Lista Encadeada Simples: [Ana] [I]ncluir, [E]xcluir, [P]esquisar, [C]onsultar, [R]emoveAll ou [F]im: i <enter> Valor: Beatriz <enter> 203
204 Descritor: 2 Lista Encadeada Simples: [Beatriz Ana] [I]ncluir, [E]xcluir, [P]esquisar, [C]onsultar, [R]emoveAll ou [F]im: i <enter> Valor: Carla <enter> Descritor: progsimples.nodo@45ee12a7 3 Lista Encadeada Simples: [Carla Beatriz Ana] [I]ncluir, [E]xcluir, [P]esquisar, [C]onsultar, [R]emoveAll ou [F]im: p <enter> Valor à Pesquisar: Beatriz <enter> Posição do Valor pesquisado: 2 Descritor: progsimples.nodo@45ee12a7 3 Lista Encadeada Simples: [Carla Beatriz Ana] [I]ncluir, [E]xcluir, [P]esquisar, [C]onsultar, [R]emoveAll ou [F]im: c <enter> Valor Consultado à Esquerda: Carla Descritor: progsimples.nodo@45ee12a7 3 Lista Encadeada Simples: [Carla Beatriz Ana] [I]ncluir, [E]xcluir, [P]esquisar, [C]onsultar, [R]emoveAll ou [F]im: e <enter> Valor Excluído à Esquerda: Carla Descritor: progsimples.nodo@135fbaa4 2 Lista Encadeada Simples: [Beatriz Ana] [I]ncluir, [E]xcluir, [P]esquisar, [C]onsultar, [R]emoveAll ou [F]im: e <enter> Valor Excluído à Esquerda: Beatriz Descritor: progsimples.nodo@6d6f6e28 1 Lista Encadeada Simples: [Ana] [I]ncluir, [E]xcluir, [P]esquisar, [C]onsultar, [R]emoveAll ou [F]im: e <enter> Valor Excluído à Esquerda: Ana Descritor: null 0 Lista Encadeada Simples: [Vazia] [I]ncluir, [E]xcluir, [P]esquisar, [C]onsultar, [R]emoveAll ou [F]im: c <enter> ERRO: Lista vazia à Esquerda Descritor: null 0 Lista Encadeada Simples: [Vazia] [I]ncluir, [E]xcluir, [P]esquisar, [C]onsultar, [R]emoveAll ou [F]im: f <enter> 12. Lista Duplamente Encadeada em Java Na lista duplamente encadeada (Figura 16), cada elemento possui um elo para o anterior (antecessor) e o posterior (sucessor), sendo que a lista pode ter ou não descritor. Descritor: Estrutura que normalmente armazena o primeiro elemento, a quantidade de elementos e o último elemento da Lista. private Nodo primeiro; private int n; private Nodo ultimo; Problema: Escrever um programa em Java que insere, exclui, pesquisa, consulta e remove todos os dados em uma lista duplamente encadeada com descritor. 204
205 Programa exemplo: Demonstra a inclusão, exclusão, pesquisa, consulta, remoção completa e exibição de números inteiros (à esquerda, à direita e na posição escolhida pelo usuário) em uma lista duplamente encadeada com descritor utilizando as classes: Nodo e Dupla. Figura 16: Lista Duplamente Encadeada // Classe: Nodo.java package progdupla; public class Nodo { public Nodo anterior = null; public int info; public Nodo posterior = null; // Classe: Descritor.java package progdupla; public class Descritor { public Nodo primeiro; public int n; public Nodo ultimo; Descritor(Nodo primeiro, int n, Nodo ultimo) { this.primeiro = primeiro; this.n = 0; this.ultimo = ultimo; // Classe: ListaDupla.java package progdupla; public class ListaDupla { // atributos da classe // Descritor descritor; // primeiro n último // // construtor ListaDupla() { descritor = new Descritor(null, 0, null); // inicializa descritor 205
206 // métodos públicos da classe // incluiresquerda public void incluiresquerda(int valor) { Nodo ref = new Nodo(); ref.info = valor; if (descritor.n == 0) { descritor.ultimo = ref; else { ref.posterior = descritor.primeiro; descritor.primeiro.anterior = ref; descritor.n++; descritor.primeiro = ref; // incluirdireita public void incluirdireita(int valor) { Nodo ref = new Nodo(); ref.info = valor; if (descritor.n == 0) { descritor.primeiro = ref; else { ref.anterior = descritor.ultimo; descritor.ultimo.posterior = ref; descritor.n++; descritor.ultimo = ref; // incluirposicao public void incluirposicao(int valor, int posicao) { if (posicao >= 0 && posicao <= descritor.n) { Nodo ref = new Nodo(); ref.info = valor; Nodo aux = descritor.primeiro; if (posicao == 1) { incluiresquerda(valor); else { if (posicao == descritor.n + 1) { incluirdireita(valor); else { for (int i = 1; i < posicao - 1; i++) { aux = aux.posterior; descritor.n++; ref.anterior = aux; ref.posterior = aux.posterior; aux.posterior.anterior = ref; aux.posterior = ref; else { System.out.println("ERRO: Posição Inválida"); // excluiresquerda public int excluiresquerda() { 206
207 if (descritor.n == 0) { return (-999); else { Nodo ref = descritor.primeiro; int valor = ref.info; descritor.primeiro = ref.posterior; if (descritor.primeiro!= null) { descritor.primeiro.anterior = null; descritor.n--; if (descritor.n == 0) { descritor.ultimo = null; return (valor); // excluirdireita public int excluirdireita() { if (descritor.n == 0) { return (-999); else { Nodo ref = descritor.ultimo; int valor = ref.info; descritor.ultimo = ref.anterior; if (descritor.ultimo!= null) { descritor.ultimo.posterior = null; descritor.n--; if (descritor.n == 0) { descritor.primeiro = null; return (valor); // excluirposicao public int excluirposicao(int posicao) { if (descritor.n == 0) { return (-999); else { if (posicao == 1) { return (excluiresquerda()); else { if (posicao == descritor.n) { return (excluirdireita()); else { Nodo ref = descritor.primeiro; Nodo aux = ref; for (int i = 1; i < posicao; i++) { aux = ref; ref = ref.posterior; int valor = ref.info; aux.posterior = ref.posterior; ref.posterior.anterior = aux; descritor.n--; if (descritor.n == 0) { descritor.ultimo = null; 207
208 return (valor); // pesquisar public int pesquisar(int valor) { if (descritor.n!= 0) { Nodo ref = descritor.primeiro; int posicao = 1; while (ref!= null) { if (ref.info == valor) { return (posicao); ref = ref.posterior; posicao++; else { System.out.println("ERRO: Lista Vazia"); return (-1); // exibiresquerda public void exibiresquerda() { Nodo ref = descritor.primeiro; System.out.print("Lista pela Esquerda: ["); if (descritor.n == 0) { System.out.println("Vazia]"); else { while (ref!= null) { System.out.print(ref.info + " "); ref = ref.posterior; System.out.println("\b]"); // exibirdireita public void exibirdireita() { Nodo ref = descritor.ultimo; System.out.print("Lista pela Direita: ["); if (descritor.n == 0) { System.out.println("Vazia]"); else { while (ref!= null) { System.out.print(ref.info + " "); ref = ref.anterior; System.out.println("\b]"); // exibirdescritor public void exibedescritor() { System.out.println("Descritor: " + descritor.primeiro + " " + 208
209 descritor.n + " " + descritor.ultimo + " "); // removeall public void removeall() { descritor = new Descritor(null, 0, null); System.gc(); // consultaresquerda public int consultaresquerda() { if (descritor.n == 0) { return (-999); else { Nodo ref = descritor.primeiro; int valor = ref.info; return (valor); // consultardireita public int consultardireita() { if (descritor.n == 0) { return (-999); else { Nodo ref = descritor.ultimo; int valor = ref.info; return (valor); // consultarposicao public int consultarposicao(int posicao) { if (descritor.n == 0) { return (-999); else { if (posicao == 1) { return (consultaresquerda()); else { if (posicao == descritor.n) { return (consultardireita()); else { Nodo ref = descritor.primeiro; for (int i = 1; i < posicao; i++) { ref = ref.posterior; int valor = ref.info; return (valor); // métodos privados da classe // métodos estáticos da classe // Programa Principal: ProgDupla.java 209
210 package progdupla; import java.util.scanner; public class ProgDupla { ListaDupla dupla = new ListaDupla(); Scanner input = new Scanner(System.in); char ch = 'T', op; int valor, posicao; do { dupla.exibedescritor(); dupla.exibirdireita(); dupla.exibiresquerda(); do { System.out.print("[I]ncluir, [E]xcluir, [P]esquisar, [C]onsultar, [R]emoveAll ou [F]im: "); String s = input.nextline(); op = s.charat(0); while (!strchr("iieeccpprrff", op)); if (strchr("ff", op)) { System.exit(0); if (strchr("iieecc", op)) { do { System.out.print("[E]squerda, [D]ireita ou [P]osição: "); String s = input.nextline(); ch = s.charat(0); while (!strchr("ddeepp", ch)); switch (op) { case 'I': case 'i': System.out.print("Valor: "); String s = input.nextline(); valor = Integer.parseInt(s); switch (ch) { case 'D': case 'd': dupla.incluirdireita(valor); case 'E': case 'e': dupla.incluiresquerda(valor); case 'P': case 'p': System.out.print("Posição: "); s = input.nextline(); posicao = Integer.parseInt(s); dupla.incluirposicao(valor, posicao); case 'E': case 'e': switch (ch) { case 'D': 210
211 case 'd': valor = dupla.excluirdireita(); if (valor!= -999) { System.out.println("Valor Excluído à Direita: " + valor); else { System.out.println("ERRO: Lista vazia à Direita"); case 'E': case 'e': valor = dupla.excluiresquerda(); if (valor!= -999) { System.out.println("Valor Excluído à Esquerda: " + valor); else { System.out.println("ERRO: Lista vazia à Esquerda"); case 'P': case 'p': System.out.print("Posição: "); s = input.nextline(); posicao = Integer.parseInt(s); valor = dupla.excluirposicao(posicao); if (valor!= -999) { System.out.println("Valor Excluído na Posição: " + valor); else { System.out.println("ERRO: Lista vazia na Posição"); case 'P': case 'p': System.out.print("Valor à Pesquisar: "); s = input.nextline(); int valorpesquisar = Integer.parseInt(s); posicao = dupla.pesquisar(valorpesquisar); if (posicao!= -1) { System.out.println("Posição do Valor pesquisado: " + posicao); else { System.out.println("ERRO: Valor não encontrado"); case 'R': case 'r': dupla.removeall(); case 'C': case 'c': switch (ch) { case 'D': case 'd': valor = dupla.consultardireita(); if (valor!= -999) { System.out.println("Valor Consultado à Direita: " + valor); else { System.out.println("ERRO: Lista vazia à Direita"); case 'E': 211
212 case 'e': valor = dupla.consultaresquerda(); if (valor!= -999) { System.out.println("Valor Consultado à Esquerda: " + valor); else { System.out.println("ERRO: Lista vazia à Esquerda"); case 'P': case 'p': System.out.print("Posição: "); s = input.nextline(); posicao = Integer.parseInt(s); valor = dupla.consultarposicao(posicao); if (valor!= -999) { System.out.println("Valor Consultado na Posição: " + valor); else { System.out.println("ERRO: Lista vazia na Posição"); while (!strchr("ff", op)); public static boolean strchr(string s, char ch) { int n = s.length(); for (int i = 0; i < n; i++) { if (s.charat(i) == ch) { return (true); return (false); Exemplo para testar o programa: Descritor: null 0 null Lista pela Direita: [Vazia] Lista pela Esquerda: [Vazia] [I]ncluir, [E]xcluir, [P]esquisar, [C]onsultar, [R]emoveAll ou [F]im: i <enter> [E]squerda, [D]ireita ou [P]osição: e <enter> Valor: 10 <enter> Descritor: progdupla.nodo@3ed8d90c 1 progdupla.nodo@3ed8d90c Lista pela Direita: [10] Lista pela Esquerda: [10] [I]ncluir, [E]xcluir, [P]esquisar, [C]onsultar, [R]emoveAll ou [F]im: i <enter> [E]squerda, [D]ireita ou [P]osição: d <enter> Valor: 20 <enter> Descritor: progdupla.nodo@3ed8d90c 2 progdupla.nodo@e91c310 Lista pela Direita: [20 10] Lista pela Esquerda: [10 20] [I]ncluir, [E]xcluir, [P]esquisar, [C]onsultar, [R]emoveAll ou [F]im: i <enter> [E]squerda, [D]ireita ou [P]osição: d <enter> Valor: 40 <enter> Descritor: progdupla.nodo@3ed8d90c 3 progdupla.nodo@39d56e9 Lista pela Direita: [ ] 212
213 Lista pela Esquerda: [ ] [I]ncluir, [E]xcluir, [P]esquisar, [C]onsultar, [R]emoveAll ou [F]im: i <enter> [E]squerda, [D]ireita ou [P]osição: p <enter> Valor: 30 <enter> Posição: 3 <enter> Descritor: progdupla.nodo@3ed8d90c 4 progdupla.nodo@39d56e9 Lista pela Direita: [ ] Lista pela Esquerda: [ ] [I]ncluir, [E]xcluir, [P]esquisar, [C]onsultar, [R]emoveAll ou [F]im: p <enter> Valor à Pesquisar: 30 <enter> Posição do Valor pesquisado: 3 Descritor: progdupla.nodo@3ed8d90c 4 progdupla.nodo@39d56e9 Lista pela Direita: [ ] Lista pela Esquerda: [ ] [I]ncluir, [E]xcluir, [P]esquisar, [C]onsultar, [R]emoveAll ou [F]im: c <enter> [E]squerda, [D]ireita ou [P]osição: d <enter> Valor Consultado à Direita: 40 Descritor: progdupla.nodo@3ed8d90c 4 progdupla.nodo@39d56e9 Lista pela Direita: [ ] Lista pela Esquerda: [ ] [I]ncluir, [E]xcluir, [P]esquisar, [C]onsultar, [R]emoveAll ou [F]im: f <enter> 213
214 13. Classe entrada de inteiros e reais em Java sem erro na digitação A seguir, são vistos dois programas em Java, cada um com as classes: EntradaDadosScanner e EntradaDadosSwing, respectivamente, e que permitem a entrada de dados via teclado de números inteiros (leinteiro) e reais (LeReal) sem erro de conversão (Integer.parseInt e Double.parseDouble) por descuido na digitação pelo usuário, ou seja, o usuário pode digitar qualquer coisa (em tese, por enquanto) que os métodos da classe eliminam os erros de digitação. Imagine a seguinte entrada de um inteiro e de um real em um programa Java com este tipo de digitação (em vermelho): Exemplo para testar o programa: Digite um Inteiro: -123 de oliveira 4, <enter> Inteiro Digitado: Digite um Real: -123,.,.45--,.56 <enter> Real Digitado: Analise a resposta em letras azuis. O programa eliminou todos os caracteres inválidos para um inteiro ou para um real, inclusive pontos (.) e vírgulas (,) repetidas e o sinal negativo (-) no local indevido. // Programa Principal: ProgEntradaDadosScanner.java package progentradadadosscanner; public class ProgEntradaDadosScanner { EntradaDadosScanner entrada = new EntradaDadosScanner(); int inteiro = entrada.leinteiro("digite um Inteiro: "); System.out.println("Inteiro Digitado: " + inteiro); Double real = entrada.lereal("digite um Real: "); System.out.println("Real Digitado: " + real); // Classe: EntradaDadosScanner.java package progentradadados; import java.util.scanner; public class EntradaDadosScanner { 214
215 // métodos públicos da classe // leinteiro public int leinteiro(string mensagem) { Scanner input = new Scanner(System.in); String s; int limite, n; do { System.out.print(mensagem); s = input.nextline(); s = s.replaceall("[^0-9\\-]", ""); // eliminar letras e caracteres não numéricos n = s.length(); if (n == 1 && s.charat(0) == '-') { s = ""; else { if (n > 0) { s = retiranegativosforalugar(s); if (s.charat(0) == '-') { limite = 11; else { limite = 10; if (n >= limite) { s = verificalimites(s); while (s.isempty()); int inteiro = Integer.parseInt(s); // conversão segura sem erros return (inteiro); // lereal public double lereal(string mensagem) { Scanner input = new Scanner(System.in); String s; do { System.out.print(mensagem); s = input.nextline(); s = s.replaceall("[^0-9\\-.,]", ""); // eliminar letras s = verificavirgulaponto(s); s = retiranegativosforalugar(s); int n = s.length(); if (n == 1 && (s.charat(0) == '-' s.charat(0) == '.')) { s = ""; while (s.isempty()); double real = Double.parseDouble(s); // conversão segura sem erros return (real); // métodos privados da classe // verificavirgulaponto private String verificavirgulaponto(string s) { int pontos = 0; char[] r = s.tochararray(); int n = s.length(); for (int i = 0; i < n; i++) { if (r[i] == ',' r[i] == '.') { 215
216 r[i] = '.'; pontos++; if (pontos > 1) { r = retirapontosrepetidos(r); s = ""; for (int i = 0; i < r.length; i++) { s = s + r[i]; return (s); // retirapontosrepetidos private static char[] retirapontosrepetidos(char[] s) { int n = s.length; String r = ""; boolean copiou = false; int j = 0; for (int i = 0; i < n; i++) { if (s[i]!= '.') { r = r + s[i]; j++; else { if (!copiou) { r = r + '.'; copiou = true; return (r.tochararray()); // retiranegativosforalugar private static String retiranegativosforalugar(string s) { String r = ""; int n = s.length(); for (int i = 0; i < n; i++) { if (s.charat(i)!= '-' i == 0) { r = r + s.charat(i); return (r); // verificalimites private static String verificalimites(string s) { String limiteinferior = " "; String limitesuperior = " "; if (s.compareto(limiteinferior) > 0 s.compareto(limitesuperior) > 0) { System.out.println("ERRO: Excedeu o Limite dos Números Inteiros"); return (""); return (s); A seguir uma outra versão utilizando o pacote swing. 216
217 // Programa Principal: ProgEntradaDadosSwing.java package progentradadadosswing; import javax.swing.joptionpane; public class ProgEntradaDadosSwing { EntradaDadosSwing entrada = new EntradaDadosSwing(); int inteiro = entrada.leinteiro("digite um Inteiro: "); JOptionPane.showMessageDialog(null, "Inteiro Digitado: " + inteiro); Double real = entrada.lereal("digite um Real: "); JOptionPane.showMessageDialog(null, "Real Digitado: " + real); // Classe: EntradaDadosSwing.java package progentradadadosswing; import javax.swing.joptionpane; public class EntradaDadosSwing { // métodos públicos da classe // leinteiro public int leinteiro(string mensagem) { String s; int n, limite; do { s = JOptionPane.showInputDialog(mensagem); s = s.replaceall("[^0-9\\-]", ""); // eliminar letras e caracteres não numéricos n = s.length(); if (!(n == 1 && s.charat(0) == '-')) { if (n > 0) { s = retiranegativosforalugar(s); if (s.charat(0) == '-') { limite = 11; else { limite = 10; if (n >= limite) { s = verificalimites(s); else { s = ""; while (s.isempty()); int inteiro = Integer.parseInt(s); return (inteiro); // lereal public double lereal(string mensagem) { 217
218 String s; do { s = JOptionPane.showInputDialog(mensagem); s = s.replaceall("[^0-9\\-.,]", ""); s = verificavirgulaponto(s); s = retiranegativosforalugar(s); int n = s.length(); if (n == 1 && (s.charat(0) == '-' s.charat(0) == '.')) { s = ""; while (s.isempty()); double real = Double.parseDouble(s); return (real); // eliminar letras digitadas incorretamente e que não // podem ser convertidas para double // métodos privados da classe // verificavirgulaponto private String verificavirgulaponto(string s) { int pontos = 0; char[] r = s.tochararray(); int n = s.length(); for (int i = 0; i < n; i++) { if (r[i] == ',' r[i] == '.') { r[i] = '.'; pontos++; if (pontos > 1) { r = retirapontosrepetidos(r); s = ""; for (int i = 0; i < r.length; i++) { s = s + r[i]; return (s); // retirapontosrepetidos private static char[] retirapontosrepetidos(char[] s) { int n = s.length; String r = ""; boolean copiou = false; int j = 0; for (int i = 0; i < n; i++) { if (s[i]!= '.') { r = r + s[i]; j++; else { if (!copiou) { r = r + '.'; copiou = true; return (r.tochararray()); // retiranegativosforalugar private static String retiranegativosforalugar(string s) { 218
219 String r = ""; int n = s.length(); for (int i = 0; i < n; i++) { if (s.charat(i)!= '-' i == 0) { r = r + s.charat(i); return (r); // verificalimites private static String verificalimites(string s) { String limiteinferior = " "; String limitesuperior = " "; if (s.compareto(limiteinferior) > 0 s.compareto(limitesuperior) > 0) { JOptionPane.showMessageDialog(null, "ERRO: Excedeu o Limite dos Números Inteiros"); return (""); return (s); 219
220 14. Alguns programas exemplos em Java A seguir são vistos quatro (4) exemplos da utilização das classes existentes do Java vistas no decorrer do livro Torre de Hanoi (Pilha - Stack) A seguir é visto a implementação de uma Torre de Hanoi (Figura 17) em Java usando a classe Stack (Pilha). Figura 17: Jogo Torre de Hanoi Regras do Jogo: a) Não se pode colocar um disco grande sobre um disco pequeno b) Ganha quando trocar todos os três discos de uma torre para outra // Programa Principal: ProgTorre.java package progtorre; 220
221 import java.util.stack; import java.util.scanner; public class ProgTorre { Scanner entrada = new Scanner(System.in); String s; int in, out; Stack p1 = new Stack(); Stack p2 = new Stack(); Stack p3 = new Stack(); boolean ganhou, moveu = false; p1.push(3); p1.push(2); p1.push(1); exibepilhas(p1, p2, p3); do { do { System.out.print("Move: "); s = entrada.nextline(); in = Integer.parseInt(s); if (in == 0) { System.exit(0); while (in < 1 in > 3); do { System.out.print("Para: "); s = entrada.nextline(); out = Integer.parseInt(s); if (in == 0) { System.exit(0); while (out < 1 out > 3); if (testamovimento(p1, p2, p3, in)) { if (testamaior(p1, p2, p3, in, out)) { moveu = movepilha(p1, p2, p3, in, out); exibepilhas(p1, p2, p3); if (moveu) { ganhou = testavitoria(p1); if (ganhou) { System.out.println("Status: VENCEDOR (p1)"); System.exit(0); ganhou = testavitoria(p2); if (ganhou) { System.out.println("Status: VENCEDOR (p2)"); System.exit(0); ganhou = testavitoria(p3); if (ganhou) { System.out.println("Status: VENCEDOR (p3)"); System.exit(0); 221
222 while (true); // testavitoria static boolean testavitoria(stack p1) { int a, b, c; a = p1.search(1); b = p1.search(2); c = p1.search(3); if (a!= -1 && b!= -1 && c!= -1) { return(true); else { return(false); // testamaior static boolean testamaior(stack p1, Stack p2, Stack p3, int in, int out) { Object nodo; int a = 0, b = 0; switch (in) { case 1: nodo = p1.peek(); a = nodo.hashcode(); case 2: nodo = p2.peek(); a = nodo.hashcode(); case 3: nodo = p3.peek(); a = nodo.hashcode(); switch (out) { case 1: if (p1.empty()) { return(true); else { nodo = p1.peek(); b = nodo.hashcode(); case 2: if (p2.empty()) { return(true); else { nodo = p2.peek(); b = nodo.hashcode(); case 3: if (p3.empty()) { return(true); else { nodo = p3.peek(); b = nodo.hashcode(); 222
223 if (a < b) return(true); else { return(false); // testamovimento static boolean testamovimento(stack p1, Stack p2, Stack p3, int in) { boolean pode = false; switch (in) { case 1: if (p1.empty()) { System.out.println("Status: Impossivel mover (p1)"); else { pode = true; case 2: if (p2.empty()) { System.out.println("Status: Impossivel mover (p2)"); else { pode = true; case 3: if (p3.empty()) { System.out.println("Status: Impossivel mover (p3)"); else { pode = true; return(pode); // movepilha static boolean movepilha(stack p1, Stack p2, Stack p3, int a, int b) { Object nodo; int in = 0; boolean moveu = false; switch (a) { case 1: if (!p1.empty()) { nodo = p1.pop(); in = nodo.hashcode(); else { in = 0; case 2: if (!p2.empty()) { nodo = p2.pop(); in = nodo.hashcode(); else { in = 0; 223
224 case 3: if (!p3.empty()) { nodo = p3.pop(); in = nodo.hashcode(); else { in = 0; if (in!= 0) { switch (b) { case 1: p1.push(in); moveu = true; case 2: p2.push(in); moveu = true; case 3: p3.push(in); moveu = true; return(moveu); // exibepilhas static void exibepilhas(stack p1, Stack p2, Stack p3) { System.out.println("p1: " + p1); System.out.println("p2: " + p2); System.out.println("p3: " + p3); Observação: Substitua o método exibepilhas pelo método abaixo. // exibepilhas static void exibepilhas(stack p1, Stack p2, Stack p3) { char a1 = ' ', a2 = ' ', a3 = ' '; char b1 = ' ', b2 = ' ', b3 = ' '; char c1 = ' ', c2 = ' ', c3 = ' '; Object nodo; nodo = p1.search(1); a1 = nodo.tostring().charat(0); if (a1!= '-') { a1 = '1'; nodo = p1.search(2); a2 = nodo.tostring().charat(0); if (a2!= '-') { a2 = '2'; nodo = p1.search(3); a3 = nodo.tostring().charat(0); if (a3!= '-') { a3 = '3'; 224
225 nodo = p2.search(1); b1 = nodo.tostring().charat(0); if (b1!= '-') { b1 = '1'; nodo = p2.search(2); b2 = nodo.tostring().charat(0); if (b2!= '-') { b2 = '2'; nodo = p2.search(3); b3 = nodo.tostring().charat(0); if (b3!= '-') { b3 = '3'; nodo = p3.search(1); c1 = nodo.tostring().charat(0); if (c1!= '-') { c1 = '1'; nodo = p3.search(2); c2 = nodo.tostring().charat(0); if (c2!= '-') { c2 = '2'; nodo = p3.search(3); c3 = nodo.tostring().charat(0); if (c3!= '-') { c3 = '3'; if (c3 == '-' && c2 == '-' && c1!= '-') { c3 = c1; c1 = '-'; if (c3 == '-' && c2!= '-' && c1 == '-') { c3 = c2; c2 = '-'; if (c3 == '-' && c2!= '-' && c1!= '-') { c3 = c2; c2 = c1; c1 = '-'; if (b3 == '-' && b2 == '-' && b1!= '-') { b3 = b1; b1 = '-'; if (b3 == '-' && b2!= '-' && b1 == '-') { b3 = b2; b2 = '-'; if (b3 == '-' && b2!= '-' && b1!= '-') { b3 = b2; b2 = b1; b1 = '-'; if (a3 == '-' && a2 == '-' && a1!= '-') { 225
226 a3 = a1; a1 = '-'; if (a3 == '-' && a2!= '-' && a1 == '-') { a3 = a2; a2 = '-'; if (a3 == '-' && a2!= '-' && a1!= '-') { a3 = a2; a2 = a1; a1 = '-'; System.out.printf(" %c %c %c \n", a1, b1, c1); System.out.printf(" %c %c %c \n", a2, b2, c2); System.out.printf(" %c %c %c \n", a3, b3, c3); System.out.printf(" \n"); System.out.printf(" p1 p2 p3\n\n"); 14.2 Analisador de Expressões usando Stack Programa abaixo implementa um Analisador de Expressões utilizando a classe Java Stack. O programa resolve expressões do tipo: (4*(5+(4*3)/(3-1))) ou (3*(4+5)) Exemplo de entrada de dados: Expressão: (4*(5+(4*3)/(3-1))) <enter> // Programa Principal: ProgAnalisaExpressao.java package proganalisaexpressao; import java.util.stack; import java.util.scanner; public class ProgAnalisaExpressao { Stack numeros = new Stack(); Stack operadores = new Stack(); Scanner entrada = new Scanner(System.in); String s; float resp; System.out.print("Expressao: "); s = entrada.nextline(); int n = s.length(); if (testaexpressao(s)) { for (int i = 0;i < n;i++) { if (s.charat(i) == '(') { continue; if (" ".indexOf(s.charAt(i))!= -1) { char ch = s.charat(i); float t = (float) ch - 48; 226
227 numeros.push(t); exibepilha(numeros); exibepilha(operadores); System.out.println(); else { if ("+-*/".indexof(s.charat(i))!= -1) { char op = s.charat(i); operadores.push(op); if (s.charat(i) == ')') { Object nodo = numeros.pop(); String st = nodo.tostring(); float y = Float.parseFloat(st); nodo = numeros.pop(); st = nodo.tostring(); float x = Float.parseFloat(st); nodo = operadores.pop(); String temp = nodo.tostring(); char op = temp.charat(0); resp = calculaoperacao(x, y, op); numeros.push(resp); exibepilha(numeros); exibepilha(operadores); System.out.println(); if (operadores.empty()) { Object nodo = numeros.pop(); String st = nodo.tostring(); resp = Float.parseFloat(st); else { resp = 0; while (!operadores.empty()) { Object nodo = numeros.pop(); String st = nodo.tostring(); float y = Float.parseFloat(st); nodo = numeros.pop(); st = nodo.tostring(); float x = Float.parseFloat(st); nodo = operadores.pop(); String temp = nodo.tostring(); char op = temp.charat(0); resp = calculaoperacao(x, y, op); numeros.push(resp); exibepilha(numeros); exibepilha(operadores); System.out.println("Resposta: " + resp); else { System.out.println("Erro: Expressao Invalida"); // calculaoperacao 227
228 static float calculaoperacao(float x, float y, char op) { float resp = 0; switch (op) { case '+': resp = x + y; case '-': resp = x - y; case '*': resp = x * y; case '/': if (y!= 0) { resp = x / y; else { System.out.println("Erro Fatal: Divisão por Zero"); System.exit(0); return(resp); // testaexpressao static boolean testaexpressao(string exp) { int abre = 0, fecha = 0; for (int i = 0;i < exp.length();i++) { if (exp.charat(i) == '(') { abre++; if (exp.charat(i) == ')') { fecha++; if (abre == fecha) { return(true); else return(false); // exibepilha static void exibepilha(stack pilha) { Object [] nodo = pilha.toarray(); System.out.print("Pilha: "); for (int i = 0;i < nodo.length;i++) { System.out.print(nodo[i] + " "); System.out.println(); Exemplo para testar o programa: Expressão: (4*(5+(4*3)/(3-1))) <enter> Pilha: 4 Pilha: 228
229 Pilha: 5 4 Pilha: * Pilha: Pilha: + * Pilha: Pilha: * + * Pilha: Pilha: + * Pilha: Pilha: / + * Pilha: Pilha: - / + * Pilha: Pilha: / + * Pilha: Pilha: + * Pilha: 11 4 Pilha: * Pilha: 44 Pilha: Resposta: Calculadora Polonesa Reversa A seguir, o programa implementa uma calculadora Polonesa Reversa, ou seja, o usuário digita primeiro dois valores e depois o operador. Exemplo para testar o programa: Polonesa Reversa: <enter> abandona 3 <enter> 2 <enter> / <enter> <enter> * <enter> 3 <enter> by Polonesa Reversa // Programa Prinicpal: ProgPolonesaReversa.java package progpolonesareversa; public class ProgPolonesaReversa { PolonesaReversa polonesa = new PolonesaReversa(); 229
230 polonesa.calculapolonesareversa(); // Classe: PolonesaReversa.java package progpolonesareversa; import java.util.scanner; public class PolonesaReversa { // atributos da classe private double x, y, resp = 0; private char op; private int erro; // métodos públicos da classe public PolonesaReversa () { // construtor erro = 0; public void calculapolonesareversa() { Scanner entrada = new Scanner(System.in); String s; System.out.println("Polonesa Reversa: <enter> abandonar"); do { if (resp == 0) { s = entrada.nextline(); if (s.equals("")) { System.out.println("by Polonesa Reversa"); System.exit(0); s = s.replaceall("[^0-9\\-.]", ""); // elimina letras digitadas incorretamente x = Double.parseDouble(s); else { x = resp; s = entrada.nextline(); if (s.equals("")) { System.out.println("by Polonesa Reversa"); System.exit(0); s = s.replaceall("[^0-9\\-.]", ""); // elimina letras digitadas incorretamente y = Double.parseDouble(s); do { s = entrada.nextline(); if (s.equals("")) { System.out.println("by Polonesa Reversa"); System.exit(0); op = s.charat(0); while (!strchr("+-*/pp", op)); operacalculadora(); exibecalculadora(); while (!s.equals("")); 230
231 // operacalculadora private void operacalculadora() { switch (op) { case '+': resp = soma(x, y); case '-': resp = subtracao(x, y); case '*': resp = multiplicacao(x, y); case '/': if (y == 0) erro = 1; // divisão por zero else resp = divisao(x, y); case 'P': case 'p': resp = power(x, y); // potência // exibecalculadora private void exibecalculadora() { switch (erro) { case 1: System.out.println("Erro: Divisão por Zero"); case 2: System.out.println("Erro: Raiz Complexa"); case 3: System.out.println("Erro: Tangente Inválida"); default: System.out.println(resp); //... métodos privados da classe // strchr private boolean strchr(string s, char ch) { for (int i = 0; i < s.length(); i++) { if (s.charat(i) == ch) { return(true); return(false); // soma private double soma(double x, double y) { return(x + y); // subtração private double subtracao(double x, double y) { return(x - y); // multiplicação private double multiplicacao(double x, double y) { 231
232 return(x * y); // divisão private double divisao(double x, double y) { if (y == 0) { erro = 1; return(-1); return(x / y); // power private double power(double x, double y) { return(math.pow(x, y)); 14.4 Jogo Quebra-Cabeças A seguir é visto a implementação de um jogo chamado Quebra-Cabeças (Figura 18), cujo objetivo é colocar os números de 1 à 8 em ordem crescente, conforme exemplo abaixo: Figura 18: Jogo Quebra-Cabeças // Programa Principal: ProgQuebraCabeca.java package progquebracabeca; public class ProgQuebraCabeca { Tabuleiro tabuleiro = new Tabuleiro(); tabuleiro.sorteianumeros(); tabuleiro.exibetabuleiro(); tabuleiro.jogadasjogador(); // Classe: Tabuleiro.java package progcabeca; import java.util.scanner; 232
233 public class Tabuleiro { private final int [][] matriz = new int [3][3]; private final int [][] certa = {{1, 2, 3, {4, 5, 6, {7, 8, 0; private int jogadas = 0; // verificavitoria private boolean verificavitoria() { for (int l = 0;l < 3;l++) { for (int c = 0;c < 3;c++) { if (matriz[l][c]!= certa[l][c]) { return(false); return(true); // verificadeslocamento private void verificadeslocamento(int num) { int lin = 0, col = 0; int ll = 0, cc = 0; for (int l = 0;l < 3;l++) { for (int c = 0;c < 3;c++) { if (matriz[l][c] == num) { lin = l; col = c; for (int l = 0;l < 3;l++) { for (int c = 0;c < 3;c++) { if (matriz[l][c] == 0) { ll = l; cc = c; if ((lin == ll col == cc) && ((ll-lin == 1 lin-ll == 1) (cc-col == 1 col-cc == 1))){ matriz[ll][cc] = num; matriz[lin][col] = 0; exibetabuleiro(); else { System.out.println("Status: Movimento Inválido"); if (verificavitoria()) { System.out.println("Vitória"); System.exit(0); // jogadasjogador public void jogadasjogador() { Scanner input = new Scanner(System.in); char tecla; 233
234 do { System.out.print("Move (" + jogadas + "): "); String s = input.nextline(); tecla = s.charat(0); if (strchr(" ", tecla)) { verificadeslocamento(tecla-48); jogadas++; if (jogadas == 99) { System.out.println("Game Over"); System.exit(0); while (tecla!= '0'); // exibetabuleiro public void exibetabuleiro() { for (int l = 0;l < 3;l++) { for (int c = 0;c < 3;c++) { if (matriz[l][c]!= 0) { System.out.printf("%2d ", matriz[l][c]); else { System.out.printf(" "); System.out.println(); // sorteianumeros public void sorteianumeros() { for (int i = 1;i <= 8;i++) { boolean ok = false; do { int l = (int) (Math.random() * 3); int c = (int) (Math.random() * 3); if (matriz[l][c] == 0) { matriz[l][c] = i; ok = true; while (!ok); // strchr private boolean strchr(string s, char tecla) { int n = s.length(); for (int i = 0;i < n;i++) { if (s.charat(i) == tecla) { return(true); return(false); 234
235 Anexos: Solução dos problemas propostos no Livro Anexo 1.4 Solução da Lista: Classes ProgCirculo // Classe: Circulo.java package progcirculo; public class Circulo { // atributos da classe private double raio; private double area; // construtor // métodos públicos da classe public void setraio(double raio) { this.raio = raio; public void calculaarea() { area = Math.PI * Math.pow(raio, 2); public double getarea() { return (area); // métodos privados da classe // métodos estáticos da classe // Programa Principal: ProgCirculo.java package progcirculo; public class ProgCirculo { Circulo circ = new Circulo(); circ.setraio(3); circ.calculaarea(); double area = circ.getarea(); System.out.printf("Área: %.2f\n", area); ProgPeso // Classe: PesoIdeal.java package progpeso; 235
236 public class PesoIdeal { // atributos de classe private char sexo; private double altura; private double pesoideal; // construtor da classe PesoIdeal(char sexo, double altura) { this.sexo = sexo; this.altura = altura; // métodos públicos da classe public void calculapesoideal() { switch (sexo) { case 'H': case 'h': pesoideal = 72.7 * altura ; case 'M': case 'm': pesoideal = 62.1 * altura ; default: System.out.println("ERRO: Sexo Inválido"); public double getpesoideal() { return (pesoideal); // métodos privados da classe // métodos estáticos da classe // Programa Principal: ProgPeso.java package progpeso; public class ProgPeso { PesoIdeal pihomem = new PesoIdeal('H', 1.67); PesoIdeal pimulher = new PesoIdeal('m', 1.65); // sexo, altura // sexo, altura pihomem.calculapesoideal(); System.out.printf("Peso Ideal Homem: %.2f\n", pihomem.getpesoideal()); pimulher.calculapesoideal(); System.out.printf("Peso Ideal Mulher: %.2f\n", pimulher.getpesoideal()); ProgValidaCPF // Classe: CPF.java 236
237 package progvalidacpf; public class CPF { // atributos da classe private String cpf; private int digito; // construtor da classe CPF(String cpf) { this.cpf = cpf; // métodos públicos da classe public int verificacpf() { int soma = 0; int x = 10; int n = cpf.length(); for (int i = 0;i < n;i++) { soma = soma + (cpf.charat(i) - 48) * x; // converte char para int x--; // 48 é o código ascii do zero System.out.println("Soma: " + soma); int digito1 = 11 - soma % 11; if (digito1 == 10 digito1 == 11) { digito1 = 0; System.out.println("Digito 1: " + digito1); cpf = cpf + digito1; System.out.println("CPF: " + cpf); soma = 0; x = 11; n = cpf.length(); for (int i = 0;i < n;i++) { soma = soma + (cpf.charat(i) - 48) * x; x--; System.out.println("Soma: " + soma); int digito2 = 11 - soma % 11; if (digito2 == 10 digito2 == 11) { digito2 = 0; System.out.println("Digito 2: " + digito2); digito = digito1 * 10 + digito2; return(digito); // métodos privados da classe // métodos estáticos da classe // Programa Principal: ProgValidaCPF.java package progvalidacpf; public class ProgValidaCPF { String s = " "; 237
238 CPF cpf = new CPF(s); int digitoverificador = cpf.verificacpf(); System.out.printf("Digito verificador: %02d\n", digitoverificador); System.out.printf("CPF: %s-%02d\n", s, digitoverificador); ProgDiaSemana // Classe: DiaSemana.java package progdiasemana; public class DiaSemana { // atributos da classe private int dia; private int mes; private int ano; private String semana; // construtor DiaSemana(int dia, int mes, int ano) { this.dia = dia; this.mes = mes; this.ano = ano; // métodos públicos da classe public void verificadiasemana() { int numerodias = (ano ) * (ano ) / 4 + dia + (mes - 1) * 31 - ((mes * ) / 10) * ((mes + 12) / 15) + ((4 - ano % 4) / 4) * ((mes + 12) / 15); int resto = numerodias % 7; switch (resto) { case 0: semana = "segunda-feira"; case 1: semana = "terça-feira"; case 2: semana = "quarta-feira"; case 3: semana = "quinta-feira"; case 4: semana = "sexta-feira"; case 5: semana = "sábado"; case 7: semana = "domingo"; public void exibediasemana() { System.out.printf("%02d/%02d/%4d é um(a) %s\n", dia, mes, ano, semana); // Programa Principal: ProgDiaSemana.java 238
239 package progdiasemana; public class ProgDiaSemana { DiaSemana dia = new DiaSemana(10, 2, 1962); dia.verificadiasemana(); dia.exibediasemana(); ProgTestData // Classe: Data.java package progtestdata; public class Data { // atributos da classe private int dia; private int mes; private int ano; // construtor da classe // métodos públicos da classe public void setdia(int dia) { if (dia >= 1 && dia <= 31) { this.dia = dia; else { this.dia = 1; System.out.println("ERRO: Dia Inválido"); public void setmes(int mes) { if (mes >= 1 && mes <= 12) { this.mes = mes; else { this.mes = 1; System.out.println("ERRO: Mês Inválido"); public void setano(int ano) { this.ano = ano; public void setdata(int dia, int mes, int ano) { setdia(dia); setmes(mes); setano(ano); public void extenso() { String [] nomemes = {"janeiro", "fevereiro", "março", "abril", "maio", "junho", "julho", "agosto", "setembro", "outubro", 239
240 "novembro", "dezembro"; System.out.printf("Data: %d de %s de %d\n", dia, nomemes[mes - 1], ano); // métodos privados da classe // métodos estáticos da classe // Programa Principal: ProgTestData.java package progtestdata; public class ProgTestData { Data data = new Data(); data.setdata(25, 8, 2014); data.extenso(); ProgVetorSort // Classe: Vetor.java package progvetorsort; public class Vetor { // atributos da classe private int[] vetor; private int n; private final int max; // construtor Vetor(int numeroelementos) { max = numeroelementos; vetor = new int[max]; n = 0; // add public void add(int valor) { if (n < max) { vetor[n] = valor; n++; else { System.out.println("ERRO: Excedeu o Limite do Vetor"); // remove public void del() { if (n > 0) { n--; else { 240
241 System.out.println("ERRO: Vetor Vazio"); // removeelemento public void removeelemento(int valor) { if (n > 0) { for (int i = 0; i < n; i++) { if (valor == vetor[i]) { for (int j = i; j < n - 1; j++) { vetor[j] = vetor[j + 1]; n--; else { System.out.println("ERRO: Vetor Vazio"); // removeposicao public void removeposicao(int posicao) { if (n > 0 && posicao > 0 && posicao < n) { for (int j = posicao; j < n - 1; j++) { vetor[j] = vetor[j + 1]; n--; else { System.out.println("ERRO: Vetor Vazio"); // primeiro public int primeiro() { if (n > 0) { return (vetor[0]); else { return (-1); // ultimo public int ultimo() { if (n > 0) { return (vetor[n - 1]); else { return (-1); // exibe public void exibe() { System.out.print("Vetor: ["); for (int i = 0; i < n - 1; i++) { System.out.print(vetor[i] + " "); System.out.println(vetor[n - 1] + "]"); 241
242 // length public int length() { return (n); // existe public boolean existe(int valor) { for (int i = 0; i < n; i++) { if (vetor[i] == valor) { return (true); return (false); // bubblesort public void bubblesort() { int u = n - 1; boolean trocou; int vezes = 0; do { trocou = false; for (int i = 0; i < u; i++) { if (vetor[i] > vetor[i + 1]) { trocou = true; int temp = vetor[i]; vetor[i] = vetor[i + 1]; vetor[i + 1] = temp; u--; while (trocou); // forcabruta public void forcabruta() { int u = n - 1; for (int i = 0; i < u; i++) { for (int j = i + 1; j <= u; j++) { if (vetor[i] > vetor[j]) { int temp = vetor[i]; vetor[i] = vetor[j]; vetor[j] = temp; // Programa Principal: ProgVetorSort.java package progvetorsort; public class ProgVetorSort { 242
243 Vetor vetor = new Vetor(5); vetor.add(40); vetor.add(20); vetor.add(30); vetor.add(50); vetor.add(10); vetor.exibe(); vetor.add(60); vetor.exibe(); vetor.forcabruta(); vetor.exibe(); vetor.bubblesort(); vetor.exibe(); ProgPessoa // Classe: Pessoa.java package progpessoa; import java.util.date; public class Pessoa { // atributos da classe private String nome; private int ano; private int idade; private char sexo; // construtor // métodos públicos da classe public void setnome(string nome) { this.nome = nome; public void setano(int ano) { this.ano = ano; public void setsexo(char sexo) { this.sexo = sexo; public void setdados(string nome, int ano, char sexo) { setnome(nome); setano(ano); setsexo(sexo); public void calculaidade() { Date date = new Date(); String data = date.tostring(); String [] partes = data.split(" "); int n = partes.length; // carrega a data do sistema // converte para String // parte a data em pedaços // descobre o número de padaços 243
244 int anoatual = Integer.parseInt(partes[n-1]); // pega o último pedaço, aonde está o ano atual idade = anoatual - ano; public void exibepessoa() { System.out.println("Nome: " + nome); System.out.println("Idade: " + idade + " ano(s)"); switch (sexo) { case 'M': case 'm': System.out.println("Sexo: Masculino"); case 'F': case 'f': System.out.println("Sexo: Feminino"); // métodos privados da classe // métodos estátivos da classe // Programa Principal: ProgPessoa.java package progpessoa; public class ProgPessoa { Pessoa p1 = new Pessoa(); Pessoa p2 = new Pessoa(); Pessoa p3 = new Pessoa(); p1.setdados("paulo Roberto", 1962, 'm'); p2.setdados("renato Luis", 1965, 'm'); p3.setdados("francisco Carlos", 1959, 'm'); p1.calculaidade(); p2.calculaidade(); p3.calculaidade(); p1.exibepessoa(); p2.exibepessoa(); p3.exibepessoa(); ProgPessoa2 // Classe: Pessoa.java package progpessoa2; import java.util.date; public class Pessoa { // atributos da classe private String nome; private int ano; private int idade; private char sexo; 244
245 // construtor // métodos públicos da classe public void setnome(string nome) { this.nome = nome; public void setano(int ano) { this.ano = ano; public void setsexo(char sexo) { this.sexo = sexo; public void setdados(string nome, int ano, char sexo) { setnome(nome); setano(ano); setsexo(sexo); public void calculaidade() { Date date = new Date(); String data = date.tostring(); String [] partes = data.split(" "); int n = partes.length; int anoatual = Integer.parseInt(partes[n-1]); idade = anoatual - ano; // carrega a data do sistema // converte para String // parte a data em pedaços // descobre o número de pedaços // pega o último pedaço, aonde está o ano atual public void exibepessoa() { System.out.println("Nome: " + nome); System.out.println("Idade: " + idade + " ano(s)"); switch (sexo) { case 'M': case 'm': System.out.println("Sexo: Masculino"); case 'F': case 'f': System.out.println("Sexo: Feminino"); // métodos privados da classe // métodos estátivos da classe // Programa Principal: ProgPessoa2.java package progpessoa2; public class ProgPessoa2 { Pessoa [] pessoa = new Pessoa[3]; pessoa[0] = new Pessoa(); pessoa[0].setdados("paulo Roberto", 1962, 'm'); 245
246 pessoa[0].calculaidade(); pessoa[0].exibepessoa(); pessoa[1] = new Pessoa(); pessoa[1].setdados("renato Luis", 1960, 'm'); pessoa[1].calculaidade(); pessoa[1].exibepessoa(); pessoa[2] = new Pessoa(); pessoa[2].setdados("francisco Carlos", 1959, 'm'); pessoa[2].calculaidade(); pessoa[2].exibepessoa(); ProgPessoas // Classe: Pessoa.java package progpessoas; public class Pessoa { // atributos da classe private String[] nome; private int[] idade; private int n; private final int max; // construtor Pessoa(int numeropessoas) { this.max = numeropessoas; nome = new String[this.max]; idade = new int[this.max]; this.n = 0; // métodos públicos da classe public void inseredados(string nome, int idade) { if (n < max) { this.nome[n] = nome; this.idade[n] = idade; n++; else { System.out.println("ERRO: Vetor Lotado"); public void exibedados() { System.out.println("Lista de Pessoas"); for (int i = 0; i < n; i++) { System.out.printf("Nome: %-10s Idade: %d\n", nome[i], idade[i]); public void sort() { for (int i = 0; i < n; i++) { for (int j = i + 1; j < n; j++) { if (nome[i].compareto(nome[j]) > 0) { 246
247 String temp = nome[i]; nome[i] = nome[j]; nome[j] = temp; int t = idade[i]; idade[i] = idade[j]; idade[j] = t; // métodos privados da classe // métodos estátivos da classe // Programa Principal: ProgPessoas.java package progpessoas; public class ProgPessoas { Pessoa pessoa = new Pessoa(7); pessoa.inseredados("beatriz", 11); pessoa.inseredados("debora", 13); pessoa.inseredados("fátima", 15); pessoa.inseredados("geni", 16); pessoa.inseredados("carla", 12); pessoa.inseredados("eva", 14); pessoa.inseredados("ana", 10); pessoa.exibedados(); pessoa.sort(); pessoa.exibedados(); ProgAgenda // Classe: Agenda.java package progagenda; public class Agenda { // atributos da classe private String [] nome; private String [] fone; private int n; private final int max; // construtor Agenda(int numeropessoas) { this.max = numeropessoas; nome = new String[this.max]; fone = new String[this.max]; this.n = 0; 247
248 // métodos públicos da classe public void inseretelefone(string nome, String fone) { if (n < max) { this.nome[n] = nome; this.fone[n] = fone; n++; else { System.out.println("ERRO: Agenda Lotada"); public String consultanome(string fone) { String nome; for (int i = 0;i < n;i++) { if (this.fone[i].compareto(fone) == 0) { return(this.nome[i]); return(""); // métodos privados da classe // métodos estáticos da classe // Programa Principal: ProgAgenda.java package progagenda; public class ProgAgenda { Agenda agenda = new Agenda(5); agenda.inseretelefone("ana", " "); agenda.inseretelefone("beatriz", " "); agenda.inseretelefone("carla", " "); agenda.inseretelefone("debora", " "); agenda.inseretelefone("eva", " "); agenda.inseretelefone("fátima", " "); String fone = " "; String nome = agenda.consultanome(fone); if (nome.compareto("")!= 0) { System.out.println("Nome: " + nome + " - Telefone: " + fone); else { System.out.println("ERRO: Usuário não Encontrado"); fone = " "; nome = agenda.consultanome(fone); if (nome.compareto("")!= 0) { System.out.println("Nome: " + nome + " - Telefone: " + fone); else { System.out.println("ERRO: Usuário não Encontrado"); 248
249 Anexo 2.3 Solução da Lista: Interface e Polimorfismo ProgInterface_1 // Programa Principal: ProgInterface_1.java package proginterface_1; public class ProgInterface_1 { Cardeal cardeal = new Cardeal("Cardeal", "Vermelho", "Cinza"); CardealBanhado cardealbanhado = new CardealBanhado("Cardeal Banhado", "Vermelho", "preto"); cardeal.exibenome(); cardeal.exibecores(); cardealbanhado.exibenome(); cardealbanhado.exibecores(); // Interface: Passaro.java package proginterface_1; public interface Passaro { public final int numeropatas = 2; public abstract void exibenome(); public abstract void exibecores(); // Classe: Cardeal.java package proginterface_1; public class Cardeal implements Passaro { // atributos da classe private final String nome; private final String cor_topete; private final String cor_corpo; Cardeal(String nome, String cor_topete, String cor_corpo) { this.nome = nome; this.cor_topete = cor_topete; this.cor_corpo = public void exibenome() { System.out.println("Nome do Pássaro: " + nome); System.out.println("Número de Patas: " + public void exibecores() { System.out.println("Cor do Topete: " + cor_topete); 249
250 System.out.println("Cor do Corpo: " + cor_corpo); // Classe: CardealBanhado.java package proginterface_1; public class CardealBanhado implements Passaro { // atributos da classe private final String nome; private final String cor_topete; private final String cor_corpo; CardealBanhado(String nome, String cor_topete, String cor_corpo) { this.nome = nome; this.cor_topete = cor_topete; this.cor_corpo = public void exibenome() { System.out.println("Nome do Pássaro: " + nome); System.out.println("Número de Patas: " + public void exibecores() { System.out.println("Cor do Topete: " + cor_topete); System.out.println("Cor do Corpo: " + cor_corpo); ProgInterface_2 // Programa Principal: ProgInterface_1.java package proginterface_2; public class ProgInterface_2 { Homem homem = new Homem(); Mulher mulher = new Mulher(); homem.setdados("paulo Roberto", 52, 'm'); mulher.setdados("adriane Maria", 45, 'f'); System.out.println(homem); System.out.println(mulher); // Interface: Pessoa.java package proginterface_2; public interface Pessoa { public abstract void setdados(string nome, int idade, char sexo); 250
251 public abstract String tostring(); // Classe: Homem.java package proginterface_2; public class Homem implements Pessoa { private String nome; private int idade; private char public void setdados(string nome, int idade, char sexo) { setnome(nome); setidade(idade); setsexo(sexo); // sobrecarga do método tostring public String tostring() { return(" Homem: " + nome + " Idade: " + idade + " Sexo: MASCULINO "); private void setnome(string nome) { this.nome = nome; private void setidade(int idade) { this.idade = idade; private void setsexo(char sexo) { this.sexo = sexo; // Classe: Mulher.java package proginterface_2; public class Mulher implements Pessoa { private String nome; private int idade; private char public void setdados(string nome, int idade, char sexo) { setnome(nome); setidade(idade); setsexo(sexo); // sobrecarga do método public String tostring() { return(" Mulher: " + nome + " Idade: " + idade + " Sexo: FEMININO "); 251
252 private void setnome(string nome) { this.nome = nome; private void setidade(int idade) { this.idade = idade; private void setsexo(char sexo) { this.sexo = sexo; ProgInterface_3 // Programa Principal: ProgInterface_1.java package proginterface_3; public class ProgInterface_3 { Pessoa pessoa1 = new Pessoa(); Pessoa pessoa2 = new Pessoa(); pessoa1.set("paulo Roberto"); pessoa1.set(52); pessoa1.set('m'); System.out.println("Pessoa1: " + pessoa1); pessoa2.set("adriane Maria"); pessoa2.set(45); pessoa2.set('f'); System.out.println("Pessoa2: " + pessoa2); // Classe: Pessoa.java package proginterface_3; public class Pessoa { private String nome; private int idade; private char sexo; public void set(string nome) { this.nome = nome; public void set(int idade) { this.idade = idade; public void set(char sexo) { this.sexo = sexo; 252
253 // sobrecarga do método public String tostring() { return(" Nome: " + nome + " Idade: " + idade + " Sexo: " + sexo + " "); Anexo 3.4 Solução da Lista: Herança Herança (Primeiro) // Classe Base: Pessoa.java package progtestapessoa; public class Pessoa { protected String nome; protected String cpf; Pessoa() { this.nome = "xxxx"; this.cpf = "xxx.xxx.xxx-xx"; Pessoa(String nome, String cpf) { this.nome = nome; this.cpf = cpf; public void imprimepessoa() { System.out.println("Nome: " + nome); System.out.println("CPF: " + cpf); // Classe Derivada: Cliente.java package progtestapessoa; public class Cliente extends Pessoa { private double conta; Cliente(String nome, String cpf, double conta) { super(nome, cpf); this.conta = conta; public void imprimecliente() { System.out.println("Conta: " + conta); // Programa Principal: ProgTestaPessoa.java 253
254 package progtestapessoa; public class ProgTestaHeranca { Cliente cliente = new Cliente("Paulo Roberto", " ", ); cliente.imprimepessoa(); cliente.imprimecliente(); Herança (Segundo) // Classe Base: Pessoa.java package progtestahomem; public class Pessoa { protected double altura; protected char sexo; Pessoa() { this.altura = 0.0; this.sexo = 'g'; Pessoa(double altura, char sexo) { this.altura = altura; this.sexo = sexo; public void imprimepessoa() { System.out.println("Altura: " + altura); System.out.println("Sexo: " + sexo); // Classe Derivada: Homem.java package progtestahomem; public class Homem extends Pessoa { // atributos da classe private double pesoideal; // construtor Homem(double altura, char sexo) { super(altura, sexo); // métodos públicos da classe public void calculapesoidealhomem() { pesoideal = 72.7 * altura ; public void imprimepesoidealhomem() { 254
255 System.out.printf("Peso Ideal (Homem): %.2f\n", pesoideal); // métodos privados da classe // métodos estáticos da classe // Classe Derivada: Mulher.java package progtestahomem; public class Mulher extends Pessoa { // atributos da classe private double pesoideal; // construtor Mulher(double altura, char sexo) { super(altura, sexo); // métodos públicos da classe public void calculapesoidealmulher() { pesoideal = 62.1 * altura ; public void imprimepesoidealmulher() { System.out.printf("Peso Ideal (Mulher): %.2f\n", pesoideal); // métodos privados da classe // métodos estáticos da classe // Programa Principal: ProgTestaHomem.java package progtestahomem; public class ProgTestaHomem { Homem homem = new Homem(1.64, 'm'); Mulher mulher = new Mulher(1.59, 'f'); homem.calculapesoidealhomem(); homem.imprimepessoa(); homem.imprimepesoidealhomem(); mulher.calculapesoidealmulher(); mulher.imprimepessoa(); mulher.imprimepesoidealmulher(); Herança (Terceiro) // Classe Base: Objeto.java package progtestaobjetos; public class Objeto { 255
256 protected int x; protected int y; Objeto() { x = 0; y = 0; Objeto(int x, int y) { this.x = x; this.y = y; public void imprimeobjeto(string mensagem) { System.out.println(mensagem + " -> (" + x + "," + y + ")"); // Classe Derivada: Linha.java package progtestaobjetos; public class Linha extends Objeto { private final Objeto p1; private final Objeto p2; Linha (int xi, int yi, int xf, int yf) { p1 = new Objeto(xi, yi); p2 = new Objeto(xf, yf); public void imprimelinha(string mensagem) { System.out.println(mensagem); System.out.println("x: " + p1.x + " y: " + p1.y); p1.imprimeobjeto("p1"); System.out.println("x: " + p2.x + " y: " + p2.y); p2.imprimeobjeto("p2"); // Classe Derivada: Retangulo.java package progtestaobjetos; public class Retangulo extends Objeto { private final Objeto p1; private final Objeto p2; private final Objeto p3; private final Objeto p4; Retangulo (int xi, int yi, int xf, int yf) { p1 = new Objeto(xi, yi); p2 = new Objeto(xf, yi); p3 = new Objeto(xf, yf); p4 = new Objeto(xi, yf); public void imprimeretangulo(string mensagem) { System.out.println(mensagem); 256
257 System.out.println("x: " + p1.x + " y: " + p1.y); p1.imprimeobjeto("p1"); System.out.println("x: " + p2.x + " y: " + p2.y); p2.imprimeobjeto("p2"); System.out.println("x: " + p3.x + " y: " + p3.y); p3.imprimeobjeto("p3"); System.out.println("x: " + p4.x + " y: " + p4.y); p4.imprimeobjeto("p4"); // Programa Principal: ProgTestaObjetos.java package progtestaobjetos; public class ProgTestaObjetos { Linha linha = new Linha(1, 2, 3, 4); Retangulo retangulo = new Retangulo(1, 2, 3, 4); linha.imprimelinha("linha"); retangulo.imprimeretangulo("retângulo"); Anexo 4.4 Solução da Lista: Entrada e Saída Bufferizada ProgBuffer_1 // Programa Principal: ProgBuffer_1.java package progbuffer_1; import java.io.bufferedreader; import java.io.bufferedwriter; import java.io.ioexception; import java.io.inputstreamreader; import java.io.outputstreamwriter; public class ProgBuffer_1 { public static void main(string[] args) throws IOException { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out)); String text = in.readline(); String[] partes = text.split(" "); int n = partes.length; out.write("quantidade de Valores Digitados: " + n); out.newline(); int soma = 0; int maior = 0, menor = 9999; for (int i = 0; i < n; i++) { int t = Integer.parseInt(partes[i]); soma = soma + t; if (t > maior) { maior = t; 257
258 if (t < menor) { menor = t; double media = (double) soma / n; out.write("média: " + media); out.newline(); out.write("maior: " + maior); out.newline(); out.write("menor: " + menor); out.newline(); out.flush(); ProgBuffer_2 // Programa Principal: ProgBuffer_2.java package progbuffer_2; import java.io.bufferedreader; import java.io.bufferedwriter; import java.io.ioexception; import java.io.inputstreamreader; import java.io.outputstreamwriter; import java.util.arrays; public class ProgBuffer_2 { public static void main(string[] args) throws IOException { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out)); String text = in.readline(); int n = Integer.parseInt(text); int[] vetor = new int[n]; text = in.readline(); String[] partes = text.split(" "); int max = partes.length; if (max == n) { for (int i = 0; i < n; i++) { vetor[i] = Integer.parseInt(partes[i]); Arrays.sort(vetor); for (int i = 0; i < n; i++) { out.write(vetor[i] + " "); else { out.write("erro na Entrada dos valores"); out.newline(); out.flush(); 258
259 Anexo Solução da Lista: Vector, ArrayList e LinkedList ProgVector_1 // Programa Principal: ProgVector_1.java package progvector_1; import java.util.arraylist; import java.util.scanner; public class ProgVector_1 { ArrayList letras = new ArrayList(); ArrayList inverso = new ArrayList(); Scanner input = new Scanner(System.in); char letra; do { System.out.print("Letra: "); String s = input.nextline(); letra = s.charat(0); if (letra!= 'F' && letra!= 'f') { letras.add(letra); while (letra!= 'F' && letra!= 'f'); int n = letras.size(); int u = n - 1; for (int i = u;i >= 0;i--) { inverso.add(letras.get(i)); System.out.println(letras); System.out.println(inverso); ProgVector_2 // Programa Base: ProgVector_2.java package progvector_2; import java.util.arraylist; import java.util.scanner; public class ProgVector_2 { ArrayList <Integer> idade = new ArrayList(); Scanner input = new Scanner(System.in); System.out.print("Número de Idades: "); String s = input.nextline(); int n = Integer.parseInt(s); int u = n - 1; for (int i = 0; i <= u; i++) { System.out.print("Idade: "); 259
260 s = input.nextline(); int leidade = Integer.parseInt(s); idade.add(leidade); char ch; do { int antes = 0; System.out.print("Idade para Consulta: "); s = input.nextline(); int idadeconsulta = Integer.parseInt(s); // antes = idades.indexof(idadeconsulta); // Sugestão do Discente: Afrânio Peres da Fonseca for (int i = 0; i < n; i++) { if (idade.get(i)!= idadeconsulta) { antes++; else { System.out.println("Antes: " + antes); int depois = n - antes - 1; System.out.println("Depois: " + depois); do { System.out.print("Continua [S/N]? "); s = input.nextline(); ch = s.charat(0); while (!strchr("ssnn", ch)); while (strchr("ss", ch)); // método estático: strchr static boolean strchr(string s, char ch) { int n = s.length(); for (int i = 0; i < n; i++) { if (s.charat(i) == ch) { return(true); return(false); ProgVector_3 // Programa Base: ProgVector_3.java package progvector_3; import java.util.arraylist; import java.util.scanner; public class ProgVector_3 { ArrayList <Integer> numeros = new ArrayList(); Scanner input = new Scanner(System.in); int lenumero, valor; do { System.out.print("Número: "); 260
261 String s = input.nextline(); lenumero = Integer.parseInt(s); if (lenumero!= 0) { numeros.add(lenumero); while (lenumero!= 0); int n = numeros.size(); int u = n 1; do { System.out.print("Valor: "); String s = input.nextline(); valor = Integer.parseInt(s); /* int posicao = numeros.indexof(valor); if (posicao == -1) { System.out.println("ERRO: Número não encontrado"); else { System.out.println("Posição: " + posicao); */ boolean encontrou = false; if (valor!= 0) { for (int i = 0; i <= u; i++) { if (numeros.get(i) == valor) { System.out.println("Posição no Vetor: " + i); encontrou = true; if (!encontrou) { System.out.println("Erro: Número não encontrado"); while (valor!= 0); ProgVector_4 // Programa Principal: ProgVector_4.java package progvector_4; import java.util.arraylist; import java.util.scanner; public class ProgVector_4 { ArrayList <Character> conceito = new ArrayList(); Scanner input = new Scanner(System.in); char ch; do { System.out.print("Conceito: "); String s = input.nextline(); ch = s.charat(0); if (!strchr("ff", ch)) { if (strchr("aabbccddee", ch)) { 261
262 conceito.add(ch); while (!strchr("ff", ch)); int aprovados = 0, reprovados = 0, infrequentes = 0; int n = conceito.size(); for (int i = 0; i < n; i++) { if (strchr("aabbcc", conceitos.get(i))) { aprovados++; else { if (strchr("dd", conceitos.get(i))) { reprovados++; else { infrequentes++; System.out.println(aprovados + " aprovado(s)"); System.out.println(reprovados + " reprovado(s)"); System.out.println(infrequentes + " infrequente(s)"); // método estático: strchr static boolean strchr(string s, char ch) { int n = s.length(); for (int i = 0; i < n; i++) { if (s.charat(i) == ch) { return (true); return (false); ProgVector_5 // Programa Prinicpal: ProgVector_5.java package progvector_5; import java.util.arraylist; import java.util.scanner; public class ProgVector_5 { ArrayList nomes = new ArrayList(); Scanner input = new Scanner(System.in); String s; char letra; do { System.out.print("Nome: "); s = input.nextline(); if (!s.equals("")) { nomes.add(s); while (!s.equals("")); int n = nomes.size(); 262
263 do { System.out.print("Letra: "); s = input.nextline(); if (s.equals("")) { System.exit(0); letra = s.charat(0); for (int i = 0; i < n; i++) { if (nomes.get(i).tostring().charat(0) == letra) { System.out.println("Nome: " + nomes.get(i).tostring()); while (!s.equals("")); System.out.println("Nomes: " + nomes.tostring()); ProgVector_6 // Programa Principal: ProgVector_6.java package progvector_6; import java.util.arraylist; import java.util.scanner; public class ProgVector_6 { ArrayList <String> nome = new ArrayList<>(); ArrayList <Integer> idade = new ArrayList(); Scanner input = new Scanner(System.in); String s; char ch; do { System.out.print("Nome: "); s = input.nextline(); nome.add(s); System.out.print("Idade: "); s = input.nextline(); int idadedigitada = Integer.parseInt(s); idade.add(idadedigitada); do { System.out.print("Continua [S/N]? "); s = input.nextline(); ch = s.charat(0); while (!strchr("ssnn", ch)); while (strchr("ss", ch)); Object [] nomes = nome.toarray(); Object [] idades = idade.toarray(); int n = nome.size(); int u = n - 1; for (int i = 0; i < u; i++) { for (int j = i+1; j <= u; j++) { if (idades[i].hashcode() < idades[j].hashcode()) { Object temp = nomes[i]; nomes[i] = nomes[j]; nomes[j] = temp; 263
264 Object t = idades[i]; idades[i] = idades[j]; idades[j] = t; for (int i = 0; i <= u; i++) { System.out.printf("%-10s %d\n", nomes[i], idades[i]); // strchr // Testa se um caracter está presente dentro da string public static boolean strchr(string s, char ch) { int n = s.length(); for (int i = 0; i < n; i++) { if (s.charat(i) == ch) { return(true); return(false); ProgVector_7 // Programa Principal: ProgVector_7.java package progvector_7; import java.util.arraylist; import java.util.arrays; import java.util.scanner; public class ProgVector_7 { ArrayList nome = new ArrayList(); Scanner input = new Scanner(System.in); String s; do { System.out.print("Nome: "); s = input.nextline(); if (!s.equals("")) { nome.add(s); while (!s.equals("")); Object [] vetor = nome.toarray(); Arrays.sort(vetor); System.out.println(Arrays.toString(vetor)); ProgVector_8 // Programa Principal: ProgVector_8.java package progvector_8; 264
265 import java.util.arraylist; import java.util.arrays; import java.util.scanner; public class ProgVector_8 { ArrayList <Integer> idade = new ArrayList(); Scanner input = new Scanner(System.in); int leidade; do { System.out.print("Idade: "); String s = input.nextline(); leidade = Integer.parseInt(s); if (leidade!= 0) { idade.add(leidade); while (leidade!= 0); Object [] idades = idade.toarray(); Arrays.sort(idades); System.out.print("Idades Ordenadas: "); int n = idades.length; double soma = 0.0; for (int i = 0; i < n; i++) { System.out.print(idades[i] + " "); soma = soma + idades[i].hashcode(); System.out.println("\nMaior Idade: " + idades[n-1]); System.out.println("Menor Idade: " + idades[0]); double media = soma / n; System.out.println("Média: " + media); ProgVector_9 // Programa Principal: ProgVector_9.java package progvector_9; import java.io.bufferedreader; import java.io.bufferedwriter; import java.io.ioexception; import java.io.inputstreamreader; import java.io.outputstreamwriter; public class ProgVector_9 { public static void main(string[] args) throws IOException { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out)); String text = in.readline(); String [] partes_1 = text.split(" "); int n1 = partes_1.length; for (int i = 0;i < n1;i++) { int t = Integer.parseInt(partes_1[i]); 265
266 text = in.readline(); String [] partes_2 = text.split(" "); int n2 = partes_2.length; for (int i = 0;i < n2;i++) { int t = Integer.parseInt(partes_2[i]); int pontos = 0; for (int i = 0; i < n2; i++) { for (int j = 0; j < n1; j++) { if (partes_2[i].equals(partes_1[j])) { pontos++; out.write(pontos + " ponto(s)"); out.newline(); out.flush(); ProgVector_10 // Programa Principal: ProgVector_10.java package progvector_10; import java.util.arraylist; import java.util.arrays; import java.util.scanner; public class ProgVector_10 { ArrayList megasena = new ArrayList(); Scanner input = new Scanner(System.in); int numeropalpites; do { System.out.print("Número de Palpites para a MegaSena: "); String s = input.nextline(); numeropalpites = Integer.parseInt(s); while (numeropalpites < 0); for (int i = 1; i <= numeropalpites; i++) { int numeroaleatorio = 1 + (int) (Math.random() * 100); megasena.add(numeroaleatorio); for (int j = 1; j <= 5; j++) { numeroaleatorio = 1 + (int) (Math.random() * 100); if (!testarepetido(megasena, numeroaleatorio)) { megasena.add(numeroaleatorio); Object[] temp = megasena.toarray(); Arrays.sort(temp); megasena.removeall(megasena); int n = temp.length; for (int k = 0; k < n; k++) { megasena.add(temp[k]); System.out.println("Palpite para MegaSena é " + megasena.tostring()); 266
267 megasena.removeall(megasena); static boolean testarepetido(arraylist megasena, int valor) { int n = megasena.size(); for (int i = 0; i < n; i++) { if (megasena.get(i).hashcode() == valor) { return(true); return (false); ProgVector_11 // Programa Principal: ProgVector_11.java package progvector_11; import java.util.linkedlist; import java.util.scanner; public class ProgVector_11 { LinkedList lista = new LinkedList(); Scanner input = new Scanner(System.in); char opcao, lado; Object valor; do { do { System.out.print("[I]ncluir, [C]onsultar, [R]emover ou [F]im: "); String s = input.nextline(); opcao = s.charat(0); while (!strchr("iiccrrff", opcao)); if (strchr("ff", opcao)) { System.exit(0); do { System.out.print("[E]squerda ou [D]ireita "); String s = input.nextline(); lado = s.charat(0); while (!strchr("eedd", lado)); switch (opcao) { case 'I': case 'i': System.out.print("Dado: "); String s = input.nextline(); int dado = Integer.parseInt(s); if (dado!= 0) { switch (lado) { case 'E': case 'e': lista.addfirst(dado); 267
268 case 'D': case 'd': lista.addlast(dado); case 'C': case 'c': switch (lado) { case 'E': case 'e': valor = lista.getfirst(); System.out.println("Dado Consultado: " + valor); case 'D': case 'd': valor = lista.getlast(); System.out.println("Dado Consultado: " + valor); case 'R': case 'r': switch (lado) { case 'E': case 'e': if (!lista.isempty()) { valor = lista.removefirst(); System.out.println("Dado Removido à esquerda: " + valor); else { System.out.println("ERRO: Lista Vazia"); case 'D': case 'd': if (!lista.isempty()) { valor = lista.removelast(); System.out.println("Dado Removido à Direita: " + valor); else { System.out.println("ERRO: Lista Vazia"); System.out.println("LinkedList: " + lista); while (true); static boolean strchr(string s, char ch) { int n = s.length(); for (int i = 0; i < n; i++) { if (s.charat(i) == ch) { return (true); return (false); 268
269 ProgVector_12 // Programa Principal: ProgVector_12.java package progvector_12; import java.util.linkedlist; import java.util.scanner; public class ProgVector_12 { LinkedList lista = new LinkedList(); Scanner input = new Scanner(System.in); char opcao, lado; Object valor; int posicao; do { do { System.out.print("[I]ncluir, [C]onsultar, [R]emover ou [F]im: "); String s = input.nextline(); opcao = s.charat(0); while (!strchr("iiccrrff", opcao)); if (strchr("ff", opcao)) { System.exit(0); do { System.out.print("[E]squerda, [P]osição [D]ireita: "); String s = input.nextline(); lado = s.charat(0); while (!strchr("eeppdd", lado)); switch (opcao) { case 'I': case 'i': System.out.print("Dado: "); String s = input.nextline(); int dado = Integer.parseInt(s); if (dado!= 0) { switch (lado) { case 'E': case 'e': lista.addfirst(dado); case 'P': case 'p': System.out.print("Posição: "); s = input.nextline(); posicao = Integer.parseInt(s); int n = lista.size(); if (posicao >= 0 && posicao < n) { lista.add(posicao, dado); else { System.out.println("ERRO: Posição Inválida"); 269
270 case 'D': case 'd': lista.addlast(dado); case 'C': case 'c': switch (lado) { case 'E': case 'e': valor = lista.getfirst(); System.out.println("Dado Consultado: " + valor); case 'P': case 'p': System.out.print("Posição: "); s = input.nextline(); posicao = Integer.parseInt(s); int n = lista.size(); if (posicao >= 0 && posicao < n) { valor = lista.get(posicao); System.out.println("Dado Consultado: " + valor); else { System.out.println("ERRO: Posição Inválida"); case 'D': case 'd': valor = lista.getlast(); System.out.println("Dado Consultado: " + valor); case 'R': case 'r': switch (lado) { case 'E': case 'e': if (!lista.isempty()) { valor = lista.removefirst(); System.out.println("Dado Removido à esquerda: " + valor); else { System.out.println("ERRO: Lista Vazia"); case 'P': case 'p': System.out.print("Posição: "); s = input.nextline(); posicao = Integer.parseInt(s); int n = lista.size(); if (posicao >= 0 && posicao < n) { valor = lista.remove(posicao); System.out.println("Dado Removido da Posição: " + valor); else { System.out.println("ERRO: Posição Inválida"); 270
271 case 'D': case 'd': if (!lista.isempty()) { valor = lista.removelast(); System.out.println("Dado Removido à Direita: " + valor); else { System.out.println("ERRO: Lista Vazia"); System.out.println("LinkedList: " + lista); while (true); // método estático static boolean strchr(string s, char ch) { int n = s.length(); for (int i = 0; i < n; i++) { if (s.charat(i) == ch) { return (true); return (false); ProgVector_13 // Programa Principal: ProgVector_13.java package progvector_13; import java.util.linkedlist; import java.util.scanner; public class ProgVector_13 { LinkedList lista = new LinkedList(); Scanner input = new Scanner(System.in); char opcao, lado = 'E'; Object valor; do { do { System.out.print("[I]ncluir, [E]lemento, [R]emover ou [F]im: "); String s = input.nextline(); opcao = s.charat(0); while (!strchr("iieerrff", opcao)); if (strchr("ff", opcao)) { System.exit(0); if (strchr("iirr", opcao)) { do { System.out.print("[E]squerda ou [D]ireita "); String s = input.nextline(); 271
272 lado = s.charat(0); while (!strchr("eedd", lado)); switch (opcao) { case 'I': case 'i': System.out.print("Dado: "); String s = input.nextline(); int dado = Integer.parseInt(s); if (dado!= 0) { switch (lado) { case 'E': case 'e': lista.addfirst(dado); case 'D': case 'd': lista.addlast(dado); case 'E': case 'e': System.out.print("Elemento a Pesquisar: "); s = input.nextline(); int elemento = Integer.parseInt(s); int indice = lista.indexof(elemento); if (indice - 1 >= 0) { System.out.println("Antecessor: " + lista.get(indice - 1)); else { System.out.println("ERRO: SEM ANTECESSOR"); if (indice + 1 < lista.size()) { System.out.println("Sucessor: " + lista.get(indice + 1)); else { System.out.println("ERRO: SEM SUCESSOR"); case 'R': case 'r': switch (lado) { case 'E': case 'e': if (!lista.isempty()) { valor = lista.removefirst(); System.out.println("Dado Removido à esquerda: " + valor); else { System.out.println("ERRO: Lista Vazia"); case 'D': case 'd': if (!lista.isempty()) { valor = lista.removelast(); System.out.println("Dado Removido à Direita: " + valor); else { System.out.println("ERRO: Lista Vazia"); 272
273 System.out.println("LinkedList: " + lista); while (true); static boolean strchr(string s, char ch) { int n = s.length(); for (int i = 0; i < n; i++) { if (s.charat(i) == ch) { return (true); return (false); ProgVector_14 // Programa Principal: ProgVector_14.java package progvector_14; import java.util.linkedlist; import java.util.scanner; public class ProgVector_14 { LinkedList lista = new LinkedList(); Scanner input = new Scanner(System.in); char opcao, lado = 'E'; Object valor; do { do { System.out.print("[I]ncluir, [E]lemento, [R]emover, [P]esquisar ou [F]im: "); String s = input.nextline(); opcao = s.charat(0); while (!strchr("iieerrppff", opcao)); if (strchr("ff", opcao)) { System.exit(0); if (strchr("iirr", opcao)) { do { System.out.print("[E]squerda ou [D]ireita: "); String s = input.nextline(); lado = s.charat(0); while (!strchr("eedd", lado)); switch (opcao) { case 'I': case 'i': System.out.print("Dado: "); String s = input.nextline(); int dado = Integer.parseInt(s); if (dado!= 0) { 273
274 switch (lado) { case 'E': case 'e': lista.addfirst(dado); case 'D': case 'd': lista.addlast(dado); case 'E': case 'e': System.out.print("Elemento a Pesquisar: "); s = input.nextline(); int elemento = Integer.parseInt(s); int indice = lista.indexof(elemento); if (indice - 1 >= 0) { System.out.println("Antecessor: " + lista.get(indice - 1)); else { System.out.println("ERRO: SEM ANTECESSOR"); if (indice + 1 < lista.size()) { System.out.println("Sucessor: " + lista.get(indice + 1)); else { System.out.println("ERRO: SEM SUCESSOR"); case 'R': case 'r': switch (lado) { case 'E': case 'e': if (!lista.isempty()) { valor = lista.removefirst(); System.out.println("Dado Removido à esquerda: " + valor); else { System.out.println("ERRO: Lista Vazia"); case 'D': case 'd': if (!lista.isempty()) { valor = lista.removelast(); System.out.println("Dado Removido à Direita: " + valor); else { System.out.println("ERRO: Lista Vazia"); case 'P': case 'p': System.out.print("Indice: "); s = input.nextline(); indice = Integer.parseInt(s); if (indice >= 0 && indice < lista.size()) { valor = lista.get(indice); 274
275 System.out.println("Dado Pesquisado pelo Indice: " + valor); else { System.out.println("ERRO: Indice Inexistente"); System.out.print(" Indices: "); for (int i = 0; i < lista.size(); i++) { System.out.printf("%3d ", i); System.out.println("\nLinkedList: " + lista); while (true); static boolean strchr(string s, char ch) { int n = s.length(); for (int i = 0; i < n; i++) { if (s.charat(i) == ch) { return (true); return (false); ProgVector_15 // Programa Principal: ProgVector_15.java package progvector_15; import java.util.arrays; import java.util.linkedlist; import java.util.scanner; public class ProgVector_15 { LinkedList lista = new LinkedList(); Scanner input = new Scanner(System.in); char opcao, lado = 'E'; Object valor; do { do { System.out.print("[I]ncluir, [S]ort, [C]lear All ou [F]im: "); String s = input.nextline(); opcao = s.charat(0); while (!strchr("iissccff", opcao)); if (strchr("ff", opcao)) { System.exit(0); if (strchr("ii", opcao)) { do { System.out.print("[E]squerda ou [D]ireita: "); String s = input.nextline(); lado = s.charat(0); while (!strchr("eedd", lado)); 275
276 switch (opcao) { case 'I': case 'i': System.out.print("Dado: "); String s = input.nextline(); int dado = Integer.parseInt(s); if (dado!= 0) { switch (lado) { case 'E': case 'e': lista.addfirst(dado); case 'D': case 'd': lista.addlast(dado); case 'S': case 's': Object[] objetos = lista.toarray(); Arrays.sort(objetos); lista.clear(); for (int i = 0; i < objetos.length; i++) { lista.add(objetos[i]); case 'C': case 'c': lista.clear(); System.out.print(" Indices: "); for (int i = 0; i < lista.size(); i++) { System.out.printf("%3d ", i); System.out.println("\nLinkedList: " + lista); while (true); // método estático static boolean strchr(string s, char ch) { int n = s.length(); for (int i = 0; i < n; i++) { if (s.charat(i) == ch) { return (true); return (false); ProgVector_16 // Programa Principal: ProgVector_16.java package progvector_16; 276
277 import java.util.arraylist; import java.util.scanner; public class ProgVector_16 { ArrayList<Integer> array = new ArrayList(); Scanner input = new Scanner(System.in); Integer info = 999; do { System.out.print("Info: "); String s = input.nextline(); if (!s.equals("")) { if (info == 999) { array.add(integer.parseint(s)); info++; else { info = Integer.parseInt(s); if (info!= 0) { int posicao = verificaposicao(array, info); if (posicao!= -1) { array.add(posicao, info); else { System.out.println("ERRO: Informação Repetida"); System.out.println("ArrayList: " + array); while (info!= 0); // método estático public static int verificaposicao(arraylist array, Integer info) { int posicao = -1; int n = array.size(); for (int i = 0; i < n; i++) { if (info == array.get(i).hashcode()) { // elimina informação repetida return (-1); if (info < array.get(i).hashcode()) { // localiza posição da informação menor return (i); if (info > array.get(i).hashcode()) { // localiza posição da informação maior posicao = i + 1; return (posicao); 277
278 Anexo Solução da Lista: Strings ProgString_1 // Programa Principal: ProgString_1.java package progstring_1; import java.util.scanner; public class ProgString_1 { Scanner input = new Scanner(System.in); int vogais = 0, consoantes, espacos = 0; int maiusculas = 0, minusculas; System.out.print("Nome: "); String nome = input.nextline(); int totalletras = nome.length(); for (int i = 0;i < totalletras;i++) { if ("AaEeIiOoUu".indexOf(nome.charAt(i))!= -1) { vogais++; if (nome.charat(i) == 32) { // 32 é o ' ' (espaço em branco) espacos++; if (nome.charat(i) >= 'A' && nome.charat(i) <= 'Z') { maiusculas++; System.out.printf("(%d) Vogal(is)\n", vogais); consoantes = totalletras - vogais - espacos; System.out.printf("(%d) Consoante(s)\n", consoantes); System.out.printf("(%d) Maúscula(s)\n", maiusculas); minusculas = totalletras - maiusculas - espacos; System.out.printf("(%d) Minúscula(s)\n", minusculas); ProgString_2 // Programa Principal: ProgString_2.java package progstring_2; import java.util.scanner; public class ProgString_2 { Scanner input = new Scanner(System.in); char digito; do { int contaletras = 0; System.out.print("Palavra: "); 278
279 String palavra = input.nextline(); System.out.print("Letra: "); String s = input.nextline(); char letra = s.charat(0); int n = palavra.length(); for (int i = 0; i < n; i++) { if (palavra.charat(i) == letra) { contaletras++; if (contaletras == 0) { System.out.println("ERRO: Não existe a letra " + letra + " na palavra (" + palavra + ")"); else { System.out.println(contaLetras + " letra(s)"); do { System.out.print("Continua [S]im ou [N]ão? "); s = input.nextline(); digito = s.charat(0); while ("SsNn".indexOf(digito) == -1); while ("Ss".indexOf(digito)!= -1); ProgString_3 // Programa Principal: ProgString_3.java package progstring_3; import java.util.scanner; public class ProgString_3 { Scanner input = new Scanner(System.in); char antecessora = 'X', sucessora = 'Y'; System.out.print("Palavra: "); String palavra = input.nextline(); System.out.print("Posição: "); String s = input.nextline(); int posicao = Integer.parseInt(s); int n = palavra.length(); if (posicao < 0 posicao > n) { System.out.println("Erro: Posição Inválida"); else { if (posicao == 0) { System.out.println("Erro: Sem Antecessora"); else { antecessora = palavra.charat(posicao - 1); if (posicao == n - 1) { System.out.println("Erro: Sem Sucessora"); else { sucessora = palavra.charat(posicao + 1); System.out.println("Antecessora: " + antecessora); 279
280 System.out.println("Letra: " + palavra.charat(posicao)); System.out.println("Sucessora: " + sucessora); ProgString_4 // Programa Principal: ProgString_4.java package progstring_4; import java.util.scanner; public class ProgString_4 { Scanner input = new Scanner(System.in); System.out.print("Nome: "); String nome = input.nextline(); String [] partes = nome.split(" "); int n = partes.length; // número de palavras da String int u = n - 1; // último elemento da String for (int i = u;i >= 0;i--) { System.out.println(partes[i]); ProgString_5 // Programa Principal: ProgString_5.java package progstring_5; import java.util.scanner; public class ProgString_5 { Scanner input = new Scanner(System.in); System.out.print("Nome: "); String nome = input.nextline(); String[] partes = nome.split(" "); int n = partes.length; int u = n - 1; System.out.println(partes[u].toUpperCase()); ProgString_6 // Programa Principal: ProgString_6.java package progstring_6; 280
281 import java.util.scanner; public class ProgString_6 { Scanner input = new Scanner(System.in); System.out.print("Nome: "); String nome = input.nextline(); nome = corrigenome(nome); System.out.println("Nome corrigido: " + nome); String[] partes = nome.split(" "); int n = partes.length; System.out.print(partes[n - 1] + ", " + partes[0] + " "); for (int i = 1;i < n-1;i++) { System.out.print(partes[i].charAt(0) + ". "); System.out.println(); static String corrigenome(string nome) { nome = nome.tolowercase(); int n = nome.length(); String temp = ""; temp = temp + Character.toUpperCase(nome.charAt(0)); for (int i = 1; i < n; i++) { if (nome.charat(i) == 32) { temp = temp + " " + Character.toUpperCase(nome.charAt(i + 1)); i++; else { temp = temp + nome.charat(i); return (temp); ProgString_7 // Programa Principal: ProgString_7.java package progstring_7; import java.util.scanner; public class ProgString_7 { Scanner input = new Scanner(System.in); System.out.print("Estado: "); String estado = input.nextline(); estado = convertestring(estado); System.out.println("Estado corrigido: " + estado); String [] partes = estado.split(" "); int n = partes.length; if (n >= 2) { 281
282 System.out.println("Sigla: " + partes[0].charat(0) + partes[n-1].charat(0)); static String convertestring(string s) { String temp = ""; s = s.tolowercase(); temp = temp + Character.toUpperCase(s.charAt(0)); int n = s.length(); for (int i = 1;i < n;i++) { if (s.charat(i) == 32) { temp = temp + " " + Character.toUpperCase(s.charAt(i+1)); i++; else { temp = temp + s.charat(i); return(temp); ProgString_8 // Programa Principal: ProgString_8.java package progstring_8; import java.util.scanner; public class ProgString_8 { Scanner input = new Scanner(System.in); System.out.print("Palavra: "); String palavra = input.nextline(); int n = palavra.length(); System.out.print("Início: "); String s = input.nextline(); int inicio = Integer.parseInt(s); if (inicio < 0) { System.out.println("ERRO: Início Inválido"); System.exit(0); System.out.print("Fim: "); s = input.nextline(); int fim = Integer.parseInt(s); if (fim >= n) { System.out.println("ERRO: Fim Inválido"); System.exit(0); if (fim < inicio) { int temp = inicio; inicio = fim; fim = temp; for (int i = inicio;i <= fim;i++) { System.out.print(palavra.charAt(i)); 282
283 System.out.println(); Anexo 6.4 Solução da Lista: Listas Lineares ProgLista_1 // Programa Principal: ProgLista_1.java package proglista_1; import java.util.scanner; import java.util.stack; public class ProgLista_1 { Stack pilha = new Stack(); Scanner input = new Scanner(System.in); String s; do { System.out.print("Nome: "); s = input.nextline(); while (s.equals("")); String [] partes = s.split(" "); int n = partes.length; for (int i = 0;i < n;i++) { pilha.push(partes[i].charat(0)); int totalletras = 0; System.out.print("Abreviatura: "); do { Character letra = (Character) pilha.pop(); System.out.print(letra); totalletras++; while (!pilha.empty()); System.out.println(); System.out.println("Pilha: " + pilha.tostring()); System.out.println("Total de Letras: " + totalletras); // cast ProgLista_2 // Programa Principal: ProgLista_2.java package proglista_2; import java.util.linkedlist; import java.util.queue; import java.util.scanner; public class ProgLista_2 { 283
284 Queue fila = new LinkedList(); Scanner input = new Scanner(System.in); int espacos = 0; String s; do { System.out.print("Nome: "); s = input.nextline(); while (s.equals("")); int n = s.length(); for (int i = 0; i < n; i++) { if (s.charat(i)!= 32) { fila.offer(s.charat(i)); // insere na Fila else { espacos++; System.out.print("Nome Modificado: "); do { Character letra = (Character) fila.poll(); // remove da fila - cast System.out.print(letra); while (!fila.isempty()); System.out.println(); System.out.println("Número de Espaços Eliminados: " + espacos); ProgLista_3 // Programa Principal: ProgLista_3.java package proglista_3; import java.util.scanner; import java.util.stack; public class ProgLista_3 { Stack pilha = new Stack(); Scanner input = new Scanner(System.in); String nome; int homens = 0, mulheres = 0, indeterminados = 0; do { System.out.print("Nome: "); nome = input.nextline(); if (nome.compareto("")!= 0) { int n = nome.length(); int u = n - 1; switch (nome.charat(u)) { case 'A': case 'a': pilha.push('f'); mulheres++; case 'O': case 'o': 284
285 pilha.push('m'); homens++; default: pilha.push('i'); indeterminados++; while (nome.compareto("")!= 0); System.out.println("Pilha: " + pilha.tostring()); System.out.println(homens + " homens"); System.out.println(mulheres + " mulheres"); System.out.println(indeterminados + " indeterminados"); ProgLista_4 // Programa Principal: ProgLista_4.java package proglista_4; import java.util.arrays; import java.util.linkedlist; import java.util.queue; import java.util.scanner; public class ProgLista_4 { Queue fila = new LinkedList(); Scanner input = new Scanner(System.in); String nome; do { System.out.print("Nome: "); nome = input.nextline(); if (!nome.equals("")) { fila.offer(nome); while (!nome.equals("")); Object [] temp = fila.toarray(); Arrays.sort(temp); System.out.println("Fila: " + Arrays.toString(temp)); ProgLista_5 // Programa Principal: ProgLista_5.java package proglista_5; import java.util.linkedlist; import java.util.queue; import java.util.scanner; public class ProgLista_5 { 285
286 Queue fila = new LinkedList(); Scanner input = new Scanner(System.in); Integer valor, quantidade; do { System.out.print("Valor: "); String s = input.nextline(); valor = Integer.parseInt(s); if (valor!= 0) { System.out.print("Quantidade: "); s = input.nextline(); quantidade = Integer.parseInt(s); fila.offer(valor); fila.offer(quantidade); while (valor!= 0); int totalimpresso = 0; System.out.println("Fila: " + fila.tostring()); do { valor = (Integer) fila.poll(); // cast quantidade = (Integer) fila.poll(); // cast for (int i = 1;i <= quantidade;i++) { System.out.print(valor + " "); totalimpresso++; while (!fila.isempty()); System.out.println(); System.out.println("Total de Valores Impressos: " + totalimpresso); ProgLista_6 // Programa Principal: ProgLista_6.java package proglista_6; import java.util.scanner; import java.util.stack; public class ProgLista_6 { Stack pilha = new Stack(); Scanner input = new Scanner(System.in); String nome; do { System.out.print("Nome: "); nome = input.nextline(); if (!nome.equals("")) { int n = nome.length(); pilha.push(n); while (!nome.equals("")); System.out.println("Pilha: " + pilha.tostring()); if (!pilha.isempty()) { 286
287 int i = 0; int totalcaracteres = 0, totalnomes = 0; do { Integer tamanho = (Integer) pilha.pop(); totalcaracteres = totalcaracteres + tamanho; totalnomes++; while (!pilha.empty()); System.out.println("Total de Caracteres: " + totalcaracteres + " letra(s)"); System.out.println("Total de Nomes: " + totalnomes); System.out.println("Pilha: " + pilha.tostring()); ProgLista_7 // Programa Principal: ProgLista_7.java package proglista_7; import java.util.linkedlist; import java.util.queue; import java.util.scanner; import java.util.stack; public class ProgLista_7 { Stack pilha = new Stack(); Queue fila = new LinkedList(); Scanner input = new Scanner(System.in); System.out.print("Nome: "); String nome = input.nextline(); int n = nome.length(); for (int i = 0; i < n; i++) { if (strchr("aaeeiioouu", nome.charat(i))) { pilha.push(nome.charat(i)); else { if (nome.charat(i)!= 32) { fila.offer(nome.charat(i)); System.out.println("Fila: " + fila.tostring()); System.out.println("Pilha: " + pilha.tostring()); static boolean strchr(string s, char ch) { int n = s.length(); for (int i = 0; i < n; i++) { if (s.charat(i) == ch) { return (true); return (false); 287
288 6.4.8 ProgLista_8 // Programa Principal: ProgLista_8.java package proglista_8; import java.util.scanner; import java.util.stack; public class Lista_8 { Stack pilha = new Stack(); Scanner input = new Scanner(System.in); System.out.print("Nome: "); String nome = input.nextline(); int n = nome.length(); for (int i = 0;i < n;i++) { pilha.push(nome.charat(i)); System.out.print("Nome Invertido: "); do { Character letra = (Character) pilha.pop(); System.out.printf("%c", letra); while (!pilha.empty()); System.out.println(); ProgLista_9 // Programa Principal: ProgLista_9.java package proglista_9; import java.util.linkedlist; import java.util.queue; import java.util.scanner; import java.util.stack; public class ProgLista_9 { Stack pilha = new Stack(); Queue fila = new LinkedList(); Scanner input = new Scanner(System.in); System.out.print("Nome: "); String nome = input.nextline(); int n = nome.length(); for (int i = 0;i < n;i++) { if (strchr("aaeeiioouu", nome.charat(i))) { pilha.push(nome.charat(i)); else { if (nome.charat(i)!= 32) { fila.offer(nome.charat(i)); 288
289 System.out.println("Fila: " + fila.tostring()); int consoantes = 0; do { fila.poll(); consoantes++; while (!fila.isempty()); System.out.println("Total de Consoantes: " + consoantes); System.out.println("Fila: " + fila.tostring()); System.out.println("Pilha: " + pilha.tostring()); int vogais = 0; do { pilha.pop(); vogais++; while (!pilha.empty()); System.out.println("Total de Vogais: " + vogais); System.out.println("Pilha: " + pilha.tostring()); System.out.println("Total de Letras: " + (consoantes + vogais)); static boolean strchr(string s, char ch) { int n = s.length(); for (int i = 0;i < n;i++) { if (s.charat(i) == ch) { return(true); return(false); ProgLista_10 // Programa Principal: ProgLista_10.java package proglista_10; import java.util.linkedlist; import java.util.queue; import java.util.scanner; import java.util.stack; public class ProgLista_10 { Stack pilha = new Stack(); Queue fila = new LinkedList(); Scanner input = new Scanner(System.in); System.out.print("Nome: "); String nome = input.nextline(); String [] partes = nome.split(" "); int n = partes.length; for (int i = 0;i < n;i++) { fila.offer(partes[i]); pilha.push(partes[i].charat(0)); System.out.println("Fila: " + fila.tostring()); System.out.println("Pilha: " + pilha.tostring()); 289
290 ProgLista_11 // Programa Principal: ProgLista_11.java package proglista_11; import java.util.arrays; import java.util.scanner; import java.util.stack; public class ProgLista_11 { Stack p1 = new Stack(); Stack p2 = new Stack(); Scanner input = new Scanner(System.in); int valor; do { System.out.print("Valor: "); String s = input.nextline(); valor = Integer.parseInt(s); if (valor!= 0) { p1.push(valor); p2.push(valor * 2); while (valor!= 0); System.out.println("p1: " + p1.tostring()); System.out.println("p2: " + p2.tostring()); int n = p1.size(); Integer [] vetor = new Integer[n * 2]; int i; for (i = 0;i < n;i++) { vetor[i] = (Integer) p1.pop(); int j; for (j = i;j < n * 2;j++) { vetor[j] = (Integer) p2.pop(); Arrays.sort(vetor); System.out.print("Pilhas: "); for (i = 0;i < n*2;i++) { System.out.print(vetor[i] + " "); System.out.println(); ProgLista_12 // Programa Principal: ProgLista_12.java package proglista_12; import java.util.linkedlist; import java.util.queue; 290
291 import java.util.scanner; public class ProgLista_12 { Queue f1 = new LinkedList(); Queue f2 = new LinkedList(); Scanner input = new Scanner(System.in); int maior = 0, menor = 999; Integer valor; do { System.out.print("Valor: "); String s = input.nextline(); valor = Integer.parseInt(s); if (valor!= 0) { f1.offer(valor); if (valor > maior) { maior = valor; if (valor < menor) { menor = valor; while (valor!= 0); do { valor = (Integer) f1.poll() * 3; f2.offer(valor); if (valor > maior) { maior = valor; if (valor < menor) { menor = valor; while (!f1.isempty()); System.out.println("f1: " + f1.tostring()); System.out.println("f2: " + f2.tostring()); System.out.println("Maior: " + maior); System.out.println("Menor: " + menor); ProgLista_13 // Programa Principal: ProgLista_13.java package proglista_13; import java.util.scanner; import java.util.stack; public class ProgLista_13 { Stack pilha = new Stack(); Scanner input = new Scanner(System.in); System.out.print("Palavra: "); String palavra = input.nextline(); 291
292 int n = palavra.length(); for (int i = 0;i < n;i++) { pilha.push(palavra.charat(i)); int totalletras = 0; System.out.print("Palavra Invertida: "); do { Character letra = (Character) pilha.pop(); System.out.print(letra); totalletras++; while (!pilha.empty()); System.out.println(); System.out.println("Total de Letras: " + totalletras); ProgLista_14 // Programa Principal: ProgLista_14.java package proglista_14; import java.util.linkedlist; import java.util.queue; import java.util.scanner; public class ProgLista_14 { Queue fila = new LinkedList(); Scanner input = new Scanner(System.in); do { System.out.print("Valor Inicial: "); String s = input.nextline(); int valorinicial = Integer.parseInt(s); if (valorinicial == 0) { System.exit(0); System.out.print("Valor Final: "); s = input.nextline(); int valorfinal = Integer.parseInt(s); System.out.print("Intervalo: "); s = input.nextline(); int intervalo = Integer.parseInt(s); if (valorinicial < valorfinal) { for (int i = valorinicial; i <= valorfinal; i = i + intervalo) { fila.offer(i); else { for (int i = valorinicial; i >= valorfinal; i = i - intervalo) { fila.offer(i); System.out.println("Fila: " + fila.tostring()); while (true); 292
293 ProgLista_15 // Programa Principal: ProgLista_15.java package proglista_15; import java.util.linkedlist; import java.util.queue; import java.util.scanner; import java.util.stack; public class ProgLista_15 { Stack pilha = new Stack(); Queue fila = new LinkedList(); Scanner input = new Scanner(System.in); Integer nodo = 0; do { System.out.print("Nodo: "); String s = input.nextline(); if (!s.equals("")) { nodo = Integer.parseInt(s); if (nodo!= 0) { pilha.push(nodo); fila.offer(nodo * 2); while (nodo!= 0); int n = pilha.size(); if (n > 0) { System.out.println("Pilha: " + pilha); System.out.println("Topo da Pilha: " + pilha.lastelement()); System.out.println("Base da Pilha: " + pilha.firstelement()); System.out.println("Número de Elementos da Pilha: " + pilha.size()); System.out.println("\nFila: " + fila); System.out.println("Primeiro Elemento da Fila: " + fila.peek()); System.out.println("Número de Elementos da Fila: " + fila.size()); else { System.out.println("Pilha: " + pilha); System.out.println("Fila: " + fila); Anexo 7.2 Solução da Lista: Mapas ProgMap_1 // Programa Principal: ProgMap_1.java package progmap_1; import java.util.arrays; import java.util.linkedhashmap; 293
294 public class ProgMap_1 { LinkedHashMap pessoa = new LinkedHashMap(); pessoa.put(2, "Carla"); pessoa.put(4, "Eva"); pessoa.put(0, "Ana"); pessoa.put(1, "Beatriz"); pessoa.put(3, "Debora"); for (Object key : pessoa.keyset()) { System.out.printf("%-7s -> (%d)\n", pessoa.get(key), key); int n = pessoa.size(); String[] partes = new String[n]; String s = ""; for (int i = 0; i < partes.length; i++) { partes[i] = pessoa.get(i).tostring(); Arrays.sort(partes); System.out.print("Mapa: "); for (String parte : partes) { System.out.print(parte + " "); System.out.println(); ProgMap_2 // Programa Principal: ProgMap_2.java package progmap_2; import java.util.treemap; public class ProgMap_2 { TreeMap<String, Integer> alunos = new TreeMap<>(); alunos.put("carla", 67); alunos.put("debora", 68); alunos.put("beatriz", 66); alunos.put("ana", 65); for (String key : alunos.keyset()) { System.out.printf("%-7s -> %c\n",key, alunos.get(key)); System.out.println("keySet: " + alunos.keyset()); alunos.clear(); ProgMap_3 // Programa Principal: ProgMap_3.java package progmap_3; 294
295 import java.util.hashmap; import java.util.map; public class ProgMap_3 { Map<Integer, String> mapa = new HashMap<>(); mapa.put(5, "Eva"); mapa.put(2, "Beatriz"); mapa.put(3, "Carla"); mapa.put(1, "Ana"); mapa.put(4, "Debora"); int n = mapa.size(); for (int i = 1; i <= n; i++) { System.out.printf("Chave: %d Pessoa: %-7s Bytes: %d\n", i, mapa.get(i), mapa.get(i).length()); ProgMap_4 // Programa Principal: ProgMap_4.java package progmap_4; import java.util.hashtable; public class ProgMap_4 { Hashtable pessoa = new Hashtable(); pessoa.put(20, "Beatriz"); // chave, valor pessoa.put(30, "Carla"); // chave, valor pessoa.put(10, "Ana"); // chave, valor System.out.println("Tamanho da Hashtable: " + pessoa.size()); System.out.println("Chaves: " + pessoa.keyset()); System.out.println("Valor: " + pessoa.values()); ProgMap_5 // Programa Principal: ProgMap_5.java package progmap_5; import java.util.hashmap; import java.util.map; public class ProgMap_5 { Map<String, String> mapa = new HashMap<>(); mapa.put("e", "Eva"); mapa.put("b", "Beatriz"); mapa.put("c", "Carla"); 295
296 mapa.put("a", "Ana"); mapa.put("d", "Debora"); System.out.println("Número de Elementos do Mapa: " + mapa.size()); System.out.println("Mapa: " + mapa); System.out.println("Chaves: " + mapa.keyset()); System.out.println("Valores: " + mapa.values()); Anexo 8.6 Solução da Lista: Arquivos (File) ProgFile_1 // Programa Principal: ProgFile_1.java package progfile_1; import java.io.bufferedreader; import java.io.filereader; import java.io.ioexception; import java.util.scanner; public class ProgFile_1 { Scanner input = new Scanner(System.in); String linha; System.out.print("Nome do Arquivo Texto: "); String nomearquivo = input.nextline(); try { long bytes; int linhas; int brancas; try (FileReader arqtexto = new FileReader(nomeArquivo); BufferedReader leitor = new BufferedReader(arqTexto)) { bytes = 0; linhas = 0; brancas = 0; while ((linha = leitor.readline())!= null) { System.out.println(linha); bytes = bytes + linha.length(); linhas++; if ("".equals(linha)) { brancas++; arqtexto.close(); System.out.println("(" + bytes + ") Bytes"); System.out.println("(" + linhas + ") Linhas"); System.out.println("(" + brancas + ") Brancas"); catch (IOException e) { System.out.println("Erro: Problema com o Arquivo"); 296
297 8.6.2 ProgFile_2 // Programa Principal: ProgFile_2.java package progfile_2; import java.io.bufferedreader; import java.io.filereader; import java.io.ioexception; import java.util.scanner; public class ProgFile_2 { Scanner input = new Scanner(System.in); String linha; System.out.print("Nome do Arquivo Texto: "); String nomearquivo = input.nextline(); try { int nl; do { try (FileReader arqtexto = new FileReader(nomeArquivo); BufferedReader leitor = new BufferedReader(arqTexto)) { boolean encontroulinha = false; System.out.print("Linha: "); String s = input.nextline(); nl = Integer.parseInt(s); int linhas = 0; while ((linha = leitor.readline())!= null) { linhas++; if (nl == linhas) { System.out.println(nl + ": " + linha); encontroulinha = true; if (!encontroulinha && nl!= 0) { System.out.println("ERRO: Linha não existe"); if (nl == 0) { arqtexto.close(); while (nl!= 0); catch (IOException e) { System.out.println("Erro: Problema com o Arquivo"); ProgFile_3 // Programa Principal: ProgFile_3.java package progfile_3; import java.io.bufferedreader; 297
298 import java.io.filereader; import java.io.filewriter; import java.io.ioexception; import java.util.scanner; public class ProgFile_3 { Scanner input = new Scanner(System.in); String linha; System.out.print("Arquivo Origem: "); String arquivoorigem = input.nextline(); System.out.print("Arquivo Destino: "); String arquivodestino = input.nextline(); long bytes = 0; try { FileWriter arqdestino; try (FileReader arqorigem = new FileReader(arquivoOrigem); BufferedReader leitor = new BufferedReader(arqOrigem)) { arqdestino = new FileWriter(arquivoDestino); while ((linha = leitor.readline())!= null) { bytes = bytes + linha.length(); arqdestino.write(linha + "\n"); System.out.println("(" + bytes + ") Bytes copiados"); arqorigem.close(); arqdestino.close(); catch (IOException e) { System.out.println("Erro: Problema com o Arquivo Origem"); ProgFile_4 // Programa Principal: ProgFile_4.java package progfile_4; import java.io.bufferedreader; import java.io.filereader; import java.io.filewriter; import java.io.ioexception; import java.util.scanner; public class ProgFile_4 { Scanner input = new Scanner(System.in); String linha; System.out.print("Arquivo Origem: "); String arquivoorigem = input.nextline(); System.out.print("Arquivo Destino: "); String arquivodestino = input.nextline(); System.out.print("[+] Maiúsculo ou [-] Minúsculo: "); String s = input.nextline(); 298
299 char tipo = s.charat(0); long bytes = 0; try { FileWriter arqdestino; try (FileReader arqorigem = new FileReader(arquivoOrigem); BufferedReader leitor = new BufferedReader(arqOrigem)) { arqdestino = new FileWriter(arquivoDestino); while ((linha = leitor.readline())!= null) { bytes = bytes + linha.length(); if (tipo == '+') { arqdestino.write(linha.touppercase() + "\n"); else { arqdestino.write(linha.tolowercase() + "\n"); System.out.println("(" + bytes + ") Bytes copiados"); arqorigem.close(); arqdestino.close(); catch (IOException e) { System.out.println("Erro: Problema com o Arquivo Origem"); ProgFile_5 // Programa Principal: ProgFile_5.java package progfile_5; import java.io.bufferedreader; import java.io.filereader; import java.io.ioexception; import java.util.scanner; public class ProgFile_5 { Scanner input = new Scanner(System.in); String linha; boolean existe = false; System.out.print("Nome do Arquivo Texto: "); String nomearquivo = input.nextline(); System.out.print("Palavra: "); String palavra = input.nextline(); try { try (FileReader arqtexto = new FileReader(nomeArquivo); BufferedReader leitor = new BufferedReader(arqTexto)) { int line = 1; while ((linha = leitor.readline())!= null) { if (linha.contains(palavra)) { System.out.println(line + ": " + linha); existe = true; line++; arqtexto.close(); 299
300 if (!existe) { System.out.println("Erro: Palavra não existe"); catch (IOException e) { System.out.println("Erro: Problema com o Arquivo"); ProgFile_6 // Programa Principal: ProgFile_6.java package progfile_6; import java.io.bufferedreader; import java.io.filereader; import java.io.ioexception; import java.util.scanner; public class ProgFile_6 { Scanner input = new Scanner(System.in); String linha; System.out.print("Nome do Arquivo Texto: "); String nomearquivo = input.nextline(); try { int nli, nlf; try (FileReader arqtexto = new FileReader(nomeArquivo); BufferedReader leitor = new BufferedReader(arqTexto)) { boolean encontroulinha = false; System.out.print("Número inicial: "); String s = input.nextline(); nli = Integer.parseInt(s); System.out.print("Número final: "); s = input.nextline(); nlf = Integer.parseInt(s); if (nli > nlf) { int temp = nli; nli = nlf; nlf = temp; int line = 1; while ((linha = leitor.readline())!= null) { if (line >= nli && line <= nlf) { System.out.println(line + ": " + linha); encontroulinha = true; line++; arqtexto.close(); if (!encontroulinha) { 300
301 System.out.println("ERRO: Linha não existe"); catch (IOException e) { System.out.println("Erro: Problema com o Arquivo"); ProgFile_7 // Programa Principal: ProgFile_7.java package progfile_7; import java.io.filewriter; import java.io.ioexception; import java.util.scanner; public class ProgFile_7 { Scanner input = new Scanner(System.in); String palavra; System.out.print("Nome do Arquivo Texto: "); String nomearquivo = input.nextline(); try { try (FileWriter arqtexto = new FileWriter(nomeArquivo)) { do { System.out.print("Palavra: "); palavra = input.nextline(); if (!"".equals(palavra)) { arqtexto.write(palavra + "\n"); while (!"".equals(palavra)); arqtexto.close(); catch (IOException e) { System.out.println("Erro: Problema com o Arquivo"); ProgFile_8 // Programa Principal: ProgFile_8.java package progfile_8; import java.io.bufferedreader; import java.io.filereader; import java.io.ioexception; import java.util.scanner; public class ProgFile_8 { 301
302 Scanner input = new Scanner(System.in); String linha; System.out.print("Nome do Arquivo Texto: "); String nomearquivo = input.nextline(); try { try (FileReader arqtexto = new FileReader(nomeArquivo); BufferedReader leitor = new BufferedReader(arqTexto)) { while ((linha = leitor.readline())!= null) { System.out.println(linha); arqtexto.close(); catch (IOException e) { System.out.println("Erro: Problema com o Arquivo"); ProgFile_9 // Programa Principal: ProgFile_9.java package progfile_9; import java.io.filewriter; import java.io.ioexception; import java.io.randomaccessfile; import java.util.scanner; public class ProgFile_9 { Scanner input = new Scanner(System.in); String linha; System.out.print("Nome do Arquivo Texto Origem: "); String arqorigem = input.nextline(); System.out.print("Nome do Arquivo Texto Destino: "); String arqdestino = input.nextline(); try { FileWriter destino; try (RandomAccessFile origem = new RandomAccessFile(arqOrigem, "r")) { destino = new FileWriter(arqDestino); int numerolinhas = 0; while (origem.readline()!= null) { numerolinhas++; origem.seek(0); // volta ao início do arquivo String[] nome = new String[numeroLinhas]; int n = 0; while ((linha = origem.readline())!= null) { nome[n] = linha; n++; sort(numerolinhas, nome); origem.seek(0); 302
303 for (int i = 0; i < numerolinhas; i++) { destino.write(nome[i] + "\n"); origem.close(); destino.close(); System.out.println("Ok, arquivo ordenado e copiado"); catch (IOException e) { System.out.println("Erro: Problema com o Arquivo"); static void sort(int n, String[] nome) { for (int i = 0; i < n - 1; i++) { for (int j = i + 1; j < n; j++) { if (nome[i].compareto(nome[j]) > 0) { String temp = nome[i]; nome[i] = nome[j]; nome[j] = temp; ProgFile_10 // Programa Principal: ProgFile_10.java package progfile_10; import java.io.file; import java.io.filewriter; import java.util.scanner; public class ProgFile_10 { public static void main(string[] args) throws Exception { Scanner input = new Scanner(System.in); String s; System.out.print("Nome do arquivo texto: "); String nomearquivo = input.nextline(); File arquivo = new File(nomeArquivo); if (!arquivo.exists()) { FileWriter file = new FileWriter(arquivo); do { System.out.print("Nome: "); String nome = input.nextline(); file.write(nome); file.write(":"); System.out.print("Idade: "); String idade = input.nextline(); file.write(idade); file.write(":"); System.out.print("Sexo [M/F]: "); s = input.nextline(); char sexo = s.charat(0); file.write(sexo); 303
304 file.write(":"); System.out.print("Continua [S/N]? "); do { s = input.nextline(); while (!"SsNn".contains(s)); while ("S".equalsIgnoreCase(s)); file.close(); else { System.out.println("ERRO: Arquivo já existe"); ProgFile_11 // Programa Principal: ProgFile_11.java package progfile_11; import java.io.file; import java.io.filereader; import java.io.bufferedreader; import java.io.fileinputstream; import java.io.inputstreamreader; import java.util.scanner; public class ProgFile_11 { public static void main(string[] args) throws Exception { Scanner input = new Scanner(System.in); System.out.print("Nome do arquivo texto: "); String nomearquivo = input.nextline(); File arquivo = new File(nomeArquivo); FileInputStream in = new FileInputStream(arquivo); InputStreamReader conversor = new InputStreamReader(in); BufferedReader buffer = new BufferedReader(conversor); if (arquivo.exists()) { FileReader file = new FileReader(arquivo); String linha = buffer.readline(); // lê todos os dados, ou seja, carrega toda a linha de dados System.out.println("Buffer: " + linha); // e joga numa String String[] partes = linha.split(":"); int n = partes.length; System.out.println("Partes: " + n); for (int i = 0; i < n; i = i + 3) { System.out.println("Nome: " + partes[i]); System.out.println("Idade: " + Integer.parseInt(partes[i + 1])); if (partes[i+1].equals("m") partes[i+1].equals("m")) { System.out.println("Sexo: MASCULINO"); else { System.out.println("Sexo: FEMININO"); file.close(); buffer.close(); else { System.out.println("ERRO: Arquivo não existe"); 304
305 ProgFile_12 // Programa Principal: ProgFile_12.java package progfile_12; import java.io.bufferedreader; import java.io.file; import java.io.fileinputstream; import java.io.filenotfoundexception; import java.io.filereader; import java.io.ioexception; import java.io.inputstreamreader; import java.util.scanner; public class ProgFile_12 { public static void main(string[] args) throws FileNotFoundException, IOException { Scanner input = new Scanner(System.in); System.out.print("Nome do arquivo texto: "); String nomearquivo = input.nextline(); File arquivo = new File(nomeArquivo); FileInputStream in = new FileInputStream(arquivo); InputStreamReader conversor = new InputStreamReader(in); BufferedReader buffer = new BufferedReader(conversor); if (arquivo.exists()) { int homens, mulheres; try (FileReader file = new FileReader(arquivo)) { String linha = buffer.readline(); // lê todos os dados da linha do arquivo texto e joga numa String System.out.println("Buffer: " + linha); String[] partes = linha.split(":"); int n = partes.length; homens = 0; mulheres = 0; for (int i = 0; i < n; i = i + 3) { if ("M".equals(partes[i+2]) "m".equals(partes[i+2])) { homens++; else { mulheres++; buffer.close(); in.close(); conversor.close(); System.out.println("(" + homens + ") Homens"); System.out.println("(" + mulheres + ") Mulheres"); else { System.out.println("ERRO: Arquivo não existe"); 305
Orientação a Objetos com Java
Orientação a Objetos com Java Julio Cesar Nardi [email protected] 2011/2 Apresentação 3: Orientação Objetos: Conceitos Básicos Objetivos: Compreender os Conceitos Básicos da Orientação a Objetos;
Coleções. Page 1. Coleções. Prof. Anderson Augustinho Uniandrade
Page 1 podem ser comparadas com arrays, visto que também apresentam a capacidade de armazenar referências para vários objetos. Entretanto, as coleções apresentam uma gama de funcionalidades bem maior do
Curso Adonai QUESTÕES Disciplina Linguagem JAVA
1) Qual será o valor da string c, caso o programa rode com a seguinte linha de comando? > java Teste um dois tres public class Teste { public static void main(string[] args) { String a = args[0]; String
Orientação a Objetos
1. Domínio e Aplicação Orientação a Objetos Um domínio é composto pelas entidades, informações e processos relacionados a um determinado contexto. Uma aplicação pode ser desenvolvida para automatizar ou
Programação Orientada a Objetos. Encapsulamento
Programação Orientada a Objetos Encapsulamento de Dados Ocultação de dados Garante a transparência de utilização dos componentes do software, facilitando: Entendimento Reuso Manutenção Minimiza as interdependências
EXERCÍCIOS SOBRE ORIENTAÇÃO A OBJETOS
Campus Cachoeiro de Itapemirim Curso Técnico em Informática Disciplina: Análise e Projeto de Sistemas Professor: Rafael Vargas Mesquita Este exercício deve ser manuscrito e entregue na próxima aula; Valor
Polimorfismo. Prof. Leonardo Barreto Campos 1
Polimorfismo Prof. Leonardo Barreto Campos 1 Sumário Introdução; Polimorfismo; Polimorfismo Java; Métodos Abstratos Java Classes Abstratas Java Exercício - Java Polimorfismo C++ Classe Abstrata C++; Funções
public Agenda() { compromissos = null; } public int getnumerodecompromissos() { if (compromissos==null) return 0; else return compromissos.
import java.util.scanner; class Data... class Compromisso... public class Agenda private Compromisso[] compromissos; private Compromisso[] realoquecompromissos (Compromisso[] vetor, int tamanhodesejado)
Lista de Contas: Assinatura. Lista de Contas. Listas de Contas: Descrição. Listas de Contas: Descrição. Listas de Contas: Descrição
Lista de Contas Lista de Contas: Assinatura null Quais são os métodos necessários? class ListaDeContas { void inserir (Conta c) { void retirar (Conta c) { Conta procurar (String num) { Listas de Contas:
Técnicas de Programação II
Técnicas de Programação II Aula 06 Orientação a Objetos e Classes Edirlei Soares de Lima Orientação a Objetos O ser humano se relaciona com o mundo através do conceito de objetos.
Estruturas de Dados em Java
Estruturas de Dados em Java por Prof. Dr. Paulo Roberto Gomes Luzzardi e-mail: [email protected] Home Page: http://infovis.ucpel.tche.br/luzzardi http://graphs.ucpel.tche.br/luzzardi Versão 1.08 13/04/2010
2ª LISTA DE EXERCÍCIOS CLASSES E JAVA Disciplina: PC-II. public double getgeracaoatual() {return geracaoatual;}
2ª LISTA DE EXERCÍCIOS CLASSES E JAVA Disciplina: PC-II Exercício : Construtores são métodos especiais sem tipo de retorno (nem mesmo void) e de mesmo nome que a classe que são invocados quando da criação
Unidade IV: Ponteiros, Referências e Arrays
Programação com OO Acesso em Java a BD Curso: Técnico em Informática Campus: Ipanguaçu José Maria Monteiro Pontifícia Universidade Católica do Rio de Janeiro PUC-Rio Departamento Clayton Maciel de Informática
Exercícios de Revisão Java Básico
Exercícios de Revisão Java Básico (i) Programação básica (estruturada) 1) Faça um programa para calcular o valor das seguintes expressões: S 1 = 1 1 3 2 5 3 7 99... 4 50 S 2 = 21 50 22 49 23 48...250 1
2 Orientação a objetos na prática
2 Orientação a objetos na prática Aula 04 Sumário Capítulo 1 Introdução e conceitos básicos 1.4 Orientação a Objetos 1.4.1 Classe 1.4.2 Objetos 1.4.3 Métodos e atributos 1.4.4 Encapsulamento 1.4.5 Métodos
INTRODUÇÃO AO JAVA PARA PROGRAMADORES C
PROGRAMAÇÃO SERVIDOR EM SISTEMAS WEB INTRODUÇÃO AO JAVA PARA PROGRAMADORES C Prof. Dr. Daniel Caetano 2012-1 Objetivos Apresentar a grande semelhança entre Java e C Apresentar a organização diferenciada
ARRAYS. Um array é um OBJETO que referencia (aponta) mais de um objeto ou armazena mais de um dado primitivo.
Cursos: Análise, Ciência da Computação e Sistemas de Informação Programação I - Prof. Aníbal Notas de aula 8 ARRAYS Introdução Até agora, utilizamos variáveis individuais. Significa que uma variável objeto
Criar a classe Aula.java com o seguinte código: Compilar e Executar
Introdução à Java Prof. Bruno Gomes [email protected] Programação Orientada a Objetos Código Exemplo da Aula Criar a classe Aula.java com o seguinte código: public class Aula { public static void
Programação Orientada a Objetos em Java
Programação Orientada a Objetos em Java Rone Ilídio da Silva Universidade Federal de São João del-rei Campus Alto Paraopeba 1:14 1 Objetivo Apresentar os principais conceitos de Programção Orientada a
Encapsulamento de Dados
Encapsulamento de Dados Universidade Católica de Pernambuco Ciência da Computação Prof. Márcio Bueno [email protected] Fonte: Material da Profª Karina Oliveira Modificadores de Visibilidade Especificam
JSP - ORIENTADO A OBJETOS
JSP Orientação a Objetos... 2 CLASSE:... 2 MÉTODOS:... 2 Método de Retorno... 2 Método de Execução... 2 Tipos de Dados... 3 Boolean... 3 Float... 3 Integer... 4 String... 4 Array... 4 Primeira:... 4 Segunda:...
3 Classes e instanciação de objectos (em Java)
3 Classes e instanciação de objectos (em Java) Suponhamos que queremos criar uma classe que especifique a estrutura e o comportamento de objectos do tipo Contador. As instâncias da classe Contador devem
Algoritmos e Programação II. Sobrecarga
Algoritmos e Programação II Baseado no Material do Prof. Júlio Machado Sobrecarga Em várias linguagens é comum encontrarmos rotinas que fazem basicamente a mesma coisa, porém, têm nomes distintos porque
Programação Orientada a Objetos em Java. Herança
Universidade Federal do Amazonas Departamento de Ciência da Computação IEC481 Projeto de Programas Programação Orientada a Objetos em Java Herança Professor: César Melo Slides baseados em materiais preparados
Módulo 06 Desenho de Classes
Módulo 06 Desenho de Classes Última Atualização: 13/06/2010 1 Objetivos Definir os conceitos de herança, polimorfismo, sobrecarga (overloading), sobreescrita(overriding) e invocação virtual de métodos.
POO Programação Orientada a Objetos. Classes em Java
+ POO Programação Orientada a Objetos Classes em Java + Classes 2 Para que a JVM crie objetos: Ela precisa saber qual classe o objeto pertence Na classe estão definidos os atributos e métodos Programamos
Introdução a Java. Hélder Nunes
Introdução a Java Hélder Nunes 2 Exercício de Fixação Os 4 elementos básicos da OO são os objetos, as classes, os atributos e os métodos. A orientação a objetos consiste em considerar os sistemas computacionais
Noções sobre Objetos e Classes
Noções sobre Objetos e Classes Prof. Marcelo Cohen 1. Elementos de programação Revisão de programação variáveis, tipos de dados expressões e operadores cadeias de caracteres escopo de variáveis Revisão
Prova de Java. 1) Copie o programa abaixo no eclipse e complete-o, utilizando os conceitos aprendidos durante o curso. (4 pontos)
Prova de Java 1) Copie o programa abaixo no eclipse e complete-o, utilizando os conceitos aprendidos durante o curso. (4 pontos) O programa consiste em uma aplicação que simula o comportamento de dois
UNIVERSIDADE FEDERAL DO PARANÁ
CURSO: Ciência da Computação DATA: / / 2013 PERÍODO: 4 o. PROFESSOR: Andrey DISCIPLINA: Técnicas Alternativas de Programação AULA: 05 APRESENTAÇÃO: Nesta aula vamos ver como se faz a criação de Métodos
BSI UFRPE Prof. Gustavo Callou [email protected]
BSI UFRPE Prof. Gustavo Callou [email protected] Coleções List Set Map Classes e interfaces do pacote java.util que representam listas, conjuntos e mapas. Solução flexível para armazenar objetos. Quantidade
Java. Marcio de Carvalho Victorino www.dominandoti.eng.br
Java Marcio de Carvalho Victorino www.dominandoti.eng.br 3. Considere as instruções Java abaixo: int cont1 = 3; int cont2 = 2; int cont3 = 1; cont1 += cont3++; cont1 -= --cont2; cont3 = cont2++; Após a
Análise de Programação
Análise de Programação Conceitos Avançados da Linguagem de Programação Java Prof Gilberto B Oliveira Encapsulamento Proteger o dado dentro de uma classe (capsula segura) Facilita o uso da classe por outros
Templates e Pilhas. 1. Introdução
Templates e Pilhas 1. Introdução Templates ou Generics é considerado uma forma de polimorfismo [1]. É uma forma de programar onde o tipo do dado não é considerado. Programa-se para um tipo de dado indefinido.
A Linguagem Java. Alberto Costa Neto DComp - UFS
A Linguagem Java Alberto Costa Neto DComp - UFS 1 Roteiro Comentários Variáveis Tipos Primitivos de Dados Casting Comandos de Entrada e Saída Operadores Constantes 2 Comentários /** Classe para impressão
Bacharelado em Ciência e Tecnologia Processamento da Informação. Equivalência Portugol Java. Linguagem Java
Linguagem Java Objetivos Compreender como desenvolver algoritmos básicos em JAVA Aprender como escrever programas na Linguagem JAVA baseando-se na Linguagem Portugol aprender as sintaxes equivalentes entre
Comandos de repetição For (inicialização; condição de execução; incremento/decremento) { //Código }
Este documento tem o objetivo de demonstrar os comandos e sintaxes básicas da linguagem Java. 1. Alguns passos para criar programas em Java As primeiras coisas que devem ser abordadas para começar a desenvolver
Capítulo 14. Herança a e Polimorfismo. Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra
Capítulo 14 Herança a e Polimorfismo Objetivos do Capítulo Apresentar os conceitos de herança e de polimorfismo. Explorar os diversos recursos disponíveis no Java para a aplicação da herança e do polimorfismo
Aula 04 Operadores e Entrada de Dados. Disciplina: Fundamentos de Lógica e Algoritmos Prof. Bruno Gomes http://www.profbrunogomes.com.
Aula 04 Operadores e Entrada de Dados Disciplina: Fundamentos de Lógica e Algoritmos Prof. Bruno Gomes http://www.profbrunogomes.com.br/ Agenda da Aula Operadores: Aritméticos; Atribuição; Concatenação;
BC0501 Linguagens de Programação
BC0501 Linguagens de Programação Aula Prática: 03 Assunto: Comandos de Seleção 1. Introdução Um comando de seleção define uma condição em um programa, que permite que grupos de comandos sejam executados
Coleções. Conceitos e Utilização Básica. c Professores de ALPRO I 05/2012. Faculdade de Informática PUCRS
Coleções Conceitos e Utilização Básica c Professores de ALPRO I Faculdade de Informática PUCRS 05/2012 ALPRO I (FACIN) Coleções: Básico 05/2012 1 / 41 Nota Este material não pode ser reproduzido ou utilizado
Guia de Fatores de Qualidade de OO e Java
Qualiti Software Processes Guia de Fatores de Qualidade de OO e Java Versã o 1.0 Este documento só pode ser utilizado para fins educacionais, no Centro de Informática da Universidade Federal de Pernambuco.
Roteiro 1: Dados, variáveis, operadores e precedência
1. Introdução Universidade Federal do ABC Disciplina: Processamento da Informação (BC-0505) Assunto: Dados, variáveis, operadores e precedência Roteiro 1: Dados, variáveis, operadores e precedência Nesta
2. OPERADORES... 6 3. ALGORITMOS, FLUXOGRAMAS E PROGRAMAS... 8 4. FUNÇÕES... 10
1. TIPOS DE DADOS... 3 1.1 DEFINIÇÃO DE DADOS... 3 1.2 - DEFINIÇÃO DE VARIÁVEIS... 3 1.3 - VARIÁVEIS EM C... 3 1.3.1. NOME DAS VARIÁVEIS... 3 1.3.2 - TIPOS BÁSICOS... 3 1.3.3 DECLARAÇÃO DE VARIÁVEIS...
15-09-2009. Membros de classe e de instância. PARTE III: Java e OO - detalhes. Exemplo 1: método. Exercício. Exemplo 1 corrigido
PARTE III: Java e OO - detalhes Membros de classe e instâncias Pacotes Visibilidade Classes aninhadas Membros de classe e de instância De classe Static Método não necessita de objeto para ser chamado.
Linguagem de Programação III
Linguagem de Programação III Aula-3 Criando Classes em Java Prof. Esbel Tomás Valero Orellana Da Aula Anterior Classes em Java, sintaxe básica Tipos básicos de dados em Java, como escolher o tipo apropriado
A lógica de programação ajuda a facilitar o desenvolvimento dos futuros programas que você desenvolverá.
INTRODUÇÃO A lógica de programação é extremamente necessária para as pessoas que queiram trabalhar na área de programação, seja em qualquer linguagem de programação, como por exemplo: Pascal, Visual Basic,
Programação Orientada a Objetos Prof. Rone Ilídio UFSJ/CAP
Programação Orientada a Objetos Prof. Rone Ilídio UFSJ/CAP 1) Introdução Programação Orientada a Objetos é um paradigma de programação bastante antigo. Entretanto somente nos últimos anos foi aceito realmente
Prof. Esp. Adriano Carvalho
Prof. Esp. Adriano Carvalho O que é um Programa? Um arquivo contendo uma sequência de comandos em uma linguagem de programação especifica Esses comandosrespeitam regras de como serem escritos e quais
Programação de Computadores - I. Profª Beatriz Profº Israel
Programação de Computadores - I Profª Beatriz Profº Israel Ambiente de Desenvolvimento Orientação a Objetos É uma técnica de desenvolvimento de softwares que consiste em representar os elementos do mundo
Curso de Java. Orientação a objetos e a Linguagem JAVA. TodososdireitosreservadosKlais
Curso de Java Orientação a objetos e a Linguagem JAVA Roteiro A linguagem Java e a máquina virtual Objetos e Classes Encapsulamento, Herança e Polimorfismo Primeiro Exemplo A Linguagem JAVA Principais
Diagrama de Classes. Um diagrama de classes descreve a visão estática do sistema em termos de classes e relacionamentos entre as classes.
1 Diagrama de Classes Um diagrama de classes descreve a visão estática do sistema em termos de classes e relacionamentos entre as classes. Um dos objetivos do diagrama de classes é definir a base para
Unidade Acadêmica: Faculdade de Computação FACOM Disciplina: Programação Orientada a Objetos I Professor: Fabiano Azevedo Dorça Prática 01
Unidade Acadêmica: Faculdade de Computação FACOM Disciplina: Programação Orientada a Objetos I Professor: Fabiano Azevedo Dorça Prática 01 Objetivos: Modelar um sistema orientado a objetos simples a partir
Objetivos: Sun recomenda que utilize o nome de domínio da Internet da empresa, para garantir um nome de pacote único
Pacotes e Encapsulamento Prof. Bruno Gomes [email protected] Programação Orientada a Objetos Introdução Permite o agrupamento de classes em uma coleção chamada pacote Um pacote é uma coleção de classes
DEFINIÇÃO DE MÉTODOS
Cursos: Análise, Ciência da Computação e Sistemas de Informação Programação I - Prof. Aníbal Notas de aula 2 DEFINIÇÃO DE MÉTODOS Todo o processamento que um programa Java faz está definido dentro dos
public void setdata(data d) { data = d;
class Data... public class Compromisso private Data data; private int hora; private String descricao; /**java.lang.string*/ public Compromisso() public Compromisso(Data data, int hora, String descricao)
Laboratório de Programação. Aula 13 Java 5COP088. Aula 13 Genéricos e Conjuntos Java Prof. Dr. Sylvio Barbon Junior. Sylvio Barbon Jr barbon@uel.
5COP088 Laboratório de Programação Aula 13 Genéricos e Conjuntos Java Prof. Dr. Sylvio Barbon Junior 1 Sumário: 1) Métodos hashcode(), equals() e tostring(); 2) Conjuntos; 3) Genéricos; 4) Resumo. 2 1)
Programação por Objectos. Java
Programação por Objectos Java Parte 2: Classes e objectos LEEC@IST Java 1/24 Classes (1) Sintaxe Qualif* class Ident [ extends IdentC] [ implements IdentI [,IdentI]* ] { [ Atributos Métodos ]* Qualif:
Implementação de Classe e Auto-Relacionamento em Java
UTFPR DAELN - Disciplina de Fundamentos de Programação II ( IF62C ). 1 Implementação de Classe e Auto-Relacionamento em Java 1)Introdução Um modelo de Diagrama de Classes representa a estrutura definida
Herança. Alberto Costa Neto DComp - UFS
Herança Alberto Costa Neto DComp - UFS 1 Motivação Vimos como se faz encapsulamento e a importância de fazê-lo... Contudo, também é possível fazer encapsulamento em algumas linguagens não OO O que mais
Introdução a POO. Introdução a Linguagem C++ e POO
Introdução a POO Marcio Santi Linguagem C++ Introdução a Linguagem C++ e POO Programação Orientada a Objetos (POO) e C++ Recursos C++ não relacionados às classes Incompatibilidades entre C e C++ Classes
CONVENÇÃO DE CÓDIGO JAVA
CONVENÇÃO DE CÓDIGO JAVA Eligiane Ceron - Abril de 2012 Versão 1.0 Conteúdo Considerações iniciais... 2 Introdução... 2 Extensão de arquivos... 2 Arquivos de código Java... 2 Comentários iniciais... 2
PROGRAMAÇÃO ORIENTADA A OBJETOS -TRATAMENTO DE EXCEÇÕES. Prof. Angelo Augusto Frozza, M.Sc. [email protected]
PROGRAMAÇÃO ORIENTADA A OBJETOS -TRATAMENTO DE EXCEÇÕES Prof. Angelo Augusto Frozza, M.Sc. [email protected] ROTEIRO 5. Tratamento de Exceções Introdução e conceitos Capturando exceção usando
Faculdade de Ciências Universidade Agostinho Neto Departamento de Matemática e Engenharia Geográfica Ciências da Computação
FaculdadedeCiências UniversidadeAgostinhoNeto DepartamentodeMatemáticaeEngenhariaGeográfica CiênciasdaComputação ProgramaçãoII SegundaParte Adaptado de um original dos docentes de ISCTE Objectivos Os alunos
Programação de Computadores - I. Profª Beatriz Profº Israel
Programação de Computadores - I Profª Beatriz Profº Israel As 52 Palavras Reservadas O que são palavras reservadas São palavras que já existem na linguagem Java, e tem sua função já definida. NÃO podem
Profº. Enrique Pimentel Leite de Oliveira
Profº. Enrique Pimentel Leite de Oliveira O termo orientação a objetos significa organizar o mundo real como uma coleção de objetos que incorporam estrutura de dados e um conjunto de operações que manipulam
PROGRAMAÇÃO AVANÇADA -CONCEITOS DE ORIENTAÇÃO A OBJETOS. Prof. Angelo Augusto Frozza, M.Sc. [email protected]
PROGRAMAÇÃO AVANÇADA -CONCEITOS DE ORIENTAÇÃO A OBJETOS Prof. Angelo Augusto Frozza, M.Sc. [email protected] ROTEIRO 1. Conceitos de Orientação a Objetos Introdução O paradigma da POO Classes
Universidade da Beira Interior Cursos: Matemática /Informática e Ensino da Informática
Folha 1-1 Introdução à Linguagem de Programação JAVA 1 Usando o editor do ambiente de desenvolvimento JBUILDER pretende-se construir e executar o programa abaixo. class Primeiro { public static void main(string[]
Programação Orientada por Objetos
PPROG Paradigmas da Programação Programação Orientada por Objetos Relações entre Dependência Agregação Composição Associação (Livro Big Java, Late Objects Capítulo 12) Nelson Freire (ISEP DEI-PPROG 2014/15)
Computação II - Java Prof. Adriano Joaquim de Oliveira Cruz Aula Prática - Herança, Polimorfismo e Construtores
Computação II - Java Prof. Adriano Joaquim de Oliveira Cruz Aula Prática - Herança, Polimorfismo e Construtores 1 Exercícios Exercício 1: Construtores e Testes Analise a classe Conta.java, mostrada na
Tópicos da Aula. Classes e Objetos. Classe Pública em Java. Classes em Java. Assinatura de Métodos. Corpo de Classes e Métodos. Conceitos de classe
DCC / ICEx / UFMG Tópicos da Aula Classes e Objetos Eduardo Figueiredo http://www.dcc.ufmg.br/~figueiredo Conceitos de classe Membros Construtores, métodos de classe e métodos de objeto, atributos de classe
Coleções Avançadas. Programação Orientada a Objetos Java. Prof. Anselmo Cardoso Paiva Prof. Geraldo Braz Junior
Coleções Avançadas Programação Orientada a Objetos Java Prof. Anselmo Cardoso Paiva Prof. Geraldo Braz Junior Objetivos Aprender como o conceito de coleção pode ser expresso de forma genérica Examinar
Programação Estruturada e Orientada a Objetos. Fundamentos Orientação a Objetos
Programação Estruturada e Orientada a Objetos Fundamentos Orientação a Objetos 2013 O que veremos hoje? Introdução aos fundamentos de Orientação a Objetos Transparências baseadas no material do Prof. Jailton
Java 2 Standard Edition Como criar classes e objetos
Java 2 Standard Edition Como criar classes e objetos Helder da Rocha www.argonavis.com.br 1 Assuntos abordados Este módulo explora detalhes da construção de classes e objetos Construtores Implicações da
Rafael Santos. Instituto Nacional de Pesquisas Espaciais www.lac.inpe.br/ rafael.santos. Rafael Santos - www.lac.inpe.br/ rafael.
Coleções e Aplicações Rafael Santos Instituto Nacional de Pesquisas Espaciais www.lac.inpe.br/ rafael.santos Rafael Santos - www.lac.inpe.br/ rafael.santos 1 / 54 Tópicos 1 Sobre... 2 Revisão de Java 3
Programação com Objectos. Processamento de Dados I. 4. Classes Abstractas
Programação com Objectos Processamento de Dados I 4. Classes Abstractas 1 Conceito de classe abstracta Declaração de uma classe abstracta Implicações e características das classes abstractas Utilização
UML Aspectos de projetos em Diagramas de classes
UML Aspectos de projetos em Diagramas de classes Após ser definido o contexto da aplicação a ser gerada. Devemos pensar em detalhar o Diagrama de Classes com informações visando uma implementação Orientada
Tabela de símbolos: tabelas de espalhamento
Tabela de símbolos: tabelas de espalhamento Marcelo K. Albertini 14 de Janeiro de 2014 2/28 Resumo de complexidades Análises para operação efetuada após N inserções pior caso caso médio keys chave get
Relacionamentos entre objetos. Relacionamentos entre objetos. Relacionamentos entre objetos. Relacionamentos entre objetos
Programação Orientada a Objetos Relacionamentos entre objetos Associação, composição e agregação Construtores e sobrecarga Variáveis de classe e de instância Reinaldo Gomes [email protected] Objetos
Capítulo 2: Introdução à Linguagem C
Capítulo 2: Introdução à Linguagem C INF1005 Programação 1 Pontifícia Universidade Católica Departamento de Informática Programa Programa é um algoritmo escrito em uma linguagem de programação. No nosso
UNIP - Ciência da Computação e Sistemas de Informação. Estrutura de Dados. AULA 6 Filas
UNIP - Ciência da Computação e Sistemas de Informação Estrutura de Dados AULA 6 Filas Estrutura de Dados A Estrutura de Dados Fila Fila é uma estrutura de dados usada em programação, que tem regras para
Introdução à Linguagem
Introdução à Linguagem Curso de Nivelamento do PPGMNE Janeiro / 2011 Juliano J. Scremin [email protected] Um pouco de história Um pouco de história: Nascimento do Python Um pouco de história:
Orientação a Objetos com Java
Everton Coimbra de Araújo Orientação a Objetos com Java Simples, Fácil e Eficiente Visual Books Sumário Prefácio... 11 Introdução... 13 1 Introdução à Orientação a Objetos... 17 1.1 Conceitualização...
Aula 3 Desvio Condicional
Aula 3 Desvio Condicional ROTEIRO DA AULA Desvio Condicional Simples Desvio Condicional Composto Desevio Condicional Aninhado Desvio Condicional em JAVA 2 DESVIO CONDICIONAL Um desvio condicional é usado
Tópicos em Engenharia de Computação
Tópicos em Engenharia de Computação Introdução / Revisão UML e POO (JAVA) Prof. Ivan Prof. Zagari UML Linguagem Unificada. Não é metodologia, processo ou método. Versão atual 2.0 3 categorias de Diagramas
Estrutura de Dados Básica
Estrutura de Dados Básica Professor: Osvaldo Kotaro Takai. Aula 4: Tipos de Dados O objetivo desta aula é apresentar os tipos de dados manipulados pela linguagem C, tais como vetores e matrizes, bem como
Linguagem de Programação JAVA. Técnico em Informática Professora Michelle Nery
Linguagem de Programação JAVA Técnico em Informática Professora Michelle Nery Agenda Regras paravariáveis Identificadores Válidos Convenção de Nomenclatura Palavras-chaves em Java Tipos de Variáveis em
Estrutura Condicional em Java
Estrutura Condicional em Java Linguagem de Programação 1 O Java contém três tipos de instruções de seleção. A instrução if realiza uma ação se uma condição for verdadeira ou pula a ação se a condição for
Especialização em desenvolvimento para web com interfaces ricas. Tratamento de exceções em Java Prof. Fabrízzio A. A. M. N. Soares
Especialização em desenvolvimento para web com interfaces ricas Tratamento de exceções em Java Prof. Fabrízzio A. A. M. N. Soares Objetivos Conceito de exceções Tratar exceções pelo uso de try, catch e
Algoritmo e Programação
Algoritmo e Programação Professor: José Valentim dos Santos Filho Colegiado: Engenharia da Computação Prof.: José Valentim dos Santos Filho 1 Ementa Noções básicas de algoritmo; Construções básicas: operadores,
UNIVERSIDADE FEDERAL DO PARANÁ
CURSO: Ciência da Computação DATA: / / 2013 PERÍODO: 4 o. PROFESSOR: Andrey DISCIPLINA: Técnicas Alternativas de Programação AULA: 03 APRESENTAÇÃO: Hoje vamos conhecer o comando switch, o bloco try catch;
Algoritmos I Aula 13 Java: Tipos básicos, variáveis, atribuições e expressões
Algoritmos I Aula 13 Java: Tipos básicos, variáveis, atribuições e expressões Professor: Max Pereira http://paginas.unisul.br/max.pereira Ciência da Computação Primeiro Programa em Java public class OlaPessoal
Java Como Programar, 8/E
Capítulo 2 Introdução aos aplicativos Java Java Como Programar, 8/E (C) 2010 Pearson Education, Inc. Todos os 2.1 Introdução Programação de aplicativo Java. Utilize as ferramentas do JDK para compilar
Capítulo 13. Encapsulamento. Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra
Capítulo 13 Encapsulamento Objetivos do Capítulo Indicar a importância do mecanismo de encapsulamento no contexto do desenvolvimento de software utilizando a programação orientada a objetos. Apresentar
Tipos de Dados, Tipos Abstratos de Dados Estruturas de Dados
Tipos de Dados, Tipos Abstratos de Dados Estruturas de Dados Tipo de dados, tipo abstrato de dados, estruturas de dados Termos parecidos, mas com significados diferentes Tipo de dado Em linguagens de programação
SUMÁRIO CAPÍTULO 1 INTRODUÇÃO AO JAVA... 1
SUMÁRIO CAPÍTULO 1 INTRODUÇÃO AO JAVA... 1 A Origem... 2 O Caminho Para a Aprendizagem... 4 Java Como Plataforma... 6 Finalidade... 9 Características... 11 Perspectivas... 13 Exercícios... 14 CAPÍTULO
Tabelas (arrays) (vetores, matrizes, etc) Algoritmos de pesquisa Algoritmos de ordenação
Java Tabelas (arrays) (vetores, matrizes, etc) Algoritmos de pesquisa Algoritmos de ordenação 1 Tabelas para quê? As tabelas são utilizadas quando se pretende armazenar e manipular um grande número de
Programação Orientada a Objetos em java. Polimorfismo
Programação Orientada a Objetos em java Polimorfismo Polimorfismo Uma característica muito importante em sistemas orientados a objetos Termo proveniente do grego, e significa muitas formas Em POO, significa
Sintaxe Básica de Java Parte 1
Sintaxe Básica de Java Parte 1 Universidade Católica de Pernambuco Ciência da Computação Prof. Márcio Bueno [email protected] Fonte: Material da Profª Karina Oliveira Estrutura de Programa Um programa
INF 1005 Programação I
INF 1005 Programação I Aula 03 Introdução a Linguagem C Edirlei Soares de Lima Estrutura de um Programa C Inclusão de bibliotecas auxiliares: #include Definição de constantes:
