Escolar Documentos
Profissional Documentos
Cultura Documentos
ALGORITMOS
E
TCNICAS DE DESENVOLVIMENTO
DE PROGRAMAS
Implementao: Java
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.
Disciplina: ALGORITMOS
Professora: Liliane da Silva Coelho Jacon
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.
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)
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
Memria
nome
contedo
6
2F8D
Endereo de
memria do x
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.
compilador
Bytecode
JVM
Processado
r
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.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
// 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
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.
11
12
Aparecer do lado direito da janela (figura 7) o local onde ser digitado o cdigo fonte, ou
seja, o algoritmo propriamente dito.
13
14
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 ... (
15
16
17
A execuo do programa ser realizada no canto inferior direito da janela, como mostra a
figura 16.
18
19
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
21
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.
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
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
If (condio)
{
(comandos);
}
else {
(comandos);
}
25
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
27
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.
28
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
29
JOptionPane.showInputDialog(null,"Por
favor,
digite
seu
nome","Ateno",
JOptionPane.WARNING_MESSAGE);
30
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
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
1
3
5
99
--- + --- + --- + ..... + ---1
2
3
50
b) S =
21
22
23
250
--- + --- + ---- + ..... + ----50
49
48
1
c) S =
d) S =
1
2
3
--- + ---- + ---- + ....
1
4
9
10
+ ----100
475
465
---- + ------ - ......
11
12
33
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);
}
}
}
34
Exemplo 1:
int i = 10;
while (i < 10)
No executar o
comando dentro do while
System.out.printf(\nNumero=%d,i);
}
Exemplo 2:
System.out.printf(\nNumero=%d,num);
}
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++;
}
}
}
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.
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.
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
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
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 .....
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);
}
mensagem();
}
Parmetros Reais
Quando se faz a chamada a uma funo, os parmetros passados so denominados parmetros reais.
40
41
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 resul=1;
for (int i=1;i<=m,i++)
resul=resul*n;
return resul;
}
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];
programa.
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
45
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
Vetor1
0
10
1
20
2
30
3
40
4
50
0
5
15
28
41
130
44
Vetor2
1
8
2
11
3
90
4
-6
#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
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
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]);
}
}
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++)
{
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
20
40
60
80
100
30
60
5
15
25
40
80
15
6
30
50
100
25
30
35
25
5
10
15
20
1
6
11
16
21
7
12
17
22
2
13
18
23
3
8
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
53
54
55
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
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;
}
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
{
62
63
64
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
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;
}
66
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()
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()
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());
}
}
71
Assalariado
salarioMensal
bonus
Comissionado
BrutoVendas
TaxaComissao
bonus
Horista
horasTrabalhadas
salarioHora
bonus
AssalariadoComissiona
do
salarioBase
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);
}
73
super(matricula,nome,d,m,a);
salarioMensal = salario;
this.bonus = bonus;
}
74
this.salarioHora = salarioHora;
this.bonus = 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
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
Polimorfismo
Exemplo polimrfico
Considere a hierarquia de classes implementada no captulo 8 (Empregado).
78
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");
79
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
81
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
82
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();
}
}
83
return getSalario();
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
84
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
ContaCorre
Poupana
nte
ContaEspecial
ContaEspeci
al
// cria array Banco com 50 posies, de 0 ate 49
contaCorrente banco[] = new contaCorrente[50];
85