You are on page 1of 88

TCNICA DE PROGRAMAO E ESTRUTURA DE DADOS

Curso Tcnico de Nvel Mdio em Informtica

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

Visite nosso site: www.cepss.com.br

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

Centro de Educao Profissional Sebastio de Siqueira CEPSS

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

O JAVA NA SUA MQUINA.............................................................................4

1. Windows 95/98/ME:........................................................................................................4 2. Windows XP/2000:..........................................................................................................4 2. O BSICO...................................................................................................5 2.1.CONVENO 2.3.PONTO 2.4. A


DA LINGUAGEM SEQUNCIA

.......................................................................................5
E O ESPAO EM BRANCO............................................................5

2.2. SEQUNCIA {

}.......................................................................................5

E VRGULA,

BLOCOS

DECLARAO IMPORT.............................................................................................5

2.5.COMENTRIOS........................................................................................................6 2.6.PALAVRAS RESERVADAS.............................................................................................6 2.7.O


PRIMEIRO

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

2.8. IDENTIFICADORES..................................................................................................10 2.9. VARIVEIS 2.10. MAIS


E

CONSTANTES......................................................................................10
DE INSTNCIA.........................................................................11

SOBRE ATRIBUIES......................................................................................11

2.11. DEFININDO VARIVEIS 2.12. VARIVEIS 2.13. ESCOPO 2.14. TIPOS


DE

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

ENTRE TIPOS PRIMITIVOS..........................................................................13

2.15.1.1.Converso.........................................................................................................................13 2.15.1.2.Promoo Aritmtica.........................................................................................................14

2.16.STRING........................................................................................................14 2.17.EXPRESSES
E OPERADORES....................................................................................15

2.17.1.1.Atribuio..........................................................................................................................15 2.17.1.3.Aritmticos........................................................................................................................15 2.17.1.4. Incrementos e decrementos.............................................................................................16

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

Centro de Educao Profissional Sebastio de Siqueira CEPSS

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

3.LENDO E ESCREVENDO VARIVEIS..............................................................22 4.ESTRUTURAS DE CONTROLE.......................................................................24 4.1.ESTRUTURA 4.2.ESTRUTURA


DE

SELEO

OU

CONDICIONAL.....................................................................24

4.1.1Comando if else.....................................................................................................24
DE

REPETIO.......................................................................................26

3.Comando while..............................................................................................................26 4.Comando do while.........................................................................................................28 5.Comando for..................................................................................................................29 4.3.ESTRUTURA


DE

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

6.ESTRUTURA DE DADOS..............................................................................36 6.1.ARRAY..............................................................................................................36 6.2.CURIOSIDADES


SOBRE

ARRAY.....................................................................................38

7.FUNO E PROCEDIMENTO.........................................................................44 7.1.PROCEDIMENTO....................................................................................................44 7.2.FUNES ..........................................................................................................45 8.BUSCA E ORDENAO................................................................................48 8.1.ORDENAO........................................................................................................48


8.1.1.1.Ordenao por seleo........................................................................................................49

8.2.ORDENAO

POR TROCAS

MTODO DA BOLHA................................................................50

8.3.BUSCA..............................................................................................................52 8.3.1.BUSCA LINEAR (OU


SEQENCIAL).............................................................................52 BUSCA LOGARTMICA)...................................................................54

8.3.2.BUSCA BINRIA (OU

9.ESTRUTURAS DE DADOS DINMICAS ..........................................................58 9.1.LISTAS..............................................................................................................58 9.1.1.LISTA 9.1.2.TIPOS


ENCADEADAS.............................................................................................59 DE

LISTA

ENCADEADAS..................................................................................61

9.1.2.1.Lista encadeamento Simples...............................................................................................61 9.1.2.2.Lista Duplamente encadeadas.............................................................................................67

Centro de Educao Profissional Sebastio de Siqueira CEPSS

9.1.3.FILAS.............................................................................................................71 9.1.4.PILHAS...........................................................................................................73 9.1.5.RVORES .......................................................................................................76


9.1.5.1.rvores binrias...................................................................................................................77

10.BIBLIOGRAFIA.........................................................................................82

Centro de Educao Profissional Sebastio de Siqueira CEPSS

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

> Delphi; > C; > C++; >Python;

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;

Centro de Educao Profissional Sebastio de Siqueira CEPSS

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

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).

Figura 1Funcionamento da JVM(Java Virtual Machine)

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

Centro de Educao Profissional Sebastio de Siqueira CEPSS

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

.
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.

Figura 3 Funcionamento do Java em diferentes plataformas

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/

