nível 05/05/2015 Programação para GI Aula 08 Java é uma linguagem de programação orientada a objetos (POO). O objetivo desta aula é escrever programas em Java organizando o código em subprogramas (funções) sem nos preocupar ainda em explorar os recursos do paradigma de POO. Programação Orientada a Objectos Programação Estruturada Programação Procedural Encapsula dados (atributos) e subprogramas (métodos) em componentes (classes). Organiza o código em subprogramas, contendo: estruturas sequenciais, condicionais e de repetição. Programação por comandos ou ordens, ou seja, imperativa e que modifica variáveis. 2 1
Em Java existe um subprograma principal chamado main que marca o início da execução do programa Em aulas anteriores dentro do subprograma main chamamos a diferentes subprogramas pré-definidos ex: os subprogramas do pacote java.lang ou java.util Exemplo: o seguinte programa usa o subprograma abs da classe Math do pacote java.lang para calcular o valor absoluto de um número. 3 Podemos também definir os nossos próprios subprogramas e usá-los tal como usamos o subprograma/função Math.abs. 4 2
tipo do valor de retorno nome da função O corpo da função é uma espécie de mini-programa onde podemos declarar variáveis e usar quaisquer instrução elementar como instruções de atribuição, decisão e repetição. public static int fatorial(int n ) { int i,p; p = 1; for ( i=2; i<=n; i++ ) p = p * i; return p; valor de retorno parâmetro Um subprograma é comparável a uma caixa preta que recebe dados e produz resultados. A função fatorial recebe um valor inteiro n e devolve um outro valor inteiro que é o fatorial de n. Entrada n Fatorial Saída n! 5 Exemplo public static double max( double x, double y ) { if ( x > y ) return x; else return y; os parâmetros estão separados por vírgula e precedidos pelo tipo. Se não existirem parâmetros de entrada usamos apenas () public static double max3 ( double x, double y, double z ) { return max( x, max(y,z) ); A função max3 usa a função max para determinar o máximo entre dois números 6 3
Exemplo O conceito de função em Java é mais geral que as funções matemáticas. Em Java podemos definir funções que não retornam nenhum valor. Para isto usamos a palavra reservada void como tipo do valor de retorno. Esta função não retorna nenhum valor. Simplesmente executa uma instrução de atribuição public class Ex_6_4_par { int x = 70; muda(x); println( x = " + x ); public static void muda( int valor) { valor = 20; 7 Organização de um Programa Java Um programa é constituído por uma classe e contêm: Declarações de variáveis (globais) Um subprograma principal chamado main() Um conjunto de subprogramas definidos pelo programador Cada subprograma contém: Declarações de variáveis (locais) Instruções elementares (atribuição, seleção, repetição, etc.) Chamadas de subprogramas pré-definidos ou criados pelo programador 8 4
Exemplo de um programa em três subprogramas Este programa escreve os números inteiros entre 1 e um número n fornecido pelo usuário. A função principal main chama duas funções: a função lertotalnumeros e a função escrevernumeros. A palavra reservada void indica que esta função não retorna nenhum valor. Import java.util.scanner; public class Ex_6_5_imprimirNumeros { int n = lertotalnumeros(); escrevernumeros(n); public static int lertotalnumeros() { int n;... do System.out.print ( Quantos números vai imprimir? "); n = in.nextint(); while (n <=0); return n; public static void escrevernumeros (int n){ for (int i=1; i<=n; i++) System.out.print(4, i); 9 Exemplo de um programa em três subprogramas Esta variável n é uma variável local ao subprograma main e apesar de ter o mesmo nome, não tem nada que ver com a variável n declarada em lertotalnumeros, pois estão em funções diferentes. Esta variável n é uma variável local ao subprograma lertotalnumeros Import java.util.scanner; public class Ex_6_5_imprimirNumeros { int n = lertotalnumeros(); escrevernumeros(n); public static int lertotalnumeros() { int n;... do System.out.print ( Quantos números vai imprimir? "); n = in.nextint(); while (n <=0); return n; public static void escrevernumeros (int n){ for (int i=1; i<=n; i++) System.out.print(4, i); 10 5
Variáveis Locais em O resultado da execução é o seguinte: n = 5 antes da chamada n =10 dentro de muda n=5 depois da chamada public class Ex_6_6_variaveisLocais { int n = 5; // variável local ao subprograma main System.out.print ( n= + n + antes da chamada ); muda( ); System.out.print ( n= + n + após chamada ); public static void muda() { int n = 10; // variável local ao subprograma muda System.out.print ( n= + n + dentro de muda ); 11 Variáveis Globais em As variáveis declaradas fora de qualquer subprograma são chamadas variáveis globais. São criadas no início da execução do programa, só sendo destruídas quando o programa termina. Esta variável global aqui declarada é visível a partir de qualquer subprograma O resultado da execução é o seguinte: n = 5 antes da chamada n =10 dentro de muda n=10 depois da chamada public class Ex_6_7_variaveisGlobais { static int n // variável global declarada no inicio n = 5; System.out.print ( n= + n + antes da chamada ); muda( ); System.out.print ( n= + n + após chamada ); public static void muda() { n =10; System.out.print( n= + n + dentro de muda ); 12 6
Esquema de public class Exemplo { // declaração de variáveis globais // declaração de variáveis locais // instruções elementares e/ou chamadas de subprogramas // fecha subprograma main public static tipo_valor_retorno_ou_void nome-da-função_1 (parametros) { // declaração de variáveis locais; // instruções elementares e/ou chamadas de subprogramas incluindo // o comando return se tipo_valor_retorno não é void // fecha subprograma nome_da_função_1. public static tipo_valor_retorno_ou_void nome-da-função_n (parametros) { // declaração de variáveis locais; // instruções elementares e/ou chamadas de subprogramas incluindo // o comando return se tipo_valor_do_retorno não é void // fecha subprograma nome_da_função_n // fecha programa 13 Decomposição Em aulas anteriores foram desenvolvidos programas com um estilo de programação receita de bolo. Os programas estavam compostos por um único subprograma o subprograma main que podia ser executado passo a passo. A partir de agora vamos a decompor um programa em subprogramas segundo a seguinte metodologia: cada operação do algoritmo de primeiro nível deve ser implementada com um subprograma, sendo depois o programa principal (main) constituído pela invocação dos subprogramas. 14 7
Decomposição Os programas ficam mais legíveis e claros Os programas ficam mais fáceis de modificar e depurar Os programas não repetem instruções que fazem basicamente a mesma coisa 15 Exemplo de Converter Milhas para KM Formulação do problema: ler uma distância expressa em milhas a partir do teclado, convertê-la para quilómetros e apresentar o resultado na tela. Variável de entrada: Variável de saída: MILHAS (distância expressa em milhas) valor numérico positivo ou nulo KM (distância expressa em quilómetros) valor numérico positivo ou nulo Solução: KM = 1.6093 x MILHAS 16 8
Exemplo de Converter Milhas para KM Nome: Conversão de distâncias em milhas para km { Algoritmo (decomposição ao nível 1) lermilhas converter imprimir Leitura e validação de uma distância em milhas (MILHAS); Conversão da distância de milhas para km (MILHAS, KM); Impressão da distância em km (KM); Nome da Função Parâmetros (entrada) Tipo do valor de retorno lermilhas nenhum double converter double milhas double imprimir double km void (nenhum) 17 Exemplo de Converter Milhas para KM main leitura Import java.util.scanner; public class Pr_6_1_MilhasAkm { double milhas, km; milhas = lermilhas(); km = converter(milhas); imprimir(km); public static double lermilhas() { double milhas;... do milhas = in.nextdouble(); while (milhas <=0); return milhas; 18 9
Exemplo de Converter Milhas para KM converter imprimir public static double converter(double milhas) { double km; km = 1.6093 * milhas; return(km); public static void imprimir(double km) { System.out.println( Distância em kms= + km ); 19 Bibliografia Material da Professora Gladys: http://sweet.ua.pt/gladys/java/ Forbellone, André Luiz Villar, and Henri Frederico Eberspächer. Lógica de programação: a construção de algoritmos e estruturas de dados. Vol. 3. Makron Books, 1993. 20 10