Aula 4
Ciclos, matrizes e String
Na aula passada …
Variáveis e operadores:


char a = ‘z’;

int x = 45 + 23;

int y = x + 1;

String nome = new String(“Doris Lessing”);

boolean b = (x >= 0 && x <= 10);
Instruções de selecção:

if (x >= 0 && x <= 10)
System.out.println(“x está entre 0 e 10”);
else
System.out.println(“x não está entre 0 e 10”);
2
2007/2008
Enquanto (condição) Fazer...
Fazer... Enquanto (condição)
Ciclos
Para... De... Até (condição) ... Fazer...
inicialização
condição
inicialização
F
instruções
V
condição
F
V
instrução1
V
instruções
condição
F
Enquanto... Fazer...
3
Fazer... Enquanto
instrução2
Para... Fazer...
2007/2008
Instrução while
while(condição) {
Guarda
instruções/passo;
executadas enquanto
a condição for verdadeira
}
Normalmente as instruções podem dividir-se em dois grupos:
{
acções / instruções;
progresso ;
Progresso: Instrução para
Garantir que o ciclo termina.
Passo = acção + progresso
}
4
2007/2008
Ciclos
while (condição) {passo; progresso;}
inicialização
condição
F
V
instruções:
- passo/acção
- progresso
While... do...
5
2007/2008
Exemplo: Contar até <n>
import java.util.Scanner;
public class Contagem {
public static void main(String[] parametros){
Scanner teclado = new Scanner (System.in);
System.out.println(“Se quer contar até ... n ... introduza n : ”);
int n = teclado.nextInt();
int i = 1;
while(i != n + 1) {
(condição)
Guarda
System.out.print (i + “ “);
++i;
}
Acção
Passo
System.out.println(“ ”);
System.out.println(“Terminou.”);
Progresso
}
}
Exemplo Contagem.java
6
2007/2008
Exemplo: Cálculo de potência (xn)
Potência:
xn = x·x·x·…·x
(n vezes)
Desenvolver o algoritmo:
Descrever como se calcula a potência usando:

enquanto … fazer:

variáveis, expressões e operações
Exemplo PotenciaWhile.java
7
2007/2008
Exemplo: Cálculo de potência (xn)
import java.util.Scanner;
public class PotenciaWhile {
public static void main(String[] args){
Scanner teclado = new Scanner(System.in);
System.out.println("Cálculo de x elevado a n.");
System.out.print("Valor de x: ");
int x = teclado.nextInt();
System.out.print("Valor de n: ");
int n = teclado.nextInt();
int i = 0, r = 1;
// se n=0 então i=n e r=1 (não se executa o ciclo)
while(i != n) {
r = r * x;
// Exemplo PotenciaWhile.java
++i;
}
System.out.println("A potência " + n + " de " + x + " é: " + r + " .");
}
}
8
2007/2008
Estrutura de um ciclo (for)
Guarda: o contrário da
condição de paragem
Executada uma vez
antes do ciclo começar
for(inicialização; guarda; progresso){
acção
(uma ou mais instruções)
}
Progresso: Executado sempre que
encontra a chaveta final do “for”
Acção:
Executado sempre que a
guarda seja verdadeira
9
2007/2008
Ciclos
for (init; condição; progresso) {passo;}
inicialização
condição
F
V
- passo
- progresso
For...
10
2007/2008
Exemplo: Cálculo de potência (xn)
Potência:
xn = x·x·x·…·x
(n vezes)
Desenvolver o algoritmo:
Descrever como se calcula a potência usando:

para todos os números (i) de … até … fazer:

variáveis, expressões e operações
PotenciaFor.java
11
2007/2008
Exemplo: Cálculo de potência (xn)
import java.util.Scanner;
public class Potenciafor {
public static void main(String[] args){
Scanner teclado = new Scanner(System.in);
System.out.println("Cálculo de x elevado a n.");
System.out.print("Valor de x: ");
int x = teclado.nextInt();
System.out.print("Valor de n: ");
int n = teclado.nextInt();
int r = 1;
for (int i = 0; i != n; ++i) {
// Exemplo PotenciaFor.java
r = r * x;
}
System.out.println("A potência " + n + " de " + x + " é: " + r + " .");
}
}
12
2007/2008
Estrutura de um ciclo do-while
inicialização
O passo deste ciclo
do {
passo / instruções;
} while( guarda );

(com uma ou mais instruções)
é executado sempre
pelo menos uma vez
Tal como no ciclo while o passo é
{
acção
progresso
}
13
2007/2008
Ciclos
do {passo; progresso;} while (condição)
instruções:
- passo/acção
- progresso
V
condição
F
Do... While...
14
2007/2008
Utilidade do ciclo do-while
Problema:

Criar um menu com 3 opções e, para as duas
primeiras indicar qual a que o utilizador
escolheu:
Pratos do dia:
Opção 1: Pataniscas de bacalhau
Opção 2: Lasanha vegetariana
Opção 3. Saír
15
2007/2008
Utilidade do ciclo do-while
Exemplo de interacção com o programa:
1. Opção 1: Pataniscas de Bacalhau
2. Opção 2: Lasanha vegetariana
3. Sair do programa
1
Escolheu a opção 1
1. Opção 1 Pataniscas de Bacalhau
Introdução de dados pelo
utilizador: usar
Scanner.nextInt();
2. Opção 2 Lasanha vegetariana
3. Sair do programa
2
Escolheu a opção 2
1. Opção 1 Pataniscas de Bacalhau
2. Opção 2 Lasanha vegetariana
3. Sair do programa
3
Escolheu a opção 3
Terminou
16
2007/2008
Utilidade do ciclo do-while
import java.util.Scanner;
public class Menu {
public static void main(String[] args) {
Scanner teclado = new Scanner(System.in);
int opcao = 0;
do {
System.out.println("Opção 1: Pataniscas de bacalhau ");
System.out.println("Opção 2: Lasanha vegetariana ");
System.out.println("Opção 3. Saír ");
System.out.println("Escolha a sua opção: ");
opcao = teclado.nextInt();
if (opcao > 0 && opcao <= 3) {
System.out.println("Opção escolhida: " + opcao);
} else {
System.out.println("Opção inválida. ");
}
} while (opcao != 3);
System.out.println("Terminou.");
}
} 17
2007/2008
while (condição) {passo; progresso;}
do {passo; progresso;} while (condição)
for (init; condição; progresso) {passo;}
Ciclos
inicialização
acção inical
Guarda
condição
instruções:
- passo/acção
- progresso
F
V
condição
F
V
- passo
instruções:
- passo/acção
- progresso
While... do
18
V
condição
F
do... While
- progresso
for...
2007/2008
while (i != n) {r = r*x; ++i;}
do {System.out.println(i); ++i;} while (i != 6)
for (i = 0; i != 100; ++i) {System.out.println(“Java”);}
Ciclos - Exemplos
ler x, n;
int i = 1;
int i = 1, r = x;
i != n
Escrever(i);
++i;
F
V
int i = 0;
i != 100
F
V
Escrever (“Java”);
r = r * x;
++i;
V
i != 6
F
++i;
Exemplo 
While... do
( Calcular xn )
do... While
( Escrever de 1 a 5 )
for...
( Escrever Java 100 vezes )
Uso típico 
Ciclos Indeterminados
Validação de dados
Ciclos Determinados
19
2007/2008
Ler três inteiros e escrevê-los por
ordem inversa
public class Inversor {
public static void main(String[] parametros) {
(...)
System.out.println("Introduza três inteiros:”);
int a = teclado.nextInt();
int b = teclado.nextInt();
int c = teclado.nextInt();
System.out.println(c);
System.out.println(b);
Como
generalizar
para 1000,
por exemplo?
System.out.println(a);
}
}
20
2007/2008
Ler 1000 inteiros e escrevê-los por
ordem inversa
Basta substituir acrescentar 997 variáveis, e 997 println(), obviamente …
public class Inversor {
public static void main(String[] parametros) {
(...)
System.out.println("Introduza 1000 inteiros:”);
int a0 = teclado.nextInt();
int a1 = teclado.nextInt();
Pouco prático…
...
int a999 = teclado.nextInt();
System.out.println(a999);
System.out.println(a998);
...
System.out.println(a0);
}
}
21
2007/2008
Ler 1000 inteiros e escrevê-los
por ordem inversa
public class Inversor {
public static void main(String[] parametros) {
System.out.println("Introduza 1000 inteiros:”);
int[] valores = new int[1000];
?
Criação / alocação do
espaço para 1000
inteiros
}
}
Declaração de uma
matriz de inteiros
22
2007/2008
Sintaxe
Tipo dos
elementos
Nome da
matriz
double[] m = new double[4];
Número de
elementos
m[2] = 2.2;
double x = m[3];
System.out.println(m[1]);
Como uma
variável
Indexações
23
2007/2008
Organização
Recordar noção de Referência
double[] m = new double[4];
m: double[4]
m[0]:
m[1]:
m[2]:
m[3]:
0
0
0
0
Índices:
1º elemento: índice 0
2º elemento: índice 1
…
nº elemento: índice n-1
24
2007/2008
Inicialização
double[] m = new double[4];
Notação mais simples,
mas não esquecer que
‘m’ é uma referência!
m: double[4]
m[0]:
m[1]:
m[2]:
m[3]:
0
0
0
0
Com zero!
25
2007/2008
Inicialização explícita (I)
double[] m = {0.0, 1.1, 2.2, 3.3};
m: double[4]
26
m[0]:
m[1]:
m[2]:
m[3]:
0
1.1
2.2
3.3
2007/2008
Inicialização explícita (II)
double[] m = {};
Atenção: não há
espaço reservado.
m[0] = 0; // erro
m: double[0]
27
2007/2008
Matrizes com mais de uma
dimensão
int n = 10;
// não é obrigatório que n seja constante em Java
char[][] m = new char[n][n];
// valor inicial é o char cujo código é 0
m: char[10][10]
m[0][0] m[0][1] m[0][2] m[0][3] m[0][4]
…
m[0][10]
…
m[10][10]
m[1][0] m[1][1] m[1][2] m[1][3] m[1][4]
…
28
2007/2008
Ciclos com matrizes
Voltando ao problema da inversão de n números
dados pelo utilizador:

Para resolver o problema precisamos de 2
ciclos:

Directo
• Do primeiro ao elemento final, 0 -> 999

Inverso
• Do último ao elemento inicial, 999 -> 0
29
2007/2008
Ler 1000 inteiros e escrevê-los
por ordem inversa
public class Inversor {
public static void main(String[] parametros) {
Constante!
final int número_de_valores = 1000;
Scanner teclado = new Scanner(System.in);
System.out.println("Introduza “ + número_de_valores + “ inteiros:”);
int[] valores = new int[número_de_valores];
for(int i = 0; i != valores.length; ++i)
valores[i] = teclado.nextInt();
for(int i = valores.length - 1; i != -1; --i)
System.out.println(valores[i]);
}
}
Ver: Matriz1000.java
30
2007/2008
Particularidades das matrizes

Inicialização explícita exaustiva

Dimensão imutável

São sempre referências

Atribuições e comparações são entre referências

Indexação fora dos limites
int[] m = {0, 1, 2};
m[-1] = -1;
m[3] = 3;


Que sucede? Programa aborta!

Os índices são verificados em tempo de execução.
Tipos válidos para indexar uma matriz:
byte, short, int, char
31
2007/2008
Cadeias de caracteres

Tipo de dados: String

Imutáveis: não se podem modificar

São referências

“Contêm” operações
32
2007/2008
Definição de instâncias (I)
String s;
s: referência para String
Não foi criada cadeia
de caracteres.
?
String s = null;
33
Quando não se pretende,
inicialmente, criar a cadeia
de caracteres. Em geral
não é boa ideia.
2007/2008
Definição de instâncias (II)
String a = “ISCTE”;
String b = “ISCTE”;
a: referência para String
: String
ISCTE
b: referência para String
34
2007/2008
Definição de instâncias (III)
String a = new String(“ISCTE”);
char[] caracteres = {
‘I’, ‘S’, ‘C’, ‘T’, ‘E’
};
String b = new String(caracteres);
a: referência para String
: String
ISCTE
b: referência para String
: String
ISCTE
35
2007/2008
Comprimento
String s = “Introdução à Informática”;
System.out.println(s.length());
Mostra 24.
Nota: length() ≠ length
36
(método associado à determinação da dimensão de uma matriz)
2007/2008
Obter caracteres individuais
String s = “Introdução à Informática”;
System.out.println(s.charAt(0));
System.out.println(s.charAt(14));
System.out.println(s.charAt(23));
Mostra a
Mostra n
Mostra I
37
2007/2008
Concatenação e sub-cadeias
String s1 = “Introdução à ”;
String s2 = “Informática”;
String s3 = s1.concat(s2);
ou
String s3 = s1 + s2;
String a = s3.substring(0, 10);
Do 0 ao 10, exclusive
String b = s3.substring(13);
Concatena s1 com s2:
s3 fica com
“Introdução à Informática”
a fica com
“Introdução”
b fica com
“Informática”
Do 13 até ao fim
38
2007/2008
Comparação
if(s1 == s2)
Comparação entre referências:
Não deve ser usado!
System.out.println(“Referenciam a mesma cadeia”);
if(s1.equals(s2))
System.out.println(“Guardam cadeias com igual
valor”);
Se
… Devolve …
s1 < s2: … int negativo
s1 = s2: … zero
if(s1.compare(s2) < 0)
s1 > s2: … int positivo
System.out.println(s1 + “ aparece antes de “ +
s2 + “ no dicionário.”);
39
2007/2008
Encontrar um caracter ou uma
sub-cadeia numa cadeia
String s = “Introdução à Informática”;
int i = s.indexOf(‘I’);
i fica com 0
int j = s.indexOf(‘x’);
j fica com -1
int k = s.indexOf(‘r’, 10);
int l = s.indexOf(“Info”);
int m = s.indexOf(“info”);
k fica com 17, 1º ‘r’
após a posição 10
l fica com 13
m fica com -1
n fica com 13
int n = s.indexOf(“In”, 10);
40
2007/2008
A reter...

Ciclos:


Matrizes:


Indicam quantas vezes (ou em que condições) um conjunto de
instruções é repetido
Séries indexáveis de variáveis do mesmo tipo
String:

Classe de variáveis onde se guardam palavras ou frases

Têm um conjunto de propriedades, ao contrário das variáveis primitivas
Nota: pode consultar informação os métodos que integram a classe
String (cadeia) em:
Classe String - métodos
41
2007/2008
A ler...
Capítulo 4:
Y. Daniel Liang, "Introduction to Java
Programming", 5ª Edição, Prentice-Hall, 2005.
ISBN: 0-13-185721 - 5
42
2007/2008
Aula 4: Sumário

Instrução while

Sintaxe

Semântica

Exemplo de ciclos simples

Inicialização, guarda, passo (acção e progresso)

As instruções for e do-while

Prática da construção de ciclos

Matrizes:


Objecto com instâncias do mesmo tipo

Sintaxe: definição e inicialização

Tamanho de uma matriz: length

Indexação
Cadeias de caracteres
43
2007/2008
Download

m[0] - padoca