1.2.Configurando o JAVA no Linux


A configurao do pacote J2SDK (Java Software Development Kit - ou simplesmente JDK - o ambiente de desenvolvimento Java) muito simples.

Centro de Educao Profissional Sebastio de Siqueira CEPSS

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

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

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

1.3.Instalando o Java na sua mquina


- Aps o trmino do download, execute o arquivo que voc baixou, e siga as instrues de instalao. - Na primeira tela que aparecer (a de boas vindas), basta clicar em Next. - A prxima tela a de licensa de uso. Clique em "Yes" para continuar. - Agora o instalador lhe d a oportunidade de selecionar em que diretrio instalar o SDK. Por padro fica em c:\j2sdk1.4.0_XX. Mude-o para "c:\java". Clique em Next. - Na prxima tela possvel selecionar os componentes a serem instalados. Deixe todos marcados. Clique em Next. - Na prxima tela, chamada "Select Browsers", o instalador lhe pergunta em quais navegadores para ser habiltado o plugin Java. Como muito possivelmente o seu browser j tem tal plugin, e levando em considerao que usar o plugin da Sun pode acarretar em certas incompatibilidades, desmarque todas as opes. Clique em Next. - O Java SDK ir ser copiado para o sistema. Aguarde a finalizao. Apos o trmino, clique em Finish. - Agora ser necessrio configurar 3 variveis de ambiente, JAVA_HOME, PATH e CLASSPATH.

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

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

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(}).

2.2. Sequncia { sequncia }


Cria uma seqncia, a qual agrupa comandos e variveis. Quando uma sequncia possuir apenas um comando os operadores { e } so opcionais, caso contrrios so obrigatrios e cada comando dentro da sequncia deve ser terminado por ;

2.3.Ponto e vrgula, Blocos e o espao em branco


Class - Nomes de classes podem ser maisculas ou minsculas ou misturadas (maisculas e minsculas), mas por conveno o nome das classes comeam por letra maiscalas.

2.4. A declarao import

Centro de Educao Profissional Sebastio de Siqueira CEPSS

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

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

Centro de Educao Profissional Sebastio de Siqueira CEPSS

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

Instanceof: Return: Switch: While: Tratamento de erros Assert: Catch: Finally:

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.

2.7.O primeiro Programa em Java


2.7.1.1. COMPILANDO UM PRIMEIRO PROGRAMA:

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

Centro de Educao Profissional Sebastio de Siqueira CEPSS

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

c.

Chame o compilador Java para este arquivo: Javac HelloInternet.Java

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

Centro de Educao Profissional Sebastio de Siqueira CEPSS

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

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.

Centro de Educao Profissional Sebastio de Siqueira CEPSS

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

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 $

Observao: Os identificadores Java so case-sensitive

2.9. Variveis e Constantes


Podem ser declaradas em qualquer lugar dentro de uma classe ou de um mtodo. Todas as instancias, classes e variveis globais suportam maisculas e minsculas. Uma constante definida com a palavra reservada final e o seu contedo uma vez atribudo no poder mais ser alterado. A declarao de variveis e constantes em Java feita colocando o identificador do tipo seguido do identificador da varivel. tipo varivel [ = ValorInicial ]; final tipo CONSTANTE [ = ValorInicial ]; Em Java as constantes so variveis declaradas como final.

Centro de Educao Profissional Sebastio de Siqueira CEPSS

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

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.

Mais sobre atribuies

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.

Definindo Variveis de Instncia

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

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

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.

Tipos de Dados Primitivos

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

Tipos Numricos Inteiros


Faixa -128 at +127 -32,768 at +32,767 -2,147,483,648 at+2,147,483,647 -9,223,372,036,854,775,808 at +9,223,372,036,854,775,807

Tamanho em bits 8 16 32 64

2.14.1.2.
Tipo float double

Tipos Numricos Reais


Faixa -3.40292347E+38 at +3.40292347E+38 -1.79769313486231570E+308 at +1.79769313486231570E+308

Tamanho em bits 32 64

2.14.1.3.
Tipo char

Tipo caracter
Faixa UNICODE - 65536 caracteres possveis

Tamanho em bits 16

Centro de Educao Profissional Sebastio de Siqueira CEPSS

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

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 \ \' \\

Caracteres Especiais de Escape:


caracteres Unicode retrocesso tab avano de linha retorno de carro aspas apstrofo barra invertida

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.

Converso entre tipos primitivos

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

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

14

Figura 4 O widening segue o sentido das flechas. Narrowing no sentido contrrio

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

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

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

Centro de Educao Profissional Sebastio de Siqueira CEPSS

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

