Escolar Documentos
Profissional Documentos
Cultura Documentos
Apostila de Algoritmos I
Ilustrações
Pág.: 2/94
Prof. Daniel Oliveira
Quadros
Pág.: 3/94
Prof. Daniel Oliveira
Exemplos
Pág.: 5/94
Prof. Daniel Oliveira
Sumário
Ilustrações ........................................................................................................................................................... 1
Quadros ............................................................................................................................................................... 3
Exemplos ............................................................................................................................................................. 4
Introdução ............................................................................................................................................................... 8
Algoritmos Computacionais ................................................................................................................................ 9
Fluxogramas ...................................................................................................................................................... 12
Exercícios....................................................................................................................................................... 20
Trabalhando com expressões ........................................................................................................................... 22
Modularização de expressões e precedência de operadores....................................................................... 25
Estrutura de dados ............................................................................................................................................ 25
Constantes ........................................................................................................................................................ 26
Variáveis ............................................................................................................................................................ 26
Tipos de dados .............................................................................................................................................. 27
Exercícios........................................................................................................................................................... 28
Java........................................................................................................................................................................ 29
Ambiente de desenvolvimento ......................................................................................................................... 31
Obtendo o Eclipse e instalando .................................................................................................................... 32
Perspectiva .................................................................................................................................................... 33
Workspace .................................................................................................................................................... 34
Criando um projeto ....................................................................................................................................... 35
Variáveis ............................................................................................................................................................ 41
Tipos numéricos ............................................................................................................................................ 45
Compatibilidade entre tipos ......................................................................................................................... 49
Interagindo com usuários ................................................................................................................................. 53
Exercícios........................................................................................................................................................... 57
Estrutura condicional ........................................................................................................................................ 58
A instrução IF................................................................................................................................................. 58
Comparação de strings.................................................................................................................................. 59
A instrução Else ............................................................................................................................................. 60
Aninhando a instrução if/else ....................................................................................................................... 61
Usando operadores AND e OR ...................................................................................................................... 61
Declaração switch/case................................................................................................................................. 64
Exercícios....................................................................................................................................................... 67
Estruturas de repetição ..................................................................................................................................... 70
Pág.: 6/94
Prof. Daniel Oliveira
Pág.: 7/94
Prof. Daniel Oliveira
Introdução
Um algoritmo é uma sequência de passos logicamente organizados que realizam uma tarefa. Na realidade, em
vários momentos no nosso dia a dia utilizamos algoritmos para realização de tarefas rotineiras, por exemplo: a
troca de uma lâmpada, a troca de um pneu, preparação de um café e etc.
De forma geral um algoritmo é um procedimento computacional que com um conjunto de dados de entrada
realiza uma tarefa, resultando em um conjunto de dados de saída. Ou seja, um conjunto de passos
computacionais que recebe uma entrada e gera uma saída.
No nosso dia a dia, utilizamos o princípio de algoritmos com muita frequência. Como por exemplo: a receita de
um bolo, a troca de um pneu furado, o uso de um determinado dispositivo ou aparelho, e, assim por diante.
Basicamente todos os procedimentos que são constituídos por um conjunto de regras e operações muito bem
definidas e ordenadas. Sendo realizadas em um número finito de etapas, constitui algoritmos.
Ingredientes:
2 cenouras grandes
1 xícara de óleo
2 xícaras de açúcar
4 ovos
2 xícaras de farinha de trigo
1 colher de sopa de fermento em pó
1 lata de leite condensado
Pág.: 8/94
Prof. Daniel Oliveira
4 colheres de chocolate em pó
2 colheres de sopa de margarina
Modo de Preparo:
Algoritmos Computacionais
Um programa de computador nada mais é do que um algoritmo escrito em alguma linguagem de programação
que passa por um processo de compilação ou interpretação que traduz os comandos da linguagem em
instruções que o computador executa.
Todos os computadores e dispositivos computacionais tem uma estrutura bem parecida. Em, sua maioria são
constituídos por:
Estes componentes citados são conectados pelo o que nós denominados de barramento.
A UCP ou unidade controladora é a parte mais importante do computador. Ela executa todos os cálculos,
execução de tarefas e processamento de dados. Qualquer processador executa um conjunto específico de
instruções denominado de linguagem de máquina.
Todo processador tem um conjunto de instruções que ele pode realizar. Estas instruções são denominadas de
código de máquina, que são representados por uma sequência de bits (zeros e uns). A quantidade desses bits
é limitada ao tamanho do registrador principal do processador (8 bits, 16, 32 ou 64).
Pág.: 9/94
Prof. Daniel Oliveira
Estas instruções são tarefas muito simples, como por exemplo, transferir uma informação de uma posição da
memória para o processador, somar dois números e etc. Normalmente, este conjunto de instruções binárias
(1s e 0s) é representado em um formato hexadecimal – ver Figura 3.
Normalmente trabalha-se com uma linguagem denominada de Assembly ou linguagem de montagem. Que é
na realidade uma representação das instruções de máquinas, mas, em um formato que seja humanamente
legível (Figura 4)
Outra parte importante dessa arquitetura é a memória. É na memória que os dados que são armazenados, o
processador acessa um posição de memória, copia o conteúdo dela para um de seus registradores internos,
realiza as ações e operações necessárias e retorna (se for o caso) a informação alterada para memória.
A memória RAM (Random Access Memory – Memória de acesso aleatório), é “loteada” locais que são
endereçados através de um número inteiro. Quanto mais memória a máquina possuir, maior será a quantidade
desses endereços e consequentemente maior será o valor do endereço. Na Figura 4, temos na primeira coluna
da esquerda o endereço de memória. Como vimos anteriormente os processadores tem o que chamamos de
registradores. Estes registradores irão conter o endereço de memória de uma determinada informação, assim
sendo, o tipo de processador influi em quanto de memória pode ser endereçado pelo mesmo.
A quantidade de memória endereçável por um processador pode ser calculada através da seguinte fórmula:
Pág.: 10/94
Prof. Daniel Oliveira
Por exemplo um processador de 32 bits: 232 = 4.294.967.296 bytes ou 4Gbs. Mesmo que a máquina apresente
mais memória RAM, o processador simplesmente não conseguirá endereçar todos os endereços disponíveis. Já
um processador de 64bits consegue endereçar até 16 Terabytes.
Além da memória temos os dispositivos de entrada e saída de dados, que podem ser:
Monitor
Teclado
Mouse
Impressoras
Ou, qualquer dispositivo que possa receber dados e exibir dados. Para nós, seres humanos, temos a tendência
de imaginar que os computadores se resumem a apenas aos dispositivos de entrada e saída, pois, á através
dos mesmos que interagimos com os computadores.
Nos últimos anos estes dispositivos têm evoluído e novas formas desse tipo de dispositivo têm surgido. Por
exemplo, até alguns anos atrás os monitores eram considerados dispositivos apenas de saída, hoje, com o uso
de telas de touch isto mudou.
Assim, sendo, um programa de computador nada mais é do que a codificação de um algoritmo que contém
instruções para que um computador realize alguma tarefa. Evidentemente, não escrevemos os programas em
linguagem de máquina ou instruções de máquina. Utilizamos para isto linguagens, denominadas de alto nível.
As instruções escritas nessas linguagens são chamadas de código fonte. Este código
fonte passa por um processo de tradução para linguagem de máquina, chamado de
compilação.
Após, o código fonte ter sido validado, é então, transformado no que se chama em
código intermediário. Este código intermediário é quase a linguagem de máquina, mas,
ainda faltam alguns ajustes. Este código então é otimizado e então transformado para
em código de máquina dando origem ao programa executável ou biblioteca.
Um ponto que deve ser realçado é que o processo de compilação e criação de código
sempre esta ligado a uma determinada arquitetura. Ou seja, é necessário a existência
de compiladores específicos para cada tipo de arquitetura.
Figura 5 - Processo de
compilação
Pág.: 11/94
Prof. Daniel Oliveira
Fluxogramas
Além das linguagens de programação (nosso principal foco), existe outra forma de representação dos
algoritmos (uma forma mais visual e mais simples de entendimento para iniciantes ou leigos), que são os
fluxogramas.
Os Fluxogramas ou Diagramas de Fluxo são uma representação gráfica que utilizam formas geométricas
padronizadas ligadas por setas de fluxo, para indicar as diversas ações (instruções) e decisões que devem ser
seguidas para resolver o problema em questão.
Na Figura 6, temos um exemplo de fluxograma para o cálculo de uma raiz quadrada. Como se pode notar
utilizam-se figuras para indicar os passos do algoritmo a ser executado no fluxo. Os símbolos utilizados na
construção de um fluxograma podem ser visto no Quadro 1, aonde é apresentado apenas os principais.
Atribuição,
Operação,
Processamento
Decisão
Pág.: 12/94
Prof. Daniel Oliveira
Imprimir / Saída
Esta forma de representação dos algoritmos é de grande utilidade para exemplificar e demonstrar os passos
necessários para a construção dos nossos algoritmos. Por exemplo, como ficaria um fluxograma para cálculo
da área de um retângulo?
Largura e
Inicio Largura * Altura Fim
Altura Àrea
Outro exemplo seria como determinar se uma pessoa é maior ou não de idade?
Inicio Idade
Fim
Em muitas situações queremos guardar o resultado de alguma operação para ser utilizado ou testado mais a
frente no fluxograma. Para isto utilizamos o que nós chamamos de variáveis (vamos abordar este conceito
mais a frente). Dentro da representação dos fluxogramas utilizamos uma seta () para indicar o
armazenamento da informação na variável, por exemplo:
Pág.: 13/94
Prof. Daniel Oliveira
Inicio
N1 Nota N1
N2 Nota N2 M (N1+N2)/2
M >= 5
Sim
Reprovado
Aprovado
Fim
De forma geral, os fluxogramas são excelentes ferramentas para avaliação do fluxo de informação de um
sistema. Para se desenvolver um diagrama correto, devemos levar como procedimentos:
1) Os diagramas devem feitos e quebrados em níveis. Inicia-se com uma ideia geral, e, então aumenta-se
o detalhamento
2) Os fluxogramas devem ser desenvolvidos sempre, que possível, de cima para baixo e da esquerda para
a direita
3) É incorreto e proibido ocorrência de cruzamento das linhas de fluxo
Pág.: 14/94
Prof. Daniel Oliveira
O fluxograma da imagem anterior está em nível muito elevado. Não é possível entender pontos como: quantas
notas irão compor a média, qual a fórmula de cálculo da média e como se determinar a aprovação? Então, se
faz necessário, aumentar o nosso detalhamento.
Inicio
Obter N1
Obter N2
Calcular média e
determinar
aprovação
Fim
Pág.: 15/94
Prof. Daniel Oliveira
M (N1 + N2) /2
Determinar
aprovação
Fim
M (N1 +
N2) /2
Aprovado Reprovado
Fim
Um diagrama de fluxo aonde os elementos são executados de cima para baixo (top-down), sendo que cada
elemento tem apenas um único predecessor e um único sucessor é conhecido como digrama linear - Figura 12.
Já digramas construídos para boa parte dos sistemas de processamento de dados, temos o que chamamos de
lógica estruturada. Nesse tipo de lógico temos elementos que simbolizam a sequência de ações, condições de
execução e repetição ou laço.
Na Figura 13, vemos o exemplo de representação gráfica de uma sequência. Nela temos a ordem em que
processos devem ser executados, mostrando assim a hierarquia em que as ações deverão ser realizadas.
Já na Figura 14, vemos a representação de estrutura condicionais. Aonde dependendo dos testes lógicos
realizados (verdadeiro ou falso) o fluxo de execução do fluxograma é desviado.
Pág.: 17/94
Prof. Daniel Oliveira
Além das estruturas condicionais, temos as chamadas estruturas condicionais. Nelas um conjunto de ações são
repetidas até que alguma condição impeça ou pare a repetição, ver abaixo.
Em situações aonde temos vários testes condicionais aninhados (como por exemplo a seleção de uma opção
em um menu), podemos utilizar uma estrutura denominada de case (ver abaixo)
Pág.: 18/94
Prof. Daniel Oliveira
Evidentemente não podemos descrever todo um sistema em seus detalhes, ou até mesmo uma rotina, em
apenas um único diagrama. A técnica deve ser utilizada é a chamada: Modularização. Para isto precisamos
realizar as seguintes etapas:
Se, possível, a modularização deve ser desenvolvida em diferentes níveis. Partimos de um visão geral do
problema identificando os sistemas que irão compor a solução, para cada sistema quais os programas que o
irão compor e para cada programa quais serão seus módulos.
Pág.: 19/94
Prof. Daniel Oliveira
Exercícios
2) Em uma escola, a média final é dada pela média aritmética de três notas. E a mesma tem o seguinte
esquema de avaliação:
Desenvolva um algoritmo que a partir da entrada das três notas mostre a situação do aluno. No caso do aluno
em recuperação e prova final, mostre também quanto o aluno irá precisar para passar. No caso da
recuperação a nota necessária para passar é dada por 10 – Média + 2 e na prova final é dado por 10 – Média.
4) Em uma loja e CD´s existem apenas quatro tipos de preços que estão associados a cores. Assim os CD´s
que ficam na loja não são marcados por preços e sim por cores. Desenvolva o algoritmo que a partir a
entrada da cor o software mostre o preço. A loja está atualmente com a seguinte tabela de preços
Cor Preço
Verde 10,00
Azul 15,00
Amarelo 30,00
Vermelho 40,00
5) Desenvolva um algoritmo capaz e encontrar o menor dentre 3 números inteiros quaisquer dados pelo
teclado.
6) Desenvolva um algoritmo capaz de verificar se uns números inteiros, dados como entrada, é par ou
ímpar.
contrário zerar tal variável. A hora excedente de trabalho vale R$ 20,00. No final do processamento
imprimir o salário total e o salário excedente.
8) A secretária de Meio Ambiente que controla o índice de poluição mantém 3 grupos que são altamente
poluentes do meio ambiente. O índice de poluição aceitável varia de 0,05 até 0,25. Se o índice sobe
para 0,3 as indústrias do 1º grupo são intimadas a suspenderem suas atividades, se o índice crescer
para 0,4 as indústrias do 1º e 2º grupo são intimadas a suspenderem suas atividades, se o índice
atingir 0,5 todos os grupos devem ser notificados a paralisarem suas atividades. Faça um algoritmo
que leia o índice de poluição medido e emita a notificação adequada aos diferentes grupos de
empresas.
Pág.: 21/94
Prof. Daniel Oliveira
Para a construção de Algoritmos todas as expressões aritméticas devem ser linearizadas, ou seja, colocadas
em linhas. É importante também ressalvar o uso dos operadores correspondentes da aritmética tradicional
para a computacional.
Exemplo:
2
3 5 3 1
(2/3+(5-3))+1=
Tradicional Computacional
Cada linguagem de programação tem um conjunto de operadores para a construção de expressões aritméticas
ou relacionais. As expressões relacionais são aquelas que o resultado é um valor lógico (verdadeiro ou falso –
true ou false).
Por exemplo, a expressão 1+1 é uma expressão aritmética que resultará em um valor. Já a expressão 1 > 2 (o
valor 1 é maior do que 2?) é uma expressão relacional, aonde são realizadas comparações.
Nos quadros acima temos as representação dos operadores aritméticos e relacionais utilizados nas principais
linguagens de programação. Vale a ressalva que não serão os mesmos para todas as linguagens, existem
variações.
Além desses operadores ainda existem os operadores lógicos, que atuam apenas sobre os valores lógicos. Eles
são relacionados no Quadro 4.
Pág.: 22/94
Prof. Daniel Oliveira
Disjunção OU (or) BASTA QUE UMA PARTE SEJA VERDADEIRA PARA RETORNAR VERDADEIRO.
Disjunção Exclusiva XOU RETORNAR FALSO SE AMBOS OS LADOS FOREM IGUAIS E VERDADEIRO CASO
(XOR) CONTRÁRIO
NÃO (not) INVERTE O ESTADO, DE VERDADEIRO PASSA PARA FALSO E VICE-VERSA.
Os operadores lógicos atuam sobre os valores lógicos da seguinte forma (Quadro 5):
V V V V F F
V F F V F V
F V F V V V
F F F F V F
Pág.: 23/94
Prof. Daniel Oliveira
Pág.: 24/94
Prof. Daniel Oliveira
Além do fato do uso dos parênteses deve ser levada em conta a precedência dos operadores na resolução das
expressões aritméticas. A lista abaixo relaciona os operadores de maior precedência para os de menor
precedência:
Parênteses e Funções
Operadores Aritméticos na seguinte ordem:
Potenciação: ^;
Multiplicação e Divisão: *, /;
Soma e Subtração: +, -;
Operadores Relacionais: = ,<> ,> ,< ,>= ,<=;
Operadores Lógicos na seguinte ordem: NAO, E, OU.
Estrutura de dados
As estruturas de dados e algoritmos são muito ligados. Não se pode estudar estruturas de dados sem
considerar os algoritmos associados a elas, assim como a escolha dos algoritmos em geral depende da
representação e da estrutura dos dados (ZIVIANI,1999).
Pág.: 25/94
Prof. Daniel Oliveira
De uma maneira bem informal podemos definir um programa de computador ou um software como sendo a
união entre um algoritmo e uma estrutura de dados. Na solução de problemas através de algoritmos devemos
também determinar qual a estrutura de dados será utilizada.
Constantes
As constantes são valores (ou informações, dados) que não variam com o tempo. São valores fixos (não
variáveis). Como exemplo, são os números, letras, palavra e etc.
Variáveis
O conceito de variável é muito importante para a elaboração de algoritmos e os programas. Uma variável é um
espaço de memória do computador que é reservado para armazenar as informações ou dados utilizado pelo
programa de computador.
Como o próprio nome mostra, as variáveis tem seu valor não constante, ou seja, variável no tempo. Toda
variável tem um nome ou identificador, para facilitar (para nós humanos) a referência à mesma. Internamente
os computadores acessam a memória através de endereços numéricos, as linguagens de programação
simplificam esse processo associando aos endereços de memória nomes ou identificadores fornecidos pelos
programadores.
Podemos caracterizar uma variável como sendo uma caixa com conteúdo. No lado de fora dessa caixa temos
uma etiqueta com um identificador e o conteúdo da caixa é o valor dessa variável (que poder ser alterado
diversas vezes).
Pág.: 26/94
Prof. Daniel Oliveira
Cada linguagem de programação tem suas próprias regras para a criação de identificadores.
Tipos de dados
Em linguagens de programação os dados têm certas características e uma das mais importantes é o seu tipo.
Números, textos, datas e outros tem uma forma peculiar de ser armazenado e representado pelos
computadores. O tipo do dado define a forma a armazenamento e representação da informação.
Os tipos de dados podem ser simples, ou seja, o valor é indivisível. Por exemplo, um número inteiro é um tipo
simples, um valor de tipo lógico (verdadeiro ou falso), uma letra (caractere), são tipos simples.
Os tipos estruturados em geral definem uma coleção de valores simples, ou um agregado de valores de tipos
diferentes (ZIVIANI,1999). Estes tipos são os vetores, matrizes e outros.
Os tipos de dados determina o conjunto de valores possíveis que uma variável ou expressão pode assumir. E,
também, quais operações poderão ser realizadas.
Atribuição
Atribuição é a ação de armazenar ou passar valor para um variável. Quando realizamos uma ação de atribuição
estamos “colocando” a informação no endereço de memória referenciado. Como foi visto no conteúdo de
fluxogramas utilizamos uma seta () para indicar esta ação. Mas, como iremos ver mais a frente existem
outros símbolos para indicar a atribuição.
Na ação de atribuição é importante saber se a informação que queremos armazenar na variável é compatível
com a mesma. Nesse momento o tipo de dado é analisado e caso não seja possível a ação não poderá ser
realizada. Ainda, é possível o chamamos de casting, ou, mudança do tipo de dado da informação para um tipo
de dado compatível.
Uma observação importante a ser feita em relação a atribuições é que na parte esquerda (a que vai "receber"
algo) não pode haver nada além da variável, ou seja, é só variável que "recebe" algum conteúdo, não é
possível ter um cálculo por exemplo, ou uma constante, recebendo alguma coisa. Por exemplo:
Ex.: nota1 + nota2 valor – Esta instrução está incorreta e não poderá ser realizada
Pág.: 27/94
Prof. Daniel Oliveira
Exercícios
b(3 x )
a. ae 2
c
2 x 2 (3 x) ( x 1) x 1
b.
2 x2
22 k
45
c. 2h 4h(3 h)
3x
2b 4a 2 2 f 3
d.
3 2a
1
6 x (2 y ) 3
e.
39
2
2x u 3
f.
a bc
2- Escreva as expressões em formato tradicional
a. a+b+(34+exp(e,9))/u-89^(1/2)=
b. 23+5/((7*a)/47)^(2/x)=
c. (12*x)/(36-9^x)^2=
3- Resolva as expressões lógicas
a. não (2^3 < √16 ou 15\2 < 10)
b. (6<8) ou (3>7) =
c. Não (2<3) =
d. (5>=6) ou (6<7) ou não (a+5-6=8) {sabendo-se que A=5}
e. (34>9 e 5+u = 34) ou (5=15/3 e 8>12) {sabendo-se que u=29}
f. 10%4 < 16%3
g. 2+8%7 >= 6- (8^(2/3))^(1/2)
h. 15\7 >= 27 % 5
Pág.: 28/94
Prof. Daniel Oliveira
Java
É uma linguagem de programação desenvolvida pela Sun Microsystem, que posteriormente foi comprada pela
Oracle. A sintaxe do Java é baseada no C/C++, mas, de forma diferente é uma linguagem altamente portável
entre plataformas.
A partir de 1991 que o Java passou a ser “visto” pelo público em geral quando a Netscape anunciou que seu
navegador iria suportar o Java para a execução de códigos (applets). Colocando assim, a internet em outro
patamar com informações dinâmicas e páginas com recursos que ainda não se havia visto até então.
Java hoje em dia está presente em vários dispositivos e soluções. Desde soluções empresariais até tablets e
celulares. Abaixo segue uma lista das principais tecnologias Java (Oracle,2011):
Java SE – Java Standard Edition, versão para a disponibilização de soluções para desktops e servidores.
Java EE - Java Enterprise Edition, conjunto de soluções para desenvolvimento corporativo.
Java ME – Java for Micro Edition, ambiente para construção de soluções para dispositivos móveis e embarcados
em equipamentos como: celulares, tablets, PDAs, consoles de gerenciamento de TVs (receptores de TV digital) e
impressoras.
JavaFX – nova tecnologia para desenvolvimento de aplicações RIA
Java Card – Tecnologia java utilização de aplicações que irão ser executadas em smartcards e outros
equipamentos com capacidade de memoria e processamento reduzidos.
Java TV – Plataforma Java ME, otimizada para ser executada em TVs e consoles de gerenciamento de TVs.
Mas, o grande objetivo do desenvolvimento do Java foi à portabilidade. Ou seja, o mesmo código sendo
executado em diferentes sistemas operacionais, sem a necessidade de rescrita ou recompilação. Mas como
isto é possível?
Máquina imaginária
Emulada por software em máquina real
Código armazenado em arquivos *.class
Interpreta e executa programas Java
O processo de “criação” de códigos executáveis em java passa por duas etapas: uma primeira etapa aonde o
código escrito Java é traduzido (compilado) para uma linguagem intermediária (bytecode). A máquina virtual
Java é responsável pela execução dessa linguagem intermediária, para cada sistema operacional existe uma
máquina virtual própria que realizar a segunda etapa do processo de execução do código, que é a tradução do
bytecode para a linguagem de máquina do ambiente hospedeiro. Ver Figura 19.
Pág.: 29/94
Prof. Daniel Oliveira
Compilador
JDK
JVM
Execução do
Interpreta o
código
Byte Code
Na Figura 20, temos uma visão conceitual do nível de abstração do código em Java em relação ao hardware
aonde esse mesmo código será executado. Quando por exemplo, queremos exibir uma mensagem de texto no
console, simplesmente iremos chamar o comando apropriado no Java. A JVM traduz que este comando para
uma ou mais instruções para o sistema operacional hospedeiro (lembre-se vai existir uma JVM para cada
sistema operacional que irá executar as aplicações Java), e daí para frente é com SO.
JVM
Sistema
Operacional
BIOS
Hardware
O uso de uma máquina virtual foi sem dúvida nenhuma um grande avanço para a criação de soluções
portáveis e multi-plataforma.
A linguagem Java é 100% orientada a objetos, mas, nesse texto não iremos levar isto em consideração e
iremos nos ater apenas a uma programação estruturada (não orientada a objetos).
Pág.: 30/94
Prof. Daniel Oliveira
Ambiente de desenvolvimento:
Ambiente de produção:
Bem, existem dois tipos de distribuição do Java: JDK e o JRE. O primeiro JDK é voltado para instalação de
máquinas aonde iremos desenvolver soluções Java, pois, acompanha várias ferramentas e documentação
necessária para isto. Já o JRE é indicado para ser instalado em ambientes aonde iremos apenas executar as
soluções construídas. Evidentemente, esta é uma explicação bem simplificada, os puristas que me perdoem,
mas, inicialmente é o suficiente.
Ambiente de desenvolvimento
Vamos utilizar uma IDE de livre distribuição que o Eclipse (http://www.eclipse.org/). O eclipse é uma
framework para integrar diferentes tipos de aplicações. Uma das linguagens que se pode desenvolver é o Java
através do JDT (Java Development Tooling).
O Eclipse trabalhar com plug-ins, facilitando a integração de novas linguagens e funcionalidades ao IDE.
Pág.: 31/94
Prof. Daniel Oliveira
Na Figura 22, vemos a opção para baixar a versão desejada do Eclipse. Note uma vez instalado podemos incluir
novos recursos e até mesmo linguagens suportadas a IDE através do recurso de instalação de extensões na
mesma.
Realizado o download, você deverá descompactar o arquivo no local aonde quiser e deverá localizar o arquivo
eclipse.exe (para ambiente Windows) e executá-lo. Você deverá ver a tela da Figura 23 para configuração do
chamado Workspace.
Como o próprio nome já diz, nessa tela (Figura 23) irá indicar para o Eclipse o local de trabalho. Que deverá ser
uma pasta, aonde a IDE irá manter nossos códigos fontes, parâmetros de configuração e outras informações
de trabalho. Podem-se ter vários Workspaces, mas, apenas um fica ativo por vez. Uma vez criado o Workspace,
você deverá uma tela como esta na Erro! Fonte de referência não encontrada..
Pág.: 32/94
Prof. Daniel Oliveira
Na Figura 25Erro! Fonte de referência não encontrada. temos o ambiente o Eclipse pronto para ser utilizado
para o desenvolvimento.
Perspectiva
O Eclipse tem o conceito de perspectivas, ou seja, pode-se definir a configuração das janelas e views de acordo
com o tipo de projeto ou com as configurações que melhor se adequem ao seu gosto.
Pág.: 33/94
Prof. Daniel Oliveira
Workspace
O workspace ou espaço de trabalho é o local aonde serão armazenados os arquivos fontes, arquivos
compilados, informações de configuração e outros, que o Eclipse irá utilizar para cada usuário.
Na primeira vez que se executa o Eclipse, será pedido que você informe qual o local do Workspace a ser
utilizado (só é permitido utilizar um workspace por vez). Na Figura 28, vemos o caminho no menu do Eclipse
que possibilita a troca de workspace, o que fará com que o Eclipse se re-inicie.
Pág.: 34/94
Prof. Daniel Oliveira
Criando um projeto
Na Figura 29, temos o caminho para criação de um projeto Java no Eclipse. Em algumas configurações do
Eclipse a opção Java Project pode não estar disponível, então selecione a opção Other e na janela que irá
aparecer digite com campo de texto: Java Project – selecione a opção conforme a Figura 30.
Pág.: 35/94
Prof. Daniel Oliveira
Uma vez selecionado o tipo de projeto Java (se você estiver na janela como da Figura 30, selecione o botão
Next), a janela da Erro! Fonte de referência não encontrada. deverá ser exibida para informações dos
arâmetros iniciais do projeto Java.
Pág.: 36/94
Prof. Daniel Oliveira
Na Figura 33, temos a tela final de configuração do nosso projeto Java. Na aba Source vemos como será a
estrutura do projeto (esta mesma estrutura estará replicada fisicamente em disco no Workspace). Nas demais
abas têm opções mais avançadas que vão além do exigido nesse texto e vamos deixar para um segundo
momento. Selecionando o botão Finish para finalizar a criação do projeto.
Depois que o projeto é criado podemos ver a sua estrutura do Package Explorer(Figura 34).
Pág.: 37/94
Prof. Daniel Oliveira
Caso o Package Explorer não esteja sendo exibido vá até: Window -> Show View, e selecione o Package
Explorer(Figura 35). Nessa opção de menu podemos exibir todas as principais janelas do Eclipse.
Para finalizar a criação do primeiro projeto java, devemos criar um arquivo .java (todo e qualquer programa
em Java tem que ter pelo menos uma classe). Não vamos agora entrar em por menores sobre a estrutura da
classe criada, vamos abordar isto mais a frente.
No package Explorer, selecione o nó src e com o botão direito do mouse selecione - Figura 36:
Pág.: 38/94
Prof. Daniel Oliveira
Após a seleção da opção de uma nova classe será exibida a janela da Figura 37, aonde deve-se levar em conta
(nesse primeiro momento) apenas as informações marcadas de vermelho. Informa-se o nome da classe e
selecione a caixa de criação do método Main. Selecione o botão Finish para finalizar o assistente de criação de
classes.
Após a finalização do assistente de criação de classes, a janela do editor irá ser exibida com o código inicial da
classe. Mais a frente vamos olhar com mais detalhe este código(Figura 38).
Pág.: 39/94
Prof. Daniel Oliveira
Para executar o seu projeto tecle CTRL+F11, o Eclipse irá exibir o processo de compilação e nada será exibido
na tela de console, pois, ainda não colocamos nenhum código que realize alguma tarefa interessante.
Na janela do editor altere o código colocando a linha de código em destaque na Figura 39. Note que o código
deve ser escrito exatamente como está no exemplo. A linguagem Java é case sensitive ou seja faz distinção
entre maiúsculas e minúsculas.
Selecione as teclas CTRL+F11 e veja o resultado na janela de console do Eclipse como na Figura 40.
Pág.: 40/94
Prof. Daniel Oliveira
Variáveis
Anteriormente falamos sobre tipos de dados e a definição do que são variáveis. Bem, vamos agora ver estas
definições dentro de um programa em Java.
No inicio do nosso código de exemplo temos a declaração import, este comando é responsável por indicar ao
compilador Java aonde ele deverá “procurar” pelos comandos utilizados no código (uma definição bem inicial).
A classe Scanner (responsável pela captura das informações digitadas no teclado) é definida dentro do pacote
util que está dentro do pacote java – veja a definição e uso de pacotes no Anexo A . Se, não informamos o
import correto o compilador irá apresentar um erro, pois, não será possível localizar a definição da classe
Scanner.
Pág.: 41/94
Prof. Daniel Oliveira
Avançando pelo código vemos a declaração de uma classe: public class CMain. Não é objetivo do texto abordar
orientação a objetos, mas, para não ficarmos totalmente sem uma explicação podemos resumir este trecho
como:
public – esta palavra chave indica que a classe a ser definida poderá ser acessada por qualquer outro
código que necessite chama-la ou seja e de acesso público
class – como esperado esta palavra chave define que vamos criar uma classe e após esta palavra
chave temos o nome da classe propriamente dito.
Dentro da classe criada no exemplo tem mais coisas “estranhas”, temos a seguinte declaração:
O que vem a ser isto? Bem, na linha acima temos a definição do chamamos de método (mais uma vez este
conteúdo está fora do escopo desse texto). Um método, em poucas palavras, definem ações que as classes
podem realizar – comportamento dos objetos. Todos nossos programas aqui terá que ter este método,
próprio assistente de criação de classes do Eclipse cria esta estrutura (ver Figura 37). Este é o método principal
(main do inglês), é o ponto de partida para execução do nosso código pela máquina virtual Java.
Após a criação da classe temos o caractere “{“, no Java todo bloco de código deve ser envolvido entre um
conjunto de “{“ e “}”. Ou seja, para cada “{“ temos que ter um correspondente “}”.
Outra questão importante na codificação do Java (herança do C/C++) é uso do caractere “;” como terminador
de instrução. Em Java o “;” finaliza uma idéia.
Pág.: 42/94
Prof. Daniel Oliveira
Se olharmos a Figura 45 e compararmos com a Figura 46 podemos ficar em dúvida: Por que a instrução if não
tem “;” no final? A instrução if (com veremos mais frente) irá delimitar um bloco de código e por isso não
utiliza o terminador “;” – outras instruções de bloco (como os repetidores) tem o mesmo comportamento.
Uma boa prática (isto não é uma regra) é a endentação do código através do uso de espaços e tabulações. Isto
facilita a leitura e entendimento do código - Figura 47.
Depois de tudo isto dito, podemos retomar ao assunto de variáveis. As variáveis são usadas para armazenar
informações durante o processamento de programas. O Java usa nove tipos diferentes de tipos de dados -
Quadro 6.
Tipo Descrição
boolean Pode assumir o valor true ou o valor false
char Caractere em notação Unicode de 16 bits. Serve para a armazenagem de dados alfanuméricos –
armazenamento de um único caractere. Também pode ser usado como um dado inteiro com
valores na faixa entre 0 e 65535.
byte Inteiro de 8 bits. Pode assumir valores entre -128 a 127.
short Inteiro de 16 bits. Os valores possíveis cobrem a faixa de -2-15=-32.768 a 215-1=32.767
int Inteiro de 32 bits. Pode assumir valores entre -2.147.483.648 a 2.147.483.647.
long Inteiro de 64 bits em notação de complemento de dois. Pode assumir valores entre -263 e 263-1.
float Representa números em notação de ponto flutuante normalizada em precisão simples de 32 bits
em conformidade com a norma IEEE 754-1985. O menor valor positivo representável por esse tipo é
1.40239846E-46 e o maior é 3.40282347E+38
double Representa números em notação de ponto flutuante normalizada em precisão dupla de 64 bits em
conformidade com a norma IEEE 754-1985. O menor valor positivo representável é
4.94065645841246544e-324 e o maior é 1.7976931348623157e+308
String O tipo string não é um tipo primitivo mais se comporta como. Este tipo é utilizado para armazenar
cadeias de caracteres como nomes, frases, palavras e etc.
Quadro 6 - Tipos de dados primitivos do Java
No exemplo abaixo temos um código que irá exibir os valores limites dos tipos de dados numéricos em Java,
como no quadro acima:
Pág.: 43/94
Prof. Daniel Oliveira
A declaração de uma variável em Java, sempre é feita através da seguinte estrutura: <TIPO> <NOME
(IDENTIFICADOR>, por exemplo:
Ex. int i; => Declara uma variável do tipo inteira cujo o nome é i.
Para atribuirmos um valor a uma variável usamos o operador “=” (ou igual simples), como no exemplo da
Figura 49 - Atribuição de valores.
Pág.: 44/94
Prof. Daniel Oliveira
Na primeira linha temos a declaração da variável e na segunda linha temos a chamada inicialização da variável
(a primeira vez que ela recebe algum valor). Em Java não podemos “trabalhar” com uma variável sem antes
inicializa-la. Isto é devido ao fato de que quando declaramos uma variável, apenas separamos um espaço de
memória para seu uso, mas, qualquer que seja o valor que já exista nesse local ainda permanece lá (ou seja,
um lixo qualquer) - Figura 50.
int i = 10;
Tipos numéricos
Com os tipos numéricos em Java: tipos inteiros (byte, short, int e long) e tipos de ponto-flutuante (float e
double) podemos realizar todas as operações:
Operação Descrição
= Operadores de atribuição
==, != Operadores de igualdade e diferença
<, <=, >, >= Operadores de desigualdade
+, -, *, /, % Adição, subtração, multiplicação, divisão e módulo.
+=, -=, *=, /=, %= Operadores de atribuição com adição, subtração, multiplicação, divisão e módulo.
++, -- Incremento e decremento
~ Operador lógico de negação
&, | Operadores lógicos E, OU
Quadro 7 - Operadores para tipos numéricos
Pág.: 45/94
Prof. Daniel Oliveira
O Java, assim como outras linguagens tem operadores que simplificam a escrita. Não existe nenhum ganho de
desempenho no uso deles e sim redução de escrita.
byte j = 60;
short k = 24;
int l = 30;
long m = 12L;
long resultado = 0L;
System.Math
Além desses operadores evidentemente existem outras operações (mais complexas) que podem ser realizadas
com tipos numéricos. No Java estas operações são definidas dentro de uma classe especial chamada de Math.
Máximo e Mínimo;
Potências e Raízes;
Logaritmo;
Arredondamentos e Valores Absolutos;
Trigonometria;
Números Randômicos.
Constantes
A classe Math possui duas constantes que são o Π (pi) e E (base de logaritmos naturais ou neperianos) cada
uma com o valor de 3,141592653589793 e 2.718281828459045, respectivamente.
Pág.: 46/94
Prof. Daniel Oliveira
Máximo e Mínimo
Como o título já sugere, a classe Math de Java possui dois métodos que retornam o maior e o menor valor de
seus argumentos. Esses métodos são max() e min().
public class MenorMaior {
public static void main(String[] args) {
float precoProdutoA[] = { 11.2f, 15.12f };
float precoProdutoB[] = { 19.7f, 20 };
System.out.println("O maior preço do produto A é " + Math.max(precoProdutoA[0], precoProdutoA[1]));
System.out.println("O menor preço do produto B é " + Math.min(precoProdutoB[0], precoProdutoB[1]));
}
}
Logaritmo
Na classe Math encontramos funções para cálculo de logaritmo natual, na base de 10 e a soma do número
mais 1. Tais métodos são:
log (número) - logaritmo natural de um número.
log10 (número) - logaritmo natural de um número na base 10
log1p (número) - logaritmo natural de um número somado a 1. Esse método retorna um resultado
mais confiável se o número em questão for muito próximo a 0 ou um número fracionado. Ou seja, o
resultado não é o mesmo entre os métodos log1p (0.1f) e log (1+0.1f).
Pág.: 47/94
Prof. Daniel Oliveira
abs (número) - retorna o valor absoluto do mesmo tipo do parâmetro (ex.: inteiro retorna int positivo,
decimal retorna float positivo, etc)
ceil (decimal) - este método retorna o valor decimal do parâmetro sem a parte fracionada. Ex.: 2.1 será
2, 6.0 será 6, 10.8 será 10. Realiza o truncamento do número.
floor (decimal) - este método retorna o primeiro inteiro após o valor decimal. Ex.: 2.1 será 3, 6.0 será
6, 10.8 será 11.
round (decimal) - retorna o arredondamento aritmético do número decimal passado como parâmetro.
Trigonometria
A maioria da funções da classe Math são trigonométricas, ângulo em radianos.
sin (ângulo) - seno
cos (ângulo) – cosseno
tan (ângulo) - tangente
asin (ângulo) – arco seno
acos (ângulo) – arco cosseno
atan (ângulo) – arco tangente
sinh (ângulo) – seno hiperbólico.
cosh (ângulo) – cosseno hiperbólico.
tanh (ângulo) – tangente hiperbólica.
hypot (x , y) - retorna o valor da hipotenusa, ou, basicamente, a distância entre dois pontos
fundamentada na fórmula » [sqrt (pow(x, 2) + pow(y,2))].
toRadians (ângulo) - retorna um valor aproximado de radianos de acordo com o ângulo medido em
graus.
toDegrees (raio) - retorna um valor aproximado de graus de acordo com o ângulo medido em raios.
Pág.: 48/94
Prof. Daniel Oliveira
Números Randômicos
O método random() retorna um valor double em 0.0 e 1.0 (deve-se levar em contar que não é uma quantidade
infinita de números, uma vez que o double tem um limite de casas decimais. Para conseguirmos um valor
limite ou um alcance (comumente chamado de range) delimitado, devemos fazer pequenas operações
matemáticas. Essas operações são simples e podem ser resumidas da seguinte maneira.
O limite inferior, ou valor inicial (start value) será sempre somado ao número randômico.
O limite superior, ou alcance (range) será sempre o limite superior subtraído o limite inferior e
depois multiplicado ao número randômico.
Por exemplo, se quisermos que um número randômico sempre fique entre 5 e 10, procederíamos da seguinte
maneira:
1. O menor número possível é 5, portanto ele será nosso start value ou limite inferior.
2. O maior número possível é 10, então 10 será nosso limite superior.
3. Como temos ambos os limites (inferior e superior) devemos criar um alcance (range). Para obtermos
isso, subtrairemos o limite superior com o limite inferior (10-5=5).
É muito comum pensarmos que todos os tipos numéricos são iguais no sentido do que armazenar. Como foi
visto anteriormente, cada tipo numérico tem um limite de informação que pode ser armazenada, isto é devido
ao fato de as variáveis são posições de memória do computador e a mesma é limitada.
Tendo isto em conta, se tenho um tipo de dados inteiro simples (int) o espaço de memória separado para
armazenar este valor pode ser utilizado para armazenar valores do tipo short e byte, pois, requerem menos
espaço de memória do que o int. Mas, não
poderíamos armazenar um tipo long dentro do
espaço reservado para um int ou qualquer tipo
menor do que o mesmo. Uma boa dica é
sempre se perguntar se o tipo “cabe” dentro do
outro.
Para constantes numéricas ou literais (o valor constante é um valor que não se altera e valores informados
diretamente no código fonte é um exemplo, só será alterado se o código fonte for alterado) precisamos indicar
ao compilador qual tipo de dado deverá ser utilizado para armazenar o valor na memória (lembre-se que os
tipos de dados determinam entre outras coisas o espaço de memória reservado para o valor). Por padrão toda
constante inteira (números inteiros) são armazenados com int e todos os números com partes fracionárias são
armazenadas com double.
Para alterarmos este comportamento padrão do compilador podemos utilizar sufixos pré-definidos, na
linguagem para isto:
O uso de sufixos é muito útil em relação a valores que são fixos ou escritos diretamente no código. Mas,
quando estamos trabalhando com variáveis?
A forma mais usual, é colocar na frente da variável o nome do tipo (entre parênteses) para o qual deseja-se
converter o conteúdo da variável :
public class Exemplo {
public static void main(String[] args) {
double d = 3.213;
float f;
f = d; // Erro
f = (float)d; // OK
}
}
Exemplo 11 - Cast
Este tipo de conversão é também conhecido como sendo conversão explícita, ou seja, aquela em que
informamos de forma explícita qual conversão o compilador deverá realizar. Existe também a chamada
conversão implícita, aquela aonde o compilador realiza a conversão da “melhor forma possível”.
Conversões implícitas ocorrem principalmente quando existe alto nível de compatibilidade entre os tipos. Por
exemplo, ao se atribuir uma variável inteira de 32bits a uma variável inteira longa de 64 bits – aplicando a
regra de que um tipo “cabe” dentro do outro fica mais fácil para entender que se for o inverso teremos que
fazer uma conversão explícita.
j = i; //OK
i = j; //Erro
i = (int)j; //OK - Apenas de conteúdo de J for inteiro de 32 Bits
}
}
Exemplo 12 - Cast
Dica: Os tipos em Java e o comportamento da linguagem em relação pode gerar uma situação inusitada
quando trabalhamos com a divisão numérica. Se, em uma operação de divisão ambos os operandos forem
Pág.: 50/94
Prof. Daniel Oliveira
inteiros o resultado da operação também será inteiro, ou seja, ocorrerá um truncamento do número se a
divisão não for inteira. Mas, se os operandos forem de tipos diferentes o resultado será do tipo de maior
precisão ou tamanho. Veja o exemplo:
}
}
Quando trabalhamos com tipos alfanuméricos, como por exemplo: String, podemos ter a seguinte situação:
E o inverso, é possível utilizar o conteúdo de uma variável string como sendo um valor numérico (isto será
muito utilizado quando estivermos desenvolvimento programas que obtenham valores digitados pelo
usuário)? Sim, é possível, mas nem sempre é possível a conversão direta para isto teremos que utilizar
algumas funções:
public class Exemplo {
public static void main(String[] args) {
String str = "100";
System.out.println( Byte.parseByte(str) );
System.out.println( Integer.parseInt(str) );
System.out.println( Long.parseLong(str) );
System.out.println( Float.parseFloat(str) );
System.out.println( Double.parseDouble(str) );
}
}
Exemplo 15 - Exemplo de métodos para conversão de string para tipos numéricos
O que ocorreria se o conteúdo da variável str for incompatível em alguma conversão. Nesse caso teremos um
erro em tempo de execução e o programa irá ser abortado - Figura 52. Este tipo de erro é chamado de
exceção ou exception (não é escopo desse texto abordar este assunto – isto é está ficando muito frustrante!),
Pág.: 51/94
Prof. Daniel Oliveira
na Figura 53, temos um exemplo de como tratar de forma elegante este tipos de erros (existe muito mais
conteúdo para isto, mas, agora não é o momento).
Forma bem geral, e simples, todos os erros que ocorram dentro de um bloco try (tentativa) é capturada por
um bloco catch e o erro é informado através de um objeto do tipo Exception.
Pág.: 52/94
Prof. Daniel Oliveira
Uma parte importante dos programas é entrada e saída de dados. Como pode ser percebido nos exemplo
anteriores o principal comando para saída (na tela de console) é o: println – este comando está dentro da
classe out que está no pacote System, por isso o escrevemos dessa forma: System.out.println. Como a
documentação do Java (ORACLE,2012) diz: fluxo padrão de saída. Ficando aberto e pronto para o uso.
Normalmente utilizando em aplicações padrões.
Como o próprio nome deixa claro, a classe out é responsável por rotinas de saída, no nosso caso (o que irá
abordar todo este texto) iremos utilizar as rotinas de saída no console. No Java podemos construir aplicativos
de janela, applets (para páginas html) e Web, mas, nosso foco são aplicativos de console.
print(<<texto>>): Imprime o texto sem gerar um nova linha. Um próximo comando print irá continuar
da posição de onde este parou.
println(<<texto>>): Imprime o texto e gera uma quebra de linha. Um próximo comando print ou
println irá continuar da nova linha.
Tanto para o método print ou println podemos passar qualquer tipo de variável que o mesmo irá realizar a
conversão para o tipo String e exibir na saída.
public class Exemplo{
public static void main(String[] args) {
int inteiro = 200;
float decimal = 0.5f;
char letra = 'J';
System.out.println ("Valor:" + inteiro);
System.out.println ("Valor:" + decimal);
System.out.println ("Valor:" + letra);
}
}
Podemos ainda informar (como parte do texto a ser exibido) caracteres especiais que serão interpretados
pelos comandos print e println da seguinte forma:
Pág.: 53/94
Prof. Daniel Oliveira
É possível ainda aplicar algum tipo de formatação na saída de valores numéricos, para isto deve ser utilizado o
método printf – imprimir formatando. Este método utiliza do que chamamos de placeholders ou espaços
reservados. Veja o exemplo:
O primeiro parâmetro passado para a função é uma string, dentro dessa string temos marcadores especiais
que são inicializados com caractere %, para cada marcador desse deve haver uma variável ou valor (listado
após a string) para ser colocado nessa posição (placeholder).
Flags:
o '-' : justificado a esquerda
o '^' : caixa alata
o '+' : valor sinalizado
o '0' : força zeros a direita ou esquerda
Width: comprimento do número
Precision: precisão do número – casas decimais
Conversion:
o 'd': inteiro
o 'o': octal
o 'x': hexadecimal
o 'f': notação decimal para ponto-flutuante
o 'g': notação científica
o 'a': hexadecimal com expoentes
o 'c': caractere
o 's': string
Pág.: 54/94
Prof. Daniel Oliveira
Além da saída precisamos de uma forma de obter as informações dos usuários. Para isto vamos trabalhar com
uma classe especial que é Scanner. Na Figura 54, temos um exemplo da utilização da classe Scanner. Como
esta classe está definida dentro do pacote util que por sua vez está definido no pacote java, é necessário
sempre a introdução da declaração import como
na linha 1.
Figura 55 - Uso do método next da classe Scanner Quando se digita o Enter, todo os texto digitado é passado para
a variável Nome e na linha 8 o seu conteúdo é impresso na no
console .
Pág.: 55/94
Prof. Daniel Oliveira
E quando necessitarmos de obter valores numéricos? Classe Scanner tem rotina para isto, obtendo as
informações digitadas e tenta converter para o tipo especifico que necessitamos, caso não seja possível um
erro irá ocorrer (uma exceção).
import java.util.*;
System.out.print("Sua idade:");
int Idade = scan.nextInt(); //Obter um valor inteiro
System.out.print("Sua altura:");
double altura = scan.nextDouble(); //Obter um double
System.out.println(Nome);
System.out.println(Idade);
System.out.println(altura);
}
}
Exemplo 21 - Exemplo das rotinas da classe Scanner para obter dados numéricos
Além das rotinas acima, temos ainda outros para os tipos byte, long. Veja no Anexo B, informações sobre
como utilizar JOptionPane.
Pág.: 56/94
Prof. Daniel Oliveira
Exercícios
1) Faça um programa que leia três valores inteiros, e calcule e exiba a sua média ponderada. A primeira nota
tem peso 2, a segunda tem peso 3 e a terceira tem peso 5.
2) Realizarei uma viagem de vários dias em meu automóvel, e gostaria de saber a quilometragem média por
litro de gasolina. Para isto, anotarei a quilometragem no velocímetro ao sair de viagem, e depois ao
chegar. Também vou somar toda a gasolina que comprar para o carro. Você poderia fazer um programa
que me desse, com estes dados, quantos km fiz, em média, por litro de gasolina?
3) Faça um programa que leia o nome de um piloto, uma distância percorrida em km e o tempo que o piloto
levou para percorrê-la (em horas). O programa deve calcular a velocidade média em km/h, e exibir a
seguinte frase: A velocidade média de XX foi YY km/h, onde XX é o nome do piloto, e YY é a velocidade
média.
4) Em uma pizzaria, cada refrigerante custa R$1,80 e uma pizza mista grande custa R$25,00 mais R$ 3,50 por
tipo de cobertura pedida (queijo, presunto, banana, etc.). Uma turma vai à pizzaria e pede uma
determinada quantidade de refrigerantes e uma pizza grande com uma determinada quantidade de
coberturas. Faca um programa que calcula a conta e, sabendo que a será informada a quantidade de
pessoas, quanto que cada um deve pagar. Lembre-se dos 10% do garçom.
5) A conversão de graus Fahrenheit para Celsius é obtida pela fórmula abaixo. Faça um algoritmo que leia um
valor em graus Centígrados e imprima seu correspondente em graus Fahrenheit.
6) Fazer um programa que leia um número inteiro e mostre o seu triplo, sua metade, a sua raiz
cúbica, e por fim, o número elevado a potência fracionária 2/3.
7) Construa um algoritmo que, tendo como dados de entrada dois pontos quaisquer no plano,
P(x1,y1) e P(x2,y2), escreva a distância entre eles. A fórmula que efetua tal cálculo é:
10) Faça um programa que receba um valor que é o valor pago, um segundo valor que é o preço do
produto e retorne o troco a ser dado.
11) Faça um programa que receba o valor do quilo de um produto e a quantidade de quilos do
produto consumida calculando o valor final a ser pago.
Pág.: 57/94
Prof. Daniel Oliveira
Estrutura condicional
Normalmente qualquer algoritmo apresenta algum tipo de condição para a sua execução, por exemplo, vamos
examinar o fluxograma da Figura 57 - Estrutura condicional aonde temos uma rotina que irá calcular a raiz real
Cálculo de Raiz Real
de um número. Não podemos calcular a raiz real de
qualquer número, é necessário verificar se o
número informado é positivo ou não.
Calcula raiz
erro Iremos utilizar estruturas condicionais sempre
quadrada real quando for necessário realizar um ação ou não
realizar de acordo com um teste de condições que
resultarão em verdadeiro ou falso.
Fim
Exibe resultado
A instrução IF
No Java a estrutura condicional mais simples utiliza apenas um comando if (“se” em inglês - Exemplo 22).
int i = 5;
if (i == 5)
{
System.out.println("Valor igual a 5.");
}
}
}
Nesse exemplo temos uma estrutura clássica do comando if. O teste lógico realizado é se o conteúdo da
variável “i” é igual a cinco: i == 5. O operador relacional para teste de igualdade no Java (e em várias
Pág.: 58/94
Prof. Daniel Oliveira
linguagens baseadas no C) é o chamado double equal ou igual duplo (==) e não o igual simples (=) que é o
operador de atribuição.
O teste lógico do if vem logo em seguida ao comando e entre parênteses, depois do teste lógico temos um
bloco de código, e, como em Java todo bloco de código é iniciado com um abre chaves “{“ e finalizado por um
fecha chaves “}”. Repararam que não “;” no comando if?
Na realidade o comando if é formado pelo teste lógico e caso este teste for verdadeiro uma instrução é
executada. Sendo que essa instrução pode ser apenas uma única linha de código (nesse caso o conjunto de {} é
opcional) ou bode ser um bloco com várias linhas de código, com inclusive outras instruções condicionais.
int i = 5;
if (i == 5)
System.out.println("Valor igual a 5.");
}
}
Exemplo 23 - Exemplo do IF com apenas uma linha
Resumindo, se o teste lógico do comando if for verdadeiro, então a instrução seguida ao comando será
realizada. Podendo esta instrução ser apenas uma linha ou um bloco (delimitado pelo para de {}) de código.
Comparação de strings
Vimos que o operador de teste de igualdade é o “==”, este operador poder ser utilizado para todos os tipos de
dados vistos até agora com exceção da String. Deve-se ser usado o método equals para realizar a comparação
entre strings, veja o exemplo abaixo:
if (Cor.equals("azul"))
{
System.out.print("Minha cor preferida também é o azul.");
}
}
}
No exemplo anterior comparamos o conteúdo da variável Cor com o valor “azul”. O método equals é sensível a
caixa, ou seja, ele diferencia maiúscula de minúsculas. Para comparações não sensíveis a caixa deve ser usado
o método equalsIgnoreCase.
Pág.: 59/94
Prof. Daniel Oliveira
import java.util.*;
if (Cor.equalsIgnoreCase("azul"))
{
System.out.print("Minha cor preferida também é o azul.");
}
}
}
A instrução Else
Bem, e se a condição de teste da instrução if for falsa? Caso seja necessário uma ação nessa situação existe a
declaração else (“senão” em inglês). Se a instrução else for usada em conjunto com a instrução if, a linha de
comando ou código de bloco (aqui vale os mesmos parâmetros da instrução if) será executada se a condição
for falsa.
import java.util.*;
if (Cor.equalsIgnoreCase("azul"))
{
System.out.print("Minha cor preferida também é o azul.");
}
else
{
System.out.print("A cor escolhida não foi o azul!");
}
}
}
A instrução else sempre deverá ser utilizada em conjunto da instrução if. Mas, as instrução if, pode ser
utilizada sem a instrução else.
Pág.: 60/94
Prof. Daniel Oliveira
Após uma instrução if ou else podemos ter uma linha de comando ou um bloco de comandos. Como as
instruções if são também comandos, podemos ter uma instrução seguida da outra, veja o exemplo.
import java.util.*;
if (Numero == 1)
System.out.println("Você informou o número 1.");
else if (Numero == 2)
System.out.println("Você informou o número 2.");
else if (Numero == 3)
System.out.println("Você informou o número 3.");
else
System.out.println("Número inválido.");
}
}
O expressão de teste da instrução if pode ser simples (como foi visto nos exemplos anteriores) ou pode ser
resultado de uma expressão bem mais complexa. Para a construção de expressões lógicas com mais de um
termos temos que usar os chamados conectivos lógicos:
Vamos imaginar um algoritmo que receba um número inteiro e verifica se o mesmo é maior ou igual a 10 e
menor ou igual a 100. Como ficaria a expressão para este teste?
Pág.: 61/94
Prof. Daniel Oliveira
Pág.: 62/94
Prof. Daniel Oliveira
Pág.: 63/94
Prof. Daniel Oliveira
Declaração switch/case
O uso de if/else encadeados pode ser bem confuso para se manter o código fonte. Por exemplo, vamos
desenvolver um algoritmo que simule um menu de uma aplicação:
import java.util.*;
if (opcao == 1){
System.out.print("Opção 1 selecionada");
}
else
{
if (opcao == 2)
{
System.out.print("Opção 2 selecionada");
}
else
{
if (opcao == 3)
{
System.out.print("Opção 3 selecionada");
}
else
{
if (opcao == 4)
{
System.out.print("Opção 4 selecionada");
}
else
{
System.out.print("Operação inválida");
}
}
}
}
}
}
No exemplo acima é fácil notar que à medida que a quantidade de opções aumenta, mais intricado e difícil de
entender o código fica. Para situações como esta, é indicado o uso da estrutura switch/case. Nessa estrutura
Pág.: 64/94
Prof. Daniel Oliveira
um teste de igualdade é realizado em uma variável (switch) e para da possível valor dessa variável (case) é
realizado uma ação.
Além das palavras chaves switch e case, ainda compõe esta estrutura:
break – usado dentro do bloco de código do case. Este comando indica que o processamento do
switch deve ser interrompido e a execução do código deverá continuar a partir da primeira linha após
o final do switch. Se, por exemplo, omitirmos um break, o comando case imediatamente após será
executado (mesmo que o conteúdo da variável não execute este case).
default – este seria o comando else dessa estrutura e é opcional. Se o valor da variável de teste do
switch não corresponder a nenhum case, então, se houver um default definido, o código dentro do
default é executado.
import java.util.*;
switch(opcao)
{
case 1:
System.out.print("Opção 1 selecionada.");
break;
case 2:
System.out.print("Opção 2 selecionada.");
break;
case 3:
System.out.print("Opção 3 selecionada.");
break;
case 4:
System.out.print("Opção 4 selecionada.");
break;
default:
System.out.print("Opção inválida!");
}
}
}
1) O switch trabalha apenas com os tipos primitivos: int, short, byte e char
2) Não é possível o uso de expressões booleanas (lógicas) no switch.
No Exemplo 30, temos um algoritmo mais complexo que para determinar a quantidade de dias do mês,
levando-se em conta se o ano é bissexto ou não.
Pág.: 65/94
Prof. Daniel Oliveira
import java.util.*;
System.out.print("Informe um mês:");
int mes = scan.nextInt();
System.out.print("Informe um ano:");
int ano = scan.nextInt();
int numDays = 0;
switch (mes) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
numDays = 31;
break;
case 4:
case 6:
case 9:
case 11:
numDays = 30;
break;
case 2:
if ( ((ano % 4 == 0) && !(ano % 100 == 0)) || (ano % 400 == 0))
numDays = 29;
else
numDays = 28;
break;
default:
System.out.println("Mês inválidos.");
break;
}
System.out.println("Número de dias = " + numDays);
}
}
Pág.: 66/94
Prof. Daniel Oliveira
Exercícios
2. Faça um programa que receba o valor do salário de uma pessoa e o valor de um financiamento
pretendido. Caso o financiamento seja menor ou igual a 5 vezes o salário da pessoa, o programa
deverá escrever "Financiamento Concedido"; senão, escreverá "Financiamento Negado".
Independente de conceder ou não o financiamento, o programa escreverá depois a frase "Obrigado
por nos consultar."
3. Dois carros percorreram diferentes distâncias em diferentes tempos. Sabendo que a velocidade média
é a razão entre a distância percorrida e o tempo levado para percorrê-la, faça um programa para ler as
distâncias que cada carro percorreu e o tempo que cada um levou, e indique o carro que teve maior
velocidade média.
4. Faça um programa que leia o nome e idade de duas pessoas e imprima o nome da pessoa mais nova, e
seu ano de nascimento (o programa deve funcionar corretamente para qualquer que seja o ano atual).
5. Leia um nome e duas notas dadas a um aluno e imprima: nome, média e “aprovado”, “reprovado” ou
“recuperação”, de acordo com as regras abaixo:
Reprovado, se média maior igual a zero e menor que 5;
Recuperação, se média maior igual a 5 e menor que 7;
Aprovado, se média maior igual a 7 e menor igual a 10.
6. Tendo como dados de entrada a altura e o sexo de uma pessoa, construa um algoritmo que calcule seu
peso ideal, utilizando as seguintes formulas:
Para homens: (72.7 * Altura) - 58
Para mulheres: (62.1 * Altura) - 44.7
7. Leia um salário bruto e imprima o salário bruto, o desconto e salário líquido, após os descontos do
imposto de renda, que será calculado da seguinte maneira:
Pág.: 67/94
Prof. Daniel Oliveira
8. A loja Constrói em Partes produz dois tipos de hastes: cobre e alumínio. Cada haste de cobre é vendida
por R$ 2,00, e cada haste de alumínio é vendida por R$ 4,00. O desconto dado dependerá da
quantidade de hastes compradas, conforme tabela abaixo. Fazer um algoritmo para ler a quantidade
comprada de cada tipo de haste e imprima o total pago.
9. Uma empresa de energia elétrica trabalha com 3 tipos de consumidores: I – Industrial; C – Comercial;
R – Residencial. Fazer um algoritmo para ler o tipo de consumidor (‘I’, ‘C’ ou ‘R’), a quantidade de
energia consumida, e calcular e imprimir qual será o valor pago. Para calcular o valor pago, verificar a
tabela abaixo.
10. Faça um programa que receba 2 valores e retorne o maior entre eles.
11. Faça um programa que receba 4 valores e retorne o menor entre eles.
12. Faça um programa que receba 3 valores que representarão os lados de um triângulo e verifique se os
valores formam um triângulo e classifique esse triângulo como:
a. Equilátero (3 lados iguais);
b. Isósceles (2 lados iguais);
c. Escaleno (3 lados diferentes).
13. Utilize a estrutura if para fazer um programa que retorne o nome de um produto a partir do código do
mesmo. Considere os seguintes códigos:
001: Parafuso;
002: Porca;
003: Prego;
Para qualquer outro código indica: Diversos.
Pág.: 68/94
Prof. Daniel Oliveira
14. Um banco concederá um crédito especial aos seus clientes, variável com o saldo médio no último ano.
Faça um algoritmo que leia o saldo médio de um cliente e calcule o valor do crédito de acordo com a
tabela abaixo. Mostre uma mensagem informando o saldo médio e o valor do crédito.
15. Um usuário deseja um algoritmo onde possa escolher que tipo de média deseja calcular a partir de
três notas. Faça um algoritmo que leia as notas, a opção escolhida pelo usuário e calcule a média.
a. Aritmética
b. Ponderada com pesos 3,3,4
3
c. Harmônica: 𝐻 = 1 1 1
( + + )
𝑁𝑜𝑡𝑎1 𝑁𝑜𝑡𝑎2 𝑁𝑜𝑡𝑎3
16. Um vendedor necessita de um algoritmo que calcule o preço total devido por um cliente. O algoritmo
deve receber o código de um produto e a quantidade comprada e calcular o preço total, usando a
tabela abaixo.
1001 5,32
1324 6,45
6548 2,37
0987 5,32
7623 6,45
17. Escrever um algoritmo que lê a hora de início de um jogo e a hora do final do jogo (considerando
apenas horas inteiras) e calcula a duração do jogo em horas, sabendo-se que o tempo máximo de
duração do jogo é de 24 horas e que o jogo pode iniciar em um dia e terminar no dia seguinte.
Pág.: 69/94
Prof. Daniel Oliveira
Estruturas de repetição
Em muitas situações é necessário que nossos algoritmos repitam uma ou mais vezes um conjunto de
instruções. Por exemplo, o desenvolvimento de um algoritmo que irá ordenar uma lista de números inteiros.
Será necessário percorrer vários elementos dessa lista várias vezes até finalmente a mesma esteja ordenada
da forma como queremos. Chamamos de iteração a cada vez que a estrutura de repetição é executada.
As estruturas de repetição são formadas por duas partes lógicas: condição(expressão lógica) e o corpo
(conjunto de código que é executado a cada iteração) do loop. A condição é testada a cada iteração para
verificar se é necessária a execução do código contido no corpo do loop ou não.
Indeterminados
Determinados
Nos loops determinados é possível saber quantas vezes ocorrerá à repetição. Já, os loops indeterminados a
sua execução é realizada enquanto uma determinada condição for verdadeira.
Pré-testados
Pós-testados
Os loops pré-testados (ver Figura 63) verificam a condição antes de qualquer coisa, desta forma o código
contido dentro do corpo do loop poderá nunca ser executado caso a condição resultar em um valor falso.
Não
Pág.: 70/94
Prof. Daniel Oliveira
Os loops pós-testados (Figura 64) verificam a condição após a execução do código contido no corpo do loop.
Assim, nesse tipo de loop o corpo do loop é executado pelo menos uma vez.
Executa o corpo do
loop
Sim
Condição
verdadeira ?
Não
Loop While
while(<Condição lógica>)
{
///Comandos
}
O termo while vem do inglês que traduzido é enquanto. Ou seja, enquanto uma determinada condição for
verdadeira execute o corpo do loop.
public class Exemplo{
public static void main(String[] args) {
int x= 10;
while( x < 20 ){
System.out.print("x : " + x );
x++;
System.out.print("\n");
}
}
}
Exemplo 32 - Exemplo do loop while
Pág.: 71/94
Prof. Daniel Oliveira
Analisando o Exemplo 32, temos um código que irá imprimir na tela os valores da variável x de 10 até 19 (Por
que não 20? Veja a condição de teste do loop.).
Dica: Loops indeterminados tem uma característica que pode ser perigosa, eles podem simplesmente nunca
parar e entrar no que chamamos de loop infinito, bastando para isto que a condição de teste de parada
sempre seja verdadeira. Se, no exemplo anterior a linha de código que incrementa a variável x por omitida o
loop nunca irá parar.
Dica: Além do teste de parada retornar um valor falso, podemos realizar uma parada “forçada” da execução
do loop. Bastando para isto utilizar o comando break dentro do corpo do loop. Ao ser executado este
comando dentro do corpo do loop a execução do loop é para imediatamente e o a primeira linha
imediatamente após o loop é executada. Ver Exemplo 33.
while( x < 20 ){
System.out.print("x : " + x );
x++;
System.out.print("\n");
}
}
}
Exemplo 33 - Exemplo do uso do comando break dentro de um loop
Loop Do...While
No Exemplo 34, temos a estrutura desse loop. Este é um loop indeterminado (já vimos anteriormente qual o
significado desse termo) e pós-testado.
do
{
//Comandos
}while(<Condição lógica>);
Se traduzirmos do inglês as palavras Do e While temos: Faça e Enquanto. Faça alguma coisa (o código dentro
do corpo do loop) enquanto alguma coisa for verdadeira (a condição lógica).
Pág.: 72/94
Prof. Daniel Oliveira
É fácil notar que nesse loop que o código no seu interior é executado pelo menos uma vez. Este tipo de loop é
muito útil em situações aonde queremos garantir que o código no interior do loop seja executado pelo menos
uma vez.
No Exemplo 35, temos um código que irá imprimir números de 10 a 19 no console. Este exemplo faz a mesma
coisa que o Exemplo 32.
Dica: Na realidade tudo que fazemos com o loop while podemos fazer com loop do...while e vice versa.
Vamos analisar um exemplo um pouco mais complexo (ver Exemplo 36). Aqui temos um código que irá conter
quantos inteiros maiores do que zero o usuário informou.
1 import java.util.*;
6 do{
System.out.print("Informe um inteiro positivo e zero para encerrar:");
valor = scan.nextInt();
if (valor > 0)
{
conta++;
}
7 }while( valor != 0 );
Pág.: 73/94
Prof. Daniel Oliveira
A execução do loop é encerrada quando o usuário informa o valor zero. (linha 6). Ainda nesse exemplo vamos
analisar o seguinte:
1. O que ocorreria se a declaração da variável conta fosse feita dentro do corpo do loop?
2. Por que foi necessário inicializar a variável conta para zero?
3. O que ocorrerá se for informado um número inteiro negativo?
import java.util.*;
while ( valor != 0)
{
System.out.print("Informe um inteiro positivo e zero para encerrar:");
valor = scan.nextInt();
if (valor > 0)
{
conta++;
}
Loop For
Até agora vimos loops categorizados como indeterminados, já este o loop for tem a seguinte estrutura:
A estrutura desse loop é bem diferente dos demais, aqui temos uma variável de controle do loop que deverá
ser inicializada, a cada iteração do loop será feito um teste lógico com ela e também a cada iteração esta
variável irá sofrer uma alteração do seu valor. Se, o teste lógico resultar em um valor falso o loop é encerrado.
Pág.: 74/94
Prof. Daniel Oliveira
}
}
Exemplo 38 - Exemplo do loop FOR
No Exemplo 38, temos um código que irá imprimir os valores de 10 a 19. Podemos também utilizar a estrutura
do loop for para gerar contagens inversas, partindo de um valor superior ir decrementando a variável de
controle até atingir o limite inferior desejado – veja Exemplo 39.
for(int i=10;i>=0;i--)
{
System.out.println(i);
}
Em todos os exemplos vistos até agora com Loop for, a variável de controle é declarada e inicializada dentro
da declaração do loop, assim, esta variável só será “visível” dentro do corpo do loop. E, não poderá ser
acessada fora do bloco. Mas, nada impede que seja utilizada uma variável já declarada, reescrevendo o
exemplo anterior:
public static void main(String[] args) {
int i;
for(i=10;i>=0;i--)
{
System.out.println(i);
}
Exemplo 40 - Exemplo de loop for com a variável de controle declarada fora do loop
Pág.: 75/94
Prof. Daniel Oliveira
if(isPrime)
System.out.println("Primo");
else
System.out.println("Não primo");
Pág.: 76/94
Prof. Daniel Oliveira
Exercícios
3) A conversão de graus Fahrenheit para centígrados é obtida pela fórmula C = 5/9 (F-32). Escreva
um algoritmo que calcule e escreva uma tabela de graus centígrados em função de graus Fahrenheit
que variem de 32 a 212 de 1 em 1. A tabela deverá ser semelhante à mostrada abaixo:
Graus Fahrenheit Graus Celsius
32 0
33 0.6
34 1.1
... ...
212 100
4) Escrever um algoritmo que calcule a média obtida por uma turma de "n" alunos na primeira prova
do semestre, onde o valor de n será informado pelo usuário.
5) Escrever um algoritmo que, dada uma sequência de valores inteiros e positivos, determine qual é a
média aritmética dos valores pares. O valor 0 (zero) indica o término dos dados de entrada, ou seja,
o programa termina quando for informado o valor 0(zero).
6) Codifique o algoritmo que leia dois números inteiro e positivo e apresente o resultado do
primeiro número elevado ao segundo número (exemplo: 24 = 2*2*2*2 = 16). Não utilizar o método
pow do package Math.
7) Escrever um algoritmo que lê um valor n e outro valor m, e calcula a tabuada de n de 1 até m.
Exemplo: Supor que o usuário informe os seguintes valores: n=8 e m=12. Então tem-se:
1x8=8
2 x 8 = 16
...
. . .
12 x 8 = 96
8) Fazer um algoritmo para calcular a soma de todos os múltiplos de 7 entre 100 e 500.
9) Faça um algoritmo que imprima os números inteiros decrescentes compreendidos entre 100 e 10.
10) Faça um algoritmo que imprima a tabuada do número 5 da seguinte maneira:
5x0=0
5x1=5
5x2=10
...
5x10=50
11) Faça um algoritmo que imprima a soma dos números ímpares compreendidos entre 10 e 100.
Pág.: 77/94
Prof. Daniel Oliveira
12) Codificar o programa abaixo, para que determine os valores de y, tal que y = (3+2x+6x²)
/(1+9x+16x²) para x variando de 1,0 até 5,0 em intervalos de 0,1 unidades
1 2 3 4 30
S
60 58 56 54 2
1 3 5 7 99
H
1 2 3 4 50
15) Faça um algoritmo que leia um número inteiro e positivo N e imprima o valor de S da seguinte
série:
16) Faça um algoritmo que imprima a soma dos 20 primeiros termos da serie abaixo, onde o
denominador representa o fatorial do número.
100 99 98 97
0! 1! 2! 3!
17) Programa para calcular e imprimir o volume e o raio da esfera com o raio variando de 1 a 10
usando a estrutura de repetição
18) Escreva um algoritmo para ler 2 valores (se o segundo valor informado for ZERO, deve ser lido
um novo valor, ou seja, para o segundo valor não pode ser aceito o zero – exibindo uma
mensagem de erro) e imprimir o resultado da divisão do primeiro pelo segundo.
19) Faça um algoritmo que leia a altura de 10 pessoas e imprima média destas alturas. Imprima
também quantas alturas maiores que 1.60 e quantas menores que 1.30.
20) Faça um algoritmo que leia os dados de cada empregado: nome, salário por dia e número de dias
trabalhados de uma firma de 10 empregados. Imprima o salário total a ser pago aos empregados
e a média dos salários.
21) Faça um algoritmo que leia a altura e o sexo de 100 pessoas e imprima:
- Quantos homens e mulheres foram medidas;
- Quantos homens acima de 1,70;
- A média das alturas das mulheres.
22) Codifique um algoritmo para determinar o maior número em N números diferentes dados.
Pág.: 78/94
Prof. Daniel Oliveira
23) Codifique um algoritmo para calcular e imprimir o menor dentre N valores lidos.
24) Faça um programa de que determinar quais números são primos entre os inteiros 1 e N. Aonde N
será informado pelo usuário.
25) Codificar um algoritmo que simule o jogo de adivinhação: o jogador 1 escolhe um número entre 1
e 10; o jogador 2 insere números na tentativa de acertar o número escolhido pelo jogador 1.
Quando ele acertar, o algoritmo deve informar que ele acertou o número escolhido pelo jogador
1 em x tentativas (quantidade de tentativas do jogador 2).
26) Supondo que a população de um país A seja da ordem de 98.000.000 de habitantes, com uma
taxa anual de crescimento de 3,5% e que um país B tenha uma população de
aproximadamente 200.000.000 habitantes com uma taxa anual de crescimento de
1,5%. Escreva um algoritmo que calcule iterativamente, quantos anos serão necessários para que
a população do país A, ultrapasse ou iguale a população do país B, mantidas as
taxas de crescimento.
27) Um determinado material radioativo perde metade de sua massa a cada 50 segundos. Dada a
massa inicial, em gramas, fazer um programa que determine o tempo necessário para que a
massa se torne menor que 0,5 grama. Escreva o massa inicial, a massa final e o tempo em horas,
minutos e segundos.
Pág.: 79/94
Prof. Daniel Oliveira
Arrays
Array ou arranjo é uma estrutura de dados que contém em seu interior um número fixo de valores e de
mesmo tipo. O tamanho de uma array é determinado no momento da sua criação e permanece constante
após a sua criação. São objetos que representam um agrupamento contínuo de posições de memória, sendo
que o tipo dos elementos contidos em uma array pode ser um tipo primitivo ou não - Figura 65.
Índice do
primeiro
elemento
0 1 2 3 4 5 6 7 8 9
Cada item dentro de uma array é chamado de elemento, e cada elemento de uma array é acessado através de
um índice. Sendo que o elemento inicial é indicado pelo índice zero – ver Figura 65.
1. int[] anArray;
2. //Alocando uma array com 10 elementos
3. anArray = new int[10];
4. //Inicializando a array
5. anArray[0] = 100;
6. anArray[1] = 200;
7. anArray[2] = 300;
8. anArray[3] = 400;
9. anArray[4] = 500;
10. anArray[5] = 600;
11. anArray[6] = 700;
12. anArray[7] = 800;
13. anArray[8] = 900;
14. anArray[9] = 1000;
No Exemplo 42, temos um código que declara uma array (linha 1) , na linha 3 temos a alocação da array e a
partir da linha 5 a 14 temos o código aonde inserimos os elementos nas posições indicadas pelos índices.
É possível perceber que para declarar uma array é no formato: tipo[] – o conjunto “[]” indica que estamos
declarando uma array. Cada conjunto deste refere-se a uma dimensão da array. As arrays de apenas uma
dimensão têm também um nome especial: vetor.
Pág.: 80/94
Prof. Daniel Oliveira
byte[] anArrayOfBytes;
short[] anArrayOfShorts;
long[] anArrayOfLongs;
float[] anArrayOfFloats;
double[] anArrayOfDoubles;
boolean[] anArrayOfBooleans
É possível também colocar o conjunto de colchetes na frente do nome da variável da array, assim: int
anArray[]; No Exemplo 43, temos outras formas de declarar e inicializar uma array.
int[] anArray2 = {
100, 200, 300,
400, 500, 600,
700, 800, 900, 1000
};
Intrinsicamente o uso de array está vinculado ao uso de estruturas de repetição para percorrer os elementos
de uma array - Exemplo 44.
for(int i=0;i<anArray.length;i++)
{
anArray[i] = i;
}
No exemplo anterior, temos um loop do tipo for para percorrer uma array inicializando seus elementos. Mas,
na declaração do loop for temos algo interessante: anArray.length – esta propriedade especial da array
retorna a quantidade de elementos dessa array.
No Exemplo 45, temos um código que declara e inicializa uma array de char e a percorre exibindo seus
elementos na tela.
Pág.: 81/94
Prof. Daniel Oliveira
Abaixo temos outro exemplo, que utilizando um algoritmo simples ordena uma array com 10 elementos
aleatórios:
double[ ] nums = new double[10];
Pág.: 82/94
Prof. Daniel Oliveira
Exercícios
2) Leia um vetor de 10 elementos e em seguida ache a posição do elemento de valor m (dado pelo
usuário) no vetor. Caso o elemento não exista no vetor informe ao usuário.
3) Faça um programa que carregue um vetor de seis elementos numéricos inteiros, calcule e mostre:
a. A quantidade de números pares;
b. Quais os números pares;
c. A quantidade de números ímpares;
d. Quais os números ímpares.
4) Faça um programa que carregue um vetor com dez números reais, calcule e mostre a quantidade de
números negativos e a soma dos números positivos desse vetor
5) Solicite ao usuário n números inteiros (onde n também é fornecido pelo usuário), guarde os em um
vetor e em seguida imprima-os na tela. Caso o n fornecido pelo usuário seja maior que o tamanho
máximo do vetor, peça para que ele digite um n menor.
6) Leia um vetor de 10 elementos e em seguida ache a posição do elemento m (dado pelo usuário) no
vetor. Caso o elemento não exista no vetor informe ao usuário.
7) Solicite ao usuário dois vetores de n números (n também é fornecido pelo usuário) e em seguida
calcule a soma dos vetores, elemento a elemento, em um terceiro vetor.
8) Leia um vetor com 20 elementos. A seguir, troque o primeiro elemento com o último, o segundo com
o penúltimo, etc, até o décimo com o décimo primeiro.
9) Faça um programa que obtenha N números (podem ser inteiros ou não). Após obter os N números,
seu programa deverá exibir o menor, o maior e a média dos valores informados.
10) Faça um algoritmo que leia a altura de moças inscritas em um concurso de beleza. Para finalizar será
digitado zero na altura. Imprima as duas maiores alturas.
12) Faça um algoritmo que leia a altura de 1000 pessoas e imprima a maior, a menor, a média destas
alturas. Imprima também quantas alturas maiores que 1.60 e quantas menores que 1.30.
13) Fazer um algoritmo para ler 20 números reais e calcular e imprimir o desvio-padrão e a variância,
utilizando a seguinte fórmula:
1 N
N 1
xi x
2
14) Dados dois vetores de n elementos, calcule o seu produto escalar. (O produto escalar de dois vetores
v1 e v2 é dado por: produto = v1[0]*v2[0]+ v1[1]*v2[1]+... +v1[n]*v2[n]).
15) Leia 2 vetores com 10 elementos cada. Considerando cada vetor como sendo um conjunto,crie um
terceiro vetor, que seja a união dos dois primeiros, e um quarto, que seja a intersecção entre os dois
primeiros.
16) Desenvolva um programa em Java que receba do usuário n números inteiros positivos (aonde n será
informado pelo usuário) e os armazene em um vetor. Para cada elemento desse vetor deverá ser
cálculo do fatorial e o resultado deverá ser armazenado em outro vetor. Depois imprima cada um dos
elementos de cada vetor.
17) Vetor suavizado é uma técnica utilizada para cálculos de configuração de cores, para 50 elementos
reais, conforme regra abaixo. Ler os valores do vetor V e calcular e imprimir o vetor suavizado S.
S[I]=(V[I-1]+V[I]+V[I+1])/3, se I <> 1 e I <> 50;
S[I]=(V[I]+V[I+1])/2, se I = 1;
S[I]=(V[I-1]+V[I])/2, se I = 50;
18) Construa um algoritmo que preencha um vetor com N elementos (aonde N será informado pelo
usuário) utilizando a série de Fibonacci. Após isto imprima o conteúdo do vetor na tela. Exemplo de
valores da série: {1,1,2,3,5,8,13,21,34,55,89,144,233,377,...}
Pág.: 84/94
Prof. Daniel Oliveira
Arrays multidimensionais
Até agora vimos arrays de apenas uma única dimensão, também denominados de vetores. Mas, podemos ter
os chamados arranjos de várias dimensões. Imagine que cada elemento de um vetor seja outro vetor, e cada
elemento desse vetor seja também outro vetor, e, assim por diante. Ou seja, arranjos com mais de uma
dimensão são na realidade arranjos de arranjos – ver Figura 66.
Arranjo
Multi
0 0 1 ... N
1 0 1 ... N
...
0 1 ... N
N
Quando o arranjo armazenado em cada elemento tem a mesma quantidade de elementos podemos ter uma
estrutura que é associada a uma matriz. Muitas vezes, arranjos multidimensionais são associados a matrizes,
mas, eles podem ter estruturas bem diferenciadas. Na Figura 67, temos a representação uma array com 3
linhas (vetor de três de elementos) e 5 colunas (cada elemento do vetor de 3 elementos é um arranjo com
cinco elementos).
A declaração de uma matriz utiliza também os colchetes, assim como os vetores. Utiliza-se um par de
colchetes ([]) para cada dimensão a ser incluída na matriz. Por exemplo:
Pág.: 85/94
Prof. Daniel Oliveira
Na linha de código acima, temos o seguinte: uma array de inteiros (todos os elementos de todos arranjos
nessa array deverão ser inteiros). Sendo que teremos um arranjo de 3 elementos (linhas) e cada arranjo
alocado nesse arranjo será de 5 elementos (colunas).
Cada elemento no array a é identificado por uma expressão de acesso ao array da forma: a [ linha ] [coluna]:
Como os arrays unidimensionais, os arrays multidimensionais podem ser inicializados na sua declaração:
Os valores do inicializados são agrupados por linha entre chaves. O compilador conta o número de
inicializadores de array aninhados (representado por conjuntos de chaves dentro das chaves externas) na
declaração de array para determinar o número de linhas no array Matriz.
Pelo fato de arrays multidimensionais sejam arranjos de arranjos, podemos ter estruturas bem mais flexíveis:
int[][] b = {{1,2},{3,4,5}};
• Cria um array de inleiros b com dois elementos (determinados pelo número de inicializadores de array
aninhados) que representam as linhas do array bidimensíonal.
• Cada elemento de b é uma referência a um array unidimensional de variáveis int.
• O array da linha O (zero) é um array unidimensional com dois elementos (1 e 2)
• E o array da linha 1 é um array unidimensional com três elementos (3,4 e 5)
Pág.: 86/94
Prof. Daniel Oliveira
No Figura 69, temos um código mostrando uma forma de percorrer agora estes arranjos. Reparem que para
cada “dimensão” extra temos uma estrutura de repetição aninhada dentro de outra – mas uma vez, são
arranjos de arranjos.
Pág.: 87/94
Prof. Daniel Oliveira
Exercícios
1) Elaborar um algoritmo que lê uma matriz M(6,6) e um valor A e multiplica a matriz M pelo
valor A, exiba o resultado.
a. Da linha 4 de M
b. Da coluna 2 de M
c. Da diagonal principal
d. De todos os elementos da matriz M
3) Escrever um algoritmo que lê uma matriz A(5,5) e a escreva. Verifique, a seguir, quais os
elementos de A que estão repetidos e quantas vezes cada um está repetido. Escrever cada
elemento repetido com uma mensagem dizendo que o elemento aparece X vezes em A.
5) Faça um algoritmo que calcule a média dos elementos da diagonal principal de uma matriz
10 X 10 de inteiros.
7) Faça um algoritmo que leia uma matriz 4x9 de inteiros. calcule e mostre a soma das linhas
pares da matriz.
8) Faça um algoritmo que leia uma matriz 50x50 de números reais. A seguir, multiplique
cada linha pelo elemento da diagonal principal daquela linha. Mostre a matriz após as
multiplicações.
9) Faça um programa que leia duas matrizes 3x3 e realize a soma da duas e a multiplicação das mesmas.
Deverá ser exibido as duas matrizes originais, a matriz de soma e a matriz de multiplicação.
10) Escrever um algoritmo que lê uma matriz M(12,13) e divida todos os 13 elementos de
cada uma das 12 linhas de M pelo maior elemento em módulo daquela linha. Escrever a
matriz lida e a modificada.
12) Suponha que você tenha uma array como da imagem abaixo:
Faça um programa em Java que irá produzir a transposição da mesma. Como a figura:
Pág.: 89/94
Prof. Daniel Oliveira
13) Faça um programa em Java que permita que dois usuários jogue o Jogo da Velha, a cada iteração de
forma alternada o jogador deverá indicar a posição a ser preenchida pelo “X” ou “O”. Por exemplo:
Pág.: 90/94
Prof. Daniel Oliveira
Anexos
Anexo A
Hierarquia do Eclipse
1º) Workspace - é a área de trabalho que pode conter vários projetos (aplicações).
3º) Package - agrupamento de classes afins - se não definido, usa o pacote default . Normalmente cada
programa seu ficará num Package;
4º) Class - uma classe escrita dentro de um arquivo. Normalmente, os primeiros programas são compostos
por apenas uma classe.
Criação do primeiro programa: Os seguintes passos mostram a criação do projeto, pacote e classe,
respectivamente nos botões:
Obs: se estes botões não aparecem, selecione a opção “Java” dentro do botão “Open Perspective” acima e à
direita.
Criação do projeto:
i Clique no botão “New Java Project” (ou selecione pelo menu: File - New - Project - Java Project - Next)
ii digite: ‘Programas Algoritmo I’ (primeira letra sempre em maiúsculo).
iii Finish
Criação do pacote:
i Selecione o projeto que acabou de ser criado (janela Package Explorer à esquerda)
ii Clique no botão “New Java Package” (ou selecione pelo menu: File - New - Package)
iii Digite: ‘exercicio01’ (primeira letra sempre em minúsculo).
iv Finish
Pág.: 91/94
Prof. Daniel Oliveira
Criação da classe:
i Clique no botão “New Java Class” - Class (ou selecione pelo menu: File - New - Class)
ii Em name digite: Principal, para o nome da classe (primeira letra sempre em maiúsculo).
iii Como esta classe é de execução final então ela deve possuir o método main( ). Para isto
marque a caixa: public static void main (String[] args)
iv Finish
v Aparecerá o seguinte código:
public class Principal {
/**
* @param args
*/
Pág.: 92/94
Prof. Daniel Oliveira
Anexo B
Uma outra forma de interagir com usuário (exibição de mensagens e obtenção de valores) é o
uso da classe JOptionPane. Esta é uma classe que faz parte da biblioteca swing do Java
(componentes visuais do Java).
Para utilizar esta classe para obter informações é necessário o uso do método
ShowInputDialog, que diferentemente do scanner todas as informações são retornadas em
string e devem ser convertidas para os tipos necessários.
import javax.swing.JOptionPane;
JOptionPane.showMessageDialog(null,
"Oi " + name + ". Você tem "
+ age + " anos!");
Pág.: 93/94
Prof. Daniel Oliveira
Referências
CORMEN, Thomas H.; LEISERSON, Charles Eric.; RIVEST, Ronald L.; STEIN, Clifford. Algoritmos:
teoria e prática. Rio de Janeiro Campus, 2002. 916 p. ISBN 9788535209266
DEITEL, Harvey M.; DEITEL, Paul J. Java: como programar. 6. ed. São Paulo: Prentice Hall, 2005.
1110 p. ISBN 9788576050193
GOODRICH, Michael T.; TAMASSIA, Roberto,. Estruturas de dados e algoritmos em Java. 2. ed.
Porto Alegre, RS: Bookman, 2004. 584 p. ISBN 8536300434
ORACLE. Oracle Technology Network for Java Developers. Disponível em: <
http://www.oracle.com/technetwork/java/index.html>. Acesso em: 16 Agosto de 2011.
ZIVIANI, Nivio. Projeto de algoritmos : com implementações em Pascal e C. 4. ed. São Paulo:
Pioneira, 1999. 267 p. ISBN 8522101744
Pág.: 94/94