Você está na página 1de 31

[if; else]

condicional
Controlo de fluxo

Sistemas Informáticos LEB/LEF/MIEBIOM/MIEF


1
Utilização de código já existente em Java
• Em Java podemos utilizar funções já disponíveis, por exemplo para
leitura do teclado, cálculos matemáticos, etc.

LEB/LEF/MIEBIOM/MIEF
• Funções estão disponíveis como métodos de objetos.

• A definição desses objetos é feita em Classes


• Cada classe pode ser vista, para já, como sendo um ficheiro de código

Sistemas Informáticos
que é fornecido com a plataforma Java
• Exemplo: A classe Math que contém funções matemáticas

• Para usar as funções de uma classe, o programador tipicamente:


1) Importa a classe para o seu programa (à semelhança do carregamento
de módulos em Python)àimport ClassName;
2) Instancia a classe num objeto (como criar e definir uma variável)
3) Usa os métodos (funções) disponibilizadas por esse objeto 2

• 1) e 2) podem ser desnecessários para algumas classes especiais


Utilização de objetos: Leitura de dados
do teclado

LEB/LEF/MIEBIOM/MIEF
• Para ler dados do teclado podemos usar um objeto de tipo Scanner.

1) Importar a “Classe” java.util.Scanner;


• import java.util.Scanner;

2) Criar o objecto de tipo Scanner:

Sistemas Informáticos
• Scanner sc = new Scanner(System.in);

3) Usar o objecto Scanner de nome sc para ler dados do teclado:


• sc.nextLine(); ß A função/método nextLine()
lê uma String do teclado
• sc.nextBoolean(); ß Lê um boolean
• sc.nextInt(); ß Lê um inteiro
• sc.nextDouble(); ß Lê um real
• ... 3
Exemplo: Ler String do teclado

LEB/LEF/MIEBIOM/MIEF
import java.util.Scanner; 1

public class NameEcho


{
public static void main(String[] args)

Sistemas Informáticos
{
2 Scanner scan = new Scanner(System.in);
System.out.print("Enter your name: ");

3 String name = scan.nextLine();

System.out.println("Hello " + name + "!");


scan.close();
} 4
}
Leitura de Strings do teclado

LEB/LEF/MIEBIOM/MIEF
...
System.out.print("Enter your name: ");
String name = scan.nextLine();
System.out.println("Hello " + name);

Sistemas Informáticos
• Lê uma linha de texto do teclado

• Após carregarmos em enter, a variável name irá conter o texto


introduzido sem caracteres de terminação de linha (\n).

• O sinal ‘+’ concatena duas strings. 5


Leitura de números do teclado

LEB/LEF/MIEBIOM/MIEF
• Para ler um número inteiro, podemos usar o método
nextInt(), disponibilizado pela classe Scanner:

System.out.print("Introduza um numero: ");

Sistemas Informáticos
int num = scan.nextInt();

System.out.println("O quadrado é= " + (num * num));

6
Ganhos com taxa de juro: V2

LEB/LEF/MIEBIOM/MIEF
import java.util.Scanner;

public class CalculoGanhos


{
public static void main (String[] args)
{

Sistemas Informáticos
Scanner scan = new Scanner(System.in);
System.out.print("Qual o saldo: ");
double saldo = scan.nextDouble();
System.out.print("Qual a taxa: ");
double taxa = scan.nextDouble();
saldo = saldo + (taxa * saldo);
System.out.println("Novo saldo = " + saldo);
}
7
}
Funções matemáticas

LEB/LEF/MIEBIOM/MIEF
• A classe Math permite realizar operações matemáticas comuns
• Não precisa ser importada, nem instanciada!

• Uso direto: Math.nomeDaOperacao(argumento1,…, argumentoN)

Sistemas Informáticos
• Para calcular potência: Math.pow(..,..)
• Exemplo: 5^3 ßà Math.pow(5,3)

• Para calcular raíz quadrada: Math.sqrt(..);

• Seno de um ângulo: Math.sin(..);


• Coseno de um ângulo: Math.cos(..);
• Tangente de um ângulo: Math.tan(..); 8
• Obter o valor de PI: Math.PI; ß Sem parêntesis pois PI é apenas um
atributo da classe Math, não é uma operação
/ método
Controlo de fluxo simples: if

