Você está na página 1de 85

NCLEO DE TECNOLOGIA

DEPARTAMENTO DE CINCIA DA COMPUTAO


BACHARELADO EM INFORMTICA

ALGORITMOS
E
TCNICAS DE DESENVOLVIMENTO
DE PROGRAMAS
Implementao: Java

Profa. Msc. Liliane Jacon

1o. sem. 2013

INDICE
Exemplo da compilao e execuo de um programa exemplo em Java
Ementa das disciplinas Algortimos e Tcnicas e desenvolvimento de Programas
1. Conceitos bsicos
Identificadores
Tipos de dados
Operadores e expresses computacionais
2. Introduo ao Java
Caractersticas do Java
Ferramentas de desenvolvimento
Utilizao da linguagem Java com NetBeans 6.8
Leitura de variveis em Java
Abertura de um projeto em Java
3. Tcnicas de Programao
3.1 Estrutura sequencial
3.2 Comandos de entrada e sada
3.3 Comandos de seleo: simples, composta, ternria, mltipla escolha (Switch)
3.4 Comandos de Repetio (FOR, WHILE e DO....WHILE)
3.5 Funes e passagem de parmetros em Java
4. Vetores (arrays)
Matrizes arranjos bidimensionais
5. Arquivos
Arquivos texto
Arquivos binrios com acesso aleatrio
6. Conceitos de Programao Orientada a Objetos (POO)
Definio de objetos e mtodos
Classes, instncias e mensagens
Mtodos construtores e sobrecarga de mtodos
Encapsulamento
Herana simples
Modificadores de acesso public, protected e private
Polimorfismo
Classes Abstratas
Interface
Este livro no tem a pretenso de abordar algoritmos (implementados em Java) de forma
completa e total. Na verdade, a idia que ele sirva de ponto de partida. Ele destinado
para acadmicos iniciantes na implementao de algoritmos na linguagem Java.

Exemplo da compilao e execuo de um programa exemplo


Primeiro exemplo de um programa compilado atravs do IDE Gel.
O programa a seguir, exibe na tela do computador, a mensagem Al mundo.
Repare que todo a estrutura est dentro dos comandos public class PrimeiroExemplo. Ou
seja, estamos criando uma classe chamada PrimeiroExemplo e voc dever salvar o
programa com o nome de PrimeiroExemplo.java. No iremos abordar o que uma classe
neste momento, que um conceito da programao orientada a objetos. Este livro ir
aborda com mais detalhes o incio da programao orientada a objetos, no captulo 3.

Ao compilar e em seguida, executar o programa PrimeiroExemplo.java, temos:

Disciplina: ALGORITMOS
Professora: Liliane da Silva Coelho Jacon

Carga Horria: 60 h/a


Crdito: 03 :
Perodo: 1
Ementa: Desenvolvimento de algoritmos estruturados, utilizando tipos de dados simples e estruturados.
Construo de algoritmos por refinamentos sucessivos. Implementao, depurao e testes de algoritmos atravs de
uma linguagem de programao estruturada.
Objetivos Especficos: Capacitar o aluno a analisar problemas e projetar, implementar e validar solues para os
mesmos, atravs do uso de metodologias, tcnicas e ferramentas de programao que envolvam os elementos
bsicos da construo de algoritmos e programas de computador
Metodologia:
Aulas expositivas, tarefas e pesquisas bibliogrficas extra-classe e prticas de laboratrio utilizando recursos
computacionais (Hardware e Software) disponveis nos laboratrios didticos de informtica.
Avaliao:
Mf = mdia final
Pbx = Prova bimestral (escrita, individual e sem consulta) **
Trabx = mdia de todas as atividades (exceto a prova bimestral)
Mdia das Provas = 7 * [(Pb1 + Pb2)/2]
Mdia dos Trabalhos = 3 * Trabx
Mf = Mdia das Provas + Mdia dos Trabalhos
Contedo Programtico (Algoritmos 1.perodo)
1. VISO DO AMBIENTE COMPUTACIONAL DE DESENVOLVIMENTO
1.1 Conceitos de linguagens de programao e de ambiente de desenvolvimento
1.2 Editorao do programa fonte
1.3 Compilao: conceitos de sintaxe e semntica
1.4 Depurao
1.5 Documentao interna
2. IMPLEMENTAO BSICA DE ALGORITMOS EM LINGUAGEM PROCEDIMENTAL
2.1 Sintaxe e semntica da Linguagem C
2.2 Tipos primitivos de dados, operaes e expresses
2.3 Comando de atribuio
2.4 Comandos de entrada e de sada de dados
2.5 Estruturas algortmicas de seleo
2.5.1 Seleo simples
2.5.2 Seleo composta
2.5.3 Seleo de mltipla escolha
2.6 Estruturas de Repetio
2.6.1 Repetio com varivel de controle (for)
2.6.2 Contadores e Totalizadores
2.6.3 Repetio com teste lgico no incio (while)
2.6.4 Repetio com teste lgico no final (do..while)
2.7 Estruturas de Dados
2.7.1 Variveis compostas homogneas
2.7.1.1 Variveis compostas unidimensionais
2.7.1.2 Cadeia de caracteres (strings)
2.7.1.3 Variveis compostas multidimensionais
3. EMPREGO DE RECURSOS DE LINGUAGEM PROCEDIMENTAL JUNTO S TCNICAS DE
PROGRAMAO
3.1 Programao por refinamentos sucessivos (Top Down)
3.2 Desenvolvimento de aplicaes e estudo de casos

Disciplina: Tcnicas e Desenvolvimento de Programas TDP


Professora: Liliane da Silva Coelho Jacon

Carga Horria: 100 h/a


Crdito: 05
Perodo: 2
Ementa: Desenvolvimento de algoritmos, utilizando tipos de dados pr-definidos e estruturados. Passagem de parmetros.
Implementao, depurao e testes de algoritmos atravs das tcnicas da programao estruturada. Conceituao de
programao orientada a objetos. Desenvolvimento de algoritmos segundo a metodologia de programao orientada a objetos.
Objetivos: Capacitar o aluno a analisar problemas e projetar, implementar e validar solues para os mesmos, atravs do uso de
metodologias, tcnicas e ferramentas de programao que envolvam os elementos bsicos da construo de algoritmos e
programas de computador
Metodologia: Aulas expositivas, tarefas e pesquisas bibliogrficas extra-classe e prticas de laboratrio utilizando recursos
computacionais (Hardware e Software) disponveis nos laboratrios didticos de informtica.
Avaliao:Mf = mdia final
Pbx = Prova bimestral (escrita, individual e sem consulta) **
Trabx = mdia de todas as atividades (exceto a prova bimestral)
Mdia das Provas = 7 * [(Pb1 + Pb2)/2]
Mdia dos Trabalhos = 3 * Trabx
Mf = Mdia das Provas + Mdia dos Trabalhos
Contedo Programtico
1. VISO DO AMBIENTE COMPUTACIONAL DE DESENVOLVIMENTO
Conceitos de linguagens de programao e de ambiente de desenvolvimento
Editorao do programa fonte
Compilao: conceitos de sintaxe e semntica
Depurao e Documentao interna
2. IMPLEMENTAO BSICA DE ALGORITMOS EM LINGUAGEM JAVA
2.1 Sintaxe e semntica da Linguagem C
2.2 Tipos de dados estruturados, operaes e expresses
2.3 Estruturas de Dados
2.3.1 Variveis compostas homogneas
2.3.1.1 Variveis compostas unidimensionais
2.3.1.3 Variveis compostas multidimensionais
2.4 Trabalhando com arquivo texto: criao, alterao, operaes de Input/Output
3. EMPREGO DE RECURSOS DE LINGUAGEM JUNTO AS TCNICAS DE PROGRAMAO
3.1 Escopo de variveis
3.2 Funes: passagem de parmetros por valor e por referncia
4. Arquivos
4.1 Trabalhando com arquivos textos e arquivos binrios
4.2 Funes de manipulao de arquivos: abertura, criao e fechamento
4.3 Comandos de leitura e gravao
4.4. Acesso sequencial e acesso direto (aleatrio)
4.5 Exerccios de leitura, consulta, alterao e gravao de dados
5. ORIENTAO A OBJETOS (implementao em linguagem Java)
Definio de Objetos e Mtodos
Classes, Instncias e Mensagens
Mtodos (Mtodos Construtores / Sobrecarga de construtores)
Encapsulamento e Reusabilidade
Herana Simples
Modificadores de acesso Public, Private e Protected
Referncia Bibliogrfica:
CORMEN,Thomas H et al. Algoritmos: teoria e prtica. trad. 2.ed. Rio de Janeiro: Campus/Elsevier, 2002.
DEITEL, H.M. & DEITEL, P.J. Java: como programar. 6.ed.So Paulo, Pearson Prentice Hall, 2005.
FARRER, H. et. al. Programao Estruturada de Computadores Algoritmos Estruturados - 3 Edio. Rio de
Janeiro: Editora Guanabara, 1999.
FORBELLONE, A. L. VILLAR; EBERSPACHER, H. FREDERICO; Lgica de Programao - 2 Edio. So Paulo:
Makron Books, 2000.
SEBESTA, Robert W. Conceitos de Linguagens de Programao. 4.ed. trad. Jos Carlos Barbosa dos Santos.
Porto Alegre: Bookman, 2000.

1. Conceitos Bsicos
Algoritmo
Seqncia de passos que visam atingir um determinado objetivo. uma redao que deve descrever
de forma lgica e sem ambigidades, os passos (aes) a serem seguidos para se resolver um
problema especfico que tenha um comportamento padro em sua soluo. Exemplo: receita de
bolo.

Linguagens naturais e Linguagens Computacionais


Existem as linguagens naturais (utilizada para a comunicao entre os humanos) e as linguagens
computacionais (para a comunicao entre o computador e o homem).
Exemplo de linguagens computacionais: C, C++, C#, Java, Pascal, Delphi, Ruby, Python.

Sintaxe x Semntica
Numa linguagem, a sintaxe dita as regras de como as frases devem ser construdas corretamente
(verbo, sujeito, ...). A semntica se preocupa com o significado da frase construda (entendimento).
Exemplo: Descoloridas idias verdes sonham furiosamente
Sintaxe correta, mas a semntica est confusa!
Observao: A linguagem computacional utilizada neste livro ser a linguagem Java. Isto significa
que na resoluo de algoritmos utilizando esta linguagem, temos que observar as regras de sintaxe
mas tambm nos preocuparmos com a semntica (em qual sequncia as aes devem ser realizadas
para atingir o objetivo proposto no algoritmo)

Histria da Linguagem Java


O Java evoluiu a partir do C++, que evoluiu do C. A linguagem C foi desenvolvida por Dennis
Ritchie da Bell Laboratories e foi originalmente implementada em 1972. Atualmente, a maior parte
do cdigo para sistemas operacionais de uso geral (por ex. laptops, desktops, estaes de trabalho e
pequenos servidores) escrita em C ou C++. O C++ uma extenso do C, escrita por Bjarne
Stroustrup em 1980, na Bell Laboratories. O C++ permite implementar programas orientados a
objetos.
Em 1991, a Sun financiou um projeto que resultou numa linguagem que foi batizada de Java,
devido a visita da equipe da Sun a uma cafeteria local que possua este nome. O Java utilizado
para desenvolver aplicativos corporativos de grande porte, aprimorar a funcionalidade de servidores
Web, fornecer aplicativos para dispositivos voltados para o consumo popular (celulares, pagers,
PDAs, smartphones), etc.

Programao Estruturada e Programao Orientada a objetos


Um paradigma de programao fornece (e determina) a viso que o programador possui sobre a
estruturao e execuo do programa.
Programao estruturada uma forma de programao de computadores que preconiza que todos
os programas possveis podem ser reduzidos a apenas trs estruturas: sequncia, deciso e iterao.
A programao estruturada orienta os programadores para a criao de estruturas simples em seus
programas, usando as subrotinas e as funes. A programao estruturada no permite o uso de
goto.
Apesar de ter sido sucedida pela programao orientada por objetos, pode-se dizer que a
programao estruturada ainda marcantemente influente, uma vez que grande parte das pessoas
ainda aprendem programao atravs dela. Neste livro, iniciaremos nosso estudo atravs da
implementao de algoritmos atravs da programao estruturada.
Na Programao Orientada a Objetos, programadores podem abstrair um programa como uma
coleo de objetos que interagem entre si. Ex: Java, C#,C++, Python, Ruby.

Segundo Sebesta, linguagens projetadas em funo da arquitetura Von Newmann, so


chamadas de linguagens imperativas. Em um computador de Von Newmann, tanto os dados
como os programas so armazenados na mesma memria. A CPU executa as instrues.
Devido a esta arquitetura, os recursos centrais da linguagens imperativas so as variveis,
as instrues de atribuio e a forma iterativa de repetio.
As linguagens funcionais aquela cujo principal meio de fazer computaes aplicando
funes a determinados parmetros. A programao pode ser feita em uma linguagem
funcional sem o tipo das variveis usadas nas imperativas, sem instrues de atribuio e
sem iterao. Por exemplo: LISP.
No final da dcada de 1970, iniciou-se uma mudana das metodologias de projetos de
programas orientadas para o processo para as orientadas a dados. Colocando de maneira
simples, os mtodos orientados a dados enfatizam o projeto de dados, concentrando-se no
uso de tipos de dados abastratos para resolver problemas. Os passos mais recentes na
evoluo do desenvolvimento de software orientado a dados, que se iniciou em medados da
dcada de 80, o projeto orientado a objeto. A metodologia orientada a objetos inicia-se
com a abstrao de dados, a qual encapsula o processamento com objetos de dados e oculta
o acesso a eles, e adiciona herana e vinculao dinmica de tipos. Herana um conceito
poderoso que permite a reutilizao dos softwares existentes.
As linguagens de programao orientadas a objeto mais populares desenvolveram-se a
partir das imperativas.
Objetos de um algoritmo
Um algoritmo a descrio de aes que manipulam objetos previamente definidos em
funo do tempo.
Dada a figura ao lado, faa um algoritmo que calcule
b
o valor da rea da mesma, sabendo que os valores de
a e b valem respectivamente 3 e 5.
a
Objetos: rea, a, b
Incio das aes
Armazene o valor 5 no objeto a
Armazene o valor 3 no objeto b
Calcule a x b e armazene o resultado no objeto rea
Informe o valor armazenado no objeto rea
Fim das aes
Observe que a resoluo do algoritmo acima funciona apenas para um retngulo cujas
medidas sejam 3 e 5. E se desejamos um algoritmo genrico, que funcione para qualquer
retngulo?
Objetos: rea, a, b
Incio das aes
Conhea o valor da altura do retngulo e atribua-o ao objeto a
Conhea o valor do comprimento do retngulo e atribua-o ao objeto b
Calcule a x b e atribua o resultado no objeto rea
Informe o valor armazenado no objeto rea
Fim das aes
7

Argumentos de Entrada e Sada


Argumento de entrada: so os valores que precisam ser fornecidos, de alguma
forma, para que o problema possa ser resolvido.
Argumento de sada: so os valores que do a resposta ao problema proposto.
Observao: repare que no algoritmo acima, os objetos a e b so argumentos de entrada e
que o objeto rea um argumento de sada (resultado).
Exerccios
1) Faa um algoritmo que calcule o dimetro, a rea e a circunferncia de um crculo,
sabendo que o nico dado disponvel o seu raio.
Dimetro = 2 * raio
rea = PI * raio2
Circunferncia = 2 * PI * raio
2) Construa um algoritmo para calcular as razes de uma equao de 2o. grau, sendo os valores A,
B, C fornecidos pelo usurio. Equao na forma ax2 + bx + c = 0
exemplo== 2x2 + 3x 2 = 0
delta=25 e r1=meio e r2=-2
3) Faa um algoritmo que calcule a rea de um triangulo retngulo, sabendo que os valores de sua
base e altura sero fornecidos pelo usurio.
4) Fazer um algoritmo que troque os valores de 3 objetos A, B e C
5) Construa um algoritmo que calcule a mdia aritmtica entre 4 notas fornecidas pelo usurio.

1.1 Identificadores
Suponha o seguinte algoritmo:
Objetos: x, y
Aes: atribua 6 ao objeto x
Calcule 2 * x e atribua o resultado ao objeto y
Calcule 9 * y e atribua o resultado ao objeto x
Repare que o objeto x, no algoritmo acima, modificado durante a execuo do mesmo.
Os objetos dos algoritmos sero chamados de identificadores.
Um identificador s ir armazenar um nico valor por vez; esse valor ser sempre o ltimo valor
armazenado.
Regras para escolha dos nomes dos identificadores:
1. use somente letras e nmeros
2. o primeiro caracter do identificador deve ser sempre uma letra
3. no permitido o uso de caracteres especiais, tais como: ; @ # $ % ? * espao
acentuao etc
4. permitido a utilizao de underline entre palavras (ex. salario_Bruto, nome_do_cliente)
Vlidos
X
total
soma
salario
salarioBruto
salarioHora

