You are on page 1of 61

CINCIA DA COMPUTAO

PROF. AIR RABELO

2015

1 - Introduo a Programao
1.1 - Algoritmo
a descrio seqencial de aes a serem executados para o cumprimentode uma determinada
tarefa.
a forma pela qual descrevemos solues para problemas que sero implementadas posteriormente
em uma linguagem de programao e executadas pelo computador.
Pode ser escrito atravs de pseudo linguagens, como o Portugol, ou smbolos como em fluxogramas.
1.2 - Algoritmo x Programa
Um programa a converso, ou traduo, de um algoritmo para uma determinada linguagem de
programao, segundo suas regras de sintaxe esemntica da linguagem, de forma a permitir que o
computador possa interpretar e executar a seqncia de comandos pretendidos.
1.3 - Linguagem de Programao
Uma linguagem de programao um conjunto de smbolos (comandos,identificadores, caracteres
ASCII, etc. ...) e regras de sintaxe que permitem aconstruo de sentenas que descrevem de forma
precisa aes compreensveis eexecutveis para o computador.
1.4 Programa Fonte
O programa que escrevemos utilizando uma linguagem de programao, como o Pascal, a linguagem
C, Java, e outras, chamado de Programa Fonte. As linguagens de programao permitem que os
programas sejam escritos e interpretados pelo homem, mas no pode ser interpretado pelo
computador.
1.5 Programa Objeto
Programa Objeto a seqncia de comandos de um programa escritos em linguagem de mquina. A
linguagem de mquina composta de smbolos binrios que interpretada pelo computador, mas no
pode ser interpretada pelo homem.
1.6 Compilador
Compilador um programa que traduz o Programa Fonte escrito por um programador em um
Programa Objeto a ser interpretado pelo computador. Ou seja, um tradutor de Programa Fonte em
Programa Objeto.
1.7 A tabela ASCII
ASCII (American Standard Code for Information Interchange), em portugus: "Cdigo Padro
Americano para o Intercmbio de Informao". umacodificao de caracteres de sete bits (27 = 128
cdigos) ou 8 bits - ASCII estendida (28 = 256 cdigos) baseada no alfabeto ingls. Cada sequencia de
cdigos na tabela ASCII corresponde a um caractere, comumente representados pelos 8 bits
(equivalente a um byte). Os cdigos ASCII representam texto em computadores. Desenvolvida a partir
de 1960, grande parte das codificaes de caracteres modernas a herdaram como base.
O quadro abaixo mostra uma parte da tabela ASCII com os caracteres mais utilizados em
programao:

Apostila de LTP2 Java - Air Rabelo

2 - A Linguagem JAVA
Java uma linguagem de programao orientada a objeto desenvolvida na dcada de 90 por uma
equipe de programadores chefiada por James Gosling, na empresa SunMicrosystems.
Diferentemente das linguagens convencionais, que so compiladas para cdigo nativo, a linguagem
Java compilada para um bytecode que executado por uma mquina virtual.

Apostila de LTP2 Java - Air Rabelo

A linguagem Java possui como principais vantagens e/ou caractersticas:


- simplicidade na escrita dos programas;
- portabilidade entre diferentes plataformas de sistemas
operacionais e hardware;
- grande similaridade com as linguagens C, C++ e C#;
- vasta biblioteca de classes;
- entre outras.

- segurana;
- orientao a objetos;
- recursos de rede;
- alta performance;

A sintaxe da linguagem Java se assemelha ao C++. Os programas fontes so arquivos do tipo texto
gravados com extenso .java . Estes programas fonte devem ser compilados com o copilador javac,
para a gerao do programa objeto Java com extenso .class , que so interpretados pela Mquina
Virtual Java (Java Virtual Machine).
Curiosidade: no ingls americano java uma verso
informal da palavra caf, ou seja, java significa caf,
da o motivo do smbolo da linguagem Java ser uma
chcara.

3 - Estrutura de um programa em Java:


Umprograma em java estruturado da seguinte forma:

import NOME_PACOTE_DE_CLASSES;//nome dos pacotes de classes Java que


// sero utilizados neste programa
public class NOME_CLASSE {//nome da classe a ser criada
public static void main (String[] args) {//declarao do mtodo principal
<bloco de comandos>;
}
}
OBS: O Java faz distino entre letras minsculas e letras maisculas, portanto,
comandos e tipos escritos em letras minsculas so diferentes de maisculas. Alguns
comandos so escritos apenas em letras minsculas, outros em letras maisculas, e
tambm podem utilizar maisculas e minsculas.
Os pacotes so arquivos que podem conter vrias classes, as classes podem conter vrios
mtodos. A diretiva import permite que o programa reconhea as classes do pacote e de
seus mtodos.

4 Comentrios no programa
Comentrios so textos inseridos no programa fonte com o objetivo de explicar ou
documentar uma lgica, uma varivel ou outro objeto qualquer.Os comentrios so ignorados
pelo compilador, portanto no so levados para o programa objeto. Os comentrios podem
ocupar uma ou mais linhas no programa, e para inseri-los se utiliza os smbolos /*...*/ ou
//
Apostila de LTP2 Java - Air Rabelo

Exemplos:
/* comentrio 1
comentrio 2 */
// comentrio 1
// comentrio 2

5 Variveis
Varivel uma regio identificada da memria que tem por finalidade armazenar informaes (dados)
de um programa em execuo. Uma varivel armazena apenas um valor por vez.
Toda vez que um valor atribudo a uma varivel, o seu valor anterior ser sobreposto. Portanto as
variveis armazenam apenas o ultimo valor atribudo a elas.
Sendo consideradocomo valor o contedo de uma varivel, este valor est associado ao tipo de dado
da varivel (inteiro, real, lgico, caracter, ...).

5.1 Nomes de Variveis e outros tipos


Os nomes dados a variveis, constantes,classes, mtodos, tipos de dados, e outros objetos devem
seguir as seguintes regras:
-o primeiro caracter deve ser sempre uma letra, o caracter underline ( _ ), ou o caracter $
- os demais caracteres podem sersomente letras, nmeros ouos caracteresunderline( _ ) e $
-os nomes devem ser simples e descritivos e podem conter qualquer quantidade de caracter.
Nomes segundo os Padres de codificao Java definidos pela Sun:
Variveis e mtodos: devem ser escritos em letras minsculas, e se forem nomes compostos, para
diferenciar uma palavra da outra, a partir da segunda palavra, a primeira letra de cada palavra deve ter
letras maisculas.
O nome de uma varivel deve indicar o que ela armazenar, exemplo:
- varivel para armazenar a idade do aluno:
idadeAluno
pesoAtleta
- varivel para armazenar o peso do atleta:
O nome de um mtodo deve indicar qual a ao ele desempenha, e para isto dever utilizar um verbo,
exemplo:
- mtodo para calcular o salrio do empregado:
calcularSalario
- mtodo para receber a altura do empregado:
receberAltura
Classes e tipos de dados: j os nomes de classes devem ser escritos com a primeira letra de cada
palavra em maisculo e as demais letras em minsculo, exemplo: ProgramaExemplo.
Constantes: devem ser escritas com letras maisculas, exemplo: PI

VELOCIDADE_LUZ

5.2 Tipos de Variveis


Estudaremos variveis de 3 classes:
- NUMRICAS aceitam somente dgitos, e possuem valor numrico Ex: 0,1,2, 5.10 ...
- ALFANUMRICAS qualquer caracter da tabela ASCII. Ex:a,b,c,A,B,C,!,@,#, 0, 1,2, ...

Apostila de LTP2 Java - Air Rabelo

- LGICAS - assumem apenas dois valores: true ou false,ou seja, verdadeiro e falso.

5.2.1 - Tipos de Dados


Os tipos de dados mais utilizados so:
byte,intelong
floate double
chare String
boolean

-para nmeros inteiros


-para nmeros reais
- para valores caracter
- para valores lgicos (true ou false)

Tipos de dados mais bsicos da Java:


Tipo de dado

Valores que podem assumir

Tamanho em bytes na memria

byte

de 128 at 127

int

de 2.147.483.648 a 2.147.483.647

long

De -9.223.372.036.854.775.808 a

9.223.372.036.854.775.807
float

de3.4 x1038a3.4 x 1038

double

de 1.7 x10308a 1.7 x 10308

char

armazena apenas um caracter

String

armazena um conjunto de caracteres

cada caracter = 1 byte

boolean

true ou false

1 bit

5.3 Declarao de Variveis no Java


No Java as variveis podem ser declaradas em qualquer parte do programa, bastando para isto
escrever em uma linha de comando o tipo da varivel e em seguida o nome da varivel. Podem ser
declaradas dentro das classes ou mtodos.
Variveis declaradas dentro de um mtodo so consideradas variveis locais, ou seja, s so vlidas
somente dentro daquele mtodo. Variveis declaradas em uma classe so consideradas locais para
aquela classe e globais para os mtodos existentes dentro daquela classe, ou seja, so vlidas em
todos os mtodos criados dentro daquela classe.

Exemplo:

publicclassClasseExemplo1{
publicstaticvoid main (String[] args) {
int idade;
floatsalario, peso, altura;
String nomeAluno;
char sexo;
booleanalunoFoiAprovado;
}
}
Apostila de LTP2 Java - Air Rabelo

5.4 Atribuio de valores as Variveis


Para se atribuir uma valor a uma varivel utiliza-se o comando de Atribuio do Java ( = ).
Para atribuir um caracter a uma varivel do tipo charutiliza-se o apstrofe ( ), entretanto, quando se
trata de um conjunto de caracteres atribudos a uma varivel do tipo String, se utiliza aspas ( ).
Exemplo:

idade = 25;
salario = 2786.50;
nomeAluno= "Marcelo dos Santos";
sexo = 'F';
alunoFoiAprovado = true;

//
//
//
//
//

tipo
tipo
tipo
tipo
tipo

int
float
String
char
boolean

6 Linha de Comando no Java


Uma linha de comando no Java pode ocupar uma ou mais linhas no programa fonte, e sempre se
encerra com ponto-e-vrgula ( ; ). H tambm a possibilidade de se escrever mais de uma linha de
comando em uma mesma linha do programa fonte, masesta prtica deve ser evitada pois dificulta a
interpretao da lgica, a no ser que os motivos sejam bem claros.
Exemplo:
salario = 2786.50;
//uma linha de comando em uma linha de programa fonte
nomeDoAluno = "Marcelo dos Santos";
sexo = 'F'; aprovado = true; //2 comandos em uma linha, evitar isto !!
salario = salario + tempoCasa descontoValeTransp + 5 / 100 * 2 +
2786.50; // 1 comando em duas linhas do programa fonte
texto = "O Java uma linguagem de programao orientada a objeto que visa"
+ " ampliar a produtividade"; // 1 comando em duas linhas do programa fonte
Obs: segundo os padres de codificao Java definidos pela Sun, um linha de comando no deve
ultrapassar 80 caracteres, facilitando a visualizao do fonte mesmo em monitores com baixa
resoluo. Neste caso, o comando deve continuar na linha seguinte, mas sempre identado em relao
primeira linha do comando, como no ultimo exemplo acima.

7 Operadores
7.1 - Operadores Aritmticos
Os operadores aritmticos so utilizados para efetuar operaes aritmticas comnmero inteiros e
reais. So eles:
Operador
+
*
/
%
-++

O que representa
Soma
Subtrao
Multiplicao
Diviso
Resto da diviso
decremento de 1
Incremento de 1

Exemplo de uso
b + c
b a
x * y
x / y
10 % 3
a-a++

// resultado ser 1
// mesmo que a = a - 1
// mesmo que a = a + 1

Apostila de LTP2 Java - Air Rabelo

+=
-=
*=
/=
%=
= ++
=

++

= -=

--

Soma com atribuio


Subtrao com atribuio
Multiplicao com atribuio
Diviso com atribuio
Resto da diviso com atribuio
Incremento de 1 com atribuio
(equivale a dois comandos)
Atribuio com incremento de 1
(equivale a dois comandos)
decremento de 1 com atribuio
(equivale a dois comandos)
Atribuio com decremento de 1
(equivale a dois comandos)

a
x
b
x
a
b

+= b
-= y
*= c
/= y
%= b
= ++a

b = a++
b = --a
b = a--

//
//
//
//
//
//
//
//
//
//
//
//
//

mesmo que a = a + b
mesmo que x = x - y
mesmo que b = b * c
mesmo que x = x / y
mesmo que a = a % b
mesmo que a = a + 1
em seguida b = a
mesmo que b = a
em seguida a = a + 1
mesmo que a = a - 1
em seguida b = a
mesmo que b = a
em seguida a = a - 1

OBS:Em Java, toda diviso entre inteiros resulta em um outro inteiro, ou seja, as casas decimais so
eliminadas (truncadas). Desta forma, uma diviso s retorna valor real (double ou float) contendo
casas decimais se um dos valores estiver expresso em casas decimais ou se for incluido no clculo o
tipo do resultado (typecasting).
Exemplo 1:
int idade = 21;
double fator = 200 / idade;
No Exemplo acima, o resultado da diviso 200 / idade que ser atribudo a varivel fator ser o
valor inteiro 9 ao invs de 9.5238, que o resultado real da diviso. Ou seja, como os operandos so
valores inteiros, o resultado da operao tambm ser inteiro, independentemente da varivel fator,
que est recebendo este resultado, ser do tipo double.
Exemplo 2:
int idade = 21;
double fator = (double) 200 / idade;
Neste segundo exemplo foi inserida na operao, entre parenteses, o tipo do resultado desejado,
neste caso, o valor que ser atribuido a varivel fator ser 9.5238 .

7.2 - Operadores Relacionais


Os operadores relacionais so utilizados para efetuar a comparao entre dadosde mesmo tipo. So
eles:
Operador

>
<
>=
<=
!=
==

O que representa
Maior que
Menor que
Maior ou igual a
Menor ou igual a
Diferente de
Igual a

O resultado de uma operao relacional sempre um valor lgico, ou seja, trueou false.

Apostila de LTP2 Java - Air Rabelo

Exemplos, considere a = 1, b = 3 e c = 5

c
a
b
a

== a
> b
<= c
!= b

//
//
//
//

false
false
true
true

7.3 - Operadores Lgicos


Os operadores lgicos so utilizados para se criar expresses Relacionais compostas. So eles:
Operador

&&
||
!

O que representa
e (juno)
ou (escolha)
no (negao ou inverso)

Exemplos:

Considere a = 1 , b = 3 e c = 5
((a > b)&&(b <= c)) // FALSE e TRUE =>
FALSE
((a != b) || (c < b))
// TRUE ou FALSE =>
TRUE
(!(b <= c))
// no TRUE
=>
FALSE
Obs: no Java, todas os testes condicionais devem estar dentro de parnteses, os demais
parenteses separando as partes de uma expresso composta so opcionais. No entanto, esta
separao recomendada segundo os padres de codificao Java da Sun Microsystem para
facilitar o entendimento das prioridades da execuo.
7.4 -Tabela verdade para operaes lgicas:
Abaixo, segue trs tabelas, chamadas tabela-verdade, contendo o resultado douso dos operadores
lgicos sobre dois operandos.
Operando 1
true
true
false
true
true
false
-------------

