MATÉRIA DE PP

Embed Size (px)

Citation preview

Disciplina: PA1

Bibliografia: 1.Carrio, Jos; Carrio Antnio, Computadores, Tecnologias e sistemas de Informao - O Ncleo de Sistema, Lisboa, 1997, ISBN: 972-96-533-6-4 2.Carrio, Jos; Carrio Antnio, Computadores, Tecnologias e sistemas de Informao - Tecnologias de Software, Lisboa, 1997, ISBN: 972-96-533-8-0 3.Carrio, Jos; Carrio Antnio, Computadores, Tecnologias e sistemas de Informao Perifricos, Internet e multimdia, Lisboa, 1997, ISBN: 972-96-533-7-2 4.Antnio Jos Mendes, Maria Jos Marcelino, Fundamentos de programao em Java 2, FCA, 2002., ISBN 972-722-267-6 5.Elliot Koffman, Ursula Wolz, Problem Solving with Java, 1999, ISBN 0-201-35743-7 6.F. Mrio Martins, Programao Orientada aos objectos em Java 2, FCA, 2000, ISBN 972-722-196-3 7.John Lewis, William Loftus, Java Software Solutions: foundation of program design, 2nd edition, Addision-Wesley, ISBN 0-201-61271-2 8.John R. Hubbard, Theory and problems of programming with Java, Schaums Outline series, McGraw-Hill, ISBN 0-07-134210-9 9.H. Deitel, P. Deitel, Java, como programar, 4 edio, 2003, Bookman, ISBN 85-363-0123-6 10.sites: www.fca.pt, //java.sun.com; 11. www.sun.com; www.javaman.com.br/artigos/JavaComoComecar.html;www.javaworld.com

Introduo ao Programao

[2], pag.42-44

Nossa tarefa no s aprender a Java, mas tambm melhorar sua habilidade no uso de computador como ferramenta para soluo de problemas. Este processo, geralmente chamado de programao, composto de duas tarefas: formular um procedimento logicamente corecto e sem ambiguidades, para resolver um dado problema; traduzir tal procedimento para uma forma aceitvel pelo computador. Um programa de computador , antes de mais nada, um solucionador de problemas. Um modelo de soluo de problemas inclui sete passos a seguir: 1.Deixar claro o problema. 2.Identificar as entradas e sadas. 3.Desenvolver um procedimento para a soluo do problema. 4.Verificar manualmente o procedimento e corrigi-lo, se necessrio. 5.Codificar o algoritmo numa linguagem de programao(LP). 6.Executar o programa com dados de teste, depurando (processo de detectar e remover erros- debugging) quando necessrio. 7.Refinar e documentar o programa. Observamos antes, que a programao consiste em duas tarefas: desenvolvimento de algoritmos e codificao. Um algoritmo uma srie de passos usados para resolver um problema. Voc produz um algoritmo por meio de uma analise sistemtica do problema. O algoritmo expresso em uma linguagem chamada pseudocdigo, que parecida com uma LP, mas que evita detalhes excessivos (semelhante ao ingls). Em seguida, voc codifica, ou seja, traduz o algoritmo para linguagem que computador entenda (Pascal, Fortran, C++, Java ou outra). Para isso voc deve reduzi-lo a uma sequncia de operaes primitivas.

1. Linguagem de programao Java

[2], pag 49-51

A LP Java foi criada nos anos 90 com objectivo de criar uma nova LP que pudesse ser executada em qualquer tipo do computador. Este problema foi resolvido considerando um computador virtual que se imagina capaz de executar um cdigo constitudo por instrues simples. Este cdigo chamado por bytecode, pois usado 1 byte para representar cada instruo.programa Criar O compilador de Java, ao contrrio dos compiladores tradicionais, no vai gerar Editor cdigo executvel, mas sim bytecode. necessrio que cada computador tenha um programa que possa interpretar e executar bytecode. Ao conjunto de todos os intrpretes disponveis dse o nome de mquina virtual Java (JVM- Java Virtual Machine). O esquema seguinte descreve o processo de criao, compilao e execuo de um programa em Java.Cdigo Java Compilador de Java (JavaC)

Elab. por eng Tatiana Kovalenko

1

Java bytecode

Interprete de Java

2008

Disciplina: PA1

Para criar programas em Java necessrio ter o Java Development Kit (JDK) instalado no computador. O JDK inclui diversas ferramentas teis, como seja o compilador (chamado javac), o interprete de bytecode (chamado java) e um largo conjunto de classes j programadas com respectiva documentao. Nos sistemas operativos (SO) baseados em janelas comum a utilizao de ambientes integrados de desenvolvimento que facilitam a utilizao do JDK (tais como Kawa, Jel, etc.).

2. Estrutura de um Programa em JavaUm programa em Java um conjunto de uma ou mais classes, uma das quais ser a principal e deve ter o mesmo nome que o ficheiro. Uma classe pode ser vista como um conjunto de variveis e subprogramas(mtodos), sendo que cada um destes ltimos contm instrues que lhes permitem desempenhar uma determinada tarefa. Trs tipos de componentes principais constituem um programa: Declaraes, que reservam a memria para o armazenamento da informao envolvida. Instrues, que definem as aces e decises a tomarem. Comentrios - so teis para os humanos, mas ignorados pelo computador.