No-vlidos
salrio bruto
@mail
taxa%
1x
Salrio-hora
nome do funcionrio

Identificadores de dados esto associados a 4 caractersticas:

Memria

nome

contedo

6
2F8D

nome do identificador (sempre utilize nomes sugestivos)


tipo (tipo de informao armazenada: texto, nmero, caracter)
endereo de clula de memria

Endereo de
memria do x

valor armazenado (contedo)

OBS: na linguagem Java, existe diferena entre letras minsculas e letras


maisculas. Ex: Total diferente de total.

2. Introduo ao Java
Como j foi citado anteriormente, Java uma linguagem de programao orientada a
objetos, desenvolvida por uma pequena equipe de pessoas na Sun Microsystems. A
seguir sero apresentadas as caractersticas do Java, o ambiente, as ferramentas e um
passo a passo proporcionando ao acadmico que nunca utilizou o editor NetBeans para
implementar seus algoritmos.

2.1 Caractersticas do Java


As principais caractersticas da linguagem Java so:
- uma linguagem de alto nvel, com sintaxe extremamente similar do C++;
- possui vrias caractersticas de outras linguagens, como Smalltalk e Modula-3;
- o compilador mais utilizado o javac da Sun. Ele transforma arquivos-fonte java (.java)
em arquivos de bytecodes (.class).

compilador

Bytecode

JVM

Processado
r

Figura 2: Ambiente JAVA

De acordo com a figura 2, uma vez gerado o arquivo .class, ele deve ser passado JVM
instalada no computador. No caso mais comum, a JVM utilizada a distribuda pela Sun
em seu JDK (Java Developers Kit), denominada java.

2.2 Ferramentas para desenvolvimento em Java


A Sun, ao lanar a linguagem Java, ps disposio gratuitamente o pacote JDK - Java
Developer's Kit, que inclui, entre outros:
Javac - o compilador de arquivos .java para bytecodes .class;
Java - a JVM especfica para a plataforma;
Appletviewer - visualizador de applets, sem a necessidade de execuo das mesmas
num browser.

2.3 Comentrios
Os comentrios so declaraes no compiladas que podem conter qualquer informao
textual que voc queira adicionar ao cdigo-fonte para referncia e documentao de seu
programa. Existem trs tipos de comentrios em Java:
// Este um comentrio de uma s linha
/* Este um comentrio de uma ou mais linhas */
/** Este um comentrio de documentao */

2.4 Exemplo
O algoritmo abaixo tem a finalidade de imprimir uma mensagem na tela.
public class mensagemNetBeans
{

// inicio algoritmo
/**

inicio do comentrio

public = visto em qualquer lugar da aplicao


static = iniciado automaticamente pela JVM, sem precisar de uma instncia
void = Mtodo sem retorno (retorno vazio)
main = Recebe como parmetro um array de String.
String[] args = Array de argumentos que podem ser repassados na chamada do
programa.
fim dos comentrios
*/
public static void main(String[] args)
{

// inicio do main
System.out.println("Estamos no NetBeans!"); //Imprime na tela a frase

// fim do main

Note

// fim do algoritmo

que

toda

mensagemNetBeans.

estrutura
Ou

est

seja,

contida

esta

dentro

sendo

do

criando

comando
uma

public

classe

class

chamada

mensagemNetBeans e o usurio dever salvar o programa com o nome de


mensagemNetBeans.java. No ser abordado o que uma classe neste momento, por
ser um conceito da programao orientada a objetos (OO). Este livro ir abordar com
mais detalhes o incio da programao orientada a objetos, no captulo 5.

10

O mtodo main onde o programa inicia. Pode estar presente em qualquer classe. Os
parmetros de linha de comando so enviados para a array args[], do tipo String. Os
smbolos { e } significam, respectivamente, inicio e fim de um algoritmo, de um mtodo
e de uma classe etc.

2.5 Utilizao da Linguagem JAVA com editor NetBeans 6.8


A seguir apresentado um passo a passo desde a instao do Java at a execuo dos
primeiros programas.
O link para download do JAVA o seguinte:
http://java.sun.com/javase/downloads/widget/jdk6.jsp
Escolha a opo download JAVA JDK. Avance todas as opes e no precisa registrar.
Em seguida, clique no link abaixo para download do editor NetBeans 6.8:
http://netbeans.org/downloads/start.html?platform=windows&lang=pt_BR&option=java&ver
sion=6.8 Escolha a opo baixe aqui.
Ao terminar a instalao, o cone j criado. Basta clicar duas vezes nele e aparecer a
janela inicial do NetBeans (Figura 3).

Figura 3: Janela inicial do NetBeansIDE 6.8


O usurio dever escolher a opo Arquivo, conforme figura 4.

11

Figura 4: Opo Arquivo do editor NetBeans


Para fazer o primeiro projeto, o usurio dever escolher a opo Novo projeto ....
Aparecer uma janela, conforme apresentado na figura 5.

Figura 5: Novo projeto no NetBeans

12

O usurio dever clicar na opo prximo, j que a categoria JAVA e o projeto


aplicativo JAVA j esto selecionados. Aparecer a figura 6 onde dever ser digitado o
nome do projeto (javaPrimeiro) e, em seguida deve ser selecionado a opo Finalizar.

Figura 6: Novo Aplicativo JAVA

Aparecer do lado direito da janela (figura 7) o local onde ser digitado o cdigo fonte, ou
seja, o algoritmo propriamente dito.

Figura 7: Editor do algoritmo

13

O primeiro algoritmo ser para mostrar a mensagem Estamos no editor NetBeans.


O comando completo para impresso de uma mensagem System.out.println(). Dentro
dos parnteses coloca a mensagem entre aspas duplas.
Pode-se tambm digitar o comando System. (iniciando com letra maiscula). Aps o
ponto, aparecer uma biblioteca JAVA onde o usurio escolher o comando desejado
(figura 8).

Figura 8: Digitao do comando System.


Neste caso, o usurio dever clicar em out e colocar novamente o ponto (.) para
escolher o mtodo println, conforme apresentado na figura 9.

14

Figura 9: Digitao do comando System.out.


O usurio dever digitar a mensagem estamos no NetBeans, conforme figura 10.

Figura 10: Primeiro algoritmo

Em seguida, dever verificar se o cone de gravao (

) est habilitado, significando

que o algoritmo dever ser gravado. Caso contrrio, o NetBeans j efetuou a gravao.
Para executar o algoritmo, o usurio dever clicar no cone executar Main Project ... (

ou pressionar F6, conforme figura 11.

Figura 11: Como executar um algoritmo

15

O resultado do algoritmo aparecer no canto inferior direito, conforme apresentado na


figura 12.

Figura 12: Execuo de um algoritmo

Criao de um novo arquivo


Para implementar um algoritmo em JAVA, pode-se optar por criar:
- um novo projeto ou;
- um novo arquivo.
A diferena que quando se cria um novo projeto, pode-se colocar dentro dele vrios
arquivos (semelhante ao Excel, onde criado uma pasta e dentro dela vrias planilhas).
Para exemplificar, uma lista de exerccios de estrutura seqencial deve ser implementada
em apenas um projeto ProjEstruturaSequencial. Assim, todos os exerccios desta lista
estariam presentes dentro do projeto, sendo cada um deles um arquivo.
Para criar um novo arquivo, o usurio dever escolher no menu arquivo, a opo novo
arquivo. Em seguida, selecionar o projeto ao qual este arquivo estar vinculado e clicar na
opo prximo, conforme figura 13.

16

Figura 13: Criao de um novo arquivo

Na janela seguinte, o usurio dever digitar o nome da Classe, ou seja, o nome do


arquivo implementado e clicar na opo Finalizar (figura 14).

Figura 14: Identificao de um novo arquivo em JAVA (classe)


No editor NetBeans, o usurio ter que digitar public static void main (String[] args) antes
de iniciar a digitao do algoritmo, permitindo que o usurio consiga executar apenas este
arquivo. Outro detalhe que para executar o algoritmo ele dever clicar do lado esquerdo
em cima da classe main do arquivo que ele criou e, pressionar o boto direito do mouse
para escolher a opo executar arquivo, conforme figura 15.

17

Figura 15: Execuo de um algoritmo em JAVA (atravs do boto direito)

A execuo do programa ser realizada no canto inferior direito da janela, como mostra a
figura 16.

Figura 16: Resultado da execuo

Leitura de variveis em JAVA


Para fazer a leitura de variveis em JAVA necessrio utilizar um conceito de OO
(Orientao a Objetos) atravs de uma biblioteca. Neste livro, ser utilizado a biblioteca
Scanner. Normalmente necessrio corrigir a importao desta biblioteca, j que na
maioria das vezes ocorre um erro, conforme apresentado na figura 17.

18

Figura 17: Erro de Importao


Quando o usurio digita Scanner ler, ele est instanciando o objeto ler da classe
Scanner para receber as entradas (leituras de uma ou mais variveis).
Para corrigir as importaes das bibliotecas, o usurio dever escolher a opo mostrada
na figura 16 ou digitar as teclas de atalho (Ctrl + Shift + i).

Figura 18: Como Corrigir importaes


Em seguida escolher a opo OK na janela consertar todas as importaes, conforme
apresentado na figura 19.

19

Figura 19: Sentenas import

Figura 20: Execuo de um algoritmo com leitura de variveis

O usurio dever salvar e executar o programa (figura 18). Ele dever posicionar o mouse
no canto inferior direito do editor NetBeans para efetuar a leitura das variveis e verificar o
resultado (Figura 21).

20

Figura 21: Resultado da execuo de um algoritmo

Abertura de um projeto JAVA


Para abrir um projeto em JAVA basta escolher a opo arquivo, abrir projeto. Escolher o
local onde est armazenado o projeto e, clicar na opo abrir projeto, conforme figura 22.

Figura 22: Escolha do projeto

Em seguida, abre-se as pastas do lado esquerdo do editor, at surgir os fontes .JAVA,


conforme figura 23.

21

Figura 23:Abrindo o Main do projeto escolhido

O usurio poder fazer as modificaes necessrias e salv-las ou ento apenas


executar o programa.
Na tabela 9 so apresentados alguns exemplos de operaes na linguagem Java.

Tabela 9 :Exemplos de operaes


Operaes Significado
x += 6

x=x+6

x -= y

x=x-y

x *= 3

x=x*3

z /= 40

z = z / 40

22

3. Tcnicas de Programao
As tcnicas de programao so formas de se gerar programas, tendo como tipos principais a
Programao Seqencial, a Programao Estruturada e a Programao Orientada a Eventos e
Objetos. A princpio, apesar da linguagem Java ser orientada a objetos, os algoritmos sero
implementados atravs da programao estruturada.
Atravs das estruturas bsicas de controle (sequenciao, seleo e repetio) abordadas neste livro,
ser possvel a construo de algoritmos para solucionar os problemas propostos.

3.1. Estrutura Sequencial


Segundo Forbellone (2003), a estrutura seqencial corresponde a execuo de um conjunto de aes
primitivas em uma seqncia linear de cima para baixo e da esquerda para direita.

Exemplo: Faa um programa que leia um nome, um nmero inteiro e um nmero real e
exiba-os na tela.
Fonte em Java utilizando Console :
import java.util.Scanner;
public class leitura
{
public static void main(String args[])
{
int num;
double salario;
String nome;
Scanner entrada = new Scanner( System.in );
// leitura
System.out.print("\n Entre com um nome: ");
nome = entrada.nextLine();
System.out.print("\n Entre com um nmero inteiro: ");
num = entrada.nextInt();
System.out.print("\n Entre com um nmero real: ");
salario = entrada.nextDouble();
// exibe
System.out.printf("\nNome=%s Salrio=%8.2f Nmero int=%d\n",nome,salario,num);
} // main
} // class

23

Exerccios
1) Fornecidos os valores dos catetos de um triangulo retangulo, calcular e exibir a hipotenusa, o
permetro e a sua rea. Hipotenusa = sqrt(ca2 + co2)
2) Fornecido o valor de T, calcule o valor de W sabendo que:
W = 2T + 4X 3Y, onde X = 2T 4 e Y = T/2 + 4
3) Um funcionrio de uma empresa recebeu um abono de 20% sobre o seu salrio atual e mais uma
comisso de $1000,00 e sobre esse total, recebeu um aumento de 35%. Calcule o valor do abono, do
aumento e do salrio final aps estes reajustes, ao ser fornecido o seu salrio atual. Resoluo do
algoritmo na linguagem Java

Fonte em Java utilizando Console


import java.util.Scanner;
public class Funcionario
{
public static void main(String args[])
{
Scanner entrada = new Scanner( System.in );
String nome;
double salatual,abono,comissao,aumento,salbruto;
//entrada
System.out.println("\nFolha de Pagamento - 1 funcionario");
System.out.print("\n Entre com o nome do funcionario = ");
nome=entrada.nextLine();;
System.out.print("\n Entre com o salario atual = ");
salatual = entrada.nextDouble();
//calculos
abono = salatual * 0.20;
comissao = 1000.00;
aumento = (salatual + abono + comissao) * 0.35;
salbruto = salatual + aumento;
//saida
System.out.printf("\nAbono = %8.2f",abono);
System.out.printf("\nComissao = %8.2f",comissao);
System.out.printf("\nAumento = %8.2f",aumento);
System.out.printf("\nSalario Bruto = %8.2f\n",salbruto);
entrada.nextLine();
}
}

24

4) Elaborar um algoritmo que faa a converso de graus Fahrenheit para Celsius. O algoritmo deve
ler um valor em graus Fahrenheit e transform-lo atravs da frmula:

( F 32) * 5
9

5) Ao serem fornecidos um valor a ser pago e uma taxa de juros de multa, calcule e informe o valor
da multa e o total a ser pago. multa = valor * taxa
e
total_ser_pago = valor + multa
6) Um comerciante deseja saber qual o lucro percentual que ele est tendo com a venda de
mercadorias. Calcule o lucro percentual de uma mercadoria ao serem fornecidos o preo de compra
e o preo de venda da mesma. lucro = preo_compra - preo_venda

3.2 Estruturas de Seleo


Seleo simples
Permite determinar se um certo conjunto de instrues deve ou no ser executado.
SE (condio)
If (condio)
ento incio
{
(comandos);
(comandos);
fim;
}
Seleo composta
SE (condio)
ento incio
(comandos);
fim
seno incio
(comandos);
fim;

If (condio)
{
(comandos);
}
else {
(comandos);
}

Exerccios: Resolva os 3 exerccios a seguir utilizando a seleo simples (SE...ENTO)


1) Ler um nmero inteiro. Verifique e exiba se o nmero par ou mpar.
2) Ler um nmero inteiro. Verifique se o nmero negativo, nulo ou positivo.
3) Faa um algoritmo que receba trs notas de um aluno, calcule a mdia aritmtica entre as
trs notas e exiba mensagem de Aprovado ou Reprovado, considerando a mdia de
aprovao 6,0.
4) Dado um nmero inteiro, calcule o triplo do mesmo caso ele seja positivo ou nulo, ou o
dobro caso ele seja negativo.
5) Fazer um algoritmo que ao ser fornecido o salrio de um trabalhador, seja calculado o IR
sabendo que se o mesmo for inferior a $1000,00 o valor da alquota de 0%, caso
contrrio ser de 10%
OBS: refazer os exerccios acima utilizando a seleo composta (SE...ENTO...SENO)

25

Utilizando Operador Ternrio

import java.util.Scanner;
public class operadorTernario
{
public static void main(String args[])
{
Scanner entrada = new Scanner( System.in );
int num1, num2,maior;
//entrada
System.out.print("\n Entre com o primeiro numero= ");
num1=entrada.nextInt();
System.out.print("\n Entre com o segundo numero= ");
num2=entrada.nextInt();;
//calculos
maior = (num1 > num2)? num1: num2;
//saida
System.out.printf("\nPrimeiro numero = %d",num1);
System.out.printf("\nSegundo numero = %d",num2);
System.out.printf("\nMaior numero = %d\n",maior);
entrada.nextLine();
}
}

26

Estrutura de Mltipla Escolha (switch)

CDIGO FONTE (utilizando console)


