Professional Documents
Culture Documents
Goinia / 2011
Av. Alexandre de Morais, n 450. Qd. rea, Lt. rea, Anexo rea C, Parque Amaznia Goinia Gois CEP: 74.840-570 - Goinia / Gois Fone: (62) 3548-3301
e-mail: contato@cepss.com.br
ORGANIZAO DO MATERIAL
Prof. Jos Carlos Cordeiro e Silva
REVISO
Prof. Jos Carlos Cordeiro e Silva
FORMATAO
Prof. Jos Carlos Cordeiro e Silva
Esta Apostila compe-se da compilao de textos extrados das obras citadas nas Referncias Bibliogrficas com algumas alteraes e adaptaes necessrias a sua organizao.
ABRIL 2011
SUMRIO
1.ARQUITETURA E FERRAMENTAS...................................................................1 1.1.COMO
COMPILAR E EXECUTAR UM PROGRAMA JAVA?..............................................................1 O
1.2.CONFIGURANDO 1.3.INSTALANDO
JAVA
NO
LINUX...............................................................................2
.......................................................................................5
E O ESPAO EM BRANCO............................................................5
2.2. SEQUNCIA {
}.......................................................................................5
E VRGULA,
BLOCOS
DECLARAO IMPORT.............................................................................................5
PROGRAMA
EM JAVA...................................................................................7
2.7.1.1.COMPILANDO UM PRIMEIRO PROGRAMA:...............................................................................7 2.7.1.2.Explicao passo a passo do programa exemplo:..................................................................8 2.7.1.3.Curiosidade: .........................................................................................................................9
CONSTANTES......................................................................................10
DE INSTNCIA.........................................................................11
SOBRE ATRIBUIES......................................................................................11
CLASSE..........................................................................................11
DE
VARIVEL..........................................................................................12
DE
DADOS PRIMITIVOS.................................................................................12
2.14.1.1.Tipos Numricos Inteiros...................................................................................................12 2.14.1.2.Tipos Numricos Reais.......................................................................................................12 2.14.1.3.Tipo caracter.....................................................................................................................12 2.14.1.4.Caracteres Especiais de Escape:........................................................................................13 2.14.1.5.Tipo Lgico........................................................................................................................13
2.15.CONVERSO
2.16.STRING........................................................................................................14 2.17.EXPRESSES
E OPERADORES....................................................................................15
2.18.OPERADORES.....................................................................................................16
2.18.1.1.Relacionais........................................................................................................................17 2.18.1.2.Binrios.............................................................................................................................17 2.18.1.3.Lgicos..............................................................................................................................17 2.18.1.4.Condicional........................................................................................................................17
2.18.1.5.Precedncia dos Operadores.............................................................................................17 2.18.1.6.Operadores Unrios...........................................................................................................18 2.18.1.7.Operadores Aritmticos.....................................................................................................18 2.18.1.8.Operadores de Deslocamento............................................................................................19 2.18.1.9.Operadores Comparaes .................................................................................................20 2.18.1.10.Operadores Lgico de curto-circuito................................................................................21 2.18.1.11.Operador Condicional......................................................................................................21 2.18.1.12.Operadores de Atribuio................................................................................................21
SELEO
OU
CONDICIONAL.....................................................................24
4.1.1Comando if else.....................................................................................................24
DE
REPETIO.......................................................................................26
SELEO MLTIPLA..............................................................................30
6.Comando switch............................................................................................................30 4.4.INSTRUES........................................................................................................32 7.Comando break.............................................................................................................32 8.Comando continue........................................................................................................33 5.RECURSIVIDADE........................................................................................34 5.1.FATORIAL...........................................................................................................34 5.2. SRIE
DE
FINOBACCI.............................................................................................35
ARRAY.....................................................................................38
8.2.ORDENAO
POR TROCAS
MTODO DA BOLHA................................................................50
LISTA
ENCADEADAS..................................................................................61
10.BIBLIOGRAFIA.........................................................................................82
APRESENTAO
O que aprendemos em algoritmo: A automao o processo em que uma tarefa deixa de ser desempenhada pelo homem e passa a ser realizada por mquinas, sejam estes dispositivos mecnicos, eletrnicos (como os computadores) ou de natureza mista. Para que a automao de uma tarefa seja bem-sucedida necessrio que a mquina que passar a realiz-la seja capaz de desempenhar cada uma das etapas constituintes do processo a ser automatizado com eficincia, de modo a garantir a repetibilidade do mesmo. Assim, necessrio que seja especificado com clareza e exatido o que deve ser realizado em cada uma das fases do processo a ser automatizado, bem como a seqncia em que estas fases devem ser realizadas. A especificao da seqncia ordenada de passos que deve ser seguida para a realizao de uma tarefa, garantindo a sua repetibilidade, d-se o nome de algoritmo. A Tcnica de Programao vem complementar o estudo do algoritmo, passando da forma da linguagem que o ser humano compreende para a forma que a mquina ir entender (os conjuntos de instrues) e executar. Por outro lado temos a Estrutura de Dados para ajudarmos a organizar, pesquisar nossos dados, ficando mais gil seu programa nestas aes. Temos e diversos tipos de linguagens de programao para podermos estar transformando o algoritmo, por exemplo: > PHP; > Java; > C#; > Fortran; > Entre muitas outras... A linguagem a ser usada neste curso ser JAVA, veremos os conceitos da linguagem, sintaxes... Este curso explora os seguintes assuntos
Como escrever programas em Java, como compil-los e como execut-los; A sintaxe da linguagem Java; Boas prticas, testes e noes de padres de projeto;
1. ARQUITETURA E FERRAMENTAS
1.1.Como compilar e executar um programa Java?
O conceito de um algoritmo foi formalizado em 1936 pela Mquina de Turing de O processo de compilao de um programa Java feito de acordo com os seguintes passos: o cdigo fonte (extenso .java) compilado e armazenado em um arquivo de extenso .class. De cara, percebe-se a impossibilidade de utilizar-se de DOS como sistema operacional para a elaborao de aplicativos Java, uma vez que o mesmo tem um suporte limitado a nomes de arquivos. Mas essa limitao quanto ao nome dos arquivos somente a razo aparente da noportabilidade de Java para DOS. A grande razo reside no fato de que Java foi projetada para sistemas de 32 bits, e s foram escritas Mquinas Virtuais Java para ambientes de 32 bits. A portabilidade de Java depende fortemente da existncia de JVMs que rodem em diversas plataformas. Um programa Java rodar em um computador se existir uma JVM que nele rode. Ao contrrio de programas Java, as JVMs devem ser programas feitos e compilados para mquinas especficas, de forma que sero as JVMs as responsveis pela traduo de bytecodes Java para as linguagens nativas das mquinas. O conjunto de instrues da Mquina Virtual Java otimizado para ser pequeno e compacto, tendo sido elaborado para ser uma espcie de processador RISC(siginificado) virtual: a rapidez da interpretao s vezes sacrificada para garantir esse reduzido conjunto de instrues. O compilador mais utilizado para a transformao de arquivos-fonte java (.java) em arquivos de bytecodes o javac da Sun (h diversos outros compiladores no mercado, mas o javac foi o primeiro e o mais popular ainda hoje).
Uma vez gerado o arquivo .class, ele deve ser passado JVM instalada no computador. No caso mais comum, a JVM utilizada a distribuda pela Sun em seu JDK (Java Developers Kit), denominada java. Isso no caso de aplicativos. No caso de Applets, os browsers que suportam Java j contm em si uma JVM que interpreta os bytecodes das Applets
.
Figura 2 Funcionamento da JVM(Java Virtual Machine)
Com isso um programa Java um conjunto de instrues para a JVM, dessa forma o mesmo independente de plataforma, pois basta que haja uma implementao de mquina virtual para a plataforma a ser utilizada.
Observao: Esse foi o modelo inicial para execuo de programas Java, a fim de possibilitar independncia de plataforma, sendo que atualmente o processo de interpretao foi substitudo por outra compilao, sendo que, no mais para bytecodes e sim para cdigo executvel dependente de plataforma. Dessa forma a perda de performance com a interpretao foi eliminada e o programa em bytecodes continua independente de plataforma, pois a JVM de cada plataforma ser responsvel pela compilao em executvel.
Site(s )
http://www.javasoft.com/products/hotspot/
Primeiramente, entre no site http://java.sun.com/j2se/1.4/download.html e faa download do pacote j2sdk-<versao>.bin e depois execute-o: $ ./j2sdk-<versao>.bin Feito isso, ir aparecer a licena do Java. Aperte "enter" para rolar a pgina ou "q" para terminar. Aps isso, digite "yes" para concordar com os termos da licena, e sendo assim, ir comear a descompactar os arquivos. (ser criado o diretrio "j2sdk"). Pronto, o Java est instalado, porm agora falta configur-lo. Edite o arquivo /etc/profile (como root, claro) e adicione as seguintes linhas: JAVA_HOME:/usr/local/j2sdk<verso> CLASSPATH=.:$CLASSPATH No "JAVA_HOME", coloque o diretrio onde foi criado o j2sdk. (no meu caso foi criado em /home/juniox/j2sdk). Feito isso, procure pela linha PATH e adicione logo abaixo: PATH=$JAVA_HOME/bin:$PATH No artigo que fala sobre o J2DK, era para colocar a linha "PATH=$JAVA_HOME/bin:$PATH", mas uma dvida. Digamos que eu tenha colocado o Java no /root ou na raz, como que ficaria? No PATH no vai mudar nada, pois nele voc est indicando o valor da varivel $JAVA_HOME: PATH=$JAVA_HOME/bin:$PATH Bom, se voc instalou o JDK no /root, ento ficou /root/j2skd<versao> certo ? pois bem, basta voc colocar isso no $JAVA_HOME: JAVA_HOME:/root/j2sdk<verso> As linhas do /etc/profile. Eu inseri o que segue: # # /etc/profile . . . # final do /etc/profile export PATH=/usr/local/j2sdk1.4.2:$PATH # Eu criei um diretorio para minhas classes export CLASSPATH=/usr/local/j2sdk1.4.2/minhas_classes # As manpages som _muito_ importantes export MANPATH=$MANPATH:/usr/local/j2sdk1.4.2/man #<EOF> Centro de Educao Profissional Sebastio de Siqueira CEPSS
1. Windows 95/98/ME:
Edite o arquivo c:\autoexec.bat (clique nele com o boto direito, depois "Editar", ou abra-o no Bloco de Notas) e adicione no final do arquivo exatamente o seguinte: SET JAVA_HOME=<diretrio onde o java foi instalado> Por exemplo, levando em considerao que o java foi instalado no diretrio "c:\java", a linha ficar assim: SET JAVA_HOME=c:\java Agora devemos configurar o PATH: SET PATH=%PATH%;%JAVA_HOME%\bin possvel que j exista uma varivel de ambiente chamada PATH. Nesse caso, basta adicionar o exemplo acima logo aps a existente. Por ltimo, basta configurar a varivel CLASSPATH: SET CLASSPATH=.;%JAVA_HOME% Repare que logo aps o sinal de igual ( = ) h um ponto seguido de um ponto-e-vrgula. No esquea deste detalhe. Aps ter feito a configurao, reboote o computador para que as alteraes faam efeito.
2. Windows XP/2000:
Para configurar as Variveis de Ambiente no Windows XP/2000, voc deve fazer da seguinte maneira: - Clique no menu "Iniciar", depois em "Painel de Controle". Escolha ento "Sistema". - Na janela que abrir, clique na aba "Avanado" e depois no boto "Variveis de Ambiente". - Na prxima tela, clique em "Adicionar" - Insira as variveis JAVA_HOME e CLASSPATH com os respectivos valores, da mesma forma como mostrado na configurao anterior, porm lembrando que, neste caso no necessrio adicionar o "SET" junto, ou seja, coloque apenas o nome da varivel e o valor. Centro de Educao Profissional Sebastio de Siqueira CEPSS
Para alterar a PATH, basta edite-a ( muito provavelmente j ir existir ) e adicione no fim: "; %JAVA_HOME%\bin". Clique em "OK" e reinicie o micro. O seu sistema deve estar pronto para compilar programas em Java. Para fazer um teste, abra um prompt do MSDOS, e digite: javac Tudo estar funcionando caso aparea uma grande mensagem explicando como utilizar o javac.
2. O Bsico
2.1.Conveno da linguagem
Na linguagem Java utilizada a seguinte conveno para formao de identificadores:
Constantes com todas as letras em maisculo: o CONSTANTE Variveis comeam com letra minscula: o varivel Classes comeam com letra maiscula: o Classe Se o nome for composto, cada nome comea com letra maiscula: o VarivelComNomeComposto.Bloco
Um bloco definido por ({}) e contm um grupo de outros blocos. Quando um novo bloco criado um novo escopo local aberto e permite a definio de variveis locais. As variveis definidas dentro de um bloco s podem ser vistas internamente a este, e so terminadas ou extintas no final da execuo deste(}).
Em Java, quando voc quer usar instalaes de pacotes, voc usa a declarao de importao para contar para o compilador onde achar as classe que voc vai usar. A declarao de importao (import) deve preceder a declarao de todas as classes.
2.5.Comentrios
Existem trs tipos de comentrios em Java, sendo eles :
// * */ / ** */ Comentrio de documentao. Devem ser inseridos imediatamente antes de uma declarao de classes, varivel ou mtodo e indicam que o comentrio deve ser includo em qualquer documentao gerada automaticamente (como os arquivos HTML gerados pelo comando javadoc) Usado para indicar comentrios em uma nica linha, pode ser inserido em qualquer posio de uma linha, e todo o texto at o final do marcador de linha tratado como comentrio. / Usados para indicar comentrios que se estendem por uma ou mais linhas.
2.6.Palavras Reservadas
Modificadores de acesso Private: Acesso apenas dentro da classe Protected: Acesso por classes no mesmo pacote e subclasses Public: Acesso de qualquer classe Modificadores de classes, variveis ou mtodos. Abstract: Classe que no pode ser instanciada ou mtodo que precisa ser implementado Class: Extends: Final: Implements: Interface: Native: New: Static: Strictfp: por uma subclasse no abstrata Especifica uma classe Indica a superclasse que a subclasse est estendendo Impossibilita que uma classe seja estendida, que um mtodo seja sobrescrito ou que uma varivel seja reinicializada. Indica as interfaces que uma classe ir implementar Especifica uma interface Indica que um mtodo est escrito em uma linguagem dependente de plataforma, como o C Instancia um novo objeto, chamando seu construtor Faz um mtodo ou varivel pertencer classe ao invs de s instncias Usado em frente a um 6 mtodo ou classe para indicar que os nmeros de ponto
flutuante seguiro as regras de ponto flutuante em todas as expresses Synchronized: Indica que um mtodo s pode ser acessado por uma thread de cada vez Transient: Impede a serializao de campos Volatile: Indica que uma varivel pode ser alterada durante o uso de threads Controle de fluxo dentro de um bloco de cdigo Break: Sai do bloco de cdigo em que ele est Case: Executa um bloco de cdigo dependendo do teste do switch Continue: Pula a execuo do cdigo que viria aps essa linha e vai para a prxima Default: Do: Else: For: If: passagem do loop Executa esse bloco de cdigo caso nenhum dos teste de switch-case seja verdadeiro Executa um bloco de cdigo uma vez, e ento realiza um teste em conjunto com o while para determinar se o bloco dever ser executado novamente Executa um bloco de cdigo alternativo caso o teste if seja falso Usado para realizar um loop condicional de um bloco de cdigo Usado para realizar um teste lgico de verdadeiro o falso
Determina se um objeto uma instncia de determinada classe, superclasse ou interface Retorna de um mtodo sem executar qualquer cdigo que venha depois desta linha (tambm pode retornar uma varivel) Indica a varivel a ser comparada nas expresses case Executa um bloco de cdigo repetidamente at que uma certa condio seja verdadeira Testa uma expresso condicional para verificar uma suposio do programador Declara o bloco de cdigo usado para tratar uma exceo Bloco de cdigo, aps um try-catch, que executado independentemente do
fluxo de programa seguido ao lidar com uma exceo Throw: Usado para passar uma exceo para o mtodo que o chamou Throws: Indica que um mtodo pode passar uma exceo para o mtodo que o chamou Try: Bloco de cdigo que tentar ser executado, mas que pode causar uma exceo. Controle de pacotes Import: Importa pacotes ou classes para dentro do cdigo Package: Especifica a que pacote todas as classes de um arquivo pertencem Primitivos Boolean: Um valor indicando verdadeiro ou falso Byte: Um inteiro de 8 bits (signed) Char: Um caracter unicode (16-bit unsigned) Double: Um nmero de ponto flutuante de 64 bits (signed) Float: Um = nmero de ponto flutuante de 32 bits (signed) Int: Um inteiro de 32 bits (signed) Long: Um inteiro de 64 bits (signed) Short: Um inteiro de 32 bits (signed) Variveis de referncia Super: Refere-se superclasse imediata This: Refere-se instncia atual do objeto Retorno de um mtodo Void: Indica que o mtodo no tem retorno Palavras reservadas no utilizadas Const: No utilize para declarar constantes; use public static final Goto: No implementada na linguagem Java por ser considerada prejudicial Literais reservados De acordo com a Java Language Specification, null, true e false so tecnicamente chamados de valores literais, e no keywords. Se voc tentar criar algum identificador com estes valores, voc tambm ter um erro de compilao.
a. Certifique-se de ter adicionado a sua lista de paths o path do compilador e interpretador Java. Javac e Java respectivamente. b. Crie o arquivo ao lado em um diretrio qualquer (folder para usurios mac) e salve com o nome: HelloInternet.Java
c.
d. Seu diretrio deve ter recebido um novo arquivo aps essa compilao: HelloInternet.class e. Chame o interpretador Java para este arquivo (omita a extenso .class de arquivo): Java HelloInternet f. Observe o resultado na tela: Hello Internet!
//Comentario de uma linha public class HelloInternet { public static void main (String args[]) { System.out.println("Hello!"); } } Resultado: Hello! 2.7.1.2. Explicao passo a passo do programa exemplo: //Comentario de uma linha Comentrios em Java seguem a mesma sintaxe de C++, // inicia uma linha de comentrio, todo o restante da linha ignorado. Existe tambm um outro tipo de comentrio formado por /* Insira aqui o texto a ser ignorado */ , este tipo de comentrio pode ser intercalado em uma linha de cdigo. Comentrios so tratados como espaos em branco. E por ltimo o comentrio para documentao /** at o final */ deve vir antes da declarao da classe. public class HelloInternet { class a palavra reservada que marca o inicio da declarao de uma classe. Public um especificador, por enquanto guarde public class como o incio da declarao de uma classe. Toda classes sero declaradas assim at o tpico POO (Programao Orientada a Objetos). HelloInternet
o nome dado a esta classe. O abre chaves marca o incio das declaraes da classe que so os atributos e mtodos. Esta classe s possui uma declarao, a do mtodo main, note que um mtodo, ao contrrio de C++, s pode ser declarado {internamente} a classe a qual pertence, evitando as confuses sobre escopo. Desta forma, todo pedao de cdigo em Java deve pertencer ao abre chaves, fecha chaves da definio de uma classe. public static void main (String args[]) { System.out.println("Hello Internet!"); } public um qualificador do mtodo que indica que este acessvel externamente a esta classe (para outras classes que eventualmente seriam criadas), no se preocupe com ele agora, apenas declare todos os mtodos como public. Voltaremos a este assunto em outro capitulo. static outro qualificador ou specifier, que indica que o mtodo deve ser compartilhado por todos os objetos que so criados a partir desta classe. Os mtodos static podem ser invocados, mesmo quando no foi criado nenhum objeto para a classe, para tal deve-se seguir a sintaxe: <NomeClasse>.<NomemetodoStatic>(argumentos);. Retornaremos a esta explicao mais tarde, por hora voc precisa saber que particularmente o mtodo main precisa ter essa qualificao porque ele chamado sem que se crie nenhum objeto de sua classe (a classe HelloInternet). 2.7.1.3. Curiosidade:
Se voc gosta de paradoxos e j conhece um pouco de orientao a objetos, pense que se o mtodo main tivesse que ser chamado para um objeto (o que no o caso) este objeto teria que ter sido criado em algum outro lugar ento este lugar seria o incio do programa e main deixaria de ter esta finalidade. A linguagem de programao Eiffel adota uma tcnica diferente para resolver este problema: todo programa comea com a criao de um objeto (e no mais a chamada automtica de main), este objeto chamado ROOT, ele pode conter atributos que so inicializados e um mtodo de inicializao, construtor do objeto, que o incio do cdigo do programa. void Semelhante ao void C++ ou C, o valor de retorno da funo, quando a funo no retorna nenhum valor ela retorna void, uma espcie de valor vazio que tem que ser especificado. main Este um nome particular de mtodo que indica para o compilador o incio do programa, dentro deste mtodo e atravs das iteraes entre os atributos, variveis e argumentos visveis nele que o programa se desenvolve.
10
(String args[]) o argumento de main e por conseqncia do programa todo, ele um vetor de Strings que formado quando so passados ou no argumentos atravs da invocao do nome do programa na linha de comando do sistema operacional, exemplo: Java HelloInternet argumentotexto1 argumentotexto2 No nosso caso, ignoramos a possvel passagem de argumentos via linha de comando, retornaremos a este assunto posteriormente. { ... }
Abre chaves e fecha chaves. Para quem no conhece C ou C++, eles podem ser entendidos como algo semelhante ao BEGIN END de Pascal ou Modula-3, ou seja: delimitam um bloco de cdigo. Os programadores Pascal notaro que variveis locais dos mtodos podem ser declaradas em qualquer local entre as chaves. Mas por motivos de clareza do cdigo declararemos todas no incio do abre chaves.
2.8. Identificadores
Os identificadores em Java devem seguir as seguintes regras:
1 . 2 . 3 . 4 . 5 . No ser repetido dentro do seu escopo No ser igual as literais : true, false ou null No ser uma palavra reservada Ser formado por caracteres UNICODE A primeira posio dever ser com uma letra, _ ou $
11
final int a = 10; int b = 15; // a = 11; -> iria dar um erro b = 11; // atribuio vlida Em Java a converso de dados entre variveis automtica quando: As variveis so de tipo compatvel A varivel de destino maior do que a de origem Quando isso no acontece, temos de usar uma converso explcita, denominada cast: var = (tipo-var-destino) var2 Exemplos: long a = 1; int b = 2; a = b; // Converso vlida //b = a; // Converso invlida b = (int) a; // Converso vlida
2.10.
Variveis podem atribuidas em forma de expresses como: int x, y, z; x = y = z = 0; No exemplo as trs variveis recebem o valor 0;
2.11.
As variveis de instncia, aparentemente, so declaradas e definidas quase exatamente da mesma forma que as variveis locais, a principal diferena que a alocao delas na definio da classe. Exemplo: class Bike extends Veculo { String tipo; int correia; int pedal; }
2.12.
Variveis de Classe
As variveis de classe so boas para a comunicao entre os diferentes objetos da mesma classe, ou para manter travamento de estados globais sobre um conjunto de objetos. Exemplo: static int soma; static final int maxObjects= 10; Centro de Educao Profissional Sebastio de Siqueira CEPSS
12
2.13.
Escopo de Varivel
class MinhaClasse { // variveis globais - vlidas em todos os mtodos da classe ... public void metodoA( argumentos ) { // variveis locais - validas dentro do mtodo onde esto definidas for ( ... ) { // variveis temporrias - validas apenas no cdigo dentro do ciclo } ... } ... }
2.14.
Java uma linguagem de programao fortemente orientada a objetos e, com exceo dos tipos primitivos, qualquer coisa em Java uma classe/objeto. Tipos Primitivos: Numricos Inteiros; Numricos Reais; Caracter; Lgico.
2.14.1.1.
Tipo byte short int long
Tamanho em bits 8 16 32 64
2.14.1.2.
Tipo float double
Tamanho em bits 32 64
2.14.1.3.
Tipo char
Tipo caracter
Faixa UNICODE - 65536 caracteres possveis
Tamanho em bits 16
13
Observao: Um caracter delimitado por apstrofos caracter. O que causa confuso, pois as Strings so delimitadas por aspas String. 2.14.1.4.
'\u0000' a '\uFFFF' \b \t \n \r \ \' \\
Observao: A linguagem Java no possui o tipo primitivo string, bastante conhecido em vrias outras linguagens. Para manipulao de texto so utilizadas as classes String e StringBuffer. 2.14.1.5. Tipo boolean Tipo Lgico Faixa true ou false
2.15.
possvel transformar um tipo primitivo em outro, atravs de uma operao chamada typecast, colocando o tipo destino da transformao, entre parntesis, antes da expresso a ser convertida. Esse tipo de converso chamado de converso explcita. Por outro lado existe a converso implcita, a qual realizada pela MVJ, mesmo sem possuir operador de typecast, isso quando o tipo de retorno menos abrangente que o tipo que o recebe. long bigval = 6; // Operao vlida int smallval = 99L; // Operao invlida porque so de tipos diferentes float z = 12.414F; // Operao vlida float zp = 12.414; // Operao invlida porque esta tentando atribuir um valor double. 2.15.1.1. Converso
Permite a converso entre tipos diferentes Deve ser explcito quando for de um tipo maior para um menor (narrowing) Pode ser implcito (ou explcito) de um tipo menor para um maior (widening) Converso para tipos menores pode causar perda de preciso e truncamento
Char
Centro de Educao Profissional Sebastio de Siqueira CEPSS
14
2.15.1.2.
Promoo Aritmtica
Ocorre com as operaes aritmticas entre tipos primitivos numricos diferentes. O menor tipo automaticamente convertido para o maior tipo. public class PromocaoMatematica { public static void main( String[] args ) { double d = 100.99; int i = 100; //aqui ocorre a promoo matemtica d = d * i; //i convertido para double e ento multiplicado //ao contrrio necessrio informar o casting d = d * (double) i; long x = 12345; float pi = 3.14f; x = x * (long) pi; //ou ento, converte apenas o resultado x = (long) (x * pi); } }
2.16.
STRING
String uma classe que manipula cadeias de caracteres A classe String possui mtodos para essas manipulaes Trabalha com Pool de Strings para economizar memria Exemplo: String str = Isto uma String do Java; String xyz = new String(Isto uma String do Java); if( str == xyz ) System.out.println(IGUAL); else System.out.println(DIFERENTE); if( str.equals( xyz ) ) { //MANEIRA CORRETA DE SE COMPARAR O CONTEDO DAS STRINGS } System.out.println( Tamanho da String: + str.length() ); System.out.println( SubString: + str.substring(0, 10) ); System.out.println( Caracter na posio 5: + str.charAt(5) ); Centro de Educao Profissional Sebastio de Siqueira CEPSS
15
Outros mtodos teis da classe String: String str = Isto uma String do Java; // O mtodo split quebra a String e vrias outras, // pelo separador desejado String[] palavras = str.split( ); int i = str.indexOf(uma); //retorna o ndice da palavra na String if( str.startsWith(Ol) || str.endsWith(Mundo!) ) { // testa o comeo e o fim da String retorna boolean } str = str.trim(); // elimina os espaos em branco no incio e fim str = str.replace(a,@); // substitui os caracteres // substitui uma palavra (usa expresses regulares) str = str.replaceAll(String,Cadeia de caracteres);
2.17.
Expresses e operadores
2.17.1.1. 2.17.1.2.
Operador = += -= *= /= %= &= |= ^= <<= >>= >>>= Uso
Atribuio
Equivale a Op1 = op1 + op2 Op1 = op1 - op2 Op1 = op1 * op2 Op1 = op1 / op2 Op1 = op1 % op2 Op1 = op1 & op2 Op1 = op1 | op2 Op1 = op1 ^ op2 Op1 = op1 << op2 Op1 = op1 >> op2 Op1 = op1 >>> op2
Op1 += op2 Op1 -= op2 Op1 *= op2 Op1 /= op2 Op1 %= op2 Op1 &= op2 Op1 |= op2 Op1 ^= op2 Op1 <<= op2 Op1 >>= op2 Op1 >>>= op2
2.17.1.3.
Operado r + op1 + op2 Uso
Aritmticos
Descrio Adiciona op1 e op2
16
* / %
Subtrai op2 de op1 Multiplica op1 por op2 Divide op1 por op2 Resto de op1 / op2
Exemplo Aritmtico: public class Aritmeticos { public static void main ( Strings args[] ) { short x = 6; int y = 4; float a = 12.5f; float b = 7f; System.out.println ( x + x + , y + y ); System.out.println ( x + y = + (x + y) ); System.out.println ( x - y = + (x - y) ); System.out.println ( x / y = + (x / y) ); System.out.println ( x % y = + ( x % y ) ); System.out.println ( a + a + , b + b ); System.out.println ( a / b = + ( a / b ) ); } } A sada do programa acima : x 6, y 4 x + y = 10 x-y=2 x/y=1 x%y=2 a 12.5, b 7 a / b = 1.78571 2.17.1.4.
Operador ++ -Uso var++ ++var var---var
Incrementos e decrementos
Descrio usa a varivel e depois incrementa incrementa a varivel e depois usa usa a varivel e pois decrementa decrementa a varivel e depois usa
As duas expresses do resultados diferentes, pois existe uma diferena entre prefixo e sufixo. Quando se usa os operadores ( x++ ou x-- ), y recebe o valor de x antes de x ser incrementado, e usando o prefixo ( ++x ou x ) acontece o contrario, y recebe o valor incrementado de x.
2.18.
Operadores
17
2.18.1.1.
Operador == != < > <= >=
Relacionais
Descrio Igual Diferente Menor Maior Menor ou igual Maior ou igual
2.18.1.2.
Operador >> << >>> & | ^ ~
Binrios
Descrio shift binrio para direita shift binrio para esquerda shift binrio para direita (unsigned) AND binrio OR binrio XOR binrio Inverso de Bits
2.18.1.3.
Operador && || ! & |
Lgicos
1.1.1.5.1.1.1.1 Descrio AND com curto-circuito OR com curto-circuito NOT AND sem curto-circuito OR sem curto-circuito
2.18.1.4.
Operador ?:
Condicional
Uso Descrio expresso_logica? Caso a expresso lgica seja verdade o val1 ser retornado, val1:val2 caso contrrio ser retornado val2.
2.18.1.5.
Os operadores esto listados na ordem decrescente de precedncia; Os operadores na mesma linha tm a precedncia igual; Todos os operadores binrios, exceo dos operadores de atribuio, so avaliados da esquerda para direita;
Descrio operadores do sufixo operadores unrios Criao multiplicativos Operadores [ ] . () Chamada de funo !, ~, +, -, ++, -(Type-cast), new *, /, %
18
aditivos SHIFT relacional igualdade AND binrio XOR binrio OR binrio AND lgico OR lgico Condicional Atribuio
+, <<, >>, >>> <, >, <=, >= instanceof ==, != & ^ | && || ?: +=, -=, *=, /=, %=, &=, ^=, |=, <=, <=, >>, >=, >>, =
2.18.1.6.
Operadores Unrios
Incremento e Decremento: ++ e -int a = 0; int b = a++; // incrementado depois de atribuir int c = ++a; // incrementado antes de atribuir b = a--; // decrementado depois de atribuir c = --a; // decrementado antes de atribuir Mais e Menos Unrio: + e int x = +3; // x recebe o positivo 3 x = -x; // x recebe -3, neste caso Inverso de Bits: ~ int i = ~1; // i = -2 (os bits foram invertidos) Complementar booleano: ! boolean falsidade = ! (true); // inverte o valor booleano Converso de Tipos: (tipo)jj double d = 1.99; int i = (int) d; // converte de double p/ int (perda de //preciso) 2.18.1.7. Operadores Aritmticos
Multiplicao e Diviso: * e / int um = 3 / 2; // diviso de inteiros gera um inteiro float umEmeio = (float) 3 / 2; // ocorre promoo aritmtica para float double xyz = umEmeio * um; // ocorre promoo aritmtica para float Centro de Educao Profissional Sebastio de Siqueira CEPSS
19
Mdulo: % int resto = 7 % 2; // resto = 1 Adio e Subtrao: + e long l = 1000 + 4000; double d = 1.0 0.01; Concatenao: long var = 12345; String str = O valor de var + var; Na concatenao de Strings, as variveis ou literais so promovidos a String antes: String str = O valor de var + Long.toString( var ); 2.18.1.8. Operadores de Deslocamento
Deslocamento direita: >> Nmero: 192 Binrio: |00000000|00000000|00000000|11000000| Right Shift de 1 bit: |00000000|00000000|00000000|01100000| Right Shift de 7 bits: |00000000|00000000|00000000|00000001| Resultado int i = 192 >> 1 int i = 192 >> 7 Nmero: -192 Binrio: |11111111|11111111|11111111|01000000| Right Shift de 1 bit: |11111111|11111111|11111111|10100000| Right Shift de 7 bits: |11111111|11111111|11111111|11111110| Resultado int i = -192 >> 1 int i = -192 >> 7 Deslocamento esquerda: << Nmero: 192 Binrio: |00000000|00000000|00000000|11000000| Left Shift de 1 bit: |00000000|00000000|00000001|10000000| Left Shift de 7 bits: |00000000|00000000|01100000|00000000| Resultado int i = 192 << 1 int i = 192 << 7 Nmero: -192 Binrio: |11111111|11111111|11111111|01000000| Left Shift de 1 bit: |11111111|11111111|11111110|10000000| Left Shift de 7 bits: |11111111|11111111|10100000|00000000| Resultado Centro de Educao Profissional Sebastio de Siqueira CEPSS
20
int i = -192 << 1 int i = -192 << 7 Deslocamento direita, sem sinal: >>> Nmero: 192 Binrio: |00000000|00000000|00000000|11000000| Right Shift de 1 bit: |00000000|00000000|00000000|01100000| Right Shift de 7 bits: |00000000|00000000|00000000|00000001| Resultado int i = 192 >>> 1 int i = 192 >>> 7 Nmero: -192 Binrio: |11111111|11111111|11111111|01000000| Right Shift de 1 bit: |01111111|11111111|11111111|10100000| Right Shift de 7 bits: |00000001|11111111|11111111|11111110| Resultado int i = -192 >>> 1 int i = -192 >>> 7 2.18.1.9. Operadores Comparaes
Comparao ordinal: >, >=, < e <= Compara tipos primitivos numricos e o tipo char. boolean b = ( 10 < 3 ); boolean w = (x <= y); if( x >= y ) { } Operador instanceof Compara o tipo da classe de uma referncia de um objeto. String str = Uma String; if( str instanceof String ) { } // true if( srt instanceof Object ) { } // true Comparao de Igualdade: == e != Comparam tipos primitivos, valores literais e referncias de objetos. if( abc == 10 ) { } boolean b = ( xyz != 50 ); if( refObj1 == refObj2 ) { } 2.15.6.5. Operadores de BITS: &, | e ^ Numricos Inteiros: Operando A: 1 Centro de Educao Profissional Sebastio de Siqueira CEPSS
21
Operando B: 3 Binrio de A: 00000001 Binrio de B: 00000011 A & B: 00000001 = 1 A ^ B: 00000010 = 2 A | B: 00000011 = 3 Booleanos: true & true = true true & false = false true ^ true = false true ^ false = true false | false = false 2.18.1.10. Operadores Lgico de curto-circuito
Estes operadores no precisam testar toda a expresso. Ele pra assim que uma das condies o satisfaa. O retorno da expresso um boolean. if( (a>10) && (b<5) ) { // isso } if( (x==y) || (b<5) ) { // aquilo } boolean b = x && y || z; 2.18.1.11. Operador Condicional
tambm conhecido como operador ternrio, pois trabalha com 3 operandos. Ele avalia o primeiro operando. Caso a avaliao retorne true, ele executa o segundo operando. Seno, ele executa o terceiro operando. O segundo e terceiro operandos DEVEM ser do mesmo tipo (seno, use cast). O cdigo do operador ternrio abaixo: int x = 10; int y = (x > 10) ? x : x+1; semelhante ao cdigo abaixo: int x = 10; int y; if( x > 10 ) { y = x; } else { y = x + 1; } 2.18.1.12. Operadores de Atribuio
22
Estes operadores atribuem um novo valor a uma varivel ou expresso. O operador = apenas atribui um valor. Os operadores +=, -=, *= e /= calculam e atribuem um novo valor. int i = 10; int dois = 1; dois += 1; // dois = dois + 1; int cinco = 7; cinco -= 2; // cinco = cinco - 2; int dez = 5; dez *= 2; // dez = dez * 2; int quatro = 12; quatro /= 3; // quatro = quatro / 3;
Observao: Tipos primitivos/ objetos podem ser concatenados com o sinal "+". Vejamos o seguinte comeo de cdigo, que nos ajudar na insero dos dados, sem discutirmos cada classe e mtodo, pois, veremos em Estrutura de Dados. import java.util.Scanner; // importao da Classe Scanner import java.io.BufferedReader; /* importao da Classe BufferedReader*/ import java.io.InputStreamReader; /* importao da Classe InputStreamReader*/ import java.io.IOException; // importao da Classe IOException public class LendoEscrevendo // nome da classe { public static void main( String args[] ) { //cria Scanner e p BufferedReader para obter input do teclado BufferedReader dataIn = new BufferedReader(new InputStreamReader(System.in)); Scanner input = new Scanner( System.in ); Estas linhas acima mostram que estamos utilizando as classes BufferedReader,InputStreamReader e IOException cada qual dentro do pacote java.io e a Classe Scanner no pacote java.util. Essas APIs ou Interfaces de Programao de Aplicaes Centro de Educao Profissional Sebastio de Siqueira CEPSS
23
(Application Programming Interface) contm centenas de classes pr-definidas que se pode usar nos programas. Essas classes so organizadas dentro do que chamamos de pacotes. Pacotes contm classes que se relacionam com um determinado propsito. No exemplo, so pacotes java.io e java.util contm as classes que permitem capturar dados de entrada e sada. Estas linhas poderiam ser reescritas da seguinte forma: import java.io.*; import java.util.*; O import que importar todas as classes encontradas no pacote java.io e java.util, deste modo possvel utilizar todas classes desses pacotes no programa. Na instruo: 10. BufferedReader dataIn = new BufferedReader(new InputStreamReader(System.in)); Declaramos a varivel dataIn do tipo BufferedReader. No se preocupe com o significado da sintaxe, pois ser abordado mais frente. Utilizamos a varivel dataIn para chamarmos o mtodo que far o recebimento dos dados digitados: String name = dataIn.nextLine(); As seguinte linhas definem um bloco try-catch: try { name = dataIn.readLine(); } catch (IOException e) { System.out.println("Error!"); } Que asseguram, caso ocorram excees sero tratadas. Falaremos sobre o tratamento de excees no mdulo de desenvolvimento de software para desktop . Por hora, necessrio adicionar essas linhas para utilizar o mtodo readLine() e receber a entrada de dados do usurio. Alguns Mtodo e Finalidade da Classe BufferedReader e InputStreamReader: readInt() captura um nmero inteiro readDouble() captura um nmero Double readBoolean() captura um Boolean(true ou false) readChar() - captura um caracter readLine() - captura String Na instruo:
24
9.
Definimos uma varivel, denominada input, que ser criada a partir da classe Scanner e direcionada para a entrada padro. Alguns Mtodo e Finalidade da Classe Scanner: next() nextInt() nextByte() nextLong() nextFloat() nextDouble() nextLine() - guarda uma entrada em formato String sem espao. - guarda uma entrada em formato Inteiro - guarda uma entrada em formato Inteiro - guarda uma entrada em formato Inteiro Longo - guarda uma entrada em formato Nmero Fracionrio - guarda uma entrada em formato Nmero Fracionrio - guarda uma entrada em formato String com espao.
4. Estruturas de Controle
4.1.Estrutura de Seleo ou Condicional
4.1.1Comando if else
Comando de seleo, o qual permite analisar uma expresso lgica e direcionar a execuo do programa. Caso a expresso lgica seja verdadeira (true) a sequncia do if ser executado e caso a expresso lgica seja falsa (false), e exista a clusula else, a sequncia do else ser executada. Uma alternativa para o uso do if e else um operador ternrio condicional. Este operador ternrio (?: ) , chamado assim porque tem trs termos como parmetro. Exemplo: test ? trueresult : falseresult int menor = x < y ? x : y ; // A varivel menor recebe o valor do menor entre x e y.
if ( expresso_lgica ) Sequncia; if ( expresso_lgica ) Sequncia_1; else Sequncia_2; if ( expresso_lgica ) Sequncia_1; else if ( expresso_lgica ) Sequncia_2; else if ( expresso_lgica ) Sequncia_3; else if ( expresso_lgica ) Sequncia_4; else Sequncia_5;
25
Programa(s) Demonstrao /** * Demonstrao do comando if else */ import util.Scanner; public class ComandoIF { public static void main(String[] args) {
ComandoIF.java
Scanner input = new Scanner( System.in ); /* Validando uma data */ int dia, mes, ano; System.out.print("Dia : "); dia = input.nextInt(); System.out.print("Ms : "); mes = input.nextInt(); System.out.print("Ano : "); ano = input.nextInt(); boolean data = false; /* meses de 30 dias */ if ( mes == 4 || mes == 6 || mes == 9 || mes == 11) { if ( dia >= 1 && dia <= 30 ) { data = true; } } else { /* meses de 31 dias */ if ( mes == 1 || mes == 3 || mes == 5 || mes == 7 || mes == 8 || mes == 10 || mes == 12 ) { if ( dia >= 1 && dia <= 31 ) { data = true; } } else { /* fevereiro */ if ( mes == 2 ) { if ( dia >= 1 && dia <= 28 ) { data = true; } else { /* 29 de fevereiro */ if ( dia == 29 ) { /* Ano bissexto */ boolean bissexto = ( (ano % 4 == 0) && (ano % 100 != 0) ) || (ano % 400 == 0); if ( bissexto ) { data = true; } } } } } } System.out.print(dia + "/" + mes + "/" + ano + " : "); if ( data ) System.out.println("Data Vlida");
26
Clusula if( ) public class ClausulaIf { public static void main( String[] args ) { int idade = 20; if( idade <= 12 ) { System.out.println( "Criana" ); } if( idade > 12 && idade <= 19 ) { System.out.println( "Adolescente" ); } if( idade > 19 && idade <= 60 ) { System.out.println( "Adulto" ); } if( idade > 60 ){ System.out.println( "Idoso" ); } } } Clusula if( )/ else public class ClausulaIf { public static void main( String[] args ) { int idade = 20; if( idade <= 12 ) { System.out.println( "Criana" ); } else if( idade <= 19 ) { System.out.println( "Adolescente" ); } else if( idade <= 60 ) { System.out.println( "Adulto" ); } else { System.out.println( "Idoso" ); } } }
4.2.Estrutura de Repetio
3. Comando while
Centro de Educao Profissional Sebastio de Siqueira CEPSS
27
Executa a sequncia do comando enquanto a expresso lgica for verdadeira. Sendo que, antes de cada execuo a expresso lgica analisada.
while ( expresso_lgica ) Sequncia;
A condio uma expresso booleana. Exemplo: int count=0; while( count < array1.length && array1[count]!=0){ array2[count]=(float) array1[count++]; } Clusula While( ) public class LacoWhile { public static void main( String[] args ) { int i = 0; //lao while() com bloco de cdigo definido while( i < 10 ) { System.out.println( "Linha: " + i ); i++; } } } A expresso avaliada antes de executar o bloco de cdigo Ele repete enquanto a expresso for verdadeira (true)
Programa(s) Demonstrao /** * Demonstrao do comando while */ import java.util.Scanner; public class ComandoWhile { public static void main( String[] args ) { int numero; int fatorial;
ComandoWhile.java
Scanner input = new Scanner(System.in); System.out.println("Calculo do fatorial (flag < 0)"); System.out.print("Nmero : "); numero = input.nextInt(); while ( numero >= 0 ) { fatorial = 1; while ( numero > 1 ) {
28
fatorial *= numero; numero--; } System.out.println( "Fatorial : " + fatorial ); System.out.print( "Nmero : "); numero = input.nextInt(); } System.out.println( "Fim" ); } }
4. Comando do while
Executa a seqncia do comando enquanto a expresso lgica for verdadeira. Sendo que, aps a execuo da sequncia a expresso lgica analisada.
do Sequncia; while ( expresso_lgica );
Clusula do while( ) public class LacoWhile { public static void main( String[] args ) { int i = 0; //lao do / while() com bloco de cdigo definido do { System.out.println( "Linha: " + i ); i++; } while( i < 10 ); } } O bloco executado ao menos uma vez. Aps a primeira repetio que a expresso avaliada.
Programa(s) Demonstrao /** * Demonstrao do comando do while */ import java.util.Scanner; public class ComandoDoWhile { public static void main(String[] args) { int numero; int fatorial; Scanner input = new Scanner(System.in); System.out.println("Calculo do fatorial (flag = 0)"); do { System.out.print("Nmero : "); numero = input.nextInt(); fatorial = 1; while (numero > 1) { ComandoDoWhile.java
29
5. Comando for
Executa a sequncia do comando enquanto a expresso lgica for verdadeira. Sendo que permite inicializar varivel, na entrada do comando e incrementar varivel a cada repetio.
for ( expresso_inicializacao ; expresso_lgica ; expresso_incremento ){ Sequncia; }
Voc tambm pode incluir um comando simples, sendo assim no h necessidade da utilizao de chaves. Exemplo: String strArray[] = new String[10]; for ( i=0; i< strArray.length; i++) strArray[i]=; Inicializa um array de 10 elementos com ; Clusula For( ) public class LacoFor { public static void main( String[] args ) { for( int i=0; i < 10; i++ ) { System.out.println( "Linha: " + i ); } } }
Programa(s) Demonstrao /** * Demonstrao do comando for */ import java.util.Scanner; public class ComandoFor { public static void main(String[] args) { final int inicio = 10; final int fim = 10; int resultado = 0; Scanner input = new Scanner(System.in); System.out.print("Tabuada de (+ x) : "); char tabuada = input.next(); ComandoFor.java
30
for (int i = 0; i <= inicio; i++ ) { for (int j = 0; j <= fim; j++) { switch (tabuada) { case '+' : resultado = i + j; break; case 'x' : resultado = i * j; break; } System.out.print(i + " " + String.valueOf(tabuada) + " " + j + " = " + resultado + "\t"); } System.out.println(); } } }
Obs : O comando break normalmente utilizado como ltimo comando de cada sequncia, indicando que, quando uma sequncia for executada todas as outras sero ignoradas. Clusula Switch( ) public class ClausulaSwitch { public static void main( String[] args ) { int numero = 1; switch( numero ) { case 1 : System.out.println( "UM" ); break; case 2 : System.out.println( "DOIS" ); Centro de Educao Profissional Sebastio de Siqueira CEPSS
31
break; case 3 : System.out.println( "TRES" ); break; default : System.out.println( "NENHUM" ); break; } } } O switch recebe um argumento do tipo int ou char.
Programa(s) Demonstrao /** * Demonstrao do comando switch */ package Comando; import java.util.Scanner; public class ComandoSwitch { public static void main(String[] args) { /* Validando uma data */ Scanner input = new Scanner(System.in); int dia, mes, ano; System.out.print("Dia : "); dia = input.nextInt(); System.out.print("Ms : "); mes = input.nextInt(); System.out.print("Ano : "); ano = input.nextInt(); boolean data = false; switch (mes) { /* meses de 30 dias */ case 4 : case 6 : case 9 : case 11 : if ( dia >= 1 && dia <= 30 ) data = true; break; /* meses de 31 dias */ case 1 : case 3 : case 5 : case 7 : case 8 : case 10 : case 12 : if ( dia >= 1 && dia <= 31 ) data = true; break; /* fevereiro */ case 2 : ComandoSwitch.java
32
if ( dia >= 1 && dia <= 28 ) { data = true; } else { /* 29 de fevereiro */ if ( dia == 29 ) { /* Ano bissexto */ boolean bissexto = ( (ano % 4 == 0)&& (ano % 100 != 0) ) || (ano % 400 == 0); if ( bissexto ) { data = true; } } } default : data = false; } System.out.print(dia + "/" + mes + "/" + ano + " : "); if ( data ) System.out.println("Data Vlida"); else System.out.println("Data Invlida"); } }
4.4.Instrues
7. Comando break
Fora a sada de um comando de repetio ou do comando switch Clusula break() Aborta a execuo de um lao, quando executado. public class ClausulaBreak { public static void main( String[] args ) { char letras[] = { 'A', 'B', 'C', 'D', 'E' }; int i; for( i=0; i<letras.length; i++ ) { if( letras[i] == 'C' ) { break; } } System.out.println( "ltimo ndice: " + i ); } } Clusula break rotulada Aborta a execuo de um lao rotulado, quando executado. int j = 0, i = 0; Centro de Educao Profissional Sebastio de Siqueira CEPSS
33
principal1: while( true ) { for( i=0; i<1000; i++ ) { if( j == 10 && i == 100 ) break principal1; }j++; }
8. Comando continue
Fora o incio da prxima iterao de um comando de repetio. Clusula continue() Ignora a execuo dos comandos seguintes do bloco, no lao, quando executado. public class ClausulaContinue { public static void main( String[] args ) { char letras[] = { 'B', 'X', 'R', 'A', 'S', 'I', 'L' int i; for( i=0; i<letras.length; i++ ) { if( letras[i] == 'X' ) { continue; } System.out.print( letras[i] ); } } } Clusula continue rotulada Ignora a execuo dos comandos seguintes do bloco, do lao rotulado, quando executado. int i=0, j=0; principal2: for( j=1; j<10; j++ ) { for( i=1; i<10; i++ ) { if( (i % j) == 0 ) { System.out.println( "i=" + i + " j=" + j ); continue principal2; } } j++; }
Programa(s)Demonstrao ComandoBreakContinue.java /** * Demonstrao do comando break e continue */ public class ComandoBreakContinue { public static void main(String[] args) {
};
34
for (int i = 0; i <= 1000 ; i++ ) { if ( i == 10 ) break; System.out.print(i + " "); } System.out.println(); for (int i = 0; i <= 20 ; i++) { if ( i <= 10 ) continue; System.out.print(i + " "); } } }
5. Recursividade
Recursividade um termo usado de maneira mais geral para descrever o processo de repetio de um objeto de um jeito similar ao que j fora mostrado. Um bom exemplo disso so as imagens repetidas que aparecem quando dois espelhos so apontados um para o outro.
5.1.Fatorial
Na matemtica, o fatorial de um nmero natural n, representado por n!, o produto de todos os inteiros positivos menores ou iguais a n. A notao n! foi introduzida por Christian Kramp em 1808. Por exemplo, Note que esta definio implica em particular que Porque o produto vazio, isto , o produto de nenhum nmero 1. O mtodo abaixo mostra o calculo do Fatorial // Mtodo recursivo Fatorial public class FatorialCalculador { // declarao recursiva do mtodo fatorial public long fatorial( long number ) { if ( number <= 1 ) // testa caso bsico return 1; // caso bsico: 0! = 1 e 1! = 1 else // passo de recurso return number * fatorial( number - 1 ); } // final do mtodo fatorial // gera sada de fatoriais para valores 0-10 public void displayFatorial() { // calcula o factorial de 0 a 10 Centro de Educao Profissional Sebastio de Siqueira CEPSS
35
for ( int counter = 0; counter <= 10; counter++ ) System.out.printf( "%d! = %d\n", counter, fatorial( counter ) ); } // fim do mtodo displayFatorial } // O codigo abaixo chama o cdigo acima: public class FactorialTest { // calcular factorial de 0-10 public static void main( String args[] ) { FatorialCalculador fatorialCalculador = new FatorialCalculador(); fatorialCalculador.displayFatorial(); } // fim do mtodo main } // fim da classe FatorialTest
Na prtica: voc comea com 0 e 1, e ento produz o prximo nmero de Fibonacci somando os dois anteriores para formar o prximo. Os primeiros Nmeros de Fibonacci (sequncia A000045 na OEIS) para n = 0, 1, so 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765 Esta sequncia foi descrita primeiramente por Leonardo de Pisa, tambm conhecido como Fibonacci (Dc. 1200), para descrever o crescimento de uma populao de coelhos. Os nmeros descrevem o nmero de casais em uma populao de coelhos depois de n meses se for suposto que: No primeiro ms nasce apenas um casal, Casais amadurecem sexualmente (e reproduzem-se) apenas aps o segundo ms de vida, No h problemas genticos no cruzamento consangneo, Todos os meses, cada casal frtil d a luz a um novo casal, e Os coelhos nunca morrem. // Metodo recursivo fibonacci public class FibonacciCalculator { // declarao recursiva do mtodo fibonacci public long fibonacci( long number ) { if ( ( number == 0 ) || ( number == 1 ) ) // caso base return number; Centro de Educao Profissional Sebastio de Siqueira CEPSS
36
else // etapa de recurso return fibonacci( number - 1 ) + fibonacci( number - 2 ); } // end method fibonacci public void displayFibonacci() { for ( int counter = 0; counter <= 10; counter++ ) System.out.printf( "Fibonacci of %d is: %d\n", counter, fibonacci( counter ) ); } // end method displayFibonacci } // end class FibonacciCalculator
// Testando o mtodo recursive fibonacci public class FibonacciTest { public static void main( String args[] ) { FibonacciCalculator fibonacciCalculator = new FibonacciCalculator(); fibonacciCalculator.displayFibonacci(); } // fim main } // fim da classe FibonacciTest
6. Estrutura de Dados
Como percebemos, se quisermos guardar dados de diferentes tipos teremos problemas, pois, variveis (de tipos primitivos) no suportam tipos diferentes de dados, no agora. Para resolvermos teremos de agora para frente estudarmos Estrutura de Dados. o modo particular de armazenamento e organizao de dados em um computador para que possamos us-los de um modo eficiente. (Wikipdia, 2010) Alm disto, temos as estruturas de dados dinmicas que crescem e encolhem em tempo de execuo. Que so elas: Listas, Pilhas, Filas, rvores.
6.1.Array
Array uma coleo ordenada de primitivos, referncias para objetos e outras arrays. Os arrays em Java so homogneos, ou seja, eles s podem conter dados do mesmo tipo. Os arrays so objetos, e devem ser construdos antes de serem usados. Lembrando que o nome array servir para os conhecidos vetores e matrizes em outra linguagem, aqui no Java trataremos com Array. Passos para utilizar arrays: - Declarao - Criao Centro de Educao Profissional Sebastio de Siqueira CEPSS
37
- Iniciao int[ ] umArray; //declarando uma array (vetor) umArray = new int[ 10 ]; //criando uma array(vetor) de 10 posies umArray[ 0 ] = 0; //j preenchendo a array no ndice escolhido umArray[ 1 ] = 999; //j preenchendo a array no ndice escolhido short[][] jogoDaVelha = new short[3][3]; //declarando e criando //uma array(matriz) double[] d = { 1.0d, 0.99, 3.14 };//j preenchendo a array Podemos percorrer os array de forma automtica, usando o lao for( ). O ndice dos arrays vai de 0 (zero) at N-1 (onde N o tamanho do array). Obs: aconselhvel sempre que criar uma Array inicializa-l. Exemplo: public class PreencherComPesos { public static void main( String[] args ) { double[] pesos = new double[10]; //aqui sabemos o tamanho do array for(int i=0; i<10; i++) { peso[i] = 0; } } } public class PercorrendoArray { public static void main( String[] args ) { double[] precos = new double[100]; //aqui sabemos o tamanho do array for(int i=0; i<100; i++) { precos[i] = i * 2.99; } //aqui no importa o tamanho do array for(int i=0; i<precos.length; i++) { precos[i] = i * 2.99; } } } Os arrays no mudam de tamanho. Acessar um ndice inexistente causa uma exceo: ArrayIndexOutOfBoundsException. import java.util.*; public class ExemploException1 { Centro de Educao Profissional Sebastio de Siqueira CEPSS
38
private Vector v = new Vector(); public ExemploException1() { v.add("Disciplina 1"); v.add("Disciplina 2"); imprimeVetor(); } public void imprimeVetor() { System.out.println("O nmero de elementos do vetor "+v.size()); for (int i = 0; i <= v.size(); i++) { System.out.println(v.elementAt(i).toString()); } } public static void main (String par[]) { } } Arrays possuem um atributo tamanho, que pode ser usado para determinar o tamanho, em bytes, de um Array: int arrayLength = intArray.length; // determinando o tamanho do Array Lembre-se que isto o nmero total de bytes ocupado pelo array e no o nmero de elementos contidos nele. Como na maioria das linguagens de programao, em Java, no possivel alterar o tamanho de um Array depois da sua criao. Ir produzira exceo ArrayIndexOutOfBoundsException
39
II.
1 2 3 4 5
A SOMA da linha com a coluna IGUAL a 6. Centro de Educao Profissional Sebastio de Siqueira CEPSS
40
III.
1 2 3 4 5
L1XC1 L1XC2 L1XC3 L1XC4 L2XC2 L2XC3 L2XC4 L3XC3 L3XC4 L4XC4
IV.
1 2 3 4 5
L1XC1 L2XC1 L2XC2 L3XC1 L3XC2 L3XC3 L4XC1 L4XC2 L4XC3 L4XC4 L5XC1 L5XC2 L5XC3 L5XC4 L5XC5
41
A linha MAIOR que coluna. V. As clulas acima da Diagonal Secundria: a. A Linha + Coluna < 6
1 1 2 3 4 5 2 3 4 5 L1XC5
L1XC1 L1XC2 L1XC3 L1XC4 L2XC1 L2XC2 L2XC3 L2XC4 L3XC1 L2XC2 L3XC3 L4XC1 L4XC2 L5XC1
A soma da linha com a coluna MENOR 6. VI. As clulas abaixo da Diagonal Secundria: a. A Linha + Coluna > 6
1 1 2 3 4 5 L2XC4 L3XC3 L3XC4 L4XC2 L4XC3 L4XC4 L5XC1 L5XC2 L5XC3 L5XC4 2 3 4 5 L1XC5 L2XC5 L3XC5 L4XC5 L5XC5
42
VII.
1 2 3 4 5
L1XC1
VIII.
se (C + L > 6 )
2 3 4 5 L1XC5 L2XC2 L3XC3 L4XC2 L4XC4 L5XC5 L2XC4
1 2 3 4 5
L1XC1
L5XC1
43
IX.
1 2 3 4 5
L1XC1
X.
1 2 3 4 5
L1XC1
A LINHA maior que A COLUNA e soma DE LINHA E COLUNA menor que 6 . XI. Clulas LADO DIREITO diagonal Principal e Secundria: Centro de Educao Profissional Sebastio de Siqueira CEPSS
44
a. A se (L < C) e (L + C > 6)
1 1 2 3 4 5 L5XC1 L4XC2 L1XC1 L2XC2 L3XC3 L4XC4 L5XC5 L2XC4 2 3 4 5 L1XC5
7. Funo e Procedimento
7.1.Procedimento
O procedimento conhecido como sub-rotina, um conjunto de instrues que realiza determinada tarefa. Um mtodo de procedimento criado da mesma maneira que outro mtodo qualquer, deve ser identificado e possuir variveis, operaes e at funes. Para construir este mtodo em Java, representado procedimento, utiliza-se a seguinte sintaxe: Static void nome_Mtodo (<argumentos>) { <instrues>; } Onde
45
Static: um modificador que indica que o mtodo ser alocado em memria sem que haja necessidade de ser instanciado. No necessita objeto; pode ser invocado com base no nome da classe. Os modificadores so elementos que caracterizam o mtodo quanto visibilidade (esxcopo) e qualidade. Os mtodos, bem como as classes e as variveis, podem possuir mais de um modificador, no importando sua ordem. Alem do static, outros modificadores muito utilizados so:
public - pode ser invocado livremente e indica um mtodo que visvel para qualquer um que enxergue a classe; protected pode ser utilizado apenas no mesmo pacote e em subclasses; private pode ser invocado apenas na classe; final no pode ser sobrescrito e equivale declarao de constante.
void - indica que no ser retornado nenhum valor do programa que realizou a chamada; <nome_Mtodo>\- um identificador vlido da linguagem, obedece s mesmas regras que os identificadores de classe, objeto e varivel; <argumentos> - indica a lista de argumentos que sero passados como parmetros para o mtodo. A sintaxe dos argumentos a mesma da declarao de variveis: tipo_dado identificador, e os vrios parmetros so separados por vrgulas.
7.2.Funes
As funes so criadas da mesma maneira que os procedimentos. A diferena entre os dois que elas podem ser utilizadas em expresses, como se fossem variveis, pois as funes retornam valores que so associados ao seu nome, e para esses valores necessria a p de dado a ser retornado. Obs: Tanto funes como procedimentos podem utilizar outras funes e procedimentos. Exemplo:
46
import java.util.Scanner; public class ExFatorial { public static void main(String args []) { int num; int fat; Scanner input = new Scanner(System.in); printf ("Informe um nmero para fatorar");
num = input.nextInt();
fat = fatorial (num); System.out.printf ("O fatorial de " + " " + num + " "+
fat); } static int fatorial (int num) { int f = 1; for (int I = 1;I <= num; i++)
f = f + i; return f; }
Parmetros
Parmetros so variveis ou valores que podem ser transferidos do algoritmo principal para um mdulo que est sendo chamado. Eles funcionam como comunicadores entre os mdulos. Existem dois tipos de parmetros: os formais e os reais. Formais so declarados nos mdulos e tratados como as variveis. Tem a funo de receber os valores passados do algoritmo que o chama. O algoritmo que chama a funo ou o procedimento informa os valores que substituiro esses parmetros. Exemplo: Static void multiplicar (double a, double b) { double res; res = a + b; System.out.println("Resultado " + res); }
47
Reais so os valores passados pela rotina chamadora ao mdulo (funo ou procedimento). Esses valores substituem os parmetros formais. Exemplo: import java.util.Scanner; public class ExMultiplica { public static void main(String args []) { int num, num2; Scanner input = new Scanner(System.in); printfln ("Informe o primeiro nmero: ");
num = input.nextInt();
Static void multiplicar (double a, double b) { double res; res = a + b; System.out.println("Resultado " + res); }
48
nome = "ninguem"; } }
public class Classe2{ public Classe2(){ Classe1 c = new Classe1(); System.out.println(c.nome + " , " + c.valor); altera(c); //por referencia System.out.println(c.nome + " , " + c.valor); } public void altera(Classe1 newC){ newC.valor = 100; newC.nome = "Isso referencia"; } public static void main(String args[]){ new Classe2(); } }
8. Busca e Ordenao
Quando o usurio insere os dados no se preocupa em como orden-los ou como achar algum valor dentro de suas variveis (vetor, matrizes). Assim, comum encontrarmos elementos armazenados de maneira aleatria em nossos sistemas. Para se ter um melhor desempenho em um programa a necessidade desta ordenao de grande importncia.
8.1.Ordenao
Centro de Educao Profissional Sebastio de Siqueira CEPSS
49
A realizao de comparaes sucessivas e troca de elementos de posio, os quais, muitas vezes, esto relacionados ou trabalham em conjunto com algoritmo de busca, destinados a localizar determinado elemento de forma mais eficiente chamado de ordenao. 8.1.1.1. Ordenao por seleo
o mtodo considerado um dos mais simples e constitui-se na execuo dos passos indicados a seguir: 1. Selecione o menor elemento da sequncia. 2. Troque-o com o que est na primeira posio. 3. Repita as operaes anteriores para os demais elementos, at que reste apenas um. O exemplo a seguir ilustra a aplicao dessa tcnica para um conjunto de nmeros inteiros, sendo que cada linha corresponde a uma iterao.
Posio Valores Iniciais Iterao 1 Iterao 2 Iterao 3 Iterao 4 Iterao 5 Iterao 6 Iterao 7
1 23 4 4 4 4 4 4 4
2 4 23 12 12 12 12 12 12
3 33 33 33 19 19 19 19 19
4 45 45 45 45 23 23 23 23
5 19 19 19 33 33 28 28 28
6 12 12 23 23 45 45 33 33
7 28 28 28 28 28 33 45 40
8 40 40 40 40 40 40 40 45
O conjunto apresentado faz parte de um vetor, a tcnica procura o menor consumo de memria, evitando, por exemplo, a criao de um novo vetor ordenado partindo do primeiro. A eficincia de um programa de ordenao deve considerar, alm do menor consumo de memria, o menor nmero de iteraes e trocas de elementos para obter o resultado final.
public class ordencaoselecao{
public static void main (String args[]){ int numeros[] = {23, 4, 33, 45, 19, 12, 28, 40}; int menor, x;
50
for(int i = 0; i < numeros.length; i++){ System.out.printf("\nnumeros[ " + i + " ] = " + numeros[i]); } System.out.printf("\n"); System.out.printf("\n*************Ordenados*************"); System.out.printf("\n"); for(int i = 0; i < numeros.length-1; i++){ menor = i; x = numeros[i]; for(int j = i + 1;j < numeros.length;j++){ if(numeros[j] < x){ menor = j; x = numeros[j]; } } numeros[menor] = numeros[i]; numeros[i] = x; } for(int i = 0; i < numeros.length; i++){ System.out.printf("\nnumeros[ " + i + " ] = " + } System.out.printf("\n"); } } numeros[i]);
51
Valores Inicias
Iterao 3
Iterao 5
Iterao 6
Iterao 1
Iterao 2
Iterao 4
1 2 3 4 35 6 7 8
23 4 33 45 19 12 28 40
4 23 12 33 45 19 28 40
4 12 23 19 33 45 28 40
4 12 19 23 28 33 45 40
4 12 19 23 28 33 40 45
4 12 19 23 28 33 40 45
4 12 19 23 28 33 40 45
Em cada passagem, um elemento deslocado para a posio inicial, isto , um elemento ordenado. Assim, uma sequncia com n elementos ter, aps a primeira passagem, um elemento ordenado e n-1 elementos por ordenar. Na segunda passagem, a sequncia ter dois elementos em-2 elementos por ordenar, e assim sucessivamente. O deslocamento do elemento menor para a posio inicial feito por comparaes e trocas sucessivas, iniciando-se pelo penltimo e ultimo. Se o valor do elemento com ndice 07 for maior que o elemento com ndice 08, eles so trocados de posio, no exemplo 02, 28 no maior que 40, ento eles permanecem na mesma posio. O processo prossegue at que seja feita a comparao entre o primeiro e o segundo elementos, lembrando que a cada valores so trazidos para as primeira posies, ao mesmo tempo que os de maiores valores so levados para as ltimas. Para vermos a eficincia da ordenao pelo mtodo da bolha, teremos que olhar os dois exemplos mostrados anteriormente e constataremos nele j na quarta iterao tnhamos os elementos ordenados. E na ordenao por seleo somente na 07 e ltima iterao. Cdigo:
public class metodobolha { public static void main (String args[]) { int numeros[] = {23, 4, 33, 45, 19, 12, 28, 40}; int x,i ; for (i = 0; i<8;i++){ System.out.printf("\n numeros[ " + i + " ] = " + numeros[i]);
Iterao 7 4 12 19 23 28 33 40 45
Posio
52
} System.out.printf("\n"); System.out.printf("\n****** OS NMEROS ORDENADOS MTODO BOLHA *****"); System.out.printf("\n"); //Logo abaico a ordenao com o metodo Bolha for ( i = 1;i < numeros.length; i++) { for (int j = numeros.length-1;j >= i; j--) { if (numeros[j-1] > numeros[j]) { x = numeros[j-1]; numeros[j-1] = numeros[j]; numeros[j] = x; } } } for (i = 0; i<8;i++){ System.out.printf("\n numeros[ " + i+ " ] = " + numeros[i]); } System.out.printf("\n"); } }
8.3.Busca
Possumos os dados e o que fazer com eles? Como recuper-los com eficincia? A responsabilidade do programador. Procurar por nomes e nmeros em uma lista pequena rpido, mas, quando esta lista enorme temos problema. Sistemas trabalham, frequentemente, com a busca de nmeros, cdigos, nomes, siglas, etc. e precisam de uma resposta rpida para no comprometer seu desempenho. Os algoritmos de buscas so alguns dos mais utilizados no mundo da informtica, sendo aplicados em bancos dedados, internet e jogos, entre outros. Aqui sero apresentados alguns exemplos de algoritmos de busca linear e busca binria.
53
O algoritmo que realiza essa busca uma estrutura de repetio que percorre toda a sequncia de elementos, realizando uma condicional que compara o elemento desejado com os elementos existentes na sequncia.
Comparaes sucessivas so feitas entre o elemento que se procura e os elementos da lista, at que uma igualdade seja estabelecida ou que no contenha o elemento desejado na lista.
Figura 5Busca Linear
Quando o elemento encontrado, retorna-se o valor verdadeiro, o que indica o sucesso da busca e encerra a estrutura de repetio. claro que a maneira de encerrar essa estrutura depender da linguagem de programao a ser utilizada, assim como o que o programador necessitar. public class Busca { public static boolean linear (int x, int dados [ ]) { final int n = dados.length; for (int i = 0; i < n; i++) if (x == dados [i]) return true; return false; } plubic static boolean linear(String x, String dados [ ]) { final int n = dados.length; for (int i = 0; i < n; i++) if (x.equalsIgnoreCase (dados [i])) return true; return false; }
54
} A classe Busca incorpora os dois mtodos de busca referenciados pelo nome linear que, como j dissemos, esto sobrecarregados, diferenciados pelos tipos dos dados passados como parmetros. Alm do mtodo j citado, a classe String possui alguns mtodos de comparao direta entre dois string. O mtodo equals (Object) derivado da superclasse Object e pode ser utilizado para comparar o contedo completo de dois objetos quaisquer, inclusive String. Esse mtodo bastante utilizado,mas para nossos exemplos mais conveniente utilizar o mtodo equalsIghoreCase (String), que faz a comparao apenas entre objetos do tipo String, eliminando o problema de comparaes entre minsculas e maisculas. public class Busca { public static boolean linear(int x, int dados[]){ final int n = dados.length; for(int i = 0; i < n; i++) if (x == dados[i]) return true; return false; } //com equalsIgnoreCase para eliminar problemasde comparaes entre minsculas e maisculas public static boolean linear(String x,String dados[]){ final int n = dados.length; for(int i = 0; i < n; i++) if(x.equalsIgnoreCase(dados[i])) return true; return false; } } A classe Busca tem os dois mtodos de busca referenciadospelo nome linear, esto sobrecarregados, diferenciados pelos tipos dos dados passados como parmetros.
55
Quando temos uma sequncia ordenada de elementos, existem outros mtodos de busca que so muito mais adequados, pois permitem realizar uma busca por meio de algoritmos mais eficientes, que podem utilizar um nmero menor de comparaes. Considere uma sequncia ordenada de elementos de qualquer tipo. Em vez de comparar o elemento procurado ao primeiro elemento da sequncia, pode-se compar-lo a um elemento do meio da sequncia. Se o elemento comparado o desejado, a busca termina; seno, pode-se verificar se o elemento desejado maior ou menor que o elemento encontrado. Como todos os elementos esto ordenados, essa verificao elimina a metade da sequncia onde o elemento no pode estar. A segunda comparao ser feita com o elemento do meio da sequncia que restou, e o procedimento anterior se repetir. Dessa forma, cada vez que o elemento no for encontrado, o conjunto a ser pesquisado ser reduzido pela metade, aproximadamente, at que o elemento seja encontrado ou at que a lista no possa mais ser dividida. Esse mtodo foi chamado de mtodo de busca logartmica pelo fato de haver uma reduo logartmica de elementos a serem pesquisados, porem, como essa reduo ocorre pela metade dos elementos da busca em cada comparao, ele tambm conhecido como mtodo de busca binria. Vamos considerar o exemplo abaixo. Suponha que o elemento a ser localizado seja o nmero 329, que ser chamado de x: 500 178 2 487 158 47 35 78 329 215 19 25 214 38 77
1. Passo Ordenar o conjunto: 2 19 25 35 38 47 77 78 158 178 214 215 329 487 500
19
25
35
38
47
77
78
158
178
214
215
329
487
500
3. Passo Efetuar a comparao para verificar se o elemento procurado igual ao elemento central, que ser chamado de meio: x = meio Se o resultado for verdadeiro, a busca dever ser encerrada. Caso contrario, sero executados os passo seguintes. No caso de nosso exemplo: 329 = 78, a resposta falso. Centro de Educao Profissional Sebastio de Siqueira CEPSS
56
4. Passo Efetuar a comparao para verificar se o elemento procurado maior ou menor do que o elemento central: 329 >= 78, a resposta verdadeira. 5. Passo, Proceder a uma nova diviso do conjunto que atenda condio do 4. Passo, isto , se x for maior que o meio, ser dividido o conjunto da direita, seno, o conjunto da esquerda. No caso do exemplo, ser utilizado o conjunto da direita. 158 178 214 215 329 487 500
Repetir os passos 4 e 5 at que o elemento seja encontrado. 329 public class BuscaBinaria { public static boolean binria (int x, int numeros []){ int inicio = 0, fim = numeros.length-1; int meio; while (inicio <= fim) { meio = (inicio + fim) / 2; if ( x == numeros[meio]) return true; if (x < numeros[meios]) fim = meio - 1; else inicio = meio + 1; } return false; } } Esta classe somente apresenta a criao de um mtodo para busca de nmeros inteiros. Seguindo-se as mesmas consideraes de comparaes dadas anteriormente, pode-se modificar ou ampliar essa classe para fazer pesquisa por meio do mtodo de busca binria para outro tipo qualquer ou para strings. Centro de Educao Profissional Sebastio de Siqueira CEPSS 487 500
57
Exemplo completo com insero de nmeros no vetor, ordenao e pesquisa. package tecest; import java.util.Scanner; // importao da Classe Scanner public class exemplobusca // nome da classe { public static void main( String args[] ) { BuscaBinaria busca = new BuscaBinaria(); int qte,num, x, numpesq; boolean achou; Scanner input = new Scanner( System.in ); //cria entrada para teclado System.out.print("Informe quantos nmeros: "); qte = input.nextInt(); int numeros []= new int [qte]; System.out.println("Informe a quantidade de:"); System.out.println(qte); // lao de repetio para preenchimento do vetor for (int i = 0; i < qte; i++){ numeros[i]=input.nextInt(); } for (int i = 0; i < qte; i++){ System.out.println(numeros[i]); } //Logo abaico a ordenao com o metodo Bolha for ( int k = 1;k < numeros.length; k++) { for (int j = numeros.length-1;j >= k; j--) { if (numeros[j-1] > numeros[j]) { x = numeros[j-1]; numeros[j-1] = numeros[j]; numeros[j] = x; }
58
} } for (int i = 0; i < qte; i++){ System.out.println(numeros[i]); } System.out.println("Informe nmero a ser pesquisado: "); numpesq = input.nextInt(); if (busca.binria(numpesq, numeros)==true) System.out.println("O nmero pesquisado encontrado"); else System.out.println("O nmero pesquisado no encontrado"); } }
9.1.Listas
Centro de Educao Profissional Sebastio de Siqueira CEPSS
59
Uma lista uma coleo de elementos do mesmo tipo dispostos linearmente que podem ou no seguir determinada organizao, por exemplo [E1, E2, E3, E4, E5,..., En], onde n deve ser >= 0. Exemplo de lista de pagamentos a serem efetuados em um ms: Lista de pagamentos Prestao do carro Carto de crdito Conta de luz Condomnio TV a cabo Supermercado Quando criamos uma lista para ser utilizada como estrutura de dados, podemos usar como continer para armazenamento dos dados um vetor ou uma matriz, ento dizemos que se trata de uma lista implementada por meio de arranjo (array). Por outro lado, tambm podemos utilizar a alocao dinmica, isto , no criamos um continer para armazenar os dados, mas precisamos referenciar os elementos seguinte e anterior de cada elemento, ento teremos uma lista encadeada. Veja o exemplo acima de lista simples:
Lista de pagamentos [prestao do carro, carto de credito, conta de luz, condomnio, TV a cabo, supermercado]
Essa uma lista que possui seis elementos do tipo literal, e os elementos esto armazenados em um vetor.
9.1.1.
Lista encadeadas
um conjunto de elementos que esto dispostos em uma dada organizao fsica no-linear, isto , esto espalhados pela memria. Para organizar a lista de maneira para que ela possa ser utilizada como um conjunto linear, necessrio que cada elemento do conjunto possua informaes sobre o seu elemento anterior e o seu elemento seguinte. Para
60
exemplificar ser utilizada a lista de pagamentos que devem ser efetuados no ms. Os pagamentos esto dispostos em uma ordem linear:
Lista de pagamentos Prestao do carro Carto de crdito Conta de luz Condomnio TV a cabo Supermercado Olhando para a lista, pode-se perceber qual o primeiro, qual o o segundo e assim por diante. Porm, quando desejamos implementar essa lista em uma estrutura de dados, precisamos dizer qual ser o prximo elemento. Para isso, cada elemento da lista representado por um n, e cada n deve conter os dados e um campo que indique qual o prximo elemento da lista esse campo chamado de referncia (ou ponteiro como em outras linguagens). Observe a seguinte lista com um campo para encadeamento. Lista de pagamentos Prestao do carro Carto de crdito Conta de luz Condomnio TV a cabo Supermercado Referncia para o prximo elemento 2 3 4 5 6 Este o ltimo elemento do conjunto, ento no aponta para nenhum outro.
Carto de crdito 3 Conta da luz
Prestao do carro
Condomnio
TV a cabo
Supermercado
Vantagens:
61
A insero ou remoo de um elemento na lista no implica a mudana de lugar de outros elementos; No necessrio definir, no momento da criao da lista, o nmero mximo de elementos que esta poder ter. Ou seja, possvel alocar memria "dinamicamente", apenas para o nmero de ns necessrios.
Desvantagens: A manipulao torna-se mais "perigosa" uma vez que, se o encadeamento (ligao) entre elementos da lista for mal feito, toda a lista pode ser perdida; Para aceder ao elemento na posio n da lista, deve-se percorrer os n - 1 anteriores.
Encadeamento simples: os elementos da lista possuem apenas uma referncia que aponta para o elemento sucessor ou prximo; Duplamente encadeadas: cada elemento possui um campo que aponta para o seu predecessor (anterior) e outro para o seu sucessor (prximo); Ordenadas: a ordem linear da lista corresponde ordem lienar dos elementos, ist , quando um novo elemento inserido na lista ele deve ser colocado em tal posio que garanta que a ordem da lista ser mantida. Essa ordem pode ser definida por um campo da rea de dados, por exemplo, se tivermos uma lista ordenada com os seguintes valores [1,5,7,9] e desejarmos incluir um novo elemento com o valor 6, este valor dever ser includo entre os valores 5 e 7.
Uma lista ordenada pode ser de encadeamento simples ou duplo, mas o princpio para a ordenao o mesmo.
Circulares: a referncia do prximo do ltimo elemento aponta para o primeiro; e a referncia do anterior do primeiro aponta para o ltimo.
9.1.2.1.
A seguir ser apresentado o algoritmo que representa a criao e a manipulao de uma lista de encadeamento simples. Centro de Educao Profissional Sebastio de Siqueira CEPSS
62
Classe que cria a estrutura de um n simples: class IntNoSimples { int valor; IntNoSimples prox; IntNoSimples(int ValorNo){ valor = ValorNo; prox = null; } } Classe ListaSimples cria a estrutura de uma lista, cujos ns tero a estrutura definida pela classe IntNoSimples. Neste exemplo, os ns so inseridos sempre no final da lista. class ListaSimples { IntNoSimples primeiro, ultimo; int numero_nos; ListaSimples() { primeiro = ultimo = null; numero_nos = 0; } void insereNo_fim(IntNoSimples novoNo) { novoNo.prox = null; if (primeiro == null) primeiro = novoNo; if (ultimo != null) ultimo.prox = novoNo; ultimo = novoNo; numero_nos++; } }
63
O funcionamento da Lista encadeada simples: class ExecListaSimples { public static void main(String[] args) { ListaSimples Slist = new ListaSimples105 (); Slist.insereNo_fim (new IntNoSimples (1)); Slist.insereNo_fim (new IntNoSimples (3)); Slist.insereNo_fim (new IntNoSimples (5)); Slist.insereNo_fim (new IntNoSimples (7)); } } O acrscimo dos mtodos buscar, contar, excluir e exibir: class ExeListaSimplesCompleta { IntNoSimples primeiro, ultimo; int numero_nos; ExeListaSimplesCompleta (){ primeiro = ultimo = null; } void insereNo_fim (IntNoSimples novoNo){ novoNo.prox = null; if (primeiro == null) primeiro = novoNo; if (ultimo != null) ultimo.prox = novoNo; ultimo = novoNo; } void insereNo_inicio (IntNoSimples novoNo){ if (primeiro != null) {novoNo.prox = primeiro; primeiro = novoNo;
64
} else {if (primeiro == null) primeiro = novoNo; ultimo = novoNo; } } int ContarNos(){ int tamanho = 0; IntNoSimples temp_no = primeiro; while (temp_no != null) {tamanho++; temp_no = temp_no.prox; } return tamanho; } void insereNo_posicao(IntNoSimples novoNo, int posicao){ IntNoSimples temp_no = primeiro; int numero_nos = ContarNos(); int pos_aux; if(posicao == 0) {novoNo.prox = primeiro; if(primeiro == ultimo) {ultimo = novoNo;} primeiro = novoNo;} else {if (posicao <= numero_nos) {pos_aux = 1; while(temp_no != null && posicao > pos_aux) {temp_no = temp_no.prox; pos_aux ++; } novoNo.prox = temp_no.prox;
65
temp_no.prox = novoNo; } else {if(posicao > numero_nos) {ultimo.prox = novoNo; ultimo = novoNo; } } } } IntNoSimples buscaNo (int buscaValor){ int i = 0; IntNoSimples temp_no = primeiro; while (temp_no != null) {if (temp_no.valor == buscaValor) {System.out.println ("No " + temp_no.valor + " posio " + i); return temp_no; } i++; temp_no = temp_no.prox; } return null; } void excluiNo (int valor){ IntNoSimples temp_no = primeiro; IntNoSimples noAnterior = null; while (temp_no.prox != null && temp_no.valor != valor) {noAnterior = temp_no; temp_no = temp_no.prox; } System.out.println(temp_no.valor + "proximo" + temp_no.prox.valor); temp_no = noAnterior.prox.prox; System.out.println(temp_no.valor + "proximo" + temp_no.prox.valor);
66
} void exibeLista(){ IntNoSimples temp_no = primeiro; int i = 0; while (temp_no != null) {System.out.println("Valor " + temp_no.valor + " posio " + i); temp_no = temp_no.prox; i++; } } } O funcionamento da lista encadeada simples completa: import javax.swing.JOptionPane; class ListEncaSimples { static ExeListaSimplesCompleta Slist = new ExeListaSimplesCompleta (); int i = 0; IntNoSimples temp_no; int valor; public static void main(String args[]){ int opcao = 1, valor, posicao; while (opcao != 7) { opcao = Integer.parseInt (JOptionPane.showInputDialog(null, "Escolha uma Opao \n" + "1-Inserir N no incio \n" + "2-Inserir N no fim \n" + "3-Inserir N em uma posio\n" + "4-Localizar N \n" + "5-Excluir N \n" + "6-Exibir lista \n" + "7-Sair")); switch (opcao) { case 1 : valor = Integer.parseInt (JOptionPane.showInputDialog(null, "Inserir um N no incio da lista \n" + "Digite um valor")); Slist.insereNo_inicio(new IntNoSimples(valor)); break;
67
case 2 : valor = Integer.parseInt (JOptionPane.showInputDialog(null, "Inserir um N no final da lista \n" + "Digite um valor")); Slist.insereNo_fim(new IntNoSimples(valor)); break; case 3 : valor = Integer.parseInt (JOptionPane.showInputDialog(null, "Inserir um N em uma posio \n" + "Digite um valor")); posicao = Integer.parseInt (JOptionPane.showInputDialog(null, "Digite a posio")); Slist.insereNo_posicao(new IntNoSimples(valor),posicao); break; case 4: valor = Integer.parseInt (JOptionPane.showInputDialog(null, "Localiza um valor \n" + "Digite um valor")); Slist.buscaNo(valor); break; case 5: valor = Integer.parseInt (JOptionPane.showInputDialog(null, "Exlui um n da lista \n" + "Digite um valor")); Slist.excluiNo(valor); break; case 6: JOptionPane.showMessageDialog(null,"Exibe a lista"); Slist.exibeLista(); break; default : JOptionPane.showMessageDialog(null,"Sair"); } } } } 9.1.2.2. Lista Duplamente encadeadas
68
Quando se percorre uma lista de encadeamento simples bastante difcil fazer o caminho inverso. Na listas de encadeamento duplo esse problema no existe, pois cada n possui uma referncia para o prximo elemento da lista e outra para o anterior. Criao do n: class IntNoDuplo { int valor; IntNoDuplo prox; IntNoDuplo ant; IntNoDuplo (int ValorNo){ valor = ValorNo; prox = ant = null; } } Implementao dos mtodos inserir, alterar(pegar), excluir: public class ListaDupla { IntNoDuplo primeiro, ultimo; int numero_nos; ListaDupla(){ primeiro = ultimo = null; numero_nos = 0; } void insereNo (IntNoDuplo novoNo){ novoNo.prox = null; novoNo.ant = ultimo; if (primeiro == null) primeiro = novoNo; if (ultimo != null) ultimo.prox = novoNo; ultimo = novoNo; numero_nos++;
69
} IntNoDuplo pegarNo (int indice){ IntNoDuplo temp_no = primeiro; for (int i = 0; (i < indice) && (temp_no != null); i++) temp_no = temp_no.prox; return temp_no; } void incluiNo (IntNoDuplo novoNo, int indice){ IntNoDuplo temp_no = pegarNo (indice); novoNo.prox = temp_no; if (novoNo.prox != null){ novoNo.ant = temp_no.ant; novoNo.prox.ant = novoNo; } else { novoNo.ant = ultimo; ultimo = novoNo; } if (indice == 0){ primeiro = novoNo; } else { novoNo.ant.prox = novoNo; } numero_nos++; } void excluiNo (int indice){ if (indice == 0){ primeiro = primeiro.prox; if (primeiro != null) primeiro.ant = null; } else { IntNoDuplo temp_no = pegarNo (indice); temp_no.ant.prox = temp_no.prox; if (temp_no != ultimo){
70
temp_no.prox.ant = temp_no.ant; } else { ultimo = temp_no; } } numero_nos--; } } Utilizao das classes criadas anteriormente: class ExListaDupla{ public static void main(String[] args){ ListaDupla Slist = new ListaDupla (); Slist.insereNo (new IntNoDuplo (1)); Slist.insereNo (new IntNoDuplo (3)); Slist.insereNo (new IntNoDuplo (5)); Slist.insereNo (new IntNoDuplo (7)); IntNoDuplo temp_no = Slist.primeiro; while (temp_no != null){ System.out.println (temp_no.valor); temp_no = temp_no.prox; } Slist.incluiNo (new IntNoDuplo (2), 1); System.out.println ("Apos incluir o no 2..."); temp_no = Slist.primeiro; while (temp_no != null){ System.out.println (temp_no.valor); temp_no = temp_no.prox; } Slist.excluiNo (2); System.out.println ("Apos excluir o no 3..."); temp_no = Slist.primeiro; while (temp_no != null){
71
9.1.3. Filas
O conceito de fila em programao o mesmo das filas dos nosso dia a dia, nas quais esperamos ser atendidos em ordem: o primeiro elemento a entrar na fila ser o primeiro elemento a sair. Esse conceito conhecido como first in, first out ou FIFO, expresso conhecida em portugus como PEPS ou "primeiro que entra, primeiro que sai". Ento, no conceito de Fila, os elementos so atendidos, ou utilizados, sequencialmente, na ordem em que so armazenados. As filas (queues) so conjuntos de elementos (ou listas) cujas operaes de insero so feitas por uma extremidade, e as de remoo, por outra. Como exemplo, pode-se implementar uma fila de impresso, na qual os arquivos que devem ser impressos so organizados em uma lista e sero impressos na ordem de chegada, medida que a impressora estiver disponvel. Podemos utilizar a para implementao das filas ou por objetos(referncia). Primeiro iremos utilizar os objetos (referncia), utilizando para isto uma array. Para isto precisamos construir um registro que contenha as informaes da fila, como o incio, o final e o continer de elementos que um vetor; neste caso cada um dos elementos da fila ser representado por uma posio no vetor. Veja a estrutura: class Fila { int tamanho; int inicio; int fim; int total; int vetor[]; Fila(int tam) {
72
inicio = 0; fim = 0; total = 0; tamanho = tam; vetor = new int [tam]; } public boolean vazia () { if (total == 0) return true; else return false; } public boolean cheia () { if (total >= tamanho) return true; else return false; } public void enfileirar(int elem) { if (!cheia()) { vetor[fim] = elem; fim++; total++; if (fim >= tamanho) fim = 0; } else { System.out.println("Fila Cheia"); } } public String desenfileirar() {String elem = "Fila vazia"; { if (vazia() == false)
73
{elem = String.valueOf(vetor[inicio]); inicio++; if (inicio >= tamanho) inicio = 0; total --; return elem; } else return elem; } } public void exibeFila() {for (int i = 0; i < total; i++) {System.out.println("posicao " + i + " valor " + vetor[i]); } } } Vantagens: A insero ou remoo de um elemento na lista no implica a mudana de lugar de outros elementos; No necessrio definir, no momento da criao da lista, o nmero mximo de elementos que esta poder ter. Ou seja, possvel alocar memria "dinamicamente", apenas para o nmero de ns necessrios. Desvantagens:
A manipulao torna-se mais "perigosa" uma vez que, se o encadeamento (ligao) entre elementos da lista for mal feito, toda a lista pode ser perdida; Para aceder ao elemento na posio n da lista, deve-se percorrer os n - 1 anteriores.
9.1.4. Pilhas
As pilhas tambm so conhecidas como lista LIFO ou PEPS. Trata-se de uma lista linear em que todas as operaes de insero e remoo so feitas por um nico extremo denominado topo. Um exemplo bastante comum em que se aplica o conceito de pilhas o de uma pilha de pratos que esto guardados no armrio: quando a pessoa utiliza um deles, pega
74
sempre o prato que se encontra no topo da pilha, assim como, quando um novo prato for guardado, ser colocado no topo. Isso acontece porque apenas uma das extremidades da pilha est acessvel. Mtodo pilha:
public class pilha { int tamanho; int topo; Object vetor[]; pilha (int tam){ topo = -1; tamanho = tam; vetor = new Object [tam]; } public boolean vazia(){ if(topo == -1) return true; else return false; } public boolean cheia(){ if (topo == tamanho -1) return true; else return false; } public void empilhar (Object elem){ if (cheia()== false){ topo++; vetor[topo] = elem; } else System.out.println("Pilha Cheia"); } public Object desempilhar(){ Object valorDesempilhado; if (vazia() == true) valorDesempilhado = "Pilha Vazia"; else{ valorDesempilhado = vetor[topo]; topo--; } return valorDesempilhado; } public void exibePilha(){ if (vazia() == true) System.out.println ("Pilha Vazia");
75
else { for (int i = topo;i >= 0;i--) System.out.println("Elemento " + vetor[i] + " posio " + i); } } }
");
76
} }
9.1.5. rvores
Uma rvore uma estrutura de dados bidimensional, no-linear, que possui propriedades especiais e admite muitas operaes de conjuntos dinmicos, tais como: pesquisa, insero, remoo, entre outros. diferente das listas e pilhas, uma vez que estas so estruturas de dados lineares. As rvores so muito teis para implementao de algoritmos que necessitam de estruturas hierrquicas, como, por exemplo, os diretrios ou as pastas de arquivos de um computador.
Figura um exemplo de rvore (Windows Explorer) Uma rvore, de modo geral, possui as seguintes caractersticas:
N raiz n do topo da rvore, do qual descendem os demais ns. o primeiro n da rvore; N interior n do interior da rvore (que possui descendentes); N terminal n que no possui descendentes; Trajetria nmero de ns que devem ser percorridos at o n determinado; Grau do n nmero de ns descendentes do n, ou seja, o nmero de subrvores de um n;
77
Grau da rvore nmero mximo de subrvores de um n; Altura da rvore nmero mximo de nveis dos seus ns; Altura do n nmero mximo de nveis dos seus ns.
As rvores podem ser do tipo lista generalizadas ou binrias, entre outras. As rvores do tipo listas generalizadas possuem ns com grau maior ou igual a zero, enquanto uma rvore do tipo binria sempre possui ns com grau menor ou igual a 02. Classe representa o n da rvore: class BIntNo{ int valor; BIntNo esq, dir; BIntNo (int novoValor){ valor = novoValor; } } 9.1.5.1. rvores binrias
Uma rvore binria sempre possui ns com grau menor ou igual a 02, isto , nenhum n possui mais do que dois descendentes diretos (dois filhos). Nesse tipo de rvore tambm existe uma particularidade quanto posio dos ns: os ns da direita sempre possuem valor superior ao do n pai, e os ns da esquerda sempre possuem valor inferior ao do n pai.
Figura rvore binria Classe completa de uma rvore: Centro de Educao Profissional Sebastio de Siqueira CEPSS
78
class BArvore{ BIntNo Raiz; private BIntNo inserir (BIntNo arvore, int novoNo){ if (arvore == null) return new BIntNo(novoNo); else {if (novoNo < arvore.valor) arvore.esq = inserir (arvore.esq, novoNo); else arvore.dir = inserir (arvore.dir, novoNo); return arvore;} } public void inserirNo (int novoValor){ Raiz = inserir (Raiz, novoValor); } private void exibir_esquerdo (BIntNo arv){ if (arv != null){ exibir_esquerdo (arv.esq); System.out.println (arv.valor); }} private void exibir_direito (BIntNo arv){ if (arv != null){ exibir_direito (arv.dir); System.out.println (arv.valor); } } public void exibir_raiz() {System.out.println("Raiz " + Raiz.valor); } public void exibirNo_esq (){ exibir_esquerdo (Raiz); }
79
public void exibirNo_dir (){ exibir_direito (Raiz); } public void excluirNo (int item){ try{ BIntNo tempNo = Raiz, pai = null, filho = Raiz, temp; while (tempNo != null && tempNo.valor != item){ pai = tempNo; if (item < tempNo.valor) tempNo = tempNo.esq; else tempNo = tempNo.dir; } if (tempNo == null) System.out.println ("Item nao localizado."); if (pai == null){ if (tempNo.dir == null) Raiz = tempNo.esq; else if (tempNo.esq == null) Raiz = tempNo.dir; else{ for (temp = tempNo, filho = tempNo.esq; filho.dir != null; temp = filho, filho = filho.dir); if (filho != tempNo.esq){ temp.dir = filho.esq; filho.esq = Raiz.esq; } filho.dir = Raiz.dir; Raiz = filho; } } else if (tempNo.dir == null){ if (pai.esq == tempNo)
80
pai.esq = tempNo.esq; else pai.dir = tempNo.esq; } else if (tempNo.esq == null){ if (pai.esq == tempNo) pai.esq = tempNo.dir; else pai.dir = tempNo.dir; } else { for (temp = tempNo, filho = tempNo.esq; filho.dir != null; temp = filho, filho = filho.dir); if (filho != tempNo.esq){ temp.dir = filho.esq; filho.esq = tempNo.esq; } filho.dir = tempNo.dir; if (pai.esq == tempNo) pai.esq = filho; else pai.dir = filho; } } catch (NullPointerException erro) { //Item nao encontrado } } } Utilizao do cdigo acima: class usaArvore{ public static void main(String[] args){ BArvore arvore1 = new BArvore (); arvore1.inserirNo (14); arvore1.inserirNo (16);
81
arvore1.inserirNo (12); arvore1.inserirNo (11); arvore1.inserirNo (17); arvore1.inserirNo (15); arvore1.exibirNo_esq(); arvore1.exibirNo_dir(); arvore1.inserirNo (10); arvore1.inserirNo (13); arvore1.exibir_raiz(); System.out.println ("Ns a esquerda "); arvore1.exibirNo_esq(); System.out.println ("Ns a direita "); arvore1.exibirNo_dir(); System.out.println("Excluso de n"); arvore1.excluirNo(12); arvore1.exibir_raiz(); System.out.println ("rvore aps a excluso do n de valor 12"); System.out.println ("Ns a esquerda "); arvore1.exibirNo_esq(); System.out.println ("Ns a direita "); arvore1.exibirNo_dir(); } }
82
10.
Bibliografia
Puga, Sandra; issetti, Gerson. Lgica de programao e estrutura de dados com aplicaes em Java. 2 ed, So Paulo: Pearson,2009. T. Goodrich, Michael; Tamassia, Roberto. Estruturas de dados e Algoritmos em Java. 4 ed, So Paulo: Bookman, 2006. http://www.gforum.tv/board/1345/120437/manual-java-arrays-em-java.html http://pt.wikipedia.org/wiki/Fatorial