5
respostas

Resolução - Hora da prática 3

Exercicio 1

package Exercicios3;

import java.util.Scanner;

public class PositivoOuNegativo {
    public static void main(String[] args) {

    Scanner caixaDeTexto = new Scanner(System.in);

    System.out.println("** POSITIVO OU NEGATIVO **");
    System.out.println("");

    System.out.print("Digite um numero qualquer: ");
    int numeroDigitado = caixaDeTexto.nextInt();
    System.out.print("");

    if (numeroDigitado >= 1){
        System.out.println("Você digitou um numero positivo.");
    } else if (numeroDigitado < 0) {
        System.out.println("Você digitou um numero negativo.");
    }

}
}

Exercicio 2

package Exercicios3;

import java.util.Scanner;

public class ComparandoDoisNumeros {
    public static void main(String[] args) {

    Scanner caixaDeTexto = new Scanner(System.in);

    System.out.println("** COMPARANDO DOIS NUMEROS **");
    System.out.println("");

    System.out.println("Digite o 1º numero: ");
    int primeiroNumero = caixaDeTexto.nextInt();
    System.out.println("Digite o 2º numero: ");
    int segundoNumero = caixaDeTexto.nextInt();

    System.out.println("");

    if (primeiroNumero > segundoNumero){
        System.out.print("O primeiro numero " + primeiroNumero + " 7" +
                "é maior que o segundo numero " + segundoNumero);
    } else if (segundoNumero > primeiroNumero) {
        System.out.print("O segundo numero " + segundoNumero + " é maior que o primeiro numero " + primeiroNumero);
    } else {
        System.out.println("Os numeros digitados são iguais!");
    }


}
}

Exercicio 3

package Exercicios3;

import java.util.Scanner;

public class CalculoDeAreas {
    public static void main(String[] args) {

    Scanner caixaDeTexto = new Scanner(System.in);

    System.out.println("** CALCULANDO AREAS **");
    System.out.println("");

    System.out.println("** Menu **");
    System.out.println("");
    System.out.println("Digite 1 para calcular a Area do Quadrado");
    System.out.println("Digite 2 para calcular a Area do Círculo");
    System.out.println("");
    System.out.print("Digite sua opção: ");
    int opcaoEscolhida = caixaDeTexto.nextInt();

    switch (opcaoEscolhida){
        case 1:
            System.out.println("");
            System.out.println("Vamos calcular a area do Quadrado");
            System.out.println("");

            System.out.print("Digite o valor do lado do quadrado: ");
            double ladoQuadrado = caixaDeTexto.nextDouble();

            double areaQuadrado = ladoQuadrado * ladoQuadrado;

            System.out.println(String.format("A area do quadrado de lado %.2f é igual a: %.2f", ladoQuadrado, areaQuadrado));

            break;
        case 2:
            System.out.println("");
            System.out.println("Vamos calcular a area do Círculo");
            System.out.println("");

            System.out.print("Digite o valor do lado do raio do círculo: ");
            double raioCirculo = caixaDeTexto.nextDouble();

            double PI = Math.PI;
            double areaCirculo = PI * (raioCirculo * raioCirculo);

            System.out.println(String.format("A area do circulo de raio de %.2f é igual a: %.2f", raioCirculo, areaCirculo));

            break;
        default:
            System.out.println("Opção inválida, saindo do programa...");
            break;
    }
    caixaDeTexto.close();
}
}

Exercicio 4

  package Exercicios3;

import java.util.Scanner;

public class TabuadaDeUmNumeroQualquer {
    public static void main(String[] args) {

    Scanner caixaDeTexto = new Scanner(System.in);

    System.out.println("** TABUADA **");
    System.out.println("");

    System.out.print("Digite o numero do qualquer ver a tabuada dele de 1 a 10: ");
    int numeroDigitado = caixaDeTexto.nextInt();

    System.out.println("");

    for (int i = 1; i <= 10 ; i++) {

        int resultado = numeroDigitado * i;
        System.out.println(String.format("%d x %d = %d",numeroDigitado, i, resultado));
    }
    caixaDeTexto.close();
}
}

Neste exercício 4, minha duvida é se podemos renomear os especificadores de formato para eles se tornarem mais "legíveis", fazendo alusão a variável que eles substituem, por exemplo o primeiro "%d" virar "%nD" de numeroDigitado.

Garanta sua matrícula hoje e ganhe + 2 meses grátis