import java.util.Scanner;
public class SelecaoMultipla2
{
public static void main(String args[])
{
Scanner entrada = new Scanner( System.in );
String x;
char letra;
//entrada
System.out.println(" 1 - Inclusao");
System.out.println(" 2 - Alteracao");
System.out.println(" 3 - Exclusao");
System.out.println(" 4 - Sair");
System.out.print("entre com a opo: ");
x=entrada.next();
letra = x.charAt(0); //obtm apenas a primeira letra digitada
//saida
switch (letra)
{
case '1': System.out.println("\nEscolheu incluso\n");
break;
case '2': System.out.println("\nAlterao\n");
break;
case '3': System.out.println("\nExcluso \n");
break;
default: System.out.println("\n Digite nros entre 1 e 4");
break;
}
entrada.nextLine();// parada para ler a tela, at o usurio digitar algo
}
}

27

Mtodo JOptionPane Interao


O mtodo System.out.println apresenta informaes na janela inferior direita do NetBeans.
A linguagem Java oferece diversas formas de interao com o usurio, sendo na grande
maioria, em janelas. Para evitar a criao de uma interface completa, podem-se utilizar as
chamadas caixas de dilogo.
A classe que implementa as caixas de dilogo, JOptionPane, se encontra no pacote
javax.swing, que contm diversas outras classes para interface com o usurio. Para utilizar
essa classe, utiliza-se o comando import.
Aps digitar o mtodo, selecione a opo cdigo-fonte e, em seguida corrigir as
importaes (<ctrl> + <shift> + <i>) e aparecer a seguinte linha de commando:
import javax.swing.JOptionPane;
A classe JOptionPane oferece diversos mtodos para criar diversos tipos de caixas de
dilogo. Por exemplo, o cdigo para exibir uma caixa de mensagem, utiliza-se o mtodo
showMessageDialog(...). O cdigo apresentado abaixo e a execuo na figura 26.
import javax.swing.JOptionPane;
public class TestaDialogo
{
public static void main(String args[])
{
JOptionPane.showMessageDialog(null,"Este um dilogo simples");
System.exit(0);
}
}

Obs: algumas classes como String, System, Integer e outras so parte de um pacote
especial, denominado java.lang. Esse pacote nunca precisa ser importado, pois so as
classes primitivas que compem a linguagem Java.
O primeiro parmetro (por enquanto) deve ser null. Note:
- que o mtodo showMessageDialog(...) um mtodo esttico (de classe) de JOptionPane,
no sendo necessrio instanciar objetos a partir de JOptionPane;
- a chamada para o mtodo System.exit(0): este mtodo geralmente utilizado para
encerrar um programa que utilize interface grfica.

Figura 26: caixa de mensagem

28

H outra forma de chamada para o mtodo showMessageDialog, a qual permite


melhorar o visual da caixa de mensagem (figura 27). Abaixo o cdigo.
JOptionPane.showMessageDialog(null,"Esta uma mensagem","Ateno",
JOptionPane.WARNING_MESSAGE);

Figura 27: caixa de mensagem com ttulo

O terceiro parmetro o ttulo que ser exibido na janela (ao invs de "Message")
O quarto parmetro controla o cone apresentado esquerda da janela:
JOptionPane.PLAIN_MESSAGE - nenhum cone
JOptionPane.ERROR_MESSAGE - cone de erro
JOptionPane.INFORMATION_MESSAGE - cone de informao
JOptionPane.WARNING_MESSAGE - cone de aviso
JOptionPane.QUESTION_MESSAGE - cone de interrogao

Existe um mtodo para exibir uma caixa de entrada: showInputDialog. Esse


mtodo retorna sempre a String que foi digitada pelo usurio. A seguir
apresentado um exemplo de cdigo e, na figura 28 a execuo.
import javax.swing.JOptionPane;
public class TestaDialogo
{
public static void main(String args[])
{
String nome;
nome = JOptionPane.showInputDialog("Digite o seu nome");
JOptionPane.showMessageDialog(null,"Seu nome "+nome);
System.exit(0);
}
}

29

Figura 28: Execuo da caixa de entrada


Assim como no mtodo showMessageDialog, h uma variao mais completa.
Veja o cdigo a seguir e a execuo na figura 29:
nome

JOptionPane.showInputDialog(null,"Por

favor,

digite

seu

nome","Ateno",

JOptionPane.WARNING_MESSAGE);

Figura 29: execuo da caixa de entrada c/ ttulo


OBS: como o mtodo JOptionPane utilizado com String, necessita-se utilizar o metodo
parseInt para transformar a string em um valor inteiro.
Exemplo:
String num = JOptionPane.showInputDialog(null, "\nEntre com um valor : ");
int n = Integer.parseInt(num);

// metodo que transforma uma string em um valor inteiro

insere(n); // chamado do mtodo para inserir o numero informado pelo usurio.

Para validar o boto cancel, faa a seguinte pergunta:


if(opc==null)
break;

O exemplo anterior referente a um menu de opes para executar as operaes


bsicas, ter o seguinte cdigo fonte e a seguinte execuo, utilizando as Caixas
de Dilogo:

30

CDIGO FONTE (utilizando Caixas de Dialogo)


import java.util.Scanner;
import javax.swing.JOptionPane;
public class SelecaoMultipla
{
public static void main (String args[])
{
String opcao;
opcao = JOptionPane.showInputDialog(null,
"---MENU---\n"+
"(I) Insere\n"+
"(R) Remove\n"+
"(E) Exibe\n"+
"(S) Sair\n");
opcao = opcao.toUpperCase();
char op = opcao.charAt(0); // obtem apenas a primeira letra digitada
switch (op)
{
case 'I': JOptionPane.showMessageDialog(null,"Insere");
break;
case 'R': JOptionPane.showMessageDialog(null,"Remove");
break;
case 'E': JOptionPane.showMessageDialog(null,"Exibe");
break;
default: JOptionPane.showMessageDialog(null,"Digite letras I/R ou E");
break;
}
}
}

Continuao dos exerccios utilizando a estrutura de seleo SE


6) Dados dois nmeros inteiros e distintos, construa um algoritmo que seja capaz de definir
qual o maior elemento.
7) Aps o conhecimento de um numerador e um denominador, construa um algoritmo para
fornecer o resto desta diviso (sem utilizar a funo %).
8) Dados dois nmeros inteiros, construa um algoritmo que seja capaz de definir se estes
so iguais, e caso isso no ocorrer, qual o menor elemento.
9) Construa um algoritmo que seja capaz de definir qual o maior elemento entre trs
nmeros fornecidos pelo usurio (A, B e C)
10) Dados 3 valores A,B.,C verificar se eles podem ser os comprimentos dos lados de um
triangulo e, se forem, verificar se compem um triangulo eqiltero, issceles, ou
escaleno. Informar se no compuserem nenhum triangulo.

31

Para verificar se triangulo: cada lado menor do que a soma dos outros dois lados
(A < B+C) e (B < A+C) e (C < A+B) se isto for verdade, ento triangulo
se trs lados iguais = triangulo eqiltero
se dois lados iguais = triangulo issceles
se trs lados diferentes = escaleno
11) Conhea um valor inteiro. Informe se o valor fornecido par ou mpar.
12) Construa um algoritmo que, tendo como dados de entrada dois pontos quaisquer do
plano P(x1,y1) e Q(x2,y2), imprima a distncia entre eles.
Distncia = raiz quadrada ( (x2 x1)2 +(y2-y1)2 )
13) Elabore um algoritmo que, dada a idade de um nadador, classifique-o em uma das
segintes categorias:
infantil A = 5-7 anos
infantil B=8 10 anos
juvenil A = 11 13 anos
juvenil B = 14 17 anos
senior = maiores de 18 anos
3.3 Estruturas de controle de iteraes (Repeties)
Esta estrutura utilizada quando se deseja executar um mesmo trecho do programa
repetidas vezes.
REPETIES
repetio com imprime meu nome 10 vezes:
varivel de
int i
controle
for ( i=0; i<10; i++)
System.out.printf(%s,\n Liliane);
FOR
Repetio com
teste no incio
WHILE

while (condio) comandos; Rotina para exibir os nmeros de 0 a 9


- ele executado desde que int i = 0;
Executa enquanto esta
a condio seja verdadeira while (i < 10)
condio for verdade
{
- testa a condio antes de
System.out.printf(\nNumero=%d,i);
entrar no lao
i++;
}

repetio com
teste no final
DO...WHILE

do
{
comandos;
}
while (condio);

String x;
char sexo;
Validao
do
{
System.out.print("entre com o sexo(F/M): ");
x=entrada.next();
sexo = x.toUpperCase().charAt(0); // 1a letra maiuscula
} while (!((sexo=='F')||(sexo=='M')));

32

Iterao com varivel de controle (FOR):


for (int i=0; i < 10 ; i++) // repete 10 vezes o trecho abaixo
{
comandos;
}
Calcule o valor do S para cada uma das sries abaixo:
a) S =

1
3
5
99
--- + --- + --- + ..... + ---1
2
3
50

Cdigo Fonte do exerccio A sobre srie


import java.util.Scanner;
import javax.swing.JOptionPane;
public class SerieExercA
{
public static void main (String args[])
{
float soma =0,r;
int i, j;
j=1;
String temp= "\n Calcula a serie item A \n\n";
for (i=1;i<51;i++)
{
r = j / i;
soma = soma + r;
j=j+2;
}
temp +="\n Resultado serie = "+String.format("%8.2f",soma);
JOptionPane.showMessageDialog(null,temp);
}
}

b) S =

21
22
23
250
--- + --- + ---- + ..... + ----50
49
48
1

c) S =

37x38 36x37 35x36


1x2
------- + ------- + ------- + ..... + ---1
2
3
37

d) S =

1
2
3
--- + ---- + ---- + ....
1
4
9

10
+ ----100

Calcule o valor das seguintes sries (utilize os 20 primeiros termos):


1000
997
994
a) S = -------- - ------- + ----- - .....
1
2
3
485
b) S = ----10

475
465
---- + ------ - ......
11
12

33

Exerccios utilizando o Comando FOR


1) Ler 30 nmeros inteiros. Para cada nmero lido, verificar e exibir se o mesmo par ou mpar.
2) Ler 20 nmeros inteiros. Para cada nmero lido, verificar e exibir se o mesmo nulo, positivo ou
negativo.
3) Ler 10 nmeros inteiros. Calcular e exibir o somatrio dos nmeros lidos.
4) Ler 20 nmeros inteiros. Calcular e exibir:
a. Soma dos nmeros negativos
b. Soma dos nmeros positivos
5) Ler 20 nmeros inteiros. Calcular e exibir:
a. Soma dos nmeros pares
b. Soma dos nmeros mpares
Cdigo Fonte do exerc.1: Ler 30 nmeros inteiros. Para cada nmero lido, verificar e exibir se o
mesmo par ou mpar

import java.util.Scanner;
public class ComandoForParesImpares
{
public static void main (String args[])
{
int i,num;
Scanner entrada = new Scanner( System.in );
for (i=1;i<=30;i++)
{
System.out.printf("\n Entre com %do. nmero inteiro: ",i);
num = entrada.nextInt();
if (num%2==0) //par
System.out.printf("%d um numero par\n",num);
else
System.out.printf("%d um numero impar\n",num);
}
}
}

Iterao com Teste no Incio (WHILE)


while (condio) comandos;
- os comandos dentro do WHILE so executados desde que a condio tenha
resultado verdadeiro (true)
- testa a condio antes de entrar no lao
Abaixo so ilustrados 2 exemplos contendo os erros mais comuns (aos iniciantes):

34

Exemplo 1:

int i = 10;
while (i < 10)

No executar o
comando dentro do while

System.out.printf(\nNumero=%d,i);
}

Exemplo 2:

int num = entrada.nextInt();


while (num > 0)

S entrar no while caso leia


um numero maior que zero

System.out.printf(\nNumero=%d,num);
}

PROBLEMA! Aps entrar neste while


(num>0) no consegue mais sair...
Loop infinito

1) Fazer um algoritmo para ler diversos nmeros informados pelo usurio, e aps cada
leitura exibir se o nmero par ou mpar. Considere que ao fornecer um valor negativo, o
usurio deseja encerrar a entrada de dados.

Entra Lido

Sai Lido

import java.util.Scanner;
public class ComandoWhileParesImpares
{
public static void main (String args[])
{
int i,num;
i=1;
Scanner entrada = new Scanner( System.in );
System.out.printf("\n Entre com %do. nmero inteiro: ",i);
num = entrada.nextInt();
while (num >= 0)
{
if (num%2==0) //par
System.out.printf("%d um numero par\n",num);
else
System.out.printf("%d um numero impar\n",num);
System.out.printf("\n Entre com %do. nmero inteiro: ",i+1);
num = entrada.nextInt();
i++;
}
}
}

2) Imprimir os nmeros de 1 at 100.

35

3) Ler 30 nmeros inteiros fornecidos pelo usurio, e exibir depois quantos nmeros mpares foram
informados. Informe tambm a quantidade de nmeros pares.
4) Calcular a soma de diversos nmeros reais informados pelo usurio. A entrada de dados termina
com o nmero 999.
5) Ler diversos nmeros reais e exibir qual foi o maior de todos. O cdigo 1 sinaliza o fim da
leitura.
6) Imprimir os quadrados dos nmeros inteiros de 1 a 10.
7) Imprimir os nmeros pares entre 2 e 50.
8) Ler 10 nmeros reais e imprimir o maior deles. Refaa para X nmeros.
9) Ler 100 nmeros e exibir o maior deles. Refaa o exerccio para X nmeros.
10) Ler 30 nmeros e exibir a soma dos nros que so divisveis por 5. Refaa o exerccio para X
nmeros
11) Ler diversos nmeros reais e exibir qual foi a soma. O valor 999 o cdigo de fim de
entrada.
12) Ler diversos nmeros reais e exibir quantos foram digitados. O valor 1 cdigo de fim de
entrada
13) Ler diversos nmeros e exibir quantos nmeros mpares foram digitados. Considere o valor
999 como cdigo de fim de entrada.
14) Ler diversos nmeros e informe quantos nmeros 10 foram digitados. O valor 0 cdigo de
fim da entrada.
15) Ler diversos nmeros e exibir qual foi o menor e o maior nmero informado.
16) O usurio deve informar um nmero inteiro e o programa deve calcular e informar o fatorial do
nmero digitado pelo usurio.
17) Escreva um programa para ler 15 nmeros inteiros e positivos e depois informar: qual o maior
nmero, qual o menor nmero e a mdia dos nmeros lidos.
18) Escreva um programa que informe quais nmeros inteiros que divididos por 11 do resto igual
a 5, no intervalo de 1000 a 1999.

Iterao com Teste no Final (DO ... WHILE)


Sintaxe
do
{
Comando1;
Comando2;
ComandoN;
} while (condio);

Repetir os comandos
dentro da estrutura at que
a condio seja falsa

Veja um exemplo de Validao utilizando a estrutura DO..WHILE. No exemplo abaixo, o usurio precisa
digitar o caracter F (feminino) ou M (masculino) para o sexo, caso contrrio o programa no sair do loop
(repetio).
String x;
char sexo;
do
{
System.out.print("entre com o sexo(F/M): ");
x=entrada.next();
sexo = x.toUpperCase().charAt(0); // 1a letra maiuscula
} while (!((sexo=='F')||(sexo=='M')));

36

19) Escreva um programa que leia um conjunto N de informaes contendo, cada uma delas, a
altura e o sexo da pessoa (M masculino e F feminino) Calcule e mostre:
a maior e a menor altura;
a mdia das alturas das mulheres
a mdia das alturas dos homens
20) Escrever um programa que gere e informe 5 primeiros nmeros perfeitos. Um nmero perfeito
aquele que igual a soma dos seus divisores. Ex: 28 = 1+2+4+7+14
21) Faa um programa para que um usurio adivinhe um nmero informado por outro. Inicialmente, um
usurio fornece um nmero para o programa, e depois o outro usurio deve informar nmeros at acertar
( claro que o segundo usurio no v o nmero registrado pelo primeiro). Para ajudar, a cada tentativa o
computador deve exibir a mensagem Seu nmero maior do que o meu ou Seu nmero e menor do
que o meu. Ao acertar, imprima tambm quantas tentativas foram necessrias.

22) Faa um algoritmo que exiba os 15 primeiros nmeros de Fibonacci. A seqncia de


Fibonacci, comea com 1 e 1, e cada nmero subseqente a soma dos dois anteriores. Veja: 1
1 2 3 5 8 13 ....
23) Existem dois candidatos a uma vaga de presidente de clube, Firmino e Eugnia. Feita a eleio, os votos
so digitados (cada entrada contm o voto de um eleitor). Cada voto foi codificado da seguinte forma: 1
representa voto de Firmino, 2 em Eugnia, o voto 0 indica Branco e 9 voto nulo. Deseja-se saber por
um programa:
a) o nome do candidato vencedor
b) o nmero de votos em branco;
c) o nmero de votos nulos;
d) a quantidade de eleitores que votaram.
Estabelea um cdigo que termine a entrada de dados, e esquea os empates.

