Sie sind auf Seite 1von 273

Programao II

Licenciatura de Cincias da Computao

Original: Docentes ISCTE

Padoca Calado

Informao

Stio da cadeira:
http://www.padoca.org/padoca/p2

A consultar com frequncia (Pequenos anncios) Contm:

Enunciados das aulas prticas


Informao sobre calendrio e horrios Programa e mtodo de avaliao

Bibliografia
etc.
2008

Avaliao

Assiduidade, participao e envolvimento nas aulas terico-prticos (10%)


Prticas laboratriais (30%)

Trabalho feito em grupo (5 alunos) Discusso individual

Exame (60%)

Individual, sem consulta: nota mnima 7

2008

Contactos

Esclarecimento de Dvidas:

Assuntos de Interesse geral: nas aulas.

Assuntos Pessoais: atravs do endereo de e-mail duvidas@padoca.org (usar com moderao). Sesses de dvidas: para esclarecimento de dvidas pelos docentes. As questes sobre a matria leccionada devem ser colocadas preferencialmente nos horrios de atendimento presencial.

2008

tica e Deontologia

Fraude

Os principios ticos orientam a conduta individual e o nosso curso um espao onde todos os estudantes tm a oportunidade de aplicar e aprofundar os princpios ticos que os desafios de uso das novas tecnologias colocam. Este tema um aspecto transversal a todo o curso e a sua prtica fundamental quer agora na sua vida estudantil quer no seu futuro profissional. O trabalho de equipa uma constante ao longo do curso e no exerccio de uma profisso. Por isso, pretende-se que seja efectuado com um esprito de entreajuda. Devem ser respeitados os direitos de autor e de propriedade intelectual.

O aluno deve ter presente as regras da honestidade acadmica. O plgio de trabalhos e projectos no tolerado.
O uso de materiais que visam deturpar e falsear os resultados dos exames uma atitude altamente reprovvel e punido. Visa-se com estas punies estabelecer um esprito de justia e de facto atribuir as melhores notas aos melhores alunos.
2008

tica e Deontologia

Crime Informtico

Os alunos devem ter sempre presente que o uso dos computadores implica determinadas regras e que existem leis que especificam que determinado uso ou prtica um crime.

Vulgarmente designadas como pirataria, essas aces para alm de constituirem um crime para quem as pratica e de prejudicarem o seu futuro profissional, tambm tm consequncias, para a Faculdade, que vo desde a perda de tempo perda de informao, passando, pelo prestgio, que se deve manter intocado. O uso dos recursos informticos desta Instituio para fins ilegais ou imorais proibido e o aluno apanhado nas actividades ilcitas ser alvo de um processo nas instancias policiais.

2008

Objectivos

Conhecer bem uma abordagem tpica de resoluo de problemas usando Programao


Ser capaz de planear a resoluo dos problemas, estruturando correctamente os respectivos programas Dominar eficientemente um ambiente de desenvolvimento/programao e respectivas ferramentas Ter conhecimentos intermdios da linguagem Java

2008

Programa

Programao em Java

Tipos, variveis, expresses e instrues de seleco Ciclos, matrizes, Strings e tipos enumerados Modularizao, abstraco e encapsulamento Mtodos, parmetros, argumentos e contratos (programao por contrato) Classes Leitura e escrita de dados em ficheiros
2008

Metodologia

Aulas tericas

Consultar pgina da disciplina

Atendimento ou aulas de dvidas


Gabinete ou sala de computadores Horrios: Consultar pgina da disciplina

Qualquer informao relevante publicada na pgina da disciplina

2008

Aula 1
Programao II

O que um computador?

Mquina programvel genrica Constitudo por


Processador Memria rpida


RAM (voltil) ROM (persistente)

Memria lenta
disco rgido

11

2008

Computador
Principais Componentes:

Suporte Fsico

Hardware (HW)
girtby.net/images/hardware.jpg

Suporte Lgico

Software (SW)
do filme Matrix, whatisthematrix.warnerbros.com

12

2008

Computador
HW (Recursos Fsicos) + SW (Parte Decisora) => Execuo de Tarefas

Limitaes do Hardware impem limites s possibilidades do Software que o utiliza Estrutura exacta do HW depende do fabricante Componentes genricos do HW na maioria dos casos so relativamente semelhantes
2008

13

Nota: Imagem retirada de http://pt.wikipedia.org/wiki/Computador 14


2008

Principais Componentes Fsicos

Processador - Unidade Central de Processamento Central Processing Unit (CPU)

Onde as instrues so executadas

Memria

Primria (RAM, principalmente) Secundria (discos rgidos, CD-ROMs, DVDs, etc)

Perifricos

Comunicaes com mundo exterior, armazenamento, etc

15

2008

Memria do computador

Uma sequncia de bits


768 MBytes = 805 306 368* bytes = 6 442 450 944 bits Aproximadamente 1 bit por habitante da Terra
Nota * : 1024 * 1024 * 768
( 210 = 1024 )

16

2008

Bits e Bytes

1 Byte = 23 ou 8 bits (ou 8 digitos binrios: 0s ou 1s) 1 KB (Kbyte ou Kilobyte) = 210 ou 1024 bytes 103 1 MB (Megabyte) = 220 ou 1024 KB ou 1048576 Bytes 106 1 GB (Gigabyte) = 230 ou 1024 MB 109
[ ao trabalharmos com valores binrios e no decimais, o espao de memria disponvel no bem o que imaginamos: por exemplo um disco de 200 GB, tal como publicitado, corresponde, em binrio, a cerca de 186 Gigabytes a sua capacidade real ]

17

2008

Suporte Lgico (SW)

Conceitos principais:

Ficheiro
Conjunto de Dados armazenado sob um nome identificador

Programa
Instrues (contidas num ficheiro) que descrevem uma tarefa numa dada linguagem

Sistema Operativo
Programa especial que gere o HW, executa outros programas, etc.

18

2008

Linguagem?

19

2008

Linguagens

Linguagem natural

O Portugus uma linguagem natural

Linguagem (de programao) assembly

Muito bsica: usada quase directamente pelos processadores dos computadores, ex:

LOAD @R1, 0 JMP @R1


Equivalente em linguagem mquina: 010000100010011100100110001010001001001000110001010

20

2008

Linguagens

Linguagem de Programao de Alto-Nvel (LPAN)

Sem as ambiguidades e imprecises de uma linguagem natural, mas no to penosa de utilizar como a linguagem mquina, ex: if (x == 1) System.out.println(X igual a 1);

( caso x seja 1, escreve no monitor X igual a 1 )

21

2008

Instrues e Linguagens

Informao armazenada:

Sob a forma de bits Bits organizados em bytes Instrues so informao, logo, conjuntos de bytes Instrues do seu repertrio prprio Instrues consideradas de baixo nvel Mais prximas da forma humana de raciocinar Processador no capaz de as executar directamente
2008

Processador executa:

Instrues de alto-nvel

22

Linguagens

Exemplos de L.P.A.N.:

C, C++, Fortran, Java, etc

Factos:

CPU entende instrues oriundas de uma L.P.B.N. Humanos preferem descrever tarefas para execuo pelo computador usando L.P.A.N. Necessidade de um meio de traduo LPAN -> LPBN Traduo realizada atravs de programas: compiladores
2008

23

A reter...

Programar:
resolver problemas de modo a obter solues - finitas - bem definidas e - eficazes

Tipos de linguagens: naturais, de programao de alto nvel, mquina, etc.


2008

24

A ler...
Captulos 1 e 2 e seces 3.1 e 3.2 do livro:

Y. Daniel Liang, "Introduction to Java Programming", 5 Edio, Prentice-Hall, 2005. ISBN: 0-13-185721 - 5

25

2008

Aula 1: Sumrio
Computador como mquina programvel Conceitos de linguagens naturais, de programao e mquina

26

2008

Programao II
Licenciatura de Cincias da Computao

Original: Docentes ISCTE

Padoca Calado

Aula 2
Introduo linguagem Java

da Aula 1...

Programar: resolver problemas de modo a obter solues finitas, bem definidas e eficazes
Tipos de linguagens: naturais, de programao de alto nvel, mquina, etc.

Necessidade de um meio de traduo: LPAN LPBN Traduo realizada atravs de programas: compiladores

29

2008

O que a linguagem Java?

Vai uma chvena?


30
2008

Linguagem de programao Java


Compilador de Java (javac)

cd-fonte: Ling. Java


(p.e. Ola.java)

byte-codes: Linguagem para a mquina virtual Java (JVM) (p.e. Ola.class)

Mquina Virtual Java Processador Interpretador de linguagem mquina para a JVM

31

2008

Criar, compilar e executar um programa em JAVA

Nota: esquema retirado do livro Fundamentos de Programao em Java 2 (Mendes e Marcelino, 2005, p. 21)

32

2008

Exemplo de programa simples em Java


// Benvindo.java: Este programa mostra no ecr // a mensagem Benvindo ao JAVA!