2.1. O conjunto de caracteres do JavaA sintaxe do Java, tal como a de outras linguagens, inclui palavras reservadas, smbolos, identificadores e valores. Utilizam-se: as letras de A a Z (maisculas e minsculas), os dgitos 0 a 9, os smbolos especiais: + . < ( : [ / >= ] % , == { = ^ != } palavras reservadas que tm em Java um significado padro e predefinido. Por exemplo,

while, if e new so instrues e class, int e void indicam tipos de informao declarada. Estas palavras reservadas podem ser usadas unicamente para o fim a que so destinadas, no podendo ser arbitrariamente redefinidas pelo programador.

2.2. IdentificadoresUm identificador um nome que dado a um elemento do programa, tal como uma constante, varivel, subprograma ou classe. Os identificadores so compostos de letras (somente da lngua inglesa), dgitos, caracteres _ e $ em qualquer ordem, desde que o primeiro caracter no seja um digito. O Java distingue entre maisculas e minsculas, ou seja, Max, max e MAX so considerados identificadores diferentes. comum usar certas convenes para os identificadores: o nome de uma classe comea por maiscula (por ex. Poligono)Elab. por eng Tatiana Kovalenko2

2008

Disciplina: PA1

o nome de um subprograma(mtodo) comea por minscula (por ex. main()) o nome de uma varivel comea por minscula (por ex. cateto1) o nome de uma constante todo em maisculas (por ex. MAX) No pode usar palavras reservadas como identificadores. Valido x1 soma a_b $dollar Invalido 1_x M&M Int $dllar

Os valores so dados explcitos que podem ser manipulados pelos programas.

2.3. VariveisUma varivel representa uma localizao em memria do computador que tem um nome atribudo pelo programador e que vai servir para guardar informao de um determinado tipo. O valor de uma varivel pode variar durante a execuo de um programa. As variveis so declaradas, em Java, quando se escreve o programa e quando isto feito, especificado um nome e um tipo para varivel. A declarao de variveis obrigatria. A sintaxe da declarao de variveis a seguinte: tipo_de_dado nome_da_variavel; ou tipo_de_dado nome_da_variavel = valor_inicial; A primeira forma declara apenas uma varivel e a segunda, alem de declarar, inicializa a varivel com valor fornecido. Exemplos:int numConta; int valMax = 1; double preco, total;

2.4. ConstantesConstantes so os dados cujos valores se mantm inalterados ao longo do programa. A sintaxe de declarao de uma constante a seguinte: final tipo_de_dado NOME_DE_CONSTANTE = valor; Exemplo:final int MAX_STUDENTS = 25;

No pode mudar o valor da constante aps a sua declarao.

2.5. Um primeiro programa em JavaPretende-se elaborar um programa que, dadas as dimenses dos catetos de um tringulo rectngulo, calcule e fornea ao utilizador o comprimento da hipotenusa. Devemos analisar o problema e elaborar um algoritmo para resoluo deste. O algoritmo pode ser escrito na seguinte forma: 1.Reservar espao na memria para armazenar os valores dos dois catetos e da hipotenusa; 2.Pedir ao utilizador as dimenses dos catetos, ler os valores fornecidos e armazen-los em duas variveis (cateto1 e cateto2); 3.Calcular o resultado e armazen-lo na varivel hipotenusa; 4.Visualizar o resultado. Traduzimos o algoritmo para a linguagem Java:1. 2. 3. 4. 5. 6. 7. 8. 9. public class Pitagoras { public static void main(String[] args) { //Declarao de variaveis double cateto1, cateto2, hipotenusa; //L dimensoes dos catetos System.out.print("Valor do primeiro cateto: "); cateto1 = Le.umDouble(); System.out.println("Valor do segundo cateto: ");3

Elab. por eng Tatiana Kovalenko

2008

Disciplina: PA1

10. 11. 12. 13. 14.

cateto2 = Le.umDouble(); hipotenusa = Math.sqrt (cateto1*cateto1 + cateto2*cateto2); System.out.println("Hipotenusa: " + hipotenusa); } //fim do metodo main } //fim da classe Pitagoras

Em linguagens orientadas aos objectos como o Java, o cdigo executvel tem sempre que ser integrado numa classe. A classe uma entidade central em programao orientada aos objectos. 1a linha do programa inicia uma definio de classe para a classe Pitagoras, onde Pitagoras o nome por ns atribudo. Essa classe conhecida como classe definida pelo programador. 2a linha do programa permite identificar o subprograma principal, o main() e, consequentemente, o incio do programa. O bloco de instrues pertencentes ao subprograma main() delimitado por chavetas {}. A linha 2 faz parte de todo aplicativo Java. Os aplicativos Java comeam a execuo por main. Os parnteses depois de main indicam que main um bloco de construo de programa denominado mtodo. As definies de classe de Java normalmente contm um ou mais mtodos. A palavra-chave void indica que esse mtodo realizar uma tarefa, mas no retornar nenhuma informao quando completar sua tarefa. System.out.println() um programa predefinido em Java que permite escrever no ecr a mensagem (ou string) que se encontra entre parnteses. A diferena entre print e println que, depois de exibir seu argumento o cursor de sada no muda de linha. 3 e 6 linhas contm comentrios que comeam por // Na 7a e 9a linhas pede-se ao utilizador a introduo de dimenses dos catetos. Na 8a e 10a linhas feita a leitura dos valores fornecidos pelo utilizador. Le.umDouble() um subprograma que l um valor real do teclado. Os valores introduzidos so armazenados nas variveis cateto1 e cateto2 graas ao operador de atribuio (=). Na 11a linha calcula-se o valor da hipotenusa utilizando outro mtodo Math.sqrt que calcula a raiz quadrada do valor resultante da expresso entre parntesis. 12a linha escreva o resultado de clculo no ecr acompanhado pelo cadeia de caracteres que est entre aspas. Agora o programa pode ser compilado e executado. Para isso dever ser guardado num ficheiro com o mesmo nome (Pitagoras) e extenso .java. Os passos necessrios para compilar e executar o programa dependem do ambiente de desenvolvimento e do SO em que se est a trabalhar.

3. Tipos de dados bsicos (tipos primitivos)Um tipo de dados definido pela gama de valores que pode representar e pelas operaes que sobre eles se podem efectuar. Java permite tratar oito tipos de dados predefinidos: boolean, char, byte, short, int, long, float e double.

3.1. Representao de nmeros inteirosA representao de nmeros inteiros assegurada pelos seguintes tipos:Tipo byte short int long Memria ocupada 8 bits 16 bits 32 bits 64 bits Menor valor -128 -32 768 -2 147 483 648 (-231) -9 233 372 036 854 755 808 (-263) Maior valor 127 32 767 2 147 483 647 (231-1) 9 223 372 036 854 775 807 (263-1)

public class A_mais_B { public static void main(String[] args) { //Declarao de variveis int a, b; long resultado;Elab. por eng Tatiana Kovalenko4

2008

Disciplina: PA1

} }

//L valor de A e B System.out.print("Introduza o valor A: "); a = Le.umInt(); System.out.println(a); System.out.print("Introduza o valor B: "); b = Le.umInt(); System.out.println(b); resultado = a+b; System.out.println("A soma entre "+a+ " e "+b+" igual a "+resultado);

Para alem de representao decimal, os nmeros podem tambm ser representados nas bases octal e hexadecimal. Para isso usam-se prefixos: 0 para octal e 0x para hexadecimal. Por exemplo: 0513 (em octal) e 0xa9cd (em hexa)

3.2. Representao de nmeros decimaisA representao de nmeros com parte fraccionria pode ser feita atravs de seguintes tipos: Tipo float double Memria ocupada 32 bits 64 bits Menor valor -3.4 x 1038 -1.7 x 10308 Maior valor 3.4 x 1038 1.7 x 10308

Os valores reais podem ser representados usando a notao decimal (por ex. 34.054) ou a notao exponencial (por ex. 2.5E-6 que representa o nmero 2,5 x 10-6). Em qualquer dos casos, o nmero pode ser seguido das letras f (ou F) ou d (ou D) indicando que se pretende o seu armazenamento como float ou como double. A ausncia de indicao implica que o nmero seja considerado como double.public class AxB_real { public static void main(String[ ] args) { float a, b; //Declarao de variaveis double resultado; System.out.print("Introduza o valor A: "); a = Le.umFloat(); System.out.println(a); System.out.println("Introduza o valor B: "); b = Le.umFloat(); System.out.println(b); resultado = a*b; System.out.println(a+ " x "+b+" = "+resultado);

} }

3.3. Representao de caracteresO tipo CHAR usado para guardar caracteres individuais que so representados internamente no computador pelos seus cdigos ASCII. A declarao de variveis deste tipo feita da seguinte forma:char letra letra = 'M'; ou char letra = 'a';

O uso de caracteres feito entre apstrofos ' '. Por exemplo: Uma vez que as variveis do tipo char armazenam cdigos, que so nmeros, possvel fazer algum tipo de aritmtica com estes variveis, nomeadamente incrementaes e decrementaes. Tipo Memria ocupada Valores char 16 bits Qualquer caracter pertencente ao Unicode Exemplo: Visualizar no ecr um caracter introduzido do tecladopublic class Caracter { public static void main(String [] args) { char umCar; //Declarao de variavel

Elab. por eng Tatiana Kovalenko

5

2008

Disciplina: PA1

System.out.println("Introduza um caracter (p.ex. uma letra): "); umCar = Le.umChar(); //L um caracter do teclado System.out.println("O caracter lido foi " + umCar); } }

3.4. Representao de valores lgicosO tipo boolean um tipo de dados para guardar valores lgicos, nomeadamente true (verdade) e false (falso). Tipo boolean Memria ocupada 1 bit Valores true ou false

4. Instruo de atribuioA atribuio permite armazenar um valor numa varivel. Esse valor pode ser fornecido directamente ou resultar do clculo de uma expresso.public class IntAlunos { public static void main (String args[]) { int alunos = 80; System.out.println("H "+alunos+" alunos no curso"); alunos = 130; //a variavel recebeu um novo valor System.out.println("Agora j h "+alunos+" alunos");

} }

Este programa comea por criar uma varivel inteira denominada alunos, inicializando-a com o valor 80. Em seguida o valor da varivel alunos alterado e passa a conter 130.

5. ExpressesUma expresso uma sequncia de operadores e de valores. A linguagem Java tem definido um conjunto de operadores, aritmticos e lgicos, que permitem a construo de expresses.

5.1. Expresses aritmticasOperadores vlidos: Operador * / % + Prioridade 1 1 1 2 2 Operao Multiplicao Diviso Resto da diviso Adio Subtraco

Uma referncia particular para o operador diviso, pois este apresenta comportamentos diferentes em funo do tipo de operandos a que aplicado. No caso de algum dos operandos ser real (float ou double), o resultado ser tambm um nmero real. Por exemplo:x = 10/4.0; //x 2.5

No entanto, se ambos os operadores forem inteiros (byte, short, int ou long), o resultado ser tambm um inteiro, pelo que a parte fraccionria do resultado desprezada. Assim, y = 10/4; //y 2 O operador % permite calcular o resto de uma diviso. Por exemplo:z = 13%4; //z 1

Ainda que este operador seja geralmente mais til para calcular o resto de divises inteiras, o Java permite tambm a sua utilizao com operandos reais. Por exemplo:f = 8.6%2.0; //f 0.6

Exemplo:public class ConvSegHoras { public static void main(String args[]) { int totalSegs, horas, minutos, segundos, segs; //L o nmero de segundos System.out.print("Numero total de segundos: ");Elab. por eng Tatiana Kovalenko6

//por ex. 85002008

Disciplina: PA1

totalSegs = Le.umInt(); //Calcula o nmero de horas (diviso inteira por 3600) //Uma hora tem 3600 segundos horas = totalSegs / 3600; //8500/3600=2 //Calcula o nmero de segundos que sobram segs = totalSegs % 3600; //8500%3600=1300

//Calcula o nmero de minutos que existem nesses segundos minutos = segs / 60; //1300/60=21 //Calcula o nmero de segundos que sobram //(resto da diviso anterior) segundos = segs % 60; //1300%60=40 System.out.print(totalSegs+" segundos correspondem a "+horas+" hora(s) "+ minutos+" minuto(s) e "+segundos+" segundo(s)"); } }

A linguagem Java inclui tambm operadores de incrementao e de decrementao unria de variveis, ++ (soma um ao seu operando) e -- (subtrai um ao seu operando) Exemplo: conta++; conta- -; ou ainda: ++conta; - -conta; //ps-incremento //ps-decremento //pr-incremento //pre-decrimento

A distino entre as duas formas destes operadores, antes ou depois do operando, s relevante quando fazem parte de uma expresso maior. Por exemplo, supondo que a varivel num tem o valor 7, a expressox = ++num;

incrementa o valor de num (para 8) e depois atribui-o a x (por isso x passa a ter o valor 8). No entanto, se for utilizada a expressox = num++;

primeiro feita a atribuio de num a x (x fica com o valor 7) e s depois que feita a incrementao de num.public class Increment { public static void main( String args[] ) { int c; c = 5; System.out.println( c ); // visualiza 5 System.out.println( c++ ); // visualiza 5 e depois incrementa c System.out.println( c ); // visualiza 6 System.out.println(); // salta uma linha c = 5; System.out.println( c ); // visualiza 5 System.out.println( ++c ); // incrementa c e depois visualiza 6 System.out.println( c ); // visualiza 6

} }

importante notar que, ao incrementar ou decrementar uma varivel em uma instruo isolada, as formas de pr-incremento e de ps-incremento tm o mesmo efeito e as formas de pr-decremento e ps-decremento tm o mesmo efeito. Java fornece vrios operadores de atribuio (+=, -=, *=, /=) para abreviar expresses de atribuio. Por exemplo, podemos abreviar a instruo c = c+3; como c += 3; O operador += adiciona o valor da expresso direita do operador ao valor da varivel esquerda do operador, e armazena o resultado na varivel esquerda do operador. Suponha: int c = 3, d = 5, e = 4, f = 6;Elab. por eng Tatiana Kovalenko7

2008

Disciplina: PA1

Operador de += -= *= /=

Expresso de c d e f += -= *= /= 7 4 5 3

Explicao c d e f = = = = c+7 d-4 e*5 f/3

Atribui 10 a c 1 a d 20 a e 2 a f

5.2. Classe MathO JDK (Java Development Kit) inclui um largo conjunto de classes e mtodos que podem ser utilizados para variados fins. Os mtodos (ou subprogramas) pr-programados da classe Math permitem realizar certos clculos matemticos comuns. Por exemplo, Math.sqrt() calcula a raiz quadrada, Math.pow() calcula a potncia de um nmero elevado ao outro, Math.random() gere um nmero aleatrio entre 0 e 1, Math.sin() calcula o seno de um ngulo. aconselhvel a consulta da documentao do JDK para obter uma lista completa de subprogramas existentes no Math. Exemplo: Calcular o valor de baseexpoente para valores introduzidos do teclado.public class BaseExp { public static void main(String[ ] args) { int base, expoente; //Declarao de variaveis double resultado; System.out.print("Valor de Base: "); base = Le.umInt(); System.out.print("Valor de Expoente: "); expoente = Le.umInt(); resultado = Math.pow(base, expoente); System.out.print("O valor "+base+ " elevado a "+expoente+" e igual a " +resultado); } }

5.3. Converses de tipoO tipo do resultado de uma expresso aritmtica depende do tipo dos seus operandos. Se todos eles forem do mesmo tipo, o resultado ser tambm desse tipo. No caso contrrio devem ser feitas as converses de tipo. Algumas so feitas automaticamente e de modo a que no haja perda de informao, pelo que nem todas as transformaes so possveis. Por exemplo, um valor real no pode ser convertido automaticamente para um tipo inteiro, porque isso implicaria a perda de parte decimal do nmero. A cadeia de converso automtica do compilador a seguinte:byte > short > int > long > float > double

Assim, possvel converter um int em long ou float, mas no possvel converter um double em float ou long sem perda de informao Considere-se o seguinte exemplo:1. 2. 3. 4. 5. int var_int = 10, resultado_int; double var_double = 5.2, resultado_double; resultado_double = var_int + var_double; resultado_int = var_int + var_double;

Na primeira operao (linha 4) o valor de var_int convertido para double, a soma efectuada e o resultado 15.2 (double) armazenado na varivel resultado_double (double). Na instruo a seguir (linha 5) o compilador vai detectar o erro de incompatibilidade de tipo. A converso do tipos com perda de informao permitida nalguns casos, mas o programador tem que indicar explicitamente que a pretende (este mecanismo chama-se cast). A instruo da linha 5 poderia ser alterada para:5. resultado_int = (int) (var_int + var_double);

Neste caso o resultado final 15 que vai ser armazenado na varivel resultado_int.Elab. por eng Tatiana Kovalenko8

2008

Disciplina: PA1

5.4. Expresses lgicasPara alm dos operadores aritmticos, a linguagem Java possui tambm operadores relacionais e operadores lgicos. Estes operadores permitem a construo de expresses que tm como resultado um valor lgico, true ou false. Operadores relacionais: >, =, 5 && 4 != 3) tem como resultado true.

6. Entrada e sada de dadosOs conceitos de entrada e sada de dados so cruciais em programao. As instrues de entrada servem para obter valores do exterior do programa, por exemplo, do teclado. medida que o computador executa um programa os dados que vo sendo introduzidos so atribudos a certas variveis desse programa. Isto permite que um mesmo programa possa fazer clculos para diferentes valores de entrada sem que se altere o programa propriamente dito. Quando um computador executa um programa, chegar a resultados e que o utilizador desejar visualizar. Para isso so necessrios instrues de sada de dados,

6.1. Procedimentos de entrada (input)A linguagem de Java foi concebida essencialmente para o desenvolvimento de aplicaes para execuo em ambientes grficos, onde a entrada de dados assegurada por dilogos especializados. A leitura de dados a partir do teclado em Java demasiado complicada para ser apresentada numa fase introdutria da aprendizagem da programao. A linguagem Java suporta a entrada de dados em ambientes no grficos atravs da biblioteca System.in. Esta inclui um subprograma, System.in.read(), capaz de ler um caracter a partir do teclado. No entanto, se o dado a fornecer pelo utilizador for composto por mais do que um caracter, este programa revela-se de difcil utilizao. Tendo em conta esta dificuldade, optou-se por propor ao leitor a utilizao de um conjunto de subprogramas capazes de ler dados a partir da entrada padro. A leitura s terminada quando o utilizador pressiona a tecla . Estes subprogramas encontram-se agrupados no ficheiro Le.java, onde existe um subprograma para cada tipo de dado simples:import java.io.*; import java.awt.*; import java.awt.event.*; //Classe para ler dados de entrada (pela entrada padrao //@autor: Paulo Marques ([email protected]) public class Le { private static final int BUF_SIZE=1024; //Inibe o construtor por defeito private Le() { }

Elab. por eng Tatiana Kovalenko

9

2008

Disciplina: PA1

//Le um inteiro da entrada padrao. A entrada terminada com um ENTER. //Se a entrada nao for valida mostrada a mensagem "!!!Nao um inteiro!!!" //e o utilizador pode tentar de novo. @devolve o numero lido public static int umInt() { while(true) { try { return Integer.valueOf(umaString().trim()).intValue(); } catch(Exception e ) { System.out.println("!!! Nao um inteiro !!!");} } } //Le um double da entrada padrao. A entrada terminada com um ENTER. //Se a entrada nao for valida mostrada a mensagem "!!!Nao um double!!!" //e o utilizador pode tentar de novo. @devolve o numero lido public static double umDouble() { while(true) { try { return Double.valueOf(umaString().trim()).doubleValue(); } catch(Exception e ) { System.out.println("!!! Nao um double !!!");} } } //Le um float da entrada padrao. A entrada terminada com um ENTER. //Se a entrada nao for valida mostrada a mensagem "!!!Nao um float!!!" //e o utilizador pode tentar de novo. @devolve o numero lido public static float umFloat() { while(true) { try { return Float.valueOf(umaString().trim()).floatValue(); } catch(Exception e ) { System.out.println("!!! Nao um float !!!"); } } } //Le um String da entrada padrao. A entrada terminada com um ENTER. //Se a entrada nao for valida mostrada a mensagem "!!!Nao uma string!!!" //e o utilizador pode tentar de novo. @devolve o numero lido public static String umaString() { String s = ""; try { BufferedReader in = new BufferedReader (new InputStreamReader(System.in),1); s = in.readLine(); } catch(Exception e) {System.out.println("Error reading from the input stream"); } return s; } }

O ficheiro deve ser copiado para o directrio de trabalho. A utilizao de qualquer um destes subprogramas bastante simples. Por exemplo, para ler um valor double, basta fazer:cateto1 = Le.umDouble();

Le.umDouble() um subprograma que leva o programa a parar e a esperar que o utilizador escreva um valor real usando o teclado e o confirme coma a tecla . O valor introduzido depois armazenado na varivel cateto1 graas ao operador de atribuio (=). Visto que a execuo de qualquer destes subprogramas de leitura suspende a execuo do programa, aconselhvel fazer preceder a instruo de leitura de uma instruo de escrita que indique ao utilizador o que deve fazer.

6.2. Procedimentos de sadaA escrita para o ecr pode ser feita utilizando os mtodos (subprogramas) print ou println existentes na System.out, que conhecido como objecto de sada padro. Qualquer um destes subprogramas permite escrever no ecr, diferindo apenas no facto de o println efectuar uma mudana de linha aps a escrita, o que no acontece com o print.

Elab. por eng Tatiana Kovalenko

10

2008

Disciplina: PA1

Para que possa ser escrita uma mensagem no ecr, estes subprogramas devem receber como parmetro (argumento) a mensagem a escrever, ou seja, esta deve aparecer entre parnteses e imediatamente a seguir ao nome do subprograma. Na sua forma mais simples, a mensagem a escrever uma cadeia de caracteres e deve ser colocada entre aspas. Por exemplo, a instruo:System.out.print ("Bom dia! ");

escreve no ecr:Bom dia!

Este mesmo subprograma pode ser utilizado para escrever o valor corrente da varivel. Por exemplo:int dias = 30; Sytem.out.print (dias);

escreve no ecr:30

Tambm possvel escrever vrios elementos de uma s vez. Para isso usa-se o operador de concatenao +. Por exemplo:int dias = 30; System.out.print ("Este ms tem "+dias+" dias");

escreve:Este ms tem 30 dias

ainda possvel colocar expresses na lista de elementos a escrever. Neste caso a expresso calculada antes de escrita, embora o resultado desse clculo no seja armazenado em memria. Por exemplo:int int1 = 10, int2 = 4; System.out.print (int1+" menos "+int2+" igual a "+int1-int2);

escrever:10 menos 4 igual a 6

Mas deve ter cuidado especial no caso se a expresso incluir uma ou mais adies. Por exemplo, se no exemplo anterior substituirmos a subtraco por uma adio, vir:int int1 = 10, int2 = 4; System.out.print (int1+" mais "+int2+" igual a "+int1+int2);

o que resultar na escrita de :10 mais 4 igual a 104

Esta ambiguidade pode ser resolvida com a utilizao de parnteses:int int1 = 10, int2 = 4; System.out.print (int1+" mais "+"int2+" igual a "+(int1+int2));

que resulta em :10 mais 4 igual a 14

6.2.1. Exibindo uma nica linha de texto com mltiplas instrues As instrues:System.out.print ("S sei "); System.out.println ("que nada sei");

resultam na escrita de:S sei que nada sei

6.2.2. Exibindo linhas mltiplas de texto com nica instruo A instruo:System.out.println ("S\nsei\n\tque\n\t\tnada\n\t\t\tsei!");

resulta em:S sei que nada sei!11

Elab. por eng Tatiana Kovalenko

2008

Disciplina: PA1

Caracteres especiais: \n \t \r \\ \ nova linha tabulao horizontal retorno para o incio da linha actual. barra invertida, serve para visualizar no ecr um caractere barra invertida aspas duplas, serve para visualizar no ecr aspas duplas

7. Seleco comum que, durante a execuo de um programa, seja necessrio tomar decises em funo de valores fornecidos pelo utilizador ou de resultados previamente calculados. Este tipo de decises representado por estruturas a que se d o nome de estruturas de seleco. O Java apresenta trs variantes desta estrutura: seleco simples, seleco em alternativa e seleco mltipla.

7.1. Seleco simples. Instruo ifA seleco simples permite decidir entre executar ou no um conjunto de instrues. A deciso tomada em funo do resultado de uma condio, ou seja, uma expresso com resultado lgico, que calculada no incio da execuo da estrutura. O funcionamento deste tipo de estrutura pode ser representado pelo seguinte fluxograma: V FI

?

Como se pode observar, no incio avaliado o valor lgico da condio. Se o resultado for verdadeiro, as instrues (I) sero executadas, prosseguindo depois o programa para a execuo da instruo seguinte. Se o resultado for falso, as instrues no sero executadas, prosseguindo o programa de imediato para a instruo seguinte. A instruo de deciso if tem a seguinte sintaxe: if (condio) { instrues; } Repare-se que as chavetas delimitam as instrues a executar no caso do resultado da condio ser true. As instrues so executadas se a condio for verdadeira. Caso seja necessrio executar uma s instruo para uma condio verdadeira, as chavetas podem ser omitidas: if (condio) instruo; Exemplo: Visualizar na ordem crescente dois nmeros inteiros fornecidos pelo utilizador. O algoritmo comea por ler dois nmeros fornecidos pelo utilizador, depois verifica se o primeiro nmero introduzido maior do que o segundo e, em caso afirmativo, troca os valores. No caso de o primeiro nmero ser menor, no feita a troca.public class Troca { public static void main (String args []) { int num1, num2, temp; System.out.println("Introduza o primeiro numero: "); num1 = Le.umInt(); System.out.println("Introduza o segundo numero: "); num2 = Le.umInt();Elab. por eng Tatiana Kovalenko12

2008

Disciplina: PA1

} }

if (num1 > num2) { temp = num1; num1 = num2; num2 = temp; } System.out.println ("Numeros na ordem crescente: "+num1+" , "+num2);

Um erro comum a colocao de um ; imediatamente a seguir ao if. Por exemplo:if (v1>v2); System.out.print ("Maior= "+v1);

O ponto e vrgula interpretado pelo compilador de Java como uma instruo vazia, pelo que utilizada para separar instrues. Deste modo, se v1 for maior que v2, vai ser executada a instruo ; cujo efeito nulo. A instruo System.out.print("Maior= "+v1); vai ser sempre executada, mesmo que v1 no seja maior do que v2. Neste caso o compilador no pode detectar o erro.

7.2. Seleco em alternativa. Instruo if-elseA segunda verso de instruo if corresponde a uma estrutura de deciso com alternativa dupla. Muitas vezes interessa escolher de entre dois conjuntos de instrues qual deles deve ser executado. Esta escolha tambm ser feita em funo do resultado de uma condio. Graficamente: VI1 ?

FI2

A sintaxe de estrutura de deciso com alternativa dupla:if (condio) { conjunto de instrues1 se condio for verdadeira; } else { conjunto de instrues2 se condio for falsa; }

O conjunto de instrues1 seja executado se a condio for verdadeira. Se a condio for falsa, ser executado o conjunto de instrues2. Exemplo: Visualizar uma mensagem se o valor introduzido for par ou mpar.public class SeraParOuImpar { public static void main(String args[]) { int num; System.out.println("Escreva um numero: "); num = Le.umInt(); //Le o numero if (num % 2 == 0) System.out.println("O numero "+num+" par"); else System.out.println("O numero "+num+" impar"); } }

Claro que em cada execuo do programa, e dependendo do valor introduzido pelo utilizador, apenas uma destas instrues ser executada. Neste exemplo foi utilizada uma instruo if-else para seleccionar uma de duas alternativas. No entanto, h situaes em que h mais do que duas alternativas, de entre as quais Elab. por eng Tatiana Kovalenko13

2008

Disciplina: PA1

necessrio escolher uma delas. Neste caso as instrues if-else podem ser encadeadas de forma a possibilitar vrias alternativas, como por exemplo:if (condioA) { conjunto de instrues1 se condioA for verdadeira; } else if (condioB) { conjunto de instrues2 se condioB for verdadeira; } else { conjunto de instrues3 se condioB for falsa; }

Teoricamente no existe um limite para o encadeamento destas instrues. Tal como no caso da seleco simples, tambm no caso da seleco em alternativa se podem omitir as chavetas quando est em causa apenas a execuo de uma instruo. Exemplo: Calcular e visualizar o valor de Yy= a>300 V ab+c V ab+c_________

ab+c ab+c (a:c+b)2

, se a>300 , se a=300 , se a 300) y = a*b+c; else if (a == 300) y = Math.sqrt(a*b+c); else y = (a/c+b)*(a/c+b); System.out.println("O valor de Y= " + y); } }

Se a estrutura de deciso envolver apenas seleco em alternativa, fcil ver a que if pertence cada else, uma vez que cada um deles pertence ao if mais prximo que no tenha else. Quando o encadeamento inclui seleces simples e seleces em alternativa pode no ser to fcil perceber a que if pertence um dado else. Considere, por exemplo, a seguinte arvore de deciso:condio1 V condio2 V condio3 V FElab. por eng Tatiana Kovalenko14

F instr.C

2008

Disciplina: PA1

instr.A

instr.B

Se a condio2 for falsa, no se pretende executar qualquer instruo, pelo que esta uma seleco simples. Esta rvore de deciso pode ser implementada em Java:if (condio1) if (condio2) if (condio3) instruoA; else instruoB; else instruoC;

Existem casos quando necessrio trabalhar com o relacionamento de duas ou mais condies ao mesmo tempo na mesma instruo, efectuando desta forma testes mltiplos. Exemplo. Ler 3 valores para os lados de um tringulo. Verificar se os valores fornecidos formam realmente um tringulo. Se for esta condio verdadeira, deve ser indicado qual tipo de tringulo foi formado: issceles, escaleno ou equiltero.public class DeterminarTriangulo { public static void main(String args[]) { float a,b,c; System.out.println("Informe o 1 lado de triangulo: "); a = Le.umFloat(); System.out.println("Informe o 2 lado de triangulo: "); b = Le.umFloat(); System.out.println("Informe o 3 lado de triangulo: "); c = Le.umFloat(); if (a+b>c && b+c>a && a+c>b) if (a==b && b==c) //caso a=b=c System.out.println("Triangulo Equilatero"); else if (a==b || b==c || a==c) //caso a=b ou b=c ou a=c System.out.println("Triangulo Isosceles"); else System.out.println("Triangulo Escaleno"); //todos os lados difer. else System.out.println("Os valores fornecidos nao formam um triangulo"); } }

7.3. Seleco mltipla. Instruo switch - caseSe a escolha for feita em funo do valor de uma expresso inteira ou caracter, mais eficaz utilizar uma estrutura de seleco mltipla para o mesmo efeito. Graficamente:V1 ? I1 I2 V2 . . . . Vn outro

. . .

In

Id

Esta estrutura comea por calcular o valor da expresso que ter que ter resultado inteiro (byte, short, int ou long) ou caracter (char). Se algum dos valores V1 a Vn for igual ao resultado da expresso, as instrues correspondentes sero executadas. Sintaxe de instruo switch-case:switch { case case case (expresso ou varivel) valor1 : instrues1; break; valor2 : instrues2; break; valorN : instruesN; break;15

Elab. por eng Tatiana Kovalenko

2008

Disciplina: PA1

default

: instruesDefault; break;

} A instruo case controlada pela varivel ou expresso colocada a seguir palavra case e, de acordo com o seu valor, executa um determinado conjunto de instrues. A instruo break utilizada para promover o desvio da execuo para a linha posterior ao final de seu bloco. Exemplo: Escrever um programa que permite calcular reas das diferentes figuras geomtricas.public class AreasSwitch { public static void main(String args[]) { double a,b,h,area; char letra; System.out.print("Quer calcular area de Triangulo(T), "); System.out.println("Rectangulo(R), Trapezio(Z) ou Circulo(C)? "); letra = Le.umChar(); switch (letra) { case 'R' | 'r': //pode utilizar OR lgico (|),mas no OR dinmico (||) System.out.println("Introduza o valor da base: "); b = Le.umDouble(); System.out.println("Introduza o valor da altura: "); h = Le.umDouble(); area = b*h System.out.println("Area do rectangulo= "+ area); break; case 'T' : //essa a outra forma de permitir o uso de 'T' e 't' case 't' : System.out.println("Introduza o valor da base: "); b = Le.umDouble(); System.out.println("Introduza o valor da altura: "); h = Le.umDouble(); System.out.println("Area do triangulo= "+ b*h/2); break; case 'C' | 'c': System.out.println("Introduza o valor do raio: "); b = Le.umDouble(); area = Math.PI*b*b; System.out.println("Area do circulo= "+ area); break; case 'Z' | 'z': System.out.println("Introduza o valor da 1a base: "); a = Le.umDouble(); System.out.println("Introduza o valor da 2a base: "); b = Le.umDouble(); System.out.println("Introduza o valor da altura: "); h = Le.umDouble(); System.out.println("Area do trapezio= "+(a+b)/2*h); break; default : System.out.println("Introduziu a letra errada"); break; } } }

8. RepetioEm todos os programas que encontrmos at agora, cada instruo era executada uma nica vez, pela mesma ordem em que aparecia no programa. No entanto, a maioria dos programas que tm interesse prtico incluem estruturas repetitivas. Por exemplo, no caso de se pretender criar uma pequena agenda de telefones, seria necessrio ler dados de cada pessoa (nome, morada e nmero de telefone). Isto poderia ser feito atravs de trs instrues de leitura. Se pretender ler dados das 30 pessoas, 90 instrues de leitura sero necessrias. A situao poderia ser ainda mais complicada se o nmero de pessoas no fosse conhecido partida. Uma forma eficaz de resolver este problema a utilizao de uma estrutura que se encarregue de fazer repetir as instrues que permitem ler os dados de umaElab. por eng Tatiana Kovalenko16

2008

Disciplina: PA1

pessoa tantas vezes quantas as pessoas envolvidas. Estas estruturas so denominadas por estruturas repetitivas ou ciclos.

8.1. Ciclo whileQuando no sabemos quantas vezes deve se fazer a repetio utilizam-se os ciclos while e do...while. O critrio de execuo ou paragem destes ciclos depende de uma condio, que ser testada antes ou depois de cada execuo de ciclo. O ciclo while faz o teste primeiro e executa as instrues depois, caso a condio for verdadeira.

?

F V

I

Como se pode observar, o primeiro passo o clculo da condio. Se o resultado for verdadeiro, as instrues (I) so executadas, seguindo-se um novo clculo da condio. Se esta se mantiver verdadeira, as instrues so de novo executadas e a condio calculada. Quando a condio tiver resultado falso, o ciclo terminar, prosseguindo a execuo do programa na instruo seguinte ao ciclo. Sintaxe da instruo while:inicializao; while (condio) { instrues; aco; } //da varivel que controla a quantidade de repeties //executadas apenas enquanto condio for verdadeira //incrementao ou decrem. da varivel de controle

Exemplo: Calcular a mdia de N nmeros inteiros positivos fornecidos pelo utilizador.public class MediaN_Numeros1 { public static void main (String args[]) { //Declarao de variveis float media, soma = 0; int quant, num; int contador = 0; //inicializao da varivel de controle de repeties System.out.println("Quantos numeros pretende introduzir? "); quant = Le.umInt(); while (contador < quant) { System.out.println("Intr. proximo numero: "); num = Le.umInt(); soma += num; contador ++; //aco, i.e. incrementao da varivel de controle } media = soma / quant; System.out.println("A media dos "+quant+" numeros = "+media); } }

Note-se que, devido ao facto de a condio boleana ser testada antes, o conjunto de instrues pode nunca vir a ser executado. Isto acontece se o resultado da condio for false logo no incio.

Elab. por eng Tatiana Kovalenko

17

2008

Disciplina: PA1

Um cuidado muito importante que o programador deve ter ao programar um ciclo criar as condies para que o mesmo possa terminar. Para isso, entre as instrues a repetir ter que haver pelo menos uma que, numa dada circunstncia, altere o valor de uma ou mais das variveis que integram a condio que controla o ciclo, por forma a que a mesma passe a ter resultado false e, consequentemente, o ciclo possa terminar.

8.2. Ciclo do...whileAo contrrio do ciclo while, o ciclo do...while primeiro executa as instrues e depois faz o teste. Caso a condio for verdadeira o ciclo repete-se. A instruo do...while comanda um conjunto de outras instrues at que, uma determinada condio seja verdadeira:

Sintaxe da instruo do...while:inicializao; do { intrues; aco; } while (condio);

I V F

?

Notar que, devido ao facto de a condio apenas ser testada no fim, o conjunto de instrues executado pelo menos uma vez. O exemplo anterior pode ser feito com a utilizao do ciclo do...while:public class MediaN_Numeros2 { public static void main (String args[]) { float media, soma = 0; int quant, num; int contador = 0; //inicializao da varivel de controle de repeties System.out.println("Quantos numeros pretende introduzir (>0) ? "); quant = Le.umInt(); do { System.out.println("Intr. proximo numero: "); num = Le.umInt(); soma += num; contador ++; //aco, i.e. incrementao da varivel de controle } while(contador < quant); media = soma / quant; System.out.println("A media dos "+quant+" numeros = "+ media);

} }

Uma das utilizaes mais comuns deste tipo de repetio a validao de dados fornecidos pelo utilizador. Exemplo: Pretende se introduzir numero de horas trabalhadas, sabendo que os valores podem variar de 0 a 12. No caso contrrio deve aparecer um aviso de erro e pedido de repetir a entrada do valor.public class ValidarHorasTrab { public static void main (String args []) { byte h; do { System.out.print("Intr. a quantidade de horas trabalhadas: "); h = Le.umByte(); if (h < 0 || h > 12) System.out.println("Numero introduzido invalido! Tente de novo!"); } while (h < 0 || h > 12); System.out.println("Horas trabalhadas: "+ h); }Elab. por eng Tatiana Kovalenko18

2008

Disciplina: PA1

}

J podemos elaborar um menu que permite escolher uma ou mais opes ou terminar o programa.public class MenuSimples { public static void main (String args[]) { int op; do // Repete at escolher opo 3 (sair) { do { System.out.println ("Qual a tua opo? "); System.out.println ("1 - Mensagem de boas vindas"); System.out.println ("2 Ler valor"); System.out.println ("3 - Sair"); op = Le.umInt (); } while (op < 1 || op > 3); switch (op) { case 1: System.out.println (); System.out.println ("Ola! Bem vindo!"); System.out.println (); break; case 2: System.out.println ("Intr.um valor inteiro: "); int n = Le.umInt(); System.out.println ("O valor introduzido = " + n); break; } } while (op != 3); } }

8.3. Ciclo forO ciclo for uma estrutura de repetio compacta. Seus elementos de inicializao, condio e aco so reunidos em forma de um cabealho. Quando se pretende que um conjunto de instrues se repita um nmero de vezes bem especfico, utiliza-se o ciclo for, cuja sintaxe seguinte:for (inicializao; condio; aco) { instrues; }

O funcionamento desta instruo controlado pela inicializao, pela condio e pela aco. Estas trs componentes so separadas por um ponto e vrgula, enquanto que a condio uma expresso com resultado lgico. Estas trs componentes tm a seguinte funo na dinmica da repetio: inicializao executada apenas uma vez logo no incio do ciclo. Serve normalmente para inicializar a varivel que vai controlar o nmero de vezes que as instrues vo ser repetidas; condio calculada antes de cada execuo das instrues. Se o seu resultado for verdadeiro, as instrues so executadas, se for falso, o ciclo termina; aco executada automaticamente em cada iterao aps as instrues do ciclo. Normalmente serve para calcular o novo valor da varivel de controlo (usualmente a aco uma incrementao ou decrementao da varivel de controlo). Pr-incrementar e ps incrementar tem o mesmo efeito na expresso de incremento. Exemplos com a estrutura for: 1). a varivel de controle varia de 1 a 100 em incrementos de 1:for (int i = 1; i = 2; i-=2)

3). permite somar todos os inteiros pares de 2 a 100:for (int num = 2; num 0"); } while (q