Continue sua jornada tech com ainda mais tempo para aprender e evoluir

Quero aproveitar agora
5 respostas

Parte 2

Exercicio 5

package Exercicios3;

import java.util.Scanner;

public class ParOuImpar {
    public static void main(String[] args) {

    Scanner caixaDeTexto = new Scanner(System.in);

    System.out.println("** PAR OU IMPAR **");
    System.out.println("");
    System.out.print("Digite um numero qualquer: ");
    int numeroDigitado = caixaDeTexto.nextInt();
    System.out.println("");

    if (numeroDigitado % 2 == 0) {
        System.out.println("Você digitou um numero PAR!");
    } else if (numeroDigitado < 0) {
        System.out.println("Numero inválido");
    } else {
        System.out.println("Você digitou um numero IMPAR!");
    }
    caixaDeTexto.close();
}
}

Exercicio 6

package Exercicios3;

import java.util.Scanner;

public class FatorialDeUmNumero {
    public static void main(String[] args) {

    Scanner caixaDeTexto = new Scanner(System.in);
    int fatorial = 1;

    System.out.println("** FATORIAL **");
    System.out.println("");

    System.out.print("Digite um numero qualquer para ser o seu fatorial: ");
    int numeroDigitado = caixaDeTexto.nextInt();

    //Calculando Fatorial
    for (int i = 1; i <= numeroDigitado ; i++) {

        fatorial = fatorial * i;

    }

    caixaDeTexto.close();

    System.out.println(String.format("O fatorial de %d é igual a: %d", numeroDigitado, fatorial));

}
}

Esse do fatorial tive que fazer no papel mais de uma vez para entender como o laço "for" calcula o fatorial, mas no final consegui entender perfeitamente :D

Sobre sua duvida "Neste exercício 4, minha duvida é se podemos renomear os especificadores de formato para eles se tornarem mais "legíveis", fazendo alusão a variável que eles substituem, por exemplo o primeiro "%d" virar "%nD" de numeroDigitado.", tem como fazer sim, mas nao diretamente. Voce pode criar os seus proprios placeholders e tokens para formatacao de texto, eu faco isso usando regex. Inclusive, criei meu proprio sistema de formatacao de texto e usei ele para refatorar os seus codigos, que estao muito bons por sinal, mas ha o que ser melhorando ainda, mas isso voce pega com o tempo. Aqui um exemplo da classe StringFormatter que fiz:

@UtilityClass
public final class StringFormatter {

    private static final Pattern     GENERIC_PATTERN;
    private static final Pattern       TOKEN_PATTERN;
    private static final Pattern     ADVANCED_TOKENS;
    private static final Pattern    NEW_LINE_PATTERN;
    private static final DateTimeFormatter DATE_TIME;
    private static final Map<String, Object>  TOKENS;

    static {
        GENERIC_PATTERN  = Pattern.compile(Constants.GENERIC);
        TOKEN_PATTERN    = Pattern.compile(Constants.TOKENS_COMMUM);
        ADVANCED_TOKENS  = Pattern.compile(Constants.ADVANCED_TOKEN);
        NEW_LINE_PATTERN = Pattern.compile(Constants.NEW_LINE);
        DATE_TIME        = DateBuilder.DatePattern.DD_MM_YYYY_HH_MM_SS.getFormatter();
        TOKENS           = Map.of(
                "$n", System.lineSeparator(),
                "$r", "\r",
                "$t", "\t",
                "$sp", " ",
                "$tmp", DATE_TIME.format(LocalDateTime.now()),
                "$rand", Math.random() * 1000000000L
        );
    }

    public static @NotNull String format(@NotNull String templateString, Object @NotNull ... args) {
        templateString = applyTemplateFormatting(templateString, args);
        for (Object arg : args) {
            templateString = GENERIC_PATTERN
                    .matcher(templateString)
                    .replaceFirst(Matcher.quoteReplacement(Stringifier.valueOf(arg)));
        }

        return templateString;
    }

    private static @NotNull String applyTemplateFormatting(@NotNull String templateString, Object @NotNull ... args) {
        templateString = Mapping.applyReplacements(templateString, TOKENS);
        templateString = replacePlaceholders(templateString, args, TOKEN_PATTERN, StringFormatter::formatOriginalToken);
        templateString = replacePlaceholders(templateString, args, ADVANCED_TOKENS, StringFormatter::formatAdvancedToken);
        templateString = newLine(templateString);
        return templateString;
    }