24) Faa um programa para ler diversos caracteres informados pelo dispositivo de entrada. Depois
informe:
a) a quantidade total de letras A e Z informados
b) a quantidade de caracteres informados
c) a quantidade de consoantes
d) a maior letra informada (de acordo com a ordem alfabtica)
e) a quantidade de pontos de exclamao informados
a condio de sada da leitura o caractere #, considere apenas letras maisculas.

25) A prefeitura de uma cidade fez uma pesquisa entre seus habitantes, coletando dados sobre o
salrio e nmero de filhos de cada chefe de famlia. Foram coletados apenas os dados dos
chefes de famlia. A prefeitura deseja saber:
a) mdia do salrio dos chefes de famlia
b) mdia do nmero de filhos
c) maior salrio
d) percentual de pessoas com salrio de at $200,00

27) Faa um algoritmo para imprimir a quantidade de nmeros primos entre 1 e 1000.
28) Foi realizada uma pesquisa dos carros usados que esto venda na cidade de Porto Velho.
O programa deve ler as seguintes informaes para cada carro:
- placa do carro
- tempo de uso (idade)
- cor (A-azul, P-preto, B-branco)
- marca Ggm F-ford V-volks e A-fiat
No se sabe quantos carros esto a venda. Finalizar quando placa do carro for igual a ZERO.

37

Faa um programa para calcular e exibir:


a) o total de carros venda
b) a mdia do tempo de uso dos carros (a mdia da idade dos carros)
c) contar quantos carros tem menos de 5 anos de uso, que sejam da cor azul e da marca Gm.
d) a porcentagem de carros com mais de 10 anos de uso

import java.util.Scanner;
public class Carros
{
public static void main(String args[])
{
Scanner entrada = new Scanner(System.in);
int tempo, carroGm=0, carro=0;
Entra Lido
double carroDez=0;
String placa,texto;
double porcarros, media, somaTempo=0;
char cor, marca;
System.out.printf("\n Entre com a placa do carro (0-finaliza): ");
placa = entrada.next();
while(placa.charAt(0)!='0')
{
System.out.printf("\nEntre com o tempo de uso: ");
tempo = entrada.nextInt();
System.out.printf("\nEntre com a cor do carro (A/P/B): ");
texto = entrada.next();
cor = texto.toUpperCase().charAt(0);
System.out.printf("%s\n",cor);
System.out.printf("\nEntre com a marca (G/F/V/A): ");
texto = entrada.next();
marca = texto.toUpperCase().charAt(0);
System.out.printf("%s\n",marca);
carro=carro+1;
if ((tempo<5)&&(cor=='A')&&(marca=='G'))
carroGm=carroGm+1;
if (tempo>10)
Sai Lido
carroDez=carroDez+1;
somaTempo=somaTempo+tempo;
System.out.printf("Entre com a placa do carro (0-finaliza): ");
placa = entrada.next();
}
System.out.printf("\n\nO total de carros foram: %d",carro);
if (carro > 0)
{
media=somaTempo/carro;
porcarros=(carroDez/carro)*100;
}
else
{ media=0; porcarros=0; }
System.out.printf("\nA media de tempo : %8.2f",media);
System.out.printf("\nQuantidade de carros marca Gm, azuis e com menos de 5 anos so: %d", carroGm);
System.out.printf("\nA porcentagem de carros com mais de 10 anos foram:%8.2f",porcarros);
System.out.println();
}
}

38

29) Foi realizada uma pesquisa de algumas caractersticas fsicas da populao de uma certa regio,
a qual coletou os seguintes dados referentes a cada habitante para serem analisados:
sexo (masculino ou feminino)
cor dos cabelos (louros, castanhos, pretos)
cor dos olhos (verdes, castanhos, azuis)
idade
Faa um algoritmo que determine e escreva:
A maior idade dos habitantes
A percentagem de indivduos do sexo feminino cuja idade est entre 18 e 35 anos inclusive
e que tenham olhos verdes e cabelos louros.
O final do conjunto de habitantes reconhecido pelo valor 1 na entrada da idade.
30) Calcule o imposto de renda de um grupo de contribuintes considerando que os dados de cada

contribuinte, nmero do CPF, nmero de dependentes e renda mensal so valores fornecidos


pelo usurio. Para cada contribuinte ser feito um desconto de 5% de salrio mnimo por
dependente. Os valores da alquota para calculo do imposto so:
Renda Lquida
Alquota
At 2 salrios mnimos
Isento
2..3 salrios mnimos
5%
3..5 salrios mnimos
10%
5..7 salrios mnimos
15%
acima de 7 salrios mnimos
20%
O ltimo valor que no ser considerado, ter o CPF igual a zero. Deve ser fornecido o valor
atual do salrio mnimo.
31) Construa um algoritmo que leia um conjunto de dados contendo altura e sexo (masculino ou
feminino) de 50 pessoas e depois calcule e escreva:
a maior e a menor altura do grupo
a mdia da altura das mulheres
o nmero de homens e a diferena percentual entre estes e as mulheres
32) Um oftalmologista atendeu 20 pacientes durante o seu planto mdico. Para cada paciente so
fornecidos: idade, diagnstico (M-miopia, C-catarata, E-estrabismo, O-outros). Calcule e exiba:
a) mdia da idade de todos os pacientes;
b) quantos pacientes que tem catarata com idade entre 20 e 30 anos;
c) quantos pacientes tem miopia com idade superior a 50 anos;
d) qual a porcentagem de pessoas com estrabismo.
33) Uma funerria deseja fazer um levantamento de suas vendas. Para cada venda, fornecido o
tipo do caixo (S-standard, L-luxo, U-ultra Luxo) e o sexo do defunto (F-feminino e Mmasculino). Vende-se apenas uma unidade (um caixo por venda). Sabe-se que o caixo
standard custa $800,00 a unidade, o caixo Luxo vendido a $1.500,00 e o caixo Ultra Luxo a
$2.700,00.
a) qual o faturamento obtido com todas as vendas;
b) quantos caixes tipo Luxo foram vendidos;
c) quantos caixes tipo Standard foram vendidos p/defuntos do sexo masculino;
d) quantos caixes tipo Ultra-Luxo foram vendidos para defuntos do sexo feminino.
34) A srie de FETUCCINE gerada da seguinte forma: os dois primeiros termos so fornecidos
pelo usurio, a partir da os termos so gerados com a soma ou a subtrao dos dois termos
anteriores, ou seja, para termos mpares soma os dois termos anteriores, e para termos pares os dois

39

termos anteriores devem ser subtrados. Crie um programa completo, onde o usurio fornecer os
dois primeiros termos e, exiba os 50 primeiros termos gerados pela srie de FETUCCINE. Finalize
quando so dois primeiros termos forem iguais a zero.
Exemplo: termo1 = 3 termo2 = 8
Srie gerada: 3 8 11 3 14 11 25 14 39 25 64 .....

3.4 Funes e passagem de parmetros na linguagem Java


Funes so estruturas que permitem ao usurio separar seus programas em blocos.
Formato geral
Tipo_de_Retorno

Nome_Funo (parmetros)

corpo da funo
}

O comando return
Quando se chega numa declarao return, a funo imediatamente encerrada, e se o valor
de retorno informado, a funo retorna esse valor. Uma funo pode ter mais de uma
declarao return
int verifica (int a)
long quadrado(int n)
{

if (a%2)
return 0;
else
return 1;

{
return (n * n);
}

Funes do tipo void


Em portugus, void significa vazio. Ele permite fazer funes que no retornam nada. Se
queremos que a funo retorne algo, devemos usar a declarao return. Se no queremos,
basta declarar como sendo do tipo void.
public void mensagem ()
{

System.out.printf(\n Alo mundo!!!!);


}

public static void main(String args[])


{

mensagem();
}

Parmetros Formais e Reais


Parmetros Formais
Esses so declarados como sendo as entradas de uma funo. Voc pode alterar o valor de um
parmetro formal , pois essa alterao no ter efeito na varivel que foi passada funo. Quando
o C passa parmetros para uma funo, so passadas apenas cpias das variveis.

Parmetros Reais
Quando se faz a chamada a uma funo, os parmetros passados so denominados parmetros reais.

Programa para calcular o fatorial de um Nmero inteiro:

40

Programa para calcular Fatorial SEM FUNO


import java.util.Scanner;
import javax.swing.JOptionPane;
public class Fatorial
{
public static void main(String args[])
{
String opcao = JOptionPane.showInputDialog(null,"entre com um numero \n");
int num = Integer.parseInt(opcao);
int i;
float fato=1;
for (i=2; i<=num;i++)
fato=fato*i;
opcao = String.format("Resultado do fatorial= %8.0f",fato);
JOptionPane.showMessageDialog(null,opcao);
}
}
Utilizando FUNO para calcular o Fatorial de um Nmero
import java.util.Scanner;
import javax.swing.JOptionPane;
public class Fatorial
Parmetro
{
Formal
public static long fat(int num)
{
int i;
long fato=1;
for (i=2; i<=num;i++)
fato=fato*i;
return fato;
Parmetro
}
Real
public static void main(String args[])
{
String opcao = JOptionPane.showInputDialog(null,"entre com um numero \n");
int numero = Integer.parseInt(opcao);
long resul = fat(numero);
opcao = String.format("Resultado do fatorial= %8.0f",resul);
JOptionPane.showMessageDialog(null,opcao);
}
}

Exerccio: Faa um programa para calcular


Utilize o exerccio de fatorial com FUNO como referncia na resoluo da combinao.

41

public static long fat(int num)


{
int i;
long fato=1;
for (i=2; i<=num;i++)
fato=fato*i;
return fato;
}

public static void main(String args[])


{
String opcao = JOptionPane.showInputDialog(null,"entre com N \n");
int n = Integer.parseInt(opcao);
opcao = JOptionPane.showInputDialog(null,"entre com P \n");
int p = Integer.parseInt(opcao);
long resul = fat(n)/ (fat(p)*fat(n-p));
opcao = String.format("Resultado da Combinao= %d",resul);
JOptionPane.showMessageDialog(null,opcao);
}

EXERCICIO
Faa o teste de mesa com o programa abaixo, e
informe quais sero os resultados exibidos.
import java.util.Scanner;
import javax.swing.JOptionPane;
public class testaCalculo
{
public static int calculo(int x,int y,int z)
{
z = x+y+z;
System.out.printf(
"\n Durante X=%d Y=%d Z=%d",x,y,z);
return z;
}
public static void main(String args[])
{
int a,b,c;
a=5;
b=8;
c=3;
System.out.printf("\n Antes A=%d B=%d C=%d",a,b,c);
c=calculo(a,b,c);
System.out.printf("\n Depois A=%d B=%d C=%d\n",a,b,c);
//
a=7;
b=20;
c=5;
System.out.printf("\n Antes A=%d B=%d C=%d",a,b,c);
a=calculo(c,b,a);
System.out.printf("\n Depois A=%d B=%d C=%d\n",a,b,c);
System.out.printf("\n Antes A=%d B=%d C=%d",a,b,c);
b=calculo(c+b,a-b,b);
System.out.printf("\n Depois A=%d B=%d C=%d\n",a,b,c);
}
}

Escopo de variveis
Variveis Locais: so aquelas que s tem validade dentro do bloco ao qual so declaradas.
Veja os exemplos abaixo:

42

long fatorial(int n)
{
long resul=1;
for (int i=2; i<=n; i++)
resul=resul*i;
return resul;
}

long expo( int n, int m)


{

long resul=1;
for (int i=1;i<=m,i++)
resul=resul*n;
return resul;
}

As variveis locais resul e I


utilizadas dentro de fatorial no so
as mesmas variveis resul e I da
funo expo (e devem ser tratadas
independentemente).

Exerccios

1) Faa um programa que possua uma funo para calcular a rea de um crculo. rea = * raio
OBS: utilize a diretiva #define
#define PI 3.141592
2) Faa um programa que possua uma funo para calcular o quadrado de um valor inteiro.
resultado = quadrado (numero)
3) Faa um programa que possua uma funo para calcular exponenciao entre dois valores
inteiros n e m (nm)
4) Escreva um programa que utilize uma funo que retorne 1 se o argumento um nmero mpar e
0 se o argumento for um nmero par.
5) Um nmero primo qualquer inteiro positivo que divisvel apenas por si prprio e por 1. Escreva uma
funo que recebe um inteiro positivo e, se este nmero for primo, retorna 1, caso contrrio, retorna 0.
6) A famosa conjetura de Goldbach diz que todo inteiro par maior que 2 a soma de dois nmeros primos.
Testes extensivos foram feitos sem contudo ser encontrado um contra-exemplo. Escreva um programa
mostrando que a afirmao verdadeira para todo nmero par entre 700 e 1100. O programa deve imprimir
cada nmero e os seus correspondentes primos. Use a funo do exerccio anterior.
7) Faa um programa contendo uma funo para verificar se o dia vlido (est no intervalo entre 1 e 31) e se
o ms est entre 1 e 12. Caso esteja incorreto, ler nova data.
8) Faa um programa que utilize uma funo para retornar um valor calculado do seguinte modo:
Dentre 4 argumentos, escolhe-se o maior dos dois primeiros argumentos e o maior dos dois ltimos
e, em seguida, calcula-se a raiz quadrada da soma dos dois maiores, subtrada do produto dos outros
dois.
9) Fazer um programa que leia um nmero N (3 < N < 99). Utilize uma funo para calcular e imprimir o
valor do somatrio dos totais obtidos em cada linha apresentada no modelo: Finalize o programa quando
o valor de N lido for igual a zero.

1+
2+
3+
(n -2) +

2+
3+
4+
.....
(n-1) +

3=
4=
5=

6
9
12

n=

(3n 3)

10) Escreva um programa que possua 3 funes, uma para cada calculo abaixo:
R = sqrt (a + bx + x2)
S = cos (2 x + a) a bx

43

11) No triangulo abaixo, se forem conhecidos os valores dos ngulos e , e o comprimento do lado C,
podem ser determinadas as outras quantidades, usando-se as frmulas:
sen
a

sen
b

sen
c

+ + = 180o

Escreva uma funo ASA que, usando os valores do lado C, os ngulos e , calcule os valores das outras
trs grandezas: lado A, lado B, e ngulo . Todos os lados e ngulos do triangulo devem ser parmetros desta
funo. Todos os ngulos devem ser expressos em graus.
12) Faa um programa completo contendo as seguintes funes abaixo:
a) funo que ao receber como parmetros um mes e um ano, retorne a quantidade de dias deste ms;
b) funo que ao receber um ano, retorne a quantidade de dias deste ano;
c) funo que ao receber como parmetros uma data (dia, ms e ano) retorne a quantidade de dias de
1/1/1901 at esta data;
d) funo que ao receber como parmetros duas datas (dia1,mes1,ano1,dia2,mes2,ano2) retorne a
diferena em dias entre estas duas datas.
No principal, faa um menu de opes para cada funo acima. Exemplo:
1 Total de Dias do Ms
2 Total de dias do Ano
3 Total de Dias desde 1/1/1901
4 Diferena entre duas datas
5 - Finaliza

4. Vetores (Arrays)
Vetores so arranjos unidimensionais (de 1 dimenso).
Formato Geral
tipo nome[tamanho];
No Java, a indexao comea sempre em zero. Isso significa que no comando int vetor[5],
os dados sero indexados de 0 a 4 e o contedo armazenados nas respectivas posies sero
todos do tipo inteiro.
0
1
2
3
4
Operaes Bsicas
float vetor[] = new float[5];
vetor[0]=8.3;

int arranjo[8];
arranjo[]={ 1, 1, 2, 3, 5, 8, 13, 21};

vetor[1]=10.5;
vetor[2]=vetor[0] * vetor[1];

arranjo[0]=arranjo[1]+arranjo[2];

Verifique se voc est respeitando os limites do vetor. Cuidado com a lgica!!


Se voc declarou um vetor de cinco posies (int vetor[] = new int[5];) e utilizar, por exemplo, a posio 8,
ocorrer um erro. Ex: vetor[8] = 25; // o programa ir compilar, mas ocorrer um erro ao executar o

programa.

Programa Exemplo inicial trabalhando com Vetores

44