16

* / %

op1 - op2 op1 * op2 op1 / op2 op1 % op2

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

Como no C e no C++ o Java tambm possui incrementadores e decrementadores:

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

Centro de Educao Profissional Sebastio de Siqueira CEPSS

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

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.

Precedncia dos Operadores

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 *, /, %

Centro de Educao Profissional Sebastio de Siqueira CEPSS

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

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

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

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

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

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

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

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

Centro de Educao Profissional Sebastio de Siqueira CEPSS

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

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;

3. Lendo e Escrevendo Variveis


A linguagem Java no possui comandos especficos para leitura de variveis, pois a entrada e sada de dados so tratadas de forma independente de dispositivo, atravs das classes do pacote java.io. Dessa forma usaremos duas classes que veremos em estrutura de dados, a classe Scanner e a Classe BufferedReader contendo mtodos "estticos" para leitura de variveis do tipo int, char, float e String, a fim de facilitar a prtica dos conceitos, que teremos durante o aprendizado de Tcnicas de Programao. Para escrever variveis na sada padro podem ser utilizados os comando:
System.out.print(String); System.out.println(String); //Salta Linha

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

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

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:

Centro de Educao Profissional Sebastio de Siqueira CEPSS

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

24

9.

Scanner input = new Scanner( System.in );

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;

Centro de Educao Profissional Sebastio de Siqueira CEPSS

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

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");

Centro de Educao Profissional Sebastio de Siqueira CEPSS

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

26

else System.out.println("Data Invlida"); } }

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

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

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 ) {

Centro de Educao Profissional Sebastio de Siqueira CEPSS

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

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

Centro de Educao Profissional Sebastio de Siqueira CEPSS

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

29

fatorial *= numero; numero--; } System.out.println("Fatorial : " + fatorial); } while (numero != 0); } }

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

Centro de Educao Profissional Sebastio de Siqueira CEPSS

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

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(); } } }

4.3.Estrutura de Seleo Mltipla


6. Comando switch
Compara (igualdade) uma varivel ( byte, char, short ou int ) a uma relao de valores, permitindo associar comandos a cada valor da relao. O valor comparado com cada um dos casos relacionados. Se a combinao no for encontrada, o bloco default executado. O default opcional, ento caso este no esteja associado ao comando, o bloco do swicth sem executar nada.
switch (varivel) { case valor1 : sequncia_1; case valor2 : sequncia2; ... case valorN : sequnciaN; [ default : sequnciaDefault; ] }

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

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

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

Centro de Educao Profissional Sebastio de Siqueira CEPSS

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

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

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

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) {

};

Centro de Educao Profissional Sebastio de Siqueira CEPSS

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

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

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

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

5.2. Srie de Finobacci


Na matemtica, os Nmeros de Fibonacci so uma seqncia.

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

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

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

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

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

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

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

ExemploException1 exemploExc = new ExemploException1();

6.2.Curiosidades sobre Array


Sobre as Arrays temos algo que devemos estudar, array uma matriz mesmo que seja de uma coluna e uma linha (vetor), mais de uma linha e coluna(matriz), como chego nos nmeros inseridos na diagonal principal, na diagonal secundria, nos nmeros abaixo da diagonal principal, acima da diagonal secundria, os nmeros impares do lado esquerdo entre as diagonais, os nmeros do lado direito entre a diagonal principal e a secundria? Todas estas perguntas sanaremos no exemplo abaixo que ser de uma matriz 5 X 5. Obs: O encontro de uma linha com uma coluna forma uma clula

Centro de Educao Profissional Sebastio de Siqueira CEPSS

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

39

Achando as diagonais: I. Diagonal Principal: a. A Linha = Coluna


1 1 2 3 4 5 L1XC1 L2XC2 L3XC3 L4XC4 L5XC5 2 3 4 5

A linha IGUAL a coluna.

II.

Diagonal Secundria: a. A Linha + Coluna = 6


1 2 3 4 5 L1XC5 L2XC4 L3XC3 L4XC2 L5XC1

1 2 3 4 5

A SOMA da linha com a coluna IGUAL a 6. Centro de Educao Profissional Sebastio de Siqueira CEPSS

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

40

III.

Clulas acima da diagonal principal: a. A Linha < Coluna


1 2 3 4 5 L1XC5 L2XC5 L3XC5 L4XC5 L5XC5

1 2 3 4 5

L1XC1 L1XC2 L1XC3 L1XC4 L2XC2 L2XC3 L2XC4 L3XC3 L3XC4 L4XC4

A linha MENOR que a coluna.

