Solucionado (ver solução)
Solucionado
(ver solução)
17
respostas

[Dúvida] Dúvida

Quero criar um programa que imprime a maior e menor altura de um grupo de 5 pessoas, a média de altura dos homens e a quantidade mulheres nesse grupo. Estou com problema no bloco que faz o cálculo da menor e maior altura, não está imprimindo a menor altura, antes estava rodando mas já mexi tanto nesses códigos que eu acho que bugou :/ E quero que o programa obrigue o usuario a digitar somente números com casa decimais. E se não digitar número com casas decimais, volte para a iteração.

package br.com.exercicioweb;

import java.text.NumberFormat; import java.util.InputMismatchException; import java.util.Scanner;

public class AlturaHomensEMulheres {

public static void main(String[] args) {

    int qntdMulheres = 0;
    int qntdHomens = 0;
    double altura = 0;
    double soma = 0;
    double mediaAlturaHomens = 0;
    double maior = 0;
    double menor = 0;

    Scanner leitura = new Scanner(System.in);

    try {
        for (int i = 0; i < 5; i++) {
            System.out.println("Digite seu gênero: M para masculino ou F para feminino");
            String genero = leitura.next().toUpperCase();

            if (genero.equals("M")) {
                qntdHomens++;
                soma += altura;

            } else if (genero.equals("F")) {
                qntdMulheres++;

            } else {
                System.out.println("Gênero inválido!");

                continue;
            }

            System.out.println("Digite a sua altura: ");
            altura = leitura.nextDouble();

            if (altura > maior) {
                maior = altura;
            } else if (altura < menor) {
                menor = altura;

            }

        }

    } catch (InputMismatchException e) {
        System.out.println(e.getMessage());
        System.out.println("Digite um número válido!");
        leitura.nextLine();


    }
    mediaAlturaHomens = soma / qntdHomens;

    System.out.println("A maior altura do grupo é: " + maior + " metros, e a menor é de " + menor + " metros");
    System.out.println("A média de altura dos homens é: " + mediaAlturaHomens + " metros");
    System.out.println("O número de mulheres é: " + qntdMulheres);

    leitura.close();
}

}

17 respostas

Oi Patrícia!

Isso acontece porque você está comparando o valor digitado pela pessoa, com variável "menor", que foi declarada com "0" inicialmente:

[...]
double menor = 0;
[...]
} else if (altura < menor) {
[...]

Supondo que os números digitados não sejam menores que zero, o código não está atualizando o valor da variável.

Não sei se chegou a estudar arrays, mas seria uma boa alternativa para manipular estas informações e trazer os resultados que deseja. Isso serviria para resolver este problema e outros que também estão presentes neste código.

Oi Elmo,

Consegui resolver esse problemas de menor e maior altura, obrigada. Mas sigo na dúvida com os outros problemas . Sou iniciante, por enquanto estou fazendo exercícios mais pra iniciantes mesmo, mas valeu pela dica.

Legal! É bom ir com calma mesmo. Qualquer dúvida pode enviar aqui.

Oi Patrícia, quais as outras dúvidas que você tem, posso ajudar!

Oi Michel,

Quero que o programa obrigue o usuario a digitar somente números com duas casas decimais, quando pede a altura. E se não digitar número com casas decimais, volte para a iteração. Foi você que me ajudou em um outro tópico, né? Tentei fazer como você me mostrou lá, mas nesse programa não deu certo. Deve ser de outra maneira.

Oi Patrícia!

Você pode fazer uma verificação com o método hasNextDouble():

           System.out.println("Digite a sua altura: ");

            while(!leitura.hasNextDouble()) {
                System.out.println("Por favor insira apenas números");
                leitura.nextLine();
            }
            altura = leitura.nextDouble();

hasNextDouble(): Retorna verdadeiro se o próximo token na entrada deste scanner puder ser interpretado como um valor duplo usando o método nextDouble(). Fonte: https://docs.oracle.com/javase/8/docs/api/java/util/Scanner.html

Oi Elmo,

Esse código não deu certo, imprimiu essa mensagem duas vezes, e não voltou para a iteração:

Digite a sua altura: c Por favor insira apenas números Por favor insira apenas números

solução!

Boa noite Patrícia, têm várias formas para conseguir isso. vou te mostrar uma: Para obrigar o usuário a digitar apenas números com duas casas decimais ao solicitar a altura, você pode fazer as seguintes alterações no código:

  1. Declare uma expressão regular para verificar se a entrada corresponde a um número com duas casas decimais. No início do método main, adicione o seguinte código:
    String regex = "\\d+\\.\\d{2}";
  2. Dentro do loop for, antes de ler a altura do usuário, adicione um loop while para verificar se a entrada do usuário corresponde à expressão regular. Caso contrário, solicite novamente a entrada. A seguinte seção do código deve ser modificada:
    System.out.println("Digite a sua altura: ");
    while (true) {
     String inputAltura = leitura.next();
     if (inputAltura.matches(regex)) {
         altura = Double.parseDouble(inputAltura);
         break;
     } else {
         System.out.println("Altura inválida! Digite novamente: ");
     }
    }
    Essas alterações irão garantir que o usuário seja solicitado a digitar novamente a altura se não corresponder a um número com duas casas decimais.

Bom dia Michel,

muito obrigada de novo, resolveu meu problema :) eu não conhecia essa expressão regular, mas vou estudar pra aprender mais sobre. Você pode me explicar a sintaxe que vc fez com o regex?