Operador
e
e
e
ou
ou
ou
no
no

Operando 2
true
false
false
true
false
false
true
false

Resultado
true
false
false
true
true
false
false
true

7.5 - Prioridade das Operaes


Se vrios operadores aparecerem em uma expresso, a ordem de execuo dasoperaes ser
dadasegundo os seguintes critrios seqenciais:
1.
2.
3.
4.
5.

Parnteses ( )
Mtodos (funes) Ex: Math.round() , Math.pow(), ...
Multiplicao, Diviso e Resto da Diviso * ,/ ,%
Soma e Subtrao + , Operadores Relacionais, sem ordem entre eles > , <,>=,<=,!=,==

Apostila de LTP2 Java - Air Rabelo

6.
Operadores Lgicos na seguinte ordem: no, e, ou ! , && , ||
7.6 - Operador de Concatenao
O operador de concatenao efetua a juno de duas variveis ou constantes do tipo Stringou
char.
Exemplo:

publicclassExemploConcatenacao {
publicstaticvoid main(String[] args) {
String nome, sobreNome, nomeCompleto;
// Suponhamos o nome Josias Santos
nome = "Josias";
sobreNome = "Santos";
nomeCompleto = nome + ' ' + sobreNome;
System.out.println( nomeCompleto );
// Josias Santos
nomeCompleto = "Jose" + ' ' + "Maria";
System.out.println( nomeCompleto );
// Jose Maria
}
}

8 Comandos de Entrada e Sada de dados


8.1 - Sada de dados
Os principais comandos destinadas a exibir os dados no vdeo ou em uma impressora so:
System.out.println e System.out.print
Sintaxe:
System.out.print( varivel1 + varivel2 + expresso1 + expresso2 + );
System.out.println( varivel1 + varivel2 + expresso1 + expresso2 + );
A diferena entre System.out.print e System.out.println que no primeiro, o cursor se
posiciona na tela logo a frente ao ltimo valor exibido (exemplo 1). J no caso do
System.out.println, o cursor se posiciona na primeira coluna da prxima linha (exemplo 2).
Exemplo1:

System.out.print("TESTE DE TELA");
TESTE DE TELA_

Exemplo2:

System.out.println("TESTE DE TELA");
TESTE DE TELA
_

Quando se utiliza estes comandos de sada de dados com varireis do tipo real (float ou double),
para evitar a exibio de nmero excessivo de casas decimais, pode-se fazer a formatao dos dados

Apostila de LTP2 Java - Air Rabelo

10

de sada em relao ao nmero destas casas decimais. Para formatar decimais no Java deve-se
utilizar aclasseDecimalFormat que est contida no pacote de classes text, que dever ser
importado no incio do programa (import java.text.*;).
8.2 Entrada de Dados
Existe mais de uma forma de realizar entrada de dados no Java. Uma delas utilizando a classe
Scanner. A classe Scanner est contida no pacote til, ento necessrio import-lo no incio do
programa (import java.util.*;) .Neste caso, todas as entradas de dados so recebidas pelo
Java como uma sequencia de caracteres, que devero ser convertidos utilizando-se funes de
converso de tipos do Java:
Mtodo
next()
nextLine()
next().charAt(0)
nextInt()
nextLong()
nextByte()
nextFloat()
nextDouble()

Descrio
Aguarda a digitao de um valor do tipo String com uma palavra (sem espaos)
Aguarda a digitao de valor do tipo String, com uma ou mais palavras
Aguarda a digitao de valor do tipo char com apenas um caracter
Aguarda a digitao de um valor do tipo int
Aguarda a digitao de um valor do tipo long
Aguarda a digitao de um valor tipo byte
Aguarda a digitao de um valor tipo float
Aguarda a digitao de um valor tipo double

Exemplo:

import java.util.*;
publicclassExemploEntrada {
publicstaticvoid main(String[] args) {
// declarao das variveis
String nome;
char sexo;
float salario;
byte idade;
// entrada dos dados
Scanner leia;
// declara a varivel leiapara ser utilizada na classe Scanner
leia = new Scanner(System.in); /* inicializa a varivel leiapara receber os
valores de entrada da classe Scanner*/
System.out.print("Digite o Nome: ");
nome = leia.nextLine();
// recebe o valor digitado e armazena na varivel NOME
System.out.print("Digite o Salario: ");
salario = leia.nextFloat(); // recebe o valor digitado e armazena na var. SALARIO
System.out.print("Digite a Idade: ");
idade = leia.nextByte();
// recebe o valor digitado e armazena na varivel IDADE
System.out.print("Digite o Sexo: ");
sexo = leia.next().charAt(0); //recebe o valor digitado e armazena na var. sexo
// Sada de dados
System.out.println("O nome digitado foi: " + nome);
System.out.println("O salario digitado foi: " +salario);
System.out.println("A idade digitada foi: " +idade);
System.out.println("O sexo digitado foi: " +sexo);
}
}

Apostila de LTP2 Java - Air Rabelo

11

Programa exemplo:
Faa um programa em Java que receba via teclado o Salrio e o Valor do Aumento Salarial de um
empregado. Em seguida o programa dever calcular e imprimir o novo salrio do empregado, que ser
a soma do atual salrio com o Valor do Aumento Salarial.

import java.util.*;
import java.text.*;
publicclassExemplo {
publicstaticvoid main(String[] args) {
// declarao das variveis
floatsalario;
float vlrAumento;
float novoSal;
// entrada dos dados
Scanner leia;
leia = new Scanner(System.in);
System.out.print("Digite o Salrio: ");
salario = leia.nextFloat();
System.out.print("Digite o Valor do Aumento: ");
vlrAumento = leia.nextFloat();
// clculos
novoSal = salario + vlrAumento;
// Sada de dados
System.out.print("Novo salrio:" + novoSal );
// Exemplo da sada de dados utilizando formatao de casas decimais
DecimalFormat decimal;

/* declarao da varivel DECIMAL para ser utilizada na

classe DecimalFormat */
/*abaixo, inicializao da varivel DECIMAL com formatao para impresso de nmeros reais com
duas casas decimais e separador de milhar */

decimal = new DecimalFormat("#,##0.00");


System.out.print("Novo salrio:" + decimal.format(novoSal) );
}
}

Apostila de LTP2 Java - Air Rabelo

12

9 Comando de alternativa IF
9.1 Alternativa Simples
Sintaxe:

Um comando por alternativa


if ( condio ) {
comando1;
}

Mais de um comando por alternativa


if ( condio ) {
comando1;
comando2;
}

Obs: quando existir apenas uma linha de comando dentro da estrutura de alternativa, no
necessrio que este comandos esteja entre chaves - {
}, no entanto, pelos padres de
codificao Java da Sun Microsystem, as chaves devem ser utilizadas sempre.
Exemplo1:

