#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, я рекомендую прочитать больше о том, как их использовать, вот рекомендация.