Bom dia Patrícia, com certeza! Primeiramente, vou dá uma breve explicação sobre a expressão "regex". A expressão "regex" é uma abreviação de "expressão regular" (do inglês "regular expression"). Uma expressão regular é uma sequência de caracteres que define um padrão de busca em um texto. Elas são amplamente utilizadas em linguagens de programação e ferramentas de manipulação de texto para realizar operações complexas de pesquisa e manipulação de strings.

As expressões regulares permitem que você encontre correspondências com base em critérios específicos, como padrões de caracteres, combinações de letras, dígitos ou caracteres especiais. Elas são extremamente úteis para validar dados de entrada, extrair informações específicas de um texto, substituir partes de uma sequência de caracteres e muito mais. Agora, vamos ao que interessa, rs... Vou explicar o código passo a passo, destacando a expressão regular (regex) utilizada.

  1. A expressão regular utilizada é: \\d+\\.\\d{2}.

    • \\d+ corresponde a um ou mais dígitos.
    • \\. corresponde ao caractere de ponto decimal.
    • \\d{2} corresponde a exatamente dois dígitos.

    Em resumo, essa expressão regular verifica se a entrada corresponde a um número com pelo menos um dígito antes do ponto decimal, seguido de um ponto decimal e exatamente dois dígitos após o ponto decimal. Portanto, ela é adequada para verificar números com duas casas decimais.

  2. A seção do código em que as alterações são aplicadas é a seguinte:

System.out.println("Digite a sua altura: ");
while (true) {
    String inputAltura = leitura.next();
    if (inputAltura.matches(regex)) {
        altura = Double.parseDouble(inputAltura);
        break;
    } else {
        System.out.println("Altura inválida! Digite novamente: ");
    }
}
  • O programa exibe a mensagem "Digite a sua altura: ".
  • Em seguida, entra em um loop while (true) que continuará executando até que a entrada do usuário corresponda à expressão regular.
  • Dentro do loop, o programa lê a entrada do usuário utilizando leitura.next() e armazena-a na variável inputAltura.
  • O programa verifica se inputAltura corresponde à expressão regular utilizando o método matches(regex).
  • Se a entrada corresponder à expressão regular, significa que é um número com duas casas decimais válidas.
    • Nesse caso, o programa converte a inputAltura para um valor double utilizando Double.parseDouble() e atribui esse valor à variável altura.
    • Em seguida, o programa interrompe o loop utilizando break e continua a execução normalmente.
  • Se a entrada não corresponder à expressão regular, significa que não é um número com duas casas decimais válidas.
    • Nesse caso, o programa exibe a mensagem "Altura inválida! Digite novamente: ".
    • O loop continua, solicitando ao usuário que digite a altura novamente.

