Prazer a todos.
O código está certo, mas a saída do while para sair do programa não funciona. Não sei porque, retirei o miolo com os dois for e o while funciona. Não encontro o erro.
package vetores;
inti,j;Stringopcao;Stringresp="n";doublemedia=0,soma=0;Scannersc=newScanner(System.in);do{for(i=0;i<nome_aluno.length;i++){System.out.println("Insira o nome do aluno: ");nome_aluno[i]=sc.next();for(j=0;j<4;j++){System.out.println("Entre com a "+j+1+" ª do aluno: ");notas_aluno[i][j]=sc.nextDouble();soma=soma+notas_aluno[i][j];}Stringaproveitamento=" ";switch(aproveitamento){case"A":case"B":case"C":System.out.println("APROVADO");break;case"D":case"E":System.out.println("REPROVADO");break;}System.out.println("Média: "+media);System.out.println("Conceito: "+aproveitamento);System.out.println("Média: "+media);System.out.println("Conceito: "+aproveitamento);}System.out.print("Deseja Continuar? <s/n>: ");opcao=sc.next();}while(!opcao.equalsIgnoreCase(resp));//while ( opcao != 'n'); // só pára se for == 'n' }
Utilize somente o método nextLine() quando usar um Scanner para ler do TECLADO.
D
deathcon1
Obrigado. Só println de reprovado e aprovado que está fora do lugar. Já concertei.
D
deathcon1
Na verdade ainda tinha vários erros, concertei quase todos, mas há ainda erros.
Na segunda iteração dá erro é ignorado a entrada do nome do aluno, passa direto para inserir a nota, o código está dentro do loop, não sei porque não lê novamente e apresenta erro quando lê a nota se o vetor ainda não foi totalmente preenchido. Por algum motivo não está lendo o do-while. Não consigo descobrir.
intj;Stringopcao;//boolean opcao = true;Stringresp="n";doublemedia=0,soma=0,cont=0;Scannersc=newScanner(System.in);do{for(inti=0;i<nome_aluno.length;i++){System.out.println("Insira o nome do aluno: ");nome_aluno[i]=sc.nextLine();for(j=0;j<4;j++){System.out.println("Entre com a "+(j+1)+" ª nota do aluno: "+(i+1));notas_aluno[j]=sc.nextDouble();soma=soma+notas_aluno[j];cont++;}media=soma/cont;Stringaproveitamento="";if(media>=9&&media<=10){aproveitamento="A";}elseif(media>=7.5&&media<9){aproveitamento="B";}elseif(media>=6&&media<7.5){aproveitamento="C";}elseif(media>=4&&media<6){aproveitamento="D";}elseif(media>=0&&media<4){aproveitamento="E";}System.out.println("Média: "+media);System.out.println("Conceito: "+aproveitamento);switch(aproveitamento){case"A":case"B":case"C":System.out.println("APROVADO");break;case"D":case"E":System.out.println("REPROVADO");break;}//System.out.print("Deseja Continuar? <s/n>: "); //opcao = sc.nextLine(); }System.out.print("Deseja Continuar? <s/n>: ");//if (resp == false)opcao=sc.nextLine();}while(!opcao.equalsIgnoreCase(resp));//while ( opcao != 'n'); // só pára se for == 'n' }
}…>
D
deathcon1
Estou passando passo a passo. Resolvi a parte dos nomes depois que coloquei nextLine() para limpar o buffer. Na segunda iteração não faz o cálculo correto. Soma, mas não divide e assim não apresenta a média correta. O código está correto, tem umas doideiras no java que eu não entendo.
D
deathcon1
Ainda não consegui resolver. Na segunda vez que faço para colocar as notas, as notas não são somadas corretamente. Parece que fica lixo na memória, não sei se está somando com o resultado da primeira iteração.
Por exemplo: 7 + 8 + 9 +8 dá 32, e fiz o debug e a soma está dando 142. Nada a ver. Resolvendo isso e resolvo depois a saída do algoritmo. Obrigado.
staroski
Você tem uma variável cont que só é incrementada.
Você não precisa dessa variável, utiliza o notas_aluno.length.
pmlm
Não estás a fazer reset da soma entre alunos. Cada aluno está a ficar com a soma do(s) anterior(es)
Eu fiz como foi dito, mas ainda assim não funcionou. Vou pesquisar e encontrar a solução.
staroski
Deveria postar para vermos como você fez.
Assim funciona:
importjava.io.PrintStream;importjava.util.Scanner;publicclassMedia_2_vetores{privatestaticfinalScannerin=newScanner(System.in);privatestaticfinalPrintStreamout=System.out;publicstaticvoidmain(String[]args){String[]nomes=newString[50];double[]notas=newdouble[4];Stringopcao;do{for(inti=0;i<nomes.length;i++){out.print("Insira o nome do aluno "+(i+1)+": ");nomes[i]=in.nextLine();doublesoma=0;for(intj=0;j<notas.length;j++){out.print(" Entre com a "+(j+1)+"ª nota: ");notas[j]=Double.parseDouble(in.nextLine());soma+=notas[j];}doublemedia=soma/(double)notas.length;Stringconceito;if(media>=9){conceito="A";}elseif(media>=7.5){conceito="B";}elseif(media>=6){conceito="C";}elseif(media>=4){conceito="D";}else{conceito="E";}Stringsituacao;switch(conceito){case"A":case"B":case"C":situacao="APROVADO";break;default:situacao="REPROVADO";break;}out.printf(" Média: %.2f%n",media);out.println(" Conceito: "+conceito);out.println(" "+situacao);}out.print("Deseja Continuar? <s/n>: ");opcao=in.nextLine();}while("s".equalsIgnoreCase(opcao));}}
intj;booleanopcao=true;Stringresp=" ";doublemedia=0,soma=0;Scannersc=newScanner(System.in);do{for(inti=0;i<nome_aluno.length;i++){System.out.println("Insira o nome do aluno: ");nome_aluno[i]=sc.next();soma=0;while(opcao){for(j=0;j<4;j++){System.out.println("Entre com a "+(j+1)+" ª nota do aluno: "+(i+1));notas_aluno[j]=sc.nextDouble();soma=soma+notas_aluno[j];}media=soma/5;Stringaproveitamento="";if(media>=9&&media<=10){aproveitamento="A";}elseif(media>=7.5&&media<9){aproveitamento="B";}elseif(media>=6&&media<7.5){aproveitamento="C";}elseif(media>=4&&media<6){aproveitamento="D";}elseif(media>=0&&media<4){aproveitamento="E";}System.out.println("Média: "+media);System.out.println("Conceito: "+aproveitamento);switch(aproveitamento){case"A":case"B":case"C":System.out.println("APROVADO");break;case"D":case"E":System.out.println("REPROVADO");break;}System.out.print("Deseja Continuar? <s/n>: ");resp=sc.next();if(resp.equalsIgnoreCase("s"))opcao=false;}}}while(opcao);System.out.print("Deseja Continuar? <s/n>: ");resp=sc.next();if(resp.equalsIgnoreCase("s"))opcao=false;sc.next();sc.close();}
}
Testei as duas maneiras para saber como funciona o while. No primeiro ele faz a pergunta se deseja sair do loop, porém volta para pedir novamente o aluno 1, está errado, é para sair deste loop e ir para o loop mais externo e fazer a pergunta.
O mais interno é para contar as 4 notas de cada aluno. O mais externo é para sair da contagem dos 50 alunos.
Bem, aprendizado é isso mesmo, vou ver com calma e posto aqui. Obrigado a todos.
staroski
Quando postar código no fórum, formata ele certinho:
Seu fonte continua utilizando os métodos next e nextDouble, você já foi orientado a utilizar somente o nextLine().
O seu Scanner encapsula o System.in, que corresponde ao TECLADO e o ÚNICO método do Scanner que consome adequadamente a quebra de linha ao pressionar ENTER é o método nextLine().
Todos os outros métodos do Scanner processam TOKENS e não LINHAS.
Você continua tendo um array de 5 notas mas só lê 4.
Acho que é falta de atenção (ou teimosia ).
Coloquei alguns comentários no seu fonte:
publicclassmediavetores2{publicstaticvoidmain(String[]args){String[]nome_aluno=newString[50];double[]notas_aluno=newdouble[5];intj;// pra que declarar o j aqui em cima se ele só faz parte do for que tem lá embaixo?booleanopcao=true;// tem que inicializar com true dentro do laço 'do-while'Stringresp=" ";doublemedia=0,soma=0;// essas duas variáveis aqui podem ser declaradas dentro do whileScannersc=newScanner(System.in);do{for(inti=0;i<nome_aluno.length;i++){System.out.println("Insira o nome do aluno: ");nome_aluno[i]=sc.next();// usa sc.nextLine()soma=0;while(opcao){// pra que esse while aqui? você já tem o `do-while`for(j=0;j<4;j++)// porque 4 ? usa o notas_aluno.length{System.out.println("Entre com a "+(j+1)+" ª nota do aluno: "+(i+1));notas_aluno[j]=sc.nextDouble();// usa Double.parseDouble(sc.nextLine())soma=soma+notas_aluno[j];}media=soma/5;// pq 5 ? usa o notas_aluno.lengthStringaproveitamento="";if(media>=9&&media<=10){aproveitamento="A";}elseif(media>=7.5&&media<9){// não precisa testar se é < 9aproveitamento="B";}elseif(media>=6&&media<7.5){// não precisa testar se é < 7.5aproveitamento="C";}elseif(media>=4&&media<6){// não precisa testar se é < 6aproveitamento="D";}elseif(media>=0&&media<4){// não precisa testar se é < 4aproveitamento="E";}System.out.println("Média: "+media);System.out.println("Conceito: "+aproveitamento);switch(aproveitamento){case"A":case"B":case"C":System.out.println("APROVADO");break;case"D":case"E":System.out.println("REPROVADO");break;}System.out.print("Deseja Continuar? <s/n>: ");resp=sc.next();// usa sc.nextLine()if(resp.equalsIgnoreCase("s"))opcao=false;}}}while(opcao);// o código que tem daqui pra baixo é desnecessárioSystem.out.print("Deseja Continuar? <s/n>: ");resp=sc.next();if(resp.equalsIgnoreCase("s"))opcao=false;sc.next();sc.close();// não se deve fechar o System.in, seu Scanner encapsula o System.in}}
D
deathcon1
Esqueci do quote de novo. Desculpe.
D
deathcon1
Falta de atenção. Estou aprendendo e posso perder algo. Teimosia não.
D
deathcon1
Ok. O primeiro while é para sair dos 50 vezes, as vezes não temos 50 alunos, o mesmo vale para as quatro notas do aluno, pode ser da não existência das 4 notas, somente três, assim poder sair do loop. Pensei aqui, posso ver um modo de se não existir algum item, o compilador ir automáticamente para o próximo. Tanto faz usar 5 ou o tamanho do vetor. Fiz as correções. Fiz isso para complicar um pouco e aprender.
D
deathcon1
Não tinha entendido das outras vezes o que você quiz dizer, assim não fiz as modificações necessárias. Tudo bem.
D
deathcon1
Só peço um pouco de calma para quem está aprendendo, ok?
D
deathcon1
Para que a conversão de Double para nextLine?
G
GabrielA2
Amigo recomendo você ler mais um pouco, ver videos e começar a entender pelo menos o básico da lógica de programação, assim fica mais fácil te ajudar e você aprender. O amigo ali postou um código todo comentado sobre.
E sobre sua ultima pergunta, acredito, pelo contexto que seja para transformar o que o usuário escreveu (String) em um número (Double) para depois manipular mais facilmente esse valor como um número de fato ao invés de texto.
D
deathcon1
Ok. Obrigado pela dica. Sim, eu vi o código, antes disso eu não estava entendendo o que ele queria passar. Vou estudar mais. Na verdade é o que eu estou fazendo.
D
deathcon1
GabrielA2: ainda não estudei sobre métodos de conversões. Entendo o funcionamento de um algoritmo, lógica estudei bastante, o problema é a sintaxe da linguagem ainda a aprender, tento resolver e quando não descubro a solução peço ajuda para aprender e ver onde estou errando.
staroski
Mas ninguém está perdendo a calma.
Mesmo você ignorando a ajuda e não fazendo o que estamos orientando, estamos tentando ajudar.
Então porque não faz as alterações que sugerimos?
Você simplesmente ignora e depois de alguns dias posta o mesmo problema.
🤷