Buscar

Aula 08 - LPG

Prévia do material em texto

Aula 08: Aplicando os conceitos de OO 
 
Objetivos 
 
 Recordando... 
Nas aulas passadas, criamos algumas aplicações Java para ilustrar os conceitos de POO 
apresentados. Nestas aplicações usamos variáveis de diversos tipos, operadores e alguns 
comandos de decisão e repetição. Hoje vamos rever esses tipos e comandos 
detalhadamente. Também veremos como ler dados do teclado, pois até agora só 
imprimimos dados. 
 Tipos primitivos e tipos de referência 
Em Java, trabalhamos com dois tipos de dados: primitivos e de referência, estes também 
denominados como não primitivos. 
Primitivos: 
Tipo Quant. bits Valores armazenáveis na variável 
boolean 1 True ou False 
byte 8 –128 até 127 ( -27 a 27-1 ) 
char 16 „\u0000‟ a „\uFFFF‟ (0 a 65535) 
short 16 –32768 até 32767 ( -215 a 215-1 ) 
int 32 –2.147.483.648 até 2.147.483.647 (-231 a 231-1 ) 
long 64 (-2
63
 a 2
63
-1 ) 
float 32 1,40 X 10
-45
 a 3,40 X 10
38
 
double 64 4,94 X 10
-324
 a 1,70 X 10
308
 
 
Variável de tipo primitivo pode armazenar exatamente um valor do seu tipo declarado. 
Variáveis de tipo de referência são utilizadas para armazenar as localizações de objetos 
na memória do computador. 
Os atributos de tipo primitivo são iniciados por ocasião da instanciação do objeto. Os 
atributos de tipos byte, char, short, int, long, float e double são iniciadas com zero, as 
variáveis do tipo boolean com false. Podem ser especificados valores iniciais para 
variáveis destes tipos quando de sua declaração. Variáveis locais de métodos não são 
iniciadas automaticamente. 
As variáveis de instância de tipo de referência são iniciadas por padrão com o valor 
null – palavra reservada que representa uma “referência a nada”. Somente depois que o 
objeto é instanciado é que a variável contém uma referência para o objeto. 
Por exemplo, o comando Curso meuCurso = new Curso(); cria uma instância 
(objeto) da classe Curso, e a variável meuCurso contém uma referência a esse objeto. 
A partir de então, a variável pode ser usada para chamar métodos do objeto ou 
referenciar seus atributos. 
 Diferenciar tipos primitivos de dados e tipos de referência a objetos 
 Entender o uso dos operadores aritméticos, lógicos e relacionais 
 Aprender a sintaxe e semântica das estruturas de controle de fluxo 
 Tratar entradas de dados 
 Aprender a utilizar a classe String 
 
 
 Usando Operadores 
O Java oferece um conjunto amplo de operadores aritméticos, relacionais e lógicos. 
Veja a tabela abaixo: 
Tipo Op. Significado Ex. Op. Significado Ex. 
a
ri
tm
é
ti
c
o
s
 
 
+ Adição a+b % Resto da divisão a%b 
- Subtração a-b - Menos unário -a 
* Multiplicação a*b ++ Incremento unário ++a ou a++ 
/ Divisão a/b -- Decremento unário --a ou a-- 
re
la
c
io
n
a
is
 
 
== Igual a==b >= Maior ou igual a>=b 
!= Diferente a!=b < Menor que a<b 
> Maior que a>b <= Menor ou igual a<=b 
ló
g
ic
o
s
 
 
&& E lógico a&&b ! Negação !a 
|| OU lógico a||b 
 
 Estruturas de Controle do fluxo 
Java contém três tipos de estruturas de controle (instruções): seqüência, seleção e 
repetição. Um programa é formado pela combinação destas estruturas, de forma a 
implementar o que o algoritmo determina. 
A estrutura de seqüência permite aglutinar vários comandos em um bloco de comandos 
delimitado por chaves ({...}). Isto deve ser feito sempre que queiramos delimitar os 
comandos que façam parte de uma outra estrutura de controle de decisão ou repetição 
(if/else, switch, for, while, etc.). 
 Instruções de seleção 
