Не понимаю, как сделать мой цикл for и if statement

У меня это есть, но я очень потерял то, как я могу получить окончательный GPA для печати, я пробовал разные способы, но не смог сделать это успешно. Это то, что у меня есть:

Scanner input = new Scanner(System.in);

 System.out.println("How many grades are you putting? ");
 int length = input.nextInt();
 input.nextLine();

 String[] gradesArray = new String[length];

 for(int i = 0; i < gradesArray.length; i++)
 {
 System.out.println("Enter grade (include + or -) ");
 gradesArray[i] = input.nextLine();

 ****** points = 0.0;
 if(gradesArray[i].equalsIgnoreCase("A+") || gradesArray[i].equalsIgnoreCase("A"))
 {
 points += 4;

 }
 else if(gradesArray[i].equalsIgnoreCase("A-"))
 {
 points+= 3.7;

 }
 else if(gradesArray[i].equalsIgnoreCase("B+"))
 {
 points += 3.3;

 }
 else if(gradesArray[i].equalsIgnoreCase("B"))
 {
 points += 3.0;

 }
 else if(gradesArray[i].equalsIgnoreCase("B-"))
 {
 points += 2.7;

 }
 else if(gradesArray[i].equalsIgnoreCase("C+"))
 {
 points += 2.3;

 }
 else if(gradesArray[i].equalsIgnoreCase("C"))
 {
 points += 2.0;

 }
 else if(gradesArray[i].equalsIgnoreCase("D"))
 {
 points += 1.0;

 }
 else if(gradesArray[i].equalsIgnoreCase("F"))
 {
 points += 0.0;

 }
 else
 {
 System.out.println("Invalid grade");
 }
 System.out.println("GPA: " + points / gradesArray.length);
 }

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

4 ответа

Ты очень близко. Вам нужно добавить еще один кронштейн перед вашим println чтобы закрыть свой forloop. Вы хотите только вычислить GPA, как только будут введены все оценки. Ну вот так:

И, как сказал Джейсон в комментариях, вам нужно создать points за пределами цикла. В противном случае вы не сможете получить к нему доступ после этого, чтобы получить полный GPA.

****** points = 0.0; //this has to go out here to be able to access it later

for(int i = 0; i < gradesArray.length; i++) {
 System.out.println("Enter grade (include + or -) ");
 gradesArray[i] = input.nextLine();

 ...

 else if(gradesArray[i].equalsIgnoreCase("F")) {
 points += 0.0;

 } else {
 System.out.println("Invalid grade");
 }
}
System.out.println("GPA: " + points / gradesArray.length);

Что касается сброса ввода, это также легко. Вы можете просто использовать while цикл - так что - то вроде этого.

boolean inputNeeded = true;

while(inputNeeded) {
 System.out.println("Please enter grades:);
 String grade = scan.nextLine();
 if(grade_is_valid_check_here) {
 inputNeeded = false;
 } else {
 System.out.println("Input is invalid - please try again");
 }
}


Помимо ответа @Alex K. Не уверен, что вы узнали о HashMaps или нет, но вы можете немного сократить свой код, используя их. Это также облегчает добавление другого значения класса и точки с легкостью.

Scanner input = new Scanner(System. in );

System.out.println("How many grades are you putting? ");
int length = input.nextInt();

String[] gradesArray = new String[length];
//Create a HashMap with String as the key, and a ****** as the value
Map < String, ****** > grades = new HashMap < > ();
//Insert all the grades and point values
grades.put("A+", 4.0);
grades.put("A-", 3.7);
grades.put("B+", 3.3);
grades.put("B", 3.0);
grades.put("B-", 2.7);
grades.put("C+", 2.3);
grades.put("C", 2.0);
grades.put("D", 1.0);
grades.put("F", 0.0);

****** points = 0.0;

for (int i = 0; i < gradesArray.length; i++) {
 System.out.println("Enter grade (include + or -) ");
 String grade = input.nextLine();
 gradesArray[i] = grade;
 //If the grades Map contains the inputted grade, use Map.get(grade) to obtain the value and add that to the points ******. 
 //Otherwise print invalid grade
 if (grades.containsKey(grade)) {
 points += grades.get(gradesArray[i]);
 } else {
 System.out.println("Invalid grade");
 }
}
System.out.println("GPA: " + points / gradesArray.length);


Вы могли бы сделать что-то подобное этому. Вы можете использовать блок переключателей. points должны быть выведены за пределы цикла или он просто будет сброшен до 0.0 каждый раз, когда пользователь вводит оценку.

Чтобы заставить пользователя начать работу, если это недопустимый класс, вы можете использовать рекурсивный вызов. Это означает, что после сообщения "Недопустимый класс" вы вызовете метод, который запустит процесс заново. Для этого потребуется немного больше рефакторинга и отделить часть этого кода от большего количества методов.

Scanner input = new Scanner(System.in);
 ****** points = 0.0;

 System.out.println("How many grades are you putting? ");
 int length = input.nextInt();
 input.nextLine();

 String[] gradesArray = new String[length];

 for(int i = 0; i < gradesArray.length; i++){
 System.out.println("Enter grade (include + or -) ");
 gradesArray[i] = input.nextLine();

 String grade = gradesArray[i].toUpperCase();
 switch (gradesArray[i]) {
 case "A+":
 points += 4;
 break;
 case "A":
 points += 4;
 break;
 case "A-":
 points += 3.7;
 break;
 case "B+":
 points += 3.3;
 break;
 default:
 System.out.println("Invalid grade");
 break;
 }
 }
 System.out.println("GPA: " + points / gradesArray.length);


Все, что вам нужно, это объявить точки как глобальную переменную и распечатать GPA за пределами цикла for

public class Grade {

public static void main(String[] args){
****** points=0.0;
Scanner input = new Scanner(System.in);

System.out.println("How many grades are you putting? ");
int length = input.nextInt();
input.nextLine();

String[] gradesArray = new String[length];

for(int i = 0; i < gradesArray.length; i++)
{
 System.out.println("Enter grade (include + or -) ");
 gradesArray[i] = input.nextLine();


 if(gradesArray[i].equalsIgnoreCase("A+") || gradesArray[i].equalsIgnoreCase("A"))
 {
 points += 4;

 }
 else if(gradesArray[i].equalsIgnoreCase("A-"))
 {
 points+= 3.7;

 }
 else if(gradesArray[i].equalsIgnoreCase("B+"))
 {
 points += 3.3;

 }
 else if(gradesArray[i].equalsIgnoreCase("B"))
 {
 points += 3.0;

 }
 else if(gradesArray[i].equalsIgnoreCase("B-"))
 {
 points += 2.7;

 }
 else if(gradesArray[i].equalsIgnoreCase("C+"))
 {
 points += 2.3;

 }
 else if(gradesArray[i].equalsIgnoreCase("C"))
 {
 points += 2.0;

 }
 else if(gradesArray[i].equalsIgnoreCase("D"))
 {
 points += 1.0;

 }
 else if(gradesArray[i].equalsIgnoreCase("F"))
 {
 points += 0.0;

 }
 else
 {
 System.out.println("Invalid grade");
 }
}
 System.out.println("GPA: " + points / gradesArray.length);
}

licensed under cc by-sa 3.0 with attribution.