import javax.swing.*;
public class ExemploVetor {
public static void main(String arg[]) {
final int TAM = 10;
String saida="";
int n[] = { 32, 27, 34, 67, 74, 33, 55, 44, 99, 11}
saida += "Indice\tConteudo\n";
for (int i=0; i< n.length; i++)
saida += i+ "\t"+n[i]+"\n";
JTextArea saidaArea = new JTextArea(11,10);
saidaArea.setText(saida);
JOptionPane.showMessageDialog(null,saidaArea,
"Inicializao um Vetor de valores inteiros",

JOptionPane.INFORMATION_MESSAGE);
System.exit(0);
}
}
import java.awt.*;
import javax.swing.*;
public class Ordena {
public static void Bolha(int vet[])
{
int TL = vet.length;
int i;
while (TL >= 0)
{
for (i=0;i<TL-1;i++)
{
if (vet[i]>vet[i+1])
{
int aux=vet[i];
vet[i]=vet[i+1];
vet[i+1]=aux;
}
}
TL--;
} //while
} //bolha

public static void main(String arg[]) {


String saida="";
int vetor[] = new int[10];
saida += "\nVetor antes de Ordenar\n\n";
for (int i=0;i<vetor.length;i++)
{
vetor[i]=(int)(Math.random()*30.0);
saida += i+ "\t"+vetor[i]+"\n";
}
Bolha(vetor); // CHAMADA FUNO PARA ORDENAR O VETOR
saida += "\n\nVetor apos a Bolha\n\n";

45

for (int i=0;i<vetor.length;i++)


{
saida += i+ "\t"+vetor[i]+"\n";
}
JTextArea saidaArea = new JTextArea(20,10);
saidaArea.setText(saida);
JOptionPane.showMessageDialog(null,saidaArea,
"Vetor Desordenado-Bolha",
JOptionPane.INFORMATION_MESSAGE);
System.exit(0);
}// main
} // ordena

Exerccios
1) Faa um programa que seja capaz de conhecer e armazenar valores inteiros quaisquer, com
capacidade fsica total de 15 elementos. Calcule e exiba a mdia aritmtica dos elementos do vetor.
2) Refaa o exerccio 1. No final, exiba todos os elementos e suas respectivas posies no vetor,
somente dos elementos cujos valores so maiores que a mdia.
3) Ler 10 elementos do tipo inteiro e armazene-os num vetor de tal capacidade.
a) contar quantos elementos so positivos
b) contar quantos elementos so negativos
c) contar quantos elementos so nulos
d) contar quantos elementos so pares
e) contar quantos elementos so mpares
4) Ler 10 elementos do tipo inteiro e armazene-os num vetor de tal capacidade.
a) somar todos os elementos armazenados em posies pares
b) somar todos os elementos armazenados em posies mpares
c) exibir as duas somas calculadas
5) Ler um vetor de inteiros com capacidade para 10 elementos.
Verificar e exibir se o vetor simtrico. Veja exemplo de um vetor simtrico abaixo:
0

10

20

30

40

50

50

40

30

20

10

6) Ler um vetor de inteiros com capacidade para 10 elementos. Inverter os elementos do vetor.
Observao: crie um novo vetor e armazene os valores em ordem invertida.
Exemplo Vetor Inicial
0

10 20
Vetor resultante

30

40

50

60

70

80

100

90

80

70

60

50

40

30

90
8

20

100
9

10

7) Refaa o exerccio anterior (7). Mas no crie um novo vetor. Inverta os valores dentro do
prprio vetor.
8) Ler um vetor de inteiros com capacidade para 20 elementos. Calcule:

46

= (a[0]-a[19])2+ (a[1]-a[18]) 2+ (a[2]-a[17]) 2+ (a[3]-a[16]) 2+ .........+ (a[9]-a[10]) 2


9) Faa um programa um programa para ler um vetor de TL elementos. Copie o vetor lido para
outro vetor auxiliar do mesmo tamanho. Calcule e exiba o vetor resultante da seguinte forma: os
elementos negativos devem ocupar as posies iniciais e os positivos as posies finais.
10) Faa um programa para ler 2 vetores inteiros de tamanhos idnticos. Calcule e exiba a soma dos
vetores num terceiro vetor resultante.

Vetor1

0
10

1
20

2
30

Vetor resultante da soma

3
40

4
50

0
5

15

28

41

130

44

Vetor2

1
8

2
11

3
90

4
-6

#include <iostream.h>#include <stdlib.h>#include <stdio.h>#include <string.h>#include <conio.h>

#define tf 5
void leitura(int v[],int tl)
{
int i;
for (i=0;i<tl;i++)
{
printf("\n vetor[%d]= ",i);
scanf("%d",&v[i]);
}
}
void soma(int v1[],int v2[],int vR[],int tl)
{
int i;
for (int i=0;i<tl;i++)
{
vR[i]=v1[i]+v2[i];
}
}
int main()
{
int vetor1[tf],vetor2[tf],vetorR[tf];
int tl;
printf("\n entre com o tamanho dos vetor (TL): ");
scanf("%d",&tl);
printf("\nVetor 1");
leitura(vetor1,tl);
printf("\nVetor 2");
leitura(vetor2,tl);
soma(vetor1,vetor2,vetorR,tl);
printf("\nO vetor resultante da soma...\n");
for (int i=0;i<tl;i++)
printf("\n vetorR[%d]= %d \n",i,vetorR[i]);
printf("\n\n\n");
system("PAUSE");
return 0;
}

47

11) Faa um programa para ler um vetor de TL elementos. O programa dever inserir um novo
elemento em uma determinada posio do vetor. Os elementos devem ser remanejados para a
insero do novo elemento. Veja explicao abaixo:
vetor Inicial
TL inicial=3

0
10

1
20

2
30

Inserir o elemento 15 na posio 1


vetor Resultante
TL final=4

10

15

20

30

12) Faa um programa para ler um vetor e um dado elemento. Verifique se o elemento est contido
no vetor. Caso afirmativo, informe a posio do elemento.
13) Faa um programa para ler 2 vetores e seus respectivos tamanhos. Calcule num terceiro vetor a
unio dos 2 vetores lidos. Exiba o vetor unio. OBS: no h elementos repetidos no vetor UNIO.
14) Leia um vetor e uma posio. Retire do vetor o elemento da posio especificada. Remaneje os
elementos do vetor resultado. Exiba o vetor resultado.
Vetor Inicial
TL inicial=5

0
10

1
20

Vetor Resultado
TL final=4

2
30
0
10

3
40
1
30

4
50
2
40

Posiao = 1 (posio do elemento a ser retirado)

3
50

Matrizes
Matrizes so arrays (vetores) de 2 dimenses. Exemplo de uma matriz 3 x 3 de inteiros:
int mat[3][3];
mat[0,0] mat[0,1] mat[0,2]
mat[1,0] mat[1,1] mat[1,2]
mat[2,0] mat[2,1] mat[2,2]
Ex: Ler uma matriz quadrada 3 x 3. Calcular e exibir a soma da diagonal principal e da
diagonal secundria.
#include <iostream.h>#include <stdlib.h>#include <stdio.h>#include <string.h>#include <conio.h>
#define tf 3
void leitura(int mat[tf][tf])
{

int i,j;
printf("\nLeitura Matriz[3,3] \n");
for (i=0;i<tf;i++)
for (j=0;j<tf;j++)
{
printf("\n mat[%d,%d]: ",i,j);
scanf("%d",&mat[i][j]);
}
}

int principal(int mat[tf][tf])

int secundaria(int mat[tf][tf])

48

int soma=0;
int j=tf;
for (int i=0;i<tf;i++)
{
j=j-1;
printf("\n Mat[%d,%d]: %d\n",i,j,mat[i][j]);
soma=soma+mat[i][j];
}
return soma;

int soma=0;
printf("\nDiagonal Principal\nElementos...");
for (int i=0;i<tf;i++)
{

printf("\n Mat[%d,%d]: %d\n",i,i,mat[i][i]);


soma=soma+mat[i][i];
}

return soma;
}
}

int main()
{
int mat[tf][tf];
int i,j;
leitura(mat);
printf("\n Exibe a matriz lida\n");
for (i=0;i<tf;i++)
{
for (j=0;j<tf;j++)
printf("%d ",mat[i][j]);
printf("\n");
}
printf("\nResultado Soma Diagonal Principal= %d\n\n",principal(mat));
printf("\nResultado Soma Diagonal Secundria= %d\n",secundaria(mat));
printf("\n\n\n");
system("PAUSE");
return 0;
}

Exerccios
1) Ler uma matriz quadrada 4x4 de inteiros. Descobrir e exibir o maior elemento e a sua posio
correspondente.
2) Faa um programa que seja capaz de conhecer e armazenar 10 valores iinteiros quaisquer, em um
conjunto bidimensional com dimenses de 2 linhas e 5 colunas.
3) Ler uma matriz quadrada de tamanho 4x4. Calcular a somatria de cada linha da matriz e
armazenar o resultado num vetor de 4 posies, conforme ilustrao abaixo.
Matriz 4x4
Vetor
3
5
8
10
26
9
5
3
1
18
12
2
4
5
23
6
20
4
7
37
#include <iostream.h>#include <stdlib.h>#include <stdio.h>#include <string.h>#include <conio.h>
#define tf 4
void somatoria (int mat[tf][tf], int vetor[])
{

int i,j;
for (i=0;i<tf;i++)
{
soma=0;
for (j=0;j<tf;j++)
{

49

soma=soma+mat[i][j];
}

vetor[ i ] = soma;
}
}

4) Faa um programa para leia uma matriz, calcule e exiba outra matriz que seja a transposta da
matriz lida.
Obs: preciso ter o TLL (tamanho lgico das linhas) e o TLC (tamanho lgico das colunas).
Matriz 2x3
Transposta 3x2
A00
A01
A02
A00
A10
A10
A11
A12
A01
A11
A02
A12
5) Faa um programa que efetue a leitura, a soma e a impresso do resultado entre duas matrizes
inteiras com 5 linhas e 5 colunas.
6) Escreva um programa que: Leia uma matriz quadrada 10x10 de elementos inteiros, exiba essa
matriz e calcule e exiba a soma dos elementos situados abaixo da diagonal principal da matriz,
incluindo os elementos da prpria diagonal principal.
7) Construa e exiba a seguinte matriz bidimensional
0
0
0
0
0
1
1
1
0
1
2
1
0
1
1
1

0
0
0
0

8) Faa um algoritmo que efetue a troca dos elementos entre as linhas 2 e 4 de uma matriz
bidimensional de inteiros (5 x 5)
Exemplo inicial da matriz:
0
2
3
8
9
7
4
5
6
1
2
3
4
5
6
1
2
1
2
3
5
7
8
9
0
Aps a troca (matriz resultante)
0
2
3
8
9
7
4
5
6
1
5
7
8
9
0
1
2
1
2
3
2
3
4
5
6
9) Faa uma funo que seja capaz de conhecer os elementos inteiros de uma matriz, juntamente
com os seus tamanhos lgicos e de informar qual linha da matriz tem a maior soma de seus
elementos.
10) Ler uma matriz quadrada de ordem 5x5.
a) exibir todos os elementos situados acima da diagonal principal
b) exibir todos os elementos situados abaixo da diagonal principal
c) dividir os elementos de cada linha pelo elemento correspondente na diagonal principal.

50

11) Veja a matriz abaixo de consumo na lanchonete e seu respectivo vetor de preos associado.

refrigerante
Coxinha
Sorvete
Cerveja
pinga

Rose

Rui

Maria

Vilma

Pedro

0
7
2
1
5

2
4
3
2
7

3
5
4
1
8

8
6
5
2
9

9
1
6
3
0

Vetor de
Preos
2,00
1,50
1,50
2,80
0,50

Faa um programa completo para ler e exibir as informaes acima e alm disso calcular e
exibir a conta de cada cliente da lanchonete.

12) Calcule a soma dos elementos situados nas posies em destaque (sombreadas)
0
7
5
1
2

2
4
7
2
3

3
5
8
1
4

8
6
9
2
5

9
1
0
3
6

13) Implemente um programa que:


a) leia uma matriz de ordem NxN;
b) verifique e exiba se a matriz simtrica ou no
10
20
30
40
50

20
40
60
80
100

30
60
5
15
25

40
80
15
6
30

50
100
25
30
35

Obs: a matriz acima simtrica


14) Faa um programa para criar e exibir o quadrado mgico (matriz 5x5).
Note que a posio inicial deve ser na posio [0,2] que recebe o valor 1.
19
24
4
9
14

25
5
10
15
20

1
6
11
16
21

7
12
17
22
2

13
18
23
3
8

A cada iterao, incrementa-se a coluna (coluna++) e decrementa a linha em 1.(linha--).


Caso a linha seja menor que zero, deve-se atribuir o valor 4 para a linha.
Caso a coluna seja maior que 4, deve-se atribuir o valor 0 (zero) para a coluna.
Caso haja coliso (deseja-se armazenar numa posio com valor j existente), o novo valor
deve ficar na coluna imediatamente frente (coluna++), mas na mesma linha.

51

5. ARQUIVOS
Nos captulos anteriores, nesta apostila, o armazenamento de informaes foi realizado
na memria principal. A desvantagem que, ao encerrar o programa, todas as
informaes digitadas so automaticamente perdidas.
Agora estudaremos o armazenamento de dados em memria secundria, utilizando
arquivo de dados.
5.1 ARQUIVOS TEXTOS
Abordaremos o tipo padro cujos dados so organizados em blocos contendo bytes
contnuos de informao (arquivo de dados no formatados).O Java v cada arquivo
como um fluxo seqencial de bytes. Existe um marcador de fim de arquivo (EOF end of
file). Arquivos criados com base nos fluxos de bytes so chamados arquivos binrios e
arquivos criados com base nos fluxos de caracteres so chamados arquivos de textos.
Arquivos de textos podem ser lidos por editores de texto (exemplo: bloco de notas),
enquanto arquivos binrios so lidos exclusivamente por um programa que converte
dados em um formato legvel por humanos.
1) Este exemplo abaixo abre um arquivo TEXTO (leitura) chamado texto.txt, e exibe
as informaes lidas na tela.
import java.io.File;
import java.io.FileReader;
import java.io.LineNumberReader;
public class Leitura {
public static void main(String[] args) {
//File f = new File("c:\\teste\\texto.txt");
try{
FileReader fr = new FileReader("c:\\teste\\texto.txt");
LineNumberReader lnr = new LineNumberReader(fr);
String linha = lnr.readLine();
while (linha != null){
System.out.println(linha);
linha = lnr.readLine();
}
} catch (Exception ex) {
System.out.println("Erro ao ler arquivo!");
}
}
}

2)_ AGENDA TELEFONICA. Cria-se um arquivo texto chamado agenda.txt. A cada novo
contato telefnico digitado nas caixas de dilogos, realizada a gravao do contato no
arquivo texto. (veja o parmetro TRUE no comando FileWriter)
import java.io.File;
import java.io.FileWriter;
import javax.swing.JOptionPane;
public class Escrita {
public static void main(String[] args) {
try {
File f = new File("c:\\agenda\\agenda.txt");

52

FileWriter fw = new FileWriter(f,true);


String nome= JOptionPane.showInputDialog(null, "Digite o nome do Contato");
String telefone= JOptionPane.showInputDialog(null, "Digite o Telefone do Contato");
fw.write(nome+","+telefone+"\n");
fw.close();
JOptionPane.showMessageDialog(null, "Arquivo gravado com sucesso!");
} catch (Exception ex) {
JOptionPane.showMessageDialog(null,"Erro ao gravar arquivo");
}
}
}

3) AGENDA TELEFONICA. Programa exemplo com menu de opes para Incluir,