LEB/LEF/MIEBIOM/MIEF
• A condição é uma expressão lógica.
if (condição)
• Se a avaliação da condição resulta em
{
instrução1; true as instruções são executadas.
instrução2; • Se resulta em false as instruções não

Sistemas Informáticos
... são executadas.
}
• Indentação não obrigatória.

• Se temos apenas uma instrução para


executar.
if (condição)
• É boa prática usar apenas a forma de
instrução;
cima (mesmo com apenas uma 9
instrução para executar).
Exemplo: if

LEB/LEF/MIEBIOM/MIEF
import java.util.Scanner;

public class Test


{
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);

Sistemas Informáticos
int idade;
System.out.print("Que idade tem? ");
idade = sc.nextInt();

if (idade > 18)


{
System.out.println("É adulto!");
}

sc.close();
}
} 10
Controlo de fluxo: if/else

LEB/LEF/MIEBIOM/MIEF
• Seleção em alternativa
• Sintaxe da instrução:
if (condição)
{
instrução1;

Sistemas Informáticos
if (condição)
...
instrução1;
}
else
else
instrução2;
{
instrução2;
...
}

• Se o resultado da condição for true a instrução 1 é executada; 11


se for false é executada a instrução 2.
O Statement if/else

LEB/LEF/MIEBIOM/MIEF
if (idade < 30)
{
System.out.println("Ainda é jovem!");
}
else

Sistemas Informáticos
{
System.out.println("Está velho!");
}

• O que acontece se o utilizador inserir 25? E 30?


• Outros operadores relacionais para tipos primitivos: ==
!= <= > >= 12
Exercício

LEB/LEF/MIEBIOM/MIEF
• Escrever um programa para identificar um número como
par ou ímpar

Sistemas Informáticos
13
Exemplo: if/else
import java.util.Scanner;

LEB/LEF/MIEBIOM/MIEF
public class Test
{
public static void main (String args[])
{
Scanner sc = new Scanner(System.in);
int num;

Sistemas Informáticos
System.out.print("Qual o número ?");
num = sc.nextInt();
num = num % 2;

if (num == 0)
System.out.println ("Número é par");
else
System.out.println ("Número é ímpar");
sc.close();
}
}
14
Seleção de múltiplas alternativas:
àelse if
• Seleccionar uma das alternativas em função do valor de num

LEB/LEF/MIEBIOM/MIEF
• Se nenhuma se verificar deve executar a instrução4.

Scanner sc = new Scanner(System.in);


System.out.println("Introduza um numero ");
int num = sc.nextInt();

Sistemas Informáticos
if (num > 0 && num <= 10)
{
instrução1;
}
else if (num > 10 && num <= 20)
{
instrução2;
}
else if (num > 20 && num <= 30)
{
instrução3;
}
else
{ 15
instrução4;
}
Outras instruções condicionais para
controlo de fluxo

LEB/LEF/MIEBIOM/MIEF
• Java oferece mais instruções para seleção de alternativas:
• A instrução switch
• O if ternário

• Ambos permitem criar código mais compacto mas…

Sistemas Informáticos
• O código rapidamente se torna de difícil legibilidade

• Sugestão: usar apenas as formas mais simples if / else if / else

• Detalhes sobre as restantes instruções de controlo em:


• http://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html 16
• http://docs.oracle.com/javase/tutorial/java/nutsandbolts/op2.html
Aplicação – Validação de dados

LEB/LEF/MIEBIOM/MIEF
• As aplicações tipicamente precisam de validar os dados que
vêm do utilizador

• Os tipos primitivos podem ser verificados com os operadores


já estudados (em combinação com a instrução if)

Sistemas Informáticos
• As Strings não são tipos primitivos (são objetos), por isso não
podemos utilizar os operadores tradicionais (>, <, ==, etc.)

• Para comparar duas Strings devemos usar um dos métodos


disponibilizados pela classe String, o método equals:
• String str = "Ola!";
• System.out.print(str.equals("Adeus!")); ß Imprime 17
false
Validação de Strings: exemplo

LEB/LEF/MIEBIOM/MIEF
String str1 = "hello!";
String str2 = "hello!";

//Não usar!
if (str1 == str2)

Sistemas Informáticos
{
System.out.println(“As strings são iguais”);
}

//Modo correto de comparar Strings


if (str1.equals(str2))
{
System.out.println(“As strings são iguais”);
}
18
Exercício: Validação de dados