Essas alterações garantem que o usuário seja solicitado a digitar novamente a altura até fornecer um número com duas casas decimais válidas, conforme verificado pela expressão regular.

Espero que essas informações seja de grande ajuda para seu crescimento como programadora! Bons estudos!

Muito bem explicado, obrigada!

De nada! Qualquer dúvida e, se eu souber, só falar .

Bom dia Michel,

Como você se ofereceu para me ajudar, estou aqui novamente, com outra dúvida sobre o catch rs. Estou desde ontem tentando, fiz de um jeito que você já havia me mostrado, mas não está dando certo. O erro está apenas no cacth, quando acontece a exceção, ele não volta para a iteração.

package br.com.exercicioweb;

import java.util.InputMismatchException; import java.util.Scanner;

public class Cumprimentos {

public static void main(String[] args) {

    Scanner leitura = new Scanner(System.in);
    int horario = 0;

    try {
        while (true) {
            System.out.println("Digite a hora(inteira) agora: ");
            horario = leitura.nextInt();

            if (horario > 23) {
                System.out.println("Digite um horário válido!");
                continue;
            }

            if (horario >= 00 && horario <= 11) {
                System.out.println("Bom dia!");
                break;

            } else if (horario >= 12 && horario <= 17) {
                System.out.println("Boa tarde!");
                break;

            } else if (horario >= 18 && horario <= 23) {
                System.out.println("Boa noite!");
                break;

            }

        }

        horario ++;
    } catch (InputMismatchException e) {
        System.out.println(e.getMessage());
        System.out.println("Digite um número entre 00 a 23!");
        leitura.nextLine();
        horario--;
    }
    

}

}

Bom dia Patrícia, desculpa a demora. Estava curtindo meu corre corre da vida, rsrs... É simples, vou explicar:

A exceção InputMismatchException ocorre quando o usuário insere um valor inválido, ou seja, um valor que não é um número inteiro. No código fornecido, quando essa exceção é lançada, a mensagem de erro é exibida, mas o programa não retorna à iteração do loop para que o usuário possa digitar um novo valor.

Para corrigir esse problema, podemos adicionar uma instrução leitura.nextLine() dentro do bloco catch para descartar a entrada inválida do usuário e permitir que ele digite um novo valor. Dessa forma, o programa retornará ao início do loop após a exceção.

Aqui está o código corrigido:

package br.com.exercicioweb;

import java.util.InputMismatchException;
import java.util.Scanner;

public class Cumprimentos {
    public static void main(String[] args) {
        Scanner leitura = new Scanner(System.in);
        int horario = 0;

        try {
            while (true) {
                System.out.println("Digite a hora (inteira) agora: ");
                horario = leitura.nextInt();

                if (horario > 23) {
                    System.out.println("Digite um horário válido!");
                    continue;
                }

                if (horario >= 0 && horario <= 11) {
                    System.out.println("Bom dia!");
                    break;
                } else if (horario >= 12 && horario <= 17) {
                    System.out.println("Boa tarde!");
                    break;
                } else if (horario >= 18 && horario <= 23) {
                    System.out.println("Boa noite!");
                    break;
                }
            }

            horario++;
        } catch (InputMismatchException e) {
            System.out.println("Digite um número entre 0 e 23!");
            leitura.nextLine(); // Descartar entrada inválida
            horario--;
        }
    }
}

Agora, quando a exceção InputMismatchException ocorrer, a mensagem de erro será exibida, a entrada inválida será descartada usando leitura.nextLine(), e o programa retornará ao início do loop para que o usuário possa digitar um novo valor.

Espero que isso resolva o problema! Se você tiver mais alguma dúvida, é só me perguntar.

Oi Michel,

faz parte esse corre corre né rs. Perguntei em outro tópico também, e consegui resolver esse problema. Mas obrigada por me ajudar de novo :D

Que bom que resolveu! vamos nessa caminhada de aprendizado! Estou no início desse aprendizado , vamos escalando aos poucos que chegamos no nosso objetivo !