IV.

Clulas abaixo da diagonal principal: a. A Linha > Coluna


1 2 3 4 5

1 2 3 4 5

L1XC1 L2XC1 L2XC2 L3XC1 L3XC2 L3XC3 L4XC1 L4XC2 L4XC3 L4XC4 L5XC1 L5XC2 L5XC3 L5XC4 L5XC5

Centro de Educao Profissional Sebastio de Siqueira CEPSS

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

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

A soma da linha com a coluna MAIOR 5.

Centro de Educao Profissional Sebastio de Siqueira CEPSS

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

42

VII.

Clula igual para a diagonal principal e a secundria: a. A se (L = C) e (L + C = 6)


1 2 3 4 5 L1XC5 L2XC2 L3XC3 L4XC2 L5XC1 L4XC4 L5XC5 L2XC4

1 2 3 4 5

L1XC1

A Linha IGUAL a Coluna e a SOMA da linha com a coluna IGUAL a 6, ficar:

VIII.

Clulas ABAIXO da diagonal principal e a secundria: a.


1

se (C + L > 6 )
2 3 4 5 L1XC5 L2XC2 L3XC3 L4XC2 L4XC4 L5XC5 L2XC4

1 2 3 4 5

L1XC1

L5XC1

A SOMA da linha com a coluna MAIOR a 6.

Centro de Educao Profissional Sebastio de Siqueira CEPSS

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

43

IX.

Clulas ACIMA da diagonal principal e a secundria: a. A se (C + L < 6)


1 2 3 4 5 L1XC5 L2XC2 L3XC3 L4XC2 L5XC1 L4XC4 L5XC5 L2XC4

1 2 3 4 5

L1XC1

A SOMA da linha com a coluna MENOR que 6.

X.

Clulas LADO ESQUERDO diagonal Principal e Secundria: a. se (L > C) e (L + C < 6)


1 2 3 4 5 L1XC5 L2XC2 L3XC3 L4XC2 L5XC1 L4XC4 L5XC5 L2XC4

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

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

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

A LINHA menor que A COLUNA e soma DE LINHA E COLUNA maior que 6 .

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

Centro de Educao Profissional Sebastio de Siqueira CEPSS

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

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.

Existem outros modificadores, como abstract, native, transient, volatile e syncronized.

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:

Centro de Educao Profissional Sebastio de Siqueira CEPSS

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

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); }

Centro de Educao Profissional Sebastio de Siqueira CEPSS

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

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();

printfln ("Informe o segundo nmero: ");


num2 = input.nextInt(); multiplicar (num, num2); }

Static void multiplicar (double a, double b) { double res; res = a + b; System.out.println("Resultado " + res); }

Passagem de parmetros por valor e por referncia


Na passagem de parmetros por valor, o valor do parmetro real copiado para o parmetro formal do mdulo, preservando, assim, o valor original do parmetro. O Exemplo conforme o exemplo ExMultiplica. Na passagem de parmetros por referncia, toda alterao feita nos parmetros formais reflete-se nos parmetros reais. Assim, o parmetro de entrada e sada. Exemplo. public class Classe1{ int valor; String nome; public Classe1(){ valor = 0; Centro de Educao Profissional Sebastio de Siqueira CEPSS

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

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

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

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

Tabela 1 Exemplo de ordenao por seleo

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;

Centro de Educao Profissional Sebastio de Siqueira CEPSS

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

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]);

8.2.Ordenao por trocas mtodo da bolha


O mtodo de ordenao por trocas consiste em comparar pares consecutivos de valores e permut-los caso estejam fora de ordem. O algoritmo determina uma sequncia de com de comparaes sistemticas que varrem a sequncia de dados como um todo, fazendo com que o menor valor (ou maior, de acordo com a ordem desejada) acabe no incio da sequncia, e tenha incio uma nova srie de comparaes sistemticas.

Centro de Educao Profissional Sebastio de Siqueira CEPSS

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

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

Tabela 2Exemplo de ordenao por trocas

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]);

Centro de Educao Profissional Sebastio de Siqueira CEPSS

Iterao 7 4 12 19 23 28 33 40 45

Posio

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

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.

8.3.1. Busca Linear (ou seqencial)


A maneira mais fcil de fazer uma busca comparar o elemento que se est procurando com todos os elementos guardados, um a um, isto , procurar o elemento sequencialmente at que ele seja encontrado. Centro de Educao Profissional Sebastio de Siqueira CEPSS

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

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; }

Centro de Educao Profissional Sebastio de Siqueira CEPSS

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

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.

8.3.2. Busca Binria (ou busca logartmica)