Excluir, Buscar e Listar os contatos de uma agenda telefnica, salvos num arquivo texto
chamado AGENDA.txt
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.LineNumberReader;
import javax.swing.JOptionPane;
public class Principal {

53

public static void main(String[]args){


while (true) {
String opcao = JOptionPane.showInputDialog(null,"Digite a opo desejada:\n"+
"(I)ncluir\n"+
"(E)xcluir\n"+
(B)uscar\n"+
"(L)istar\n"+
"(S)air\n");
opcao = opcao.toUpperCase();
char op = opcao.charAt(0);
switch (op) {
case 'I':
Incluir();
break;
case 'E':
Excluir();
break;
case 'B':
Buscar();
break;
case 'L':
Listar();
break;
case 'S':
System.exit(0);
break;
default:
JOptionPane.showMessageDialog(null, "Opo Invlida!");
}
}
}
public static void Incluir(){
try {
File f = new File("agenda.txt");
FileWriter fw = new FileWriter(f,true);
String nome= JOptionPane.showInputDialog(null, "Digite o nome do Contato");
String telefone= JOptionPane.showInputDialog(null, "Digite o Telefone do Contato");
fw.write(nome+","+telefone+"\n");
fw.close();
JOptionPane.showMessageDialog(null, "Arquivo gravado com sucesso!");
} catch (Exception ex) {
JOptionPane.showMessageDialog(null,"Erro ao gravar arquivo");
}
}
public static void Excluir(){
String[]nomes= new String[100];
String[]telefones= new String[100];
//carrega o vetor com nomes e telefones
try{
FileReader fr = new FileReader("agenda.txt");
LineNumberReader lnr = new LineNumberReader(fr);
int numLinha=0;
String linha = lnr.readLine();
while (linha != null){
int posicaoVirgula = linha.indexOf(",");

54

String nome= linha.substring(0,posicaoVirgula);


String telefone= linha.substring(posicaoVirgula+1);
nomes[numLinha]= nome;
telefones[numLinha]=telefone;
linha=lnr.readLine();
numLinha= numLinha +1;
}
//ler um nome que sera procurado no vetor de NOMES
String nome= JOptionPane.showInputDialog(null, "Digite o nome a ser excluido");
int i=0;
boolean achou=false;
int posicao=-1;
while (i< numLinha)
{
if (nome.compareTo(nomes[i])==0)
{
achou=true;// encontrou o nome na posicao i do vetor de nomes
posicao=i;
}
i++; }
//String tmp="Achou? "+achou+" na posicao "+posicao;
if (achou) // se achou o nome procurado, exclui o nome do vetor de nomes (e o seu telefone tbem)
{
String info="Restantes:\n";
int j;
for (j=posicao; j < numLinha-1;j++)
{
nomes[j]=nomes[j+1];
telefones[j]=telefones[j+1];
}
for (j=0;j < numLinha-1;j++)
info +="Nome:"+nomes[j]+" Telefone:"+telefones[j]+"\n";
JOptionPane.showMessageDialog(null, info);
}
else // no achou o nome a ser excluido
JOptionPane.showMessageDialog(null, "No achou o nome a ser excluido:"+nome);
}catch(Exception ex){
System.out.println("Erro ao ler arquivo!");
}
}
public static void Buscar() {
String[]nomes= new String[100];
String[]telefones= new String[100];
try{
FileReader fr = new FileReader("agenda.txt");
LineNumberReader lnr = new LineNumberReader(fr);
int numLinha=0;
String linha = lnr.readLine();
while (linha != null){
int posicaoVirgula = linha.indexOf(",");
String nome= linha.substring(0,posicaoVirgula);
String telefone= linha.substring(posicaoVirgula+1);
nomes[numLinha]= nome;
telefones[numLinha]=telefone;
linha=lnr.readLine();
numLinha= numLinha +1;
}
//ler um nome que sera procurado no vetor de NOMES

55

String nome= JOptionPane.showInputDialog(null, "Digite o nome a ser procurado");


int i=0;
while (i< numLinha)
{
String temp = nome+" tam do nome="+nome.length()+" "+nomes[i]+" tam do nome do vetor="+nomes[i].length();
//JOptionPane.showMessageDialog(null,temp);
if (nome.compareTo(nomes[i])==0)
{
// encontrou o nome na posicao i do vetor de nomes
String tmp = "Telefone do "+nomes[i]+"= "+telefones[i];
JOptionPane.showMessageDialog(null,tmp);
}
i++; }
}catch(Exception ex){
System.out.println("Erro ao ler arquivo!");
}
}
public static void Listar(){
String[]nomes= new String[100];
String[]telefones= new String[100];
try{
FileReader fr = new FileReader("agenda.txt");
LineNumberReader lnr = new LineNumberReader(fr);
int numLinha=0;
String linha = lnr.readLine();
while (linha != null){
int posicaoVirgula = linha.indexOf(",");
String nome= linha.substring(0,posicaoVirgula);
String telefone= linha.substring(posicaoVirgula+1);
nomes[numLinha]= nome;
telefones[numLinha]=telefone;
linha=lnr.readLine();
numLinha= numLinha +1;
}
String info="";
for(int i=0; i<100;i++){
if (nomes[i]!=null){
info +="Posicao= "+i+" Nome:"+nomes[i]+" Telefone:"+telefones[i]+"\n";
}
}
JOptionPane.showMessageDialog(null, info);
}catch(Exception ex){
System.out.println("Erro ao ler arquivo!");
}
}
}

Resultados obtidos na execuo do programa.............:


jose luis,92181736
maria,99821345
lilian,33229988
carlos,84151094
maico,32298989
maria,81143567
Liliane,90901234
Murilo,92234567

56

5.2
ARQUIVO DE ACESSO DIRETO
Pense num arquivo que contem um conjunto de contas bancarias. Suponha que deseja-se
alterar os saldos de algumas contas. Naturalmente, pode-se ler todos os dados das contas
para uma lista de arrays, atualizar as informaes que mandaram e salvar os dados
novamente. Se o conjunto de dados muito grande, perde-se bastante tempo em leitura e
gravao s para atualizar alguns registros. Seria melhor localizar as informaes a serem
alteradas e substitu-las. Portanto, diferente de um arquivo de acesso sequencial, que voc
parte do incio (primeiro registro) e continua lendo os registros at encontrar o final do
arquivo (ltimo registro). Agora, iremos acessar posies especficas em um arquivo e
alterar apenas essas posies. Esse padro de acesso se chama acesso aleatrio, que
significa que voc pode ler e modificar qualquer byte armazenado em qualquer local no
arquivo.

57

58

Conceitos Bsicos da Programao Orientada a Objetos


6.1 Definio de Objetos e Mtodos
Objeto = a unio inseparvel entre uma estrutura de dados e todas as operaes (mtodos)
associadas a esta estrutura
A estrutura de dados denominada VARIVEIS DE INSTNCIA.
As operaes so denominadas MTODOS.
Exemplo: Objeto PEDRO
Variveis de Instncia: Nome=Pedro, Idade = 23
Mtodos: CalcularIdade, InformarNome etc
Uma aplicao orientada a objetos decomposta em objetos, no em procedimentos
ou subprogramas.
Portanto, um objeto composto por uma coleo de dados privados e um conjunto de
mtodos que atuam sobre estes dados.
6.2 Classes, Instncias e Mensagens
CLASSE: um grupamento de objetos que revelam profundas semelhanas entre si,
tanto no aspecto estrutural como funcional.
Uma classe pode ser vista como uma declarao de tipo, uma descrio de uma coleo
de possveis objetos.
Variveis de Instncia

Mtodos

classe PESSOA
nome

idade
setNome(nome)
setIdade(idade)
getNome()
getIdade()

Exemplos de Objetos
Pessoa:
Joo, 19
Maria, 34
Pedro, 23

59

pessoa.java
public class pessoa
{

// variaveis de instancia
private String nome;
private int idade;
// metodos
public void setNome( String nome) {
this.nome = nome; }
public void setIdade( int idade) {
this.idade = idade; }
public String getNome() {
return nome; }
public int getIdade() {
return idade; }
}// fecha classe pessoa

testaPessoa.java
1 import java.util.Scanner;
2 public class testaPessoa
3{
4 public static void main (String args[])
5 {
6 pessoa pX = new pessoa();
7 pessoa pZ = new pessoa();
8 pZ.setNome("Jose Romualdo da Silva");
9 pZ.setIdade(15);
10 System.out.printf("nome Z= %s\n Idade= %d\n" ,pZ.getNome() ,pZ.getIdade() );
11
12 Scanner input = new Scanner( System.in );
13 System.out.printf("Entre com o nome: ");
14 String nome = input.nextLine();
15 pX.setNome(nome);
16 System.out.printf("\nEntre com a idade: ");
17 String frase = input.nextLine();
18 pX.setIdade(Integer.parseInt(frase));
19 System.out.println();
20 System.out.printf("nome X=%s\n Idade=%d \n " , pX.getNome() ,pX.getIdade() );
21 }
}

No exemplo anterior:
Pessoa = classe
pX e pZ so objetos da classe Pessoa

60

Podemos ter diversos objetos criados a partir de uma mesma classe. Esses objetos tero
as mesmas caractersticas entre si, descritos pela classe. Desta forma, dizemos que cada um
desses objetos uma instncia desta classe.
Cada objeto uma instncia de uma classe.
Objetos so criados durante a execuo do programa, e ocupam espao na memria.

3.3 Mtodos
Um mtodo ativado pelo envio de uma mensagem ao objeto. O envio de uma
mensagem a um objeto corresponde a uma chamada de uma funo. Em ambos os casos
algum trecho de cdigo ser executado e, provavelmente, modificar alguns dados.
3. 3.1 Mtodos Construtores / Sobrecarga de Construtores
Um constructor um mtodo especial que inicia o objeto antes que ele seja utilizado.
Um constructor deve ter o mesmo nome de sua classe.
O Java no possui ponteiros, mas a linguagem C sim. Na linguagem C, os mtodos
denominados Constructor e Destructor so utilizados para alocar e desalocar objetos
dinmicos (ponteiros). Um destructor o oposto do constructor: ele elimina o objeto
quando ele no mais necessrio.
A chamada do constructor indicada pelo nome da classe seguido pelos parnteses.
Por exemplo, no programa testaPessoa.Java, nas linhas 6 e 7, so criados os objetos
pX e pZ, respectivamente. A palavra chave new chama o constructor da classe para realizar
a inicializao. Como um mtodo, um constructor especifica em sua lista de parmetros os
dados que ele requer para realizar sua tarefa.
A seguir, apresentamos novamente as classes pessoa e testaPessoa, mas agora
utilizando construtores.
public class pessoa
{
// variaveis de instancia
private String nome;
private int idade;
public pessoa()
{ nome=""; idade=0;
}

Construtor SEM parmetros

Construtor COM parmetros

public pessoa(String nome,int idade) {


this.nome=nome;
this.idade=idade;
}

public void setNome( String nome) {


this.nome = nome; }
public void setIdade( int idade) {
this.idade = idade; }
public String getNome() {
61

return nome; }
public int getIdade() {
return idade; }
}// fecha classe pessoa
Observe agora que o objeto pX inicializado sem parmetros, e que o objeto pZ
inicializado com parmetros.
public class testaPessoa
{

public static void main (String args[])


{

pessoa pX = new pessoa();


pessoa pZ = new pessoa("Jose Romualdo da Silva",15);
System.out.printf("nome Z= %s\nIdade= %d\n",pZ.getNome(),pZ.getIdade());
Mtodos Static
A classe Math fornece uma coleo de mtodos para realizar clculos matemticos, e
todos os mtodos da classe Math so estticos (static). Por exemplo, Math.sqrt( x) um
mtodo static e utilizado para calcular a raiz quadrada de um determinado valor x.
Observe que no preciso criar um objeto Math antes de chamar o mtodo sqrt.
System.out.println( Math.sqrt( 81.0) ); // exibe a raiz quadrada de 81
Constantes
Qualquer campo declarado com a palavra-chave final constante, ou seja, seu valor
no pode ser alterado depois que o campo inicializado. Esses campos so declarados com
os modificadores public, final e static.
public final static Math.PI = 3,141592653589799323846 e
public final static Math.E = 2,7182818284590452354
Tanto PI quanto E so declarados public para que outros programadores possam
utiliz-los em suas prprias classes. So declarados final porque seus valores nunca
mudam. E declarados static para permitir que eles sejam acessados via nome da classe
Math e um ponto (.) separador, como se fosse um mtodo.

3.4 Modificadores de acesso PUBLIC e PRIVATE


As variveis de instncia so os elementos que compem a coleo de dados privados
de uma classe. Elas (as variveis de instncia) contm as informaes do objeto e podem
ser declaradas com modificadores de acesso PUBLIC e PRIVATE. Isto implica no tipo de
acesso (ou visibilidade) que ser possvel realizar com estas informaes.
a) Exemplo de membros PUBLIC:
Caso as variveis de instncia sejam declaradas PUBLIC dentro de uma
determinada classe, possvel acess-las externamente (utilizando um outro
programa, possvel acessar diretamente as variveis de instncia utilizadas dentro
da classe). Isto representa um grave perigo de violao das informaes internas,

62

segundo as regras de encapsulamento e ocultao da informao em POO


Programao Orientada a Objetos.
public class pessoa {
// variaveis de instncia PUBLIC
public String nome; // NO atende as boas regras da POO!!!
public int idade;
// metodos
public pessoa()
{ nome=""; idade=0;
}
public pessoa(String nome, int idade) {
this.nome=nome;
this.idade = idade;
}
public void setNome( String nome) {
this.nome = nome; }

.....// continuao da implementao da classe Pessoa....


A seguir, temos a classe testaPessoa1, cujo propsito testar o acesso externo as
variveis de instncia na classe Pessoa:
import java.util.Scanner;
public class testaPessoa1
{
public static void main (String args[])
{
pessoa pX = new pessoa();
pX.nome="Luciana Vieira";
pX.idade = 16;
System.out.printf("nome X= %s \nIdade %d\n",
pX.getNome(),pX.getIdade());
}
}

O resultado obtido ao executarmos o programa testaPessoa1 :


nome X= Luciana Vieira
Idade 16

Observao: notamos que possvel acessar externamente as variveis de instncia da


classe Pessoa. Basta declararmos que as suas variveis de instncia so PUBLIC. Isto
representa um alto risco para a integridade dos dados, conforme iremos estudar no captulo
sobre ENCAPSULAMENTO.
b) Exemplo de membros PRIVATE:

63

Utilizaremos o mesmo exemplo do item A (classe Pessoa). Ao invs de declararmos


que as variveis de instncia so PUBLIC, iremos declar-las como PRIVATE. Ou
seja, agora as variveis de instncia so visveis apenas dentro da prpria classe.
Somente os mtodos internos classe Pessoa tero acesso direto as informaes
(variveis de instncia).
public class pessoa {
// variaveis de instancia PRIVATE
private String nome; // CORRETO!!!
private int idade;
// metodos
public pessoa()
{ nome=""; idade = 0;
}
public pessoa(String nome, int idade) {
this.nome=nome;
this.idade = idade;
}
public void setNome( String nome) {
this.nome = nome; }

.....// continuao da implementao da classe Pessoa....


A seguir, temos a classe testaPessoa1, cujo propsito testar o acesso externo as
variveis de instncia na classe Pessoa:
import java.util.Scanner;
public class testaPessoa1
{
public static void main (String args[])
{
pessoa pX = new pessoa();
pX.nome="Luciana Vieira";
pX.idade = 16;
System.out.printf("nome X= %s\nIdade %d\n",
pX.getNome(),pX.getIdade());
}
}

Ao compilarmos o programa que contm a classe testaPessoa1, so listados 2 erros:


nome has private access in pessoa
idade has private access in pessoa
Observao: Quando declaramos que as variveis de instncia de uma classe so
private, notamos que NO possvel acessar externamente suas informaes internas. Ao

64

declararmos que as informaes internas so private, estaremos obedecendo as regras de


encapsulamento e ocultao da informao da POO (programao orientada a objetos).
Como seria o programa testaPessoa1 correto? O objetivo modificar as variveis de
instncia do objeto pX. Como fazer tais alteraes? A resposta : utilizando os
mtodos da classe Pessoa!
public class testaPessoa1
{
public static void main (String args[])
{
pessoa pX = new pessoa();
pX.setNome("Luciana Vieira");
pX.setIdade(16);
System.out.printf("nome X= %s\n Idade %d\n",
pX.getNome(),pX.getIdade());
}
}

3.5 Encapsulamento
A capacidade de um objeto possuir uma parte privada denominada encapsulamento.
Encapsulamento impede o cliente de enxergar os detalhes da sua implementao, o que
denominamos ocultao de informao.
A POO tem por objetivo criar objetos independentes da aplicao. O reuso permite
desenvolver um conjunto de classes que no seja limitado a um nico sistema. Exemplo:
classe pessoa, classe datas, classe mouse, classe janela, classe menu etc
A reusabilidade s pode ser alcanada se as classes forem projetadas e implementadas
com independncia da aplicao.
Esta proteo (ocultao) tem as seguintes regras:
a) apenas os mtodos devem ser capazes de modificar o estado interno de um objeto
(ocultao da informao), no deve ser possvel acessar o valor armazenado em uma
varivel de instncia externamente. Toda mudana no estado interno de um objeto deve
ser conseqncia de uma mensagem. Observe que para atender esta regra, as classes
devem possuir mtodos get e set, cuja funo obter e setar/atribuir valores as variveis
de instncia.
b) a resposta a uma mensagem deve ser completamente determinada pelo estado interno
do objeto receptor (independncia de aplicao). Se 2 instncias de uma mesma classe
possuem o mesmo estado interno, ento devem responder a mensagens iguais de forma
idntica. Isto garante que a resposta a uma mensagem no dependa de fatores externos
ao objeto. Portanto, no devemos acessar variveis globais da aplicao no interior de
um mtodo. Devemos criar objetos altamente reusveis, garantindo que seu
comportamento seja independente do ambiente ao redor.

