Java: проблема с вычислением минимального значения, отсканированного из текстового файла

#java #input #text-files #minimum

#java #ввод #текстовые файлы #минимальный

Вопрос:

Программа, над которой я работаю, берет числа из обычного текстового файла и выполняет вычисления на основе чисел. Одним из необходимых вычислений является общее минимальное значение.

Проблема заключается в том, что моя текущая переменная минимального балла установлена равной текущему выбранному значению из текстового документа. Таким образом, оно в основном всегда будет равно последнему значению. Или, альтернативно, оно всегда равно нулю, если я не устанавливаю два значения равными друг другу. Проблема в том, что я понятия не имею, как точно рассчитать минимальное значение.

Java-код

 public class ExamStats {
static final int bottomA = 90;
static final int bottomB = 80;
static final int bottomC = 70;
static final int bottomD = 60;

public static void main(String[] args) throws FileNotFoundException {
    double totalSum = 0;
    int numberOfExams = 0;
    double examAverage = 0;
    int currentScore = 0;
    double aCount = 0;
    double bCount = 0;
    double cCount = 0;
    double dCount = 0;
    double fCount = 0;
    double aPercent = 0;
    double bPercent = 0;
    double cPercent = 0;
    double dPercent = 0;
    double fPercent = 0;
    int maxScore = 0;
    int minScore = 0;

    Scanner scan = new Scanner(System.in);
    File f = new File("Grades.txt");
    DecimalFormat twoDecimal = new DecimalFormat("#.##");
    DecimalFormat noDecimal = new DecimalFormat("#");
    System.out.println("Enter the name of the file here: ");
    String fileName = scan.nextLine();
    Scanner fileLocation = new Scanner(new FileReader(fileName));
    while (fileLocation.hasNext()){             //Reads each individual entry from the text file. 
        currentScore = fileLocation.nextInt();
        numberOfExams  ;
        totalSum  = currentScore;
        if (currentScore >= bottomA){
            aCount  ;
        }
        if (currentScore >= bottomB amp;amp; currentScore < bottomA){
            bCount  ;
        }
        if (currentScore >= bottomC amp;amp; currentScore < bottomB){
            cCount  ;
        }
        if (currentScore >= bottomD amp;amp; currentScore < bottomC){
            dCount  ;
        }
        if (currentScore < bottomD) {
            fCount  ;
        }

        if (currentScore < minScore){
            minScore = currentScore;
        } 
        if (currentScore > maxScore){
            maxScore = currentScore;
        }
  

Комментарии:

1. minScore = currentScore без условий — это все испортит…

Ответ №1:

MinScore присваивается currentScore

 minScore = currentScore;
  

Затем сравнивается, но обе переменные будут иметь одинаковое значение, условие никогда не будет истинным

 if (currentScore < minScore){
    minScore = currentScore;
}
  

Удалите присвоение перед if , и программа будет работать должным образом.

Комментарии:

1. Но если все значения <0, минимальная оценка всегда будет равна 0, поскольку это то, на что она инициализирована.

2. Не могли бы вы привести пример отрицательного числа, которое будет принимать значение false if (<negative number> < 0) ?

3. Моя ошибка, я ввел неправильную стрелку. Минимальный показатель будет правильным, если введено хотя бы одно отрицательное число, а максимальный будет правильным, если введено хотя бы одно положительное число. Если эти условия не могут быть гарантированы, вам придется инициализировать переменные первым значением в файле

Ответ №2:

Проблема в том, что вы устанавливаете минимальный балл в текущий балл на каждой итерации цикла со строкой

 minScore = currentScore;
  

Если вы измените программу так, чтобы эта строка выполнялась только один раз, перед циклом. Это также означает, что вам нужно будет проверить, что на самом деле есть данные, прежде чем делать это.

Хотя это будет работать для неотрицательных чисел, возможно, также стоит поместить строку maxScore = currentScore в одно и то же место, чтобы избежать проблем, если все оценки меньше 0.

Редактировать: следующий код «должен» делать то, о чем я говорю, но, вероятно, есть лучшие способы его реализации

 //Rest of your program
System.out.println("Enter the name of the file here: ");
String fileName = scan.nextLine();
Scanner fileLocation = new Scanner(new FileReader(fileName));
if (fileLocation.hasNext()) {
    currentScore = fileLocation.nextInt();
    minScore = currentScore;
    maxScore = currentScore;
} else {//Throw an error or something
}
// Rest of the program
  

Затем вам придется немного изменить цикл, чтобы учесть это. Изменение цикла на посттестовый и перемещение строки currentScore = fileLocation.nextInt(); в последнюю строку цикла было бы одним из способов заставить его работать.

Комментарии:

1. На самом деле этого там не должно быть, теперь оно удалено. Однако основная проблема все еще не решена, поскольку значение MinScore по умолчанию равно 0; и Java не позволит мне использовать неинициализированную переменную для MinScore, поскольку она используется для сравнения.

2. Поэтому я заявил, что вместо удаления строки вам следует найти способ переместить ее функциональность выше цикла, чтобы MinScore инициализировался первым значением в файле

3. Я ответил не тому человеку. Хорошо, я попробую приравнять его к циклу.