Lista de Exercícios 1¶
(Exercícios do professor André Santanchè.)
Estruturas de Programação¶
1. Escreva um programa que carregue dois valores A e B pelo teclado e imprima todos os números ímpares entre A e B.
//Importando a classe Scanner:
import java.util.Scanner;
int A, B;
//Instanciando e criando um objeto Scanner:
Scanner entrada = new Scanner(System.in);
System.out.println("Digite um valor: ");
A = entrada.nextInt();
System.out.println("Digite outro valor: ");
B = entrada.nextInt();
System.out.println("Os números ímpares entre "+A+" e "+B+" são: ");
if(A%2==0)
A+=1;
else
A+=2;
if(B>A)
while(B>A){
System.out.print(A+" ");
A+=2;
}
else System.out.println("Nenhum.");
2. Escreva um programa que leia o nome e salário atual de um funcionário. O programa deve calcular seu novo salário (segundo a tabela abaixo) e mostrar o nome, o salário atual e o salário reajustado do funcionário:
Faixa salarial | --- | Acréscimo |
---|---|---|
acima de | até | --- |
--- | 150 | 25% |
150 | 300 | 20% |
300 | 600 | 15% |
600 | --- | 10% |
- repita o processo acima até que seja digitado FIM no lugar do nome do funcionário;
- mostrar ao final do programa a soma dos salários atuais, a soma dos salários reajustados e a diferença entre eles.
//Importando a classe Scanner:
import java.util.Scanner;
String nome;
double salario, sAjustado, somaS = 0f, somaSAjustados = 0f;
//Instanciando e criando um objeto Scanner:
Scanner entrada = new Scanner(System.in);
while(true){
System.out.println("Digite o nome do funcionário: ");
nome = entrada.next();
if(nome.equalsIgnoreCase("FIM"))
break;
System.out.println("Digite o salário do funcionário: ");
salario = entrada.nextDouble();
somaS += salario;
if(salario<600)
if(salario<=300)
if(salario<=150)
sAjustado = salario*1.25;
else sAjustado = salario*1.20;
else sAjustado = salario*1.15;
else sAjustado = salario*1.10;
somaSAjustados += sAjustado;
System.out.println(nome+", salário atual: "+salario+", salário ajustado: "+sAjustado);
}
System.out.println("Soma dos salários atuais: "+somaS+", soma dos salários ajustados: "
+somaSAjustados+". Diferença: "+(somaSAjustados-somaS)+".");
3. Escreva um programa que leia um número inteiro e mostre a sua conversão em binário.
//Importando a classe Scanner:
import java.util.Scanner;
int n, numero;
String b="";
//Instanciando e criando um objeto Scanner:
Scanner entrada = new Scanner(System.in);
System.out.println("Digite um número inteiro: ");
n = numero = entrada.nextInt();
while(n > 0){
if(n%2==0)
b="0"+b;
else
b="1"+b;
n = n/2;
}
System.out.println("A conversão de "+numero+" para binário é: "+b);
4. Os números de Fibonacci formam uma sequência em que cada número é igual à soma dos dois anteriores. Os dois primeiros números são, por definição igual a 1, segundo o exemplo abaixo:
Ex: 1 1 2 3 5 8 13 ...
- Escreva um programa que carregue um carregue um número inteiro pelo teclado e indique se ele faz parte da sequência de Fibonacci.
//Importando a classe Scanner:
import java.util.Scanner;
int numero, nFibonacci = 1, nAnterior = 0, aux;
boolean faz = false;
//Instanciando e criando um objeto Scanner:
Scanner entrada = new Scanner(System.in);
System.out.println("Digite um número inteiro: ");
numero = entrada.nextInt();
if(numero == 1)
faz = true;
else
while(numero > nFibonacci){
faz = ((nFibonacci+nAnterior) == numero);
aux = nFibonacci;
nFibonacci+=nAnterior;
nAnterior = aux;
}
System.out.println("O número "+numero+(faz?"":" não")+" faz parte da sequência de Fibonacci.");
5. Escreva um programa que determine se uma cadeia de caracteres é um palíndromo ou não. Um palíndromo é uma cadeia que é igual à sua inversa.
//Importando a classe Scanner:
import java.util.Scanner;
String palavra;
boolean ehPalindromo = true;
//Instanciando e criando um objeto Scanner:
Scanner entrada = new Scanner(System.in);
System.out.println("Digite uma cadeia de caracteres: ");
palavra = entrada.next();
int j = palavra.length();
for (int i=0; i<j/2 && ehPalindromo; i++) {
ehPalindromo = (palavra.charAt(i)==palavra.charAt(j-i-1));
}
System.out.println("A sequência "+palavra+(ehPalindromo?"":" não")+" é palíndromo.");
Funções¶
6. Escreva um módulo para calcular as raízes de uma equação de 2° grau. O módulo recebe as constantes A, B e C da equação como parâmetro e retorna três valores: 2 raízes e um STATUS, seguindo os critérios:
- se houverem duas raízes retorna status 2;
- se houver uma raiz apenas retorna status 1 e um dos parâmetros de raiz igual a 0;
- se não houverem raízes retorna status 0 e os dois parâmetros de raiz igual a 0.
import java.lang.Math;
public double[] raizesEq2Grau(double a, double b, double c){
double status = 2, x1 = 0, x2 = 0;
double delta = (b*b)+((-4)*(a)*(c));
if(a!=0 && delta>=0){
x1 = (-b + Math.sqrt(delta)) / ( 2*a );
x2 = (-b - Math.sqrt(delta)) / ( 2*a );
if(x1 == x2){
status=1;
x2=0;
}
}else
status = 0;
return new double[]{status, x1, x2};
}
//Utilização
double resultado[] = raizesEq2Grau(1,-2,-3);
for (double i : resultado)
System.out.print(i + ", ");
7. Escreva um programa que carregue um número inteiro e indique se ele é um número primo, para isto deve ser usado um módulo que recebe como parâmetro o número e retorna verdadeiro se ele for primo e falso caso contrário.
- carregue um valor inteiro N pelo teclado e imprima os N primeiros números primos
//Importando a classe Scanner:
import java.util.Scanner;
public boolean ehPrimo(int n){
if(n==2)
return true;
if(n%2==0)
return false;
for(int i=3;i*i<=n;i+=2)
if(n%i==0)
return false;
return true;
}
int n;
//Instanciando e criando um objeto Scanner:
Scanner entrada = new Scanner(System.in);
System.out.println("Digite um número inteiro:");
n = entrada.nextInt();
System.out.println("O número "+n+(ehPrimo(n)?"":" não")+" é primo.");
//Imprimir os N primeiros números primos:
System.out.println("Quantos números primos quer?");
n = entrada.nextInt();
int encontrados = 0, i = 1;
while(encontrados<n){
if(ehPrimo(++i)){
System.out.print(i+" ");
encontrados++;
}
}
8. Um observador situado no solo e utilizando um aparelho de levantamento topográfico consegue determinar a distância $D$ e o ângulo $A$ do cume de uma montanha em relação à sua localização (observador). Faça um programa para determinar a altura da montanha ($altura$) em relação ao solo e a sua distância horizontal ($dHor$), dados $D$ e $A$. As expressões necessárias para a solução do problema são: $$dHor = D \times cos(A)$$ $$altura = \sqrt[]{D^{2} − dHor^{2}}$$ Apesar do Java possuir função co-seno pré-definida, a título de ilustração deve ser feito seu cálculo utilizando-se uma função definida pelo programador. Será utilizada a seguinte série com os 10 primeiros termos: $$cos(A)=1-\frac{A^{2}}{2!}+\frac{A^{4}}{4!}-\frac{A^{6}}{6!}+\frac{A^{8}}{8!}-\frac{A^{10}}{10!}+\frac{A^{12}}{12!}-\frac{A^{14}}{14!}+\frac{A^{16}}{16!}-\frac{A^{18}}{18!}.$$
public int fatorial(int n){
if(n<=1)
return 1;
return
n*fatorial(n-1);
}
public double cos(double teta){
//Deixando o ângulo menor que 360
teta %= 360;
//Transformando para radianos
teta = teta * Math.PI / 180;
double cos = 0;
//Taylor séries
for(int i = 0; i < 10; i++)
cos += Math.pow(-1, i) * Math.pow(teta, 2 * i) / fatorial(2 * i);
return cos;
}
public double raiz(double x, int a){
return Math.pow(x, (double) 1/a);
}
public double[] distHorEAltura(double d, double a){
double dhor = d*cos(a);
return new double[]{dhor, raiz((d*d)-(dhor*dhor), 2)};
}
//Utilização
double resultado[] = distHorEAltura(500,55);
for (double i : resultado)
System.out.print(i + ", ");
Vetores¶
9. Escreva uma função que receba como parâmetro um número inteiro relativo a um mês do ano e retorne uma string com o nome deste mês por extenso. Resolva o problema de suas maneiras:
- sem um vetor, através de uma estrutura switch/case;
- com um vetor
public String mesSwitchCase(int m){
String r = "";
switch(m){
case 1:
r = "Janeiro";
break;
case 2:
r = "Fevereiro";
break;
case 3:
r = "Março";
break;
case 4:
r = "Abril";
break;
case 5:
r = "Maio";
break;
case 6:
r = "Junho";
break;
case 7:
r = "Julho";
break;
case 8:
r = "Agosto";
break;
case 9:
r = "Setembro";
break;
case 10:
r = "Outubro";
break;
case 11:
r = "Novembro";
break;
default:
r ="Dezembro";
}
return r;
}
public String mesVetor(int m){
String meses[] = new String[]{"Janeiro", "Fevereiro", "Março", "Abril", "Maio", "Junho",
"Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro"};
return meses[m-1];
}
System.out.println(mesSwitchCase(6));
System.out.println(mesVetor(6));
10. Escreva um programa que leia uma lista contendo o peso de uma série de indivíduos em um vetor de números reais. A lista possui 150 elementos. Depois que a lista foi toda inserida o programa deve procurar e imprimir qual a posição no vetor onde está o menor peso.
//Importando as bibliotecas Random e Scanner
import java.util.Random;
import java.util.Scanner;
public double posicaoDoMenor(double p[]){
int menor=0;
for(int i = 1; i<pesos.length; i++)
if(p[i]<p[menor])
menor = i;
return p[menor];
}
//Criando um vetor de 150 posições com valores aleatórios
Random pseudoAleatorio = new Random();
double[] pesos = new double[150];
for (int i = 0; i < pesos.length; i++)
pesos[i] = pseudoAleatorio.nextGaussian()*10 + 60;
//Valor em distribuição Gaussiana com média 60 e desvio padrão 10.
//Caso quiséssemos pedir a entrada:
//Scanner entrada = new Scanner(System.in);
//for (int i = 0; i < 150; i++)
// pesos[i] = entrada.nextDouble();
System.out.println(posicaoDoMenor(pesos));
11. Escreva uma função que receba como parâmetros dois vetores (vetor 1 e vetor 2) contendo duas listas de nomes que já estão classificadas em ordem alfabética. A função deverá fazer um merge do conteúdo dos dois vetores em um terceiro (vetor resultante retornado pela função) mantendo, porém, a ordem alfabética. Isto pode ser feito da seguinte forma:
- inicialmente o programa se posiciona no início de ambos os vetores;
- se o elemento atual do vetor 1 for menor que o elemento atual do vetor 2 ele é transferido para o vetor resultante e o programa se desloca para o próximo elemento do vetor 1 (entenda-se por elemento atual aquele em que o programa está posicionado naquele determinado momento);
- se o elemento do vetor 2 for menor que o elemento do vetor 1 ele é transferido para o vetor resultante e o programa se desloca para o próximo elemento do vetor 2;
- isto irá acontecer até que se chegue ao fim de um dos vetores; neste momento o programa descarrega o restante do vetor que ainda não terminou no vetor resultante e encerra a função.
public String[] junteOrdenados(String[] s1, String[] s2){
//Crie um vetor que possa comportar s1 e s2
String resultado[] = new String[s1.length+s2.length];
int n = 0, a = 0, b = 0, i;
boolean achou = false;
//Enquanto não chegarmos ao final de ao menos um dos dois vetores
while(a<s1.length && b<s2.length){
i = 0; achou = false;
while(i<s1[a].length() && i<s2[b].length()){
if (Character.toLowerCase(s1[a].charAt(i)) < Character.toLowerCase(s2[b].charAt(i))){
resultado[n++] = s1[a++];
achou = true;
break;
}else
if (Character.toLowerCase(s1[a].charAt(i)) > Character.toLowerCase(s2[b].charAt(i))){
resultado[n++] = s2[b++];
achou = true;
break;
}
i++;
}
if(!achou){
if(s1[a].length()<=s2[b].length())
resultado[n++] = s1[a++];
else
resultado[n++] = s2[b++];
}
}
for (; a < s1.length; a++)
resultado[n++] = s1[a];
for (; b < s2.length; b++)
resultado[n++] = s2[b];
return resultado;
}
//Utilização
//Repare que só funciona como pedido porque são dois vetores já ordenados
//É necessário pontanto compará-los considerando principalmente seus caracteres.
String s1[] = {"Amanda", "Beatriz", "Maria", "Zica", "Zidane"},
s2[] = {"Ama", "Daniel", "Elo" , "Otávio"};
String resultado[] = junteOrdenados(s1,s2);
for(String p: resultado)
System.out.println(p);