65

Exemplo: Suponha as seguintes classes:


DATAS
PESSOA

dia, ms, ano

datas()
Niver
datas(d, m, a)
bissexto()
pessoa()
setDia(d)
pessoa(nome, d ,m ,a
setMes(m)
)
setAno(a)
setNome(nome)
getDia()
getNome()
getMes()
setNiver( d, m, a)
getAno()
getNiver()
verifica()
getIdade()
getData()
A classe datas, tem por finalidade verificar/ validar uma determinada data, e tambm
getIdade()
calcular a idade. Repare que as variveis de instncia da classe datas (dia, ms e ano) so
visveis apenas para os mtodos internos classe datas (ocultao da informao). Para
atribuir ou obter os valores das variveis dia, ms e ano, somente atravs dos mtodos
internos classe datas.
Uma classe pode ter referncias a objetos de outras classes. Por exemplo, a classe
Pessoa tem as seguintes variveis de instncia: Nome e Niver. Niver um objeto da classe
Datas. Essa capacidade chamada composio e referida como um relacionamento tem
um.
Nome

temum

import java.util.Calendar;
public class datas
{

// variaveis de instancia
private int dia, mes,ano;
public datas() {
dia=0; mes=0; ano=0;
}

public datas(int d,int m,int a) {


dia=d; mes=m; ano=a;
verifica();
}
public int bissexto() // se = 0 eh bissexto, caso contrario nao eh
{ if (((ano%4==0) && (ano%100>0)) || (ano%400==0))
return 0;
else return 1;
}
public void setDia(int d) { dia=d; }
public void setMes(int m) { mes=m; }

66

public void setAno(int a) { ano=a; }


public int getDia() { return dia; }
public int getMes() { return mes; }
public int getAno() { return ano; }
public void verifica()
{
int dmes[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
ano = ano > 0 ? ano:1;
dmes[2] = dmes[2]+bissexto();
mes = mes > 0 && mes < 13 ? mes:1;
dia = dia > 0 && dia <= dmes[mes] ? dia:1;
} // fecha verifica
public String getData()
{
verifica();
String nomes[] =
{"zero", "Janeiro","Fevereiro","Marco", "Abril", "Maio",
"Junho", "Julho", "Agosto", "Setembro", "Outubro",
"Novembro","Dezembro"};
String temp = dia+"/"+nomes[mes]+"/"+ano;
return (temp);
}
public int getIdade()
{
Calendar dataAtual = Calendar.getInstance();
//System.out.printf("Hoje= %tF\n",dataAtual);
int diaAtual = dataAtual.get(Calendar.DATE);
int mesAtual = dataAtual.get(Calendar.MONTH);
int anoAtual = dataAtual.get(Calendar.YEAR);
if ((mes > mesAtual) || ((mes == mesAtual) && (dia > diaAtual)))
return (anoAtual - ano - 1);
else return (anoAtual - ano);
}
}// fecha classe datas

Repare agora as mudanas na classe Pessoa. A classe Pessoa possui as seguintes


variveis de instncia: Nome e Niver. Niver um objeto da classe datas.
O objeto Niver contm a data de aniversrio da pessoa, mas os clculos e as variveis
internas a este objeto (Niver) so visveis apenas na classe Datas. Isto significa que Dia,
Ms e Ano no so visveis na classe Pessoa.
public class pessoa {
// variaveis de instancia
private String nome;
private datas niver;

67

// metodos
public pessoa()
{ nome=""; niver=new datas();
}
public pessoa(String nome, int d,int m, int a) {
this.nome=nome;
niver = new datas(d,m,a);
}
public void setNome( String nome) {
this.nome = nome; }
public void setNiver( int d, int m, int a) {
niver.setDia(d);
niver.setMes(m);
niver.setAno(a);
niver.verifica();
}
public String getNiver() {
return (niver.getData());
}
public int getIdade() {
return niver.getIdade();
}
public String getNome() {
return nome; }
}// fecha classe pessoa
Vejamos a utilizao da classe Pessoa, no programa abaixo (testaPessoa.java):
import java.util.Scanner;
public class testaPessoa{
public static void main (String args[]) {
pessoa pX = new pessoa();
pessoa pZ = new pessoa("Jose Romualdo da Silva",15,02,1986);
System.out.printf("nome Z= %s\nAniversario= %s\nIdade= %d\n",
pZ.getNome(),pZ.getNiver(),pZ.getIdade());
Scanner input = new Scanner( System.in );
System.out.printf("Entre com o nome: ");
String nome = input.nextLine();
pX.setNome(nome);
System.out.printf("\nEntre com o dia aniversario: ");
String dia = input.nextLine();
System.out.printf("\nEntre com o mes aniversario: ");
String mes = input.nextLine();
System.out.printf("\nEntre com o ano aniversario: ");
String ano = input.nextLine();
pX.setNiver(Integer.parseInt(dia),Integer.parseInt(mes),Integer.parseInt(ano));
System.out.println();
System.out.printf("nome X= %s\nAniversario %s\nIdade %d\n",
pX.getNome(),pX.getNiver(),pX.getIdade());
}
}

68

Herana Simples
comum encontrarmos classes que apresentem um comportamento muito prximo
do que necessitamos em uma aplicao especfica, mas que no sero teis se no formos
capazes de incluir as caractersticas particulares exigidas pela aplicao.
Para isto no necessrio alterar o cdigo fonte da classe, nem tampouco refazer
toda a classe. Isto abandonaria os conceitos de abstrao (independncia da aplicao),
encapsulamento e o principio da reusabilidade.
HERANA: permite que uma nova classe seja descrita a partir de outra classe j
existente, herdando suas propriedades. Dizemos que a subclasse herda os
mtodos e as variveis de instncia de sua superclasse.
A subclasse deve ser capaz tambm de adicionar novos mtodos e variveis de
instncia aos originais.
Na subclasse possvel redefinir os mtodos herdados, isto , refazer a
implementao do mtodo, sem que a superclasse precise ser modificada.
Embora os nomes dos mtodos possam ser duplicados na herana, os nomes da
variveis de instncia NO podem.
Assim, uma subclasse pode ser vista como uma especializao de sua superclasse. A
especializao envolve a adio ou modificao de caractersticas mas nunca sua subtrao.
superclasse PESSOA
Nome
Niver
pessoa()
pessoa(nome, d ,m ,a )
setNome(nome)
getNome()
setNiver( d, m, a)
getNiver()
getIdade()

Objeto Estudante PEDRO

subclasse ESTUDANTE
Matricula
Curso
Notas[4]
estudante()
estudante(nome, d ,m ,a, matr, curso, n1, n2, n3, n4 )
setMatricula(matr)
getMatricula()
setCurso(curso)
getCurso()
setNotas(n1, n2, n3, n4)
getMedia()

Dizemos que um Estudante -um Aluno.


O relacionamento -umrepresenta herana.

Nome: Pedro, Niver:


2/8/1983
Matricula: 3478
Curso:Informatica
Notas = { 8.5, 7.0, 9.5, 10 }
Mtodos:
todos os mtodos do Estudante
(setMatricula(), getCurso()
getMedia() .....)

todos os mtodos da
superclasse Pessoa
(getIdade(), getNiver(),
setNome(), ....)

69

Estudante.java
public class estudante extends pessoa
{
// variaveis de instancia
private String matricula;
private String curso;
private float notas[]= new float[4];
// metodos
public estudante()
{ super(); // chama constructor da superclasse Pessoa
matricula=""; curso="";
for (int i=0;i<4;i++)
notas[i]=0;
}
public estudante(String nome, int d,int m, int a,
String matr, String curso, float n1, float n2, float n3, float n4)
{
super(nome,d,m,a); // chama constructor da superclasse Pessoa
matricula = matr;
this.curso=curso;
notas[0]=n1; notas[1]=n2;
notas[2]=n3; notas[3]=n4;
}
public void setMatricula( String matr) {
matricula = matr; }
public void setCurso( String curso) {
this.curso = curso;
}
public String getMatricula() {
return (matricula);
}
public String getCurso() {
return (curso);
}
public float getMedia() {
return (notas[0]+notas[1]+notas[2]+notas[3])/4;
}
public void setNotas(float n1,float n2, float n3, float n4) {
notas[0]=n1; notas[1]=n2;
notas[2]=n3; notas[3]=n4;
}
}// fecha classe estudante

70

A seguir, temos a classe testaPesEstudante, que cria objetos das classes Pessoa e Estudante
import java.util.Scanner;
public class testaPesEstudante
{
public static void main (String args[])
{
pessoa p = new pessoa("Joao",15,02,1986);
System.out.printf("Pessoa nome= %s\nAniversario= %s\nIdade= %d\n\n",
p.getNome(),p.getNiver(),p.getIdade());
estudante e = new estudante("Pedro",20,12,1992,"1234","Informatica",7,8,9,10);
System.out.printf("Estudante nome= %s\nAniversario %s\nIdade %d\n"+
"Matricula= %s\nCurso= %s\nMedia= %.2f\n\n",
e.getNome(),e.getNiver(),e.getIdade(),
e.getMatricula(),e.getCurso(),e.getMedia());
}
}

Ao executarmos o testaPesEstudante, obtemos o seguinte resultado:


Pessoa nome= Joao
Aniversario= 15/Fevereiro/1986
Idade= 20
Estudante nome= Pedro
Aniversario 20/Dezembro/1992
Idade 13
Matricula= 1234
Curso= Informatica
Media= 8,50

Membros Public, Private e Protected


Os membros public de uma classe so visveis internamente e externamente classe .
Isto significa que as subClasses tambm tem acesso as variveis de instncia de sua
superClasse. Isto significa que NO devemos utilizar este tipo de modificador de
acesso para atender as regras de ocultao da informao;
Os membros private de uma classe s so acessveis por dentro da prpria classe.
Suponha que as variveis de instncia de uma superClasse foram declaradas como
private. Isto significa que as subClasses que herdam desta superClasse, no
conseguem enxergar/acessar as variveis de instncia herdadas da superClasse. E como
resolver isto? As subClasses devem utilizar os mtodos SET e GET da superClasse para
acessar/alterar as variveis de instncia herdadas. Deve-se priorizar a utilizao de
membros private com o objetivo de incentivar uma engenharia de software adequada.
O acesso protected oferece um nvel intermedirio entre acesso public e private. Isto
significa que as subClasses podem acessar diretamente as variveis de instncia da
superClasse, da qual herdaram. Podem surgir vrios problemas de manuteno do
software ao utilizar este modificador de acesso (protected). Iremos evitar o seu uso.

71

3.8 Classes Abstratas


So classes que nunca podero instanciar objetos, pois so classes incompletas. As
subclasses (herdadas da classe abstrata) devem declarar as partes ausentes.
O propsito de uma classe abstrata fornecer uma superclasse apropriada, a partir da
qual outras classes podem herdar e assim compartilhar um projeto comum.
No exemplo abaixo, a superClasse Empregado ser declarada Abstrata, ou seja, ser
uma classe definida com o propsito de especificar o que comum entre as subClasses
Assalariado, Comissionado, Horista e AssalariadoComissionado.
Empregado
Matricula
Nome
DataNiver
NomeDepto

Assalariado
salarioMensal
bonus

Comissionado
BrutoVendas
TaxaComissao
bonus

Horista
horasTrabalhadas
salarioHora
bonus

AssalariadoComissiona
do
salarioBase

A classe Abstrata contm um ou mais mtodos abstratos


Mtodos abstratos no fornecem implementaes
cada subClasse concreta de uma superClasse Abstrata deve, obrigatoriamente, reescrever os mtodos que foram declarados abstratos na superClasse. A
implementao (cdigo) do mtodo deve ser realizada na subClasse.
os construtores e mtodos static no podem ser declarados abstract
as subClasses no podem sobrescrever mtodos Static

A seguir tem-se as implementaes das classes acima especificadas.


a) superClasse ABSTRATA Empregado
public abstract class empregado
{
private String matricula;
private String nome;
private datas dataNiver;
public empregado() // constructor SEM parmetros
{ matricula=""; nome="";
dataNiver = new datas();
}

72

public empregado(String matricula, String nome, int d,int m, int a) // construtor COM
parmetros
{ this.nome = nome;
this.matricula = matricula;
dataNiver = new datas(d,m,a);
}

// metodo abstrato a ser reescrito e implementado nas subClasses


public abstract double vencimentos(); // nenhum implementacao aqui
public void setMatricula( String matr) {
matricula = matr; }
public void setNome( String nome) {
this.nome = nome;
}

public String getMatricula() {


return (matricula);
}

public String getNome() {


return (nome);
}

public void setAniversario(int d, int m, int a) {


dataNiver.setDia(d);
dataNiver.setMes(m);
dataNiver.setAno(a);
}

public int getIdade() {


return(dataNiver.getIdade());
}

public String toString() {


return String.format("\n\nMatricula=%s Nome=%s Idade=%d",
getMatricula(),getNome(),getIdade());
}
}// fecha classe empregado

b) subClasse Assalariado (herdada de Empregado)


public class assalariado extends empregado
{

private double salarioMensal;


private double bonus;
public assalariado()
{ super();
salarioMensal=0;
bonus=0;
}

public assalariado(String matricula, String nome, int d,int m, int a,


double salario,double bonus)
{

73

super(matricula,nome,d,m,a);
salarioMensal = salario;
this.bonus = bonus;
}

// metodo OBRIGATORIO devido a herana da superClasse abstrata Empregado


public double vencimentos() {
return (salarioMensal+bonus);
}
public void setSalario(double salario) {
salarioMensal = salario;
}
public void setBonus( double bonus) {
this.bonus = bonus;
}
public double getSalario() {
return (salarioMensal);
}
public double getBonus() {
return (bonus);
}
public String toString() {
String temp = "\nMensalista "+super.toString()+
String.format("Salario Mensal=$%,.2f Bonus=$%,.2f",getSalario(),getBonus());
return (temp);
}
}// fecha classe assalariado

c) subClasse Horista (herdada de Empregado)


public class horista extends empregado
{
private int horasTrabalhadas;
private double salarioHora;
private double bonus;
public horista() // constructor SEM parmetros
{ super();
salarioHora=0; horasTrabalhadas=0; bonus=0;
}
public horista(String matricula, String nome, int d,int m, int a,
int horasTrabalhadas, double salarioHora,double bonus) {
super(matricula,nome,d,m,a);
this.horasTrabalhadas = horasTrabalhadas;

74

this.salarioHora = salarioHora;
this.bonus = bonus;
}

// metodo OBRIGATORIO devido a heranca da superClasse abstrata Empregado


public double vencimentos() {
if (horasTrabalhadas <= 40)
return(horasTrabalhadas * salarioHora);
else {
int hsExtras = horasTrabalhadas - 40;
return((salarioHora * 40) + (hsExtras * (salarioHora * 1.5)));
}
}
public void setSalario(double salario) {
salarioHora = salario;
}
public void setBonus( double bonus) {
this.bonus = bonus;
}
public double getSalario() {
return (salarioHora);
}
public int getHsTrab() {
return(horasTrabalhadas);
}
public double getBonus() {
return (bonus);
}
public String toString() {
String temp = "\nHorista "+super.toString()+
String.format("Hs Trabalhadas=%d Salario Hora=$%,.2f Bonus=$%,.2f",
getHsTrab(),getSalario(),getBonus());
return (temp);
}
}// fecha classe Horista

d) subClasse Comissionado (herdada de Empregado)


public class comissionado extends empregado
{
private double brutoVendas;
private double taxaComissao;
private double bonus;

75

public comissionado()
{ super();
brutoVendas=0;
taxaComissao=0;
bonus=0;
}
public comissionado(String matricula, String nome, int d,int m, int a,
double brutoVendas, double taxaComissao,double bonus)
{
super(matricula,nome,d,m,a);
this.brutoVendas = brutoVendas;
this.taxaComissao = taxaComissao;
this.bonus = bonus;
}
// metodo OBRIGATORIO devido a heranca da superClasse abstrata Empregado
public double vencimentos() {
return (brutoVendas * taxaComissao);
}
public void setBrutoVendas(double bruto) {
brutoVendas = bruto;
}
public void setTaxa( double taxa) {
this.taxaComissao = taxa;
}
public void setBonus (double bonus) {
this.bonus = bonus;
}
public double getBrutoVendas() {
return (brutoVendas);
}
public double getTaxa() {
return(taxaComissao);
}
public double getBonus() {
return (bonus);
}
public String toString() {
String temp = "\nComissionado "+super.toString()+
String.format("Bruto das Vendas=$%,.2f Taxa Comissao=%.2f Bonus=$%,.2f",
getBrutoVendas(),getTaxa(),getBonus());
return (temp);
}

76

}// fecha classe Comissionado