Comando if 
O if é uma instrução que permite a seleção entre dois caminhos distintos, conforme a 
avaliação de uma condição lógica como falsa ou verdadeira. 
if (expressão lógica)comando1; else comando2; 
Exemplo: 
if ( nota >= 6 ) 
 System.out. println (“Aprovado”); 
else 
 System.out. println (“Reprovado”); 
A parte do else é opcional. Comando1 e Comando2 podem ser blocos de comandos. O 
compilador Java sempre associa um else à instrução if imediatamente anterior, a menos 
que instruído de outro modo pela colocação das chaves 
 
Operador condicional ternário 
Como já vimos em aulas anteriores, em algumas situações podemos usar o operador “?”, 
que realiza a mesma operação do comando if. Ex: 
System.out.println(nota > 6 ? “Aprovado”:“Reprovado”); 
 
Comando switch 
Este comando equivale a um conjunto de if encadeados: 
switch (expressão ordinal) { 
 case ordinal1: comando1; break; 
 case ordinal2: comando2; break; 
 case ordinalN: comandoN; break; 
 default: comandoDefault; 
} 
Exemplo: 
switch (opcao) { 
 case „a‟: 
 case „A‟: System.out.println(“letra A”); 
 break; 
 case „b‟: 
 case „B‟: System.out.println(“letra B”); 
 break; 
 default: System.out.println(“letra invalida”); 
} 
 
 Estruturas de repetição 
 
Comando for 
O comando for é indicado para repetirmos um trecho de código uma quantidade fixa de 
vezes. Sua sintaxe possui três seções opcionais: 
for (seção1; seção2; seção3) comando; 
a seção1 é executada apenas uma vez e geralmente é usada para iniciar uma variável de 
controle do for. A seção2 é executada antes de cada iteração do for e habilita a execução 
de mais uma iteração, caso verdadeira (true). Geralmente é usada para testar a variável 
de controle do for. A seção3 é executada ao final de cada iteração do for e geralmente é 
usada para incrementar a variável de controle. 
Exemplo: 
for (int i = 0; i < 4;i++) 
 System.out.printf(“%d ”,i); //imprime de 0 a 3 
 
Comandos while / do 
O comando while é indicado quando desejamos repetir um trecho de código uma 
quantidade indefinida de vezes, enquanto uma determinada condição for verdadeira. 
Sintaxe: 
 while (expressão lógica) 
 comando1; 
 
Exemplo: 
while ( produto <= 100 ) 
 produto = 3 * produto; 
Caso a condição seja inicialmente falsa, nenhuma iteração será executada. Nos casos em 
que desejamos executar pelo menos uma vez os comando da repetição, devemos usar o 
comando do / while, Cuja sintaxe é a que se segue: 
do 
 comando1; 
while (expressão lógica); 
Veja o exemplo: 
do 
 produto = 3 * produto; 
while ( produto <= 100 );// testa após ter executado 
 // pelo menos uma vez 
 Lendo valores do teclado 
