Bom dia, estou fazendo um programa para a faculdade e basicamente esta completo, porem em um dos métodos, meu while fica em loop infinito. Segue o código abaixo:
packagebr.edu.principal;importjava.util.Scanner;publicclassNotas{Scannerler=newScanner(System.in);floatnotas[][]=newfloat[6][2];Stringmaterias[]=newString[6];intcontador=0;String[]lerMaterias(){while(contador<=5){System.out.println("");System.out.printf("Insira o nome da materia %d: ",(contador+1));materias[contador]=ler.nextLine();System.out.println("");lerNotas();contador++;}returnmaterias;}float[][]lerNotas(){System.out.println("");System.out.printf("Insira a primeira nota da materia %s: ",materias[contador]);notas[contador][0]=Float.parseFloat(ler.nextLine());System.out.println("");System.out.println("");System.out.printf("Insira a segunda nota da materia %s: ",materias[contador]);notas[contador][1]=Float.parseFloat(ler.nextLine());System.out.println("");returnnotas;}}
após a 6ª matéria ele começa a pedir a matéria “null”.
Então posta o código atualizado dos seus fontes, senão fica difícil te indicar a causa do erro.
L
Laio
vocé esta atribuindo os atributos sem usar metodo. Nunca fiz isso assim em java, não vou mentir, mas seria mais viável se tentasse usar metodos no lugar de classificar os atributos diretamente, pois é linguagem Orient. a objetos: no lugar de String[] lerMaterias() e lerNotas, use public String lerMateriais e public float LerNotas
com retorno e tudo mais dentro , e na hora de calcular médias, passe as notas como parâmetro
L
Laio
Se voce já tiver um numero definido de repetições, use o for. E está incoerente voce chamar o lerNotas dentro de ler Materias, talvez por isso deu erro. Tire de dentro, métodos em Java devem ser , por padrao, os mais objetivos possíveis, não que seja errado colocar um metodo dentro de outro, mas pra tipos primitivos como string e float nao da muito certo. Faca tudo na função Main mesmo
W
Willyfp
eu chamo o lerNotas() dentro do lerMaterias() para que logo após colocar o nome da matéria já peça as notas da mesma
W
Willyfp
Classe Notas:
packagebr.edu.principal;importjava.util.Scanner;publicclassNotas{Scannerler=newScanner(System.in);floatnotas[][]=newfloat[6][2];Stringmaterias[]=newString[6];intcontador=0;String[]lerMaterias(){while(contador<=5){System.out.println("");System.out.printf("Insira o nome da materia %d: ",(contador+1));materias[contador]=ler.nextLine();System.out.println("");lerNotas();contador++;}returnmaterias;}float[][]lerNotas(){System.out.println("");System.out.printf("Insira a primeira nota da materia %s: ",materias[contador]);notas[contador][0]=Float.parseFloat(ler.nextLine());System.out.println("");System.out.println("");System.out.printf("Insira a segunda nota da materia %s: ",materias[contador]);notas[contador][1]=Float.parseFloat(ler.nextLine());System.out.println("");returnnotas;}}
packagebr.edu.principal;publicclassValidacao{publicstaticvoidmain(String[]args){NotasclasseNotas=newNotas();MediasclasseMedias=newMedias();String[]materias=classeNotas.lerMaterias();float[]medias=classeMedias.calculaMedia();intcontador=0;classeNotas.lerMaterias();classeMedias.calculaMedia();while(contador<=5){if(medias[contador]>=70){System.out.printf("Sua media na matéria %s foi %.2f e voce foi aprovado!",materias[contador],medias[contador]);}if(medias[contador]<70&medias[contador]>30){System.out.printf("Sua media na matéria %s foi %.2f e voce ficou em exame!",materias[contador],medias[contador]);}if(medias[contador]<30){System.out.printf("Sua media na matéria %s foi %.2f e voce reprovou!",materias[contador],medias[contador]);}}}}
L
Laio
classeMedias.calculaMedia() tem de receber algum parametro, pra calcular a media
L
Laio
Ah, e em lerNotas, como não tem while dentro, não pode chama-lo dentro da posição de laço de repetição. O seu raciocínio até que é bom, mas a lógica precisa ser aperfeiçoada, continue praticando. Se você está agora em Linguagem O.Objetos, pratique tbm os seus termos: objetos, get, set, etc.
staroski
É que no método calculaMedia da classe Medias você está criando um novo objeto do tipo Notas e novamente chamando o método lerNotas
W
Willyfp
Foi o que fiz para o método calculaMedia() receber as notas para fazer o calculo, teria outro modo?
Pois preciso pegar o retorno de lerNotas(), fiz isso no main com o lerMaterias() e ainda assim não chamou o método mais uma vez
W
Willyfp
Ele recebe o retorno de lerNotas() dentro da classe dele
W
Willyfp
O professor especificou que logo após pedir o nome da matéria ja deveria pedir as notas, foi o modo que encontrei, pois como o método é String, não poderia retornar as duas variáveis se colocasse os dois no mesmo método
L
Laio
Nao, voce só esta criando uma nova instancia de classes média, fora o que voce já esta chamando, logo são duas leituras.
L
Laio
Entendi o que quis fazer, só que está criando um novo objeto em vez de pegar o anterior:logo depois de voce pegar a notas, voce pode calcular logo as medias, pegando notas como parâmetro:
calcularMedias (notas) , incluindo dentro de ler materias, depois de ler notas, que recebe o resultado de ler notas, antes de acrescentar o contador
staroski
Para um método receber algo como parâmetro, você precisa passar parâmetros para ele, mas em momento algum você faz isso.
Eu faria algo assim, primeiro criaria uma classe Materia contendo o nome, as notas e um método pra calcular a media:
Em seguida escreveria o programa para ler as entradas e imprimir as saídas:
importjava.io.PrintStream;importjava.util.Scanner;publicclassPrograma{publicstaticvoidmain(String[]args){try{Programaprograma=newPrograma();programa.executar();}catch(Throwablet){t.printStackTrace();}}privatefinalScannerentrada=newScanner(System.in);privatefinalPrintStreamsaida=System.out;privatevoidexecutar(){Materia[]materias=lerMaterias(5);for(Materiamateria:materias){floatmedia=materia.calcularMedia();Stringnome=materia.getNome();if(media>=7){saida.printf("Sua media na matéria %s foi %.2f e voce foi aprovado!%n",nome,media);}elseif(media>=3){saida.printf("Sua media na matéria %s foi %.2f e voce ficou em exame!%n",nome,media);}else{saida.printf("Sua media na matéria %s foi %.2f e voce reprovou!%n",nome,media);}}}privateMateria[]lerMaterias(intquantidade){Materia[]materias=newMateria[quantidade];for(inti=0;i<quantidade;i++){saida.printf("Insira o nome da materia %d: ",(i+1));Stringnome=entrada.nextLine();float[]notas=lerNotas(nome,2);materias[i]=newMateria(nome,notas);}saida.println();returnmaterias;}privatefloat[]lerNotas(Stringnome,intquantidade){saida.printf("Insira a primeira nota da materia %s: ",nome);floatnota1=Float.parseFloat(entrada.nextLine());saida.printf("Insira a segunda nota da materia %s: ",nome);floatnota2=Float.parseFloat(entrada.nextLine());saida.println();returnnewfloat[]{nota1,nota2};}}