    private static @NotNull String newLine(String template) {
        Matcher matcher = NEW_LINE_PATTERN.matcher(template);
        StringBuffer buffer = getBuffer().get();

        While.isTrue(matcher::find, () -> {
            int count = Try.of(() -> NumberParser.toInt(matcher.group(1)))
                    .onFailure(e -> Logger.error("Invalid new line count '{}'", e, matcher.group(1)))
                    .orElse(1);

            if (Numbers.isLessThan(count, 1)) count = 1;

            String replacement = System.lineSeparator().repeat(count);

            matcher.appendReplacement(buffer, Matcher.quoteReplacement(replacement));
        });

        matcher.appendTail(buffer);
        return buffer.toString();
    }

    private static @NotNull String replacePlaceholders(
            @NotNull String template,
            Object @NotNull [] args,
            @NotNull Pattern pattern,
            java.util.function.BiFunction<String,Object,String> formatter
    ) {
        Matcher matcher = pattern.matcher(template);
        StringBuffer buffer = getBuffer().get();

        While.isTrue(matcher::find, () -> {
            int index = getIndexOrElse(matcher);
            if (isPlaceholderIndexInvalid(args, index, matcher, buffer)) return;

            Object value = args[index];
            String token = matcher.group(2);
            String replacement = token == null ? Stringifier.valueOf(value) : formatter.apply(token, value);

            matcher.appendReplacement(buffer, Matcher.quoteReplacement(replacement));
        });

        matcher.appendTail(buffer);
        return buffer.toString();
    }

e estes os placeholders que uso:
Insira aqui a descrição dessa imagem para ajudar na acessibilidade

O bom e que com isso, eu tenho liberdade para fazer a formataca da forma que eu quiser, posso fazer qualquer coisa. Um exemplo simples, o seu codigo de fatorial, voce passa:

System.out.println(String.format("O fatorial de %d é igual a: %d", numeroDigitado, fatorial));

Ja usando o meu sistema de formatacao, fica bem mais simples, e so uma um placeholder generico {}, assim:

IO.format("O fatorial de {} é igual a: {}", number, factorial(number));

Da ate mesmo para formatar numeros para diferentes tipos usando {n:dc} {n:dp} {n:i} onde n e um numero de 0 a infinito, e varias outras formas, essas que citei sao somente algumas. Fica assim:

String areaMessage      = isOptionOne(choice) 
                ? "A area do quadrado de lado {0:dc} é igual a: {1:dc}"
                : "A area do circulo de raio de {0:dc} é igual a: {0:dc}";

e o resultado fica assim:
Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Aqui estao seus codigos refatorados, fiz so uma refatoracao simples para eles, nada de muito extravagante usando minha API propria que fiz chamada JToolBox, o nome e uma droga kkkk, sou pessimo em dar nomes.

Caso queira usar em seus projetos, ela esta disponivel para maven e gradle:

Maven

<dependency>
    <groupId>io.github.rickmvi</groupId>
    <artifactId>jtoolbox</artifactId>
    <version>1.10.29</version>
</dependency>

Gradle

implementation("io.github.rickmvi:jtoolbox:1.10.29")

Teus codigos refatorados:

Positive Or Negative

package test.alura;

import com.github.rickmvi.jtoolbox.console.IO;
import com.github.rickmvi.jtoolbox.console.util.Scanf;

public class PositiveOrNegative {
    public static void main(String[] args) {

        IO.println("** POSITIVO OU NEGATIVO **");
        IO.newline();
        int number;
        try (Scanf scan = new Scanf()) {
            number = scan.readIntPrompt("Digite um numero qualquer:");
            IO.newline();
        }

        String res = number < 0 ? "Você digitou um numero negativo." : "Você digitou um numero positivo.";

        IO.println(res);
    }
}

Compere

package test.alura;

import com.github.rickmvi.jtoolbox.console.IO;
import com.github.rickmvi.jtoolbox.console.util.Scanf;

public class Compere {
    public static void main(String[] args) {

        IO.println("** COMPARANDO DOIS NUMEROS **");
        IO.newline();

        int NumberOne;
        int NumberTwo;
        try (Scanf scan = new Scanf()) {
            NumberOne = scan.readIntPrompt("Digite o 1º numero:");
            NumberTwo = scan.readIntPrompt("Digite o 2º numero:");
        }
        IO.newline();

        if (NumberOne > NumberTwo){
            compareNumbers(NumberOne, NumberTwo);
            return;
        }

        if (NumberTwo > NumberOne) {
            compareNumbers(NumberTwo, NumberOne);
            return;
        }

        IO.println("Os numeros digitados são iguais!");
    }