Até agora, nossas aplicações apenas escreviam valores na tela de console. Fizemos isso 
usando (embora sem ter sido ainda explicado) um Stream de dados. Um Stream é um 
canal que conduz os dados de um lugar (um arquivo ou um dispositivo) para outro. A 
stream de saída padrão (out) está na classe Java.lang.System e é aberta 
automaticamente pela máquina virtual Java, já associada ao dispositivo de saída padrão 
(display). 
Já a stream de entrada padrão (in), disponível estaticamente através da mesma classe 
Java.lang.System, é de utilização bastante precária, na medida em que disponibiliza 
métodos apenas de acesso a bytes, de forma que, para que se leia valores inteiros, reais 
ou strings, é necessário ir concatenando bytes para formar a entrada desejada. Assim, não 
utilizaremos essa forma de entrada e sim uma classe mais elaborada, disponível na 
biblioteca java.util.Scanner, que permite a chamada de métodos para ler diretamente 
strings, números inteiros e números reais. 
Para utilizá-la, é necessário instanciar um objeto da classe Scanner e chamar um 
método apropriado para ler cada um dos tipos básicos ou String de um dispositivo 
qualquer. Por exemplo, para ler do dispositivo padrão de entrada, podemos ter o seguinte 
código: 
// cria Scanner para ler entrada na janelade comando 
 Scanner entrada = new Scanner( System.in ); 
// faz Scanner ler variáveis de diferentes tipos 
 palavra = entrada.next() // lê String até <branco> 
 nome = entrada.nextLine() // lê String até <ENTER> 
 valorI = entrada.nextInt() // lê valor inteiro 
 valorF = entrada.nextFloat() // lê valor float 
 valorD = entrada.nextDouble() // lê valor double 
 valorB = entrada.nextBoolean() // lê valor boolean 
 
