
Conceitos básicos de Java
1. O necessário para começar a programar: instalando o JDK e o NetBeans
02. Criando o primeiro programa em Java
2.1 Código comentado do primeiro exercício - o que são Classes e Métodos
03. Saídas Simples usando print, println e printf
3.1 10 exercícios sobre saídas simples
04. Comentando e usando Delimitadores de comentários
05. Tipos numéricos: byte, short, int, long, float e double
06. Recebendo dados do usuário: a classe Scanner
Vídeo-aula: A classe Scanner
07. Operações Matemática: Adição, Subtração, Multiplicação, Divisão, Resto da Divisão (módulo) e Precedência dos operadores matemáticos
Vìdeo-aula: Operadores matemáticos e suas procedências
08. Comparações: os operadores maior (>), menor (<), maior igual (>=), menor igual (<=), igual (==) e diferente (!=)
09. O tipo char: armazenando e representando caracteres
10. O tipo boolean: a base da lógica na computação
11. Operadores lógicos e de negação: && (E ou AND), || (OU ou OR) e o ! (negação)
Estruturas de Controle/
Controle de Fluxo e Laços
01. if else : Testando e Escolhendo o que vai ser Executado
1.1 Programa: Diz se você passou direto, ficou de recuperação ou foi reprovado
1.2 Programa: determina as raízes de uma equação do segundo grau, até as complexas
02. Questões sobre if else
03. Operadores de Incremento (++) e Decremento (--)
04. Operadores de Atribuição: +=, -=, *=, /= e %=
05. Operadores de atribuição e de incremento e decremento - diferenças entre a=++b e a=b++
06. O laço while: o que é, como usar e calculando PA e PG com while
6.1 Questões usando o laço while
07. Loop infinito, controlando laços e loopings com o while
08. Laço for: tendo um maior controle sobre as repetições
8.1 Questões usando o laço for
09. O laço do ... while: O laço que sempre acontece...pelo menos uma vez
10. Os comandos break e continue: interrompendo e alterando fluxos e loopings
11. O comando switch: fazendo escolhas em Java
12. Exercícios envolvendo laços
Apostila Caelum resolvida: Capítulo 3, Variáveis, Tipos Primitivos e Controle de Fluxo
Orientação a Objetos, parte I:
Criando e declarando classes - Construtores
00. Introdução: o que são, para que servem, como e onde usar as Classes e Objetos em Java
Vídeo-aula: Orientação a Objetos
01. Como criar uma Classe e declarar Objetos
02. Acessando e modificando variáveis de Classes e Objetos
03. Construtores: o que são, para que servem e como usar
Vídeo-aula: Construtores
Métodos
00. Introdução: o que são, para que servem, como e quando usar os methods
0.1 Aplicativo: menu simples usando métodos, laços e o comando switch
01. O comando return: obtendo informações dos métodos
02. Parâmetros e Argumentos: passando informações para os métodos
03. A Classe Math: constantes, principais métodos e chamando métodos de outras classes
04. Sobrecarga de métodos (method overloading): declarando métodos com o mesmo nome
05. Passando uma lista de argumentos, de tamanho qualquer, para um método
06. Exercícios: treine com questões envolvendo métodos e tudo o que aprendeu até aqui
Jogo: Adivinhe o número que o computador sorteou [modo texto]
Orientação a Objetos, parte II:
Os métodos set e get - Composição - Enum
00. Auto-referência com o this: Invocando métodos de Classes e Objetos
01. set e get: o que são e como usar esses métodos de forma correta
1.1 Aplicativo: Conta bancária/ Caixa eletrônico em Java
02. Composição: trocando informações entre Objetos
Vídeo-aula: Composição e Relação tem-um
03. Use constantes, e não números - declarando variáveis com o final
04. enum: A melhor maneira para manusear constantes
05. static: Usando membros estáticos
Apostila Caelum Resolvida: Capítulo 4 - Orientação a objetos básica
Jogo: Campo Minado em Java
Código comentado sobre como fazer o jogo Campo Minado em Java
Programação Gráfica em Java, parte I:
Caixas de Diálogo
00. Introdução à programação gráfica em Java, GUI e 2D
01. Exibindo mensagens através das caixas de diálogo (dialog box)
02. Recebendo dados do usuário através das caixas de diálogo (dialog boxes)
03. Como passar variáveis do tipo String para int, float e double
3.1 Aplicativo: calcula as raízes de uma equação do segundo grau
04. Construindo (build) seu projeto Java no NetBeans
Estrutura de Dados, parte I:
Array e ArrayList
00. Introdução ao estudo de estrutura de dados em Java: Array, ArrayList, Listas, Filas e Pilhas
01. Arrays (ou vetores): como declarar, usar e acessar seus elementos
Vídeo-aula: Arrays
02. Foreach: O laço for para Arrays
03. Array multidimensional ou Matriz: um Array de arrays
Vídeo-aula: Matrizes ou Arrays Multidimensionais
04. Arrays em métodos: passagem por valor e passagem por referência
05. Classe Arrays (Arrays Class): aprenda a manusear (copiar, ordenar, buscar e manipular) Arrays
06. ArrayList: para que serve e como usar os principais métodos da ArrayList em Java
Vídeo-aula: Como usar ArrayList
Apostila Caelum resolvida: Capítulo 5 - Um pouco de Arrays
Jogo usando if else, métodos, arrays, arrays multidimensionais e laços.
Jogo: Batalha Naval em Java [modo texto - humano x computador]
Orientação a Objetos, parte III:
Herança e Polimorfismo
00. Herança: o que é, para que serve, exemplos de uso e quando usar
01. Herança de Construtores e @Override
Vídeo-aula: Herança (extends) e Construtores (super)
02. public, private e protected: Protegendo suas informações em Java
03. A classe Object: o que é, uso e principais métodos
04. Polimorfismo: o que é, pra que serve, como e onde usar
05. Polimorfismo: Classes abstratas e Métodos abstratos em Java
Vídeo-aula: Polimorfismo e Classes Abstratas
Exemplos: Importância do Polimorfismo e Abstração em softwares
06. Manipulando polimorficamente subclasses
Dica: Descobrindo a classe de um Objeto
Jogo: Jogo da Velha em Java (Humano x Humano)
Código comentando sobre como fazer um Jogo da Velha em Java
Strings e Caracteres:
Escrevendo em Java
01. A Classe String
02. A Classe StringBuilder
03. A Classe Character
04. Regex: Usando as Expressões Regulares em Java
Programação Gráfica em Java, pt II:
desenhos, fontes e figuras geométricas em 2D
00. Introdução ao JFrame e JPanel: desenhando em Java
Vídeo-aula: GUI e JFrame
01. Desenhando Linhas
02. O que são e como usar os métodos getWidth() e getHeight()
2.2 Exemplos de desenhos interessantes apenas usando Linhas
03. Como desenhar retângulos e quadrados - Desenhando um Cubo em Java
04. Usando as fontes
05. Polígonos e Polilinhas
06. A incrível API Java 2D
Adivinhe o que número que o computador sorteou, modo gráfico.
Jogo: Fazendo um jogo para aprender GUI, Handlers, Events e Listeners
Arquivos (Files):
Escrevendo (writing) , lendo (reading) , anexando (appending) e manipulando
01. Arquivos (Files) - O que são, para que servem e o que é possível fazer
02. Class File ( a classe File ) - Obtendo informações de arquivos e diretórios
03. Class Formatter ( a classe Formatter ) - Escrevendo em arquivos
04. Class Scanner ( a classe Scanner) - Lendo e Recebendo dados de arquivos
Primeiro programa
Usando a IDE Netbeans64 versão 10
package primeiro;
public class Primeiro {
public static void main(String[] args) {
System.out.println("Meu primeiro programa em Java!");
}
}
Classe é a base de tudo, em Java. Classe é algo mais abstrato, é uma definição geral. Um exemplo ou instância de uma classe é um objeto. Classe é algo mais genérico, objeto é algo mais específico. Daí vem o fato de Java ser orientado à objetos. O carro, por exemplo, é uma classe. É algo mais geral.
Um exemplo de objeto, é o fusca. Um Honda Civic é um objeto da classe carro, mas é um objeto diferente do objeto fusca.
As classes possuem atributos que todos os objetos possuem, mas que não são, necessariamente, iguais. Mas podem ser. Como assim? A classe carros tem o ítem 'motor'. Então o objeto fusca tem motor e o objeto Honda Civic também tem motor, embora esses motores sejam diferentes, pois a característica dos motores são diferentes. A classe carros tem o ítem portas. No fusca, esse valor vale 2, pois só tem duas portas (a não ser que você tenha turbinado seu fusca ou uma porta tenha caído). Porém, outros objetos da classe Carro tem 4 portas.
Isso ajuda muito na hora de criar grandes projetos. Imagina que você tenha um trabalho numa empresa, com milhares de funcionários e serviços. Fácil fácil seu programa em Java vai possuir milhares de objetos, mas se você se organizar bem só vai ter algumas dezenas de Classes. Assim, você organiza o 'mundo' (que no caso é a empresa), em blocos, as Classes. Então, quando fizer uma alteração, faz nas classes que todos os objetos, automaticamente, herdarão essa mudança.
Passe a ver o mundo como Classes e Objetos. Por exemplo, antigamente só existiam sexo masculino e feminino. Hoje em dia, é comum ter bem mais opções, como indefinido. E aí, vai em cada um dos milhares de funcionários e colocar mais essa categoria? Não ué, vai lá na classe 'funcionarios' e adiciona a opção 'indefinido' como mais uma opção de gênero. Pronto, todos os objetos (ou seja, os funcionários, as pessoas), herdarão e terão essa característica, pois todos os objetos são instâncias da classe. Eles são a classe. Se a classe mudou, o objeto mudou.
________________________________________________
Agora vamos aos métodos!
Métodos são...métodos! Ou seja, são meios, ou jeitos de se fazer uma coisa. Em outras linguagens, são chamados de funções (C, C++) ou sub-rotinas (Perl).
O que o nosso método faz?
Ele imprime (escreve, mas se acostume com a palavra imprimir) o texto 'Meu primeiro programa em Java!'.
Métodos podem calcular soma, subtração, integração etc. Existem métodos de formatação do HD, métodos de backup, métodos de invasão, métodos pra mostrar um texto, um menu, métodos que sorteiam um número... métodos são tarefas. É uma porção de código que faz algo bem definido. É um método pra fazer algo.
No nosso caso, o sistema ('System') joga pra fora ('out'), que no caso é a tela, na forma de escrita ('print') a mensagem 'Meu primeiro programa em Java!. Se você gosta de se questionar, então a resposta é sim. Assim como sai ('out'), pode entrar ('in'), que é quando o sistema ('System') recebe dados de você usuário ou de um arquivo - 'System.in', que você verá no futuro.
E sim, ele não escreve só na tela. Também é comum escrevermos, ou printarmos, para arquivos, para criarmos um registro de erros e eventos (logs), por exemplo. Por hora, não se estresse com os 'public', 'static', 'void', 'String[]', 'args', eles são esmiuçados detalhadamente aos poucos por partes no âmago de suas entranhas íntimas e pessoais.
Agora as partes mais importantes desse começo:
1. O seu programa, pra rodar, precisa ter a 'main'.
A primeira coisa que o Java faz pra rodar é procurar o 'public static void main(String[] args)'.
É daí que ele inicia o seu programa.
2. A classe que contém o método main, 'Primeira', precisa ter o mesmo nome do projeto.
Lembre-se que o nome do nosso projeto é 'Primeira' e a classe é 'public class Primeiro {}'
Ou seja, o método main tem que estar em algum lugar dentro desse par de colchetes aí.
Estes são os erros mais comuns que vejo em fóruns, que os iniciantes cometem. Esquecerem da main.
Agora vou usar com você o melhor método de aprendizado, o teste. Testem:
1. Em vez de main, escreva Main e compile/rode.
2. Em vez de 'public class Primeiro...' escreva 'public class primeiro' e compile/rode
3. Tirem o ';', um '{' ou '}' e compile/rode
Se você achava que tinha amigos, te apresento o que é amigo de verdade: debugger
Esse cara te aponta os erros que você cometeu. As vezes mostra até a linha e exatamente o que você errou.
Sempre leia os erros e tente entender o que ele está dizendo.
Saídas Simples usando print, println e printf
Vamos falar a respeito das maneiras de mostrar mensagens na tela, que incluem:
System.out.println
System.out.print
System.out.printf
Não, isso não é bobagem...desde o momento que você liga o computador, até nos seus jogos e Facebook, mensagens são mostradas na sua tela. São muito importantes e uma das funções mais usadas pelos dispositivos digitais.
Como exibir um texto em Java
Pra começar, vá no seu projeto 'Primeiro' e altere a linha:
System.out.println("Meu primeiro programa em Java!");
Por:
System.out.print("Meu segundo programa em Java!");
Além do fato de não ser mais o primeiro, mas segundo programa que você criou, qual outra diferença você notou após compilar e rodar?
É capaz de descobrir só olhando?
É fácil ver que ao final da frase, a mensagem 'BUILD SUCCESSFUL (total time: 0 seconds)'
não está mais abaixo da 'Meu segundo programa em Java!', e sim ao lado.
Já sei! Depois da frase, vou dar um enter! Vai ficar assim:
System.out.print("Meu segundo programa em Java!"
+ "");
(Esse + "" apareceu sozinho)
Compilei, rodei e...deu na mesma.
Sim, por quê? Pro Java, dá na mesma. Pode apertar enter mil vezes que vai continuar igual.
O 'ln' de 'println' é de 'line', pois essa função imprime uma linha, e linha inclui uma quebra de linha (ou newline, ou \n, ou [enter], ou parágrafo).
Ou seja, a função 'print' não inclui essa quebra. Como colocar essa quebra no 'print'?
Existe um símbolo especial para isso, é o '\n'. Teste aí:
System.out.print("Meu segundo programa em Java!\n");
Agora foi né? Ok!
Então, como faríamos para aparecer na tela:
Programação
Progressiva
Assim:
System.out.println("Programação");
System.out.println("Progressiva");
Ou assim?
System.out.print("Programação\n");
System.out.print("Progressiva\n");
Qual destes códigos é o certo? Qual é o melhor? Por que usar um e não o outro?
Aqui vem um aspecto bacana da programação. Não exige maneira certa de escrever o código.
Se as duas formas tem o mesmo resultado, podemos usar as duas formas. Vai depender de sua criatividade. É bem comum quebrarmos a cabeça, fazermos um programa de centenas de centenas de linhas, aí vem alguém e resolve em 20 ou 30 linhas. Programação depende do seu raciocínio, do seu jeito de pensar. É algo pessoal.
Teste agora:
System.out.printf("Programação Progressiva");
E depois:
System.out.printf("Programação Progressiva\n");
E por fim:
System.out.printf("Programação Progressiva"
+ "");
Notou a diferença? Calma, não te trollei.
O 'f' de 'printf' é referente a formatação, serve pra quando você for colocar números, strings (textos),
alinhar e fazer outros tipos de formatação usando as saídas.
Comentários e Delimitadores em Java
Comente seus códigos, deixe-os bem explicados e claros para quando outros programadores forem ler.
Daqui alguns meses, quando estiver mais avançado em nosso curso de Java, você vai notar que esses 'outros' incluem você, quando não se lembrar mais o motivo de ter implementado o método daquele jeito.
Um comentário é sempre bom para explicar o que um trecho no seu código significa, assim você ou outra pessoa não perde tempo tentando decifrar.
Basta ler o comentário que explica seu funcionamento.
Como fazer comentários nos códigos Java
Bom, nessa altura do campeonato você já deve ter criado vários projetos e saídas.
Crie um projeto chamado 'Teste'.
Vamos testar uma coisa, vamos colocar essa linha aqui embaixo da 'main' e ver o que acontece:
//Olá, o que acontece se eu escrever isso?
Teste:
public class Teste { //Olá, o que acontece se eu escrever isso?
public static void main(String[] args) {
System.out.println("Não sei! O que acontece se escrever aquilo lá?");
}
}
O que fizemos foi um comentário.
Tudo o que colocarmos na mesma linha e depois das duas barras, '//', não surtirá efeito na compilação/execução.
Você pode até xingar o Java que ele vai rodar do mesmo jeito.
Pra que ser isso então, se não vai influenciar em nada?
Bom, em grandes projetos, principalmente os acadêmicos e os que envolvem complexa lógica, fica complicado entender o que outro programador programou. As vezes parecem hieróglifos. As vezes o sujeito faz uma magia matemática e você não consegue entender o que ele fez. As vezes você cria um algoritmo complexo e longo, passa meses sem mexer nesse código e depois quando vai olhar de volta não consegue se lembrar como criou aquilo.
Como usar os delimitadores /* */ em Java
Vamos supor que você vai criar um algoritmo complexo, ou copiou uma questão na IDE mesmo (pra não ter que ficar olhando pro livro, pro Java Progressivo ou pro pdf).
Supondo que esse comentário tenha vária linhas, dezenas. E aí?
/* e */
Tudo o que você escrever dentro dele será desconsiderado. Veja:
/* Cavalo de Fogo No meu sonho eu já vivi Um lindo conto infantil Tudo era magia, Era um mundo fora do meu E ao chegar desse sono acordei Foi quando correndo eu vi Um cavalo de fogo alí Que tocou meu coração Quando me disse, então Que um dia rainha eu seria Se com a maldade pudesse acabar No mundo dos sonhos pudesse chegar */
public class Teste { public static void main(String[] args) {
System.out.println("Tenho saudades dos desenhos da minha infância");
}
}
Tipos Numéricos
int (inteiro), float e double (decimais ou reais)
Declarando variáveis em Java
O Java é uma linguagem fortemente tipada, ou seja, para usarmos os tipos de informações, temos que declará-los.
INT
Vamos declarar um inteiro:
int idade;
As declarações seguem essa sintaxe: [tipo] nome_da_variável;
Isso é necessário pois o Java seleciona uma parte na memória (aloca) para esta variável,
porém os tipos de variáveis ocupam diferentes tamanhos na memória.
O tipo 'int', por exemplo, armazena 32 bits, ou qualquer inteiro entre -2.147.483.648 e 2.147.483.647
FLOAT
O tipo 'float', que armazena números decimais (quebrados, ou com vírgula) também armazenam 32 bits.
LONG
Já os 'long' armazenam 64 bits, assim como 'double' (que é um 'float' maior), ou seja,
qualquer número inteiro de -9.223.372.036.854.775.808L até 9.223.372.036.854.775.807L.
Vamos declarar um tipo 'long':
long idade_do_universo;
Podemos fazer:
long idade;
para armazenar a idade de uma pessoa?
Sim, podemos, mas é óbvio um desperdício de memória, pois não usaremos um número grande para representar nossa idade,
mesmo que você fosse a Dercy Gonçalves.
- Inicializando uma variável
Poderíamos atribuir o valor a uma variável de duas maneiras, uma na declaração:
int idade=21;
Outro meio é depois da declaração:
int idade;
idade=21;
Vamos mostrar como imprimir o valor de uma variável na 'print',
lembrando que o Java só permite isso depois que você declara e inicializa sua variável:
System.out.println(idade);
Teste o seguintes código:
public class Soft { public static void main(String[] args) {
int idade=21;
System.out.println("idade");
System.out.println(idade);
}
}
Notou a diferença? Quando colocado entre aspas, saí o texto. Sem aspas, sai o valor armazenado.
Vamos usar os dois, "idade" e o valor idade.
Como vimos, para sair em forma de texto, escreva "entre aspas" e use o sinal de somar '+' para adicionar mais informações, no caso, o valor da variável inteira 'idade'.
Veja o resultado do código:
public class Soft { public static void main(String[] args) {
int idade=21;
System.out.println("Minha idade é: " + idade);
}
}
Um texto entre aspas é chamado de string. Então, estamos printando a string "idade" e um inteiro.
Substitua e teste, agora com valores decimais:
float dinheiro=1.99f;
System.out.println("Só tenho R$" + dinheiro + " na minha carteira");
Dois detalhes importantes:
1. Usamos vírgula em países da América não-inglesa e na Europa, mas para representar valores decimais, em computação, usamos o ponto '.' como separador, e não vírgula!
2. Por padrão, o Java assume valores decimais como double. Pra especificar que é um 'float', coloque aquele 'f' ao final. Ou 'F'.
Ao final do tipo 'long' coloque 'l' ou 'L'.
Para armazenar inteiros, também existem os tipos 'byte', que armazena 8 bits e 'short', que armazena 16 bits.
Porém, vamos desconsiderar estes, devido suas limitações (muito pequenos).
Recebendo dados do usuário: a classe Scanner
Até o presente momento definimos as variáveis no momento em que estávamos programando. Mas e se quiséssemos obter essa informação do usuário? or exemplo, para perguntar a idade ou para criar uma calculadora? Iríamos depender do que fosse digitado.
Usaremos a classe Scanner para receber esses dados.
Importando (import) classes (class) e pacotes (packages)
Existem milhares de funcionalidades no Java. Essas classes foram agrupadas em pacotes, os packages.
E pacotes para a mesma funcionalidade são chamados de API (Application Programming Interface).
Por exemplo, temos uma seção sobre a API Java 2D, para fazer desenhos em 2D.
Ou seja, são uma série de pacotes para desenhar.
Porém, todos esses pacotes não estão simplesmente prontos para serem utilizados, pois são muitos.
Inclusive, você pode criar (e vai) os seus pacotes, pode baixar, reutilizar, compartilhar, vender etc.
Se todos estes estivessem prontos para utilização, demoraria MUITO para rodar um programa em Java.
Qual a solução então?
Vamos dizer ao Java quais funcionalidades queremos usar.
Pra isso, usamos a função 'import':
import pacote_que_voce_quer_importar;
Por exemplo: para usar print, printf e println, não precisa dizer nada ao Java.
São métodos tão comuns que podem ser usadas automaticamente em qualquer aplicação.
Esses métodos fazem parte de um pacote chamado 'java.lang'.
Recebendo dados do usuário:
new Scanner(System.in)
Para receber dados do usuário, temos que usar a classe Scanner, que faz parte do pacote 'java.util'.
Vamos dizer ao Java que usaremos essa classe na nossa aplicação
Para isso, adicione essa linha no começo do programa:
import java.util.Scanner;
Bom, temos a classe. Vamos declarar o nosso objeto do tipo Scanner.
Vamos chamá-lo de 'entrada'. Sua declaração é feita da seguinte maneira:
Scanner entrada = new Scanner(System.in);
Pronto, o objeto 'entrada' será usado para ler entradas do sistema.
Lembre-se que há uma forte tipagem por trás dos panos.
Ou seja, o Java está lidando com bytes, blocos de memória e outras coisas mais complicadas.
Então, para ele, há muita diferença entre inteiros, float, doubles e outros tipos.
Portanto, precisamos ser bem claros quanto a isso. Assim, a nossa entrada será bem tipada. Vamos iniciar por inteiros.
Para receber um número inteiro do usuário, com nosso objeto 'entrada', usaremos a seguinte sintaxe:
inteiro = entrada.nextInt();
Explicações dadas, vamos ver a coisa funcionando.
Esse é um exemplo bem simples que pergunta a idade do usuário, espera ele digitar (e dar enter) e exibe essa mensagem na tela:
import java.util.Scanner;
public class Entrada { public static void main(String[] args) {
Scanner entrada = new Scanner(System.in);
int idade; System.out.println("Digite sua idade: ");
idade = entrada.nextInt();
System.out.printf("Sua idade é " + idade + "\n");
}
}
Mas isso de 'qual sua idade?...19...você tem 19 anos', é meio tele-tubbie.
Você é programador Java, vulgo Paladino das Artes Computacionais.
O seguinte programa usa uma função que obtém o ano atual (do computador do usuário)
e calcula o ano que o usuário nasceu, que é algo mais útil que repetir o que você acabou de digitar.
Para isso, usaremos a classe 'Calendar', que tem métodos para trabalharmos com dias, horas, dias da semana, minutos, segundos, anos etc.
Para saber mais sobre, acesse a documentação:
http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Calendar.html
Pra usar a 'Calendar', é necessário importar:
import java.util.Calendar;
Usaremos o método get(Calendar.YEAR), que retorna um inteiro com o ano, e vamos armazenar esse inteiro em uma variável 'ano'.
Então, nosso programa fica assim:
import java.util.Scanner;
import java.util.Calendar;
public class Entrada {
public static void main(String[] args) {
Scanner entrada = new Scanner(System.in);
int idade;
int ano_atual;
int ano_nascimento // pergunta a idade e armazena System.out.println("Digite sua idade: ");
idade = entrada.nextInt(); // Criando um objeto do tipo Calendar, o 'calendario' e armazenando o ano atual Calendar
calendario = Calendar.getInstance();
ano_atual=calendario.get(Calendar.YEAR);
ano_nascimento= ano_atual - idade;
System.out.printf("Você nasceu em " + ano_nascimento + "\n");
}
}
O ano de nascimento é calculado e armazenado através da operação de subtração:
ano_nascimento = ano_atual - idade;
Você aprenderá outras operações matemáticas em breve.
Aqui vale uma ressalva.
Eu fiz assim por ser um tutorial básico e por questão de organização, mas a variável 'ano_nascimento' não seria necessária.
Poderíamos ter usado '(ano_atual - idade)' direto no printf assim:
System.out.printf("Você nasceu em " + (ano_atual - idade) + "\n");
Mas tem que ser entre parênteses.
Assim você não precisa mais da variável 'ano_nascimento'.
Aliás, também não precisaríamos da variável 'ano_atual', poderíamos ter feito diretamente assim:
System.out.printf("Você nasceu em " + ( calendario.get(Calendar.YEAR) - idade) + "\n");
Quer saber? Esqueça da variável 'idade', faça só:
import java.util.Scanner;
import java.util.Calendar;
public class Entrada { public static void main(String[] args) {
Scanner entrada = new Scanner(System.in);
System.out.println("Digite sua idade: ");
Calendar calendario = Calendar.getInstance();
System.out.printf("Você nasceu em " + (calendario.get(Calendar.YEAR) - entrada.nextInt()) + "\n");
}
}
Notou como fomos tirando as variáveis e foi ficando cada vez menor?
Cada vez que tiramos, o programa fica menor e ocupa menos espaço.
Porém perde em legibilidade. Note que agora está mais difícil de entender o que fizemos.
Com 'idade', 'ano_atual' e 'ano_nascimento' fica bem mais organizado.
Não existe um método ou jeito melhor de se fazer as coisas. Programar é algo pessoal.
Você terá que encontrar um meio termo entre eficiência (programa rápido e ocupado pouco espaço), mas que seja de fácil entendimento por outros usuários (e por você no futuro). Pois se escrever de forma muito compacta e complicada, pode ser que nem você entenda o que fez futuro.
Recebendo outros tipos de dados, float: nextFloat();
No exemplo anterior, usamos o tipo inteiro.
Se você for perspicaz notará o 'Int' de 'nextInt()'.
Sim, pra float, será 'nextFloat':
import java.util.Scanner;
public class Entrada { public static void main(String[] args) {
Scanner entrada = new Scanner(System.in);
float preco;
System.out.println("Quanto custa algo em uma loja de R$ 1,99? ");
preco = entrada.nextFloat();
System.out.println("Hã? " + preco + "?");
}
}
Programa bobo ,não?
Não. É uma pegadinha. Digite 1,99 pra você ver.
O certo é 1.99 ;)
Exercício:
Crie um aplicativo que pergunte o ano de nascimento e diga a idade atual do indivíduo.
Use a classe Calendar e o método get(Calendar.YEAR) desta classe.
PS: não chame o usuário de indivíduo
PS2: Poderá existir alguns problemas no cálculo de sua idade
1. Por conta do mês que você faz aniversário.
Isso será resolvido deixando o problema mais completo, perguntando o mês e dia do aniversário e usando testes condicionais, que aprenderemos mais adiante.
2. Se o usuário não digitar um número, ou digitar negativo ou outro absurdo.
Nesse momento você sentirá vontade de chamar ele de indivíduo, energúmeno e outras coisas.
Mas se acostume. Existe uma coisa chamada tratamento de erros e exceções, muito usada justamente pra tentar imaginar os possíveis erros e exceções que podem ocorrer. No caso, exceções, é o nome bonito que se dá aos absurdos que os usuários podem digitar.
Por exemplo, você já deve ter visto em cadastros:
Insira sua data de nascimento na forma dd/mm/aaaa:
Aí o usuário vai e digita 5/janeiro/89 e não sabe qual foi o erro.
Experimente agora digitar algo que não seja um número em seus programas.
Operações Matemáticas: Adição, Subtração, Multiplicação, Divisão, Resto da Divisão (módulo) e precedência dos operadores
Quanto é 1 + 2 x 2 ?
Para nós, pode ser 5 ou 6. Pro Java é sempre 5.
Se fizer a soma primeiro, é 6: 1+2 x 2 = 3 x 2 = 6
Se fizer o produto primeiro, é 5: 1 + 2x2 = 1 + 4 = 5
E o computador? Como faz? E se ele se confundir também?
E 5 dividido por 2 ?
2.5 ? Pro Java pode ser 2.5 ou 2.
Operações Matemáticas em Computação
Primeiro, esqueça o 'x' como sinal de multiplicação, de agora em diante é '*'.
Segundo, divisão se representa com o '/'. Por exemplo, 4/2 = 2
Terceiro, tudo em computação é matemática.
Aliás, computação vem de computar, ou seja, contar.
Até quando você escreve em Java, a JVM(Java Virtual Machine) troca informações com sua máquina na forma de matemática (em bits).
Até as imagens, são divididas em pequenos blocos, são numerados e cada bloquinho é pintado com uma cor devidamente identificada.
Adivinhe como é essa identificação? Claro, por meio de números.
Ou achou que a máquina ia dividir em 'rosa emo', 'azul bebê' ou 'azul piscina'?
Adição, Subtração e Multiplicação
Essas três não tem muitas dificuldade. São 'zona'. Você pode somar, subtrair e multiplicar o que quiser.
Á rigor, tudo é uma soma.
Subtração é uma uma soma com números negativos: a - b = a + (-b)
Multiplicação é uma soma repetida várias vezes: a * b = a + a + a + a ... + a (o 'a' se repete 'b' vezes).
O seguinte código pede dois números inteiros (se não for inteiro, terá erros) e mostra o resultado da soma, subtração e multiplicação, sem segredo:
import java.util.Scanner;
public class Operacoes {
public static void main(String[] args) {
Scanner entrada = new Scanner(System.in);
int num1;
int num2;
System.out.print("Digite o primeiro número: ");
num1 = entrada.nextInt();
System.out.print("Digite o segundo número: ");
num2 = entrada.nextInt();
System.out.println();
System.out.println(num1 + " + " + num2 + " = " + (num1 + num2) );
System.out.println(num1 + " - " + num2 + " = " + (num1 - num2) );
System.out.println(num1 + " * " + num2 + " = " + (num1 * num2) );
}
}
Caso não for usar inteiros (ou for) aconselho a usar 'printf', pois você pode formar a saída.
Formatação com printf
Uma forma diferente de exibir números é:
System.out.printf("número: %d", num1);
O exemplo passado ficaria:
import java.util.Scanner;
public class Operacoes { public static void main(String[] args) {
Scanner entrada = new Scanner(System.in);
int num1; int num2;
System.out.print("Digite o primeiro número: ");
num1 = entrada.nextInt();
System.out.print("Digite o segundo número: ");
num2 = entrada.nextInt();
System.out.printf("\n%d + %d = %d\n", num1, num2, num1 + num2);
System.out.printf("%d - %d = %d\n", num1, num2, num1 - num2);
System.out.printf("%d * %d = %d\n", num1, num2, num1 * num2);
}
}
Ou seja, o '%d' será substituído pelo valor de %d.
Para substituir valores de variáveis float, use %f
Com multiplicação e divisão de números decimais, a coisa pode ficar bagunçada por conta das vírgulas.
Por isso, vamos adicionar esse '.2' entre o '%' e o 'f', ficando %.2f.
Isso quer dizer que, após o ponto decimal, imprimir somente duas casas decimais.
Veja:
import java.util.Scanner;
public class Operacoes { public static void main(String[] args) {
Scanner entrada = new Scanner(System.in);
float num1;
float num2;
System.out.print("Digite o primeiro número: ");
num1 = entrada.nextFloat();
System.out.print("Digite o segundo número: ");
num2 = entrada.nextFloat();
System.out.printf("\n%.2f + %.2f = %.2f\n", num1, num2, num1 + num2);
System.out.printf("%.2f - %.2f = %.2f\n", num1, num2, num1 - num2);
System.out.printf("%.2f * %.2f = %.2f\n", num1, num2, num1 * num2);
System.out.printf("%.2f / %.2f = %.2f\n", num1, num2, num1 / num2);
}
}
Experimente tirar o '.2' e veja a bagunça que fica na hora de multiplicar e dividir.
Divisão
Não divida nada por zero. Isso não existe.
Não é infinito (ou -infinito). É uma indefinição matemática.
Outra detalhe que você deve atentar é a divisão de inteiros. Quanto é 5/2?
Vamos ver o que o Java nos dizer com o seguinte programa:
import java.util.Scanner;
public class Operacoes { public static void main(String[] args) {
Scanner entrada = new Scanner(System.in);
int num1=5;
int num2=2;
System.out.println(num1/num2);
}
}
run: 2 BUILD SUCCESSFUL (total time: 0 seconds)
2 ?
"Putz, como meu computador é burro!"
Calma, agora teste:
import java.util.Scanner;
public class Operacoes {
public static void main(String[] args) {
Scanner entrada = new Scanner(System.in);
float num1=5;
float num2=2;
System.out.println(num1/num2);
}
}
run: 2.5 BUILD SUCCESSFUL (total time: 0 seconds)
Ou seja, divisões de inteiros retornam resultados inteiros.
Mesmo se o resultado 'de verdade' fosse 2.999999, o Java retornaria somente a parte inteira, que é 2, e não 3.
Em termos técnicos, o Java trunca a parte decimal. Simplesmente descarta ela.
Resto da divisão
Voltando ao 5 / 2: caso a operação seja feita com inteiro, você sabe que o resultado é 2. Porém, terá um resto, que será 1.
Pois: 5 = 2 * 2 + 1
O símbolo de resto da divisão é %.
Assim, 8 % 3 = 2. Pois: 8 = 3*2 + 2
Em matemática chamamos de 'mod', de módulo: 8 mod 3 = 2
No Brasil, é aquele 'resto' que deixávamos lá embaixo nas continhas do colégio:
Teste:
public class Operacoes {
public static void main(String[] args) {
System.out.println(2009%19);
}
}
Veremos e usaremos bastante o resto da divisão em várias questões/algoritmos.
Por exemplo,
todo número par deixa resto da divisão por 2 igual à 0. Isso é uma informação valiosíssima.
Precedência dos operadores e uso dos parênteses
Para não existir confusão e mais de um resultado possível, o Java adota uma precedência de seus operadores:
1o: Multiplicação (*), Divisão (/) e resto da divisão (%) são calculados primeiro.
Caso existam mais de um na mesma expressão, o Java impõe a precedência como sendo da esquerda pra direita na expressão.
2o: Adição (+) e Subtração(-) depois dos operadores acima serem calculados, esses são calculados.
Caso existam mais de um na mesma expressão, o Java impõe a precedência como sendo da esquerda pra direita na expressão.
Para não existir confusão e para deixar seu código sempre mais claro, separe as expressões com parênteses.
Por exemplo, como se calcula média dos números a e b?
a + b / 2 -> errado
(a + b)/2 -> certo
Os parentêses formam um bloco. É como se o que estivesse ali dentro fosse calculado separadamente.
No exemplo de inicio deste capítulo: 1 + 2 * 2
Dependendo do que você quer, divida em em parantêses que ficará implícito.
Veja:
1 + 2 * 2 = 5 (precedência do * perante ao +, em Java)
(1 + 2) * 2 = 6
1 + (2 * 2) = 5
É fácil ver que fica mais claro e organizado com o uso dos parênteses.
Fazendo comparações: os operadores maior (>), menor (<), maior igual (>=), menor igual (<=), igual (==) e diferente (!=)
O que te faz escolher um canal ou outro da televisão?
O que te faz escolher entre uma loira ou morena? Ou homem e mulher? Ou os dois, caso seja emo?
Por que estudar Java, e não Haskell?
Seja lá quais forem os motivos, mas todos passam por um estágio: a comparação.
Como fazer comparações em Java
Em Java, quando fazemos uma comparação ele retorna ''true'', 'false' ou dá erro.
E se ele errou, meu amigo, é porque você errou. Esses operadores, junto com as condicionais (que veremos em breve) e as operações matemáticas já vistas, são o alfabeto de Java. São o básico, mas são os assuntos mais essenciais. Talvez você já saiba o significado de todos esses símbolos, então já adianto um programa que faz e mostra todos os testes:
import java.util.Scanner;
public class Comparando {
public static void main(String[] args) {
float num1, num2;
Scanner entrada = new Scanner(System.in);
System.out.print("Digite o primeiro número: ");
num1 = entrada.nextFloat();
System.out.print("Digite o segundo número: ");
num2 = entrada.nextFloat();
System.out.printf("%.2f > %.2f -> %s\n", num1, num2, num1 > num2);
System.out.printf("%.2f >= %.2f -> %s\n", num1, num2, num1 >= num2);
System.out.printf("%.2f < %.2f -> %s\n", num1, num2, num1 < num2);
System.out.printf("%.2f <= %.2f -> %s\n", num1, num2, num1 <= num2);
System.out.printf("%.2f == %.2f -> %s\n", num1, num2, num1 == num2);
System.out.printf("%.2f != %.2f -> %s\n", num1, num2, num1 != num2);
}
}
Maior que: >
a > b -> retorna 'true' caso 'a' seja maior que 'b', e 'false' caso seja menor
Menor que: <
a < b -> retorna 'true' caso 'a' seja menor que 'b', e 'false' caso seja maior
Maior ou igual a: >=
a >= b -> retorna 'true' caso 'a' seja maior ou igual à 'b', e 'false' caso seja menor
Menor ou igual a: <=
a <= b -> retorna 'true' caso 'a' seja menor ou igual à 'b', e 'false' caso seja maior
Comparação de igualdade: ==
a == b -> retorna 'true' caso 'a' seja igual a b, e 'false' caso contrário
Comparação de negação: !=
a != b -> retorna 'true' caso 'a' seja diferente de b, e 'false' caso contrário
Importante: Note a diferença entre
a == b
e
a = b
O primeiro é um TESTE de comparação! É como se fosse uma pergunta pro Java: "'a' é igual a 'b'?"
O segundo, é uma afirmação, ou seja, 'a' vai receber o valor de 'b' ! Neste caso o Java retorna sempre o último valor, que no caso é 'b'. Não é comparação!
Caso fosse a=b=c, ele retornaria 'c'.
O tipo char: armazenando e representando caracteres
O tipo de dado char serve para armazenar um caractere (o char vem de character, que é caractere em inglês),
e por essa função simples tem o tamanho do tipo short. Naturalmente vem a pergunta, para que armazenar só um caractere?
Se há tipos para armazenar números, strings e textos, o que vamos fazer com um caractere?
Tipo char: O que é? Onde é usado ?
"Pressione S para sim ou N para não"
"Pressione alguma tecla para para continuar..."
Ou em jogos...nunca notou que no counter-strike que para ir para o lado esquerdo basta pressionar uma das setas (ou 'a' ou 'd').
E para o Mário Bros pular ou soltar o fogo?
Muitas vezes não precisamos de um arquivo de texto inteiro ou string, mas de simplesmente um caractere.
Declaração do tipo char
char nome_do_char = 'a';
onde poderíamos substituir 'a' por qualquer caractere alfanumérico, caso tenhamos declarado assim.
Sim, podemos declarar de outra maneira. Os caracteres podem ser representados por inteiro também.
char letra_J = 74;
char letra_P = 80;
E dentro do printf, representamos o char por %c, para efeitos de formatação.
Vamos imprimir as iniciais do site, veja:
public class Tipos { public static void main(String[] args){ char letra_J = 74; char letra_P = 80; System.out.printf("%c %c\n",letra_J, letra_P); } }
run: J P BUILD SUCCESSFUL (total time: 0 seconds)
Mas como eu adivinhei que 'J' é 74 e 'P' é 80? Qual a Matemática ou magia pra saber isso?
Tabela ASCII, que são uma forma universal de representação do caracteres por meio de números, seja decimal, hexadecimal ou octal.
Esses números são a representação decimal dos caracteres, confira a tabela abaixo:
Na verdade, essa representação é humana. Para diversos tipos de numeração.
Existe extensão dessa tabela para os chineses, para os indianos e outros povos com diferentes caracteres. E pros computadores?
Computador é macho, pra ele é tudo número, é tudo bit!
Representação é coisa humana.
Misturei tudo, veja só:
public class Tipos { public static void main(String[] args){
int numero_J = 74;
char letra_J = (char) numero_J;
char letra_P = 80;
char letra_i = 'i';
System.out.printf("%c%c%c%c %c%c%c%c%c%c%c%c%c%c%c\n", letra_J,97,118,97, letra_P, 'r', 111,103,114,101,'s','s',letra_i, 118, 111);
}
}
Não poderíamos simplesmente igualar um char a um inteiro:
letra_J = numero_J
Então fizemos um cast: char letra_J = (char) numero_J;
Que nada mais é que dizer ao Java para representar o próximo tipo de uma outra forma.
No caso, estamos dizendo 'Hey, Java, brother, não veja o numero_J como inteiro, veja como char.
Eu sei que declarei como char, mas é só dessa vez, ok?'.
Para ver mais caracteres e magias numéricas:
http://www.asciitable.com/
http://www.tamasoft.co.jp/en/general-info/unicode.html
http://pt.wikipedia.org/wiki/ASCII
Como armazenar um caractere (char) que o usuário digitou
Usamos, obviamente, a classe Scanner para receber um caractere do usuário.
Porém, há uma pequena diferença. Usaremos o método 'nextLine()' que recebe uma string do usuário, porém como queremos um caractere, usaremos o 'charAt(0)' para receber apenas um caractere (ou o primeiro elemento da string).
Veja como se faz:
Scanner entrada = new Scanner(System.in);
char caractere;
caractere = entrada.nextLine().charAt(0);
O tipo boolean: a base da lógica
Booleano é um tipo de dado que permite apenas dois valores, true (verdadeiro) ou false (false).
Java, programação, computação, dois valores...binário?
Sim, tem a ver com algo mais complexo, a Álgebra Booleana (números e lógica binária),
que é a base de toda a Engenharia Elétrica, Eletrônica e de Telecomunicações, por exemplo.
Booleanos em Java
Mas não será necessário irmos tão à fundo em nossos estudos para desenvolver em Java.
Como já dito antes, pro computador é tudo número, tudo bit mesmo.
Isso de verdadeiro ou falso é para os humanos e programadores Java criarem código com mais facilidade
(programador Java não é humano, é Paladino das Artes Computacionais, é um estágio acima).
E onde usamos 'true' e 'false'? Em todo canto.
"Li e aceito os termos de condições'.
Se não selecionou, esta opção está como 'false' e você não consegue instalar o programa pirata em seu Windows
(alguém já leu algum termo de condição na vida?).
Quando você marca, fica 'true' e é possível prosseguir.
Se um formulário pede uma data na forma: dd/mm/aaaa
Enquanto não é preenchido corretamente, o formulário está como 'false' para continuar.
Só fica 'true' se preencher corretamente. Por isso, se colocar: 5/jan/90
não vai de jeito nenhum, não vai ficar 'true'.
Ou seja, usamos os tipos booleanos em Java quando quisermos ter a certeza que alguma condição é verdadeira ou falsa.
Em uma linguagem mais matemática, os tipos booleanos estão relacionados com os operadores lógicos AND (E) e OR (OU),
que veremos em seguida.
Declaração de tipos boolean
boolean nome_bool = true;
boolean nome_bool2 = false;
Embora possamos fazer uma analogia com o sistema binário, diferente de outras linguagens,
não podemos fazer a conversão com inteiros para true = 1 e false = 0.
Ou seja, boolean é boolean e inteiro é inteiro em Java, nem com cast vai.
Em outras, linguagens, por exemplo, 'false' pode ser representado por 0, string vazia, ponteiro apontando pra 'null' ou algo vazio e 'true' por qualquer outro valor.
Em SQL (linguagem para se trabalhar com banco de dados), o booleano pode ser true, false, unknown (desconhecido) ou null (nulo).
Por hora, não temos muito o que mostrar. Usaremos MUITO os booleanos em condições de controle e loopings, mais a frente e durante todo o nosso curso.
Operadores lógicos e de negação:
&& (E ou AND), || (OU ou OR) e o ! (negação)
Completando seus conhecimentos sobre álgebra booleana, explicaremos um pouco sobre E e OU.
Mas não se assuste com a palavra 'álgebra', se você sabe português e tem bom senso, já sabe o que será explicado.
Operadores lógicos E ( && ) e OU ( || ) em Java
Muitas vezes queremos testar se algumas condições são verdadeiras.
Geralmente queremos testar mais de umas condições.
Por exemplo:
"para você passar de ano você precisa ter média maior que 6.0 em todas as matérias E média maior que 7 em pelo menos 3."
Notou o E? Ele quer dizer que as duas condições tem que ser satisfeitas.
Agora o mesmo exemplo, usando o OU.
Para você passar de ano você precisa ter média maior que 6.0 em todas as matérias OU média maior que 7 em pelo menos 3."
Agora ficou mais fácil, pois você só precisa satisfazer uma das condições. Você pode tirar 7 em Matemática, Física e Química e zerar todas as outras, pois não tem mais que tirar média 6.0 em todas.
Mas nada te impede de satisfazer as duas condições.
Formalizando
'E' e 'OU' são nossas analogias para linguagem humana.
O computador fala na linguagem dos bits, e tem sua linguagem especial.
Em Java, para representar o 'E' e o Java se comunicar com sua máquina, você vai usar a representação: &&
Para representar o 'OU', use ||
Então, vamos formalizar os exemplos. Sejam as condições :
condicao_A = todas médias maiores que 6.0
condicao_B = tirar média maior que 7 em pelo menos 3 matérias
O primeiro exemplo é representado por: ( condicao_A && condicao_B )
O segundo exemplo é representado por: ( condicao_A || condicao_B )
Negando declarações: !
Para negar uma declaração ou condição, simplesmente colocamos um símbolo de exclamação (!) antes de tal declaração/condição.
Por exemplo, um bom aluno tem suas notas representadas por: condicao_A
Já um péssimo aluno tem suas notas representadas assim: !condicao_A
!condicao_A quer dizer que nem todas as médias são maiores que 6.0
Qual o contrário de verdade? Falso, obviamente.
Em Java, as seguintes formas são iguais:
true = !false
false= !true
Como usar IF e ELSE:
Testando e Escolhendo o que executar
Até agora na apostia Java Progressivo, nossos códigos foram procedurais.
Ou seja, seguiram um ordem de execução: do começo ao fim, executando tudo.
Mas executamos tudo, sempre que usamos um programa?
Claro que não, escolhemos. Fazemos opções.
É isso o que o if else faz, nos permite optar por executar determinadas coisas.
Como usar o IF em Java
Em inglês quer dizer 'se'.
A sintaxe é:
if ( condição ){
caso a condição seja verdadeira esse bloco de código será executado
}
E se não for verdade?
Não executa, ué.
Vamos testar a condição ' 1 é igual a 2?', que obviamente retornará 'false' e depois testar se 1 é igual 1.
Mas isso é em nossa língua. Como perguntamos isso pro computador?
Assim:
if(1 == 2)
e depois:
if(1 == 1)
Veja bem, é 1 == 2, e não 1 = 2.
1 == 2 é uma comparação, é uma pergunta, ela retorna um valor lógico!
Aqui que está a chave, só podemos colocar no if o que retorna valor lógico.
1 = 2 é uma atribuição de valores simplesmente!
Vamos aos códigos:
public class Ifelse { public static void main(String[] args) {
if (1 == 2){
System.out.println("Você nunca lerá essa mensagem, mwahuahuauha");
}
if (1 == 1){
System.out.println("1 é igual a 1? Jura? ");
}
}
}
Como usar ELSE em Java
Do inglês: senão
O else só vem acompanhado do if, e ele só ocorre quando a condição do if é falsa.
A sintaxe é a seguinte:
if ( condição )
{
caso a condição seja verdadeira esse bloco de código será executado
}
else
{
caso a condição seja falsa esse bloco de código que será executado
}
O else não recebe condição. Ele executa quando o if não executa.
Ou seja:
if (verdade)
faz isso
else
faz isso
Aprender if else não é aprender pro Java, é aprender para todas as outras linguagens.
Aliás, é aprender lógica. É matemática, é raciocínio.
Essa mesma base lógica é extremamente usada em Engenharia (Elétrica, Eletrônica, Telecomunicações), em Física, Matemática Discreta, todo tipo de Ciência, em chips, no Kernel dos Sistemas Operacionais, nos aviões e em tudo que envolver lógica e mundo digital.
Mas vamos fazer algo útil:
Problema: Crie um programa que recebe uma nota ( pela classe Scanner) e checa se você passou direto, ficou de recuperação ou foi reprovado na matéria, e exiba tal mensagem:
A regra é a seguinte:
Nota 7 ou mais: passou direto
Entre 5 e 7: tem direito de fazer uma prova de recuperação
Abaixo de 5: reprovado direto.
Programa:
Diz se você passou, ficou de recuperação ou reprovou
Problema:
Crie um programa que recebe uma nota ( pela classe Scanner) e checa se você passou direto, ficou de recuperação ou foi reprovado na matéria.
A regra é a seguinte:
Nota 7 ou mais: passou direto
Entre 5 e 7: tem direito de fazer uma prova de recuperação
Abaixo de 5: reprovado direto
Aplicativo em Java
Vamos fazer isso usando condições, testando com IF ELSE em Java o que foi digitado pelo usuário. No caso, a nota.
Vamos colocar if dentro de if, essa técnica se chama aninhar (nested).
Vou dar uma importante dica que você vai usar por toda sua vida de programador, que é uma das
maiores lições que sei e posso passar:
"Um problema difícil nada mais é que uma série de pequenos problemas fáceis."
E qual pra transformar um problema difícil em fáceis?
Usando a técnica de Jack, o estripador: por partes. Quebre o programa.
Todo e qualquer projeto, desde esse que vou passar até os da NASA, são divididos em área, partes...na criação de um jogo, tem gente especializada até no desenho das árvores, no barulho das armas e se o eco vai ser realista.
Ok, vamos lá.
Criar um programa que recebe uma nota do usuário você já sabe, é só usar a classe Scanner.
Mas o nosso curso vai ser focado nas boas práticas, vamos focar em criar aplicações robustas.
O que é isso?
Vamos minimizar o máximo possível os possíveis problemas que possam aparecer quando usuário for usar o problema.
Parte 1:
Tendo a certeza que o usuário vai digitar uma nota válida
Você pensou nisso? E se o energúmeno digitar 11 ou -1.1 ?
Não pode.
O primeiro passo da nossa aplicação é ter a certeza que ele vai digitar uma nota ENTRE 0.0 e 10.0!
Se for 0.0 até 10.0, ok, e se não for? Acaba o programa.
Fica assim:
public class PasseiOuNao { public static void main(String[] args) {
float nota;
//vai armazenar a nota
Scanner entrada = new Scanner(System.in);
System.out.print("Digite sua nota [0.0 - 10.0]: " );
nota = entrada.nextFloat();
if( (nota <= 10.0) && (nota >= 0.0) )
{
System.out.println("Nota válida");
}
else { System.out.println("Nota inválida, fechando aplicativo");
}
}
}
O que fizemos foi certificar que a nota é menor que 10.0 E maior 0.0 !
Os dois casos precisam ser satisfeitos, por isso o operador lógico &&.
Teste. Coloque 10.1, 10.5, 21.12, -19, -0.000001, "java progressivo".
Você tem que fazer muito isso: testar.
Nas grandes empresas tem gente contratada só pra isso: testar (estagiários ou bolsistas).
Eliminada as possibilidades de notas absurdas, prossigamos.
Parte 2: Checando se passou direto
Vamos colocar mais um if else que vai checar se o aluno passou direto ou não.
Por hora, esqueça o código feito.
Como seria esse código pra testar se ele passou direto? Fácil:
if( nota >= 7.0 )
{
System.out.println("Parabéns, você passou direto. Já sei, você programa em Java?");
}
else { System.out.println("Não passou direto");
}
Vamos colocar esse trecho de código abaixo daquele print que diz 'nota válida'.
Então, vamos pensar como o Java pensa:
Primeiro ele recebe o resultado.
Checa se está entre 0.0 e 10.0. Se não está, pula pro else e terminou o programa.
Se estiver entre 0.0 e 10.0, diz que a nota é válida e depois faz outro teste em outro if, pra checar se a nota é maior que 7.0, se for diz passou direto, se não for diz que não passou direto.
O código ficaria assim:
import java.util.Scanner;
public class PasseiOuNao {
public static void main(String[] args) {
float nota;
//vai armazenar a nota
Scanner entrada = new Scanner(System.in);
System.out.print("Digite sua nota [0.0 - 10.0]: " );
nota = entrada.nextFloat();
if( (nota <= 10.0) && (nota >= 0.0) ){ System.out.println("Nota válida");
if( nota >= 7.0 ){
System.out.println("Parabéns, você passou direto. Por acaso você programa em Java?");
}
else { System.out.println("Não passou direto");
}
}
else {
System.out.println("Nota inválida, fechando aplicativo");
}
}
}
Teste.
Note que o Java não perdoa. Se tirar 6.99 não passa direto!
Parte 3: Checando se você ainda há esperanças
Bom, agora vamos checar se o aluno ainda pode fazer recuperação, ou seja, se a nota está entre 5.0 e é menor que 7.0.
Caso seja exatamente 7.0, passará automaticamente.
O código pra essa parte é o seguinte:
if( nota >= 5.0 ){
System.out.println("Vai ter que fazer recuperação");
}
else {
System.out.println("Reprovado. Ainda bem que é só simulação, hein?");
}
Note que se não for maior ou igual a 5.0, é menor, então vai pro else.
Ora, se é menor, foi reprovado. Então o else manda mensagem de reprovação.
A pergunta é, onde vamos inserir esse código?
No else do trecho 'Não passou direto'
Então, o código completo fica:
import java.util.Scanner;
public class PasseiOuNao { public static void main(String[] args) {
float nota;
//vai armazenar a nota
Scanner entrada = new Scanner(System.in);
System.out.print("Digite sua nota [0.0 - 10.0]: " );
nota = entrada.nextFloat();
if( (nota <= 10.0) && (nota >= 0.0) ){
if( nota >= 7.0 ){ System.out.println("Parabéns, você passou direto. Por acaso você programa em Java?");
}
else {
if( nota >= 5.0 ){ System.out.println("Vai ter que fazer recuperação");
}
else {
System.out.println("Reprovado. Ainda bem que é só simulação, hein?");
}
}
}
else {
System.out.println("Nota inválida, fechando aplicativo");
}
}
}
O Java lê e interpreta seguindo esses passos:
1; Primeiro checa se a nota é válida (se está entra 0 e 10)
Se não está, vai pro else, que termina o programa.
Se está, vai pro próximo if, que é o passo 2.
2. Checa se tirou mais que 7.0 através do próximo if
Se sim, ele passa direto e termina o programa.
Se não tirou mais que 7.0, vai pro else, que é o passo 3.
3. Checa se tirou mais que 5.0 através do próximo if
Se sim, diz que ficou de recuperação e termina o programa.
Se não, vai pro else, que diz que foi reprovado e terminou o programa.
Por questão de organização, coloque os pares if-else na mesma linha vertical,
veja como fica mais organizado, e assim você vai saber à qual if o else pertence (sim, você pode se confundir).
Pintei os pares correspondentes para ficar mais claro.
Isso se chama identação!
Exercício:
Refaça o mesmo problema.
Teste se a nota está entre 0.0 e 10.0.
Depois se foi reprovado direto, se sim, termina o programa.
Se não, vai pra outro if pra saber se está de recuperação. Se estiver, termina.
Se não estiver de recuperação, vai pro else que diz que ele passou direto.
Ou seja, é o mesmo problema, mas com a lógica ao contrário.
Obviamente, deve funcionar da mesma maneira.
Isso vai mostrar como um mesmo problema pode ser feito de várias maneiras.
Aplicativo: Determina as raízes de uma equação do segundo grau
Crie um programa, em Java, que receba os coeficientes de uma equação do 2o grau e retorne suas raízes.
Um equação do segundo grau é uma equação onde:
ax² + bx + c = 0 , com 'a' diferente de 0
Programa em Java que calcula as raízes e resolve uma equação do segundo grau
Passo 1:
A primeira parte do programa recebe os três coeficientes da equação, que são 'a', 'b' e 'c' e serão representados pelo tipo float.
Passo 2:
Uma equação do 2o grau só é válida se 'a' for diferente de 0, então, se for igual a 0 o programa deverá terminar.
Ou seja, nosso programa irá acontece dentro do 'if' que checa que 'a' é diferente de 0.
Passo 3:
Determinando o valor de delta: delta = b² - 4ac
Determinando a raiz quadrada de delta: sqrtdelta = (float)Math.sqrt(delta);
Onde sqrt significa 'square root', ou raiz quadrada, em inglês.
Em Java, calculamos a raiz quadrada do número x com o método: Math.sqrt(x);
Esse método retorna um tipo 'double'. Como usamos float em nossos coeficientes, usamos o cast '(float)' para transformar o double em float.
Passo 4:
Se delta for maior ou igual a zero, as raízes são dadas por:
raiz1 = (-b + sqrtdelta) / 2a
raiz2 = (-b - sqrtdelta) / 2a
Passo 5:
Se delta for menor que zero, suas raízes serão complexas e as raízes serão da forma:
raiz1 = (-b + i.sqrt(-delta) )/2a
raiz2 = (-b - i.sqrt(-delta) )/2a
Formatei a saída da seguinte forma, para ficar mais legível, que é a mesma coisa das equações anteriores:
raiz1 = (-b)/2a + i.sqrt(-delta)/2a
raiz2 = (-b)/2a - i.sqrt(-delta)/2a
Código Java:
import java.util.Scanner;
public class Bhaskara {
public static void main(String[] args) {
float a, b, c,
//coeficientes delta,
//delta sqrtdelta,
//raiz quadrada de delta raiz1,raiz2;
//raízes Scanner entrada = new Scanner(System.in);
//Passo 1: Recebendo os coeficientes
System.out.println("Equação do 2o grau: ax² + bx + cx = 0");
System.out.print("Entre com o valor de a: ");
a = entrada.nextFloat();
System.out.print("Entre com o valor de b: ");
b = entrada.nextFloat();
System.out.print("Entre com o valor de c: ");
c = entrada.nextFloat();
//Passo 2: Checando se a equação é válida if(a != 0){
//Passo 3: recebendo o valor de delta e calculando sua raiz quadrada
delta = (b*b) - (4*a*c);
sqrtdelta = (float)Math.sqrt(delta);
//Passo 4: se a raiz de delta for maior que 0, as raízes são reais
if(delta >=0){
raiz1 = ((-1)*b + sqrtdelta)/(2*a);
raiz2 = ((-1)*b - sqrtdelta)/(2*a);
System.out.printf("Raízes: %.2f e %.2f", raiz1, raiz2); }
//Passo 5: se delta for menor que 0, as raízes serão complexas
else{
delta = -delta;
sqrtdelta = (float)Math.sqrt(delta);
System.out.printf("Raíz 1: %.2f + i.%.2f\n", (-b)/(2*a), (sqrtdelta)/(2*a));
System.out.printf("Raíz 2: %.2f - i.%.2f\n", (-b)/(2*a), (sqrtdelta)/(2*a));
}
}
else{ System.out.println("Coeficiente 'a' inválido. Não é uma equação do 2o grau");
}
}
}
Questões sobre os testes condicionais if else
Exercícios sobre IF ELSE em Java
0. Escreva um programa que receba o raio de uma circunferência e mostre o diâmetro, comprimento e área desta.
1. Faça um programa que receba três inteiros e diga qual deles é o maior e qual o menor. Consegue criar mais de uma solução?
2. Escreva um programa em Java que recebe um inteiro e diga se é par ou ímpar
Use o operador matemático % (resto da divisão ou módulo) e o teste condicional if.
3. Escreva um programa que pede os coeficientes de uma equação do segundo grau e exibe as raízes da equação, sejam elas reais ou complexas.
Solução
Desafio 1: Crie um programa que recebe uma nota ( pela classe Scanner) e checa se você passou direto, ficou de recuperação ou foi reprovado na matéria.
A regra é a seguinte:
Nota 7 ou mais: passou direto
Entre 5 e 7: tem direito de fazer uma prova de recuperação
Abaixo de 5: reprovado direto
Solução
Desafio 2: Escreva um aplicativo Java que gere um número aleatório inteiro entre 1 e 10, e através de testes condicionais você tem que adivinhar que número é esse.
Qual a melhor técnica, a que adivinha em menos chances possíveis?
Para gerar um número aleatório na variável inteiro 'num_aleatorio', adicione no seu programa:
import java.util.Random;
Para gerar números aleatórios, crie um tipo Random 'randomGenerator':
Random randomGenerator = new Random();
E declare a variável para receber o número aleatório assim:
num_aleatorio = randomGenerator.nextInt(10) + 1;
Operadores Matemáticos de Incremento (++) e Decremento (--)
Nesta lição iremos aprender duas 'mão na roda', especialmente úteis para estudar laços while e for.
Esses operadores simplesmente somam e subtraem uma unidade.
Parece simples, não?
Ao fim do curso, você será fã número 1 dos operadores de incremento e decremento.
Operadores de incremento e decremento em Java
Em muitas aplicações Java temos a necessidade de contar, ou controlar coisas:
-
quantas coisas foram digitadas
-
quantos tiros você deu no jogo
-
quanto tempo se passou
-
quantos alunos foram cadastrados em um sistema
-
etc.
Geralmente, contamos de um em um. Imagine, gerenciar e contar um sistema de cadastro com milhões de inscritos, como o do Enem?
Ainda bem que você é programador Java e não se assustou, pois sabe que não vai fazer isso.
Você é paladino das artes computacionais, vai programar o computador pra fazer isso ;)
Então, boa parte das contas são feitas utilizando os 'laços', que vai aprender já já e vai utilizar pra sempre.
Com ele, você vai fazer com que o computador faça o tanto de contas que quiser...10, 20, mil, 1 milhão...o Google realiza trilhões por dia.
Você pode até fazer um looping, que é um laço sem fim e travar seu computador. Uns chamam de hackear, eu prefiro chamar de estudo e vou mostrar como fazer.
Esses laços, porém, tem que ser incrementado. Geralmente eles tem um início, uma condição e um fim.
Como esse fim é atingido? Através de uma ou mais variável que vai crescendo ou diminuindo.
Quando atinge um certo ponto, o laço vai parar.
É aí que entra os operadores de incremento e decremento.
Somando e Subtraindo variáveis em Java
O incremento quer dizer:
a = a + 1
Ainda lembra como resolver isso?
Passa o 'a' pro outro lado: a - a = 1
Aí fica: 0 = 1
Ou seja, não é isso o que você tinha em mente.
a = a + 1, em Java, aliás, em Programação, é algo totalmente diferente da Matemática convencional.
Vamos ver na prática, que depois explico.
Abra seu NetBeans, declare um inteiro, atribua um valor e imprima.
Agora faça:
a = a + 1;
Logo após atribuir 1 ao 'a', imprime, veja o resultado e tente descobrir o que aconteceu.
Substitua por: a = a + 2;
Ou a = a + 3;
public class incremento { public static void main(String[] args) {
int a=1;
System.out.println(a);
}
}
Hackers, pessoas que descobrem as coisas sozinhas (e não criminosos ou vândalos, como pensam, errôneamente), fazem isso.
Testam, pensam e descobrem como as coisas funcionam.
Explicação:
Quando fazemos a =
é porque vamos atribuir um valor ao 'a', um novo valor, INDEPENDENTE do que ele tinha antes.
E qual o valor que vamos atribuir? 'a + 1'!
Ou seja, o 'a' vai ser agora o seu antigo valor mais 1!
Se a=2, e fazemos a = a + 3, o que estamos fazendo?
Estamos dizendo que o 'a' vai mudar, vai ser seu antigo valor (2), mais 3! Ou seja, agora a=5
Faz sentido, não?
a++ e a--
Usaremos muito, mas MUITO mesmo o incremento e o decremento de unidade:
a = a + 1;
a = a - 1;
Porém, é chato ou da preguiça ficar escrevendo a=a+1 e a=a-1 o tempo inteiro.
Então, inventaram atalhos para isso!
-
a = a + 1 pode ser representado por a++ ou ++a
-
a = a - 1 pode ser representado por a-- ou --a
Existe uma diferença entre a-- e --a, ou entre a++ e ++a.
Mas isso é assunto pra outro artigo, por hora, fique com um código que mostra o uso do incremento e decremento.
Não deixem de rodar.
Como já dizia o filósofo: só creio compilando e vendo.
public class incremento { public static void main(String[] args) {
int a=1; int b=1;
System.out.println("Valor inicial de a = " + a);
System.out.println("Valor inicial de b = " + b);
System.out.println("Incrementando: a++"); a++;
System.out.println("Decrementando: b--"); b--;
System.out.println("Agora a = " + a);
System.out.println("Agora b = " + b);
}
}
Exercício:
Teste com ++a e --b e veja se há diferença ou não.
Formate com printf, ao invés de println.
Operadores de Atribuição: +=, -=, *=, /= e %= |
Vimos na aula passada de nossa apostila de Java sobre operadores de incremento ++ e decremento --, que são nada mais que atalhos para atribuições do tipo:
a = a + 1
a = a - 1
Porém, para evitar ficar escrevendo 'à toa', não foram criado somente estes atalhos e nem somente existem estes tipos de atribuições.
Vamos aprender mais alguns atalhos e dicas em Java que nos farão poupar tempo e escrita.
Operadores de atribuição em Java
Se você já sabe como funciona o: a = a + 1
Já parou pra pensar se existe e como funcionaria o: a = a * a ?
Vamos lá, seja a = 2
Quanto seria: a = a * a?
Pela lógica, o 'a' receberia o produto de seus antigo valores, 2*2 = 4. Correto
Você já estudou PG, progressão geométrica?
Esse seria um belo exemplo onde usaríamos essa atribuição. Note que o valor era 'a', agora é 'a²'
E seu professor, que ficava mandando você calcular PA, PG...
logo logo você programar o computador pra fazer isso para você através do bendito Java.
Usaremos atribuição para fazer um aplicativo que calcula juros também.
Eu tenho um que, embora simples, é bem útil.
Ele pergunta o tanto que vou botar no banco, o juros, o tanto de meses que vou deixar, e ele me informa o que vai render.
Ou eu digo o quanto que quero que renda e ele me diz os meses que devo deixar lá, para que renda o que eu preciso.
Sabendo programação, você vai fazer as coisas que você necessita. Esse foi meu exemplo.
Qual o seu? O que você precisa calcular todo dia?
Em que você perde tempo fazendo conta, perguntando pra alguém ou pesquisando?
Ao término da seção de Controle de Fluxo você já será capaz de fazer uma gama enorme de aplicativos em Java para seu propósito.
Atalhos que salvam vidas
Você já aprendeu que é bem melhor escrever a++ ao invés de a = a + 1
E em relação as outras atribuições? Não achou que iríamos perder tempo escrevendo tanto assim né? Claro, que não.
Veja só os truques que são usados em Java, e em outras linguagens:
a = a + b, fazemos: a +=b
a = a - b, fazemos: a -=b
a = a * b, fazemos: a *=b
a = a / b, fazemos: a /=b
a = a % b, fazemos: a %=b
A lógica é simples. Você sempre vai ver dois números, x e y, por exemplo.
E um operador matemático, vamos chamar de []
E vai ver o sinal de igualdade, =, que é o sinal de atribuição.
E vai ver a fórmula: x [] = y
Isso sempre vai representar isso: x = x [] y
Ou seja, o primeiro número, sempre vai receber a operação matemática [] de seu antigo valor com o número y.
E para não perder o costume, um código em Java para mostrar como é que se faz:
public class Atribuicao { public static void main(String[] args) {
int a=1;
int b=2;
System.out.println("Valor inicial a = " + a);
System.out.println("Valor inicial b = " + b);
System.out.println("Fazendo a +=b");
a +=b; System.out.println("Agora a = " + a);
System.out.println(); System.out.println("Fazendo a -=b");
a -=b; System.out.println("Agora a = " + a);
System.out.println("Fazendo a *=b");
a *=b; System.out.println("Agora a = " + a);
System.out.println("Fazendo a +=2 ");
a +=2; System.out.println("Agora a = " + a);
System.out.println(); System.out.println("Fazendo a /=b");
a /=b; System.out.println("Agora a = " + a);
System.out.println();
}
}
Operadores de atribuição e de incremento e decremento:
diferenças entre a=++b e a=b++
Já vimos o uso dos operadores de decremento e incremento, em Java.
E também como usar os operadores de atribuição: +=, -=, *=, /= e %=
Porém, devemos tomar alguns cuidados no uso deles, como, por exemplo, na diferença entre a=++b e a=b++
Diferença de a=++b e a=b++ em Java
Você ja estudou e testou que usar isoladamente:
a++ e ++a não surte efeito.
Porém, surte na hora da atribuição.
Vamos lá, ao nosso 'teste hacker':
Seja b=2;
Só olhando e raciocinando, você seria capaz de descobrir quanto seria 'a' em cada caso:
a = b++;
a = ++b;
Explicações
1. a = b++
Mais uma vez, é um atalho em Java, uma forma mais simples de escrever as seguintes linhas:
a = b;
b++;
2. a = ++b
Analogamente, é o atalho que os programadores Java usam para representar as seguintes linhas de código:
++b;
a = b;
'Tenho que decorar todos esses atalhos em Java, então? Maldito Java!'
Não. Você é programador, você não decora, você pensa.
Não foi à toa que coloquei o 'teste hacker', foi pra aguçar seu raciocínio.
Em ambos os casos, 'b' é incrementado.
A diferença é que 'a' recebe o valor de 'b' antes do incremento em um e depois do incremento em outro.
Como eu disse, em Java, você pode descobrir apenas olhando e pensando um pouco.
Veja:
No primeiro exemplo: a = b++
Qual a ordem, 'b' ou incremento?
Primeiro o 'b'. Depois o de incremento ocorre, '++'.
Ou seja, 'a' vai receber o valor de 'b' primeiro, então a=2
Só depois que 'b' vai ser incrementado e vai se tornar b=3.
No segundo exemplo: a = ++b
Qual a ordem: 'b' ou incremento?
Primeiro o incremento, '++', depois que aparece o 'b', então só depois acontece a atribuição..
Assim, primeiro ocorre o incremente, então b=3.
Só depois é que esse valor é atribuído para a.
Como diz a bíblia do programador Java: compilais e verás a verdade.
Eis o código:
public class Increment {
public static void main(String[] args) {
int a, b=1;
System.out.println("b = " + b);
System.out.println("a = b++ ");
a = b++;
System.out.println("Então: a = " + a);
System.out.println();
System.out.println("b = " + b);
System.out.println("a = ++b ");
a = ++b;
System.out.println("Então: a = " + a);
}
}
O laço while: o que é, como usar e calculando PA e PG com while
Nos últimos artigos aprendemos vários operadores e atalhos utilizados pelos programadores Java, como ++, +=, *=dentre outros.
Está na hora de colocá-los em ação e aprender um dos comandos mais importantes em qualquer linguagem de programação: os laços
Nesse artigo, explicaremos o que é e como usar o laço while.
Como usar o laço while em Java
While, do inglês 'enquanto' é um laço de repetição.
Cada ciclo de repetição é chamado de iteração.
Sua sintaxe é a seguinte:
while ( condição ){
códigos
}
Ou seja, enquanto (while) a condição for verdadeira, os códigos entre chaves serão repetidos.
Mas qual a vantagem de ter um código repetido? Isso não parece absurdo?
Bom, quando pensamos em repetido, pensamos em algo estático, mas não isso o que acontece.
É aí que entra os operadores de incremento, decremento, atribuição e outros.
Nas linhas de código, geralmente as coisas vão 'mudando' a condição e à cada iteração a condição é testada.
Se a condição retornar um valor lógico verdadeiro, o código entre chaves é executado.
Caso o valor retornado seja falso, o laço while é então terminado e o programa Java segue normalmente.
Vamos ver um exemplo simples, que mostra os números de 1 até 10.
Contando até 10 em Java, com o laço while
O programa é simples.
Definimos uma variável inteira, 'count'.
Enquanto essa variável for menor que 10, seu valor será imprimido e será incrementado.
Ou seja será, será impresso 1, 2, 3, ..., 9, 10...opa!
Quando chegar em 11, a condição dentro do laço não será mais verdadeira, e o laço terminará!
Teste:
public class contando {
public static void main(String[] args) {
int count=1;
while(count<=10){
System.out.println(count);
count++;
}
}
}
Fazendo um PA (progressão aritmética) com o laço while, em Java
O programa a seguir mostra os termos 'an' de uma PA, de termo inicial 'inicial' e razão 'razao', até um valor máximo 'valor_max'.
A diferença deste programa para o anterior é que os termos de uma PA crescem através da adição da razão ao termo anterior.
Em programação, poderíamos representar isso assim: an = an + razao
Porém, como vimos alguns operadores em Java, faremos isso: an += razao
Veja o resultado:
public class pa {
public static void main(String[] args) {
int inicial=1,
razao=3,
an=inicial,
valor_max=20;
System.out.printf("Elementos da PA, de valor inicial %d e razão %d, menores que %d\n", inicial, razao, valor_max );
while(an<=valor_max){
System.out.println(an);
an += razao;
}
}
}
Fazendo um PG (progressão geométrica) com o laço while, em Java
O programa a seguir mostra os termos 'gn' de uma PG, de termo inicial 'inicial' e quociente 'quociente', até um valor máximo 'valor_max'.
Os produtos de uma PG, progressão geométrica, crescem através do produto do termo anterior com o quociente.
Em programação, poderíamos representar isso assim: gn = gn * razao
Porém, como vimos alguns operadores em Java, faremos isso: gn *= razao
Veja o resultado:
public class pg {
public static void main(String[] args) {
int inicial=1,
quociente=2,
gn=inicial,
valor_max=32;
System.out.printf("Elementos da PG, de valor inicial %d e razão %d, menores que %d\n", inicial, quociente, valor_max );
while(gn<=valor_max){
System.out.println(gn);
gn *= quociente;
}
}
}
Loop infinito, controlando laços e loopings com o while
Usar laços, muitas vezes, pode ser uma tarefa perigosa.
Isso por conta de uma coisa chamada loop infinito.
Acontece sem querer, mas as vezes acontece de propósito...principalmente por pessoas más intencionadas.
Nesse artigo vamos estudar mais sobre esse tipo de loop, como acontecem, como fazer e como ter mais controle sobre laços.
Loop infinito em Java
No nosso estudo sobre o laço while em Java, vimos que ele só é executado se a condição que ele testa, a cada iteração, for verdadeira, e que dentro do código de execução, geralmente, ocorre uma alteração dessa condição para que uma hora ou outra, o laço pare.
Mas, e se o laço não parar? Ele vai rodar infinitamente?
Sim, vai.
Você é o programador. Você diz, o Java faz. Ele não vai te questionar.
E para que alguém iria querer um programa que não parasse?
E se você quiser montar um servidor que vai funcionar 24h/dia para sempre (até parar de funcionar)?
Ora, vai usar um loop sem fim, vai funcionar sempre.
Em muitos programas de pesquisas científicas, os computadores simplesmente não param de calcular. Se programa as tarefas, e deixa-se que elas façam todo o trabalho.
Controlar um laço e deixar o computador em um loop é uma forma de ter um controle maior sobre sua máquina.
Criando um loop infinito simples
public class chato {
public static void main(String[] args) {
while(true){
System.out.println("Loop infinito!");
}
}
}
Esse é bem simples de entender.
Qual a condição testada? 'true'? Sim, ela retorna sempre o valor lógico 'true', então o código do while será sempre executado.
Em outras palavras, você pode entender o código como: enquanto 'verdade' -> executar o código
Rode e veja como fica lento.
Para parar o looping, clique no botão vermelho, o sinal universal de 'stop', que aparece na figura:
O que esse laço while faz é simplesmente mostrar, infinitamente, uma mensagem na tela.
Mesmo uma coisa tão simples, é chata. E o pior, prejudicial ao computador.
Embora nossas máquinas atuais sejam bem potentes, ocorre um decréscimo considerável na memória RAM e gera uma lentidão no sistema.
Em sistemas antigos, poderia fazer um estrago.
Loops mais 'sofisticados' podem facilmente travar sua máquina, principalmente se você usar Windows.
Um vírus bem simples de ser criado é criar um loop que gere arquivos de texto, ou que fique adicionando linhas de string a esse arquivo de texto.
Em poucos minutos seu HD estará entupido.
Controlando os laços e looping
No exemplo simples de looping, a condição é sempre verdadeira. Aí não tem muito o que fazer. Ela foi definida assim e vai continuar assim.
Em Java, como em outras linguagens, não usamos esse operador booleano diretamente.
Ao invés disso, declaramos uma variável do tipo 'boolean' que vai definir se o laço deve continuar ou não.
E como isso vai ser decidido? Por você, durante a execução do programa.
No exemplo a seguir, criei a variável 'boolean' chamada 'continuar'. Inicialmente ela é 'true' para o while começar.
Se eu tivesse iniciado ela como 'false' o laço nem iniciaria e não existiria programa.
Declarei um tipo char 'opcao' que vai receber um caractere do usuário. Vai ser tipo uma senha. Só vai escapar do while se o usuário digitar essa senha, ou caractere.
Muito bem, o programa inicia e diz que para você sair da Matrix precisará digitar um caractere especial.
Como você é programador Java, está vendo que no teste condicional a senha é 'j', de java.
Se o usuário adivinhar a letra, o if retorna verdadeiro e altera o valor de 'continuar' para false, aí na próxima iteração o while não irá executar e o programa sai do loop.
Caso ele erre - o que é provável, visto que existem 26 letras e 10 números no teclado - a variável 'continuar', continua sendo true (pois nada foi alterado).
É o seu primeiro programa de 'segurança' em Java, pois exige uma senha. É possível transformar em executável ou inviabilizar que o usuário não veja essa senha, assim só o programador sabe a senha de acesso.
Você pode alterar de 'j' para a inicial de seu nome.
Quando estudarmos Strings, poderemos usar palavras ou frases, em vezes de caractares. Mas calma, já chegaremos lá. Por hora teste esse programe e entenda como funciona, usaremos bastante esse tipo de controle de fluxo em nossas aplicações Java:
import java.util.Scanner;
public class Matrix {
public static void main(String[] args) {
boolean continuar = true;
char opcao;
Scanner entrada = new Scanner(System.in);
while(continuar){
System.out.println("Você está na matrix;");
System.out.print("Digite o caractere especial para sair da matrix: ");
opcao = entrada.next().charAt(0);
if(opcao=='j'){
continuar=false;
System.out.println("Parabéns! Você conseguiu sair da Matrix!");
}
else{
System.out.println("Você não está autorizado a sair da Matrix. Estude Java.");
};
}
}
}
Laço FOR: tendo um maior controle sobre as repetições
Veremos agora o tipo de laço mais importante e usado em Java, que será sempre visto nos código de nosso curso: o laço for
Sua fama se deve ao poder que temos por conta dos detalhes que o laço for é capaz de receber, sendo possível ter um maior controle sobre as repetições.
Diferenças entre o while e o for:
para que serve o laço for em Java
Geralmente, o que é possível fazer usando o for, é possível fazer usando o o laço while em Java.
Então, naturalmente vem a pergunta: por que e para que serve, então, o laço for?
É o mesmo que perguntar 'por que usar a++' se podemos usar 'a=a+1'.
Simples: por questão de simplicidade e praticidade.
Nós, programadores Java, devemos procurar sempre a máxima eficiência. Fazer as coisas da maneira mais simples possível.
O uso do for se deve aos seguintes dois fatos, que você deve ter notado, caso tenha feito os exercícios sobre o laço while e caso tenha visto os exemplos do artigo while:
1. Geralmente existe um ponto de partida, um contador inicial para o laço while
2. Geralmente esse contador, ou outro, muda. De modo incrementativo ou decrementativo, até que a condição do while não seja mais satisfeita e o laço termine.
O que o laço for faz é automatizar isso.
Já que na grande maioria das vezes precisaremos desses dois fatores (inicial e de mudança), o laço for irá prover isso.
Como usar o laço for em Java
A sintaxe do laço for é a seguinte:
for(cond inicial;
teste condicional ;
apos iteraçao){
//código
}
O laço funciona da seguinte maneira:
O laço se inicia pela condição inicial. Geralmente se inicia o contador. Esse primeiro estágio SEMPRE acontece.
O segundo estágio é o teste da condição do laço, um simples teste condicional. Caso seja verdade, o código é executado.
Ao término de execução do código, ocorre o fator de mudança, que geralmente é um incremento ou decremento, sempre após cada iteração do looping,
Depois a condição é testada novamente. Caso retorne 'true', o código é executado.
Ao término de execução do código, sempre ocorre o fator de mudança...e assim sucessivamente.
Faremos 3 exemplos que mostram bem o exemplo do uso e flexibilidade laço for.
É importante que você aprenda bem, pois eles serão muito usados em nosso curso de Java.
Exemplo 1: Contando até 10, com laço for
public class for1 { public static void main(String[] args) { for(int count=1 ; count <= 10 ; count++){ System.out.println(count); } } }
Nesse exemplo, fiz questão de mostrar uma importante característica do laço for: a declaração dentro do for
Note que, na condição inicial do contador, foi declarado o inteiro 'count', que foi usado no laço.
Como funciona:
A primeira coisa que acontece é a condição inicial. No nosso caso, é criado um inteiro, 'count' e inicializado com o valor 1.
Depois, a condição é testada. Como ela é verdadeira, ele imprime o valor de 'count', que é 1.
Depois 'count' é incrementada e vira 2.
Depois é testada. Como continua ser menor que 10, ela é imprimida. Depois incrementada, testada, imprimida...ela é imprimida até ser 10, pois depois disso ela será incrementada e 'count' será 11, então a condição não será mais verdadeira e o laço for terminará.
Exemplo 2: contagem regressiva, usando o laço for
public class for2{ public static void main(String[] args) { for(int count=10 ; count >= 1; count--){ System.out.println(count); } } }
Esse exemplo serve para mostrar que podemos usar o decremento, não somente o incremento, dentro do laço for.
Como funciona:
A primeira coisa que acontece é a condição inicial. No nosso caso, é criado um inteiro, 'count' e inicializado com o valor 10.
Depois, a condição é testada. Como 'count' é maior ou igual a 1, é verdadeira e se imprime o valor de 'count', que é 10.
Após essa execução, 'count' se torna 9, e continua a ser maior ou igual a 1, e impressa...quando 'count' for 1, ela será impressa, por 1 é maior ou igual a 1.
Porém, ao ser decrementada, se tornará 0 e o laço for terminará.
Exemplo 3: contagem progressiva e regressiva no mesmo laço for
Outra característica do laço for, é que não precisamos usar só uma variável de controle ('count')
ou testar somente uma condição. O código Java para isso é:
public class for3 { public static void main(String[] args) {
for(int sobe=1, desce=10 ;
sobe<=10 && desce>=1;
sobe++, desce--){
System.out.printf("%d \t %d \n", sobe, desce);
}
}
}
Como funciona:
Declaramos duas variáveis, a 'sobe', que vai ser incrementada e impressa de 1 até 10,
e a variável 'desce' que será decrementada e impressa de 10 até 1.
Dentro do printf usamos o caractere '\t', que é o código ASCII para a tabulação, ou seja, o nosso famoso 'tab'.
Compile e rode esse simples código, verá como é maravilhoso ser programador Java e sua vida fará mais sentido.
O laço do ... while:
O laço que sempre acontece...pelo menos uma vez
Veremos nesse artigo mais um importante laço em Java, o laço do...while, que sempre executa o código do laço pelo menos uma vez, independente da condição do while ser true ou false.
Um dos maiores problemas do laço while é que ele só é executado se a condição contida nele for true.
Porém, muitas vezes, em nossos aplicativos Java, não podemos garantir que essa condição será sempre verdadeira ou queremos que o laço seja executado PELO MENOS UMA VEZ, e caso o usuário decida, o laço vai continuar ou não.
Então, o diferencial do laço do while é que ele sempre executa, sempre inicia o laço.
Como usar o laço DO WHILE em Java
A sintaxe do laço do .. while em Java, é a seguinte
do { //esse código será executado pelo menos uma vez }
while( condição );
Seu uso é bem simples e intuitivo, visto que o laço while nós já conhecemos.
O 'do' do inglês quer dizer 'faça'.
Ou seja, esse laço nos diz 'faça isso enquanto 'condição' for verdadeira'
Exemplos de uso, MENUS
Um dos exemplos de uso é para exibir o menu.
Ora, o menu tem que ser exibido pelo menos uma vez.
Se depois, você quiser sair, é opção sua. Mas que ele tem que ser exibido ao menos uma vez, ele tem.
E uma boa saída para fazer isso, em Java, é usar o laço do ... while.
No exemplo a seguir, o menu é mostrado.
Para parar de exibir o menu, basta digitar 0, que o boolean irá se tornar 'false' e o laço não mais se repetirá, pois a condição dentro do while será falsa.
Caso a entrada do usuário seja qualquer outro número que não 0, a variável boolean continua 'true', como foi declarada e o laço continuará a rodar (ou seja, o menu continua a ser exibido).
O trecho:
System.out.printf("\n\n\n\n\n\n");
É simplesmente para limpar a tela.
Teste para ver:
import java.util.Scanner; public class DoWhile { public static void main(String[] args) { boolean continuar=true; int opcao; Scanner entrada = new Scanner(System.in); do { System.out.println("\t\tMenu de opções do curso Java Progressivo:"); System.out.println("\t1. Ver o menu"); System.out.println("\t2. Ler o menu"); System.out.println("\t3. Repetir o menu"); System.out.println("\t4. Tudo de novo"); System.out.println("\t5. Não li, pode repetir?"); System.out.println("\t0. Sair"); System.out.print("\nInsira sua opção: "); opcao = entrada.nextInt(); if(opcao == 0){ continuar = false; System.out.println("Programa finalizado."); } else{ System.out.printf("\n\n\n\n\n\n"); } } while( continuar ); } }
Os comandos break e continue:
interrompendo e alterando fluxos e loopings
Nesta parte iremos ver os comandos break e continue, do Java,
que servem para nos propiciar um maior controle sobre o fluxo dos aplicativos, especialmente das iterações dos loopings.
Para que servem os comandos BREAK e CONTINUE em Java
Geralmente, em nossos programas de Java, iremos usar os laços while, for e do ...
while para procurar algum ítem, número ou checar alguma condição.
Por exemplo, imagine que você foi contratado para fazer um programa, em Java, claro, para um banco.
Em um momento do aplicativo, o cliente insere o número de sua conta e o programa vai buscar esse número no banco de dados do sistema, que tem milhões de clientes cadastrados. Ele vai fazer essa busca através de um looping.
Porém, imagine que o programa encontra os dados do cliente logo no começo, logo nas primeiras posições. E aí, vai checar todo o resto do banco de dados? Claro que não, isso seria perda de tempo.
É aí que entram os comandos break e continue. Esse seria um bom exemplo onde daríamos um 'break' no laço,
pois já encontramos o que queríamos.
O comando break
Break significa quebrar, parar, frear, interromper. E é isso que se faz.
Quando o Java encontra esse comando pela frente, ele interrompe o laço/estrutura de controle ATUAL, como o while, for, do ... while e o switch (que veremos no próximo artigo). Vamos mostrar um exemplo do uso do break através de um exemplo matemático.
Exemplo de uso:
Suponha que você é um cientista e quer saber se entre os números 1 e um milhão existe um número que é múltiplo de 17 e 19, ao mesmo tempo.
Ou seja, queremos saber se existe um número entre 1 e um milhão que deixa resto 0 na divisão por 17 e por 19.
Caso exista, o imprima. E só imprima o menor.
Poderíamos fazer um laço de 1 até 1 milhão, e testar isso através de um for.
Ok, é uma solução. O principal na vida profissional de um programador é saber resolver o problema.
Vamos usar um método chamado 'currentTimeMillis()', que retorna um tipo 'long' com o tempo atual do sistema em mili segundos.
Vamos declarar esse tipo no início e ao fim do laço, e depois subtrair esses valores, assim teremos o tempo de execução do programa.
Após imprimir o menor número, o boolean se torna falso, assim só o primeiro número é impresso.
Veja:
public class breakTest { public static void main(String[] args) { long i = System.currentTimeMillis(); boolean imprimir = true; for(int count=1 ; count <=1000000 ; count++){ if((count % 17 == 0) && (count % 19 == 0)) if(imprimir){ System.out.println(count); imprimir=false; } } System.out.println("Tempo de execução, em milisegundos: "+ (System.currentTimeMillis() -i)); } }
Em minha máquina deu:
26 mili segundos
Mas se você quiser ser um bom profissional, não basta só saber resolver. Tem que resolver e da melhor maneira possível.
Note que que o menor número achado é 323, e o laço vai até 1 milhão! Ou seja, ele percorre de 324 até 1 milhão à toa, pois já achou o número desejado!
Ora, se ele já achou o número, 323, vamos fazer com que o laço pare, usando o comando break:
public class break { public static void main(String[] args) { long i = System.currentTimeMillis(); for(int count=1 ; count <=1000000 ; count++){ if((count % 17 == 0) && (count % 19 == 0)){ System.out.println(count); break; } } System.out.println("Tempo de execução, em milisegundos: "+ (System.currentTimeMillis() -i)); } }
8 mili segundos
Menos de um terço do tempo!
Você pode pensar "Ah, de 26 mili segundos para 8 mili segundos a diferença é insignificante".
Concordo com você.
Porém, no futuro você fará aplicações maiores e que levam mais tempo, e esses pequenos detalhes farão a diferença.
Por exemplo, existem métodos que, durante um game são facilmente chamados milhões de vezes.
Multiplique essa diferença 'insignificante' de alguns mili segundos por milhões de vezes e terá um belo de um 'lag', ou lentidão. Isso se chama otimizar: fazer da maneira mais eficiente possível.
Daremos bastante enfoque para as otimizações em nosso curso de Java, como verá no exemplo a seguir.
O comando continue
Como o nome diz, ele 'continua' o laço. O comando break interrompe o laço, já o continue interrompe somente a iteração atual.
Não basta porém ser um bom profissional. Você está no curso Java Progressivo, você tem que ser um dos melhores! Nós vamos otimizar o código passado. Note uma coisa, queremos achar um número que seja múltiplo de 17 e 19. Ora, tal número não pode ser par, pois 17 e 19 são ímpares. Para cada número 'count', estamos fazendo dois testes: se é múltiplo de 17 e se é múltiplo de 19. Vamos otimizar da seguinte maneira, vamos fazer um só teste: vamos checar se é múltiplo de 2. Caso seja, nem adianta testar se é múltiplo de 17 e 19, podemos pular essa iteração. E como pulamos uma iteração? Com o comando continue!
Veja como fica:
public class continueTest { public static void main(String[] args) { long i = System.currentTimeMillis(); for(int count=1 ; count <=1000000 ; count++){ if(count % 2 == 0){ continue; } if((count % 17 == 0) && (count % 19 == 0)){ System.out.println(count); break; } } System.out.println("Tempo de execução, em milisegundos: "+ (System.currentTimeMillis() -i)); } }
O comando switch: fazendo escolhas em Java
No artigo sobre o laço do ... while mostramos como criar um menu simples.
Porém, o Java possui um recurso específico para esse propósito, que nos permite optar por algo, dependendo do que tenhamos digitado, é o comando switch.
O comando SWITCH em Java
Colocamos várias opções e vários comandos dentro do comando switch, todas as possibilidades de nosso aplicativo ou todas as opções ou rumos que nossos programas possam tomar. O switch vai funcionar como um interruptor, pois dependendo da entrada que você der a ele, ele vai acionar somente certo(s) comando(s) dentre os que você disponibilizou. É como se você criasse um menu, ou cardápio, e com o switch você escolhesse o que vai querer.
Declaração e Sintaxe do comando switch
Em Java, usamos e declaramos o comando switch da seguinte maneira:
switch( opção ) {
case opção1: comandos caso a opção 1 tenha sido escolhida break;
case opção2: comandos caso a opção 2 tenha sido escolhida break;
case opção3: comandos caso a opção 3 tenha sido escolhida break;
default: comandos caso nenhuma das opções anteriores tenha sido escolhida
}
A variável 'opção' geralmente é um inteiro ou caractere (também pode ser byte ou short), que o usuário digita através da classe Scanner.
Se 'opção' receber 'opção1' como entrada, são os códigos contido na 'case opção1' que serão executados.
Se 'opção' receber 'opção2' como entrada, são os códigos contido na 'case opção2' que serão executados.
Se 'opção' receber 'opção3' como entrada, são os códigos contido na 'case opção3' que serão executados.
Se 'opção' receber qualquer outra coisa que não seja 'opção1', 'opção2' ou 'opção3', são os códigos contido em 'default' que serão executados.
Exemplo de uso do comando SWITCH em Java:
Vamos criar uma calculadora que faz as operações básicas usando o comando switch.
É um aplicativo Java simples que recebe 3 dados: dois números e um caractere.
Esse caractere poderá ser '+', '-', '*' ou '/' , e representarão a operação matemática que você deseja realizar entre os números.
Vejamos:
import java.util.Scanner; public class switchTest { public static void main(String[] args) { float numero1, numero2; char operacao; Scanner entrada = new Scanner(System.in); System.out.print("Escolha sua operação [+ - * / ]: "); operacao = entrada.nextLine().charAt(0); System.out.print("Entre com o primeiro número: "); numero1 = entrada.nextFloat(); System.out.print("Entre com o segundo número: "); numero2 = entrada.nextFloat(); System.out.println(); switch( operacao ) { case '+': System.out.printf("%.2f + %.2f = %.2f", numero1, numero2, numero1 + numero2); break; case '-': System.out.printf("%.2f - %.2f = %.2f", numero1, numero2, numero1 - numero2); break; case '*': System.out.printf("%.2f * %.2f = %.2f", numero1, numero2, numero1 * numero2); break; case '/': System.out.printf("%.2f / %.2f = %.2f", numero1, numero2, numero1 / numero2); break; default: System.out.printf("Você digitou uma operação inválida."); } } }
Caso a 'opção' seja um char, coloque entre aspas simples '', caso seja string coloque entre aspas duplas "" e caso seja um número, não é necessário colocar nenhum tipo de aspas.
O real funcionamento do comando switch: sem o comando break
Omiti, propositalmente, uma informação importante.
Só é realizado um 'case' de cada vez por conta do 'break' contido em cada comando dentro dos 'case'. Na verdade, o switch seleciona o 'case' através da 'opção' e faz com que todos os 'case' a partir daquele sejam executados. O exemplo a seguir ilustra o real funcionamento do comando switch em Java, experimente digitar a vogal 'a':
import java.util.Scanner; public class switchTest2 { public static void main(String[] args) { char vogal; Scanner entrada = new Scanner(System.in); System.out.print("Digite uma vogal minúscula: "); vogal = entrada.nextLine().charAt(0); switch( vogal ) { case 'a': System.out.println("Você está no case da vogal 'a'"); case 'e': System.out.println("Você está no case da vogal 'e'"); case 'i': System.out.println("Você está no case da vogal 'i'"); case 'o': System.out.println("Você está no case da vogal 'o'"); case 'u': System.out.println("Você está no case da vogal 'u'"); default: System.out.println("Você não digitou uma vogal minúscula"); } } }
Exemplo da utilidade do comando swich sem o break
Á priori parece ser estranho essa propriedade do comando switch 'rodar' rodos os cases. Porém, isso é uma mão na roda e se bem utilizado, só vai nos ajudar. E caso não precise, simplesmente coloque um break. Vamos pegar o exemplo passado e deixá-lo mais robusto, à prova de usuários que tentarão digitar as vogais maiúsculas. É uma prática bem comum em Java, é essencial que aprenda:
import java.util.Scanner; public class switchTest3 { public static void main(String[] args) { char vogal; Scanner entrada = new Scanner(System.in); System.out.print("Digite uma vogal: "); vogal = entrada.nextLine().charAt(0); switch( vogal ) { case 'a': case 'A': System.out.println("Você digitou 'a' ou 'A' "); break; case 'e': case 'E': System.out.println("Você digitou 'e' ou 'E' "); break; case 'i': case 'I': System.out.println("Você digitou 'i' ou 'I' "); break; case 'o': case 'O': System.out.println("Você digitou 'o' ou 'O' "); break; case 'u': case 'U': System.out.println("Você digitou 'u' ou 'U' "); break; default: System.out.println("Você não digitou uma vogal !"); } } }
Note que estamos acumulando os case minúsculos e maiúsculos de cada vogal para gerarem o mesmo comando. Essa é a prática comum. No caso, o comando é print.
Mais um exemplo útil do comando switch sem o break
Suponha que você atrasou uma conta. A cada mês que você deixa de pagar, será cobrado 1% de juros no valor inicial. Ou seja, se você atrasar um mês, irá pagar 1%. Se atrasar 3 meses, irá pagar 3% etc. Vamos supor que você pode atrasar, no máximo, 5 meses. O programa pede, como entrada, dois valores:
- um float: com o valor de sua dívida inicial (valor_i)
- um inteiro: de 0 até 5, que são os meses de atraso.
Nosso programa ficaria assim:
import java.util.Scanner; public class switchTest4 { public static void main(String[] args) { float valor_i, valor_f, juros=0; int meses; Scanner entrada = new Scanner(System.in); System.out.print("Qual o valor inicial da dívida: "); valor_i = entrada.nextFloat(); System.out.print("Você vai atrasar quantos meses [0-5]?: "); meses = entrada.nextInt(); switch( meses ) { case 5: juros++; case 4: juros++; case 3: juros++; case 2: juros++; case 1: juros++; break; default: System.out.println("Você não digitou um valor válido de meses"); } System.out.println("Juros: "+juros+"%"); valor_f=( (1 + (juros/100))*valor_i); System.out.printf("Valor final da dívida: R$ %.2f", valor_f); } }
Se cair no case 5, vai contar todos os case, até o break, somando juros=5
Se cair no case 4, vai contar todos os case, até o break, somando juros=4
Assim, analogamente, para case 3, 2 e case 1.
Ou seja, nós utilizamos o fato dos case irem se acumulando.
