Error: incompatible types

Estou iniciando em programação Java, e preciso fazer o seguinte programa:

  1. 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”);{

faça o mesmo para a verificacao do sexo “F”.

qualquer duvida adicional, coloque.

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.

Estava pensando:

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.

Fica a dica Abraço!

Oi.

O recomendado é usar o metodo next(), e não nextLine().
Experimente e depois nos diga algo.

Abraço.