Além de ler os valores, podemos também testar se o valor é do tipo esperado, através de 
métodos que retornam valores lógicos. Por exemplo: 
if (entrada.hasInt()) { // true, se entrada inteira 
if (entrada.hasFloat()) { // true, se entrada float 
if (entrada.hasDouble()) { // true, se entrada double 
if (entrada.hasBoolean()) { // true,se entrada boolean 
 
 
 
 A classe String 
A classe String fornece construtores para iniciar objetos String de várias maneiras. 
Quatro delas são mostradas no módulo main da classe abaixo. 
public class StringConstructors{ 
 public static void main( String args[] ) { 
 char cArray[]={'b','i','r','t','h',' ','d','a','y'}; 
 String s = new String( "hello" ); 
 String s1 = new String(); 
 String s2 = new String(s); 
 String s3 = new String(cArray ); 
 String s4 = new String(cArray, 6, 3 ); 
 System.out.printf( 
 "s1 = %s\ns2 = %s\ns3 = %s\ns4 = %s\n", 
 s1, s2, s3, s4 ); // exibe strings 
 } // fim de main 
} 
 
Alguns métodos da classe String: 
length() – retorna o comprimento de uma string 
 public int length() 
 
charAt(índice) – retorna o caractere de uma localização específica do string 
 public char charAt(int index) 
 
getChars – retorna o conjunto de caracteres de um string como array char. 
public void getChars(int srcBegin, int srcEnd, 
 char[] dst, int dstBegin) 
 
O funcionamento desses métodos é visto na classe Miscelanea a seguir: 
public class Miscelanea{ 
 public static void main( String args[] ) { 
 String s1 = "OTO AMA ANA"; 
 char charArray[] = new char[3]; 
 System.out.printf("O String s1: %s", s1 ); 
 System.out.printf("\nTamanho: %d",s1.length()); 
 // percorre s1 com charAt e exibe em ordem inversa 
 System.out.print( "\nO String invertido: " ); 
 for ( int count=s1.length()-1; count>=0; count--) 
 System.out.printf( "%s", s1.charAt( count )); 
 // copia caracteres do String para o charArray 
 s1.getChars( 4, 7, charArray, 0 ); 
 System.out.print("\Caracteres de 4 ate 6: " ); 
 for (char caracter : charArray ) 
 System.out.print( caracter ); 
 System.out.println(); 
 } // fim de main 
} 
 
 
Aplicando os conceitos aprendidos 
Para consolidar os conceitos de operadores, estruturas de controle e criação de interfaces, 
vamos criar uma aplicação diferente da que vínhamos fazendo nas aulas passadas. Nossa 
aplicação possuirá apenas uma classe (Curso), que guardará seu próprio nome, o nome de 
um aluno e as notas das três avaliações desse aluno no curso. A classe oferece métodos de 
get e set para seus atributos e um método que avalia se o aluno foi aprovado ou reprovado, 
de acordo com as notas das avaliações, retornando um String com essa avaliação final. Para 
julgar se o aluno foi aprovado, é feita a média das duas maiores notas e o aluno estará 
aprovado se esta for maior ou igual a 6,0. 
public class Curso { 
 private String nomeCurso; 
 private String nomeAluno; 
 private float notas[]; 
 
 public Curso(String nomeCurso,String nomeAluno) { 
 this.nomeCurso = nomeCurso; 
 this.nomeAluno = nomeAluno; 
 notas = new float[3]; 
 } 
 
 public void setNomeCurso( String nomeCurso ) { 
 this.nomeCurso = nomeCurso; 
 } 
 
 public String getNomeCurso() { 
 return nomeCurso; 
 } 
 
 public void setNomeAluno( String nomeAluno ) { 
 this.nomeAluno = nomeAluno; 
 } 
 
 public String getNomeAluno() { 
 return nomeAluno; 
 } 
 
 public void setNotas (float nota, int posicao){ 
 notas[posicao] = nota; 
 } 
 public float calcularMedia() { 
 int indNota=0; // indice das notas 
 float piorNota=11; // valor da nota a descartar 
 int indPiorNota=0; // indice da nota a descartar 
 while ( indNota < 3 ) { // descobre a pior nota 
 if (notas[indNota] < piorNota){ 
 piorNota = notas[indNota]; 
 indPiorNota = indNota; 
 } 
 indNota++; 
 } // fim do while 
 switch (indPiorNota){//media das 2 melhores 
 case 0: return ((notas[1]+notas[2])/2); 
 case 1: return ((notas[0]+notas[2])/2); 
 case 2: return ((notas[0]+notas[1])/2); 
 
 } 
 return 0; 
 } // fim do método calcularMedia 
 
 public String determinarSituacao() { 
 String situacao; 
 if (calcularMedia() >= 6.0) 
 situacao = "APROVADO(A)"; 
 else 
 situacao = "REPROVADO(A)"; 
 return String.format( 
 "\n%s %s %s %s %s %s %s %.2f\n\n", 
 "O(a) aluno(a)",getNomeAluno(),"foi", 
 situacao,"no curso",getNomeCurso(), 
 "com media",calcularMedia()); 
 } // fim do método determinarSituacao 
 
} // fim da classe LivroNotas 
 
A classe da aplicação de teste possui o seguinte código: 
import java.util.Scanner; // Classe Scanner 
public class AppCurso 
{ 
 public static void main( String args[] ) { 
 float nota; 
 String curso="",aluno=""; //inicia Strings 
 // cria Scanner para ler entrada do console 
 Scanner entrada = new Scanner( System.in ); 
 System.out.printf("\nEntre com nome do curso: "); 
 curso = entrada.nextLine() ; 
 System.out.printf("\nEntre com nome do aluno: "); 
 aluno = entrada.nextLine(); 
 Curso meuCurso = new Curso(curso,aluno); 
 for (int cont=0; cont<3; cont++){ 
 System.out.printf("\nDigite a nota %d: ",cont+1); 
 nota = entrada.nextFloat(); // lê a próxima nota 
 meuCurso.setNotas(nota,cont); 
 } 
 System.out.printf("%s", 
 meuCurso.determinarSituacao()); 
 } // fim de main 
} // fim da classe AppCurso 
 
 Exercícios 
1. Implemente e rode todos os exercícios desta aula (Ex1 até Ex9). 
2. Coloque na classe Curso um atributo frequencia, que represente o percentual de aulas 
assistidas pelo aluno. Modifique o método determinarSituacao de forma que seja 
considerado um percentual mínimo de 75% para que o aluno seja aprovado. 
3. Substitua o comando for da classe de teste pelo comando do/while.

Continue navegando