Instituto Superior de Engenharia de Lisboa Licenciatura em Engenharia de Electrónica e Telecomunicações e de Computadores 2ª Lista de exercícios de PROGRAMAÇÃO Semestre de Inverno 2013-2014 (Outubro 2013) 1. Elabore o programa que lê do teclado sequência de números inteiros terminada por um carácter não digito e calcule: 1.1 Quantos números foram lidos; 1.2 Quantos destes são são negativos e quantos são positivos 1.3 Total de mudanças de sinal de número positivo para número negativo; 1.4 Quantos números têm a maior subsequência crescente; 1.5 Qual é o maior e em que posição se encontra. import java.util.Scanner; public class SequenciaNumeros{ public static void main( String[] args ){ Scanner teclado = new Scanner(System.in); int c = 0; //conta o total de de numeros lidos do teclado int cNeg = 0;//contagem dos numeros negativos int nAnt,n; //nAnt=nº anterior e n=nº corrente while( teclado.hasNextInt() ){// pára logo ao 1º carácter não digito n=teclado.nextInt(); // if( n<0 ){ cNeg++; } /*Falta completar !!!!!! */ c++; }//fim do while System.out.println("Foram digitados no total"+c+" numeros"); System.out.println("Foram digitados "+cNeg+" negativos"); System.out.println("Foram digitados "+(c-cNeg)+" positivos"); } } 2. Elabore um programa que leia do standard input dois valores n1,n2 inteiros e calcula a multiplicação pelo processo da ”soma russa”. Este processo está descrito em: http://www.eb23-guifoes.rcts.pt/NetMate/sitio/curiosidades.htm#Multiplicação%20russa Exemplificado através da figura seguinte para a multiplicação entre 71 e 43 3. Diga qual é o objectivo da seguinte definição do método java e quais os resultados das suas chamadas: public static boolean p( int n ){ //Oito chamadas de p(.. e seus resultados int r=3; boolean r0 = p(2); //dá true if( n==2 ) return true; boolean r0 = p(5); //dá true if( n<=1 || n%2==0 ) return false; boolean r0 = p(7); //dá true while( (r*r)<=n ){//r<=Math.sqrt(n) boolean r0 = p(9); //dá false if( n%r == 0 ) return false; boolean r1 = p(25); //dá false ++r; boolean r2 = p(13); //dá true } boolean r0 = p(23); //dá true return true; boolean r3 = p(113);//dá true } 4. Estudo a seguinte o seguinte código e diga quais os valores que são escritos no ecrã. Este código chama o método p(… definido anteriormente. dentro do for(;;) System.out.println("Tabela de números"); int ct=1; System.out.print(" "+2+" "); for( int i=3; ct<10; i +=2 ){ if( p(i) ) { System.out.print( (i<10? " ": (i<100? " ":"") ) + i +" "); ct++; if( ct%5==0 ) System.out.println();// } } System.out.println(); 5. Elabore um programa que leia do standard input dois valores n1, n2 positivos e calcula se esses dois números lidos são ”amigos”, se o forem então escreva essa mensagem em standard output ou ”não amigos” em caso contrário. Diz-se que dois números são amigos se cada um deles é igual à soma dos divisores próprios do outro. Os divisores próprios de um número positivo n são todos os divisores inteiros positivos excepto o próprio n. Um exemplo de números amigos são os números 284 e o 220, uma vez que a soma dos divisores de 220 dá 284 e vice-versa, como se mostra em: Divisores de 220-> 1 + 2 + 4 + 5 + 10 + 11 + 20 + 22 + 44 + 55 + 110 = 284 Divisores de 284-> 1 + 2 + 4 + 71 + 142 = 220 6. Elabore um programa que leia do standard input um valor n positivo maior que 2 que faz a geração em standard output dos n valores da sequência dos números de Tribonnaci. Um número Tribonnaci de uma dada sequência é dado pela soma dos 3 anteriores, ou seja, o termo t(i) dessa sequência é dado por t(i) = t(i-1) + t(i-2) + t(i-3), sendo os 3 primeiros termos da sequência prédefinidos com 0, 2, 2. Se n=3 o output será 0, 2, 2, se n=6 o ouput será: 0, 2, 2, 4, 8, 14. 7. Elabore um programa que lê do teclado um valor inteiro longo n e calcule: a. Quantos algarismos têm. b. Qual é o maior algarismo e em que posição significativa se encontra (a unidade é posição 0, a dezenas é posição 1 e assim sucessivamente ….). c. Somar todos os algarismos entre si. d. Inverter os algarismos do número, ou seja, a unidade troca com o algarismo mais significativo e assim sucessivamente; (exemplo: 7523 para 3257). e. Formar dois novos números com os algarismos do nº lido em que o primeiro só contém os algarismos pares e o segundo só contém os algarismos ímpares. import java.util.Scanner; public class AnalizarNumero{ public static void main( String[] args ){ Scanner teclado = new Scanner(System.in); System.out.println("digite o valor inteiro longo "); long n = teclado.nextLong(); /* Completar com código java tal que concretize o exercício proposto */ } } 8. Elabore o programa onde deve definir os métodos referidos em 9. 10. 11. para que os possa chamar e testar dentro da função main. Escreva os resultados no ecrã (console output). Use o critério de definir e testar um método de cada vez até concluir todos. 9. Elabore um método que recebe em parâmetro dois inteiros e calcula e devolve o máximo divisor comum entre esses dois números. Ver detalhes em: http://pt.wikipedia.org/wiki/M%C3%A1ximo_divisor_comum 10. Elabore um método que recebe em parâmetro dois inteiros e calcula e devolve o menor múltiplo comum entre esses dois números. Ver detalhes em: http://pt.wikipedia.org/wiki/M%C3%ADnimo_m%C3%BAltiplo_comum 11. Elabore um método que recebe em parâmetro um inteiro e verifica se é ou não número capicua, devolvendo true ou false respectivamente. Ver detalhes em: http://pt.wikipedia.org/wiki/Capicua 12. Elabore um programa que gera o “Pinheiro de Natal” (fig.abaixo). O mesmo programa deve ser estruturado em termos de métodos. Vamos dar uma ajuda, escrevendo o código java do main. public class Lista2Exer12PinheiroNatal{ /** Definir todos os métodos chamados em main. Poderá caso considere necessário definir outros métodos que ajudam à resolução. */ public static void main( String[] args ){ int alt = ler("Altura do triangulo entre[3,7] "); fazTriangulo(alt);//a base=alt*2-1 fazTriangulo(alt); fazTriangulo(alt); FazPe(alt); //a largura=(alt*2-1)-4 } } //Exemplo para o Triângulo: altura=5 e base=altura*2-1 //a altura Pé=altura Triangulo e largura Pé=base-4 * *** ***** ******* ********* * *** ***** ******* ********* * *** ***** ******* ********* ***** ***** ***** ***** ***** 13. Elabore um programa que gera uma tabela dos primeiros 200 números primos, em que deve colocar 16 em cada linha e todos alinhados à direita em colunas. O programa deve ser estruturado em termos de métodos. Use o método definido em 3. 2 59 3 61 5 67 7 71 11 73 13 79 17 83 19 89 23 29 31 37 41 43 47 53 97 101 103 107 109 113 127 131