LEB/LEF/MIEBIOM/MIEF
• Considere que quer escrever uma aplicação que
aceita uma String e um número inseridos pelo
utilizador

Sistemas Informáticos
• Para que a aplicação funcione correctamente, a
String inserida apenas pode ser “Benfica” ou
“Sporting” e o número inserido apenas pode ser ‘1’
ou ‘2’.

• Deve mostrar no final de todas as interações com o 19


utilizador se os dados inseridos são válidos ou não
Validação de dados: Exemplo (1/2)

LEB/LEF/MIEBIOM/MIEF
import java.util.Scanner;

public class ValidacaoDeDados


{
public static void main(String[] args)

Sistemas Informáticos
{
Scanner sc = new Scanner(System.in);
String equipa;
int posicao;
boolean val1 = false;
boolean val2 = false;

System.out.println("Introduza uma equipa (benfica " + 20


"ou sporting) e um numero (1 ou 2)");

continua
Validação de dados: Exemplo (2/2)
equipa = sc.nextLine();
if (equipa.equals("benfica") || equipa.equals(”sporting"))
{

LEB/LEF/MIEBIOM/MIEF
val1 = true; O que acontece se o utilizador
}
introduzir uma String (ex: abc)?
posicao = sc.nextInt();
if (posicao == 1 || posicao == 2)
{
val2 = true;

Sistemas Informáticos
}

if (val1 == true && val2 == true) // igual a fazer


// if (val1 && val2)
{
System.out.println("Dados válidos!");
}
else
{
System.out.println("Dados inválidos"); 21
}
O que falta validar neste exemplo?
Validação de dados: Exemplo (2/2)
equipa = sc.nextLine();
if (equipa.equals("benfica") || equipa.equals(”sporting"))
{

LEB/LEF/MIEBIOM/MIEF
val1 = true; O que acontece se o utilizador
}
introduzir uma String (ex: abc)?
posicao = sc.nextInt();
if (posicao == 1 || posicao == 2)
Exception in thread "main" java.util.InputMismatchException
{
at java.util.Scanner.throwFor(Scanner.java:840)
val2 = true;

Sistemas Informáticos
at java.util.Scanner.next(Scanner.java:1461)
}
at java.util.Scanner.nextInt(Scanner.java:2091)
at java.util.Scanner.nextInt(Scanner.java:2050)
if (val1 == true && val2 == true) // igual a fazer if
at aula2.ValidacaoDeDados.main(ValidacaoDeDados.java:25)
// (val1 && val2)
{
System.out.println("Dados válidos!");
}
else
{
System.out.println("Dados inválidos"); 22
}
O que falta validar neste exemplo?
Exceções (Erros)

LEB/LEF/MIEBIOM/MIEF
• De um modo simples, são erros que impedem o programa de
continuar (se não forem tratados)
Tipo de erro

Sistemas Informáticos
Exception in thread "main" java.util.InputMismatchException
at java.util.Scanner.throwFor(Scanner.java:840)
at java.util.Scanner.next(Scanner.java:1461)
at java.util.Scanner.nextInt(Scanner.java:2091)
at java.util.Scanner.nextInt(Scanner.java:2050)
at aula2.ValidacaoDeDados.main(ValidacaoDeDados.java:25)

23
Nome do ficheiro e linha de
código onde ocorreu o erro
Validação de tipos de dados
• Podemos usar métodos da classe Scanner para verificar se os dados
são do tipo esperado pela aplicação:
1) Criar um objecto: Scanner sc = new Scanner(System.in);

LEB/LEF/MIEBIOM/MIEF
2) Usar um dos métodos hasNextType() da classe Scanner para
aguardar que um determinado tipo (inteiro, Booleano, etc.) seja
inserido pelo utilizador. Exemplos:
• sc.hasNextInt() ß Validação de inteiros

Sistemas Informáticos
• sc.hasNextBoolean(); ß Validação de booleanos
• ...
• Inicialmente, estes métodos bloqueiam até que o utilizador insira algum
valor. Devolvem true se o tipo de dados for o esperado e false nos
restantes casos.

• Atenção, não servem para ler os dados, apenas para aguardar pela sua
introdução e verificar o seu tipo
24
3) Fazer a leitura como habitualmente
Classe Scanner: hasNextInt() Vs nextInt()
• hasNextInt()
• Se o scanner estiver vazio aguarda que o utilizador insira algo e verifica se

LEB/LEF/MIEBIOM/MIEF
consegue interpretar os dados como um inteiro. Os dados ficam
guardados na memória do Scanner
• Se o Scanner tiver dados na sua ‘memória’ este método não espera por
dados do utilizador! Apenas verifica se os dados que já existem
representam um inteiro ou não devolvendo o resultado dessa verificação
• Devolve true (quando os dados representam um inteiro) ou false (nos

Sistemas Informáticos
restantes casos)

• nextInt()
• Se o scanner estiver vazio aguarda que o utilizador insira algo e tenta
converter essa informação num inteiro que é devolvida pelo método
• Se o Scanner tiver dados na sua ‘memória’ este método não pede
informação ao utilizador! Apenas tenta converter esses dados num inteiro
e devolve o resultado
• Devolve o inteiro (quando os dados representam um inteiro) ou lança uma 25
excepção (nos restantes casos)
Exemplo: validação de tipo
import java.util.Scanner;

public class ValidacaoInteiro {

LEB/LEF/MIEBIOM/MIEF
public static void main(String[] args)
{
Scanner sc= new Scanner(System.in);
int num;

System.out.println("Insira um número inteiro!");

Sistemas Informáticos
if(sc.hasNextInt())
{
num = sc.nextInt();
System.out.println("Inteiro: " + num);
}
else
{
System.out.println("Não introduziu um inteiro");
}
sc.nextLine(); //Limpa o que houver no Scanner 26
}
}
Exemplo: validação de tipo
import java.util.Scanner;

LEB/LEF/MIEBIOM/MIEF
public class ValidacaoInteiro {
public static void main(String[] args)
{
Scanner sc= new Scanner(System.in);
int num;
Bloqueia
System.out.println("Insira um até que o inteiro!");
número utilizador insira

Sistemas Informáticos
dados. Os dados ficam guardados
if(sc.hasNextInt()) na ‘memória’ do scanner
{
num = sc.nextInt(); Move o inteiro da ‘memória’ do
scanner "para
System.out.println("Inteiro: uma variável
+ num);
}
else
{
System.out.println("Não introduziu um inteiro");
} 27
sc.nextLine(); Descarta a informação (\n) da
} ‘memória’ do scanner
}
Leitura de tipos básicos
• O métodos de leitura de tipos primitivos (ex: nextInt,

LEB/LEF/MIEBIOM/MIEF
nextBoolean) não consomem os caracteres de terminação de
linha (ex: \n) introduzidos com o pressionar da tecla Enter

Scanner sc = new Scanner(…) new Scanner

Sistemas Informáticos
sc.hasNextInt()

O utilizador introduz: 123\n

123\n

O Inteiro é devolvido sc.nextInt()


mas o scanner não
123
\n
fica no estado inicial
sc.nextLine() 28
Exemplo: validação de tipo
import java.util.Scanner;
public class SlideTP
{

LEB/LEF/MIEBIOM/MIEF
public static void main(String args[])
{
Scanner sc = new Scanner(System.in);
String equipa;
int posicao;
boolean val1 = false;
boolean val2 = false;

Sistemas Informáticos
System.out.println("Introduza um número:");

posicao = sc.nextInt();
if (posicao == 1 || posicao == 2)
{
val2 = true;
} O que acontece se a linha permanecer comentada?
//sc.nextLine();
System.out.println("Introduza uma equipa (benfica " + "ou sporting)");
equipa = sc.nextLine();
System.out.println("A equipa selecionada é: "+equipa);
sc.close();
}
} 29
Verificação de tipos: Strings

LEB/LEF/MIEBIOM/MIEF
• Quando estamos a ler do teclado, não precisamos de verificar
se o tipo introduzido é uma String (com o método
hasNextLine())

• Tudo o que é introduzido pode ser interpretado como uma

Sistemas Informáticos
String

• Exemplos: “Ola” “Ola123” “123” “1.0” “true”

• Apenas precisamos verificar tipos quando queremos verificar


a introdução de tipos básicos (ex: boolean, int, double)
30
Para saber mais…

LEB/LEF/MIEBIOM/MIEF
• Utilização básica da classe Scanner
• www.java-made-easy.com/java-scanner.html
• Utilização da classe Scanner e instruções if
• www.java-made-easy.com/if-statement.html

Sistemas Informáticos
31

Você também pode gostar