You are on page 1of 58

Programao para Iniciantes - Aprenda Lgica de

Programao com Java

por Alexandre Afonso

1 Edio, 17/04/2017

2017 AlgaWorks Softwares, Treinamentos e Servios Ltda. Todos os direitos


reservados.

Nenhuma parte deste livro pode ser reproduzida ou transmitida em qualquer


forma, seja por meio eletrnico ou mecnico, sem permisso por escrito da
AlgaWorks, exceto para resumos breves em revises e anlises.

AlgaWorks Softwares, Treinamentos e Servios Ltda


www.algaworks.com
contato@algaworks.com
+55 (11) 2626-9415

Siga-nos nas redes sociais e fique por dentro de tudo!


Sobre o autor
Alexandre Afonso
Instrutor Java na AlgaWorks, graduado em Sistemas
de Informao, est no mercado de programao
Java h mais de 8 anos, principalmente no
desenvolvimento de sistemas corporativos.

LinkedIn: https://www.linkedin.com/in/alexandreafon
Twitter: @alexandreafon
Antes de comear...
Antes que voc comece a ler esse livro, eu gostaria de combinar algumas coisas
com voc, para que tenha um excelente aproveitamento do contedo. Vamos l?

O que voc precisa saber?


Voc s precisa conhecer informtica para absorver o contedo deste livro. No
necessrio que voc j tenha qualquer experincia estudando programao.

Como obter ajuda?


Durante os estudos, muito comum surgir vrias dvidas. Ns gostaramos
muito de te ajudar pessoalmente nesses problemas, mas infelizmente no
conseguimos fazer isso com todos os leitores do livro, afinal, ocupamos grande
parte do dia ajudando os alunos de cursos online na AlgaWorks.

Ento, quando voc tiver alguma dvida e no conseguir encontrar a soluo no


Google ou com seu prprio conhecimento, nossa recomendao que voc poste
na nossa Comunidade Java no Facebook. s acessar:

http://alga.works/comunidadejava/

Como sugerir melhorias ou reportar erros sobre este


livro?
Se voc encontrar algum erro no contedo desse livro ou se tiver alguma
sugesto para melhorar a prxima edio, vamos ficar muito felizes se voc
puder nos dizer.

Envie um e-mail para livros@algaworks.com.

Onde encontrar o cdigo-fonte dos exemplos?


Neste livro, ns vamos desenvolver exemplos usando a linguagem Java. O link
para baixar o cdigo-fonte dos exemplos foi enviado para seu e-mail quando voc
se inscreveu para receber o livro.
Caso voc tenha perdido esse link, acesse http://alga.works/livro-logica-de-
programacao para receb-lo novamente.

Ajude na continuidade desse trabalho


Escrever um livro (mesmo que pequeno, como esse) d muito trabalho, por isso,
esse projeto s faz sentido se muitas pessoas tiverem acesso a ele.

Ajude a divulgar esse livro para seus amigos que tambm querem aprender
programao. Compartilhe no Facebook e Twitter!
Sumrio
1 Introduo
1.1 O que um algoritmo? .............................................................................. 11

1.2 Linguagens de programao .................................................................... 12

1.3 Instalando o Java ........................................................................................ 13

1.4 O famoso Ol mundo! ........................................................................... 16

1.5 Executando o primeiro algoritmo ........................................................... 19

1.6 Destrinchando o primeiro programa ...................................................... 22

1.7 Fazendo comentrios em um programa Java ........................................ 24

2 Variveis e constantes
2.1 Tipos de dados existentes ......................................................................... 29

2.2 Escolhendo bons nomes para variveis e constantes ........................... 31

3 Operadores
3.1 Operadores aritmticos ............................................................................. 33

3.2 Operadores de atribuio ......................................................................... 34

3.3 Operadores relacionais .............................................................................. 36

3.4 Operadores lgicos .................................................................................... 40

4 Estruturas de deciso
4.1 Estrutura if .............................................................................................. 43

4.2 Estrutura switch ..................................................................................... 47


5 Iterao
5.1 Iterando com o lao for ......................................................................... 51

5.2 Iterando com o lao while ..................................................................... 54

6 Concluso
6.1 Prximos passos ......................................................................................... 56
Captulo 1

Introduo
Uma das tarefas mais difceis para quem inicia os estudos sobre programao
entender conceitos que tratam de coisas muito abstratas. Para conseguir esse
entendimento, o legal mesmo de voc fazer coloc-lo em prtica.

Mas a vem outro problema porque, para colocar em prtica, preciso criar
um ambiente em seu computador com uma confiana mnima de que ele est
correto, pois seno voc ter duas grandes barreiras. A primeira de no saber
programar, a segunda de nem mesmo conseguir executar o seus primeiros
testes por no saber criar um ambiente para isso.

Criar um ambiente, basicamente, seria montar a estrutura necessria para poder


programar em seu prprio computador. Toda linguagem de programao
precisa disso e, por mais que no seja to complexo assim, muitos podem desistir
sem nem sequer ter feito um simples teste prtico.

Por isso esse material foi criado, para ajudar voc com essas duas coisas, ou seja,
para ensinar a voc lgica de programao juntamente com uma excelente de
linguagem de programao como o caso do Java.

Aqui, vamos comear conversando sobre o que um algoritmo - conceito super


importante em lgica de programao - e depois j comearemos com a parte
prtica. Faremos a configurao do ambiente Java e continuaremos falando sobre
o que necessrio para a criao de algoritmos, como variveis, estruturas de
deciso, laos e outras coisas mais.

www.algaworks.com 10
1.1. O que um algoritmo?

Quem nunca viu uma definio sobre o que um algoritmo pode se assustar um
pouco somente porque isso est relacionado a programas de computadores, mas
algoritmos no se restringem ao mundo do desenvolvimento de software.

Um exemplo disso so os passos que voc segue para executar uma receita de
bolo ou qualquer outra coisa. Sim, podemos considerar uma receita de bolo como
um algoritmo.

Podemos chamar de algoritmo tudo o que exige uma sequncia de passos


organizados e que possui um fim. Mais especificamente, podemos ter a seguinte
definio:

Algoritmo uma sequncia de passos ordenados e finitos.

Para te dar um exemplo mais parecido com o que encontramos em programas de


computadores, vamos imaginar que estamos desenvolvendo um software onde
uma pequena parte dele seria encontrar a velocidade mdia de um automvel.
Essa pequena parte seria o nosso algoritmo e ele teria os seguintes passos:

1. Obter a distncia - em quilmetros - que foi percorrida


2. Obter o tempo gasto - em horas - para percorrer essa distncia
3. Dividir a distncia pelo tempo
4. Exibir o resultado da diviso

Como voc pode reparar eu utilizei uma linguagem bem humana para criar o
meu algoritmo. Agora, vou utilizar uma pseudo-linguagem de programao para
representar esse mesmo algoritmo.

1. distanciaPercorrida = obterInformacaoDoUsuario();
2. tempoGasto = obterInformacaoDoUsuario();
3. velocidadeMedia = distanciaPercorrida / tempoGasto;
4. exibirResultadoParaUsuario(velocidadeMedia);

A verso do algoritmo que est acima j bem mais prxima de uma linguagem
de programao, mas ainda no podemos execut-la em um computador. Como
mencionei, utilizei uma pseudo-linguagem que, inclusive, inventei agora

www.algaworks.com 11
somente para que voc se familiarize melhor com a linguagem Java quando ela
for apresentada.

1.2. Linguagens de programao

So inmeras as linguagens de programao com as quais voc consegue


implementar um algoritmo. Como exemplos, posso citar:

Java
C++
Ruby
Python
JavaScript
C#
PHP

Todas as linguagens da lista acima so muito boas, mas, como voc j sabe,
utilizaremos a linguagem Java, e temos bons motivos para essa escolha:

Recursos tcnicos disponveis


Comunidade
Mercado

Dentro do Java encontramos uma ampla gama de recursos tcnicos disponveis.


Temos tudo que preciso para criao de programas de computador de alta
qualidade, sejam eles de pequeno, mdio ou grande porte.

Um outro bom motivo que o Java tem uma comunidade gigante de


programadores tanto no Brasil quanto no resto do mundo.

A comunidade facilita o compartilhamento de conhecimento tanto para quem