    private static void compareNumbers(int NumberOne, int NumberTwo) {
        IO.format("O numero {} é maior que o numero {}.", NumberOne, NumberTwo);
    }
}

Calculate

package test.alura;

import com.github.rickmvi.jtoolbox.console.IO;
import com.github.rickmvi.jtoolbox.console.util.Scan;

import static java.lang.Math.PI;

public class Calculate {
    public static void main(String[] args) {

        displayMenu();
        int userChoice = Scan.readIntPrompt("Digite sua opção:");
        calculateArea(userChoice);

    }

    private static void calculateArea(int choice) {
        if (choice < 1 || choice > 2) {
            IO.println("Opção inválida, saindo do programa...");
            Scan.close();
            return;
        }

        String selectionMessage = isOptionOne(choice) 
                ? "Vamos calcular a area do Quadrado" 
                : "Vamos calcular a area do Círculo";
        
        String shapePrompt      = isOptionOne(choice) 
                ? "Digite o valor do lado do quadrado:" 
                : "Digite o valor do lado do raio do círculo:";
        
        String areaMessage      = isOptionOne(choice) 
                ? "A area do quadrado de lado {0:dc} é igual a: {1:dc}"
                : "A area do circulo de raio de {0:dc} é igual a: {0:dc}";
        
        IO.println(selectionMessage);
        
        double side = Scan.readDoublePrompt(shapePrompt);
        double area = isOptionOne(choice) 
                ? squareArea(side) 
                : circleArea(side);
        
        IO.format(areaMessage, side, area);
        Scan.close();
    }

    private static boolean isOptionOne(int choice) {
        return choice == 1;
    }

    private static double squareArea(double side) {
        return Math.pow(side, 2);
    }

    private static double circleArea(double radius) {
        return PI * (Math.pow(radius, 2));
    }
    
    private static void displayMenu() {
        IO.println("""
                         ** CALCULANDO AREAS **

                              ** Menu **
                
                Digite 1 para calcular a Area do Quadrado
                Digite 2 para calcular a Area do Círculo
                
                """);
    }
    
}

Multiplication

package test.alura;

import com.github.rickmvi.jtoolbox.console.IO;
import com.github.rickmvi.jtoolbox.console.util.Scan;

import java.util.stream.IntStream;

public class Multiplication {
    public static void main(String[] args) {

        IO.println("** TABUADA **");
        IO.newline();

        int inputNumber = Scan.readIntPrompt("Digite o numero do qualquer ver a tabuada dele de 1 a 10:");

        IntStream.rangeClosed(1, 10)
                .forEach(i -> IO.format("{} x {} = {}$n", inputNumber, i, (inputNumber * i)));
        Scan.close();
    }
}

Even Or Odd

package test.alura;

import com.github.rickmvi.jtoolbox.console.IO;
import com.github.rickmvi.jtoolbox.console.util.Scan;
import com.github.rickmvi.jtoolbox.util.Numbers;

public class EvenOrOdd {
    public static void main(String[] args) {

        IO.println("** PAR OU IMPAR **");

        int number = Scan.readIntPrompt("Digite um numero qualquer:");

        if (Numbers.isNegative(number)) {
            System.out.println("Numero inválido");
            close();
            return;
        }
        String res = (number & 1) == 0 ? "PAR" : "IMPAR";

        IO.format("Você digitou um numero {}", res);
        close();
    }

    private static void close() {
        Scan.close();
    }
}

Factorial

package test.alura;

import com.github.rickmvi.jtoolbox.console.IO;
import com.github.rickmvi.jtoolbox.console.util.Scan;

public class Factorial {
    public static void main(String[] args) {

        IO.println("** FATORIAL **");
        int number = Scan.readIntPrompt("Digite um numero qualquer para ser o seu fatorial:");

        IO.format("O fatorial de {} é igual a: {}", number, factorial(number));
        Scan.close();
    }

    private static long factorial(int n) {
        if (n == 0) return 1;

        return n * factorial(n - 1);
    }
}