O mtodo de busca linear o mais adequado quando no se tem nenhuma informao a respeito da estrutura em que a busca ser realizada. Contudo, se o elemento\procurado estiver entre os ltimos ou no estiver no conjunto, esse mtodo poder ser demasiadamente lento, pois ocorrero comparaes com todos os elementos de um conjunto que pode ser muito grande.

Centro de Educao Profissional Sebastio de Siqueira CEPSS

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

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

2. Passo Dividir o conjunto ao meio:

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

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

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

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

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; }

Centro de Educao Profissional Sebastio de Siqueira CEPSS

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

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. Estruturas de dados Dinmicas


As estruturas de dados so, muitas vezes, a maior dificuldades do programador inexperiente. Quando falamos em listas, filas, pilhas e rvores podemos dizer que todas so, na verdade "listas de informaes" cujas diferena principal est no acesso a essas "listas" para incluso e remoo de informaes. Quando falamos em alocao dinmica, utilizamos posies descontinuadas da memria RAM. Isso possvel pois cada um dos elementos da "lista" deve possuir uma referncia para os elementos seguintes e anterior. Essa referncia o endereo da posio de memria em que se encontra tal elemento. Obs: a linguagem Java no suporta ponteiros. Assim, sero utilizados objetos que faro referncia aos elementos.

9.1.Listas
Centro de Educao Profissional Sebastio de Siqueira CEPSS

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

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

Centro de Educao Profissional Sebastio de Siqueira CEPSS

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

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:

Centro de Educao Profissional Sebastio de Siqueira CEPSS

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

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.

9.1.2. Tipos de Lista encadeadas


As listas encadeadas podem ser do tipo:

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.

Lista encadeamento Simples

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

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

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++; } }

Centro de Educao Profissional Sebastio de Siqueira CEPSS

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

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;

Centro de Educao Profissional Sebastio de Siqueira CEPSS

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

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;

Centro de Educao Profissional Sebastio de Siqueira CEPSS

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

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);

Centro de Educao Profissional Sebastio de Siqueira CEPSS

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

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;

Centro de Educao Profissional Sebastio de Siqueira CEPSS

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

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

Centro de Educao Profissional Sebastio de Siqueira CEPSS

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

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++;

Centro de Educao Profissional Sebastio de Siqueira CEPSS

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

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){

Centro de Educao Profissional Sebastio de Siqueira CEPSS

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

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){

Centro de Educao Profissional Sebastio de Siqueira CEPSS

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

71

System.out.println (temp_no.valor); temp_no = temp_no.prox; } } }

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) {

Centro de Educao Profissional Sebastio de Siqueira CEPSS

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

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)

Centro de Educao Profissional Sebastio de Siqueira CEPSS

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

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

Centro de Educao Profissional Sebastio de Siqueira CEPSS

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

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");

Centro de Educao Profissional Sebastio de Siqueira CEPSS

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

75

else { for (int i = topo;i >= 0;i--) System.out.println("Elemento " + vetor[i] + " posio " + i); } } }

Utilizao do mtodo Pilha:


import java.util.Scanner; public class usaPilha { public static void main (String args[]){ pilha P = new pilha(5); int i = 0; int valor = 0; Scanner input = new Scanner(System.in); int opcao = 1; while (opcao != 4){ System.out.println("Escolha uma Opo: "); System.out.println("1 - Inserir um elemento na pilha: System.out.println("2 - Excluir elemento da Pilha: "); System.out.println("3 - Exibir elementos da fila: "); System.out.println("4 - Sair: "); opcao = input.nextInt(); switch (opcao){ case 1 : System.out.println("Empilhar elemento \n" + "Digite um Valor" ); valor = input.nextInt(); P.empilhar(valor); break; case 2 : System.out.println("Empilhar desempilhado P.desempilhar() ); break; case 3 : P.exibePilha(); break; default: System.out.println("Sair !"); break; } } " +

");

Centro de Educao Profissional Sebastio de Siqueira CEPSS

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

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;

Centro de Educao Profissional Sebastio de Siqueira CEPSS

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

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

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

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); }

Centro de Educao Profissional Sebastio de Siqueira CEPSS

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

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)

Centro de Educao Profissional Sebastio de Siqueira CEPSS

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

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);

Centro de Educao Profissional Sebastio de Siqueira CEPSS

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

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(); } }

Centro de Educao Profissional Sebastio de Siqueira CEPSS

Tcnico em Informtica Lgica de Programao e Estrutura de Dados

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

Centro de Educao Profissional Sebastio de Siqueira CEPSS

You might also like