Java — циклы и определенные символы

#java #loops #java.util.scanner

#java #петли #java.util.сканер

Вопрос:

Мне нужно, чтобы программа выполнялась в цикле до конца файла. Предполагается, что при каждом запуске цикла он будет фиксировать имя учащегося и результаты тестов. Предполагается, что программа узнает, что она достигла конца баллов ученика, когда находит «-1». Затем предполагается, что она найдет их среднее значение и буквенную оценку. В конце предполагается, что программа распечатает файл с кратким описанием для всего класса.

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

 public static void main(String[] args) throws FileNotFoundException {        
    //Declare String Variables
    String name = null;
    String grade;
    String inFile;
    String outFile;
    PrintWriter outputFile;

    //Declare Numerical Variables
    double score1 = 0;
    double score2 = 0;
    double score3 = 0;
    double score4 = 0;
    double score5 = 0;
    double score6 = 0;
    double score7 = 0;
    double score8 = 0;
    double count = 0;
    double average;


    //Capture Student Info
    while(scanFile.hasNext()){
        name = scanFile.nextLine();
        if (scanFile.hasNextInt()){
            score1 = scanFile.nextInt();
                count  ;
            if (score1 == -1){

            }
                break;
            else if (score1 != -1)
                score2 = scanFile.nextInt();
                count  ;
            if (score2 == -1){
                count--;
                break;
            }
            else if (score2 != -1)
                score3 = scanFile.nextInt();
                count  ;
            if (score3 == -1){
                count--;
                break;
            }
            else if (score3 != -1)
                score4 = scanFile.nextInt();
                count  ;
            if (score4 == -1){
                count--;
                break;
            }
            else if (score4 != -1)
                score5 = scanFile.nextInt();
                count  ;
            if (score5 == -1){
                count--;
                break;
            }
            else if (score5 != -1)
                score6 = scanFile.nextInt();
                count  ;
            if (score6 == -1){
                count--;
                break;
            }
            else if (score6 != -1)
                score7 = scanFile.nextInt();
                count  ;
            if (score7 == -1){
                count--;
                break;
            }
            else if (score7 != -1)
                score8 = scanFile.nextInt();
                count  ;
        }
    }
            //Processed data for student
            average = findAverage(score1, score2, score3, score4, score5, score6, score7, score8, count);
            grade = letterGrade(average);

            //Printing Output File
                      outputFile.print("Grade Report for Introduction to Programming Inn");
                      outputFile.print("This program will process test scores.");
                    //Output
                printFile(outputFile, name, count, average, grade);
                //}
            outputFile.close();
        }
 

Пример входного файла

  John Sweet
 87 76 90 100 -1
 Ali Hassan
 -1
 Willy Nilly
 73 63 74 70 -1
 Juju Smith Jr.
 89 90 78 88 -1
 Karl Kavington III
 90 100 80 70 -1
 Lary Howard Holiday
 80 77 67 67 -1
 Leo Gordon
 56 88 780 77 -1
 Jessy Brown
 -1
 Mr. Perfect
 100 100 100 100 -1
 Mr. Missing It All
 0 0 0 0 0 0 -1
 

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

1. Знаете ли вы интерфейс java.util.List и его реализации, такие как java.util.ArrayList ?

2. Компилируется ли этот код вообще? Я был бы удивлен.

Ответ №1:

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

 while(scanFile.hasNext()){ //get average of each student
    name = scanFile.nextLine();
    double count = 0, totalScore = 0;
    while (scanFile.hasNextInt()){
        totalScore = scanFile.nextInt();
        count  ;
    }
    double average = findAverage(totalScore, count);
    //Processed data for student
    grade = letterGrade(average);
}
 

Обратите внимание, что я изменил способ вызова findAverage метода, изменить это в вашем коде должно быть довольно просто. После получения среднего значения делайте с ними все, что вам нужно.

Я думаю, что у вас все еще возникают проблемы с базовыми циклами в Java, я рекомендую прочитать больше о том, как их использовать, вот рекомендация.