Faculdade de Ciências ‐ Universidade Agostinho Neto Departamento de Matemática e Engenharia Geográfica Ciências da Computação Programação II Segunda Parte Adaptado de um original dos docentes de ISCTE Objectivos Os alunos no final desta lista dos exercicios deverão conhecer: 1. 2. 3. 4. A estrutura básica de programas em Java. O conceito de variável. Os tipos primitivos em Java. Procedimentos simples para leitura do teclado e escrita no ecrã. Os alunos no final desta aula deverão ser capazes de: 1. Desenvolver programas simples com o Eclipse e as ferramentas de desenvolvimento do J2SE. Caso os alunos sintam que os objectivos não foram atingidos na totalidade deverão repetir a aula autonomamente ou recorrer aos horários de dúvidas. Resumo Variáveis: • • • Servem para guardar informação Têm sempre tipo*, nome e valor Têm que ser declaradas (associadas a um tipo) e inicializadas (sendo-lhes atribuído um valor) o exemplo abaixo declara a variável um_número como do tipo inteiro e em seguida inicializa-a com o valor 12, o que se poderia traduzir em Java por: int um_número = 12; Em seguida exemplifica-se a declaração e inicialização de uma variável booleana: boolean encontrado = false; * Tipos Primitivos: • • • • char – um caracter; int – número inteiro; float ou double – número decimal; boolean – verdadeiro ou falso; Outros tipos de dados: • • Tipos definidos na biblioteca do Java (e.g. Object, String); Tipos definidos pelo utilizador; Operadores lógicos: • • • && (e) || (ou) ! (negação) Operadores aritméticos: • • • • • • • • • • • x x x x x x x x x x x < y (x menor que y?), > y (x maior que y?), <= y (x menor ou igual a y?), >= y (x maior ou igual a y?), == y (x é igual a y?), != y (x é diferente de y?) = y (x passa a ter o valor de y) / y (resultado da divisão de x por y) % y (resto da divisão de x por y) + y (soma de x e y) – y (subtracção de x e y) Operadores de incrementação e decrementação (prefixos e sufixos): • • ++ (p.e., ++x ou x++ que equivale a x = x + 1; depois veremos diferenças) -- (p.e., --x ou x-- ) Expressões: Combinam variáveis, valores literais e operadores produzindo um valor Variáveis e operadores (Exemplos de expressões, com variáveis declaradas e inicializadas com valores): • • • • • char a = ‘z’; int x = 45 + 23; int y = x + 1; String nome = “Introdução à Programação”; boolean b = (x >= 0 && x <= 10); Conversões entre tipos de dados: tipo_destino variável_destino = (tipo_destino)variável_original; Conversões possíveis actualmente • • caracteres (char) <-> números inteiros (int) números decimais (float, double) <-> números inteiros (int) Exemplos de aplicação de conversões: // se considerarmos int i = 65; char c = 'a'; System.out.println(" "+i+“,"+(char)i+“,"+(float)i+" "); System.out.println(" "+c+“,"+(int)c+“,"+(float)c+" ") // as instruções acima resultarão em: Instruções de selecção (if): Servem para indicar em que condições um conjunto de instruções é executado ou não: (condição) { // Guarda instruções_1; // instruções executadas quando a condição é verdadeira } else { instruções_2; // instruções executadas quando a condição é falsa } if Exemplo de utilização da instrução 'if' para calcular se um número está entre 0 e 10 int x = Teclado.intLido(); if (x >= 0 && x <= 10) { System.out.println(“x está entre 0 e 10”); } else { System.out.println(“x não está entre 0 e 10”); } Exercício 1 a) Execute o seguinte código e interprete o resultado System.out.println("Caracteres: " + (char)73 + (char)80); System.out.println("Codigos: " + (int)'I' + " " + (int)'P'); char letra_actual = 'A'; char fora_alfabeto = (char) ( (int)'Z' + 1 ); do { System.out.print(letra_actual); letra_actual = (char) ((int)letra_actual + 1); } while ( letra_actual != fora_alfabeto ); System.out.println(); b) Execute o seguinte código e interprete o resultado. Experimente com os números 5 e 10. Scanner teclado = new Scanner( System.in ); int a = 2147483640; int b; int soma; System.out.print("Diga um número:"); b = teclado.nextInt(); soma = a + b; System.out.println("Soma: = " + soma ); c) Verifique o resultado produzido pelo código anterior quando substitui int por float ou por double. Para imprimir um número decimal (x) de modo a ver todas as casas decimais, use: System.out.printf("%10.0f\n", (float)x); ou System.out.format("%10.0f\n", (float)x); ou (último recurso, para versões mais antigas da máquina virtual Java) System.out.printf("%10.0f\n", (new Object[1])[0] = new Float(x)); d) Faça um programa que dado um número indique se ele é "zero", "positivo" ou "negativo". No caso de ser positivo deve também indicar se é da ordem das dezenas (10.. 99), das centenas (100..999). Utilize a instrução de selecção if para esse efeito: if ( condição ) { instruções_se_verdade; } else { instruções_se_falso; } Exercício 2 a) Pretende-se escrever um programa que solicita ao utilizador o código Unicode de um caractere representável no ecrã (ou seja, um inteiro entre 33 e 127) e imprime no ecrã o caractere correspondente a esse código. Lembre-se que ao atribuir um valor inteiro a uma variável do tipo char este é "transformado" no caractere correspondente do código em uso (neste caso Unicode). Os códigos abaixo do número 33 representam caracteres de controlo e a sua impressão no ecrã poderá dar origem a "coisas estranhas". Os caracteres acima do 127 são específicos das várias línguas (incluindo caracteres árabes, chineses, etc.) o que poderá originar o aparecimento de sinais estranhos no ecrã, por isso não os iremos tentar imprimir. b) Modifique o seu código de forma a validar o código introduzido, de forma a evitar caracteres não representáveis Exercício 3 a) Modifique o código do exercício 1.b) para ler dois números inteiros e calcular os seguintes resultados: subtracção de a por b: a - b divisão de a por b: a / b resto da divisão de a por b: a % b multiplicação de a por b: a * b Exercício 4 a) Escreva um programa que peça ao utilizador a idade de uma pessoa e escreva no ecrã a sua faixa etária. As faixas etárias são: • • • • dos 0 aos 14 anos: criança dos 15 aos 17: adolescente dos 18 aos 65: adulto a partir dos 65: idoso b) Altere o seu programa para que receba o ano de nascimento em vez da idade. c) Altere o seu programa para validar o ano de nascimento, que deve estar entre 1850 e o ano actual. Caso não esteja deve emitir uma mensagem de erro ("ano inválido") em vez da faixa etária. d) Altere o programa para emitir mensagens diferentes caso o ano seja abaixo de 1850 ou acima do ano corrente. Exercício 5 a) Escreva um programa que mostre o número de dias de um mês num determinado ano. Quer o mês quer o ano são dados pelo utilizador (o utilizador deve introduzir uma maior do que 1752). Os anos bissextos são: • • todos os múltiplos de 400, os anos múltiplos de 4 excepto se forem múltiplos de 100. (esta regra só é válida para datas ocidentais em geral após de 1752, embora em Portugal o calendário Gregoriano tenha sido adoptado desde 1582). Verifique que são bissextos os anos: • • • • • • 1996 2000 2004 2008 2400 2800 Verifique que não são bissextos os anos: • • • • • • • • 1800 1900 2001 2002 2003 2005 2006 2200 b) Sabendo que a fórmula para calcular o dia da semana (chamada congruência de Zeller) dada uma data é a seguinte: (d + 26(m+1)/10 + k + k/4 + J/4 + 5J) % 7 em que: • • d é o dia do mês, m é o mês (Janeiro e Fevereiro contam como os meses 13 e 14 do ano anterior), i.e. se o mês for menor que três é necessário somar 12 ao mês e subtrair 1 ao ano. • • J é o século (igual a ano/100) e k é o ano deste século (ou ano % século). O resultado será 0 para Sábado, 1 para Domingo, 2 para Segunda, etc. até 6 para Sexta. Crie um programa que dada uma data, escreva no ecrã o número correspondente ao dia da semana a que esta se refere. Se quiser completar o seu programa para escrever o dia da semana por extenso, pode usar a seguinte estratégia: final String[] nomes_dos_dias = {"Sábado", "Domingo", "Segunda", ... , "Sexta"}; System.out.println("Dia por extenso: " + nomes_dos_dias[dia]); Nota: esta regra só é válida para datas ocidentais em geral após de 1752, embora em Portugal o calendário Gregoriano tenha sido adoptado desde 1582.