d) subClasse AssalariadoComissionado (herdada de Comissionado)


Segundo a hierarquia de classes apresentada, a classe AssalariadoComissionado
herda da classe Comissionado, e a classe Comissionado herda da classe
Empregado. Desta forma, a subClasse Comissionado considerada superClasse
para a classe AssalariadoComissionado.
public class assalariadoComissionado extends comissionado
{
private double salarioBase;
public assalariadoComissionado()
{ super(); // chama constructor de Comissionado
salarioBase=0;
}
public assalariadoComissionado(String matricula,String nome,int d,int m,int a,
double brutoVendas,double taxaComissao,double bonus,
double salarioBase)
{
super(matricula,nome,d,m,a,brutoVendas,taxaComissao,bonus);
//
constructor
Comissionado
this.salarioBase = salarioBase;
}
// metodo OBRIGATORIO devido a herana
public double vencimentos() {
return (salarioBase+ super.vencimentos());
}
public void setSalarioBase(double salario) {
salarioBase = salario;
}
public double getSalarioBase() {
return (salarioBase);
}
public String toString() {
String temp = "\nAssalariado Commissionado "+super.toString()+
String.format("Salario Base=$%,.2f",getSalarioBase());
return (temp);
}
}// fecha classe assalariadoComissionado

Agora temos a classe testaEmpregado, cujo propsito testar as classes anteriormente


implementadas.
import java.util.Scanner;
public class testaEmpregado0

77

de

{
public static void main (String args[])
{
// NAO pode instanciar o empregado, porque Empregado eh uma classe Abstrata
//empregado e = new empregado("1111","Joao",1,1,1981); errado!!!
assalariado a = new assalariado("2222","Pedro",2,2,1982,2500.00,0.0);
System.out.printf ( a.toString());
comissionado c = new comissionado("3333","Fabio",3,3,1983,45000.00,0.03,0.0);
System.out.printf ( c.toString());
horista h = new horista("4444","Julia",4,4,1984,38,35.50,0.0);
System.out.printf ( h.toString());
assalariadoComissionado ac = new
assalariadoComissionado("5555","Joaquina",5,5,1985,60000.00,0.05,0.0,350.00);
System.out.printf ( ac.toString());
}// fecha o main
} // fecha a classe TestaEmpregado0

Ao executarmos o programa testaEmpregado, obtemos o seguinte resultado:


Mensalista
Matricula=2222 Nome=Pedro Idade=24 Salario Mensal=$2.500,00 Bonus=$0,00
Comissionado
Matricula=3333 Nome=Fabio Idade=23 Bruto das Vendas=$45.000,00 Taxa Comissao=0,03
Bonus=$0,00
Horista
Matricula=4444 Nome=Julia Idade=22 Hs Trabalhadas=38 Salario Hora=$35,50 Bonus=$0,00
Assalariado Comissionado
Comissionado
Matricula=5555 Nome=Joaquina Idade=21 Bruto das Vendas=$60.000,00 Taxa Comissao=0,05
Bonus=$0,00 Salario Base=$350,00

Polimorfismo

Chamamos de polimorfismo a criao de uma famlia de funes que compartilham do


mesmo nome, mas cada uma tem cdigo independente.
Permite que um mtodo aceite como parmetro objetos de mais uma classe. Para isto
necessrio construir mtodos capazes de receber diversos tipos de objetos como
parmetros. No entanto, necessrio que o protocolo de suas classes tenham um
mnimo de afinidade (herana).

Exemplo polimrfico
Considere a hierarquia de classes implementada no captulo 8 (Empregado).
78

A classe polimorCompilacao demonstra um comportamento polimrfico.


import java.util.Scanner;
public class polimorCompilacao
{
public static void main (String args[])
{
comissionado c = new comissionado("1111","Tereza",1,1,1981,45000.00,0.03,0.0);
System.out.printf("\n %s",c.toString(),"\n");
assalariadoComissionado ac = new
assalariadoComissionado("2222","Pedrao",2,2,1982,60000.00,0.05,0.0,350.00);
System.out.printf("\n %s",ac.toString(),"\n");
comissionado x = new
assalariadoComissionado("3333","Poliana",3,3,1983,12500.00,0.05,0.0,650.00);
System.out.printf("\n %s",x.toString(),"\n");
}// fecha main
} // fecha classe polimorCompilacao

O objeto c do tipo Comissionado. Portanto, quando utiliza-se c.toString() no


comando de impresso, evidente qual mtodo est sendo invocado (o mtodo toString da
prpria classe comissionado).
O mesmo pode ser observado para o objeto ac que do tipo
assalariadoComissionado.
comissionado

O objeto x um caso especial.


Lembre-se que assalariadoComissionado -um comissionado.

assalariadoComissio
nado

// superClasse = subClasse
comissionado x = new assalariadoComissionado
("3333","Poliana",3,3,1983,12500.00,0.05,0.0,650.00);
System.out.printf("\n %s",x.toString(),"\n");

Ao invocar x.toString(), executado o mtodo toString da subClasse


assalariadoComissionado. O compilador Java permite esse cruzamento porque um objeto
de uma subClasse um objeto de sua superClasse.
O resultado ao executarmos o programa com a classe polimorCompilacao :
Comissionado
Matricula=1111 Nome=Tereza Idade=25 Bruto das Vendas=$45.000,00 Taxa
Comissao=0,03 Bonus=$0,00
Assalariado Commissionado
Comissionado
Matricula=2222 Nome=Pedrao Idade=24 Bruto das Vendas=$60.000,00 Taxa
Comissao=0,05 Bonus=$0,00 Salario Base=$350,00
Assalariado Commissionado
Comissionado

79

Matricula=3333 Nome=Poliana Idade=23 Bruto das Vendas=$12.500,00 Taxa


Comissao=0,05 Bonus=$0,00 Salario Base=$650,00

Polimorfismo em tempo de Execuo


Exemplo de Array Polimrfico: considere a hierarquia de classes anteriormente
criadas:
Empregado,
Comissionado,
Horista,
Assalariado
e
AssalariadoComissionado.
Utilizaremos um vetor (array) para armazenar objetos do tipo Empregado.
Se cada posio do array armazena um objeto do tipo Empregado, tambm
pode
armazenar
objetos
do
tipo
Horista,
Assalariado,
AssalariadoComissionado e Comissionado, pois estes objetos so derivados
da classe Empregado (relacionamento -um). Veja ilustrao abaixo.
0
4

Assalariado
Assalaria
do
AssalariadoComission
Comissionad
ado
o
Vamos refazer a classe testaEmpregado:
Horista

import java.util.Scanner;
public class testaEmpregado
{
public static void main (String args[])
{
// cria os empregados
horista h = new horista("0000","Zero",1,1,1980,38,35.50,0.0);
assalariadoComissionado ac = new
assalariadoComissionado("1111","Um-zao",1,1,1981,60000.00,0.05,0.0,350.00);
assalariado a2 = new assalariado("2222","Dois-zao",2,2,1982,2500.00,0.0);
comissionado c = new comissionado("3333","Tres-zao",3,3,1983,45000.00,0.03,0.0);
assalariado a4 = new assalariado("4444","Quatro-zao",4,4,1984,2500.00,0.0);
// cria o array polimorfico - array de Empregados
empregado vetor[] = new empregado[5];
// armazena os objetos das subclasses no array
vetor[0] = h; // horista
vetor[1] = ac; // assalariado Comissionado
vetor[2] = a2; // assalariado
vetor[3] = c; // comissionado
vetor[4] = a4; // assalariado
for (int i=0;i<5;i++)
{// exibe o tipo de cada objeto do array Empregado
System.out.printf("Empregado[%d] um %s\n",i,vetor[i].getClass().getName());
// exibe o nome e o salrio final do empregado

80

System.out.printf("Nome= %s Salario Final= $%,.2f\n\n",


vetor[i].getNome(), vetor[i].vencimentos());
}
}// fecha main

} // fecha classe testaEmpregado

OBSERVAO: somente em tempo de execuo possvel descobrir o tipo de empregado


armazenado em cada posio do vetor.
Veja o resultado exibido na tela, ao executarmos a classe testaEmpregado:
Empregado[0] um horista
Nome= Zero Salario Final= $1.349,00
Empregado[1] um assalariadoComissionado
Nome= Um-zao Salario Final= $3.350,00
Empregado[2] um assalariado
Nome= Dois-zao Salario Final= $2.500,00
Empregado[3] um comissionado
Nome= Tres-zao Salario Final= $1.350,00
Empregado[4] um assalariado
Nome= Quatro-zao Salario Final= $2.500,00

9.3 Resumo das atribuies permitidas entre superClasses e subClasses:


superClasse <= superClasse
comissionado k = new comissionado(1234, Jose, 3,3,1983,45000.00,0.03,0.0);
comissionado m = k;
esta operao simples e direta
subClasse <= subClasse
assalariadoComissionado h = new assalariadoComissionado
("1111","Pedro",1,1,1981,60000.00,0.05,0.0,350.00);
assalariadoComissionado r = h;
esta operao simples e direta
// superClasse <= subClasse
comissionado x = new assalariadoComissionado ("3333","Poliana",3,3,1983,12500.00,0.05,0.0,650.00);
superClasse <= subClasse. Este tipo de atribuio possvel, mas apenas pode ser utilizado para
referenciar os membros/mtodos da superClasse. Se desejamos invocar um mtodo da subClasse por
meio do objeto x, o compilador informar erros.
x.setSalarioBase(novoSalario); // erro!!!
x.getSalarioBase() // erro!!!! getSalarioBase e setSalarioBase so da subClasse
x.toString(); // correto, executar o mtodo toString() da subClasse
// subClasse <= superClasse
assalariadoComissionado z = (assalariadoComissionado) vetor[i];

No exemplo acima, vetor um array de objetos do tipo empregado (superClasse). Para


realizar esta atribuio necessrio fazer uma coero explcita para o tipo da subClasse. O

81

correto verificar primeiramente se o objeto armazenado no vetor[i] mesmo um tipo


assalariadoComissionado, antes de realizar a coero.
for (i=0; i < 5; i++)
if (vetor[i] instanceof assalariadoComissionado) {
assalariadoComissionado z = (assalariadoComissionado) vetor[i];
z.setSalarioBase(6500.00); // correto!!
}

Interface
Interface semelhante a herana, porm a interface fora uma relao entre duas ou
mais classes que no possuem caractersticas em comum.
Uma interface especifica quais operaes (mtodos) os usurios podero invocar, mas
no especifica como estas operaes sero realizadas (na interface, os mtodos no contm
implementao).
Uma declarao de interface inicia-se com a palavra-chave interface e contm somente
constantes e mtodos abstract. Diferentemente das classes, todos os membros da interface
devem ser public e as interfaces no podem especificar nenhum detalhe de implementao
como declaraes de mtodo concretos e variveis de instncia.
Portanto, todos os mtodos declarados em uma interface so mtodos public abstract
(sem implementao) e todos os campos so public, static e final (ou seja, constantes).
Na hierarquia abaixo, modificaremos a classe Empregado. No captulo anterior ela foi
declarada como uma classe abstrata, agora ela ser concreta. Como ela implementa a
interface Pagamento, obrigatoriamente dever implementar o mtodo getPagamento().
Interface Pagamento

mtodo
getPagamento()
classe concreta Fatura

classe concreta
Empregado

parteNumero, parteDescrio,
quantidade, precoPorItem

Matricula, Nome,
Salario

Sets e Gets
toString()
getPagamento() // obrigatorio

Sets e Gets
to String()
getPagamento() //
obrigatorio

a) Interface Pagamento

public interface pagamento


{
double getPagamento(); // nenhuma implementao aqui
}
b) classe concreta Fatura
public class fatura implements pagamento

private String parteNumero;

82

private String parteDescricao;


private int quantidade;
private double precoPorItem;
public fatura(String parteN, String parteD, int cont, double preco)
{

parteNumero=parteN;
parteDescricao=parteD;
quantidade = cont;
precoPorItem=preco;
}
public void setParteNumero(String parte) { parteNumero=parte; }
public String getParteNumero() { return parteNumero; }
public void setParteDescricao(String parte) { parteDescricao=parte; }
public String getParteDescricao() { return parteDescricao; }
public void setQuantidade(int q) { quantidade = q; }
public int getQuantidade() { return(quantidade); }
public void setPreco(double p) { precoPorItem = p; }
public double getPreco() { return(precoPorItem); }
public String toString() {
return String.format("%s %s: %s (%s) %s: %d %s: $%,.2f",
"Fatura ","Numero",getParteNumero(), getParteDescricao(),
"quantidade",getQuantidade(),"Preco por Item",getPreco());
}
// metodo obrigatorio para executar o contrato com a interface pagamento
public double getPagamento()
{
return getQuantidade() * getPreco();
}
}

c) classe concreta Empregado


public class empregado implements pagamento
{
private String matricula;
private String nome;
private double salario;
public empregado(String matricula, String nome, double salario)
{
this.nome = nome;
this.matricula = matricula;
this.salario = salario;
}
public String getNome() { return nome; }
public String getMatricula() { return matricula; }
public double getSalario() { return salario; }
public void setSalario(double sal) { salario = sal < 0.0 ? 0.0: sal;

// metodo OBRIGATORIO pois implementa a interface Pagamento

83

public double getPagamento() {

return getSalario();

public String toString() {


return String.format("\n\nMatricula=%s Nome=%s Salario=$%,.2f",
getMatricula(),getNome(),getSalario()); }
}// fecha classe empregado

Semelhante ao programa apresentado no captulo 9.2 (Polimorfismo em tempo de


execuo), iremos criar um array de 4 posies para armazenar objetos do tipo Pagamento.
Devido a hierarquia construda, podemos armazenar no vetor objetos do tipo Fatura e
Empregado, que so derivados da interface Pagamento.
0

Fatura

Empregad
o
Empregado
d) Array polimrfico utilizando as classes Empregado e Fatura (testaInterface)
public class testaInterface
{
public static void main(String args[])
{
// cria array Pagamento de quatro posies, de 0 ate 3
pagamento vetor[] = new pagamento[4];
Fatura

vetor[0] = new fatura("1234","TV 29 poleg",100,980.00);


vetor[1] = new fatura("2345","DVD Hitachi",80,299.00);
vetor[2] = new empregado("1111","Espartacus Pereira",2500.00);
vetor[3] = new empregado("2222","Romualdo Silva",1800.00);
for (pagamento atual : vetor)
{
System.out.printf("%s \n%s: $%,.2f\n\n",
atual.toString(),
"Pagamento correspondente",atual.getPagamento());
}// fecha for
}// fecha main
}// fecha testaInterface
e) Resultado obtido
Fatura Numero: 1234 (TV 29 poleg) quant: 100 Preco/Item:
$980,00
Pagamento correspondente: $98.000,00
Fatura Numero: 2345 (DVD Hitachi) quant: 80 Preco/Item:
$299,00
Pagamento correspondente: $23.920,00

84

Matricula=1111 Nome=Espartacus Pereira Salario=$2.500,00


Pagamento correspondente: $2.500,00
Matricula=2222 Nome=Romualdo Silva Salario=$1.800,00
Pagamento correspondente: $1.800,00

Exemplo
Desenvolva em Java, uma aplicao para movimentar contas bancrias que implemente
a seguinte hierarquia de classes:
ContaCorrente
Numero
Nome
Saldo
Constructor sem argum.
Constructor com argum.
Credita(valor)
Debita (valor)
Consulta

ContaEspecial
Limite
Constructor com arg
Constructor sem arg
Debita (valor)
Consulta

Poupana
SaldoMinimo
DataAniversario

Constructor sem arg


Constructor com arg
Consulta
Debita(valor)
AtualizaSaldo(taxa)
A aplicao deve incluir, para todos os tipos de contas, as funes: cadastrar, creditar,
debitar e consultar saldo. Cada tipo de conta dever ser definida atravs de uma classe
prpria. As classes ContaEspecial e Poupana herdaro variveis de instncia e mtodos da
superclasse ContaCorrente mas, tambm, devem definir mtodos prprios e redefinir
mtodos herdados, se for o caso.
Declarar as classes em unidades separadas (Package).
Implementar uma coleo de contas atravs de um vetor (array) do tipo ContaCorrente.
0

ContaCorre
Poupana
nte
ContaEspecial
ContaEspeci
al
// cria array Banco com 50 posies, de 0 ate 49
contaCorrente banco[] = new contaCorrente[50];

85

Você também pode gostar