deseja aprender algo novo dentro da linguagem - como o caso desse material
aqui que voc tem em mos - quanto tambm para os momentos em que
precisamos de ajuda para a correo de erros.

Por ltimo e no menos importante, o Java a linguagem mais requerida


pelo mercado de trabalho. Isso significa que um bom programador Java tem

www.algaworks.com 12
mais chances de se colocar no mercado do que um outro bom programador em
qualquer uma das outras linguagens.

1.3. Instalando o Java

Agora iremos configurar o ambiente que vai tornar possvel a execuo de um


algoritmo feito na linguagem de programao Java. Para comear, ns
precisamos fazer a instalao do Java Developtment Kit - ou, em portugus, Kit de
Desenvolvimento Java - muito conhecido pela sigla JDK.

O JDK nada mais que um software, ou seja, dentro dele tem vrias ferramentas
que nos ajudam a criar nossos programas na linguagem Java. Apesar disso,
dificilmente fazemos referncia ao JDK como um software. Programas como ele
so mais conhecidos como compiladores (na verdade, muito mais do que isso,
mas vamos com calma para voc no se perder).

Ele se faz necessrio porque, para criar um programa de computador feito com
Java, precisamos que um outro programa - o JDK, no caso - execute os algoritmos.

Para a instalao do JDK voc vai precisar visitar o site da Oracle - empresa que
mantm o Java - e fazer o download:

http://www.oracle.com/technetwork/java/javase/downloads/

www.algaworks.com 13
Feito isso, clique no retngulo com o icone da xcara de caf - onde est escrito
Java. Esse clique vai te levar para a seguinte pgina:

www.algaworks.com 14
Agora escolha a verso de download do JDK de acordo com o seu sistema
operacional (Linux, Mac, Windows, etc). Depois do download, basta executar o
arquivo baixado. A instalao em si bem simples.

Para aquelas pessoas que usam alguma distribuio Linux, como o caso do
Ubuntu, podem procurar o JDK em seu gerenciador de pacotes. No Ubuntu, por
exemplo, possvel utilizar os comandos:

$ sudo add-apt-repository ppa:webupd8team/java


$ sudo apt-get update
$ sudo apt-get install oracle-java8-installer

Com a instalao concluda - seja por download do arquivo atravs do site ou


pelo gerenciador de pacotes - abra seu terminal (ou prompt de comando) e digite:

$ java -version

A resposta deve ser parecida com o contedo abaixo:

www.algaworks.com 15
java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)

Se tiver aparecido algo como acima porque o Java est instalado e funcionando
em sua mquina.

Para quem no se lembra, o terminal (ou console ou prompt de comando)


aquela janelinha preta que utilizamos para executar comandos que no precisam
de uma interface grfica. Exemplo:

1.4. O famoso Ol mundo!

Com o Java instalado e funcionando, podemos criar o famoso Ol Mundo!.


Famoso porque no aprendizado de todas as linguagens um costume criar um
pequeno programa com a finalidade de imprimir (exibir) na tela justamente o
texto Ol Mundo!.

Para comear a organizar as coisas, crie uma pasta em qualquer lugar do seu
computador, onde voc ir deixar os arquivos que vamos precisar criar durante
nosso estudo, comeando pelo arquivo OlaMundo.java.

Esse arquivo um arquivo de texto puro normal, porm como vamos programar
em Java, ns temos que usar a extenso .java.

Muito cuidado ao nomear o arquivo, pois iremos usar esse nome dentro do
nosso programa. Note que as letras O e M so em maisculo. Agora, veja o
contedo inicial do arquivo OlaMundo.java:

