sábado, 6 de abril de 2019

Lista de Exercícios em Java: Estruturas de Programação, Funções e Vetores


Compartilhe!

Lista de Exercícios em Java: Estruturas de Programação, Funções e Vetores

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.

In [1]:
//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.");
Digite um valor: 
2
Digite outro valor: 
7
Os números ímpares entre 2 e 7 são: 
3 5 

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.
In [2]:
//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)+".");
Digite o nome do funcionário: 
Mar
Digite o salário do funcionário: 
500
Mar, salário atual: 500.0, salário ajustado: 575.0
Digite o nome do funcionário: 
Vin
Digite o salário do funcionário: 
700
Vin, salário atual: 700.0, salário ajustado: 770.0000000000001
Digite o nome do funcionário: 
Lin
Digite o salário do funcionário: 
250
Lin, salário atual: 250.0, salário ajustado: 300.0
Digite o nome do funcionário: 
FIM
Soma dos salários atuais: 1450.0, soma dos salários ajustados: 1645.0. Diferença: 195.0.

3. Escreva um programa que leia um número inteiro e mostre a sua conversão em binário.

In [3]:
//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);
Digite um número inteiro: 
25
A conversão de 25 para binário é: 11001

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.
In [4]:
//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.");
Digite um número inteiro: 
25
O número 25 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.

In [5]:
//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.");
Digite uma cadeia de caracteres: 
arara
A sequência arara é 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.
In [6]:
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 + ", ");
2.0, 3.0, -1.0, 

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
In [7]:
//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++;
    }
}
Digite um número inteiro:
25
O número 25 não é primo.
Quantos números primos quer?
14
2 3 5 7 11 13 17 19 23 29 31 37 41 43 

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!}.$$

In [8]:
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 + ", ");
286.7882183544565, 409.57602201920537, 

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
In [9]:
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));
Junho
Junho

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.

In [10]:
//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));
30.80196550632548

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.
In [11]:
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);
Ama
Amanda
Beatriz
Daniel
Elo
Maria
Otávio
Zica
Zidane