Pessoal, faz algum tempo que não posto aqui.
Fiz um software que calcula a média das provas digitadas.
O problema está quando o usuário cancela a InputDialog, aí a media dá um valor incorreto. Será que vocês podem me ajudar? Meu código ficou um pouco complicado, espero que os comentários ajudem.
import javax.swing.JOptionPane;
public class CalculaMedia {
public static void main(String[] args) {
double num = 0, media = 0;
int i = 1;
String nProvas;
JOptionPane.showMessageDialog(null, "ESSE É UM SOFTWARE LIVRE, CRIADO UNICAMENTE COM O INTUITO DE APRENDIZADO\nOBJETIVO: Calcular médias.");
nProvas = JOptionPane.showInputDialog("Digite o número de provas. ");
int nNProvas = Integer.parseInt(nProvas);
//O número de Provas é convertido para um número inteiro
System.out.println("A partir de agora, o programa ira calcular os " + nProvas + " Testes." + "\n" + "Tenha atencao ao digitar as notas.");
System.out.println("Para corrigir uma nota anterior, clique em CANCELAR.");
while (i <= nNProvas) {
//Calcula enquanto o número o i for menor que nNProvas (número de provas). i = 1.
//Estrutura para tratar erros.
try {
String numS = JOptionPane.showInputDialog("Digite a nota da prova " + i + ".");
num = Double.parseDouble(numS);
}
catch (NumberFormatException ex1) {
JOptionPane.showMessageDialog(null, "Digite um número válido\nCaso haja casas decimais, utilizar \".\" para separar. +");
i--;
}
catch (NullPointerException ex2) { //Ocorre ao clica no botão cancelar
//Executa apenas se a prova não for a primeira
if (i > 1) {
JOptionPane.showMessageDialog(null, "Ao clicar em cancelar, você pode corrigir a nota anterior."); //É alertado ao usuário que ele deve corrigir a nota anterior
media -= (num * 2);
/*Como o último número digitado ainda está gravado, ele será cancelado da média aqui, cancelando a última média
Como logo abaixo, o num será somado novamente à média, multipliquei ele por 2, tirando assim um número 2x maior, anulando o código abaixo.*/
i-= 2;
//Retirei 2 i's exatamente para voltar uma prova, porque ocorre o incremento de +1 i abaixo.
}
else {
i--;
//Se ali em cima, eu tirava 2 i's, aqui eu tiro 1, e ainda assim, aparece a prova correta(-1 i +1 i = 0).
}
}
//Executa de qualquer maneira
if (num >= 0 && num <= 10) {
//If para verificar se o número digitado para a prova atual está entre 0 e 10
media += num;
num = 0;
i++;
}else {
JOptionPane.showMessageDialog(null, "A nota deve estar entre 0 e 10.");
}
}
media = media / Integer.parseInt(nProvas);
//Converte a String nProvas para int e já calcula a média.
JOptionPane.showMessageDialog(null, "Média: " + media + "\n" + "Provas computadas: " + nProvas);
//Exibe o resultado e as provas calculadas.
}
}