www.algaworks.com 16
public class OlaMundo {

public static void main(String[] args) {


}

Repare que na linha 1 da estrutura do nosso programa foi necessrio utilizar


o termo OlaMundo, que deve ser exatamente igual ao nome do arquivo,
inclusive, as partes maisculas e minsculas.

O public static void main, na linha 3, o ponto de entrada em nosso programa,


ou seja, tudo que estiver dentro do bloco delimitado pelas chaves ser executado
ao rodar o nosso pequeno programa. No mude nada nessa linha, ou pode dar
tudo errado. Como voc est s comeando agora, no faria sentido explicar o
motivo de cada palavra da linha 3.

Feito isso, vamos incluir agora a linha responsvel pela impresso do texto Ol
Mundo!. Impresso essa que ser feita na tela (terminal ou prompt de comando).
Veja como vai ficar:

public class OlaMundo {

public static void main(String[] args) {


System.out.println("Ol Mundo!");
}

Agora, precisamos compilar o arquivo. Isso significa que iremos preparar o


arquivo para ser executado pela mquina. Essa compilao feita com um
comando que executamos atravs do terminal ou prompt de comando. Ento,
abra o seu terminal e execute:

$ javac OlaMundo.java

Lembrando que para executar o comando acima necessrio estar dentro da


pasta onde voc salvou o arquivo.

Para entrar na pasta pelo terminal, voc pode utilizar o comando cd (change
directory - ou, em portugus, alterar diretrio). Supondo que sua pasta com

www.algaworks.com 17
os arquivos se chame EbookAlgaWorksLogicaProgramacao, ento o comando
seria algo como:

$ cd /caminho/da/pasta/com/o/arquivo/EbookAlgaWorksLogicaProgramacao

No Windows ficaria algo do tipo:

C:\> cd C:\caminho\da\pasta\com\o\arquivo\EbookAlgaWorksLogicaProgramacao

Agora voc pode executar o comando javac apresentado anteriormente. E muito


cuidado para no executar o comando errado como, por exemplo, o comando
java, javap, etc.. Agora o momento do comando javac.

Outra coisa importante que, sempre que voc alterar o arquivo com a extenso
.java, ser necessrio compilar o arquivo novamente antes da nova execuo.

Logo depois que o javac for executado, ser gerado um novo arquivo no mesmo
lugar em que est o arquivo OlaMundo.java. O arquivo gerado ter o mesmo
nome, mas com uma extenso diferente. Voc pode conferir isso utilizando o
comando ls - ou dir para quem usa Windows - que serve para listar os arquivos
do diretrio. Veja o meu caso:

Chegou o momento de, realmente, executar esse nosso pequeno programa.


Vamos fazer isso com o comando java:

$ java OlaMundo

Repare que agora o comando o java, e no o javac, e tambm que voc no


deve adicionar a extenso do arquivo, pois o comando java acessa diretamente o

www.algaworks.com 18
arquivo com a extenso .class - referente a verso compilada do nosso arquivo
OlaMundo.java. Olhe o resultado:

Se no final for impresso o texto Ol Mundo!, quer dizer que voc conseguiu
executar nosso pequeno programa chamado OlaMundo.java.

Parabns! Esse pode ser considerado seu primeiro marco nos estudos sobre lgica
e tambm de programao no geral. O primeiro passo foi dado.

1.5. Executando o primeiro algoritmo

Lembra do primeiro algoritmo que criamos no incio do livro? Pois ento, como
primeiro programa formal, iremos implementar ele na linguagem Java.

Para isso precisaremos utilizar alguns recursos da lgica de programao e da


linguagem Java que ainda no estudamos, mas no precisa se preocupar, porque
veremos mais detalhes sobre esses recursos no captulos seguintes. Os recursos
utilizados agora, e que iremos ver melhor depois, so:

Variveis com seus respectivos tipos


Leitura de dados informados atravs do terminal
Operadores aritmticos
Escrita de informaes no terminal

Vamos ao programa ento. Crie, no diretrio que separou para os exemplos do


nosso livro, um arquivo chamado CalcularVelocidadeMedia.java. Esse arquivo ter
o seguinte contedo:

www.algaworks.com 19
import java.util.Scanner;

public class CalcularVelocidadeMedia {

public static void main(String[] args){


Scanner scanner = new Scanner(System.in);

System.out.println("=== CLCULO DA VELOCIDADE MDIA ==========");

System.out.print("Informe a distncia percorrida (em quilmetros): ");


Double distanciaPercorrida = scanner.nextDouble();

System.out.print("Informe o tempo gasto (em horas): ");


Double tempoGasto = scanner.nextDouble();

Double velocidadeMedia = distanciaPercorrida / tempoGasto;

System.out.println("A velocidade mdia de: "


+ velocidadeMedia + "Km/h");

scanner.close();
}
}

A partir daqui o processo ser o mesmo que foi para o arquivo OlaMundo.java, ou
seja, ser feita uma compilao utilizando o comando javac e, depois, a execuo
de fato com o comando java. Veja os comandos:

$ javac CalcularVelocidadeMedia.java
$ java CalcularVelocidadeMedia

Todo o processo, voc pode conferir na imagem abaixo:

www.algaworks.com 20
Na execuo que fiz, referente a imagem acima, eu informei o valor 220 como
sendo a distncia percorrida, informei 2,5 como sendo o tempo gasto e o
resultado foi 88Km/h. Repare que o tempo no dado em horas e minutos, e sim
em frao de horas. No caso, o valor 2,5 , na verdade, 2 horas e meia.

Muito cuidado com as informaes que voc passa para o programa. Nesse
programa, por exemplo, se eu colocar uma letra qualquer, vamos supor a letra
A, no lugar de um nmero, ento vai ser retornado o erro
InputMismatchException. Veja:

O que o erro acima quer dizer que a entrada no compatvel com o tipo da
informao esperada. Mais especificamente, em nosso caso, est sendo esperado
um nmero e foi informada uma letra.

www.algaworks.com 21
1.6. Destrinchando o primeiro programa

Vamos falar um pouco agora sobre cada linha do nosso primeiro programa.
Aquele criado no tpico anterior.

Ele comea com uma funcionalidade bem especfica do Java que nos ajuda a ler
uma informao qualquer a partir do terminal ou prompt de comando:

Scanner scanner = new Scanner(System.in);

Ainda com relao a funcionalidade Scanner, preciso avisar ao Java que ela ser
utilizada pelo nosso programa e, por isso, a linha abaixo foi adicionada:

import java.util.Scanner;

Depois disso, como voc j percebeu, temos uma outra funcionalidade do Java
que o comando para impresso de texto. Especificamente estamos imprimindo
uma descrio do que nosso programa faz:

System.out.println("=== CLCULO DA VELOCIDADE MDIA ==========");

Na prxima linha, temos uma outra impresso levemente diferente da anterior:

System.out.print("Informe a distncia percorrida (em quilmetros): ");

Repare que a primeira impresso feita com println e a segunda somente com
print. A impresso com println exibe o texto no terminal e depois joga o cursor
para a prxima linha. J a impresso com print mostra o texto no terminal, mas
o cursor continua na mesma linha - o que til quando queremos imprimir um
texto pedindo que a pessoa digite uma informao atravs do terminal.

Como prximo passo, feita a leitura da distncia percorrida atravs da


funcionalidade do Java chamada Scanner:

Double distanciaPercorrida = scanner.nextDouble();

Quando o programa chega no trecho:

scanner.nextDouble()

www.algaworks.com 22
ele para e aguarda que o usurio informe um nmero no terminal. S depois
que voc informa e aperta a tecla ENTER que o valor informado fica
armazenado dentro do programa. Valor esse que, no caso acima, referenciado
pela varivel distanciaPercorrida (veremos sobre variveis mais para frente).

As prximas duas linhas fazem a mesma coisa que as duas anteriores, s que
agora para o tempo gasto. Por isso, vou simplesmente deix-las aqui sem repetir
a explicao:

System.out.print("Informe o tempo gasto (em horas): ");


Double tempoGasto = scanner.nextDouble();

Quase no fim, o que feito a aplicao da frmula que resulta na velocidade


mdia:

Double velocidadeMedia = distanciaPercorrida / tempoGasto;

Depois de calculada a velocidade feita a exibio do resultado no terminal:

System.out.println("A velocidade mdia de: " + velocidadeMedia + "Km/h");

Sobre a linha acima, quero chamar ateno para o sinal +. Dentro da


programao, ele funciona como um operador de adio, mas quando ele tem
um texto de um dos lados dele, vai acontecer que o outro lado ser concatenado
(juntar duas partes de texto), formando uma s sentena.

Como ltima linha, temos:

scanner.close();

A linha acima , simplesmente, uma especificidade da funcionalidade Scanner do


Java. Essa funcionalidade precisa ser encerrada explicitamente e, por isso, a linha
acima foi utilizada.

www.algaworks.com 23
1.7. Fazendo comentrios em um programa Java

Tem um recurso no Java - e em todas as outras linguagens de programao -


que vou utilizar algumas vezes durante os algoritmos do livro. o recurso de
comentrios.

Comentrio algo que voc escreve dentro de um programa, mas ignorado pelo
compilador. Eles servem para ajudar a documentar seu algoritmo.

Podemos fazer comentrios de bloco e tambm de linha. O de bloco pode ser feito
assim:

/*
Comentrio aqui.
Podemos ter quantas linhas quisermos.
*/

Algumas vezes esse comentrio de bloco pode vir melhor formatado, como o
caso abaixo:

/**
* Comentrio melhor formatado.
* Podemos ter quantas linhas quisermos.
**/

Esses asteriscos que ficam no meio so somente para ajudar na formatao e eles
no tem efeito tcnico. O que importa mesmo o que fica entre /* e */.

Podemos tambm fazer um comentrio de linha. Esses devem comear com duas
barras. Veja:

// Comentrio aqui.
// Para ter outra linha, preciso colocar duas barras novamente.

Ao longo do livro voc ver exemplos deles dentro dos programas.

www.algaworks.com 24
Captulo 2

Variveis e constantes
Entramos no primeiro conceito especfico de lgica de programao. o
momento de saber o que so variveis, constantes e o papel deles dentro do
algoritmo computacional.

Variveis e constantes tem a funo de guardar os valores que so manipulados


durante todo o algoritmo. Eles so os responsveis por dar todo o dinamismo
que temos dentro das linguagens de programao. Isso porque, ao invs de
utilizar o valor diretamente, fazemos o uso das variveis ou constantes. Observe
o exemplo:

Double distanciaPercorrida = 250.0;

A varivel acima nos ajuda a fazer referncia para o valor - 250, no caso - nos
outros pontos do algoritmo onde forem necessrios. Da no precisamos ficar
escrevendo o nmero 250 em vrios lugares. S escrevemos o 250 no momento
da declarao da varivel. O melhor que, se o nmero mudar de 250 para 251,
ns precisamos alterar somente no momento da declarao.

Existe ainda uma outra questo que faz com que as variveis sejam ainda mais
importantes. Em 99% dos casos, nossos algoritmos precisam lidar com valores
vindos de fontes externas ao algoritmo, e seria impossvel lidar com esses valores
externos sem ter uma varivel.

Receber um valor externo foi exatamente o caso do nosso primeiro programa


onde, o valor da varivel distanciaPercorrida, foi capturado de uma fonte externa
(o terminal ou prompt de comando) atravs da funcionalidade Scanner:

www.algaworks.com 25
Double distanciaPercorrida = scanner.nextDouble();

Uma outra coisa que necessrio conhecer para entender melhor a varivel
distanciaPercorrida o que so tipos, e, mais especificamente, o tipo Double.
Adiantando, o tipo Double representa os nmeros decimais dentro do Java.
Veremos mais detalhes sobre esse assunto no prximo tpico.

Agora, qual a diferena entre uma varivel e uma constante? Na verdade, a


diferena est no nome de cada um: uma varivel pode variar seu valor e uma
constante no pode. Na prtica, tudo que declaramos at aqui - como a varivel
distanciaPercorrida - foram variveis, e uma constante voc declara assim:

final Double distanciaPercorrida = 250.0;

ou at:

final Double distanciaPercorrida = scanner.nextDouble();

Reparou a diferena? Foi somente o uso da palavra final no incio da declarao.

Caso voc insista, conscientemente ou no, em mudar o valor de uma constante,


e crie um programa como abaixo:

public class UmaConstante {

public static void main(String[] args) {


final Double euSouConstante = 10.0;
euSouConstante = 25.0; // Isso aqui no pode!
}

ento, logo que tentar utilizar o comando javac, j vai obter o erro abaixo:

www.algaworks.com 26
Repare que houve um erro na linha 5 e justamente nela que foi feita a tentativa
de alterar o valor da constante declarada.

J com variveis, possvel e, muitas vezes, necessrio fazer esse tipo de coisa:

public class UmaVariavel {

public static void main(String[] args) {


Double euSouVariavel = 10.0;
euSouVariavel = 25.0;
System.out.println("Fim");
}
}

O programa acima seria compilado (utilizando o javac) e executado (utilizando-


se o comando java) tranquilamente.

Note tambm que para alterar o valor da varivel eu no preciso repetir o tipo:

Double euSouVariavel = 10.0;


euSouVariavel = 25.0;

Caso o tipo fosse repetido, o Java iria entender como se voc estivesse declarando
duas variveis com o mesmo nome, e isso errado. Se o programa fosse assim:

public static void main(String[] args) {


Double euSouVariavel = 10.0;
Double euSouVariavel = 25.0;
System.out.println("Fim");
}

ele nem iria passar pela compilao (aquela feita com javac).

www.algaworks.com 27
Antes que voc pense que no faz sentido criar uma varivel com um valor e j
alterar esse valor na linha logo abaixo, eu j vou avisar que, realmente, no faz
sentido. Isso foi s para mostrar para voc o que d, tecnicamente, para fazer.

A alterao do valor de uma varivel faria mais sentido se combinada com uma
estrutura de deciso. Ns veremos sobre isso mais para frente, mas adiantando
um exemplo, seria assim:

import java.util.Scanner;

public class UmaVariavelEUmaEstruturaDeDecisao {

public static void main(String[] args) {


Scanner scanner = new Scanner(System.in);

System.out.println("Informe o preo do produto: ");


Double precoProduto = scanner.nextDouble();

Boolean precoProdutoMaiorOuIgualACem = precoProduto >= 100;

Double percentualDesconto = 0.0;

if (precoProdutoMaiorOuIgualACem) { // Estrutura de deciso "if"


percentualDesconto = 5.0; // Varivel alterada.
}

System.out.println("Aplique desconto de: "


+ percentualDesconto + "%.");

scanner.close();
}
}

Se adiante tambm, faa uma anlise do algoritmo acima, execute ele algumas
vezes e observe os resultados para diferentes preos de produto, mas no se
preocupe caso no entenda, pois veremos melhor em captulos futuros sobre os
recursos que foram utilizados nele.

www.algaworks.com 28
2.1. Tipos de dados existentes

No Java ns temos vrios e vrios tipos de dados, mas dentre esses muitos tipos,
temos alguns que so principais. Antes de mencion-los, vou agrup-los em 3
categorias:

Numricos
Textos
Lgicos

Dentro dos numricos ns ainda temos dois subgrupos:

Inteiros
Decimais

Quanto aos tipos inteiros, ns temos:

Byte (armazena valores de -128 at 127)


Short (vai de -32768 at 32767)
Integer (ocupa o intervalo de -231 a 231 -1)
Long (intervalo de -263 a 263 -1)

Sobre a diferena, como voc pode notar acima, basicamente, a capacidade de


cada um.

Para nmero inteiros, no livro, ns iremos adotar o tipo Integer. Ficaremos com
o Integer porque ele um tipo muito utilizado quando se deseja fazer referncias
aos nmeros inteiros.

Como exemplo de uma varivel do tipo Integer, podemos ter:

Integer idade = 18;

J os decimais, so:

Float
Double

www.algaworks.com 29
No caso dos decimais, aqui no livro, iremos utilizar o Double - como voc j devia
estar esperando por j termos feito isso no primeiro algoritmo que criamos. Esse
tipo Double dispensa exemplos, pois j foi mostrado anteriormente.

Com relao ao grupo de tipos que armazenam texto, temos:

Character (armazena um carcter por vez)


String (armazena textos de qualquer tamanho)

Dentre esses dois, o String muito mais til para ns trabalharmos durante
os nossos algoritmos. Isso simplesmente porque o Character s consegue
armazenar um carcter por vez.

Como exemplo de String, podemos ter:

String nome = "Joo da Silva";

Note que o texto - o nome Joo da Silva, no caso acima - deve ficar entre aspas
duplas, caso contrrio, resultaria em erros.

Por fim, no grupo referente ao tipo lgico, temos somente o tipo:

Boolean

Esse um tipo importante porque nos ajuda com o gerenciamento das decises
que nosso algoritmo tem ou pode tomar.

O tipo Boolean pode assumir somente dois valores: ou ele verdadeiro ou falso.
O valor para verdadeiro representado como true e o falso como false. Exemplos:

Boolean euSouVerdadeiro = true;


Boolean euSouFalso = false;

Iremos ver melhor sobre isso quando estivermos falando sobre operadores
lgicos e tambm sobre as estruturas de deciso.

www.algaworks.com 30
2.2. Escolhendo bons nomes para variveis e constantes

No difcil encontrar por a, programadores que armazenariam um valor


referente a uma distncia percorrida em uma varivel com o nome disPer - sendo
dis referente a distncia e Per referente a percorrida:

Double disPer = 250.0;

No ficou um nome to ruim, mas pense voc Se no tivesse sido comentado


que o valor referente a distncia percorrida, ser que voc saberia o que
significa? Desculpa, mas a minha aposta que no, no saberia.

O pior nem so os nomes abreviados como ficou a varivel declarada acima. No


to difcil encontrar casos tambm de variveis nomeadas assim:

Double disper = 250.0;

Repare que est tudo em caixa baixa, ou seja, em minsculo, e isso deixa
parecendo que o nome da varivel composto por uma palavra somente,
aumentando a chance de acontecer uma confuso quanto ao significado da
varivel e, por conseguinte, ao uso dessa varivel dentro do algoritmo.

Para fechar, em um ltimo exemplo que tambm ruim, tem programadores que
usariam, simplesmente, as iniciais dp para nomear essa varivel:

Double dp = 250.0;

dificultando entender, ainda mais, o significado que ela tem dentro de todo o
algoritmo.

Na verdade, no estou, de forma alguma, proibindo voc de usar nomes de


variveis como acabei de apresentar acima, ou seja, abreviadas. Quem sou eu
para fazer isso? :)

Minha inteno mostrar para voc que o nome de uma varivel muito
importante na composio de um algoritmo e, por isso, voc precisa tomar
cuidado com os nomes que escolhe para elas.

www.algaworks.com 31
Em alguns poucos casos - onde temos algoritmos pequenos - a abreviao
aceitvel, mas caso fique na dvida, aconselho que no abrevie. Com o tempo
voc vai conseguir identificar onde seria legal abreviar e onde no seria.

E qual seria o motivo de nos preocuparmos com os nomes de nossas variveis? O


primeiro motivo que nossa memria pode falhar, ou seja, mesmo que voc crie
um algoritmo que s voc vai mexer, caso voc termine ele e precise voltar um
ms depois para alguma alterao, provavelmente, ter dificuldades em lembrar
de algumas coisas, o que inclui o porqu de ter declarado determinadas variveis
dentro dele.

O segundo e principal motivo que muitas vezes voc no ir criar um algoritmo


sozinho e, muito menos, um software todo sozinho. Claro que possvel e voc
pode fazer isso, mas em boa parte das vezes - eu diria, a maioria - voc vai
criar software juntamente com outras pessoas - ainda mais se for trabalhar como
funcionrio em uma empresa onde, quase certo, far parte de uma equipe com
outros programadores.

Para que tenha uma referncia a seguir, procure no abreviar as palavras caso o
nome da sua varivel contenha 3 palavras ou menos. Se passar disso, caso voc
queira, pode abreviar algumas delas, mas sempre com muito cuidado para no
prejudicar o entendimento do que sua varivel representa no algoritmo como um
todo.

Como ltima dica, use o padro de nomes chamado camelCase. Esse um padro
que diz que, em nome de variveis compostas por mais de uma palavra,
devemos, a partir da segunda palavra, inici-la com a primeira letra em
maiscula, como foi o caso daquelas que declaramos em nosso algoritmo. Veja
alguns outros exemplos:

Double distanciaPercorrida = 0.0;


Double tempoGasto = 0.0;
Integer idadeMinimaParaTirarCarteiraDeMotorista = 18;
String nomeDoProduto = "Caneca de alumnio 500ML";

Procure dar bons nomes para suas variveis sempre. No fique com preguia s
porque voc acha que o nome ficar grande. Voc vai ver, principalmente quando
comear a criar programas maiores, que vale a pena.

www.algaworks.com 32
Captulo 3

Operadores
Os operadores so recursos super importantes dentro da lgica de programao
e, claro, das linguagens de programao como um todo.

Eles nos permitem fazer clculos, estabelecer relaes, atribuir valores e tomar
decises dentro dos nossos algoritmos.

Nessa parte do livro veremos com mais detalhes sobre eles e o papel que cada
tipo de operador cumpre em nossos algoritmos.

3.1. Operadores aritmticos

Esses so os operadores que nos permitem realizar clculos matemticos bsicos.


So eles:

+ e - (adio e subtrao)
* e / (multiplicao e diviso)
% (mdulo ou resto de uma diviso)

Como esses operadores so aqueles que voc aprendeu na matemtica e j os


conhece, ento para ajudar vamos a um pequeno programa com exemplos:

public class OperadoresAritmeticos {

public static void main(String[] args) {


System.out.println("===============================");

www.algaworks.com 33
Integer adicao = 5 + 2;
System.out.println("Resultado da adio de 5 com 2: " + adicao);

Integer subtracao = 5 - 2;
System.out.println("Resultado da subtrao de 5 pelo 2: "
+ subtracao);

Integer multiplicacao = 5 * 2;
System.out.println("Resultado da multiplicao de 5 pelo 2: "
+ multiplicacao);

Double divisao = 5.0 / 2.0;


System.out.println("Resultado da diviso de 5 pelo 2: " + divisao);

Double moduloOuResto = 5.0 % 2.0;


System.out.println("Resto da diviso de 5 pelo 2: "
+ moduloOuResto);

System.out.println("Fim!");
System.out.println("===============================");
}
}

O que voc precisa fazer agora criar um arquivo chamado


OperadoresAritmeticos.java e testar esse exemplo. Fique a vontade tambm para
alterar ele e fazer alguns testes seus.

Uma coisa que voc pode fazer tambm utilizar variveis, ao invs de colocar
os nmeros diretamente. Algo como:

Integer umNumero = 5;
Integer outroNumero = 2;
Integer adicao = umNumero + outroNumero;

3.2. Operadores de atribuio

Operadores de atribuio so aqueles que fazem com que um valor qualquer -


um nmero, por exemplo - passe para uma varivel.

www.algaworks.com 34
O mais comum deles ns j utilizamos aqui vrias vezes. o operador =
(igual). Recapitulando, veja ele sendo utilizado abaixo:

String ultimoNome = "Silva";

Os outros operadores de atribuio que temos o operador = combinado com


algum operador aritmtico. So eles:

+=
-=
*=
/=
%=

Eles no so essenciais dentro da programao, mas ajudam a simplificar nosso


cdigo. Por exemplo, o trecho abaixo:

Integer umNumero = 5;
umNumero = umNumero + 2; // A varivel umNumero vai guardar o valor 7

pode ser substitudo por:

Integer umNumero = 5;
umNumero += 2; // A varivel umNumero vai continuar guardando o valor 7

Resumindo, o operador += faz com que a varivel, que fica do lado esquerdo -
a varivel umNumero, no caso - seja somada com o valor que est do lado direito -
o nmero 2 - e o resultado atualiza o valor que a varivel do lado esquerdo estava
guardando.

De forma anloga funcionam os outros operadores apresentados acima. Execute


o exemplo abaixo para poder colocar em prtica o uso deles:

public class OperadoresDeAtribuicao {

public static void main(String[] args) {


System.out.println("===============================");

Integer umNumero = 5;

umNumero += 2;

www.algaworks.com 35
System.out.println("Resultado da adio de 5 com 2: " + umNumero);

umNumero = 5; // Voltando o valor para 5.

umNumero -= 2;
System.out.println("Resultado da subtrao de 5 pelo 2: "
+ umNumero);

umNumero = 5; // Voltando o valor para 5.

umNumero *= 2;
System.out.println("Resultado da multiplicao de 5 pelo 2: "
+ umNumero);

umNumero = 5; // Voltando o valor para 5.

umNumero /= 2;
System.out.println("Resultado da diviso de 5 pelo 2: "
+ umNumero);

umNumero = 5; // Voltando o valor para 5.

umNumero %= 2;
System.out.println("Resto da diviso de 5 pelo 2: " + umNumero);

System.out.println("Fim!");
System.out.println("===============================");
}
}

3.3. Operadores relacionais

Como o prprio nome diz, esses operadores estabelecem uma relao entre um
valor e outro. Por exemplo, se eu quiser saber se uma varivel maior que a
outra, posso fazer assim:

Integer primeiraVariavel = 7;
Integer segundaVariavel = 2;
Boolean primeiraVariavelEMaiorQueASegunda =
primeiraVariavel > segundaVariavel;

www.algaworks.com 36
O resultado de uma relao sempre um valor booleano que podemos atribuir
para uma varivel do tipo Boolean. Caso a relao seja verdadeira, o valor gerado
por ela ser true e, caso seja falsa, ento o valor gerado ser false.

Podemos encarar as relaes como se fossem perguntas que nossos algoritmos


fazem para os valores participantes da relao que est sendo feita.

Por exemplo, a relao acima o mesmo que perguntar: O valor da varivel


primeiraVariavel maior que o valor que est na varivel segundaVariavel?. Caso
a resposta seja sim, ento ser gerado o valor true e, caso seja no, ser
gerado o valor false.

A lista com todos operadores, voc pode ver abaixo:

> (maior que)


< (menor que)
>= (maior ou igual que)
<= (menor ou igual que)
== (igual a)
!= (diferente de)

Dentre os operadores da lista acima, gostaria de fazer uma observao


importante sobre os operadores == e != e os valores numricos. Eles s iro
funcionar bem para os nmeros quando se utiliza eles diretamente ou quando se
utiliza eles atravs dos tipos primitivos do Java.

No veremos a fundo sobre os tipos primitivos porque no relevante para ns


que estamos focando mais na lgica de programao, mas s para que voc tenha
uma ideia prtica do que falei, vou dar os exemplos abaixo:

// O tipo int o tipo primitivo para o Integer


int primeiraVariavel = 128;
int segundaVariavel = 128;

// Funciona! Vai gerar o valor true


Boolean primeiraVariavelEIgualASegunda
= primeiraVariavel == segundaVariavel;

// Funciona tambm!
Boolean umNumeroEIgualAOutro = 128 == 128;

www.algaworks.com 37
Executando o trecho acima, as variveis booleanas guardaro o valor true, afinal
de contas, 128 igual a 128. Nada demais at aqui. Agora, o trecho abaixo j no
se comporta da mesma forma:

// Repare que agora Integer e no o primitivo


Integer primeiraVariavel = 128;
Integer segundaVariavel = 128;

// Isso compila e executa, mas o resultado ser falso. No recomendado!


Boolean primeiraVariavelEIgualASegunda
= primeiraVariavel == segundaVariavel;

Isso tem um explicao at bem bvia dentro da linguagem Java, mas para me
fazer entender, precisaria falar de vrios outros conceitos avanados e especficos
da linguagem Java. Por isso, preciso que voc tenha em mente que s pode usar a
relao == com os tipos primitivos e quando se utiliza os nmeros diretamente,
ou seja, sem ser atravs de variveis.

Ento, como comparar os tipos normais como String, Double e Integer (que no
so primitivos)? Ns fazemos isso com uma funcionalidade que todos os tipos
tem dentro do Java, exceto os primitivos, que chamamos de equals. Observe:

// Repare que agora Integer e no o primitivo


Integer primeiraVariavel = 128;
Integer segundaVariavel = 128;

// Isso funciona!
Boolean primeiraVariavelEIgualASegunda
= primeiraVariavel.equals(segundaVariavel);

Invertendo a ordem das variveis, funciona do mesmo jeito:

// Tambm funciona!
Boolean primeiraVariavelEIgualASegunda
= segundaVariavel.equals(primeiraVariavel);

Agora sim, o valor gerado pela relao seria o valor true.

Voltando ao assunto de operadores, pegue o exemplo abaixo, execute e procure


alter-lo para criar seus prprios testes:

www.algaworks.com 38
public class OperadoresRelacionais {

public static void main(String[] args) {


System.out.println("===============================");

Integer primeiraVariavel = 1;
Integer segundaVariavel = 1;

System.out.println("O valor da primeira varivel "


+ primeiraVariavel + " e o da segunda "
+ segundaVariavel + ".");

Boolean primeiraVariavelEMaiorQueASegunda
= primeiraVariavel > segundaVariavel;
System.out.println("Primeira varivel maior que a segunda? "
+ primeiraVariavelEMaiorQueASegunda);

Boolean primeiraVariavelEMenorQueASegunda
= primeiraVariavel < segundaVariavel;
System.out.println("Primeira varivel menor que a segunda? "
+ primeiraVariavelEMenorQueASegunda);

Boolean primeiraVariavelEMaiorIgualASegunda
= primeiraVariavel >= segundaVariavel;
System.out.println("Primeira varivel maior ou igual a segunda? "
+ primeiraVariavelEMaiorIgualASegunda);

Boolean primeiraVariavelEMenorIgualASegunda
= primeiraVariavel <= segundaVariavel;
System.out.println("Primeira varivel menor ou igual a segunda? "
+ primeiraVariavelEMenorIgualASegunda);

Boolean primeiraVariavelEIgualASegunda
= primeiraVariavel.equals(segundaVariavel);
System.out.println("Primeira varivel igual a segunda? "
+ primeiraVariavelEIgualASegunda);

// ! o operador lgico de negao e veremos


// sobre ele mais para frente
Boolean primeiraVariavelEDiferenteDaSegunda
= !primeiraVariavel.equals(segundaVariavel);
System.out.println("Primeira varivel diferente da segunda? "
+ primeiraVariavelEDiferenteDaSegunda);

www.algaworks.com 39
System.out.println("Fim!");
System.out.println("===============================");
}
}

3.4. Operadores lgicos

Os operadores lgicos trabalham com os valores booleanos para facilitar as


tomadas de decises mais complexas dentro dos nossos algoritmos, e assim como
no operador relacional, a avaliao de operadores lgicos sempre gera um valor
booleano (verdadeiro ou falso).

Temos 3 operadores lgicos:

&& (Chamado de operador E)


|| (Chamado de operador Ou)
! (Chamado de operador de negao ou reverso)

Primeiro vou mostrar o operador &&. Ele utilizado para avaliar dois ou mais
valores booleanos de uma vez s, sendo que, para ele gerar o valor true - ou seja,
verdadeiro - ser necessrio que todos os valores envolvidos tambm sejam true.
Se pelo menos um valor avaliado for falso, ento o resultado gerado no final ser
false.

Para entender melhor como usar o operador &&, suponha um usurio em uma loja
virtual - ou e-commerce - que tem como poltica aplicar um desconto para seus
usurios que so VIPs e que fizerem uma compra acima de R$100,00.

Boolean usuarioVIP = true;


Boolean aCompraUltrapassou100Reais = true;
Boolean aplicarDesconto = usuarioVIP && aCompraUltrapassou100Reais;

Utilizando o operador lgico &&, como na terceira linha do trecho acima, voc
consegue saber se para aplicar um desconto ou no. No final das contas, se
a varivel aplicarDesconto estiver guardando o valor true, ento o desconto
aplicado e, caso contrrio, no.

www.algaworks.com 40
Agora, imagine que essa mesma loja virtual deseje melhorar sua poltica de
compra. Para isso ela decide bonificar os usurios que so VIPs (independente do
valor da compra dele) ou os usurios que fizerem compras acima de R$100,00.
Veja como ficaria:

Boolean aplicarDesconto = usuarioVIP || aCompraUltrapassou100Reais;

Dessa forma a varivel aplicarDesconto vai guardar o valor true se o usurio VIP
ou se a compra que estiver sendo feita for em um valor maior que R$100,00. Ns
conseguimos esse comportamento atravs do uso do operador lgico ||.

Temos ainda mais um operador lgico que o ! (operador de negao). Ele,


simplesmente, pega um valor verdadeiro e transforma em falso, e um falso em
verdadeiro.

Imagine agora uma outra loja virtual que venda somente produtos alcolicos.
Sendo assim, ela teria que exigir um cadastro para concluir a compra, com a
informao referente a idade da pessoa. Com isso, conseguiria fazer a seguinte
validao:

final Integer idadeMinima = 18;


Integer idadeUsuario = 17;
Boolean menorDeIdade = idadeMinima > idadeUsuario;
Boolean permiteConcluirCompra = !menorDeIdade;

Para o exemplo acima, o que vai acontecer que a varivel permiteConcluirCompra


vai receber o valor false, apesar da varivel menorDeIdade ser verdadeira. Isso,
claro, por causa do operador lgico de negao - ou reverso.

A varivel permiteConcluirCompra s receberia o valor true se a varivel


menorDeIdade fosse false.

A graa dos operadores lgicos est quando utilizamos as estruturas de deciso, e


veremos sobre elas nos prximos tpicos. Por ora, faa testes com o que aprendeu
at aqui utilizando, como base, o programa abaixo:

public class OperadoresLogicos {

public static void main(String[] args) {


System.out.println("===============================");

www.algaworks.com 41
Boolean usuarioVIP = true;
Boolean aCompraUltrapassou100Reais = true;
Boolean menorDeIdade = true;
Boolean temProdutoAlcoolicoNoCarrinho = true;

System.out.println("Usurio VIP? " + usuarioVIP);


System.out.println("A compra maior que R$100? "
+ aCompraUltrapassou100Reais);
System.out.println(" menor de idade? " + menorDeIdade);
System.out.println("Tem produto alcolico no carrinho? "
+ temProdutoAlcoolicoNoCarrinho);

System.out.println("===============================");

Boolean aplicarDesconto = usuarioVIP && aCompraUltrapassou100Reais;


System.out.println("O desconto deve ser aplicado? "
+ "(usuarioVIP && aCompraUltrapassou100Reais): "
+ aplicarDesconto);

aplicarDesconto = usuarioVIP || aCompraUltrapassou100Reais;


System.out.println("O desconto deve ser aplicado? "
+ "(usuarioVIP || aCompraUltrapassou100Reais): "
+ aplicarDesconto);

// Leia assim: "se no for menor de idade ou se


// no tiver produto alcolico".
Boolean permiteConcluirCompra
= !menorDeIdade || !temProdutoAlcoolicoNoCarrinho;
System.out.println("Pode concluir compra? "
+ "(!menorDeIdade || !temProdutoAlcoolicoNoCarrinho): "
+ permiteConcluirCompra);

System.out.println("Fim!");
System.out.println("===============================");
}
}

www.algaworks.com 42
Captulo 4

Estruturas de deciso
Extremamente importantes, as estruturas de deciso nos permitem ter fluxos -
ou caminhos - alternativos dentro do nosso sistema, e isso fundamental para
conseguirmos criar algoritmos dinmicos.

Dentro do Java - e em outras linguagens tambm - ns temos duas estruturas que


so: a estrutura if e a estrutura switch. Veremos sobre elas agora, comeando pela
estrutura if.

4.1. Estrutura if

Essa a estrutura de deciso mais utilizada dentro da programao. Traduzindo,


a palavra if significa se.

Para utiliz-la voc precisa de um valor booleano. Esse valor pode vir do literal
true ou false, pode vir de uma expresso relacional, de uma expresso lgica, de
uma varivel ou da combinao de tudo isso. Aqui alguns exemplos:

if (true) { // Literal "true" sendo utilizada.


// Bloco de cdigo do if
}

if (7 > 2) { // Expresso relacional.


// Bloco de cdigo do if
}

if (true && true) { // Expresso lgica.

www.algaworks.com 43
// Bloco de cdigo do if
}

if (7 > 2 && 7 > 5) { // Expresso lgica e expresses relacionais.


// Bloco de cdigo do if
}

if (euSouUmaVariavelBooleana) { // Utilizando varivel


// Bloco de cdigo do if
}

// Varivel e expresso lgica


if (euSouUmaVariavelBooleana && euSouOutra) {
// Bloco de cdigo do if
}

Caso a expresso que est entre os parnteses do if gerem o valor true, ento o
Java executa tambm as linhas que esto no bloco de cdigo do if, ou seja, entre
as chaves.

Uma observao sobre os 4 primeiros exemplos, que eles funcionam, mas


claro, no fazem muito sentido, pois no esto dinmicos. A expresso 7 > 2,
por exemplo, sempre vai retornar verdadeiro e o bloco de cdigo do if sempre
ser executado. Para dinamizar o if voc precisa ter, pelo menos, uma varivel
envolvida. Vejamos:

Integer numero = 7;
if (numero > 2) {
// Bloco de cdigo do if
}

Voc pode argumentar agora que a varivel ficou esttica e que assim no mudou
coisa alguma. Estaria certo se dissesse isso, mas a ideia que agora a varivel seja
dinamizada atravs de algum recurso que busque o valor dela externamente ao
algoritmo. Inclusive, j foi dado exemplos disso. Olhe:

Integer numero = scanner.nextInt();


if (numero > 2) {
// Bloco de cdigo do if
}

www.algaworks.com 44
Agora sim, tudo dinmico! Vamos ento para um exemplo mais prtico. Nesse
exemplo a regra que ser dado um desconto caso o preo de um produto
qualquer seja maior que R$100,00.

Double precoProduto = scanner.nextDouble();

Boolean precoProdutoMaiorOuIgualACem = precoProduto >= 100;

Double percentualDesconto = 0.0;

if (precoProdutoMaiorOuIgualACem) { // Estrutura de desiso if


// Desconto para produtos com preo maior que 100.
percentualDesconto = 5.0;
}

// Regra de trs
Double desconto = (precoProduto * percentualDesconto) / 100;
Double precoComDesconto = precoProduto - desconto;

System.out.println("O produto sair por R$" + precoComDesconto + ".");

Repare que, se o nosso if tivesse a expresso dentro dele, ento no seria


necessrio ter a varivel precoProdutoMaiorOuIgualACem, e ele ficaria assim:

if (precoProduto >= 100) {


percentualDesconto = 5.0;
}

No errado fazer o if como est acima, inclusive, algo bem comum at, mas
tem uma vantagem bacana de usar variveis booleanas que o fato do nosso
algoritmo ficar mais entendvel, pois o nome da varivel - se bem escolhido - vai
explicar melhor o porqu de estar fazendo a relao.

Para melhorar esse exemplo, vamos imaginar agora que seja necessrio imprimir,
no terminal, uma mensagem caso nenhum desconto seja dado. Poderamos fazer
um outro if assim:

if (percentualDesconto.equals(0.0)) {
System.out.println("No ser aplicado desconto algum.");
}

www.algaworks.com 45
S que ns temos um outro recurso na estrutura de deciso if que vai nos ajudar
com isso e tornar nosso algoritmo mais organizado. O recurso se chama else - ou,
em portugus, seno. Veja:

// Se maior ou igual 100, aplique o desconto


if (precoProdutoMaiorOuIgualACem) {
percentualDesconto = 5.0;
} else { // Seno, no aplique desconto algum.
System.out.println("No ser aplicado desconto algum.");
}

Agora, vou passar o exemplo completo para que voc faa seus testes:

import java.util.Scanner;

public class EstruturaDeDecisaoIf {

public static void main(String[] args) {


Scanner scanner = new Scanner(System.in);

System.out.println("============================");

System.out.print("Informe o preo do produto: ");


Double precoProduto = scanner.nextDouble();

Boolean precoProdutoMaiorOuIgualACem = precoProduto >= 100;

Double percentualDesconto = 0.0;

// Se maior ou igual 100, aplique o desconto.


if (precoProdutoMaiorOuIgualACem) {
percentualDesconto = 5.0;
} else { // Seno, no aplique desconto algum.
System.out.println("No ser aplicado desconto algum.");
}

Double desconto = (precoProduto * percentualDesconto) / 100;


Double precoComDesconto = precoProduto - desconto;

System.out.println("O produto sair por R$"


+ precoComDesconto + ".");

System.out.println("Fim!");

www.algaworks.com 46
System.out.println("============================");

scanner.close();
}
}

4.2. Estrutura switch

O switch uma estrutura de deciso que, de acordo com determinado valor,


executa um bloco de cdigo especfico. Ao contrrio do if, ele lida com valores
que no so booleanos.

Vamos supor que voc receba, no seu algoritmo, um nmero de 1 a 7 e precise


imprimir qual o dia da semana a que o nmero se refere (domingo, segunda-
feira, tera-feira, etc). Veja como seria:

String nomeDoDiaDaSemana = "";

switch(5) { // Usando o 5 diretamente...


case 1: nomeDoDiaDaSemana = "Domingo";
break;
case 2: nomeDoDiaDaSemana = "Segunda-feira";
break;
case 3: nomeDoDiaDaSemana = "Tera-feira";
break;
case 4: nomeDoDiaDaSemana = "Quarta-feira";
break;
case 5: nomeDoDiaDaSemana = "Quinta-feira";
break;
case 6: nomeDoDiaDaSemana = "Sexta-feira";
break;
case 7: nomeDoDiaDaSemana = "Sbado";
break;
default: nomeDoDiaDaSemana = "[No encontrado!]";
}

System.out.println("O dia da semana : " + nomeDoDiaDaSemana);

Acredito que j tenha entendido bastante do switch s com o exemplo, mas


algumas coisas no so to bvias e veremos sobre elas agora.

www.algaworks.com 47
A primeira coisa sobre o break, que serve para encerrar o bloco de cdigo
de cada case. Se voc remover todos os comandos break, a varivel
nomeDoDiaDaSemana vai sempre terminar o switch com o valor Sbado. Esse
comportamento se d porque, depois que o switch encontra o respectivo case
referente ao valor avaliado entre os parnteses, este case ser executado e tambm
todos aqueles que estiverem abaixo dele. No caso do valor 5, a varivel
nomeDoDiaDaSemana vai receber os textos Quinta-feira, Sexta-feira e, por
ltimo, Sbado.

A segunda coisa sobre a opo default ou opo padro. Caso o valor avaliado
no seja encontrado em nenhum case, ento o bloco executado ser o bloco
referente a opo default.

Para testes mais especficos, tem um exemplo completo aqui:

import java.util.Scanner;

public class EstruturaDeDecisaoSwitch {

public static void main(String[] args) {


Scanner scanner = new Scanner(System.in);

System.out.println("============================");

System.out.print("Informe o dia (nmero): ");


Integer diaDaSemana = scanner.nextInt();

String nomeDoDiaDaSemana = "";

switch(diaDaSemana) {
case 1: nomeDoDiaDaSemana = "Domingo";
break;
case 2: nomeDoDiaDaSemana = "Segunda-feira";
break;
case 3: nomeDoDiaDaSemana = "Tera-feira";
break;
case 4: nomeDoDiaDaSemana = "Quarta-feira";
break;
case 5: nomeDoDiaDaSemana = "Quinta-feira";
break;
case 6: nomeDoDiaDaSemana = "Sexta-feira";

www.algaworks.com 48
break;
case 7: nomeDoDiaDaSemana = "Sbado";
break;
default: nomeDoDiaDaSemana = "[No encontrado!]";
}

System.out.println("O dia da semana : " + nomeDoDiaDaSemana);

System.out.println("Fim!");
System.out.println("============================");

scanner.close();
}
}

www.algaworks.com 49
Captulo 5

Iterao
A iterao um recurso muito utilizado dentro da programao e no toa.
Muitas vezes precisamos fazer um processamento que tem uma estrutura
repetida e que s varia quanto ao valor que ele manipula.

No raro termos listas com cerca de 1000 registros para serem processados
da mesma forma. Imagine se tivssemos que repetir um trecho de cdigo 1000
vezes s porque o valor muda. No nada vivel isso. Ainda mais que a lista, na
maioria das vezes, varia de tamanho - uma hora 1000 registros, outra hora 580,
outra 150 e por a vai.

Para que voc aprenda a lidar com esse tipo de situao, foram criados os tpicos
desse captulo. Um falando do iterador for - mais conhecido como lao for - e
outro para falar do lao while.

Antes de falar sobre cada um especificamente, gostaria de tirar uma dvida que
eu sei que ainda vai surgir. Ela seria: Quando utilizar o lao for e quando utilizar
o lao while?

Acontece que tudo que voc consegue fazer com um lao voc consegue com
o outro. Claro, que vai mudar a estrutura da iterao, mas, no final das contas,
existem as mesmas possibilidades.

Para ajudar voc escolher voc pode pensar assim: se existe um nmero
previamente conhecido de iteraes, ento utilize o lao for, caso o objetivo seja
iterar at chegar a uma condio pr-estabelecida, ento use o while.

www.algaworks.com 50
Resumindo:

Nmero de iteraes conhecido? Ento use o for;


A iterao deve acontecer at que se chegue a uma determinada
condio? Use o while.

5.1. Iterando com o lao for

O lao for serve para que possamos lidar com as iteraes onde o nmero de
vezes que se precisa iterar conhecido. Veja como a estrutura de um lao for:

for ( ; ; ) {
// Bloco do lao for
}

Repare que entre os parnteses do for, temos 3 posies separadas por ponto e
virgula. A primeira posio utilizada para incluirmos uma expresso qualquer
para iniciar nossas iteraes. Veja o exemplo mais comum de se incluir nessa
primeira posio:

int i = 0

Note acima que a expresso que mencionei como a mais comum a declarao
de uma varivel chamada i do tipo primitivo int, que so duas coisas que no
aconselhei que voc faa. Mas, no caso do lao for, especificamente, isso
conveniente, eu diria.

Conveniente porque bem comum utilizar o primitivo e usar a letra i para uma
varivel que, no caso, d a ideia correta de i de iterao, pois, justamente
isso que ela vai fazer nesse caso nosso e na grande maioria do que vemos dentro
dos programas: controlar qual o nmero da iterao corrente.

Na segunda posio, ns colocamos uma expresso que precisa retornar um


valor booleano. Essa a posio onde, na maioria das vezes, colocamos uma
relao entre o nmero da iterao corrente e a quantidade de iteraes desejada.
Exemplo:

i < 10

www.algaworks.com 51
Com a expresso acima ns avisamos ao lao for que, enquanto a varivel i for
menor que 10, ento pode iterar, ou seja, vai iterar com o i variando de 0 at 9, e
quando i chegar ao valor 10, as iteraes iro parar.

A terceira posio do lao serve para colocarmos uma expresso que ser
avaliada toda vez que uma iterao acabar. Chamamos ela de expresso de
iterao. Ocupando essa posio, na maioria das vezes, o que voc ver
simplesmente a varivel i aumentando uma unidade. Exemplo:

i = i + 1

E, no Java, ns podemos substituir a expresso acima por:

i++

que, nesse caso, a mesma coisa.

Observe o for completo agora:

for (int i = 0; i < 10; i++) {


System.out.println("Iterao nmero: " + i);
}

O for acima ir resultar em 10 voltas em nosso lao - lembre que, na primeira


posio do for, o i comea com 0 e, a cada volta, ele incrementado uma unidade.

Agora vamos para um exemplo mais prtico. Imagine que voc esteja
trabalhando em um algoritmo que vai funcionar em um software de loja virtual.
Mais especificamente, vamos supor que esteja criando um algoritmo que precise
fazer a soma do preo dos produtos que um usurio da loja colocou no carrinho.

Para realizar a tarefa acima conveniente usar o lao for, pois o nmero de
iteraes conhecido, ou seja, o nmero de iteraes a mesma quantidade de
itens que o carrinho de compras possui.

Importante notar que esse nmero no tem que ser conhecido para ns, seres
humanos. Ele deve ser conhecido pelo seu algoritmo, ou seja, caso existir alguma
varivel no seu algoritmo que contenha o nmero de iteraes, ento podemos
dizer que essa quantidade conhecida.

www.algaworks.com 52
Antes de implementar o lao desse exemplo, vou precisar utilizar um conceito
novo pra voc. Vou criar uma varivel, mas que tem uma coisa especial. Ela
especial porque ela pode armazenar mais de um valor de uma vez s. Na
programao, chamamos ela de array ou vetor ou matriz.

Ser no array que irei guardar os preos dos produtos:

Double[] carrinhoDeCompras = new Double[] { 57.0, 175.0, 25.0, 10.0 };

Da forma como apresentei acima, o array est armazenando o preo de 4 produtos


diferentes. O que separa um nmero do outro a vrgula.

O legal de um array que ele possibilita o acesso a qualquer uma das posies
dele, e tambm nos d a informao, de forma dinmica, de quantas posies ele
possui. Exemplo:

System.out.println("Quantidade de itens do array: "


+ carrinhoDeCompras.length);
System.out.println("Primeira posio: " + carrinhoDeCompras[0]);
System.out.println("Terceira posio: " + carrinhoDeCompras[2]);

Veja acima que eu utilizei o 0 para acessar a primeira posio e o 2 para acessar a
terceira. Isso porque os ndices de um array comeam do 0. Ento se o array tem
4 posies, seus ndices iro de 0 at 3.

Voltando ao exemplo principal, veja ele aqui embaixo:

public class IterandoComOLacoFor {

public static void main(String[] args) {


System.out.println("============================");

Double[] carrinhoDeCompras
= new Double[] { 57.0, 175.0, 25.0, 10.0 };

Double valorTotalDoCarrinho = 0.0;


for (int i = 0; i < carrinhoDeCompras.length; i++) {
valorTotalDoCarrinho += carrinhoDeCompras[i];
System.out.println(">>>> Iterao " + i);
System.out.println(">> Valor do produto corrente R$"
+ carrinhoDeCompras[i] + ".");
System.out.println(">> O total parcial de R$"

www.algaworks.com 53
+ valorTotalDoCarrinho + ".");
}

System.out.println("O valor total :" + valorTotalDoCarrinho);

System.out.println("Fim!");
System.out.println("============================");
}
}

O que voc precisa agora fazer seus testes e observar o comportamento do lao
for na prtica.

5.2. Iterando com o lao while

O lao while - ou enquanto, em portugus - utilizado para aquelas iteraes


onde o que importa alcanar uma determinada condio para que o mesmo se
encerre. At por isso a estrutura dele mais simples que a estrutura do lao for.
Veja:

while ( ) {
// Bloco do while
}

Entre parnteses o lugar onde colocamos a condio. Para exemplificar o while,


vamos fazer um joguinho muito simples, o seguinte: vamos utilizar uma
funcionalidade do Java que pega um nmero de forma aleatria, e a pessoa ter
que adivinh-lo. Olha s:

import java.util.Random;
import java.util.Scanner;

public class IterandoComOLacoWhile {

public static void main(String[] args) {


Scanner scanner = new Scanner(System.in);
Random random = new Random();

System.out.println("============================");

www.algaworks.com 54
// Aleatrios de 0 at 9
Integer numeroAleatorio = random.nextInt(10);
Boolean tentarNovamente = true;

System.out.println("Aperte CTRL+C, a qualquer momento, para parar.");

// Enquanto tentarNovamente igual a true, itera novamente


while (tentarNovamente) {
System.out.print("Tente adivinhar o nmero: ");
Integer numero = scanner.nextInt();

// Enquanto diferente, tenta novamente.


tentarNovamente = !numeroAleatorio.equals(numero);

if (tentarNovamente) {
System.out.println("Errado!");
}
}

System.out.println("Parabns! Voc adivinhou. Era o nmero "


+ numeroAleatorio + " mesmo.");

System.out.println("Fim!");
System.out.println("============================");
}
}

Crie o seu programa IterandoComOLacoWhile.java, inclua o cdigo-fonte acima e


divirta-se.

www.algaworks.com 55
Captulo 6

Concluso
Que bacana que chegou at aqui! Pode marcar a que o primeiro grande passo
para aprender programao voc j concluiu. Fico feliz em fazer parte.

Espero que tenha executado todos os exemplos do livro e ainda tenha ido alm
com seus prprios testes.

No se contente em apenas ler esse livro. Pratique, programe, implemente cada


detalhe, pois, a melhor maneira de fixar bem um contedo em sua mente
praticando.

Se voc gostou desse livro, por favor, ajude a manter essa obra. Recomende para
seus amigos de trabalho, faculdade ou compartilhe no Facebook e Twitter.

6.1. Prximos passos

Durante o livro, criamos exemplos bem completos, eu diria, para quem est
comeando a programar, e embora voc tenha aprendido recursos suficientes
para criar at mesmo um pequeno jogo, o que voc viu aqui, como j deve
imaginar, s o comeo.

Com certeza, foi um tempo bem investido. At mesmo quem no quer seguir
carreira de desenvolvedor se beneficia desse conhecimento. Afinal, estamos cada
vez mais cercados por software. :)

www.algaworks.com 56
Falando de voc agora, caso tenha interesse em continuar seu aprendizado,
recomendo que continue estudando com nossos cursos online. s acessar
www.algaworks.com.

www.algaworks.com 57

You might also like