byteidade;
Scanner leia = new Scanner(System.in);
System.out.print(Digite a idade: ");
idade = leia.nextByte();
if (idade < 2) {
System.out.print( um beb ! ");
}
Exemplo2:

byteidade;
Scanner leia = new Scanner(System.in);
System.out.print(Digite a idade: ");
idade = leia.nextByte();
if (idade < 2) {
System.out.print(" um beb ! ");
idade = idade + 5;
}
9.2 Alternativa Composta
Sintaxe:

Um comando por
alternativa
if ( condio ) {
comando1;
} else {
comando2;
}

Mais de um comando por


alternativa
if ( condio ) {
comando1;
comando2;
}else{
comando3;
comando4;
}

Mais de uma alternativa (else if)


if ( condio1 ) {
comando1;
comando2;
}else if ( condio2 ) {
comando3;
} else if ( condio3 ) {
Comando4;
Comando5;
} else {
Comando6;
}

Exemplo1:

Apostila de LTP2 Java - Air Rabelo

13

byteidade;
Scanner leia = new Scanner(System.in);
System.out.print(Digite a idade: ");
idade = leia.nextbyte();
if (idade < 2) {
System.out.print(" um beb ! ");
}else{
System.out.print(" No um beb ! ");
}
Exemplo2:

byteidade;
charsexo;
Scanner leia = new Scanner(System.in);
System.out.print(Digite a idade: ");
idade = leia.nextByte();
System.out.print(Digite o sexo: ");
sexo = leia.next().charAt(0);
if (idade < 2 &&sexo == 'M'){
System.out.print(" um beb menino ! ");
}elseif (idade < 2 &&sexo == 'F') {
System.out.print(" um beb menina ! ");
}
Exemplo3:

byteidade;
Scanner leia = new Scanner(System.in);
System.out.print(Digite a idade: ");
idade = leia.nextByte();
if (idade < 2) {
System.out.print(" um beb ! ");
idade = idade + 5;
}elseif (idade < 10) {
System.out.print(" uma criana ! ");
}elseif (idade < 16) {
System.out.print(" um adolescente ! ");
}else{
System.out.print(" um Adulto ! ");
idade = idade - 5;
}

Apostila de LTP2 Java - Air Rabelo

14

Exerccios (parte 1):


Exerccio 1.1 - Fazer um programa em Java que receba via teclado o Nome do Aluno, a Nota1, a
Nota2 e a Nota3. O programa dever calcular e imprimir a mdia e o desempenho do aluno baseandose nas seguintes regras:
- mdia de 7 para cima => aluno aprovado
- mdia de 4 para baixo => aluno reprovado
- mdia entre 4.1 e 6.9 => aluno em recuperao

Exerccio 1.2 Fazer um programa em Java que receba via teclado as medidas dos3 lados de um
tringulo. De acordo com os valores digitadoso programa dever imprimir o tipo do tringulo:
- no triangulo, se a soma de dois lados for menor ou igual ao terceiro lado;
- eqiltero, se os 3 lados forem iguais;
- issceles, se 2 lados forem iguais e 1 diferente;
- escaleno, se os 3 lados forem diferentes;

Exerccio 1.3 Faa um programa em Java para calcular e imprimir o Bnus Salarial e Desconto de
Vale Transporte para um empregado da Empresa ABCDrio LTDA. O programa dever receber via
teclado o Tempo de Casa e o Salrio do Empregado e considerar:
Tempo de Casa
At 5 anos
At 5 anos
De 6 a 10 anos
De 6 a 10 anos
De 6 a 10 anos
Acima de 10 anos

Salrio
At R$300,00
Acima de R$300,00
At R$500,00
Acima de R$500,00 at R$2000,00
Acima de R$2000,00
------------

Bnus
R$50,00
R$80,00
15% do Salrio
13% do Salrio
12% do Salrio
R$300,00

Apostila de LTP2 Java - Air Rabelo

Vale Transporte
5% do Salrio
6% do Salrio
R$70,00
R$90,00
8% do Salrio
4% do Salrio

15

10 Comandos de repetio - loop


10.1 while (enquanto...faa)

Caracteriza-se por verificar uma condioantes de entrar na repetio. Se a condio for verdadeira,
os comandos contidos dentro da estrutura do loop sero executados repetidamente enquanto a
condio permanecer verdadeira. Quando a condio se tornar falsa, os comandos que esto dentro
do loop no sero mais executados e encerrada a repetio, neste caso o programa segue
executando os comandos aps a repetio, ou seja, fora do loop.
Sintaxe:

Um comando dentro da repetio


while ( condio ) {
comando1;
}

Mais de um comando dentro da repetio


while ( condio) {
comando1;
comando2;
}

Obs: quando existir apenas uma linha de comando dentro da estrutura de repetio while,
no necessrio que este comandos esteja entre chaves - {
}, no entanto, pelos padres
de codificao da Sun, as chaves devem ser utilizadas sempre.

Exemplo 1:

bytei = 1;
while (i <= 5) {
System.out.println("O valor de I : " + i );
i = i + 1;
}
Exemplo 2:

intarea;
int altura = 2;
int largura = 6;
int i = 1;
while (i <= 5) {
area = altura * largura;
System.out.println("Area : " + area);
altura = altura + 2;
largura--;
i++;
}

Apostila de LTP2 Java - Air Rabelo

16

10.2 do ... while (repita...at)


Se caracteriza por executar a lista de comandos contidos no loop antes de verificar a condio que
vem no final. Aps executar os comandos do loop, verificada a condio. Enquanto a condio for
verdadeira, os comandos que esto dentro da estrutura de repetio continuam sendo executados. Se
a condio for falsa, a repetio encerrada e o programa segue executando os demais comandos
aps o final da repetio, ou seja, fora do loop.
Sintaxe:

Um comando dentro da repetio


do {
comando1;
} while ( condio );

Mais de um comando dentro da repetio


do {
comando1;
comando2;
} while ( condio );

Obs: quando existir apenas uma linha de comando dentro da estrutura de repetio
do...while, no necessrio que este comandos esteja entre chaves - {
}, no entanto,
pelos padres de codificao da Sun, as chaves devem ser utilizadas sempre.
Exemplo:

int
int
int
int
do{

area;
altura = 2;
largura = 6;
i = 1;

area = altura * largura;


System.out.println("Area : " + area );
altura = altura + 2;
largura--;
i++;
} while (i <= 5);

10.3 for (para...faa)


Caracteriza-se por repetir um conjunto de comandos uma quantidade de vezes pr-definida. O loop
encerrado quando as repeties j tiverem ocorrido a quantidade de vezes pr-determinada, ou seja,
quando a condio assumir o valor falso.
Sintaxe:
for (contador = valor inicial; condio ;incremento ou decremento) {
comando1;
}

ou
for (contador = valor inicial; condio ; incremento ou decremento) {
comando1;
comando2;

}
Obs: quando existir apenas uma linha de comando dentro da estrutura de repetio for, no
necessrio que este comandos esteja entre chaves - {
}, no entanto, pelos padres de
codificao Java da Sun Microsystem, as chaves devem ser utilizadas sempre.

Apostila de LTP2 Java - Air Rabelo

17

Exemplo 1:

int
int
int
for

area;
altura = 2;
largura = 6;
(int i = 1; i<= 5; i++) {
area = altura * largura;
System.out.println("Area : " + area );
altura = altura + 2;
largura--;
}

Exemplo 2:

byte i;
for (i = 1; i <= 9; i = i + 2) {// i ser incrementado de 2 em 2
System.out.println("O valor de I : " + i );
}
Para se executar o for com passo negativo, ou seja, ao invs do valor da varivel <var1> ser
incrementado de 1 ou outro valorem cada execuo do loop, ele ser decrementado de 1 ou outro
valor.
Exemplo:

int
int
int
for

area;
altura = 2;
largura = 6;
(int i = 5; i>= 1; i--) { // i ser decrementado de 1 em 1
area = altura * largura;
System.out.println("Area : " + area );
altura = altura + 2;
largura--;
}

Apostila de LTP2 Java - Air Rabelo

18

10.4 - Comparao entre o while, do...while e for


O while deve ser utilizado em situaes onde os comandos do loop s devem ser executados se a
condio do loop for verdadeira antes de iniciar o loop.
O do...while deve ser utilizado em situaes onde os comandos do loop devem ser executados pelo
menos uma vez independente se a condio do loop verdadeira ou falsa.
O for deve ser utilizado em loops onde o nmero de repeties previamente conhecido e no h
condies para que estas repeties ocorram, elas simplesmente devem ocorrer em uma quantidade
de vezes pr-determinada .
O quadro abaixo contm uma mesma lgica escrita com cada um dos trs comandos de loop
estudados. Desta forma podemos comparar as diferenas de sintaxe entre eles:
int area;
int altura = 2;
int largura = 6;
int i = 1;
while (i <= 5) {
area = altura * largura;
System.out.print(area);
altura = altura + 2;
largura--;
i++;
}

int area;
int altura = 2;
int largura = 6;
int i = 1;
do {
area = altura * largura;
System.out.print(area);
altura = altura + 2;
largura--;
i++;
} while (i <= 5);

int area;
int altura = 2;
int largura = 6;
for (int i=1; i<=5; i++) {
area = altura * largura;
System.out.print(area);
altura = altura + 2;
largura--;
}

OBS: Como interromper uma estrutura de repetio em Java ?


Exemplo:
O comando break interrompe qualquer uma das estruturas de repetio, fazendo com que a
execuo do programa prossiga a partir da primeira linha aps o final do comando de repetio

for (i=1; i<=5; i++) {


System.out.print("Digite a idade do empregado: ");
idade = leia.nextInt();
if (idade == 0) {
break;
}
System.out.print("Digite o sexo do empregado: ");
sexo = leia.next().charAt(0);
.
.
.
}
Neste exemplo acima, apesar do comando forutilizar o contador ique varia de 1a 5, se o valor
digitado na varivelidadefor zero, o forser finalizado pelo comandobreak, e a prxima linha de
comando a ser executada ser a que existir logo aps o fecha-chaves} que finaliza o for

Apostila de LTP2 Java - Air Rabelo

19

EXERCCIOS (parte 2):


Exerccio 2.1- Fazer um programa em Java para receber via teclado o NOME, o SALRIO e o
NMERO DE DEPENDENTES dos 10 empregados de uma empresa. O programa dever calcular um
Novo Salrio para cada empregado de acordo com a tabela abaixo:
- salrios abaixo de R$1.000,00 tero aumento de 30%
- salrios de R$1.000,00 at R$2.000,00 tero aumento de 20%
- salrios acima de R$2.000,00 tero aumento de 10%
Em seguida, o programa acrescentar ao Novo Salrio calculado R$50,00 por DEPENDENTE e
imprimir o Novo Salrio.
Ao final o programa dever imprimir:
- Soma dos Novos Salrios
- Mdia dos Novos Salrios
- Nmero de empregados que passou a receber salrio acima de R$1700,00.

Exerccio 2.2 Fazer um programa em Java para receber via teclado a ALTURA em metros e o SEXO
dos atletas de uma delegao. O programa dever calcular e imprimir:
- a maior altura encontrada
- a menor altura encontrada
- o nmero de atletas do sexo feminino
- a mdia da altura masculina
- a mdia geral das alturas.
Obs:
- adotar um flag para encerrar a entrada de dados
- consistir os valores digitados na entrada de dados de maneira que s podero ser aceitos:
SEXO = M ou F;
ALTURA maior que zero e menor ou igual a 2,5 metros;

Exerccio 2.3- Em uma Fbrica trabalham empregados divididos em 3 classes: A, B e C.Fazer um


programa em Java que receba via teclado o CDIGO DO OPERRIO (inteiro), a CLASSE do operrio
(caracter 1 posio) e o NMERO DE PEAS FABRICADAS no ms (inteiro). Em seguida o programa
dever calcular e imprimir o salrio dos empregados considerando a tabela a seguir:
CLASSE
A
A
A
B
C
C

Peas fabricadas no ms
at 30
de 31 a 40
acima de 40
At 50
acima de 50

Calculo do Salrio
R$500,00 + R$2,00 por pea fabricada
R$500,00 + R$2,30 por pea fabricada
R$500,00 + R$2,80 por pea fabricada
R$1.200,00
R$ 40,00 por pea fabricada
R$ 45,00 por pea fabricada

Ao final, o programa dever imprimir:


- Total gasto pela empresa com o pagamento de salrios
- Nmero total de peas fabricadas
- Cdigo do Operrio que fabricou o menor nmero de peas
- Mdia de quantidade de peas fabricadas por empregados da classe B
Obs:
- adotar o flag Cdigo de Operrio = 0 (zero) para encerrar a entrada de dados
- consistir os seguintes valores digitados na entrada de dados:
- NMERO DE PEAS dever ser maior que zero
- CLASSE dever ser A, B ou C

Apostila de LTP2 Java - Air Rabelo

20

11 Mtodos da linguagem Java - Parte 1


11.1 COMPARAR SE DUAS STRINGS SO IGUAS
STRING_1.equals(STRING_2)
O mtodo equals, compara duas strings e retorna true se o contedo das duas for totalmente igual.
Caso contrrio, o mtodo retorna false.

OBS:letras maisculas so diferentes de minsculas.

Exemplo 1:

String texto1= "DINAMICA"


String texto2= "dinamica";
if (texto1.equals(texto2)) { // neste caso texto1 no igual a texto2
System.out.print("as Strings so iguais");
}else{
System.out.print("as Strings NOso iguais");
}

Exemplo 2:

String texto1= "Dinamica";


String texto2= "dinamica";
if (texto1.equals(texto2)) {// novamente texto1 no igual a texto2
System.out.print("as Strings so iguais");
} else{
System.out.print("as Strings NOso iguais");
}
Exemplo 3:

String texto1= "dinamica";


String texto2 = "dinamica";
if (texto1.equals(texto2))
// agora sim, texto1 igual a texto2
System.out.print("as Strings so iguais");
} else{
System.out.print("as Strings NOso iguais");
}

Apostila de LTP2 Java - Air Rabelo

21

11.2COMPARAR SE DUAS STRINGS SO IGUAIS (sem maisculo/minsculo)


STRING_1.equalsIgnoreCase(STRING_2)
O mtodo equalsIgnoreCase, compara duas strings e retorna true se as duas forem iguais mesmo
quando existe diferena de maisculo e minsculo entre elas. Caso contrrio, o mtodo retorna
false.
Exemplo 1:

String texto1 = "DINAMICA";


String texto2 = "dinamica";
if (texto1.equalsIgnoreCase(texto2) ) // neste caso texto1 igual atexto2
System.out.print("as Strings so iguais");
} else{
System.out.print("as Strings NOso iguais");
}
Exemplo 2:

String texto1 = "JOSE MARIA";


String texto2 = "Jose maria";
if (texto1.equalsIgnoreCase(texto2)) // neste caso texto1 no igual atexto2
System.out.print("as Strings so iguais");
} else{
System.out.print("as Strings NOso iguais");
}
OBS: neste Exemplo 2, o contedo de texto1possui 1 caracter espao entre JOSEe MARIA, j o
contedo de texto2possui 2 caracteres espao entre josee maria, sendo assim, possuem
contedo diferentes independente de maisculo e minsculo.

Apostila de LTP2 Java - Air Rabelo

22

12 - VETORES e MATRIZES:
Ao se utilizar variveis, pode-se armazenar apenas um valor por vez. Considere um programa que
precisa armazenar as notas de 5 provas realizadas por um aluno. Uma opo seria criar cinco
variveis para armazenar as notas. Por exemplo:

intnota1, nota2, nota3, nota4, nota5;


Existem estruturas que permitem agrupar vrias informaes dentro de uma mesma varivel. Estas
estruturas so chamadas de vetores e matrizes.

12.1 Vetores
Este tipo de estrutura tambm chamado de matriz unidimensional. Um vetor declarado com seu
nome, tamanho e seu tipo. Para declarar um vetor em java basta abrir e fechar um colchete antes ou
aps a declarao de uma varivel, desta forma esta varivel na verdade ser um vetor. Em seguida,
dever ser informado o tamanho do vetor. Em java a primeira posio de um vetor sempre a de
nmero 0 (zero) e a ultima posio ser o tamanho do vetor menos 1.

Exemplo 1:

float notas[];
notas = newfloat[10];

// definio da notas como um vetor


// definio do tamanho do vetor notas com 10 posies

Ou seja, o vetor notascomea na posio 0 e termina na posio 9, total de 10 itens:


Posies do vetor

1 2 3 4 5 6 7 8 9

notas
Obs: Uma varivel somente pode conter um valor por vez. No caso dosvetores, estes podero
armazenar mais de um valor por vez, pois so dimensionadosexatamente para este fim.

A declarao e a inicializao de um vetor pode ser escrita em apenas uma linha de comando:
Exemplo 2:

float notas[] = newfloat[5];


A atribuio ou a exibio de valores contidos nos vetores feita indicando a posio do vetor entre
colchetes. Exemplo:Atribuindo valores ao vetor de notas do aluno:

notas[0]
notas[1]
notas[2]
notas[3]
notas[4]

=
=
=
=
=

5.2;
8.0;
9.2;
7.5;
8.3;
Apostila de LTP2 Java - Air Rabelo

23

O nome o mesmo, o que muda a informao indicada dentro doscolchetes, ou seja, o ndice ou
posio do vetor, que representa a posio dentro do vetor onde ovalor est armazenado. Para o
exemplo anterior teramos:

notas
0

=> ndice ou posio no vetor


5.2 8.0 9.2 7.5 8.3 => contedo de cada posio

12.2 Matrizes
Usando mesmo exemplo do incio desta pgina, vamos supor que agora ser necessrio armazenar 4
notas dos mesmos 5 alunos, ao invs de apenas uma. Uma opo seria criar cinco vetores, um para
cada 4 notas de cada aluno. Entretanto, esta no a melhor soluo j que seria necessrio criar uma
estrutura de controle para cada vetor. A melhor opo seria criar uma nica matriz de duas dimenses
para armazenar cada uma das 4 notas dos 5 alunos.
Para declarar matrizes em java, da mesma forma que a declarao de vetores diferenciando-se
apenas no nmero de dimenses, j que o vetor possui apenas uma dimenso e matrizes possuem 2
ou mais dimenses. No caso de uma matriz de 2 dimenses, a primeira dimenso indica o nmero de
linhas e a segunda o nmero de colunas.

Para o caso das 4 notas dos 5 alunos a declarao da matriz seria:

float notas[][];
notas = newfloat[5][4];
ou
float notas[][]= newfloat[5][4];
Neste caso, as linhas representam os alunos, e as colunas representas as notas:

notas
0
1
ALUNOS

2
3
4

8.5
5.0
7.0
8.5
5.5

9.0
6.8
7.5
8.0
8.0

7.8
8.7
5.7
9.2
7.2

8.9
6.5
7.8
7.9
7.0

ndice das colunas => 4 notas

ndice das linhas => 5 alunos

Apostila de LTP2 Java - Air Rabelo

24

Exemplo de programa:

import java.util.*;
publicclass exemplo {
publicstaticvoid main(String[] args){
String nomes[] = new String[50];
byte idades[] = newbyte[30];
int quantAlunosPorNota[] = newint[100];
String NomeAlunosDaSala[][] = new String[8][7];
intx;
idades[1] = 74; // atribuio do valor 74 para a posio 1 do vetor
Scanner leia = new Scanner(System.in);
for (x = 0; x <= 49; x++){
System.out.print("Digite o Nome " + x + ": ");
nomes[x] = leia.nextLine();
}
System.out.println(nomes);// Comando errado por no ter sido informada a
// posio desejada para impresso do vetor NOMES
System.out.println(nomes[10]); // comando correto
}
}
12.3 - Pesquisa Sequencial em Vetores
Este o tipo de pesquisa mais simples em vetores, no qual cada item do vetor examinado por vez e
comparado ao item que se est procurando, at ocorrer uma coincidncia. Este mtodo de pesquisa
lento, porm, a melhor opo para os casos em que os elementos do vetor encontra-se
desordenados.
Exemplo de Pesquisa Seqencial:
Criar um programa que inicialmente receba a digitao de 5 nomes e armazene em um vetor. Em
seguida o programa receber via teclado a digitao aleatria de Nomes e pesquisar se estes Nomes
esto contidos no vetor:
Algoritmo:
1- Criar uma repetio para receber a digitao dos 5 nomes para gravar no vetor
2- Criar uma repetio que receba a digitao aleatria de nomes enquanto o usurio assim desejar.
2.1- Criar uma outra repetio para pesquisar o nome digitado no vetor:
- Comparar o nome digitado com o primeiro elemento do vetor;
- se for igual, o elemento procurado foi encontrado,
- caso contrrio, avana para o prximo elemento do vetor.
- Se no for encontrado nenhum nome no vetor igual ao nome digitado, informar que
no existe o elemento pesquisado.
3- Encerrar a pesquisa quando desejado.

Apostila de LTP2 Java - Air Rabelo

25

import java.util.*;
publicclass PesquisaSequencialEmVetor {
publicstaticvoid main(String[] args){
String nomePesquisa;
String nomes[] = new String[5];
int x;
boolean encontrou;
Scanner leia = new Scanner(System.in);
for (x = 0 ; x <= 4 ; x++){
System.out.print("Digite o Nome " + X + " para armazenar no Vetor: ");
nomes[x] = leia.nextLine();
}
do{
System.out.print("Digite o Nome para pesquisa (FIM para encerrar): ");
nomePesquisa = leia.nextLine();
if ( nomePesquisa.equals("FIM") ) {
break;
}
encontrou = false;
for (x = 0 ; x <= 4 ; x++){
if ( nomePesquisa.equals(nomes[x]) ){
encontrou = true;
break;
}
}
if (encontrou) {
System.out.println("Nome encontrado na posio "+x+" do vetor!");
}else{
System.out.println("O Nome digitado NO FOI ENCONTRADO NO VETOR !");
}
}while ( ! nomePesquisa.equals("FIM"));
}
}

EXERCCIOS (parte 3):


Exerccio 3.1 Fazer um programa em Java para consultar informaes sobre os vos de uma
empresa area. Primeiramente o programa dever receber via teclado os Nomes e respectivas
Distncias (em km, at Belo Horizonte) de at 20 Cidades no mundo e armazenar em dois vetores. Em
seguida, o programa dever entrar no mdulo de consultas e solicitar o Nome de uma Cidade. Para
cada cidade digitada o programa dever calcular e exibir os seguintes resultados:
- Preo da Passagem
- Tempo de Vo em minutos
- Nmero de escalas no percurso
Consideraes para os clculos:
- A empresa area cobra R$0,25 por km percorrido no vo
- O avio voa com uma velocidade de 800 km/h
- A empresa area faz uma escala a cada 3 horas de vo.
Observaes:
- Adotar um flag para finalizar a entrada de dados com os Nomes de Cidades e Distncias
- Adotar um flag para finalizar as consultas
- Exibir mensagem de erro se o Nome da Cidade digitada na consulta no existir na lista de
cidades digitadas inicialmente (Max. 20)
- Durante a digitao dos Nomes das Cidades e Distncias, consistir:
- O Nome da Cidade dever ser de preenchimento obrigatrio
- A distncia at Belo Horizonte dever ser no mnimo 500 km.

Apostila de LTP2 Java - Air Rabelo

26

13 Sub-rotinas em Java (mtodos)


Na medida em que o nvel de complexidade dos programas e o tamanho vo aumentando, muitas
vezes escrevemos um mesmo conjunto de instrues em dois ou mais pontos do programa, ou em
programas diferentes. O ideal seria se aquele conjunto de instrues pudesse ser escrito somente
uma vez e utilizado quantas vezes fossem necessrios.
Para isto, existem as sub-rotinas (chamadas de mtodos em Java), ou seja, para facilitar e agilizar a
criao de programas pelos programadores.
A idia e dividir o programa em partes, e aquelas partes que necessitam ser usadas mais de uma vez
sejam transformadas em sub-rotinas, evitando-se assim escrever um mesmo conjunto de comandos
mais de uma vez. Ou seja, a seqncia de comandos escrita somente uma vez, dentro da subrotina, e usada quantas vezes forem necessrias dentro de um mesmo programa ou em programas
diferentes.
Outra vantagem gerada pela transformao de uma sequencia de comandos em sub-rotina, reduzir
o trabalho do programador quando este necessitar alterar algum comando da sub-rotina. Se o
conjunto de comandos estiver escrito repetidas vezes dentro do mesmo programa ou em programas
diferentes, o programador ter que alterar todas elas, tomando-se muito tempo e trabalho. Entretanto,
se a lgica estiver escrita uma nica vez em uma sub-rotina s precisar ser alterada uma vez,
independente se a sub-rotina estiver sendo usada uma ou mais vezes em um nico programa ou em
programas diferentes.
Uma terceira vantagem das sub-rotinas a possibilidade de uso das mesmas por diferentes
programadores por meio das bibliotecas de sub-rotinas. Isto evita que um programador tenha que
desenvolver uma lgica que j foi criada por outro programador.
13.1 - Variveis Globais e Locais
Uma varivel considerada Global quando declarada dentro da classe mas fora de qualquer
mtodo, inclusive do mtodo main. Uma varivel Global poder ser utilizada dentro de qualquer
mtodo existente na classe. Para a varivel global ser utilizada em qualquer mtodo ela deve ser
declarada como static. (ver exemplo no item 14.3)
Uma varivel considerada Local quando declarada dentro de um mtodo e s vlida naquele
mtodo onde foi criada. Desta forma, se uma varivel declarada dentro de um mtodo, os outros
mtodos contidos na classe no podero fazer uso daquela varivel, pois no visualizam a existncia
da mesma.

13.2 - Caractersticas dos Mtodos


Os mtodos possuem caractersticas que so apresentadas na declarao por modificadores como
public,static e void .
Mtodos do tipo publicindica que poder ser chamado por qualquer classe, staticindica que o
mtodo poder ser executado mesmo se nenhum objeto da Classe onde foi inserido foi criado,
voidindica que o mtodo no retornar valor aps ter sido executado.

13.3 - Exemplo de um mtodo que no retorna valor (void)


Um mtodo voidserexecutado simplesmente quando o nome dele, seguido de um lista opcional de
parmetros, for escrito em uma linha de comando. Quando um mtodo chamado em uma linha

Apostila de LTP2 Java - Air Rabelo

27

decomando,o controle de execuo do programa automaticamente transferido para o incio do


mtodo. Aps todos os comandos do mtodos serem executados, ocontrole retorna automaticamente
para linha de comando de onde ele foi chamado e em seguida ser executada a prxima linha de
comando.
import java.util.*;
publicclass Exemplo1{
staticintx,y;

// variveis globais para todas as classes de Exemplo1

publicstaticvoid main(String Args[]){


x = 5;
y = 10;
subtrai();
System.out.println("Valor de X:" + x);
// X => 3
// Y => 9
System.out.println("Valor de Y:" + y);
}
publicstaticvoid subtrai(){
x = x - 2;
y = y - 1;
}
}

13.4 - Parmetros
Os parmetros tm por finalidade servir como um ponto de comunicao entre o mtodo e o programa
de onde ele foi chamado. Desta forma, possvel passar valores de um programa para um mtodo por
meio de parmetros. Dentro do mtodo os parmetros funcionam como uma variveis Locais, ou seja,
s podem ser utilizados dentro do prprio mtodo.
Exemplo 2:
import java.util.*;
publicclass Exemplo2 {
publicstaticvoid main(String Args[]) {
int x = 5;
int y = 10;
int w = 8;
intq = 6;
subtrai(x,y);
System.out.println("Valor de X:" + x);
System.out.println("Valor de Y:" + y);

// X => 5
// Y => 10

subtrai(w,q);
System.out.println("Valor de W:" + w);
System.out.println("Valor de Q:" + q);
}

// W => 8
// Q => 6

publicstaticvoid subtrai(int a , int b) {


a = a - 2;
b = b - 1;
}

Apostila de LTP2 Java - Air Rabelo

28

}
Neste exemplo o mtodo SUBTRAI possui 2 parmetros: ae b. Quando o mtodo executado no
programa principal (mtodo main), devero ser utilizados dois valores como parmetros na chamada
do mtodo. O primeiro valor passado ser transferido para o primeiro parmetro do mtodo (parmetro
a) , e o segundo valor passado ser transferido para o segundo parmetro do mtodo (parmetro b).
Na primeira execuo (subtrai(x,y);) o valor da varivel x o primeiro valor passado, portanto,
este valor ser transferido para o parmetro a, e o valor da varivel y o segundo valor passado,
portanto, ser transferido para o parmetro b.
Na segunda execuo (subtrai(w,q);) o valor da varivel w o primeiro valor passado, portanto,
este valor ser transferido para o parmetro a, e o valor da varivel q o segundo valor passado,
portanto, ser transferido para o parmetro b.
Entretanto, aps a execuo do mtodo subtrai, os valores das variveis passados como
parmetro (x e y , w e q) no sofreram nenhuma alterao, porque no mtodo a subtrao
feita utilizando os parmetros Ae B, que so variveis locais, e isto no afeta os valores originais de
x,y,w eq.
Para que um mtodo altere o valor de uma varivel global, utilizada na passagem de parmetro, o
parmetro tem que ser declarado como parmetro por referncia.
13.5 Parmetros por Valor e por Referncia
Quando em um mtodo um parmetro e passado por Valor, o valor contido na varivel utilizada na
passagem de parmetro pelo programa que executou o mtodo copiado para a varivel de
parmetro do mtodo. Desta forma, as duas variveis, apesar de terem o mesmo valor, so
independentes e representam valores alocados em locais diferentes da memria.
No caso e um parmetro ser passado por Referncia, a varivel de parmetro do mtodo recebe
apenas um apontamento para o valor armazenado na memria pela varivel utilizada na passagem de
parmetro pelo programa que executou o mtodo. Ou seja, apesar de serem duas variveis, elas
apontam para um mesmo valor alocado na memria. Desta forma, se o valor de uma das variveis for
alterado, a alterao ocorrer na verdade, nas duas.
No Java, toda vez que uma varivel de tipo primitivo (como: int, float, doulble, long, char, boolean,
byte) for utilizada como parmetro, ser um parmetro por Valor. E os tipos no primitivos (como:
vetor, matriz, classes e outros objetos) so sempre parmetros por referncia.

Exemplo 3:
import java.util.*;
publicclass Exemplo3 {
publicstaticvoid main(String Args[]) {
int
int
int
int

x[]
y[]
w[]
q[]

=
=
=
=

newint[1];
newint[1];
newint[1];
newint[1];

x[0] = 5;

Apostila de LTP2 Java - Air Rabelo

29

y[0] = 10;
w[0] = 8;
q[0] = 6;
subtrai(x,y);
System.out.println("Valor de X:"
System.out.println("Valor de
subtrai(w,q);
System.out.println("Valor de
System.out.println("Valor de
}

+ x[0]); // X => 3
Y:" + y[0]);
// Y => 9
W:" + w[0]);
Q:" + q[0]);

// W => 6
// Q => 5

publicstaticvoidsubtrai (int a[] , int b[])


{
a[0] = a[0] - 2;
b[0] = b[0] - 1;
}
}
Neste terceiro exemplo, os parmetros do mtodo (ae b) so dois vetores, tipos no primitivos do
Java que quando utilizados como parmetros em mtodos, sero parmetros por referncia. Em
seguida, tanto na primeira chamada do mtodo subtrai(x,y) quanto na segunda
subtrai(w,q) os vetores x,y,w eqso passados como parmetros sem os colchetes
contendo uma posio especfica do vetor, isto indica que o vetor inteiro est sendo passado como
parmetro para o mtodo. Desta forma, aps a execuo do mtodo subtrai(x,y) e
subtrai(w,q), os valores dos vetores passados como parmetro (x ey , w eq) sofrero
as mesmas alteraes que os respectivos vetores parmetros a e bsofrerem dentro do mtodo.
Sendo assim, a subtrao feita no primeiro parmetro (a) ser tambm feita em xe w. E a subtrao
feita no segundo parmetro (b) ser feita da mesma forma em y e q.

13.6 Mtodos com retorno de valor


Os mtodos que retornam valores para o programa que os chamou possuem antes do fim o comando
de retorno de valor return <valor>. O tipo do valor que o mtodo retornar deve ser
especificado na declarao do mtodo no mesmo local onde entrava a palavra voidpara os mtodos
que no retornam valor.
Exemplo 4:
publicclass Exemplo4{
publicstaticvoid main(String Args[]){
int valor;
Scanner leia = new Scanner(System.in);
System.out.print("Digite um valor inteiro para o fatorial:");
valor = leia.nextInt();
System.out.println("o fatorial de " + valor + " :" + fatorial(valor));
}
publicstaticlong fatorial(int n){
long fat;
int i;
fat = 1;
for ( i = 1; i <= n ; i++ ) {
fat = fat * i;
}
return fat;

Apostila de LTP2 Java - Air Rabelo

30

}
}
Neste exemplo, o mtodo fatorial, possui o tipo int, isto significa que retornar um valor
int(inteiro) ao programa que o executou.
Neste

exemplo

execuo

do

mtodo

est

contida

dentro

do

prprio

comando

System.out.println, onde o valor exibido na tela ser o resultado retornado pelo mtodo.
Repare o comando returnna ultima linha do mtodo representando o momento que o mtodo est
retornando o valor calculado para o programa que o executou.

13.7 Mtodos gravados em arquivos externos


No Java possvel utilizar mtodos que foram escritos em classes diferentes daquela onde ser
necessria a sua utilizao, possibilitando assim a reutilizao de mtodos entre classes (programas)
diferentes. Pode-se tambm criar um arquivo que funcionaria como uma biblioteca de sub-rotinas com
uma classe de nome Rotinascontendo vrios mtodos que podero ser utilizados em qualquer
outra classe.
No exemplo 5 abaixo, a primeira parte de cdigo se refere ao programa Java de nome Rotinas.java
que contm a classe Rotinase dentro dela o mtodo fatorial.
A segunda parte de cdigo se refere ao programa Exemplo5.java que executa o mtodo
fatorialcontido na classe Rotinasno programa Rotinas.java.
Exemplo 5 - primeira parte - Rotinas.java
import java.util.*;
publicclass Rotinas {
publicstaticint fatorial( int n) {
int i,fat;
fat = 1;
for ( i = 1; i <= n ; i++ )
fat = fat * i;
return fat;
}
}
Exemplo 5 - segunda parte - Exemplo5.java
import java.util.*;
publicclass Exemplo5
{
publicstaticvoid main(String Args[])
{
int valor;
Scanner leia = new Scanner(System.in);
System.out.print("Digite um valor inteiro para o fatorial:");
valor = leia.nextInt();
System.out.println("O fatorial :" + Rotinas.fatorial(valor));
}
}

Apostila de LTP2 Java - Air Rabelo

31

EXERCCIOS (parte 4):


Exercicio 4.1 - Fazer um programa para receber 3 nmeros inteiros:numA, numB, numC. Em
seguida, o programa dever criar os seguintes mtodos abaixo:
a) - Fazer um mtodo que receba como parmetro os nmeros numA e numB. O mtodo dever
calcular e retornar a soma dos nmeros inteiros existentes entrenumA e numB.
b) - Fazer um mtodo que receba como parmetro os nmeros numA, numB e numC. O mtodo
dever calcular e imprimir os nmeros existentes entre numA e numBque sejam divisveis por
numC.
c) - Fazer um mtodo que receba como parmetro os nmeros numA e numC. Considerando que
numA seja 100%, o mtodo dever calcular e retornar o valor percentual de numC em relao
a numA.
Exerccio 4.2 - Fazer um programa para receber via teclado o Nome do Empregado, o Cdigo do
Empregado (numrico), e o Nmero de Peas fabricadas em um determinado ms. O programa
dever imprimir uma lista, contendo o Nome do Empregado, o Salrio e a Mdia de Salrios da
empresa. Para calcular o Salrio, considerar:
- 1 a 200 peas fabricadas salrio de R$ 2,00 por pea
- 201 a 400 peas fabricadas salrio de R$ 2,30 por pea
- acima de 400 peas fabricadas salrio de R$ 2,50 por pea
No final do relatrio, imprimir o total gasto em salrios pela empresa.
Consistncias:
- O nmero de peas dever ser maior que zero.
- O cdigo dever ser um nmero entre 1 e 999
Mtodos:
- Fazer um mtodo para calcular o Salrio do Empregado
- Parmetro: nmero de peas
- Retorno: salrio
Observaes:
- Adotar um flag para encerrar a entrada de dados.
- Considerar o mximo de 100 empregados.
Layout do relatrio:
Nome
-------------------------------XXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXX

Salrio
---------999.99
999.99
999.99
999.99

Mdia Salrios
------------------999.99
999.99
999.99
999.99

Total pago com salrios: 9,999.99

Apostila de LTP2 Java - Air Rabelo

32

Exerccio 4.3 - Fazer um programa para controlar as contas de uma rede de Hoteis. Receber via
teclado o Nome do Hspede, o Dia de Entrada no Hotel, o Dia de Sada do Hotel, o Tipo de Quarto e a
Cidade do Hotel.
O programa dever por meio de um mtodo de nome calcularConta, calcular e imprimir o valor da
Conta de cada hspede de acordo com a seguinte tabela:
Tipo de Quarto
STANDARD
LUXO
SUPER-LUXO

Valor da Diria
120,00
150,00
180,00

O valor da conta ser o valor da diria multiplicada pelo nmero de dirias da hospedagem. Para
descobrir o nmero de dirias, subtrair o dia de sada do dia de entrada no hotel.
Frmula =>

Valor da Conta = (diaSaida - diaEntrada) * Valor Diaria

Ex:
Dia de Entrada: 20
Dia de Sada: 25
Tipo de Quarto: Luxo - Valor Diaria: 150,00
Valor da conta: ( 25 20 ) * 150,00 = 750,00
O mtodo dever receber como parmetro a Dia da Entrada e o Dia da Sada.
O programa dever imprimir no final um relatrio com o Nome do hspede e o Valor da Conta, de
todas as contas acima da mdia.
Consistncias:
- Fazer um mtodo de nome consistirCidade para consistir a Cidade do Hoteldigitada.
- Parmetro: Cidade do Hotel digitada.
- Este mtodo dever pesquisar no vetor vetCidades se o nome da cidade informada existe l,
caso positivo, o mtodo dever retornar o valor TRUE, caso negativo retornar o valor FALSE.
- Consistir o tipo de quarto para aceitar somente os valores STANDARD, LUXO ou SUPER-LUXO.
- O Dia de Sada dever ser maior que o Dia de Entrada.
Obs:
- declarar no programa um vetor global de nome vetCidades contendo os seguintes nomes de cidades:
BELO HORIZONTE, SO PAULO, RIO DE JANEIRO, SALVADOR e CURITIBA
- Criar um flag para encerrar a entrada de dados.
- O nmero mximo de hospedagens que o programa receber ser 100.
- Considerar que a entrada e sada no hotel ocorrem sempre no mesmo ms.
Layout do relatrio:
Relatrio de contas acima da mdia
Nome do hspede
Vlr Conta
-------------------------------- ------------XXXXXXXXXXXXXXXX
999.99
XXXXXXXXXXXXXXXX
999.99
XXXXXXXXXXXXXXXX
999.99
XXXXXXXXXXXXXXXX
999.99

Apostila de LTP2 Java - Air Rabelo

33

14 Mtodos da linguagemJava - Parte 2


14.1 Mtodos Matemticos
Os mtodos matemticos esto contidos dentro da classe Math do Java.

14.1.1 - CLCULO DE POTNCIA


Math.pow(X,Y)
Retorna um valor do tipo doublecorrespondente a potncia deXelevado aY
Exemplo:

doublevalor;
valor= Math.pow(2,4);
valor= Math.pow(5,2);

// valor= 16.0
// valor= 25.0

14.1.2 - ARREDONDAMENTO
Math.round(X)
Retorna um valor do tipo float correspondente ao valor arredondado de X.
Exemplo:

floatvalor;
valor= Math.round(2.3);
// valor= 2.0
valor= Math.round(3.85); // valor= 4.00

14.1.3 - PARTE INTEIRA DE UM NMERO


(int)NUMERO_REAL
Retorna a parte inteira do NUMERO_REAL
Exemplo:

intvalor;
valor= (int) 2.3;
valor= (int) 3.85;
valor= (int) 243 / 10;

// o valor ser 2
// o valor ser 3
// o valor ser 24

14.2 Mtodos para manipulao de cadeias de caracteres (Strings e char).


Os mtodos para manipulao de strings no Java esto contidos no pacote de classes java.lang .
Este pacote de classes est contido na base de compilao do Java, sendo assim no necessita de
importao por meio do comando import.

Apostila de LTP2 Java - Air Rabelo

34

14.2.1RETORNAR PARTE DE UMA STRING


STRING.substring(posio_inicial,posio_final)
O mtodo substringretorna a cpia dos caracteres de uma varivel STRING a partir da
posio_inicial at a posio_final- 1. Caso a posio_finalno seja informada,
ser copiado o conjunto de caracteres da posio_inicial at o final da STRING.

OBS: primeiro caracter de uma String o de nmero ZERO.


Exemplo 1:

String texto, subTexto1, subTexto2, subTexto3;


texto= "AERODINAMICA";
subTexto1= texto.substring( 4 ) ;// subTexto1= "DINAMICA"
subTexto2= texto.substring( 0 , 4 );
// subTexto2= "AERO"
subTexto3= texto.substring( 2 , 6 );
// subTexto3= "RODI"
OBS:

Para facilitar a especificao da posio final, basta somar a posio inicial com o total de
caracteres desejados e o resultado ser a posio final:
- no caso do segundo comando do exemplo acima, a varivel subTexto2 receber a
substring "AREO". Se a posio inicial 0 (zero), e o total so 4 caracteres, basta somar 0 + 4, e o
resultado (4) a posio final.
- no caso do terceiro comando, a varivel subTexto3 receber a substring "RODI",
se a posio inicial 2 e o total so 4 caracteres, basta somar 2 + 4, e o resultado (6) a posio
final.

Exemplo 2 (concatenando dois caracteres de uma String formando outra String):

String texto= "AERODINAMICA";


String subTexto;
subTexto= texto.substring(0,1) + texto.substring(4,5);
System.out.print(subTexto); // ser exibido na tela o valor AD

14.2.2 RETORNAR UM CARACTER DA STRING


STRING.charAt(posio)
O mtodo CharAtretorna o caracter (tipo char) contido na posioinformada da STRING.

Exemplo:

String texto= "DINAMICA";


System.out.print( texto.charAt(2) );//ser exibido na tela o caracter N
System.out.print( texto.charAt(4) );//ser exibido na tela o caracter M

Apostila de LTP2 Java - Air Rabelo

35

14.2.3COMPARAR SE UMA STRING MAIOR QUE A OUTRA


STRING_1.compareTo(STRING_2)
O mtodo compareTocompara a grandeza caracter entre strings considerando a posio de cada
caracter das strings na tabela ASCII.
O mtodo retornar um valor positivo se STRING_1for maior queSTRING_2em relao a posio
dos caracteres de cada string na tabela ASCII, ou seja, os caracteres da STRING_1 vem depois dos
caracteres da STRING_2 na Tabela ASCII.
O mtodo retornar um valor negativo seSTRING_1for menor que STRING_2, e retorna 0 (zero) se
as duas strings forem iguais. exemplo:
OBS: na tabela ASCII, as letras maisculas vm antes das minsculas, sendo assim, as letras
minsculas so consideradas maiores que as minsculas. Ex: "a" e maior que "A".
Exemplo 1:
String textoA = "21" ;
String textoB = "05";
int result = textoA.compareTo(textoB);
System.out.println(result);//como o primeiro caracter de textoA vem depois do primeiro caracter do textoB,
// textoA maior que textoB, sendo assim o valor de result ser maior que zero.

Exemplo 2:
String textoA = "JORGE" ;
String textoB = "JOSE";
int result = textoA.compareTo(textoB);
System.out.println(result);//como o 1o e 2o caracteres das duas strings so iguais, a diferena ficar a partir
//do 3o. caracter. Como o 3o caracter de textoA vem antes do 3o. caracter do
//textoB, textoA menor que textoB,sendo assim o valor de result ser negativo

Exemplo 3:
String textoA = "hoje" ;
String textoB = "Hoje";
int result = textoA.compareTo(textoB);
System.out.println(result);//as strings so iguais exceto pelo primeiro caracter.Como o primeiro caracter de
// textoA minsculo, vem depois do primeiro caracter do textoB, ou seja,
// textoA maior que textoB, sendo assim o valor de result ser maior que zero.

14.2.4COMPARAR SE UMA STRING MAIOR QUE A OUTRA (sem


maisculo/minsculo)
STRING_1.compareToIgnoreCase(STRING_2)
O mtodo compareToIgnoreCasefunciona exatamente da mesma forma que o compareTo.
Entretanto, quando existir caracteres que so letras nas strings, a letra maiscula ser considerada
igual a letra minscula.
Exemplo 1:
String textoA = "hoje" ;
String textoB = "Hoje";
int result = textoA.compareToIgnoreCase(textoB);

Apostila de LTP2 Java - Air Rabelo

36

System.out.println(result);// neste caso as as strings so iguais j que maisculo/minsculo ser ignorado,


// sendo assim o valor de result ser zero.

14.2.5RETORNAR O TAMANHO DE UMA STRING


STRING.length()
O mtodo lengthretorna o nmero de caracteres de uma string, ou seja, o tamanho da string em
nmero de caracteres.
Exemplo:

String texto1 = "DINAMICA";


String texto2 = "JOSE DA SILVA";
System.out.println( texto1.length() ); // o valor exibido na tela ser 8
System.out.println( texto2.length() ); // o valor exibido na tela ser 13

14.2.6CONVERTER NMERO EM STRING:


String.valueOf(valor_numrico)
O mtodo String.valueOfretorna uma cpia do valor_numrico convertido para o tipo
String.
Exemplo 1:

intnumero = 15;
String texto;
texto = String.valueOf(numero);
System.out.println(texto);
// o valor exibido na tela ser 15
OBS:No exemplo 1, aps o uso do mtodo String.valueOf, a varivel numcontinuar contendo o
valor 15, e a varivel textopassar a conter o valor "15".
Exemplo 2:

String data;
intdia = 10;
intmes = 12;
intano = 1980;
data = String.valueOf(dia) + '/' + String.valueOf(mes) + '/' +
String.valueOf(ano);
System.out.print(data); // o valor exibido na tela ser 10/12/1980
OBS:No exemplo 2, aps o uso do mtodo String.valueOf nas variveis dia, mese ano, o
valor Caracter de cada uma delas ser concatenado com as barras ('/')e o resultado atribudo a
varivel dataficar com o valor "10/12/1980".

Apostila de LTP2 Java - Air Rabelo

37

14.2.7CONVERTER NMERO EM CHAR:


Character.forDigit(valor_numrico , base_numrica)
O mtodo Character.forDigitretorna uma cpia do valor_numrico convertido para o
tipo Char.
Exemplo 1:

charcaracter;
intdigito = 5;
caracter = Character.forDigit(digito,10);
System.out.print(caracter);
// o valor exibido na tela ser 5
OBS:No exemplo 1, aps o uso do mtodo Character.forDigit, a varivel digitocontinuar
contendo o valor 5, e a varivel caracterpassar a conter o valor '5'.

14.2.8 CONVERTER STRING EM NMERO:


Integer.parseInt(string)
O mtodo Integer.parseIntretorna uma cpia dastring convertida para o tipo int.

Float.parseFloat(string)
O mtodo Float.parseFloatretorna uma cpia dastring convertida para o tipo float.

Double.parseDouble(string)
O mtodo Double.parseDoubleretorna uma cpia dastring convertida para double.

Byte.parseByte(string)
O mtodo Byte.parseByteretorna uma cpia dastring convertida para o tipo byte.

Long.parseLong(string)
O mtodo Long.parseLongretorna uma cpia da string convertida para o tipo long.
Exemplo 1:

String texto= "15";


bytenumero;
numero = Byte.parseByte(texto);
System.out.print(numero);
// valor exibido ser o nmero 15
Exemplo 2:

intnumero;
int dia = 10;
String texto = "15";
numero = dia + Integer.parseInt(texto);
System.out.print(numero);
// valor exibido ser o nmero 25
Apostila de LTP2 Java - Air Rabelo

38

Exemplo 3:

String texto= "123.34";


doublenumero;
numero = Double.parseDouble(texto);
System.out.print(numero);
// valor exibido ser o nmero 123.34
OBS:Caso a STRINGcontenha algum caracter que impea a sua converso para nmero (como uma
letra ou um smbolo - * ? > ... ), a utilizao do mtodo parseprovocar um erro e o programa ser
cancelado por erro em formato numrico (NumberFormatException). Para evitar que isto
acontea, todas as vezes que o mtodo parsefor utilizado sem a certeza que todos os caracteres da
STRINGpossam ser convertidos para nmero, deve-se tratar o erro por meio do comando trycatch, como nos exemplos a seguir:

Exemplo 4:

String texto;
doublenumero;
Scanner leia = new Scanner(System.in);
System.out.print("Digite o texto com caracteres nmericos: ");
texto = leia.nextLine();
try{
numero = Double.parseDouble(texto);
// ser exibido o nmero digitado
System.out.print(numero);
na entrada de dados
}catch (NumberFormatException E) {
System.out.print("O texto digitado no pode ser convertido em
nmero !");
}

OBS:No Exemplo 4, o comando trytesta a execuo do mtodo Double.parseDouble:


- se o mtodo puder ser executado (ou seja, se a varivel textopuder ser convertida em
nmero), sero executados todos os comandos que esto dentro do try, ou seja, a varivel
numeroreceber
o
textoconvertido
para
um
nmero
real
e
o
comando
System.out.print(numero) ser executado em seguida.
- se o mtodo no puder ser executado (ou seja, se a varivel textono puder ser convertida
e nmero), somente os comandos que esto dentro catch sero executados, ou seja, somente o
comando System.out.print("O texto digitado no pode ser convertido em
nmero !")ser executado.

Exemplo 5 (consistncia):

String texto;
intnumero;
booleanvalido;
Scanner leia = new Scanner(System.in);
do{
System.out.print("Digite o texto com caracteres nmericos: ");
texto = leia.nextLine();
Apostila de LTP2 Java - Air Rabelo

39

try{
numero = Integer.parseInt(texto);
System.out.print(texto);
// exibir o nmero digitado
valido = true;
}catch (NumberFormatException E){
System.out.println("O texto digitado no pode ser convertido em
nmero ! Digite Novamente");
valido = false;
}
}
while ( ! valido);

14.2.9CONVERTER CHAR EM NMERO:


Character.digit(char , base_numrica)
O mtodo character.Digitretorna uma cpia do caracterchar convertido para o tipo int na
base_numrica informada. Neste caso, os nicos resultados possveis so os nmeros com
apenas um dgito: de zero a nove (0...9). Isto porque uma expresso caracter s pode ter um nico
caracter, ento no poderia resultar em um nmero com mais de um dgito. Nem mesmo um sinal
negativo poderia existir, neste caso, os nmeros retornados (0...9) sero sempre positivos.
Exemplos de bases numricas:
- 10 para base decimal;
- 2 para base binria;
- 16 para base hexadecimal;
Para o mtodo Character.digit, se o caracter charno for um dos dgitos de 0 a 9, o resultado
da converso ser -1, indicando que a converso no pode ser feita.

Exemplo 1:

intnumero;
charcaracter= '3';
numero = Character.digit(caracter,10);
// converso na base decimal
System.out.println(numero);
// o valor exibido ser o nmero 3

Exemplo 2:

intnumero;
charcaracter= 'R';
numero = Character.digit(caracter,10);
// converso na base decimal
System.out.println(numero);
// o valor exibido ser o nmero -1
OBS:No Exemplo 2, o caracter 'R' no pode ser convertido para um nmero decimal, sendo assim, a
varivel numerorecebeu como retorno da converso o valor -1, indicando que a converso no
possvel.

Apostila de LTP2 Java - Air Rabelo

40

EXERCCIOS (parte 5):

Exerccio 5.1 Faa um programa em Java para receber via teclado a data de nascimento de uma
pessoa e a data de hoje, ambas no formato string DD/MM/AAAA. O programa dever criar um mtodo
para calcular e imprimir a idade da pessoa.
Exerccio 5.2 Fazer um programa em Java para receber via teclado um cdigo caracter contendo 11
dgitos. Os 9 primeiros dgitos representam o cdigo em si e os 2 ltimos os dgitos representam os
dgitos verificadores. Utilizando a regra de clculo dos dgitos verificadores, o programa dever conter
um mtodo para calcular os dois dgitos verificadores do cdigo e comparar com os 2 dgitos
verificadores digitados no cdigo. Se forem iguais, o programa dever imprimir a mensagem: Dgito
Correto, caso contrrio imprimir Dgito Invlido.
O clculo dos dois dgitos verificadores dever ser feito baseando-se nos 9 primeiros dgitos do
Cdigo:
1. Dgito verificador:
1 - somar entre si o valor de cada dgito do cdigo
2 - dividir o resultado por 10
3 - o 1. Dgito ser a parte inteira do resultado da diviso do item 2 (acima).
2. Dgito verificador:
1 - multiplicar entre si o valor de cada dgito do cdigo
2 - o 2. Digito verificador ser o ultimo algarismo a direita do resultado da multiplicao
do item 1 (acima).
Exemplo:
9 primeiros dgitos do Cdigo: "821324312"
1. Digito verificador: 8+2+1+3+2+4+3+1+2 = 26 / 10 = 2,6 =>Parte inteira = 2
2. Digito verificador: 8*2*1*3*2*4*3*1*2 = 2304 =>Ultimo algarismo a direita = 4
OBS: - consistir a entrada de dados para aceitar somente CODIGO:
- com 11 caracteres
- todos os 11 caracteres devem ser dgitos
Exerccio 5.3 - Fazer um programa em Java para calcular uma conta telefnica. Sero digitadas via
teclado o HORRIO INICIAL e o HORRIO FINAL de cada ligao. Calcular e imprimir o CUSTO de
cada chamada de acordo com a tabela abaixo:
Intervalo de horrio
00:00 s 05:59
06:00 s 07:59
08:00 s 17:59
18:00 s 23:59

Custo do minuto
R$ 0,10
R$ 0,15
R$ 0,20
R$ 0,15

Obs:
- Receber os horrios em varivel do tipo String no formato HH:MM. Exemplo: "10:30";
- Imprimir o valor TOTAL DA CONTA TELEFNICA;
- Considerar que as ligaes sempre ocorrem dentro do mesmo dia;
- Considerar o valor do minuto relativo aHORRIO INICIAL da chamada para calcular o CUSTO da
chamada. Ex: se a chamada comeou as 06:30, o valor do minuto para toda a chamada ser R$0,15
independente de quanto tempo durar a chamada;

Apostila de LTP2 Java - Air Rabelo

41

- Criar um mtodo de nome consistirHora que dever receber como parmetro uma hora no formato
HH:MM e consistir se HH est entre 0 e 23 e MM est entre 0 e 59. Caso afirmativo, o mtodo dever
retornar o valor TRUE, caso negativo o mtodo dever retornar o valor FALSE.
- Criar uma consistncia para que o HORRIO FINAL da chamada seja sempre maior que o
HORRIO INICIAL.
- Adote um Flag para encerrar a entrada de dados.

Exerccio 5.4 - O DETRAN deseja fazer o controle das multas de veculos. Faa um programa em
Java que receba via teclado a PLACA DO VECULO, a DATA DA MULTA (DD/MM/AAAA) e o VALOR
DA MULTA.
O programa dever consistir a entrada de dados da seguinte forma:
- A placa dever ser uma String de 7 caracteres e ser formada por trs letras e quatro dgitos. Ex:
GVP5566
- O valor da multa dever ser maior que zero.
- Fazer um mtodo de nome dataEhValida para consistir as datas de Entrada e Sada:
- o mtodo dever receber como parmetro uma data no formato DD/MM/AAAA
- a consistncia dever seguir as seguintes regras:
- a String dever ter 10 caracteres de tamanho.
- o 3. E o 6. Caracteres devero ser uma barra ('/').
- para os meses de Janeiro, Maro, Maio, Julho, Agosto, Outubro e Dezembro o dia
dever ser entre 01 e 31.
- para os meses Abril, Junho, Setembro e Novembro o dia dever ser entre 01 e 30.
- para o ms de Fevereiro o dia dever ser entre 01 e 28.
- os ms dever ser entre 01 e 12
- o ano dever ser menor ou igual a 2015.
- o mtodo dever retornar um valor do tipo Boolean. Caso a data recebida como parmetro
esteja de acordo com as regras acima a funo retornar o valor TRUE, caso contrrio,
retornar o valor FALSE.

Como resultado final o programa dever imprimir:


- A soma dos valores das multas.
- O valor mdio das multas.
- O valor da menor multa.
Obs:
- Definir um Flag para encerrar o programa.

Apostila de LTP2 Java - Air Rabelo

42

15 - Mtodos para manipular Strings - Parte 3


15.1 RETORNAR UM CARACTER DA TABELA ASCII
(char)NMERO
Fazer um type casting para o tipo char em um nmero ou em uma varivel numrica retornar
o caracter correspondente ao cdigo decimal daquele NMERO na tabela ASCII. A tabela ASCII
contm 256 caracteres onde o primeiro o de nmero 0 e o ultimo o de nmero 255.
Exemplo:

intnumero;
numero = 100;
System.out.println((char)numero); // exibir na tela o caracter d , que o caracter
// de nmero 100 na tabela ASCII
System.out.println((char)42); // exibir na tela o caracter * , que o caracter
// de nmero 42 na tabela ASCII

15.2 RETORNAR O NMERO DE UM CARACTER DA TABELA ASCII


(int)CARACTER
O mtodo intretorna o nmero do CARACTERna tabela ASCII.
Exemplo:

charcaracter;
caracter = 'd';
System.out.println((int)caracter); //exibir na tela o nmero 100, que o nmero
// do caracter d na tabela ASCII
System.out.println((int)'*');
// exibir na tela o nmero 42, que o nmero
// do caracter * na tabela ASCII

15.3 TRANSFORMAR AS LETRAS DE UMA STRING EM MAISCULAS


STRING.toUpperCase()
O mtodo toUpperCase quando aplicado em uma String, retorna a mesma String contendo
todos os caracteres que eram letras minsculas transformados em letras maisculas. Aqueles
caracteres da STRING que no eram letras ou j eram letras maisculas, permanecero sem
nenhuma modificao.

Exemplo 1:

String nomeMaiusculo, nomeDigitado;


Scanner leia = new Scanner(System.in);
System.out.print("Digite o Nome: ");
nomeDigitado = leia.nextLine();
nomeMaiusculo = nomeDigitado.toUpperCase();
System.out.println("Nome em letras maisculas: " + nomeMaiusculo);
Apostila de LTP2 Java - Air Rabelo

43

Exemplo 2:

String nome;
Scanner leia = new Scanner(System.in);
System.out.print("Digite o Nome: ");
nome = leia.nextLine().toUpperCase();
// o nome digitado atribudo para a varivel nomej transformado em letras maisculas
System.out.println("Nome em letras maisculas: " + nome);

15.4 TRANSFORMAR A LETRA DE UM CHAR EM MAISCULAS


Character.toUpperCase(CARACTER)
No mtodo Character.toUpperCase se o caracter passado como parmetro for uma
letra minscula, o mtodo retorna a respectiva letra em maisculo. Caso o caracter no seja letra
ou j uma letra maiscula, o mtodo retornar o mesmo caracter sem nenhuma modificao.
Exemplo 1:

char sexo;
Scanner leia = new Scanner(System.in);
System.out.print("Digite o Sexo: ");
sexo = leia.next().charAt(0);
if (Character.toUpperCase(sexo) !='M'&&
Character.toUpperCase(sexo) !='F' ){
System.out.print("Sexo Invlido ! ");
}else{
System.out.println("Parabns, voc digitou um sexo vlido ! ");
}
Exemplo 2:

charsexo;
Scanner leia = new Scanner(System.in);
System.out.print("Digite o Sexo: ");
sexo = leia.next().charAt(0);
sexo = Character.toUpperCase(sexo);
if ( sexo != 'M'&&sexo != 'F' ) {
System.out.print("Sexo Invlido ! ");
}else{
System.out.println("Parabns, voc digitou o sexo " + sexo +
" que vlido !");
}

Apostila de LTP2 Java - Air Rabelo

44

15.5 VERIFICAR SE UMA STRING EST CONTIDA EM OUTRA


STRING_1.contains(STRING_2)
O mtodo contains retorna true se o conjunto de caracteres da STRING_1 contm o
conjunto de caractere da STRING_2, caso contrrio, retorna false.

Exemplo:

String texto1 = "FUMEC";


String texto2 = "UME";
String texto3 = "UMA";
if (texto1.contains(texto2)) {// neste caso o este lgico retornar true
System.out.println("Varivel texto1 contem o contedo de texto2");
}
if (texto1.contains(texto3)) {// neste caso o teste lgico retornar false
System.out.println("texto1 contem o contedo de texto3");
}else{
System.out.println("texto1 NO contem o contedo de texto3");
}

15.6 RETORNA A POSIO EM QUE UMA STRING EST DENTRO DE OUTRA


STRING_1.indexOf(STRING_2)
O mtodoindexOf retorna o nmero da posio inicial da STRING_2 contida dentro da
STRING_1. O primeiro caracter de uma String o de nmero 0 (zero). Se por acaso o conjunto de
caracteres da STRING_2 no estiver contido na STRING_1, o valor retornado ser -1.
Exemplo:

intposicao;
String texto1 = "FUMEC";
String texto2 = "UME";
String texto3 = "UMA";
String texto4 = "M";
posicao = texto1.indexOf(texto2);
System.out.println(posicao);
posicao = texto1.indexOf(texto4);
System.out.println(posicao);
posicao = texto1.indexOf(texto3);
System.out.println(posicao);

// varivel posicaoreceber o valor 1


// varivel posicaoreceber o valor 2
// varivel posicaoreceber o valor -1

Apostila de LTP2 Java - Air Rabelo

45

15.7 TROCA UM SEQUNCIA DE CARACTERES POR OUTRA


STRING.replace(CARACTERES_ANTIGOS,CARACTERES_NOVOS)
O mtodo replace retorna uma cpia da STRINGsubstituindo todas as sequencias de
CARACTERES_ANTIGOSencontrados pela sequencia de CARACTERES_NOVOS.
Exemplo 1:

String texto= "JOSE DE CASTRO DE MARIA DE JESUS";


texto= texto.replace(" DE" , "");
System.out.println(texto); // valor exibido: JOSE CASTRO MARIA JESUS
Neste Exemplo 1, aps o uso do mtodo replace, o contedo de textopassar a ser "JOSE
CASTRO MARIA JESUS", ou seja, as sequencias de caracteres contendo "DE"encontrados em
textoforam substitudos por ausncia de caracter (""), ou seja, foram excludas;
Exemplo 2:

String texto= "25-10-2012";


texto= texto.replace("-" , "/");
System.out.println(texto); // valor exibido ser 25/10/2012
Neste Exemplo 2, aps o uso do mtodo replace, o contedo de textopassar a ser
"25/10/2012", ou seja, as sequencias de caracteres contendo "-"encontrados em textoforam
substitudos pelo caracter "/"

15.8 TROCA A PRIMEIRA SEQUNCIA DE CARACTERES POR OUTRA


STRING.replaceFirst(CARACTERES_ANTIGOS,CARACTERES_NOVOS)
O mtodo replaceFirst retorna uma cpia da STRINGsubstituindo a primeira sequencia de
CARACTERES_ANTIGOSencontrados pela sequencia de CARACTERES_NOVOS.
Exemplo 1:

String texto= "JOSE DE CASTRO DE MARIA DE JESUS";


texto= texto.replaceFirst(" DE" , "");
System.out.println(texto); // exibido: JOSE CASTRO DE MARIA DE JESUS
Neste Exemplo 1, aps o uso do mtodo replaceFirst, o contedo de textopassar a ser
"JOSE CASTRO DE MARIA DE JESUS", ou seja, apenas a primeira sequencia de caracteres
"DE"encontrado em textofoi substituda por ausncia de caracter (""), as demais sequencias
"DE"permaneceram como estavam;
Exemplo 2:

String texto= "25-10-2012";


texto= texto.replaceFirst("-" , "/");
System.out.println(texto); // valor exibido ser 25/10-2012

Apostila de LTP2 Java - Air Rabelo

46

Neste Exemplo 2, aps o uso do mtodo replaceFirst, o contedo de textopassar a ser


"25/10-2012", ou seja, apenas o primeirocaracter "-"encontrado em textofoi substitudo por

"/"

15.9 TRANSFORMA UMA STRING EM UM VETOR DE CHAR


STRING.toCharArray()
O mtodo toCharArrayretorna todos os caracteres da STRINGem um vetor do tipo char,
contendo cada caracter da STRINGem um posio do vetor.
Exemplo 1:

charvetorDeCaracteres[];
String texto= "DINAMICA";
vetorDeCaracteres= texto.toCharArray();
// o comando acima copia o contedo da String TEXTO para o vetor vetorDeCaracteres
// colocando cada caracter em uma posio do vetor
System.out.print(vetorDeCaractees[6]); // Exibir na tela o 6o. caracter do vetor => C
No exemplo 1, vetorDeCaracteres um vetor do tipo char que recebeu o seguinte
contedo:
Posio no vetor
0
1
2
3
4
5
6
7
Contedo 'D' 'I' 'N' 'A' 'M' 'I' 'C' 'A'

Apostila de LTP2 Java - Air Rabelo

47

EXERCCIOS (parte 6):


Exerccio 6.1 Fazer um programa para receber via teclado a digitao em letras minsculas de um
NOME do tipo string. Em seguida o programa dever executar os seguintes mtodos:
1.1 Criar um mtodo que para Converter a primeira letra do Nome para maisculo e retornar
o nome convertido.
1.2 - Criar um mtodo para Converter a primeira letra de cada palavra do Nome para maiscula
e imprimir a frase convertida.
1.3 Criar um mtodo para eliminar espaos em branco digitados esquerda do Nome e
retornar o nome sem os espaos.
1.4 Criar um mtodo para eliminar espaos em branco digitados direita do Nome e imprimir
o nome sem os espaos.
1.5 Criar um mtodo para eliminar espaos em branco excessivos digitados entre as palavras
do nome de tal forma que fique somente um espao entre cada palavra, e retornar o
nome.
Exerccio 6.2 Fazer um programa em Java que receba via teclado a digitao de at 30 nomes de
pessoas.
Para cada um dos nomes digitados o programa dever conter um mtodo para gerare retornar um
Login e uma Senha.
Aps gerados o login e senha o programa dever exibi-los na tela.
O Login ser a formado da concatenao da primeira letra de cada nome em maisculo. E a senha
ser formada da concatenao do primeiro dgito do valor ASCII Decimal de cada letra do Login.
Ex:

nome digitado:
Login gerado:
Senha gerada:

jose maria alves dos santos


JMADS(cdigos ASCII decimais: J=74, M=77, A=65, D=68, S=83)
77668

Obs:

- Consistir a entrada de dados para que o nome da pessoa digitado:


- tenha o tamanho mnimo de 15 caracteres;
- no deve existir caracteres espao antes do primeiro nome;
- deve existir pelo menos 1 nome e 1 sobrenome;
-deve existir apenas 1 espao entre o nome e sobrenomes;
- s possua letras em cada nome;
- Criar um FLAG para encerrar a entrada de dados.

Apostila de LTP2 Java - Air Rabelo

48

15 Registros e Arquivos de Dados


Registro:
- um Conjunto de dados heterogneos, ou seja, dados diferentes, porm relacionados a um
mesmo objeto.
Exemplo: Registro de Alunos da FUMEC, que contm os seguintes dados:
- Nome do Aluno
- Endereo do Aluno
- Data de Nascimento
- Sexo
- ...
Ou seja, so dados diferentes, mas todos relativos ao mesmo aluno.
Arquivo de Dados:
- Conjunto de registros seqnciais armazenados em um dispositivo de armazenamento (ex:
HD), gerenciado pelo Sistema Operacional, e manipulado atravs de programas que podem incluir,
alterar, consultar ou excluir dados nos registros.
Exemplo de um arquivo de registros:
- Arquivo que contm os registros dos Alunos da FUMEC:
Ativo
S
S
N
S

Matrcula
054689
025478
009871
009871
(end of file)

Nome Aluno
JOSE DA SILVA
MARIA JOS
SAULO JORGE
SAULO SANTOS JORGE

Data
Nascimento
10/10/1980
20/12/1989
12/02/1992
22/02/1992

Mensalidade

Sexo

750,00
830,00
690,00
590,00

M
F
M
M

 As incluses de novos registros so feitas sempre aps o ultimo registro do arquivo, em uma
rea chamada de END OF FILE (final de arquivo)
 Para excluir registros fisicamente no arquivo no uma operao simples. Uma opo para
isto criar um novo arquivo, com nome diferente, efazer um programa paracopiar os registros
desejados para este novo arquivo, no copiando os registros a excluir. Depois excluir todo o
arquivo anterior e renomear o novo arquivo para o nome original daquele que foi excludo.
 Para excluir um registro lgicamente no arquivo, basta criar um campo (campo Ativo no
exemplo acima) e considerar um valor para os registros vlidos e outro valor para registros
excludos. Desta forma, nos programas para incluir, alterar, consultar e excluir registros,
aqueles marcados como excludos devem ser ignorados, ou seja, considerados como se no
existissem. No exemplo acima, registros cujo campo Ativo forem iguais a S so vlidos, e
iguais a N so excludos.
 Os campos de dados de um registro devero ser associados a um tipo de dado do Java (ex:
String, float, int,...)

Apostila de LTP2 Java - Air Rabelo

49

15.1 - Declarao de Registros em Java:


Para criar um registro no Java deve-se criar uma classe contendo os campos (atributos) associados
aos tipos de dados do Java. A partir da, toda varivel criada e instanciada com tipo da classe passar
a ser um registro contendo os mesmos campos da classe.
Exemplo:
publicclass RegistroDemo{
publicstaticclass Aluno {
publiccharativo;
public String matricula;
public String nomeAluno;
public String dataNasc;
publicfloatmensalidade;
publiccharsexo;
}
publicstaticvoid main(String Args[]){
Aluno regAluno= newAluno();
regAluno.ativo= 'S';
regAluno.matricula="054689";
regAluno.nomeAluno= "JOSE DA SILVA";
regAluno.dataNasc= "10/10/1980";
regAluno.mensalidade= (float) 750;
regAluno.sexo= 'M';
System.out.println("Matrcula do Aluno:
System.out.println("Nome do Aluno.....:
System.out.println("Data de Nascimento:
System.out.println("Valor Mensalidade.:
System.out.println("Sexo..............:
}
}

"
"
"
"
"

+
+
+
+
+

regAluno.matricula);
regAluno.nomeAluno);
regAluno.dataNasc);
regAluno.mensalidade);
regAluno.sexo);

No exemplo acima, o registro foi criado como a classe Aluno, e dentro do mtodo main, a varivel
regAlunofoi criada e instanciada como sendo do tipo Aluno. A partiri deste ponto, regAlunoser
um registro contendo todos os campos da classe Aluno.

15.2 Classes e mtodos para manipulao de Registros em Arquivos


As operaes bsicas de manipulao de registros em arquivos so a INCLUSO de novos registros
no arquivo, a ALTERAO de dados dos registros existentes no arquivo, a CONSULTA de dados dos
registros existentes e a EXCLUSO de registros.
No Java, as classes e mtodos para manipulao de dados em em arquivos esto contidas no pacote
java.io. E todas as operaes envolvendo arquivos que gerarem erros de acesso, como erros de
leitura/gravao no disco, resultaro em excees do tipo IOExeption(Input/Output Exeption).
Estas excees devem ser tratadas por meio do comando try-catchpara evitar erros de execuo
quando as mesmas ocorrerem.

Exemplo:

Apostila de LTP2 Java - Air Rabelo

50

try{
RandomAccessFile arqAluno = new RandomAccessFile("C:\\LTPII\\ALUNOS.DAT", "rw");
arqAluno.close();
}catch (IOException e) {
System.out.println("Erro na abertura do arquivo - programa ser finalizado");
System.exit(0);// cancela a excuo do programa
}
A classe RandomAccessFilepermite a gravao e a leitura de dados em arquivos de forma
aleatria e disponibiliza vrios mtodos para manipulao destes dado.
No exemplo acima, um arquivo com nome ALUNOS.DATser criado dentro da pasta C:\LTPII.
Caso o arquivo j exista dentro desta pasta, ao invs de criado ele ser apenas aberto para uso. Se o
drive\diretrio destino no for informado, o arquivo ser gravado dentro da pasta (diretrio) do projeto
do Eclipse onde a classe (programa) foi criada. O parmetro "rw" indica que o arquivo poder ser
utilizado para leitura ou gravao (read/write). Dentro do programa o arquivo ALUNOS.DAT ser
representado pela varivel arqAluno.

Fechando um arquivo antes de encerrar o programa ( close() ):


Para evitar falha ou corrupo do arquivo de dados, antes de encerrar um programa ou o uso do
arquivo, o mesmo dever ser fechado com o mtodo close().
Exemplo:
arqAluno.close();

Descobrindo o tamanho de um arquivo em nmero de bytes ( length() ):


Exemplo:
System.out.println("Tamanho do arquivo ALUNOS.DAT: " + arqAluno.length() );

Posicionando o ponteiro em um byte do arquivo ( seek() ):


Exemplo:
arqAluno.seek(0); // posiciona o ponteiro no incio do arquivo
arqAluno.seek( arqAluno.length() ); // posiciona o ponteiro no final do arquivo (EOF)

Qual a posio atual do ponteiro em um byte do arquivo ( getFilePointer() ):


Exemplo:
System.out.println("Posio atual do cursor no arquivo: " + arqAluno.getFilePointer() );

Gravar dados no arquivo:


Para cada tipo de dados deve-se utilizar um mtodo de gravao no arquivo:
varivel_arquivo.writeByte( <valor> )
varivel_arquivo.writeInt( <valor> )
varivel_arquivo.writeFloat( <valor> )
varivel_arquivo.writeDouble( <valor> )
varivel_arquivo.writeBoolean( <valor> )
varivel_arquivo.writeChar( <valor> )
varivel_arquivo.writeUTF( <valor> )

Grava um valor do tipo byte


Grava um valor do tipo int
Grava um valor do tipo float
Grava um valor do tipo double
Grava um valor do tipo boolean
Grava um valor do tipo char
Grava um valor do tipo String

Apostila de LTP2 Java - Air Rabelo

51

Exemplo, inserindo um registro no arquivo:


regAluno.ativo= 'S';
regAluno.matricula = "054689";
regAluno.nomeAluno = "JOSE DA SILVA";
regAluno.dataNasc= "10/10/1980";
regAluno.mensalidade= 750;
regAluno.sexo= 'M';
try{
RandomAccessFile arqAluno = new RandomAccessFile("G:\\LTPII\\ALUNOS.DAT", "rw");
arqAluno.seek(arqAluno.length()); // posiciona ponteiro no fim do arquivo (EOF)
arqAluno.writeChar(regAluno.ativo);
arqAluno.writeUTF(regAluno.matricula);
arqAluno.writeUTF(regAluno.nomeAluno);
arqAluno.writeUTF(regAluno.dataNasc);
arqAluno.writeFloat(regAluno.mensalidade);
arqAluno.writeChar(regAluno.sexo);
arqAluno.close();
System.out.println("Dados gravados com sucesso !\n");
}catch (IOException e) {
System.out.println("Erro na gravaao do registro - programa ser finalizado");
System.exit(0);
}

Ler dados de um arquivo:


Para cada tipo de dados deve-se utilizar um mtodo de leitura no arquivo:
varivel_arquivo.readByte( <valor> )
varivel_arquivo.readInt( <valor> )
varivel_arquivo.readFloat( <valor> )
varivel_arquivo.readDouble( <valor> )
varivel_arquivo.readBoolean( <valor> )
varivel_arquivo.readChar( <valor> )
varivel_arquivo.readUTF( <valor> )

L um valor do tipo byte


L um valor do tipo int
L um valor do tipo float
L um valor do tipo double
L um valor do tipo boolean
L um valor do tipo char
L um valor do tipo String

Exemplo, consultando um registro no arquivo:


System.out.println(" *************** CONSULTA DE ALUNOS ***************** ");
System.out.print("Digite a Matrcula do Aluno para consulta: ");
matriculaChave = leia.nextLine();
try{
RandomAccessFile arqAluno = new RandomAccessFile("G:\\LTPII\\ALUNOS.DAT", "rw");
while (true){
regAluno.ativo
= arqAluno.readChar();
regAluno.matricula
= arqAluno.readUTF();
regAluno.nomeAluno
= arqAluno.readUTF();
regAluno.dataNasc= arqAluno.readUTF();
= arqAluno.readFloat();
regAluno.mensalidade
regAluno.sexo
= arqAluno.readChar();
if ( matriculaChave.equals(regAluno.matricula) &&regAluno.ativo== 'S'){

Apostila de LTP2 Java - Air Rabelo

52

System.out.println("Nome do aluno.......:
System.out.println("Data de nascimento..:
System.out.println("Valor da mensalidade:
System.out.println("Sexo do aluno.......:
break;
}

"
"
"
"

+
+
+
+

regAluno.nomeAluno);
regAluno.dataNasc);
regAluno.mensalidade);
regAluno.sexo);

}
arqAluno.close();
}catch (EOFException e){
System.out.println("Esta matrcula no foi encontrada no arquivo !\n");
}catch (IOException e) {
System.out.println("Erro na abertura do arquivo - programa ser finalizado");
System.exit(0);
}

15.3 Campo Chave (chave primria) de um registro


Para garantir que no existam registros repetidos e para localizar um registro em um arquivo deve-se
utilizar o conceito de campo Chave. O campo Chave representado por um dos campos de dados do
registro que nunca contenham valores repetidos em registros diferentes do arquivo.
Quando no possvel utilizar apenas um campo de dados que identifique um registro sem que os
valores deste campo, em registros diferentes, se repitam, pode-se criar um campo especfico para este
fim. Outra forma seriautilizar mais de um campo para identificar o registro, sendo que juntos, os
valores destes campos so exclusivos para cada registro do arquivo.
Sendo assim, o campo Chave, por contervalor exclusivo entre diferentes registros, passa a ser o
campo que identifica um registro no arquivo. Tambm conhecido como chave primria de um arquivo
de dados.
Exemplo:
publicstaticclass Aluno{
publiccharativo;
public String matricula;
public String nomeAluno;
public String dtNasC;
publicfloatmensalidade;
publiccharsexo;
}
Na estrutura de registro acima, qual dos campos poderia ser o campo chave ?
- nomeAluno=> no poderia ser o campo chave porque possvel que exista mais de um aluno com
o mesmo nome (homnimo), no sendo assim exclusivo para cada registro.
- mensalidade, dataNasce sexo, tambm no poderiam ser o campo chave pelo mesmo
motivo do nomeAluno
- matricula=> a matrcula o campo adequado para ser a chave primria, porque ela existe no
registro do aluno exatamente para identific-lo e diferenci-lo de outros alunos, sendo assim, cada
aluno ter uma matrcula diferente.

Apostila de LTP2 Java - Air Rabelo

53

Ento usaremos a matriculacom campo chave para localizar um registro no arquivo e no ser
permitida a incluso alunos que contenha a mesma matricula, ou seja, o programa que inclui
registros no arquivo dever garantir que s sejam includos alunos com o nmeros de
matriculadiferentes.

15.4 Exemplos de programas


15.4.1 - Exemplo 1:
Programa paraINCLUSOde dados em um registro de Alunosgravado em um arquivo em disco de
nome ALUNOS.DAT
import java.io.*;
import java.util.*;
publicclassExemploInclusao {
publicstaticclass Aluno{
publicchar
ativo;
public String matricula;
public String nomeAluno;
public String dataNasc;
publicfloat
mensalidade;
publicchar
sexo;
}
publicstaticvoid main(String[] args) {
Aluno regAluno = newAluno(); // regAluno a varivel que conter um registro na memria
RandomAccessFile arqAluno;
// arqAluno a varivel que representar o arquivo em disco
Scanner leia = new Scanner(System.in);
booleanencontrou;
String matriculaChave;
charconfirmacao;
do{
do{
System.out.println(" *************** INCLUSAO DE ALUNOS ***************** ");
System.out.print("Digite a Matrcula do Aluno( FIM para encerrar): ");
matriculaChave = leia.nextLine();
if (matriculaChave.equals("FIM")) {
break;
}
encontrou = false;
try{
arqAluno= new RandomAccessFile("ALUNOS.DAT", "rw");
while (true){
regAluno.ativo
= arqAluno.readChar();
regAluno.matricula= arqAluno.readUTF();
regAluno.nomeAluno= arqAluno.readUTF();
regAluno.dataNasc= arqAluno.readUTF();
regAluno.mensalidade= arqAluno.readFloat();
regAluno.sexo= arqAluno.readChar();
if ( matriculaChave.equals(regAluno.matricula) &&regAluno.ativo== 'S'){
System.out.println("Matrcula j cadastrada, digite outro valor\n");
encontrou = true;
break;
}
}
arqAluno.close();
}catch (EOFException e){
encontrou = false;

Apostila de LTP2 Java - Air Rabelo

54

}catch (IOException e) {
System.out.println("Erro na abertura do arquivo - programa ser finalizado");
System.exit(0);
}
}while (encontrou);
if (matriculaChave.equals("FIM")){
System.out.println("\n ************ PROGRAMA ENCERRADO ************** \n");
break;
}
regAluno.ativo= 'S';
regAluno.matricula= matriculaChave;
System.out.print("Digite o nome do aluno.........................: ");
regAluno.nomeAluno= leia.nextLine();
System.out.print("Digite a data de nascimento (DD/MM/AAAA).......: ");
regAluno.dataNasc= leia.nextLine();
System.out.print("Digite o valor da mensalidade..................: ");
regAluno.mensalidade= leia.nextFloat();
System.out.print("Digite o Sexo do aluno (M/F)...................: ");
regAluno.sexo= leia.next().charAt(0);
do{
System.out.print("\nConfirma a gravao dos dados (S/N) ? ");
confirmacao = leia.next().charAt(0);
if (confirmacao == 'S'){
try{
arqAluno= new RandomAccessFile("ALUNOS.DAT", "rw");
arqAluno.seek(arqAluno.length()); // posiciona no final do arquivo (EOF)
arqAluno.writeChar(regAluno.ativo);
arqAluno.writeUTF(regAluno.matricula);
arqAluno.writeUTF(regAluno.nomeAluno);
arqAluno.writeUTF(regAluno.dataNasc);
arqAluno.writeFloat(regAluno.mensalidade);
arqAluno.writeChar(regAluno.sexo);
arqAluno.close();
System.out.println("Dados gravados com sucesso !\n");
}catch (IOException e) {
System.out.println("Erro na gravaao do registro - programa ser finalizado");
System.exit(0);
}
}
}while (confirmacao != 'S'&&confirmacao != 'N');
leia.nextLine();
}while ( ! regAluno.matricula.equals("FIM"));
leia.close();
}
}

15.4.2 - Exemplo 2:
Programa para ALTERAO de dados em um registro de Alunos gravado em um arquivo em disco de
nome ALUNOS.DAT
import java.io.*;
import java.util.*;
publicclassExemploAlteracao{
publicstaticclassAluno{
publicchar
ativo;
public String matricula;
public String nomeAluno;
public String dataNasc;
publicfloat
mensalidade;
publicchar
sexo;

Apostila de LTP2 Java - Air Rabelo

55

}
publicstaticvoid main(String[] args) {
AlunoregAluno = newAluno();
AlunonovoAluno = newAluno();
RandomAccessFile arqAluno;
// arqAluno a varivel que representar o arquivo em disco
Scanner leia = new Scanner(System.in);
booleanencontrou;
String matriculaChave;
charconfirmacao;
longposicaoRegistro = 0;
do{
do{
System.out.println(" *************** ALTERAO DE ALUNOS ***************** ");
System.out.print("Digite a Matrcula do Aluno que deseja alterar( FIM para encerrar ): ");
matriculaChave = leia.nextLine();
if (matriculaChave.equals("FIM")) {
break;
}
encontrou = false;
try{
arqAluno = new RandomAccessFile("ALUNOS.DAT", "rw");
while (true){
posicaoRegistro = arqAluno.getFilePointer();

// guarda a posio inicial do


registro a ser alterado

regAluno.ativo
= arqAluno.readChar();
regAluno.matricula
= arqAluno.readUTF();
regAluno.nomeAluno
= arqAluno.readUTF();
regAluno.dataNasc
= arqAluno.readUTF();
regAluno.mensalidade = arqAluno.readFloat();
regAluno.sexo = arqAluno.readChar();
if ( matriculaChave.equals(regAluno.matricula) &&regAluno.ativo == 'S'){
encontrou = true;
break;
}
}
arqAluno.close();
}catch (EOFException e){
encontrou = false;
System.out.println("Esta matrcula no foi encontrada no arquivo !\n");
}catch (IOException e) {
System.out.println("Erro na abertura do arquivo - programa ser finalizado");
System.exit(0);
}
}while ( ! encontrou);
if (matriculaChave.equals("FIM")){
System.out.println("\n ************
break;
}

PROGRAMA ENCERRADO

************** \n");

regAluno.ativo = 'N'; // desativar o registro antigo


novoAluno.ativo = 'S';
novoAluno.matricula = matriculaChave;
System.out.println("Nome Atual do aluno.........................: " + regAluno.nomeAluno);
System.out.print ("Digite o NOVO NOME do Aluno.................: ");
novoAluno.nomeAluno = leia.nextLine();
System.out.println();
System.out.println("Data de nascimento atual.....................: " + regAluno.dataNasc);
System.out.print ("Digite a NOVA DATA de Nascimento (DD/MM/AAAA): ");
novoAluno.dataNasc = leia.nextLine();

Apostila de LTP2 Java - Air Rabelo

56

System.out.println();
System.out.println("Valor Atual da mensalidade...................: " + regAluno.mensalidade);
System.out.print ("Digite o NOVO VALOR da Mensalidade...........: ");
novoAluno.mensalidade = leia.nextFloat();
System.out.println();
System.out.println("Sexo Atual do aluno..........................: " + regAluno.sexo);
System.out.print ("Digite o NOVO sexo do Aluno (M/F)............: ");
novoAluno.sexo = leia.next().charAt(0);
do{
System.out.print("\nConfirma a alterao dos dados (S/N) ? ");
confirmacao = leia.next().charAt(0);
if (confirmacao == 'S'){
try{
arqAluno = new RandomAccessFile("ALUNOS.DAT", "rw");
// desativando o registro antigo
arqAluno.seek(posicaoRegistro);
arqAluno.writeChar(regAluno.ativo);
// gravando o novo registro com as alteraes
arqAluno.seek(arqAluno.length()); // posiciona no final do arquivo (EOF)
arqAluno.writeChar(novoAluno.ativo);
arqAluno.writeUTF(novoAluno.matricula);
arqAluno.writeUTF(novoAluno.nomeAluno);
arqAluno.writeUTF(novoAluno.dataNasc);
arqAluno.writeFloat(novoAluno.mensalidade);
arqAluno.writeChar(novoAluno.sexo);
arqAluno.close();
System.out.println("Dados alterados com sucesso !\n");
}catch (IOException e) {
System.out.println("Erro na gravaao do registro - programa ser finalizado");
System.exit(0);
}
}
}while (confirmacao != 'S'&&confirmacao != 'N');
leia.nextLine();
}while ( ! regAluno.matricula.equals("FIM"));
leia.close();
}
}

15.4.3 - Exemplo 3:
Programa para CONSULTA de dados em um registro de Alunos gravado em um arquivo em disco de
nome ALUNOS.DAT
import java.io.*;
import java.util.*;
publicclassExemploConsulta {
publicstaticclassAluno{
publicchar
ativo;
public String matricula;
public String nomeAluno;
public String dataNasc;
publicfloat
mensalidade;
publicchar
sexo;
}

Apostila de LTP2 Java - Air Rabelo

57

publicstaticvoid main(String[] args) {


AlunoregAluno = newAluno();
RandomAccessFile arqAluno;
// arqAluno a varivel que representar o arquivo em disco
Scanner leia = new Scanner(System.in);
booleanencontrou;
String matriculaChave;
do{
do{
System.out.println(" *************** CONSULTA DE ALUNOS ***************** ");
System.out.print("Digite a Matrcula do Aluno para consulta( FIM para encerrar ): ");
matriculaChave = leia.nextLine();
if (matriculaChave.equals("FIM")) {
break;
}
encontrou = false;
try{
arqAluno = new RandomAccessFile("ALUNOS.DAT", "rw");
while (true){
= arqAluno.readChar();
regAluno.ativo
regAluno.matricula
= arqAluno.readUTF();
= arqAluno.readUTF();
regAluno.nomeAluno
regAluno.dataNasc
= arqAluno.readUTF();
regAluno.mensalidade = arqAluno.readFloat();
regAluno.sexo = arqAluno.readChar();
if ( matriculaChave.equals(regAluno.matricula) &&regAluno.ativo == 'S'){
encontrou = true;
break;
}
}
arqAluno.close();
}catch (EOFException e){
encontrou = false;
System.out.println("Esta matrcula no foi encontrada no arquivo !\n");
}catch (IOException e) {
System.out.println("Erro na abertura do arquivo - programa ser finalizado");
System.exit(0);
}
}while ( ! encontrou);
if (matriculaChave.equals("FIM")){
System.out.println("\n ************
break;
}
System.out.println("Nome do aluno.......:
System.out.println("Data de nascimento..:
System.out.println("Valor da mensalidade:
System.out.println("Sexo do aluno.......:
System.out.println();

"
"
"
"

PROGRAMA ENCERRADO

+
+
+
+

************** \n");

regAluno.nomeAluno);
regAluno.dataNasc);
regAluno.mensalidade);
regAluno.sexo);

}while ( ! regAluno.matricula.equals("FIM"));
leia.close();
}
}

15.4.4 - Exemplo 4:
Programa para EXCLUSO de dados em um registro de Alunos gravado em um arquivo em disco de
nome ALUNOS.DAT

Apostila de LTP2 Java - Air Rabelo

58

Obs: como a excluso fsica de registros uma operao complexa e demorada, normalmente o que
se faz uma excluso lgica dos registros. No programa abaixo, a excluso lgica se trata apenas de
alterar o valor do campo ativopara o valor 'N'. Sendo assim, nos programas de incluso, alterao,
consulta e no prprio de excluso, toda vez que um registro tiver o valor do campo ativo = 'N', este
registro ser ignorado e tratado como se no existisse, ou seja, est excludo !
import java.io.*;
import java.util.*;
publicclassExemploExclusao {
publicstaticclassAluno{
publicchar
ativo;
public String matricula;
public String nomeAluno;
public String dataNasc;
publicfloat
mensalidade;
publicchar
sexo;
}
publicstaticvoid main(String[] args) {
AlunoregAluno = newAluno();
RandomAccessFile arqAluno;
// arqAluno a varivel que representar o arquivo em disco
Scanner leia = new Scanner(System.in);
booleanencontrou;
String matriculaChave;
charconfirmacao;
longposicaoRegistro = 0;
do{
do{
System.out.println(" *************** EXCLUSO DE ALUNOS ***************** ");
System.out.print("Digite a Matrcula do Aluno que deseja excluir ( FIM para encerrar ): ");
matriculaChave = leia.nextLine();
if (matriculaChave.equals("FIM")) {
break;
}
encontrou = false;
try{
arqAluno = new RandomAccessFile("ALUNOS.DAT", "rw");
while (true){
posicaoRegistro = arqAluno.getFilePointer();

// guarda a posio inicial do


registro a ser excludo

regAluno.ativo
= arqAluno.readChar();
regAluno.matricula
= arqAluno.readUTF();
regAluno.nomeAluno
= arqAluno.readUTF();
= arqAluno.readUTF();
regAluno.dataNasc
regAluno.mensalidade = arqAluno.readFloat();
regAluno.sexo = arqAluno.readChar();
if ( matriculaChave.equals(regAluno.matricula) &&regAluno.ativo == 'S'){
encontrou = true;
break;
}
}
arqAluno.close();
}catch (EOFException e){
encontrou = false;
System.out.println("Esta matrcula no foi encontrada no arquivo !\n");
}catch (IOException e) {
System.out.println("Erro na abertura do arquivo - programa ser finalizado");
System.exit(0);
}
}while ( ! encontrou);

Apostila de LTP2 Java - Air Rabelo

59

if (matriculaChave.equals("FIM")){
System.out.println("\n ************
break;
}

PROGRAMA ENCERRADO

************** \n");

regAluno.ativo = 'N'; // desativar o registro => excluso


System.out.println("Nome do aluno.......: " + regAluno.nomeAluno);
System.out.println("Data de nascimento..: " + regAluno.dataNasc);
System.out.println("Valor da mensalidade: " + regAluno.mensalidade);
System.out.println("Sexo do aluno.......: " + regAluno.sexo);
System.out.println();
do{
System.out.print("\nConfirma a excluso deste aluno (S/N) ? ");
confirmacao = leia.next().charAt(0);
if (confirmacao == 'S'){
try{
arqAluno = new RandomAccessFile("ALUNOS.DAT", "rw");
// desativando o registro => excluso
arqAluno.seek(posicaoRegistro);
arqAluno.writeChar(regAluno.ativo);
arqAluno.close();
System.out.println("Aluno excludo com sucesso !\n");
}catch (IOException e) {
System.out.println("Erro na gravaao do registro - programa ser finalizado");
System.exit(0);
}
}
}while (confirmacao != 'S'&&confirmacao != 'N');
leia.nextLine();
}while ( ! regAluno.matricula.equals("FIM"));
leia.close();
}
}

Apostila de LTP2 Java - Air Rabelo

60

EXERCCIOS (parte 7):


Questo 7.1 - Fazer um programa em Java para incluir dados em um arquivo de Clientes de uma
Empresa, de acordo com a estrutura de registro abaixo:
ativo
-> char
- gravar 'S' na incluso e 'N' na excluso
codCliente
->int - cdigo do cliente
nomeCliente
-> String - nome do cliente
vlrCompra
->float
- valor da compra
anoPrimeiraCompra
-> int
- ano que o cliente fez a primeira compra
emDia
-> boolean - se o cliente est em dia com o pagamento
Obs:

- utilizar o campo CODCLI como campo chave primria.

CONSISTNCIAS:
- o nome do cliente deve ter no mnimo 10 caracteres.
- o cdigo do cliente deve ser nmero inteiro e maior que (zero).
- o valor da compra deve ser maior que zero.
- o ano da primeira compra dever ser menor ou igual a 2013.
- emDia : por ser um campo do tipo boolean (lgico), no arquivo este campo deve ser preenchido
com o valor TRUE ou FALSE. Entretanto, para exibir o valor na tela o programa dever exibir S ou N,
e o usurio dever digitar tambm o valor S ou N para este campo. Para isto, o programa dever
utilizaruma varivel auxiliar do tipo char e solicitar ao usurio que responda a pergunta: ("Cliente
est em dia (S/N)?"). Se a resposta for 'S', atribuir TRUE ao campo emDia, caso contrrio,
atribuir o valor FALSE
- Quando o codClientefor digitado, verificar no arquivo se j existe algum outro registro que j
possua o codClienteinformado e com ativo == 'S'(registro no excludo). Caso existir,
mostrar uma mensagem de erro ("Cliente j cadastrado !"), e no permitir a incluso.

Questo 7.2 - Fazer os programas para alterar, consultar e excluir dados dos registros no arquivo do
exerccio anterior.

Apostila de LTP2 Java - Air Rabelo

61

You might also like