Estou iniciando em programação Java, e preciso fazer o seguinte programa:
Escreva um algoritmo para ler um conjunto de 40 formulários contendo cada um a altura e o sexo de uma pessoa (somente ‘M’ ou ‘F’) e imprimir
A maior altura e a menor altura da turma
A média da altura das mulheres
A média da altura dos homens
O código que fiz:
import java.util.Scanner;
public class lista02_ex04
{
public static void main(String args[])
{
Scanner scan = new Scanner(System.in);
String sexo; //declaração da variável sexo (String)
float altura, maior_altura = 0, menor_altura = 0, media_homens = 0, media_mulheres = 0;
int cont_pessoas = 1, cont_homens = 0, cont_mulheres = 0;
System.out.println("Digite as informações solicitadas:");
do{
System.out.print("Altura e sexo, respectivamente, da pessoa "+cont_pessoas+": ");
altura = scan.nextFloat();
sexo = scan.nextLine();
if(sexo = "M");{ //saber se é homem ou mulher = erro
media_homens = media_homens+altura;
cont_homens = cont_homens+1;
}
if(sexo = "F");{
media_mulheres = media_mulheres+altura;
cont_mulheres = cont_mulheres+1;
}
if(altura>maior_altura){
maior_altura = altura;
}
if(altura<menor_altura){
menor_altura = altura;
}
cont_pessoas = cont_pessoas+1;
}while(cont_pessoas<40);
media_homens = (float) (media_homens/cont_homens);
media_mulheres = (float) (media_mulheres/cont_mulheres);
System.out.println("Maior altura = "+maior_altura);
System.out.println("Menor altura = "+menor_altura);
System.out.println("Média de altura das mulheres = "+media_mulheres);
System.out.println("Média de altura dos homens = "+media_homens);
}
}
Quando vou compilar aparece o erro:
[line: 15]
Error: incompatible types
required: boolean
found: java.lang.String
Na linha 07, declaro a variável “sexo” como String. Mas quando quero saber se o sexo é masculino ou feminino (linha 15), aparece o erro. Quem puder ajudar eu agradeço.
o erro acontece porque o if espera sempre um true/false. mas no seu código está a encontrar uma atribuição de valor a uma variavel ( sexo = “M” ) , e não uma expressao booleana.
1o, para se efectuar uma comparação, deve-se usar o duplo “=”
Ex: if(x == 2)
Mas, sendo “sexo” uma variável do tipo String (objecto, e não dado primitivo), poderá comparar da seguinte forma:
if(sexo.equalsIgnoreCase(“M”)){ //ignoreCase apenas para considerar o “m” e o “M”
outra coisa. nao deve colocar o “;” depois do if:
if(sexo = “M”);{
Cara, fiz o que vc me falou. Agora ele compila certinho, mas na hora de me mostrar as médias aparece “NaN”, uso o drJava.
O código completo com algumas correções:
import java.util.Scanner;
public class lista02_ex04
{
public static void main(String args[])
{
Scanner scan = new Scanner(System.in);
String sexo;
float altura, maior_altura = 0, menor_altura = 0, media_homens = 0, media_mulheres = 0;
int cont_pessoas = 1, cont_homens = 0, cont_mulheres = 0;
System.out.println("Digite as informações solicitadas:");
do{
System.out.print("Altura e sexo, respectivamente, da pessoa "+cont_pessoas+": ");
altura = scan.nextFloat();
sexo = scan.nextLine();
if(sexo.equalsIgnoreCase("M")){
media_homens = media_homens+altura;
cont_homens = cont_homens+1;
}
if(sexo.equalsIgnoreCase("F")){
media_mulheres = media_mulheres+altura;
cont_mulheres = cont_mulheres+1;
}
if(altura>maior_altura){
maior_altura = altura;
}
if(altura<menor_altura){
menor_altura = altura;
}
cont_pessoas = cont_pessoas+1;
}while(cont_pessoas<=40);
media_homens = (float) (media_homens/cont_homens);
media_mulheres = (float) (media_mulheres/cont_mulheres);
System.out.println("Maior altura = "+maior_altura);
System.out.println("Menor altura = "+menor_altura);
System.out.println("Média de altura das mulheres = "+media_mulheres);
System.out.println("Média de altura dos homens = "+media_homens);
}
}
Outra coisa: pra achar a menor altura eu comparo inicialmente a primeira altura digitada com o valor presente na variável “menor_altura”. Se eu colocar zero como valor inicial da variável “menor_altura”, no final o programa me dará que a menor altura é zero. Pois nenhuma altura digitada será maior que zero. Sendo assim, como posso atribuir à variável “menor_altura” o valor da altura, somente na primeira vez? Outra solução seria colocar um valor inicial alto na variável “menor_altura”, funcionaria mas não seria algo geral.
Na linha 12 é solicitada a digitação da altura e sexo, respectivamente.
Um exemplo: “2 F”
Logo abaixo, na linha 13, lê-se a altura, armazenando-a como Float. No exemplo seria “2”.
Na linha 14, lê-se o sexo, armazenando como String. Usando nextLine(). Talvez ao invés de somente “F”, a variável “sexo” esteja armazenando “2 F”, pois o comando manda escanear a linha (nextLine()). Pode estar acontecendo isso?
System.out.print("Altura e sexo, respectivamente, da pessoa "+cont_pessoas+": ");
altura = scan.nextFloat();
sexo = scan.nextLine();
[quote=luis.pinto.it]o erro acontece porque o if espera sempre um true/false. mas no seu código está a encontrar uma atribuição de valor a uma variavel ( sexo = “M” ) , e não uma expressao booleana.
1o, para se efectuar uma comparação, deve-se usar o duplo “=”
Ex: if(x == 2)
Mas, sendo “sexo” uma variável do tipo String (objecto, e não dado primitivo), poderá comparar da seguinte forma:
if(sexo.equalsIgnoreCase(“M”)){ //ignoreCase apenas para considerar o “m” e o “M”
outra coisa. nao deve colocar o “;” depois do if:
if(sexo = “M”);{
faça o mesmo para a verificacao do sexo “F”.
qualquer duvida adicional, coloque.
[/quote]
Só um complemento, sempre uso o equals() ou equalsIgnoreCase() para comprar Strings.
A comparação com == entre Strings pode dar errada, mesmo sendo verdadeiro.
Pois o == compara local de memoria então tendo uma declaração assim.
String s = "teste";
String s1 = new String("teste");
System.out.println( s == s1); //Retorna false
System.out.println(s.equals(s1)); // Retorna true, pois aki você compara conteúdo e não espaço em memoria.