public class Benvindo {


public static void main(String[] argumentos) { System.out.println(Benvindo ao JAVA!"); } }

Nota: a classe deve sempre ter o mesmo nome do ficheiro com o cd. fonte!

33

2008

Arte de Resolver Problemas


Diz-se que s se compreende realmente um assunto depois de o ter ensinado a algum.

Na realidade, s se compreende realmente um assunto depois de o ter ensinado a um computador.

Donald E. Knuth
34
2008

Resoluo de um Problema/Tarefa
(exemplo de algoritmo para fazer um bolo)

Misturar os ingredientes

Bolo
Cozinhar o bolo

Nota: esquema adaptado de Fundamentos de Programao em Java 2 (Mendes e Marcelino, 2005, p. 7)

35

2008

Programao de computadores

Incio da aprendizagem da programao

Fundamental:
Desenvolver aptides para criar solues
e para traduzir essas solues em programas

Aptides para escrita de programas contendo:


mecanismos de escolha de instrues
mecanismos de repetio de instrues agregados (grupos) de dados relacionados

36

2008

Algoritmo

Descreve como um dado problema resolvido

Apresenta-se essencialmente como:


Conjunto de aces a ser executado A ordem pela qual essas aces so executadas

Ajudam o programador:

Planificao do programa antes de o escrever (codificar) numa dada linguagem de programao Para o programador novio, codificar directamente no fantasticamente natural.
2008

37

Algoritmo

Mtodo de resoluo de um problema


Caractersticas:

Finitude: tem de terminar Definitude: cada passo bem definido Entradas: zero ou mais, de conjunto bem definido

Sadas: uma ou mais, dependem das entradas


Eficcia: operaes todas executveis (em tempo til)

38

2008

Problema

Clculo do mximo divisor comum de dois

inteiros positivos (m e n)

39

2008

Problema

Clculo do mximo divisor comum de dois

inteiros positivos (m e n)

40

2008

Problema

Clculo do mximo divisor comum de dois inteiros positivos (m e n)


Entradas: m e n

Sadas: k, tal que k = mdc(m, n), i.e:

m e n so divisveis por k
(o resto da diviso por k zero), e

no h nenhum nmero maior que k que divida m e n

41

2008

Propriedades conhecidas

0 < mdc(m, n), ou seja, 1 <= mdc(m, n)

mdc(m, n) <= min(m, n)

42

2008

Descrever a soluo usando apenas (pseudo-cdigo)


Se ento seno Enquanto fazer:

Fazer ... at que: ...

Nmeros e variveis

Operaes lgicas: e, ou
2008

43

Descrever a soluo usando apenas

Operaes lgico-aritmticas:

x < y (x menor que y?),

x + y (soma de x e y)
x y (subtraco de x e y) x / y (resultado da diviso de x por y) x * y (resultado da multiplicao de x por y) x % y (resto da diviso de x por y) x = y (x passa a ter o valor de y) x == y (x igual a y?), x != y (x diferente de y?)

44

2008

Algoritmo do MDC
1

( no quadro )

45

2008

Algoritmo do MDC
1

ler m, n

// ler 2 inteiros a partir do teclado

se m < n ento
2

k=m
3

seno
4

k=n
5

enquanto m % k != 0 ou n % k != 0 fazer:
6

k=k1
7

fim do enquanto 8
46 escrever k // enviar resultado para o monitor
2008

Programa MDC em Java


import java.util.Scanner;

public class CalculadorDoMDC {


public static void main(String[] args) { Scanner teclado = new Scanner (System.in); System.out.print ("Introduza um inteiro positivo: "); int m = teclado.nextInt(); System.out.print("Introduza outro inteiro positivo: "); int n = teclado.nextInt(); int k = 0; if(m < n) k = m; else k = n; while(m % k != 0 || n % k != 0) --k; System.out.println("O mdc entre " + m + e " + n + " " + k + "."); }

}
47
2008

Comentrios ao programa
1

( no quadro )

48

2008

Traado do programa em execuo


( no projector )

49

2008

Traado do programa em execuo (exemplo)

50

Introduo Programao, Aula2

2007/2008

Problema

Clculo do mnimo mltiplo comum de dois

inteiros positivos (m e n)

51

2008

Problema

Clculo do mnimo mltiplo comum de dois inteiros positivos (m e n) Entradas: m e n Sadas: mmc, tal que mmc = mmc(m, n), i.e:

mmc mltiplo de m e de n
(o resto da diviso de mmc pelo menor entre m e n zero)

no h nenhum nmero menor que mmc que seja simultaneamente mltiplo de m e n


2008

52

Propriedades conhecidas

mmc (m, n) >= m e mmc (m, n) > 0 mmc (m, n) >= n e mmc (m, n) > 0

mmc (m, n) >= max (m, n)

53

2008

Algoritmo do MMC
1

( no quadro )

54

2007/2008

Algoritmo do MMC
ler m, n se m > n ento maior = m menor = n seno maior = n // ler 2 inteiros a partir do teclado

menor = m
fim do se inicializar mmc = maior enquanto mmc % menor != 0 fazer: mmc = mmc + maior fim do enquanto escrever mmc
55

// enviar resultado para o monitor


2008

Programa MMC em Java (1)


import java.util.Scanner;

public class CalcMMC1 { public static void main (String args[]) { Scanner teclado = new Scanner (System. in); System.out.print ("Introduza um inteiro positivo: "); int n = teclado.nextInt(); System.out.print ("Introduza outro inteiro positivo: "); int m = teclado.nextInt(); int maior, menor, mmc; if (n < m) { // Calcular o maior e o menor entre m e n maior = m; menor = n; } else { maior = n; menor = m; } mmc = maior; // Inicializar mmc while (mmc % menor != 0) // Calcular mmc mmc = mmc + maior; System.out.println("O m.m.c. entre " + m + " e " + n + " " + mmc + "."); } }

56

2008

Programa MMC em Java (2)


import java.util.Scanner; public class CalcMMC2 { public static void main (String args[]) { (...) int mmc; /* Calcular o maior e o menor entre m e n * atribuir a m o maior valor e a n o menor * Inicializar mmc com o maior dos valores */ if (n < m) mmc = m; else { mmc = n; n = m; m = mmc; } // Calcular mmc while (mmc % n != 0) mmc = mmc + m; System.out.println("O m.m.c. entre " + m + " e " + n + " " + mmc + "."); } }

57

2008

Programa MMC em Java (3)


import java.util.Scanner; public class CalcMMC2 { public static void main (String args[]) { (...) int mmc; /* Calcular o maior e o menor entre m e n * atribuir a m o maior valor e a n o menor * Inicializar mmc com o maior dos valores */

if (m < n) {
mmc = n; n = m; m = mmc; } mmc = m; // Calcular mmc while (mmc % n != 0) mmc = mmc + m; System.out.println("O m.m.c. entre " + m + " e " + n + " " + mmc + "."); } }

58

2008

Algoritmos - optimizao

No existe uma nica forma de resolver um problema


No existe um algoritmo perfeito... mas Alguns algoritmos so mais perfeitos do que outros

Importa tentar encontrar a soluo mais simples, clara, estruturada, eficaz e eficiente para um dado problema
2008

59

Fases da resoluo de problemas

Especificao [humano]
Desenvolvimento do algoritmo [humano] Concretizao do algoritmo na linguagem de programao [humano] Traduo do programa para linguagem mquina [computador/compilador] Execuo do programa para problema particular (e.g., mdc(131, 47)) [computador/JVM]
2008

60

A reter...

Java como linguagem de programao de alto nvel

Algoritmo: receita finita, definida, com entradas, com


sadas e eficaz Programa: concretizao de algoritmo numa linguagem de programao Compilador: traduz programa de linguagem de programao para linguagem mquina

61

2008

A ler...
Captulos 1 e 2 e seces 3.1 e 3.2 do livro:

Y. Daniel Liang, "Introduction to Java Programming", 5 Edio, Prentice-Hall, 2005. ISBN: 0-13-185721 - 5

62

2008

Aula 2: Sumrio

Noes de algoritmo e de programa

Programa: concretizao de um algoritmo


Descrio de um algoritmo: resoluo atravs de pseudo-cdigo Programao: arte de resolver problemas Fases da resoluo dum problema usando um computador

63

2008

Aula 3
Variveis, expresses, operadores e instrues de seleco

Estrutura de um programa em Java


/** * Estrutura bsica de um programa em Java. * @author Xico */ public class NomeDoPrograma { public static void main(String[] parametros) { // Instrues... } }

comentrios

Todas as frases precedidas de // ou entre /* e */ so comentrios,


65

sendo ignorados pelo compilador

2007/2008

Variveis

Servem para guardar informao


Guardam dados que tm de ser de um tipo definido !
(dados provm de um dado domnio, bem definido)
235 a Letras Cadeia de caracteres (String)

435.72

Inteiro

Letra/caracter

Decimal 435.72

Letras
66

2007/2008

Variveis

Antes da primeira utilizao :

Tem de se declarar quais as variveis que passam a existir nesse programa, qual o seu nome e tipo -

declarao

Deve tambm ser dado um valor inicial a cada varivel -

inicializao

Aps a declarao:

Podem ser utilizadas para guardar dados (valores)

Colocao de um valor numa varivel chama-se atribuio atribuio de um valor a uma varivel
2007/2008

67

Variveis (representao grfica)


Nome: numero
Tipo: (int = inteiro)

numero : int
12

Em java: int numero = 12;

ou:
int numero; numero = 12;

Valor: 12

68

2007/2008

Variveis (declarao e inicializao)


Nome Valor inicial

boolean encontrado = false;

Tipo: booleano, ou seja, s pode tomar os valores falso e verdadeiro

encontrado : boolean false

69

2007/2008

Variveis (declarao e inicializao)


int nmero_de_alunos = 39; double taxa_de_converso = 200.482; char c = A;

Nomes de pedaos de memria


(na verdade so traduzidos para endereos de memria)

Interpretao do contedo baseada no tipo associado

70

2007/2008

Variveis e Identificadores

Variveis so conhecidas pelo seu nome:


O nome da varivel um identificador Os identificadores no podem ser repetidos na mesma zona do programa

Nota: matria a desenvolver em aulas futuras

71

2007/2008

Variveis e Identificadores

Identificadores no podem ser quaisquer:

So constitudos por letras, nmeros e os caracteres _ e $


Os identificadores comeados por _ e $ so usados nas bibliotecas standard e devem ser evitados noutros programas.

Primeiro caracter no pode ser um algarismo (0, 1, , 9) Maisculas e minsculas so caracteres diferentes!

No podem ser palavras reservadas (e.g. for, while, int, if, for, etc.)

72

2007/2008

Palavras Reservadas, Variveis e Tipos

Palavras Reservadas de uma Linguagem:


Tm um significado especial para o compilador No podem ser usadas para outras finalidades

Variveis so criadas sempre associadas a um tipo de dados


Tipo de dados sempre uma palavra reservada (tipos primitivos) No pode ser usado para outras finalidades

Exemplo: int palavra reservada em JAVA


float int = 300.0; // ERRO FLAGRANTE!
73
2007/2008

Tipos de dados

Primitivos

char um caracter int nmero inteiro (existem trs outros tipos de inteiros) float ou double nmero decimal boolean verdadeiro ou falso

Classes

Object String cadeia de caracteres Tipos definidos pelo utilizador


2007/2008

74

Caracteres

Tipo: char
Nmero de bits para guardar um caracter: 16 Nmero total de padres de bits: 216 = 65 536 Cdigo: Unicode ( associa um nmero a cada caracter independente do idioma.
Sugesto: consulte Unicode )

char

memria

A ..... 0000 0000 0100 0001 a ..... 0000 0000 0110 0001
75

0 ..... 0000 0000 0011 0000

2007/2008

Inteiros
Tipo Tamanho

Exemplo:

byte
short

8
16 32 64

Tipo: int Nmero de bits: 32

int long

memria
0000 0000 0000 0000 0000 0000 0100 0001
76

int
65
2007/2008

Valores decimais (ou em vrgula flutuante)


Exemplos:
Tipo: float

Tipo: double Nmero de bits: 64

Nmero de bits: 32
float x = 0.0f; (ou 0.0F)

double x = 0.0; (ou 0.0d ou 0.0D)

( por omisso um real double; para ser explicitamente float poder inicializar-se a var. desta forma )

memria
0000 0000 0000 0000 0000 0000 0100 0001 77

float
9.1E-44
2007/2008

Memria
Os 32 bits de memria:

Cada clula tem um endereo, em base hexadecimal, ex: @10b62db

0000 0000 0000 0000 0000 0000 0100 0001


26 * 1
+

20 * 1

podem corresponder a:

78

(char) A apenas considera os 16 direita


(int) 65 (float) 9.1E-44
2007/2008

Nota: o que est num endereo de memria pode ser igual ... mas ser interpretado de formas diferentes...

Memria
A mesma memria pode ser vista a vrios nveis:
x:int 5 5 A A Contedos, assumindo tipos definidos letra:char Variveis com nomes e tipos

Representao binria (o que realmente l est)


79
2007/2008

Referncias/Objectos
Object um_objecto = new Object(); Memria dinmica (heap)
@10b62c9 @10b62ca I S C T E
2007/2008

String cadeia = new String(ISCTE);


Memria esttica (stack) um_objecto : Object Object@10b62c9 cadeia : String String@10b62db

@10b62db

@10b62e8 @10b62e9 @10b62ea @10b62eb

@10b62ec
80

Tipos primitivos em JAVA (8 tipos)


Tipo Tamanho/ Formato (nmeros inteiros) byte short int long float double char boolean
81

Valores literais

Domnio

8 bits 16 bits 32 bits 64 bits

10, ... 234, ... 176, ... 8374L, ... 3.14f, 200.482F, ... 18.0, 1.8e1, 18.0d, ... (outros tipos) A, ., , ... false e true

[-128, 127] [-32768, 32767] [-2147483648, 2147483647]


[-9223372036854775808, 07]

(nmeros decimais) 32-bit 64-bit


[+/-1.4E-45, +/- ~3.40E38] [+/-4.9E-324, +/- ~1.78E308]

16 bits/Unicode (no definido)

[,!, , ] ou [\u0000, \uffff] {false, true}


2007/2008

Escrita de valores no ecr

Para escrever informao no monitor:


System.out.print(); System.out.println();

A ltima verso efectua mudana de linha no fim da escrita

ecr

Ex: System.out.println(375); int x = 12; System.out.println(x);

375 12 375-12

System.out.println( + 375 + - + x);


82
2007/2008

Escrita de valores numa janela

Para escrever informao numa janela:


JOptionPane.showMessageDialog (null, mensagem);

83

2007/2008

Escrita de valores no ecr


ecr 32

int x = 3; System.out.print(x); System.out.print(2); double x = 2.0; System.out.println(x); System.out.println(3.0);


84

2.0 3.0

2007/2008

Leitura de valores do teclado

At h pouco tempo no existia nos packages da linguagem um mtodo directo em JAVA para ler informao do teclado. Era necessria uma sequncia de vrias operaes, por exemplo:
String s = ""; char c; try { do { c = (char)System.in.read(); s = s + c; } while (c != '\n'); } catch(IOException e) {}
S por curiosidade

85

2007/2008

Leitura de valores do teclado

H cerca de dois anos, um grupo de investigadores desenvolveu uma classe, Scanner, utilizvel em qualquer mquina, que facilita a interface com o computador e o input em programas em Java. Para podermos recorrer aos mtodos definidos para esta classe Scanner, basta que no nosso programa importemos o package (ou biblioteca) desta classe, que lhes permite aceder e utilizar: import java.util.Scanner; e que criemos um objecto do tipo Scanner (p.e., teclado): Scanner teclado = new Scanner (System.in);

Agora, recorrendo a teclado, podemos ler diferentes dados, p.e., um valor inteiro n (existem inmeros mtodos: de leitura, pesquisa, etc.): int n = teclado.nextInt();

86

Introduo Programao - Aula 3

2007/2008

Leitura de valores do teclado

Outro mtodo para ler informao do teclado (sequncia de operaes) ... ex:
S por curiosidade

public static void main (String[] args)


throws Exception /* e System.out.println("Erro de leitura");*/ {

InputStreamReader leitor = new InputStreamReader (System.in); BufferedReader input = new BufferedReader(leitor); System.out.print("Introduza um inteiro positivo: "); String linha = input.readLine(); int m = Integer.parseInt(linha);

System.out.print("Introduza outro inteiro positivo: ");


linha = input.readLine(); int n = Integer.parseInt(linha);

87

Por agora abreviaremos as instrues de leitura com: teclado.nextTipo()


(sendo teclado uma varivel pr-definida por ns)

2007/2008

Leitura de valores de uma janela

possvel tambm usar uma janela para ler valores (p.e., uma frase ou cadeia de caracteres - String) a partir do teclado:

import javax.swing.JOptionPane; public class Janelas {

public static void main(String[] parametros) {

String lida = JOptionPane.showInputDialog("Insira uma frase: ");


if (lida != null) JOptionPane.showMessageDialog(null, "Escreveu: " + lida); 88 }

2007/2008

Wrappers objectos com funcionalidades


semelhantes s de um tipo primitivo

possvel considerar um valor de uma classe primitiva como se fosse um objecto. Para cada um dos oito tipos primitivos em Java existe, associada, uma wrapper class com variveis do correspondente tipo primitivo. Entre as funcionalidades das wrapper classes encontramos vrias rotinas termo que passaremos a designar por mtodos como por exemplo:
int i = Integer.parseInt(123);
// para converter umaString num valor inteiro

i = 123

Em geral, podemos recorrer a:


tipo v = Tipo.parseTipo();
89
2007/2008

Criao de Objectos abordagem provisria*

Declarao de um objecto (p.e. uma varivel)


ClasseDoObjecto nomeDoObjecto; ( p.e., int numero; )
Esta declarao somente cria espao para armazenar um endereo de memria onde um objecto do tipo declarado possa ser guardado (o valor do objecto no foi ainda atribudo)

( p.e., int numero = 5; )

Criao de um objecto (p.e. uma varivel)


nomeDoObjecto = new ClasseDoObjecto (parmetros);

( p.e., Integer i = new Integer (i); )

A criao de um objecto feita atravs do operador new (que o inicializa devidamente) *

Nota * : desenvolveremos esta questo mais tarde, quando abordarmos Classes 90 ( p.e., Integer i = new Integer (5); )
2007/2008

Instrues

Uma instruo em Java pode ser da forma


expresso;

Uma expresso constituda por:


Operadores Variveis Valores literais

...
2007/2008

91

Operao de atribuio

Altera o valor de uma varivel


nome : tipo

varivel = expresso;

valor

x : int

Exemplo:
12

x = 4 + 8;

92

2007/2008

Converses (cast)
Converses possveis entre tipos de dados:

char -- nmeros inteiros


nmeros decimais -- nmeros inteiros

Converses impossveis (por enquanto ):

boolean -- qualquer outro tipo

referncia -- qualquer outro tipo

93

2007/2008

Converses (cast)
int i = 65; char c = 'a';

System.out.println(" "+i+,"+(char)i+,"+(float)i+" ");


System.out.println(" "+c+,"+(int)c+,"+(float)c+" "); ecr 65,A,65.0 65,A,65.0 a,97,97.0

94

2007/2008

Operadores aritmticos (I)

+, -, *, / e %
A diviso (/) a diviso inteira se os seus operandos forem inteiros
int x = 1 / 2; // System.out.println(x);
ex. exp.java

% significa resto da diviso inteira:


int x = 15 % 6; System.out.println(x);

95

2007/2008

Operadores aritmticos (II)

Se os operandos forem de tipos diferentes, o operando de um tipo com menor domnio (gama de valores) convertido para o tipo maior domnio antes do clculo:
System.out.println(1.5 + 1);
2.5 convertido para 1.0 sem ser preciso escrever (double)

96

2007/2008

Precedncia e associatividade (I)

Regras comuns respeitadas:


System.out.println(1 + 5 * 3);
16

System.out.println(16 / 2 / 2);
4

97

2007/2008

Precedncia e associatividade (II)

Excepo: atribuio
int i = 1, j = 1; i = j = 0; System.out.println(i + + j); 0 0

Valor da atribuio o valor da varivel atribuda


int x = 0; double f = 0.0; f = x = (int)1.3; System.out.println(f + + x);

1.0

98

2007/2008

Operadores relacionais e de igualdade e diferena

Operadores relacionais:

>, >=, <, <=

Operador de igualdade:

==

Operador de diferena:

!=

99

O resultado sempre um boolean (true ou false)

2007/2008

Operadores lgicos

Operadores lgicos:

&& : E

|| : OU
! : Negao

O resultado sempre um boolean (true ou false) Exemplo (x est entre 0 e 10?): boolean b = (x >= 0 && x <= 10)

Exemplo (x menor que 0 ou maior que 10?):

boolean b = (x < 0 || x > 10)

// Estas expresses

boolean b = !(x >= 0 && x <= 10)// so equivalentes


100
2007/2008

Operadores de incrementao e decrementao

++ e -- prefixos e sufixos
(diferenas analisadas mais tarde)
x: int 3 1. Soma x+1 -> 4

Somar 1 a x:
++x; operador prefixo ou x++; operador sufixo
nota: ex. em exp.java

(guarda 4 em memria)
2. Pe o 4 em x

so ambas abreviaturas de: x = x + 1;

x: int 4

101

2007/2008

Instruo de seleco
Guarda

if(condio){

instrues_1;
} else {

executada quando a condio verdadeira

instrues_2;
}
executada quando a condio falsa
nota: ver ex. exp_if.java

102

2007/2008

Instruo de seleco: Exemplo


//Se x<0 escreve 0 seno escreve 1
int x = 13;
x: int 1 13

if(x < 0) {
x = 0; } else {
1

x = 1;
} System.out.println(x);
103

2007/2008

Instruo condicional: Exemplo


x: int Abreviatura para instruo de leitura 8 x: int

int x = teclado.nextInt();
0

if(x >= 0 && x <= 10) {

x = 0;
}
Dados introduzidos pelo utilizador System.out.println(x);
104

8 0

2007/2008

Instruo condicional: Exemplo

x: int

int x = teclado.nextInt();
-3

if(x >= 0 && x <= 10) { x = 0;


-3 ? O que apareceria no ecr?

}
System.out.println(x);

105

2007/2008

A reter...

Variveis:

Servem para guardar informao

Tm sempre tipo, nome e valor

Expresses:

Combinam variveis e operadores produzindo um valor

Instrues de seleco (if):

Servem para indicar em que condies um conjunto de instrues executado ou no


2007/2008

106

A ler...
Captulos 3, 5 e 7:

Y. Daniel Liang, "Introduction to Java Programming", 5 Edio, Prentice-Hall, 2005. ISBN: 0-13-185721 - 5

107

2007/2008

Aula 3: Sumrio

Tipos primitivos em Java


Noes sobre a representao fsica dos tipos Noes sobre cdigos de caracteres


108

Interpretao de valores do tipo char como inteiros


Valores literais Expresses e operaes Operao de atribuio: alterao do estado da memria Precedncia e associatividade de operadores Instruo de seleco if else
2007/2008

Aula 4
Ciclos, matrizes e String

Na aula passada

Variveis 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);

Instrues de seleco:

if (x >= 0 && x <= 10) System.out.println(x est entre 0 e 10); else System.out.println(x no est entre 0 e 10);
110
2007/2008

Ciclos
inicializao

Enquanto (condio) Fazer... Fazer... Enquanto (condio) Para... De... At (condio) ... Fazer...

inicializao

condio V

instrues

condio

V instruo1 V

instrues

condio instruo2

Enquanto... Fazer...

Fazer... Enquanto

Para... Fazer...
2007/2008

111

Instruo while
while(condio) {

Guarda executadas enquanto a condio for verdadeira

instrues/passo; }

Normalmente as instrues podem dividir-se em dois grupos:


{ aces / instrues; progresso ; }
112
2007/2008

Progresso: Instruo para Garantir que o ciclo termina. Passo = aco + progresso

Ciclos
inicializao

while (condio) {passo; progresso;}

condio V

instrues: - passo/aco - progresso

While... do...
113
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) { System.out.print (i + ); ++i; }

(condio)

Guarda Aco
Passo

System.out.println( );
System.out.println(Terminou.); } }

Progresso
Exemplo Contagem.java

114

2007/2008

Exemplo: Clculo de potncia (xn)


Potncia:
xn = xxxx (n vezes)

Desenvolver o algoritmo:
Descrever como se calcula a potncia usando:

enquanto fazer:

variveis, expresses e operaes


Exemplo PotenciaWhile.java

115

2007/2008

Exemplo: Clculo de potncia (xn)


import java.util.Scanner; public class PotenciaWhile { public static void main(String[] args){ Scanner teclado = new Scanner(System.in); System.out.println("Clculo 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; while(i != n) { r = r * x; ++i;
// Exemplo PotenciaWhile.java

// se n=0 ento i=n e r=1 (no se executa o ciclo)

}
System.out.println("A potncia " + n + " de " + x + " : " + r + " ."); } }

116

2007/2008

Estrutura de um ciclo (for)


Executada uma vez antes do ciclo comear Guarda: o contrrio da condio de paragem

for(inicializao; guarda; progresso){

aco
}

(uma ou mais instrues)

Progresso: Executado sempre que


encontra a chaveta final do for

Aco:
Executado sempre que a guarda seja verdadeira
117
2007/2008

Ciclos

for (init; condio; progresso) {passo;}

inicializao

condio

V - passo

- progresso

For...
2007/2008

118

Exemplo: Clculo de potncia (xn)


Potncia:
xn = xxxx (n vezes)

Desenvolver o algoritmo:
Descrever como se calcula a potncia usando:

para todos os nmeros (i) de at fazer:

variveis, expresses e operaes


PotenciaFor.java

119

2007/2008

Exemplo: Clculo de potncia (xn)


import java.util.Scanner; public class Potenciafor { public static void main(String[] args){ Scanner teclado = new Scanner(System.in); System.out.println("Clculo 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) { r = r * x;
// Exemplo PotenciaFor.java

}
System.out.println("A potncia " + n + " de " + x + " : " + r + " ."); } }

120

2007/2008

Estrutura de um ciclo do-while


inicializao
do { passo / instrues; } while( guarda );

O passo deste ciclo


(com uma ou mais instrues)

executado sempre pelo menos uma vez

Tal como no ciclo while o passo


{
aco progresso }

121

2007/2008

Ciclos

do {passo; progresso;} while (condio)

instrues: - passo/aco - progresso

condio

Do... While...
2007/2008

122

Utilidade do ciclo do-while


Problema:

Criar um menu com 3 opes e, para as duas primeiras indicar qual a que o utilizador escolheu:

Pratos do dia:
Opo 1: Pataniscas de bacalhau Opo 2: Lasanha vegetariana Opo 3. Sar

123

2007/2008

Utilidade do ciclo do-while


Exemplo de interaco com o programa:
1. Opo 1: Pataniscas de Bacalhau 2. Opo 2: Lasanha vegetariana 3. Sair do programa 1 Escolheu a opo 1 1. Opo 1 Pataniscas de Bacalhau 2. Opo 2 Lasanha vegetariana 3. Sair do programa 2 Escolheu a opo 2 1. Opo 1 Pataniscas de Bacalhau 2. Opo 2 Lasanha vegetariana 3. Sair do programa 3 Escolheu a opo 3 Terminou

Introduo de dados pelo utilizador: usar Scanner.nextInt();

124

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("Opo 1: Pataniscas de bacalhau "); System.out.println("Opo 2: Lasanha vegetariana "); System.out.println("Opo 3. Sar "); System.out.println("Escolha a sua opo: "); opcao = teclado.nextInt(); if (opcao > 0 && opcao <= 3) { System.out.println("Opo escolhida: " + opcao); } else { System.out.println("Opo invlida. "); } } while (opcao != 3); System.out.println("Terminou."); }

125

2007/2008

Ciclos
inicializao
Guarda

while (condio) {passo; progresso;} do {passo; progresso;} while (condio) for (init; condio; progresso) {passo;}

aco inical

condio V

instrues: - passo/aco - progresso

condio

V - passo

instrues: - passo/aco - progresso

condio - progresso

While... do

do... While

for...
2007/2008

126

while (i != n) {r = r*x; ++i;}

Ciclos - Exemplos
ler x, n;
int i = 1, r = x;

do {System.out.println(i); ++i;} while (i != 6) for (i = 0; i != 100; ++i) {System.out.println(Java);}

int i = 1;

int i = 0;

i != n
V

Escrever(i); ++i;

i != 100

V Escrever (Java);

r = r * x; ++i;

i != 6 ++i;

Exemplo Uso tpico

While... do ( Calcular xn )
Ciclos Indeterminados

do... While ( Escrever de 1 a 5 )


Validao de dados

for... ( Escrever Java 100 vezes )


Ciclos Determinados
2007/2008

127

Ler trs inteiros e escrev-los por ordem inversa


public class Inversor { public static void main(String[] parametros) { (...) System.out.println("Introduza trs inteiros:); int a = teclado.nextInt(); int b = teclado.nextInt(); int c = teclado.nextInt(); System.out.println(c); System.out.println(b); System.out.println(a);

Como generalizar para 1000, por exemplo?

}
}
128
2007/2008

Ler 1000 inteiros e escrev-los por ordem inversa


Basta substituir acrescentar 997 variveis, 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(); ... int a999 = teclado.nextInt();

Pouco prtico

System.out.println(a999);
System.out.println(a998); ... System.out.println(a0); }

}
129
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]; ? } }

Criao / alocao do espao para 1000 inteiros


Declarao de uma matriz de inteiros

130

2007/2008

Sintaxe
Tipo dos elementos Nome da matriz

double[] m = new double[4];

Nmero de elementos

m[2] = 2.2; double x = m[3]; System.out.println(m[1]);


Indexaes
131
2007/2008

Como uma varivel

Organizao
Recordar noo de Referncia

double[] m = new double[4];


m: double[4] m[0]: 0 m[1]: 0 m[2]: 0 m[3]: 0

ndices: 1 elemento: ndice 0 2 elemento: ndice 1 n elemento: ndice n-1


132
2007/2008

Inicializao
double[] m = new double[4];
m: double[4] m[0]: 0 m[1]: 0 m[2]: 0 m[3]: 0

Notao mais simples, mas no esquecer que m uma referncia!

Com zero!

133

2007/2008

Inicializao explcita (I)


double[] m = {0.0, 1.1, 2.2, 3.3};
m: double[4] m[0]: 0 m[1]: 1.1 m[2]: 2.2 m[3]: 3.3

134

2007/2008

Inicializao explcita (II)


double[] m = {};
Ateno: no h espao reservado. m[0] = 0; // erro

m: double[0]

135

2007/2008

Matrizes com mais de uma dimenso


int n = 10;
// no obrigatrio que n seja constante em Java // valor inicial o char cujo cdigo 0

char[][] m = new char[n][n];

m: char[10][10]
m[0][0] m[0][1] m[0][2] m[0][3] m[0][4]

m[0][10]

m[1][0] m[1][1] m[1][2] m[1][3] m[1][4]

m[10][10]

136

2007/2008

Ciclos com matrizes


Voltando ao problema da inverso de n nmeros 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

137

2007/2008

Ler 1000 inteiros e escrev-los por ordem inversa


public class Inversor { public static void main(String[] parametros) { final int nmero_de_valores = 1000; Scanner teclado = new Scanner(System.in); System.out.println("Introduza + nmero_de_valores + inteiros:); int[] valores = new int[nmero_de_valores];

Constante!

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]); } }
138
Ver: Matriz1000.java
2007/2008

Particularidades das matrizes

Inicializao explcita exaustiva


Dimenso imutvel So sempre referncias Atribuies e comparaes so entre referncias Indexao fora dos limites
int[] m = {0, 1, 2}; m[-1] = -1; m[3] = 3;

Que sucede? Programa aborta! Os ndices so verificados em tempo de execuo.

Tipos vlidos para indexar uma matriz: byte, short, int, char
2007/2008

139

Cadeias de caracteres

Tipo de dados: String


Imutveis: no se podem modificar So referncias Contm operaes

140

2007/2008

Definio de instncias (I)


String s;
s: referncia para String ? No foi criada cadeia de caracteres.

String s = null;

Quando no se pretende, inicialmente, criar a cadeia de caracteres. Em geral no boa ideia.

141

2007/2008

Definio de instncias (II)


String a = ISCTE;
String b = ISCTE;
a: referncia para String : String ISCTE b: referncia para String

142

2007/2008

Definio de instncias (III)


String a = new String(ISCTE); char[] caracteres = {

I, S, C, T, E
}; String b = new String(caracteres);
a: referncia para String : String ISCTE b: referncia para String : String ISCTE
143
2007/2008

Comprimento

String s = Introduo Informtica; System.out.println(s.length());

Mostra 24.

Nota: length() length


144

(mtodo associado determinao da dimenso de uma matriz)

2007/2008

Obter caracteres individuais


String s = Introduo Informtica;
System.out.println(s.charAt(0)); System.out.println(s.charAt(14)); System.out.println(s.charAt(23));
Mostra a Mostra n Mostra I
145
2007/2008

Concatenao e sub-cadeias
String s1 = Introduo ;
String s2 = Informtica; String s3 = s1.concat(s2); Concatena s1 com s2: s3 fica com Introduo Informtica a fica com Introduo b fica com Informtica

ou
String s3 = s1 + s2;

String a = s3.substring(0, 10); Do 0 ao 10, exclusive String b = s3.substring(13); Do 13 at ao fim


146

2007/2008

Comparao
if(s1 == s2)
Comparao entre referncias: No 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 dicionrio.);

147

2007/2008

Encontrar um caracter ou uma sub-cadeia numa cadeia


String s = Introduo Informtica;
int i = s.indexOf(I); int j = s.indexOf(x); int k = s.indexOf(r, 10); int l = s.indexOf(Info); int m = s.indexOf(info); int n = s.indexOf(In, 10);
148
2007/2008

i fica com 0 j fica com -1 k fica com 17, 1 r aps a posio 10 l fica com 13 m fica com -1 n fica com 13

A reter...

Ciclos:

Indicam quantas vezes (ou em que condies) um conjunto de instrues repetido Sries indexveis de variveis do mesmo tipo Classe de variveis onde se guardam palavras ou frases Tm um conjunto de propriedades, ao contrrio das variveis primitivas

Matrizes:

String:

Nota: pode consultar informao os mtodos que integram a classe String (cadeia) em: Classe String - mtodos

149

2007/2008

A ler...
Captulo 4:

Y. Daniel Liang, "Introduction to Java Programming", 5 Edio, Prentice-Hall, 2005. ISBN: 0-13-185721 - 5

150

2007/2008

Aula 4: Sumrio

Instruo while

Sintaxe Semntica

Exemplo de ciclos simples Inicializao, guarda, passo (aco e progresso) As instrues for e do-while Prtica da construo de ciclos Matrizes:

Objecto com instncias do mesmo tipo Sintaxe: definio e inicializao Tamanho de uma matriz: length Indexao

Cadeias de caracteres
2007/2008

151

Aula 5
Mtodos, Parmetros, Argumentos e Contratos

Na aula passada

Ciclos:

while (condio) {passo; progresso;} for (init; condio; progresso) {passo;} do {passo; progresso;} while (condio);
int[] matriz_de_inteiros = new int[100]; matriz_de_inteiros[99] = 10; int x = matriz_de_inteiros[99];

Matrizes:

String:

String frase = Uma frase;

String frase = new String(Uma frase);


char primeiro = frase.charAt(0); char ltimo = frase.charAt(frase.length() 1));

153

Introduo Programao

2007/2008

Modularizao em Java

Mtodos (ou Rotinas)*

Funes Conjunto de instrues, com interface bem definida, que efectua um dado clculo
Devolvem explicitamente um resultado ao exterior

Procedimentos Conjunto de instrues, com interface bem definida, que faz qualquer coisa
No devolvem explicitamente um resultado ao exterior
Nota * : designam-se muitas vezes por Sub-programas ou Rotinas; correspondem a operaes (conjuntos de instrues) que um programa (ou Classe) executa, quando dele se pretende uma dado comportamento

154

Introduo Programao

2007/2008

Sintaxe (declarao)
Classe? static?

Funes de classe

Falaremos disto mais tarde

public static tipo nome(parmetros) { instrues; return varivel; }


Tipo e nome de cada parmetro (separados por virgulas), ex: (int x, char a, String s, double[][] m) Variveis que s existem dentro do mtodo (var. locais)
155
Introduo Programao 2007/2008

Declarao / cabealho

Corpo

Sintaxe (declarao)

Procedimentos de classe

public static void nome(parmetros) { instrues; }


Corpo Declarao / cabealho

Tipo e nome de cada parmetro (separados por virgulas), ex: (int x, char a, String s, double[][] m) Variveis que s existem dentro do mtodo (var. locais)
156
Introduo Programao 2007/2008

Sintaxe (utilizao)

parmetros do mtodo

Estando declarada a funo de classe


Usa-se do seguinte modo : tipo var_retorno = nome(arg1, arg2, )

public static tipo nome(tipo1 par1, ) {}

( a sua chamada integra-se numa instruo para o valor de retorno poder ser utilizado )

Estando declarado o procedimento de classe


public static void nome(tipo1 par1,) {}

Usa-se do seguinte modo: nome(arg1, arg2, )

( basta saber o nome do procedimento, para que serve e que eventuais dados necessita )

157

Introduo Programao

2007/2008

Passagem de argumentos

Parmetros (do mtodo) so sinnimos dos argumentos respectivos (com que chamado o mtodo)
Em Java no h indicao explcita de passagem por referncia! Argumentos so sempre passados por valor (ainda que o valor seja uma referncia)

Tipos primitivos: parmetro uma cpia do valor do argumento Outros tipos: parmetro uma cpia da referncia (i.e. aponta para os mesmos dados que o argumento)

158

Introduo Programao

2007/2008

Tamanho dos mtodos

Ideal

1 a 5 linhas

(sinttico, estruturado, simples e claro)

Normal

at 10 linhas

Em casos extremos

at 60 linhas

159

Nunca mais de 60 linhas!


Introduo Programao 2007/2008

Construindo uma funo

Uma funo que procura, numa lista (matriz) de palavras (String), uma palavra comeada por uma determinada letra e devolve a primeira encontrada nessas condies, ou null se no encontrar:

O que ser devolvido? Como se chama a funo? Quais os dados (parmetros) que precisa?

160

Qual o algoritmo?
Introduo Programao 2007/2008

Construindo uma funo


Uma funo que procura numa matriz uma palavra comeada por uma letra

O que devolvido? uma palavra Qual o nome da funo? procuraPalavra (sem espaos!) Quais os dados que precisa? uma matriz de palavras e uma letra (so dois parmetros) Em Java:

public static String procuraPalavra(String[] lista_de_palavras, char letra)


161
Introduo Programao 2007/2008

Construindo uma funo


Uma funo que procura numa matriz uma palavra comeada por uma letra
public static String procuraPalavra(String[] lista_de_palavras, char letra) {
// comea a procurar no incio da lista // enquanto no chegar ao fim e no encontrar palavra comeada pela letra pedida, fazer: // continua a procurar no resto da lista (progresso) // se encontrou palavra ento devolve-a // seno devolve null

162

Introduo Programao

2007/2008

Construindo uma funo


public static String procuraPalavra(String[] lista_de_palavras, char letra) { int i = 0;
// comea no incio da lista; enquanto no chegar ao fim da lista

// e no encontrar palavra comeada pela letra pedida, fazer:

while (i != lista_de_palavras.length } ++i; && letra != lista_de_palavras[i].charAt(0)) {


// continua a procurar no resto da lista // se encontrou palavra ento // devolve-a // seno devolve null

if (i != lista_de_palavras.length) return lista_de_palavras[i]; return null;

}
Porque no est aqui o else ?
163
Introduo Programao 2007/2008

Exemplo de um procedimento

Um procedimento que pergunta uma letra ao utilizador e escreve no ecr uma palavra (existente numa matriz) comeada por essa letra ou indica ao utilizador que no encontrou

O que devolvido? Como se chama o procedimento? Quais os dados que precisa? Qual o algoritmo?
Introduo Programao 2007/2008

164

Exemplo de um procedimento

Um procedimento que pergunta uma letra ao utilizador e escreve no ecr uma palavra comeada por essa letra

O que devolvido?

NADA! (escrever no ecr NO o mesmo que devolver)

Como se chama o procedimento?


Quais os dados que precisa? Em Java:

escrevePalavra (ou escrevePalavraComeadaPor)

Uma lista de palavras (solicitada ao utilizador dentro do procedimento)

public static void escrevePalavra(String[] lista_de_palavras)

165

Introduo Programao

2007/2008

Exemplo de um procedimento

Procedimento que pergunta uma letra ao utilizador e escreve no ecr uma palavra comeada por essa letra
public static void escrevePalavra(String[] lista_de_palavras) { // pede ao utilizador para inserir uma letra // L a letra // procura palavra comeada por: letra em lista_de_palavras // se encontrou

// mostra palavra ao utilizador


// seno // mostra ao utilizador mensagem a indicar que no encontrou }

166

Introduo Programao

2007/2008

Exemplo de um procedimento

Procedimento que pergunta uma letra ao utilizador e escreve no ecr uma palavra comeada por essa letra
public static void escrevePalavra(String[] lista_de_palavras) { System.out.println(Introduza uma letra e <enter>: );
Scanner teclado = new Scanner (System.in);

String s = teclado.next(); char letra = s.charAt(0);

// L a letra // procura palavra comeada por: letra

String palavra = procuraPalavra (lista_de_palavras, letra); if (palavra != null) { // se encontrou mostra palavra ao utilizador System.out.println(Palavra encontrada: + palavra); } else { // seno mostra ao utilizador que no encontrou System.out.println(Palavra no encontrada); } }
167

Este else necessrio?


Introduo Programao 2007/2008

Utilizao do procedimento
public class CodificadorDeLetra {
// declarao da funo e procedimento public static void main(String[] argumentos) {

String[] palavras = {Alfa, Bravo, Charlie, Dado, Era, \\ ,


Wolkswagen,Zebra};

escrevePalavra(palavras);
} }
168
Introduo Programao 2007/2008

Fluxo de controlo
Programa CodificadorDeLetra Incio do programa 1. Chamada de main() (sempre) 2. Chamada de escrevePalavra() 3. Chamada de procuraPalavra()
escrevePalavra() ainda em execuo!
devolve a palavra encontrada e volta a executar escrevePalavra() no ponto onde foi suspenso No devolve nada, um procedimento

escrevePalavra() 5 procuraPalavra() 1 main() 2 3 4

4. Devoluo de procuraPalavra()

5. Retorno de escrevePalavra()

Fim do programa
(Duvida? faa o traado/debug e verifique)
169
Introduo Programao 2007/2008

Outro exemplo: Somador de fraces


public class SomadorDeFraces { /** ... */ public static int mdc (final int m, final int n) { ... } /** ... */ public static void escreveFraco (final int n,

final int d) {
... } public static void main(String[] argumentos) { ... } }
170
Introduo Programao 2007/2008

Papeis do programador

Programador assume papeis distintos:

Produtor
Desenvolve mecanismo do mdulo Preocupa-se com:
o que faz como se vai usar como funciona

Consumidor
Integra cada mdulo num sistema mais complexo Preocupa-se com:
o que faz

como se usa (que argumentos precisa)

171

Introduo Programao

2007/2008

Contrato (programao por)

Entre produtor e consumidor

Produtor: Indica como se usa

Produtor: Garante resultados


se consumidor respeitar condies de utilizao

172

Introduo Programao

2007/2008

Contrato (programao por)


Dito de outro modo:

Permite indicar quais as funcionalidades que so oferecidas ao exterior

Indica que tipo de informao precisa para executar a funo

Indica qual dever ser o comportamento esperado Comportamento descrito com a mxima exactido possvel

173

Introduo Programao

2007/2008

Contrato (programao por)


Cada mtodo deve indicar o seu contrato Cada contrato contm (pelo menos)

Descrio sumria do funcionamento


Restries aos argumentos a fornecer
Pr-condies

Resultado preciso da execuo


Condio Objectivo
Para funes, se possvel: nome=<expresso c/ param.> Se for procedimento, mais informalmente dizer o que faz

174

Introduo Programao

2007/2008

Mximo divisor comum (VIII)


/** Devolve o mximo divisor comum dos inteiros positivos passados como argumento. @pre 0 < m e 0 < n. @post o valor r devolvido o mdc de m e n. */ public static int mdc(final int m, final int n) { int r; if(m < n) r = m; else r = n; while(m % r != 0 || n % r != 0) --r;

Documentao: o que faz? quais os valores possveis para os argumentos?

Cabealho: como se usa

return r;
}

Corpo: como funciona ?


(s o produtor que se preocupa com esta parte)
Introduo Programao 2007/2008

175

Mximo divisor comum (IX)


/** Devolve o mximo divisor comum dos inteiros positivos passados como argumentos. @pre 0 < m e 0 < n. @post o valor r devolvido o mdc de m e n. */ public static int mdc(final int m, final int n) { assert 0 < m; assert 0 < n; assert 0 < r; assert m % r == 0; assert n % r == 0; return r; }
176
Introduo Programao 2007/2008

Instrues de assero (afirmao)

Mximo divisor comum


(com tratamento de Excepes)
/** Devolve o mximo divisor comum dos inteiros positivos passados como argumentos. @pre 0 < m e 0 < n @post return r ( o mdc de m e n) */

Ateno s pr-condices!

public static int mdc (final int m, final int n) {

if (m <= 0 || n <= 0) throw new IllegalArgumentException ("Pelo menos um dos argumentos errado!");

return r; }
177
Introduo Programao

verificar a validade dos argumentos antes de usar!


2007/2008

Outro exemplo: Busca estranha... (com tratamento de Excepes)


/** Devolve o caractere que tem o ndice x numa dada String (o inteiro x e a String s passados como argumentos) @pre s != null e 0 <= x < s.length() @post return caractere com ndice x em s */ // ... public static char charAtVerificado (String s, int x){

Ateno s pr-condices!

if (s == null || x < 0 || x >= s.length()) throw new IllegalArgumentException("Wrong Argument");


return s.charAt(x); } }

verificar a validade dos argumentos antes de usar!


Introduo Programao 2007/2008

178

Especificao de contrato

No cabealho de rotinas

Etiquetas @pre, @post, etc.

Forar a existncia de pr e ps-condies e recorrer a asseres d origem a programas optimizados, e minimiza os erros de programao. No cdigo Java

Instrues assert

Uma assero uma instruo que permite testar determinados pontos-chave do programa.
As asseres permitem confirmar se o funcionamento do programa corresponde ao que dele esperamos/pretendemos.
Introduo Programao 2007/2008

179

Especificao de contrato
Pr-condies e condies objectivo

Possvel especific-las:

Ao nvel de mtodos
Ao nvel de instrues mais elementares

180

Introduo Programao

2007/2008

Exemplo: absolutoDe()
/** Devolve o valor absoluto do parmetro.
@pre ?. @post ?. */
O que faz

public static int absolutoDe (final int valor) {


... }
Como funciona Como se usa

181

Introduo Programao

2007/2008

absolutoDe(): pr-condio
/** Devolve o valor absoluto do argumento.
@pre V. // Todos os valores do parmetro so vlidos @post ?. */

public static int absolutoDe(final int valor) {


... }

182

Introduo Programao

2007/2008

absolutoDe(): condio-objectivo
/** Devolve o valor absoluto do argumento.
@pre V. @post 0 absolutoDe. */

public static int absolutoDe (final int valor) {


... }

suficiente? No h relao entre o valor devolvido e valor!


Introduo Programao 2007/2008

183

absolutoDe(): condio-objectivo
/** Devolve o valor absoluto do argumento.
@pre V. @post 0 absolutoDe. */ public static int absolutoDe (final int valor) { return 5; }

Errado! Mas, ... A condio objectivo (C.O.) verifica-se! H muitas C.O. que so vlidas, mas umas so melhores que outras (as mais restritivas)
Introduo Programao 2007/2008

184

absolutoDe(): Cond.-Objectivo
/** Devolve o valor absoluto do argumento.
@pre V. @post 0 absolutoDe e

(absolutoDe = valor ou
absolutoDe = -valor). */ public static int absolutoDe (final int valor) {

...
}

185

Introduo Programao

2007/2008

absolutoDe()
/** Devolve o valor absoluto do argumento.
@pre V. @post 0 absolutoDe e (absolutoDe = valor ou absolutoDe = -valor). */ public static int absolutoDe (final int valor) { int absoluto; ... return absoluto; }

186

Introduo Programao

2007/2008

absolutoDe()
/** Devolve o valor absoluto do argumento.
@pre V. @post 0 absolutoDe e (absolutoDe = valor ou absolutoDe = -valor). */ public static int absolutoDe(final int valor) {

// V
int absoluto; ...

Asseres: afirmaes acerca do estado do programa

// 0 absoluto e
// (absoluto = valor ou absoluto = -valor) return absoluto; }

187

Introduo Programao

2007/2008

absolutoDe()
/** Devolve o valor absoluto do argumento. @pre V. @post 0 absolutoDe e (absolutoDe = valor ou absolutoDe = -valor). */ public static int absolutoDe(final int valor) { assert true; // V int absoluto; ... // 0 absoluto e // (absoluto = valor ou absoluto = -valor)

Instrues afirmaes Asseres:de assero: verificao explcita acerca do estado dode asseres. programa
Para usar no Eclipse necessrio a flag de execuo ea. (Run/Run/(X)=Arguments/VM arguments): -ea

assert 0 <= absoluto;


assert absoluto == valor || absoluto == -valor; return absoluto; }

188

Introduo Programao

2007/2008

absolutoDe()
/** Devolve o valor absoluto do argumento. @pre V. @post 0 absolutoDe e (absolutoDe = valor ou absolutoDe = -valor). */ public static int absolutoDe(final int valor) { int absoluto; ... // 0 absoluto e // (absoluto = valor ou absoluto = -valor) assert 0 <= absoluto;

Instrues afirmaes Asseres:de assero: verificao explcita acerca do estado dode asseres. programa
Para usar no Eclipse necessrio a flag de execuo ea. (Run/Run/(X)=Arguments/VM arguments): -ea

assert absoluto == valor || absoluto == -valor;


return absoluto; }

189

Introduo Programao

2007/2008

absolutoDe()

Instrues que resolvem o problema:


absoluto = valor;

absoluto = -valor;

190

Introduo Programao

2007/2008

absolutoDe(): PC1
// PC1: 0 -valor e // (-valor = valor ou -valor = -valor), ou seja,
// PC1: valor 0 e (-valor = valor ou V), ou seja, // PC1: valor 0 e V, ou seja,

// PC1: valor 0

if (valor <= 0) absoluto = -valor; // 0 absoluto e // (absoluto = valor ou absoluto = -valor)


191
Introduo Programao 2007/2008

absolutoDe(): PC2
// PC2: 0 valor e
// (valor = valor ou valor = -valor), ou seja, // PC2: 0 valor e (V ou valor = -valor), ou seja,

// PC2: 0 valor e V, ou seja,


// PC2: 0 valor if (valor >= 0) absoluto = valor; // 0 absoluto e // (absoluto = valor ou absoluto = -valor)
192
Introduo Programao 2007/2008

absolutoDe()
/** Devolve o valor absoluto do argumento. @pre V.

@post 0 absolutoDe e (absolutoDe = valor ou absolutoDe = -valor). */


public static int absolutoDe(final int valor) { assert true; // V int absoluto; if (valor < 0) absoluto = -valor; else absoluto = valor; // 0 absoluto e (absoluto = valor ou absoluto = -valor) assert 0 <= absoluto; assert absoluto == valor || absoluto == -valor; return absoluto; }
193
Introduo Programao 2007/2008

A reter...

Mtodos (ou Rotinas)


Servem para agrupar instrues associadas. Executam um clculo ou procedimento bem definido Tm parmetros

Funes devolvem um valor


Procedimentos no devolvem nenhum valor, apenas realizam aces

Passagem de argumentos
Tipos primitivos: so cpias, o argumento original no pode ser alterado

Outros: so referncias: o argumento original pode ser alterado

Programao por contrato


Se o utilizador cumprir as pr-condies (restries ao valor dos argumentos) o programador da funo/instruo garante as ps-condies (restries ao resultado da rotina) Pr-condies devem ser sempre verificadas

(usando assert ou outros mtodos de que falaremos em breve)

194

Introduo Programao

2007/2008

A ler...
Captulo 6:

Y. Daniel Liang, "Introduction to Java Programming", 5 Edio, Prentice-Hall, 2005. ISBN: 0-13-185721 - 5

195

Introduo Programao

2007/2008

Aula 5: Sumrio

Modularizao, abstraco e encapsulamento.


Mtodos como unidades atmicas de modularizao. Sintaxe da definio de mtodos: cabealho vs. corpo. Comprimento tpico de mtodos. Interface e implementao. Parmetros e argumentos. Instruo return. Retorno e devoluo. Procedimentos: no h devoluo (tipo de devoluo void). Invocao de mtodos. Parmetros como instncias locais. Passagem de argumentos. Contratos e Asseres.

196

Introduo Programao

2007/2008

Aula 7
Classes

Na penltima aula terica

Mtodos:

Funes: public tipo nome(tipo1 par1,) {}


Procedimentos: public void nome(tipo1 par1,) {}

Programao por contrato:


Se o utilizador cumprir as pr-condies (restries ao valor dos argumentos) o programador da funo/instruo garante as ps-condies (restries ao resultado do mtodo) Pr-condies devem ser sempre verificadas (usando assert ou outros mtodos)

198

Introduo Programao - Aula 7

2007/2008

Classes e Objectos

Classe:
(1) Unidade de cdigo, tipo, padro ou modelo definido e desenhado durante a construo de um programa; (2) Modelo/Projecto para a criao de objectos que partilham um conjunto de caractersticas comuns: atributos ou propriedades Variveis (java) operaes, aces ou comportamentos Mtodos (java)

Objecto:
(1) (2) (3) Instncia de uma classe; criado e manipulado durante a execuo do programa; Tem identidade e valores especficos para os seus atributos.

199

Introduo Programao - Aula 7

2007/2008

Classes e Objectos

objecto do

tipo Aluno
Exemplo: Conjunto de atributos e operaes (ou comportamentos) que podem definir um aluno (Classe e um objecto construdo a partir desta):

Classe: Aluno
Atributos
numero nome morada datanasc sexo

Objecto: Joca
Atributos
23456 Joca Rua Direita, 5 25-10-1987 M

Operaes
inscrever verMorada verIdade
200

Ex. de Instanciao da Classe Aluno

Operaes
inscrever verMorada verIdade

Introduo Programao - Aula 7

2007/2008

Classes e Objectos

mtodos (includos no
comportamento da classe)

Classe
define um tipo estrutura de dados configura um conjunto de operaes configura os atributos como um conjunto de variveis-membro, cada uma com o seu tipo (p.e., em Aluno, int x String x String x int(*) x char)

Objecto

tem um estado conjunto especfico dos valores que o caracterizam partilha operaes ou mtodos, que: Alteram estado em um ou mais atributos; p.e. inscrever, No alteram estado devolvem informao; p.e. verIdade (inspectores)
(*)

para simplificar supomos aqui que a datanasc do tipo int


Introduo Programao - Aula 7 2007/2008

201

Classes e Objectos

A definio de uma Classe implica:


A especificao dos atributos variveis e comportamentos mtodos que os objectos desta classe tero.

Exemplo (configurao simplificada da Classe Aluno):


public class Aluno { private int numero; private String nome; private String morada; private int datanasc; private char sexo; // ... ...

veremos num outro exemplo o que o construtor de uma classe, como se instncia uma classe e como se acede ao componente de um objecto
(*)

para simplificar supomos aqui que a datanasc do tipo int

public void inscrever() { numero = 23456; nome = Joca; // somente um objecto especfico modificado, no a classe! } // ... }

202

Introduo Programao - Aula 7

2007/2008

Programao Orientada aos Objectos (POO)


Os programas:

Funcionam, essencialmente, atravs de objectos que tm caractersticas prprias e que podem desempenhar diversas tarefas (ou operaes); Fazem uso destas funcionalidades e da interaco entre objectos.

Programar:

Definir as classes (os seus dados e funcionalidades), o modo como se relacionam e instanciar os objectos de forma a garantir que se alcanam os objectivos pretendidos.

203

Introduo Programao - Aula 7

2007/2008

Como representar um nmero Racional (uma fraco)?

int: no representa todos os Racionais


float: perdemos informao ao arredondar dzimas infinitas, e no podemos distinguir entre 1/2 e 2/4, por exemplo String: no podemos fazer operaes aritmticas sobre caracteres Ser que podemos criar um novo tipo de dados?

204

Introduo Programao - Aula 7

2007/2008

Como representar um nmero Racional (uma fraco)?

Quais as caractersticas/atributos de um racional?


tem numerador tem denominador Ao criar um Racional queremos indicar qual o numerador e o denominador tem um valor (float) quando avaliado (1/2 = 0.5)

205

Introduo Programao - Aula 7

2007/2008

Como representar um nmero Racional (uma fraco)?

Quais as aces/comportamentos que podem associar-se a um racional?

tem um valor (float) quando avaliado (1/2 = 0.5)


pode ser reduzido: 2/4 pode ser reduzido a 1/2 deve ser possvel, por exemplo, somar e subtrair racionais pode ser lido e escrito no ecr

206

Introduo Programao - Aula 7

2007/2008

Como representar um nmero Racional (uma fraco)?

Tem numerador e denominador

Racional: Nome do novo tipo de dados (classe)

public class Racional { public int getDenominador() { } return denominador; public int getNumerador() { }

Guardada no ficheiro Racional.java


Funes do objecto
(no tm static: s podem
ser usadas atravs de um objecto)

return numerador;

private int numerador; private int denominador; }

Variveis de cada objecto


(um objecto uma entidade criada a partir da classe Racional. A classe define os atributos dos objectos desse tipo)
2007/2008

207

Introduo Programao - Aula 7

Como representar um nmero Racional (uma fraco)?

Criar um Racional indicando qual o numerador e o denominador

public class Racional { public Racional (final int numerador, final int denominador) { this.numerador = numerador; this.denominador = denominador; }
//

Construtor da classe Racional. Ex.: Racional x = new Racional(2, 3);


this - identifica as variveis de instncia; produz
uma referncia para o objecto (alvo da invocao ou) em relao ao qual o mtodo foi chamado

private int numerador; private int denominador; }

208

Introduo Programao - Aula 7

2007/2008

Membros de uma Classe


Cada classe pode ter basicamente trs tipos de membros: campo(s)


varivel declarada de um tipo primitivo ou de referncia para um objecto
mtodo que executa uma aco para instncias da classe (objectos) mtodo particular que tem por objectivo criar os objectos da classe

mtodo(s)

construtor(es)

209

Introduo Programao - Aula 7

2007/2008

Membros de uma Classe - Construtores

construtor
mtodo particular que tem por objectivo criar os objectos da classe; difere de outros mtodos (em especial das funes) em trs aspectos: tem o mesmo nome que a prpria classe; no devolve o que quer que seja (no tem valor de retorno); tem um operador new que invoca construtores

new - reserva o espao de memria necessrio para armazenar o objecto

somente a instruo de criao de objectos de uma classe pode chamar/invocar um construtor

210

Introduo Programao - Aula 7

2007/2008

Como representar um nmero Racional (uma fraco)?

Construtor da Classe Racional

public class Racional {

public Racional(final int numerador, final int denominador) {


this.numerador = numerador; this.denominador = denominador; } //

utilizado apenas na criao e


inicializao de objectos da classe Tem a mesma designao da classe No tem valor de retorno Apenas a instruo de criao de objectos da classe o pode chamar, p. ex.:

private int numerador;


private int denominador; }
private - estas variveis s podem ser acedidas pelos mtodos (ou aces) definidos na prpria classe. Princpio do encapsulamento

Racional x = new Racional(2, 3);

211

Introduo Programao - Aula 7

2007/2008

Como representar um nmero Racional (uma fraco)?

Tem um valor (float) quando avaliado

public class Racional { //

public float valorDecimal() {


return (float)numerador/(float)denominador; }
Funo da classe Racional. Chamada:

Racional x = new Racional(1, 2); float f = x.valorDecimal();

private int numerador; private int denominador; }


212
Introduo Programao - Aula 7 2007/2008

Como representar um nmero Racional (uma fraco)?

Pode ser reduzido: 2/4 pode ser reduzido a 1/2


// Procedimento da classe Racional. Racional x = new Racional(2, 4); x.reduz();

public class Racional {

public void reduz() {

int mdc = mdc (numerador, denominador); numerador = numerador / mdc; denominador = denominador / mdc;

}
private int numerador; private int denominador; }
213
Introduo Programao - Aula 7

Vamos precisar de uma funo chamada mdc()? Construa a partir do exemplo da aula 2
2007/2008

Como representar um nmero Racional (uma fraco)?

Deve ser possvel, por exemplo, somar e subtrair racionais

public class Racional { //

public void soma (final Racional r) {


numerador = numerador * r.denominador + r.numerador * denominador; denominador = denominador * r.denominador;

reduz();
} private int numerador; private int denominador;

Procedimento da classe Racional. Racional x = new Racional(2, 3); Racional y = new Racional(7, 4); x.soma(y); // x fica com o valor 31/15
2007/2008

}
214
Introduo Programao - Aula 7

Como representar um nmero Racional (uma fraco)?

Deve ser possvel, por exemplo, somar e subtrair racionais

public class Racional { //

public Racional soma (final Racional r) {


Racional resultado = new Racional(numerador * r.denominador + r.numerador * denominador, denominador * r.denominador ); resultado.reduz();

return resultado;
} private int numerador; private int denominador;

Funo da classe Racional. Racional x = new Racional(2, 3); Racional y = new Racional(7, 5); Racional z = x.soma(y); // z tm o valor 31/15, e x tem o valor 2/3
2007/2008

}
215
Introduo Programao - Aula 7

Como representar um nmero Racional (uma fraco)?

Deve ser possvel, por exemplo, somar e subtrair racionais

public class Racional { // public static Racional soma (final Racional r1, final Racional r2) { Racional resultado = new Racional(r1.numerador * r2.denominador + r2.numerador * r1.denominador, r1.denominador * r2.denominador ); resultado.reduz(); return resultado;

}
private int numerador; private int denominador; }

Funo da classe Racional (Mtodo de classe). Racional x = new Racional(2, 3); Racional y = new Racional(7, 5); Racional z = Racional.soma(x, y); // z tm o valor 31/15, e x tem o valor 2/3
Introduo Programao - Aula 7 2007/2008

216

Como representar um nmero Racional (uma fraco)?

Pode ser lido e escrito no ecr


public void le() { numerador = teclado.nextInt(); char separador = teclado.nextLine().charAt(0); // Ler barra denominador = teclado.nextInt(); } public void escreve() { System.out.print(numerador + / + denominador); } private int numerador; private int denominador; // verso provisria

public class Racional {

}
217
Introduo Programao - Aula 7 2007/2008

Como representar um nmero Racional (uma fraco)?

Pode ser lido:


public static Racional le () { // melhor que a anterior

public class Racional { numerador_lido = teclado.nextInt(); char separador = teclado.nextLine().charAt(0); // barra denominador_lido = teclado.nextInt(); return new Racional (numerador_lido, denominador_lido); } private int numerador; private int denominador; }
218

Mtodo static, membro da classe e no de um objecto. No tem acesso s variveis membro.


2007/2008

Introduo Programao - Aula 7

Como representar um nmero Racional (uma fraco)?

Pode ser lido na construo:


public Racional(Scanner teclado) { numerador = teclado.nextInt(); char separador = teclado.nextLine().charAt(0); // barra denominador = teclado.nextInt(); } private int numerador; private int denominador; Construtor da classe // muito til

public class Racional {

}
219
Introduo Programao - Aula 7 2007/2008

Classes e Objectos

Uma classe uma definio do comportamento e estrutura de um tipo de objectos:


public class Racional {

//
}

Um objecto (instncia de uma classe) cada uma das variveis criadas a partir dessa definio
Racional resultado = new Racional(2, 3);

220

Introduo Programao - Aula 7

2007/2008

Definio da Classe Racional


/** Representa nmeros racionais. */
public class Racional { //

public int numerador;


public int denominador; } Depois de definida a classe, existe algum objecto criado?
NO! A classe define apenas como sero os objectos daquele tipo quando forem criados.
221
Introduo Programao - Aula 7 2007/2008

Criao de objectos
Racional r1 = new Racional (6, 9);
Racional r2 = new Racional (7, 3);
Objecto

Referncia

222

Introduo Programao - Aula 7

2007/2008

Representaes grficas (I)


: Racional r1: referncia para Racional numerador = 6 denominador = 9

r2: referncia para Racional

Objectos

: Racional

Referncias

numerador = 7 denominador = 3
Introduo Programao - Aula 7 2007/2008

223

Representaes grficas (II)


r1: referncia para Racional r2: referncia para Racional

Quantas instncias temos neste slide? Resposta: 8 instncias

: Racional numerador: int

: Racional numerador: int 7

2 referncias
2 racionais 4 int
224

denominador: int
9
Introduo Programao - Aula 7

denominador: int
3
2007/2008

Objectos e referncias
Racional x; Constri referncia nome_da_varivel para objecto da classe Racionalque ainda no existe. Contm lixo se for instncia local e null se for membro de classe.

Racional x = null;
Contm valor null

Racional x = new Racional(...);


Guarda referncia ao objecto criado
225

Constri referncia x para objecto da classe Racional, depois constri o prprio objecto Racional apontado pela referncia x , e chama o construtor para Introduo Programao - Aula 7 2007/2008 inicializar o objecto criado.

Acesso a membros de objectos

Operador .
referncia.membro

S se pode aceder a um membro de um objecto quando o objecto existe (i.e., se referncia a objecto no for null). Exemplos:
Racional r = new Racional(2, 3); int d = r.getDenominador(); float f = r.valorDecimal(); r.escreve();

226

Introduo Programao - Aula 7

2007/2008

Bloco de instrues

Bloco de instrues (ou instruo composta):


Conjunto de instrues agrupadas Funcionam (em certos sentidos) como uma s instruo
{ // Instrues: ... }

227

Introduo Programao - Aula 7

2007/2008

Variveis e mbitos

Variveis locais

Definidas dentro de mtodos Pertencem ao contexto do bloco de instrues onde foram definidas e a todos os blocos interiores Os parmetros so tambm variveis locais

Variveis membro/privadas de uma classe


Definidas fora das rotinas Pertencem ao contexto da classe So visveis em todos os mtodos da classe (excepto mtodos static)

Dentro do mesmo contexto no podem ser definidas duas variveis com o mesmo nome
Introduo Programao - Aula 7 2007/2008

228

Exemplo
public class Programa {
private int j = 1; public int soma(int x, int y) { // Bloco 3. int z = x+y; return z; } public static void main(String[] args) { int i = 2; if(0 < i) { int j = i; int k = 10; System.out.println(i + + j); // Bloco 2. // Bloco 1.

}
} }

Ocultao. A evitar !
Introduo Programao - Aula 7 2007/2008

229

Definies erradas / perigosas


public class Programa { private final int j = 1; private int j = 3; public static void main(String[] args) { int i = 2; int i = 5; if(0 < i) { // Bloco 2. int i = 7; int j = i; int k = 10; int k = 13; System.out.println(i + + j); } // Bloco 1.

}
}

230

Introduo Programao - Aula 7

2007/2008

Constantes de classe
public class CalculadorDoPermetro { //Muito teis para casos como este: public static final double = 3.14159; public static double permetroDeCircDeRaio(final double raio) { return 2.0 * * raio; }

public static void main(String[] parametros) {


System.out.print("Insira o raio: "); double r = teclado.nextDouble(); System.out.println("Permetro : + permetroDeCircDeRaio(r));

System.out.println(rea : " + * r * r);


//

231

Introduo Programao - Aula 7

2007/2008

Nomes (I)

Classes

Grafismo: Iniciar palavras com maiscula public class Racional {

Variveis

Grafismo: Minsculas, separadas palavras por _


Substantivo ou frase substantiva: aquilo que guardado Esta instncia guarda

Instncias

Exemplo:
int nmero_de_alunos = 20;

Instncias booleanas

Afirmao que pode ser verdadeira ou falsa Esta instncia indica se

Exemplo:

boolean existe_na_pauta = true;

232

Introduo Programao - Aula 7

2007/2008

Nomes (II)

Mtodos (em geral)

Grafismo: No separar palavras. Iniciar palavras excepto primeira com maisculas

Procedimentos

Aco (verbo) no imperativo e complementos Este procedimento

Exemplo:
public static void escreveFraco(final int n, final int d)

233

Introduo Programao - Aula 7

2007/2008

Nomes (III)

Funes

Substantivo ou frase substantiva: aquilo que devolvido Esta funo devolve Exemplo: public static double quadradoDe (final double x)

Funes booleanas ou predicados


Afirmao que pode ser verdadeira ou falsa Esta funo devolve um valor que indica se Exemplo: public static boolean soIguais (final char a, final char b)
Introduo Programao - Aula 7 2007/2008

234

Grafismo

O mais importante ser lgico e coerente.

235

Introduo Programao - Aula 7

2007/2008

A reter...

Classes

Servem para agrupar dados e mtodos associados a um conceito Podem ser instanciadas criando objectos desse tipo Os objectos contm variveis (internas) e funes (acessveis usando o operador )

mbito de variveis
As variveis membro so visveis em toda a classe

As variveis locais so visveis desde a declarao at ao fim do bloco em que so criadas


236
Introduo Programao - Aula 7 2007/2008

A ler...
Captulo 10:

Y. Daniel Liang, "Introduction to Java Programming", 5 Edio, Prentice-Hall, 2005. ISBN: 0-13-185721 - 5

237

Introduo Programao - Aula 7

2007/2008

Aula 7: Sumrio

Sintaxe da definio de classes Sintaxe da definio de variveis de uma classe Acesso a variveis membro de uma classe

Mtodos membro: operaes e mtodos


Construtores Operador . mbito de variveis Blocos de instrues. Blocos embutidos. Instncias locais e de classe: mbito, permanncia e ocultao. Regra da definio nica. Constantes de classe. Nomes de classes, instncias, funes e procedimentos.
Introduo Programao - Aula 7 2007/2008

238

Aula 8
Leitura e escrita de dados em ficheiros

Na aula passada

Classes:
public class NomeDoTipo { private int varivel; // variveis membro (var. internas) float funo();
// mtodos (acessveis)

void procedimento();
}

// mtodos (acessveis)

Objectos:

Racional x = new Racional (1,3); Chamada de rotinas: float f = x.funo();


Introduo Programao - Aula 8 2007/2008

240

Entradas e sadas (de dados)

Leitura de dados de canais

Caso: Leitura de dados de ficheiros

Escrita de dados em canais

Caso: Escrita de dados em ficheiros

241

Introduo Programao - Aula 8

2007/2008

Entradas e sadas (de dados)

Tipos fundamentais de dados, de input e output, trocados entre o sistema (pelo programa em execuo) e a) o ambiente (utilizador atravs do teclado ou monitor), b) outro programa ou um c) ficheiro (numa memria secundria):

dados binrios
dados textuais

baseados em bytes
baseados em caracteres

Estabelecem-se canais de comunicao ou fluxos de informao (streams): fluxos binrios fluxos de texto

242

Introduo Programao - Aula 8

2007/2008

Entradas e sadas

Leitura de dados de canais


Baseada em caracteres Baseada em bytes

Obrigatrio em Java para E/S (I/O):

Conhecimento bsico do mecanismo de lanamento e captura de excepes

243

Introduo Programao - Aula 8

2007/2008

Entradas e sadas (Input/Output)

Para acesso a dados externos ao programa


Abertura de canais (de comunicao) Transferncia de dados atravs de canais de I/O


(implica a existncia de memria intermediria buffer)

Fecho dos canais abertos quando acaba a transferncia

Em algumas das actividades anteriores:

Insucesso?
Porque fonte de dados de leitura afinal no existe

Porque no h autorizao para aceder


Outras razes...

244

Introduo Programao - Aula 8

2007/2008

Entradas e sadas (Input/Output)

Se houver problemas:

lanada, automaticamente, uma (situao de) Excepo


(significa que aconteceu algo, algum erro, algum evento inesperado/indesejado, que no era suposto suceder no

decorrer da execuo do programa)


Por exemplo, IOException - situao de excepo no input/output

245

Introduo Programao - Aula 8

2007/2008

Lanamento de Excepes

Liang (2007, pg. 581)

246

Introduo Programao - Aula 8

2007/2008

Classe IOException

As excepes de I/O (E/S) esto relacionadas, em geral, com as operaes de entrada/sada (input/output), como p.e.,

dados de entrada invlidos


subclasse InterruptedIOException

fim de ficheiro no encontrado


subclasse EOFException

tentativa de abertura de um ficheiro que no existe


subclasse FileNotFoundException

247

Introduo Programao - Aula 8

2007/2008

Entradas e sadas

Programa no pode comandar circunstncias que lhe so externas


Programa deve no entanto adaptar-se a todas as situaes que possam surgir Java obriga programador a pensar nas possveis fontes de erro e precaver-se (p.e., atravs do lanamento de
excepes)

Forma estruturada de programar

248

Introduo Programao - Aula 8

2007/2008

Entradas e sadas

Exemplos de canais (ou fluxos) pr-definidos:


System.in System.err
- l informao a partir do utilizador (p.e. do teclado)

System.out - escreve informao para o utilizador (p.e. para o cran)


- veicula mensagens de erro

Desde a verso 1.5 (2004) a classe Scanner permite-nos lidar de modo eficiente com o fluxo de input da classe System ( System.in )

249

Introduo Programao - Aula 8

2007/2008

Entradas e sadas (Fluxos)

Fluxos de dados associados entrada/sada de dados atravs do teclado/ecr

Fluxos de dados associados leitura/escrita de dados atravs de um (ou num) ficheiro (Mendes & Marcelino,
2003, pg. 226)

250

Introduo Programao - Aula 8

2007/2008

Leitura de valores do teclado


(Reviso)

A classe, Scanner utilizvel em qualquer mquina.

Basta importarmos o package (ou biblioteca)


import java.util.Scanner;
e que criarmos um objecto do tipo Scanner (p.e., entrada):
Scanner entrada = new Scanner (System.in);

Recorrendo varivel entrada podemos ler diferentes dados, p.e., um valor inteiro n (existem inmeros mtodos: de leitura, pesquisa, etc.):
int n = entrada.nextInt();
(Resumo do slide 23, Aula 03)

251

Introduo Programao - Aula 8

2007/2008

Entradas e sadas - memria

O acesso (mecnico) a memria secundria (p.e. disco rgido, CD, etc) bem mais lento que o acesso (electrnico) a memria primria (p.e. RAM), da haver memria intermediria ou tampo Buffer :
permite tratar conjuntos de 512, 1024 ou 2048 bytes de uma s vez, em lugar de byte a byte

...

252

Introduo Programao - Aula 8

2007/2008

Ficheiros de dados + programao


Sequncia geral para uso de ficheiros:
1. 2.

Abertura de um ficheiro (sabendo o seu nome) Interaco do programa com o contedo do ficheiro (s leitura ou s escrita) A leitura (ou escrita) efectua-se continuamente do incio ao fim do ficheiro. Ateno: em geral no se pode voltar atrs (tal
como na escrita no ecr ou leitura de valores do teclado)

3.

4.

Fecho do ficheiro (explcito aps escrita, pelo menos)


Introduo Programao - Aula 8 2007/2008

253

Abertura de um Ficheiro

Antes de se poder usar o contedo de um ficheiro num programa:

Abertura para leitura

Abertura para escrita

Aberturas condicionam o tipo de interaco:


S operaes de leitura de dados (do ficheiro) S operaes de escrita de dados (no ficheiro)

Para mudar: Fechar e re-abrir o ficheiro


Introduo Programao - Aula 8 2007/2008

254

Java e Ficheiros de dados

Obrigatrio usar:
Mecanismo de captura e tratamento de Excepes em Java

Na Abertura de Ficheiro
Porque pode falhar!

Nas transferncias de dados de/para um ficheiro


Porque podem falhar! (algumas classes tratam de alguns casos internamente)

Excepes: Matria a desenvolver em POO

(Meno antecipada s para utilizao de ficheiros)

255

Introduo Programao - Aula 8

2007/2008

Classes para leitura e escrita de caracteres num ficheiro - notas

classe File

para manipular ficheiros includa na biblioteca java.io.*

serve para representar (logicamente) ficheiros em disco


no possui mtodos que implementem operaes comuns, como ler ou escrever um ficheiro

necessrio recorrer a outras classes especializadas, de acordo com o tipo de ficheiro e a operao em causa

256

Introduo Programao - Aula 8

2007/2008

Classes para leitura e escrita de caracteres num ficheiro de texto - notas

Para os ficheiros de texto recorre-se s classes:


FileReader - para operao de leitura (carcter a carcter) FileWriter - para operao de escrita (carcter a carcter)

Para criar objectos destas classes deve ter-se como parmetro um objecto da classe File correspondente ao ficheiro pretendido:

FileReader f1 = new FileReader (new File (nomeDoFicheiro)); FileWriter f2 = new FileWriter (new File (nomeDoFicheiro)); FileReader f1 = new FileReader (nomeDoFicheiro); FileWriter f2 = new FileWriter (nomeDoFicheiro);
f1 e f2 referenciam o ponto actual de leitura/escrita no ficheiro

ou, abreviadamente,

257

Introduo Programao - Aula 8

2007/2008

Classes para leitura e escrita de caracteres num ficheiro de texto

FileWriter

Classe File: Construtor: File (String) Associa um objecto a um ficheiro

FileWriter (String filename) FileWriter (File)

write(): pode escrever uma String de cada vez **

FileReader

FileReader (String filename)

FileReader (File)
read(): l apenas um carcter de cada vez **
** mtodos da classe BufferedWriter e BufferedReader, respectivamente

258

Introduo Programao - Aula 8

2007/2008

Classes para leitura e escrita de caracteres num ficheiro de texto


Classe File: Construtor: File(String) Associa um objecto a um ficheiro

FileWriter

FileWriter f1 = new FileWriter (new File (nomeFicheiro)); FileWriter f1 = new FileWriter (nomeFicheiro);

FileReader

FileReader f2 = new FileReader (new File (nomeFicheiro));

FileReader f2 = new FileReader (nomeFicheiro);

f1 e f2 referenciam o ponto actual de leitura/escrita no ficheiro


259
Introduo Programao - Aula 8 2007/2008

Classes para leitura e escrita de (linhas de) caracteres num ficheiro de texto

BufferedWriter

BufferedWriter fich1 = new BufferedWriter (f1);

BufferedReader

BufferedReader fich2 = new BufferedReader (f2);


Estas classes tm como parmetro um objecto de uma das classes, respectivamente FileWriter e FileReader Ambas as classes tm mtodos adequados para a leitura e escrita de linhas de caracteres so mais convenientes para manipular ficheiros do que FileWriter e FileReader que tratam um carcter de cada vez
Introduo Programao - Aula 8 2007/2008

260

Escrita de caracteres num ficheiro de texto - notas

Escrita - quando se abre um ficheiro para escrita

caso este j exista, o seu contedo (anterior) apagado;


seno (como ainda no existia) o ficheiro criado. Em qualquer caso, a abertura de um ficheiro para escrita (ou o acesso a um ficheiro em modo de escrita) gera um ficheiro vazio.

261

Introduo Programao - Aula 8

2007/2008

Classe para leitura de valores de um ficheiro (classe Scanner)

Scanner (mais fcil de usar que FileReader, l e transforma no tipo de dados requerido)

Scanner(File) String next() int nextInt() float nextFloat()

para abertura de fich. em modo de leitura l at ao prximo separador l prximo inteiro l prximo decimal

associa uma varivel a um fluxo (stream) de input

String nextLine() l prxima linha (salta a mudana de linha)

boolean hasNext() V se uma nova palavra existe para ser lida boolean hasNextInt() V se um novo inteiro... boolean hasNextFloat() V se um novo decimal...
Introduo Programao - Aula 8 2007/2008

262

Classes para leitura e escrita em binrio (a aprofundar futuramente)

FileInputStream

FileInputStream (String filename) FileInputStream (File)

read(): l apenas um byte (ou int) de cada vez (assinala fim-de-ficheiro devolvendo -1)

FileOutputStream

FileOutputStream (String filename)


write(): escreve apenas um byte (ou int) de cada vez
FileInputStream

263

Introduo Programao - Aula 8

2007/2008

Abertura de um Ficheiro (leitura)


import java.util.* ; Scanner canal_de_leitura = null; try { canal_de_leitura = new Scanner(new File(dados.txt")); } catch (FileNotFoundException e) { System.out.println("Erro na abertura do ficheiro dados.txt para leitura"); }

264

Introduo Programao - Aula 8

2007/2008

Ficheiros: Leitura de dados de um fich.


Ficheiro a ler contm:
assert ficheiro != null;
int num = ficheiro.nextInt(); String operadora = ficheiro.next(); // eliminao de espaos no incio e fim da String operadora = operadora.trim(); String tarifrio = ficheiro.nextLine(); tarifrio = tarifrio.trim();

211234567 Telecom Tarifrio: Paga 3 Fala 2


class Telefonema { int numero; String operadora; String tarifrio; // }

// Quando os dados esto em linhas separadas a ltima instruo pode ter // lido o fim da linha anterior por isso pode ter de ser repetida trim() retira if (tarifrio.equals()) { os espaos String tarifrio = ficheiro.nextLine(); do incio e fim da String tarifrio = tarifrio.trim(); } Telefonema t1 = new Telefonema (num, operadora, tarifrio);
265
Introduo Programao - Aula 8 2007/2008

Abertura de um Ficheiro (escrita)


FileWriter canal_de_escrita = null; try { canal_de_escrita = new FileWriter(new File(dados.txt")); } catch (IOException e) { System.out.println("Erro na abertura do ficheiro dados.txt para escrita"); }

266

Introduo Programao - Aula 8

2007/2008

Ficheiros: Escrita
try {

class Telefonema { int numero; String operadora; String tarifrio; // }

ficheiro.write (numero + ); ficheiro.write (operadora + ); ficheiro.write (tarifrio + \r\n); } catch (IOException e) {

System.out.println("Erro na escrita); } ficheiro.close();


// No esquecer: sem esta instruo os dados podem no chegar // a ser guardados no ficheiro.
267
Introduo Programao - Aula 8 2007/2008

Escrita de objectos
private static final String SEPARADOR = " "; private static final String FIM_DE_REGISTO = "\r\n"; public String toString() { return new String (numero + SEPARADOR + operadora + SEPARADOR + tarifrio + FIM_DE_REGISTO); } public void escreveParaFicheiro(FileWriter ficheiro) { try { ficheiro.write (toString()); } catch (IOException e) { System.out.println ("Erro na escrita do Telefonema " + toString()); // ou System.out.println("Erro na escrita do Telefonema " + this); }

A definio do mtodo toString() permite a converso automtica


Introduo Programao - Aula 8 2007/2008

268

Leitura de objectos (no construtor)


public Telefonema (Scanner ficheiro) {
assert ficheiro != null; assert ficheiro.hasNextInt(); numero = ficheiro.nextInt(); assert ficheiro.hasNext(); operadora = ficheiro.next().trim(); assert ficheiro.hasNextLine(); tarifrio = ficheiro.nextLine().trim(); }

269

Introduo Programao - Aula 8

2007/2008

Leitura de objectos (em funo de classe)


public static Telefonema lDeFicheiro (Scanner ficheiro){ assert ficheiro != null;

int num = ficheiro.nextInt(); String op = ficheiro.next().trim(); String tarifa = ficheiro.nextLine().trim();


// Verificao dos dados recebidos

return new Telefonema(num, op, tarifa); }

270

Introduo Programao - Aula 8

2007/2008

A reter...

Leitura de ficheiros

Classe Scanner

Escrita de ficheiros

Classe FileWriter Nunca esquecer de fechar (close())

Excepes (na manipulao de ficheiros)

271

Introduo Programao - Aula 8

2007/2008

A ler...
Captulo 8:

Y. Daniel Liang, "Introduction to Java Programming", 6 Edio, Prentice-Hall, 2007. ISBN: 0-13-185721 - 5

272

Introduo Programao - Aula 8

2007/2008

Aula 8: Sumrio

Leitura e escrita de ficheiros de texto Breve introduo s classes:

FileReader
FileWriter Scanner InputStreamReader OutputStreamWriter

Excepes na manipulao de ficheiros


Introduo Programao - Aula 8 2007/2008

273

Das könnte Ihnen auch gefallen