Целые числа не складываются

#java #arraylist

#java #arraylist

Вопрос:

Я работаю над методом, который будет вычислять средний балл за определенный семестр, моя проблема в том, что после добавления условных выражений оценки не будут добавляться в tGrade. Удаление «if» и «else if» решило бы мою проблему, но это дало бы неверный результат, поэтому есть идеи о том, что я могу делать неправильно?

 public double computeGPA(ArrayList<Course> courseTaken) {
    double cGPA;
    int tGrade = 00;
    int tUnits = 00;

    for (int x=0; x<courseTaken.size(); x  ) {
        for(int y=1; y<courseTaken.size(); y  ) {
            if(courseTaken.get(x).getCGrade()>=97) {
                courseTaken.get(x).setCGrade(4);
            } else if (courseTaken.get(x).getCGrade()>=89 amp;amp; courseTaken.get(x).getCGrade()<=96) {
                courseTaken.get(x).setCGrade(3);
            } else if (courseTaken.get(x).getCGrade()>=80 amp;amp; courseTaken.get(x).getCGrade()<=88) {
                courseTaken.get(x).setCGrade(2);
            } else if (courseTaken.get(x).getCGrade()>=74 amp;amp; courseTaken.get(x).getCGrade()<=79) {
                courseTaken.get(x).setCGrade(1);
            } else {
                courseTaken.get(x).setCGrade(0);
            }

            tGrade = courseTaken.get(x).getCGrade() courseTaken.get(y).getCGrade();
            tUnits = courseTaken.get(x).getCUnits() courseTaken.get(y).getCUnits();
        }
    }

    cGPA = (tGrade*tUnits)/tUnits;
return cGPA;
}
  

Пока проблема в том, что код переходит прямо к оператору else, подрывая другие. Чтобы добавить, данные хранятся в текстовом файле, и что каждый объект, конечно, имеет градацию выше 85.

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

1. Подсказка по удобочитаемости: старайтесь избегать большого количества повторяющихся вызовов. Используйте Course course = courseToken.get(x); int grade = course.getCGrade(); для начала… (И вы уверены, что действительно хотите изменить значение, которое вы читаете? Это не звучит как хорошая идея, тем более, что позже вы будете использовать тот же курс… Вы уверены, что вам вообще нужны вложенные циклы?)

2. Или лучше (поскольку вы, похоже, не используете индексы ни для чего, кроме извлечения из списка), используйте циклы for-each: for (Course course : courseTaken)

3. Не заключайте операторы if в скобки, если это не является абсолютно необходимым if(i >= 97) {...} else if(i >= 89 amp;amp; i <= 96) {...} , этот второй оператор amp;amp; всегда является истинным и излишним.

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

5. если я правильно прочитал ваш код, после первого цикла for y courseTaken.get(x).getCGrade() всегда будет находиться в блоке else, поскольку вы устанавливаете оценку < 5 в своих утверждениях: courseTaken.get(x).setCGrade(4);

Ответ №1:

Итак, после некоторого чтения это то, что я придумал. Конечно, не лучший способ сделать это (повторяющиеся вызовы для каждого цикла могут быть лучше и больше), я буду продолжать улучшать это.

 public double computeGPA(ArrayList<Course> courseTaken) {
    double cGPA;
    double tUnits = 00;
    double tGrade = 00;

    for(int y=0; y<courseTaken.size(); y  ) {
        tUnits  = courseTaken.get(y).getCUnits();
    }

    for(int x=0; x<courseTaken.size(); x  ) {
        if(courseTaken.get(x).getCGrade()>=97) 
            tGrade  = courseTaken.get(x).getCUnits()*4;
         else if(courseTaken.get(x).getCGrade()>=93 amp;amp; courseTaken.get(x).getCGrade()<=96) 
            tGrade  = courseTaken.get(x).getCUnits()*3.5;
         else if(courseTaken.get(x).getCGrade()>=89 amp;amp; courseTaken.get(x).getCGrade()<=92) 
            tGrade  = courseTaken.get(x).getCUnits()*3;
         else if(courseTaken.get(x).getCGrade()>=85 amp;amp; courseTaken.get(x).getCGrade()<=88) 
            tGrade  = courseTaken.get(x).getCUnits()*2.5;
         else if(courseTaken.get(x).getCGrade()>=80 amp;amp; courseTaken.get(x).getCGrade()<=84) 
            tGrade  = courseTaken.get(x).getCUnits()*2;
         else if(courseTaken.get(x).getCGrade()>=75 amp;amp; courseTaken.get(x).getCGrade()<=79) 
            tGrade  = courseTaken.get(x).getCUnits()*1.5;
         else if(courseTaken.get(x).getCGrade()>=70 amp;amp; courseTaken.get(x).getCGrade()<=74) 
            tGrade  = courseTaken.get(x).getCUnits()*1;
         else 
            tGrade  = courseTaken.get(x).getCUnits()*0;

    }
    cGPA = tGrade/tUnits;

return cGPA;
}//computeGPA
  

Ответ №2:

Просто для удобства чтения и эффективности я бы рекомендовал изучить операторы switch вместо использования большого количества операторов if.

Например, вместо этого, если:

 If (x==1){ }
If (x==2){ }
  

… и так далее, вы можете просто протестировать переменную и проверить варианты использования.

 Switch(x){
    case 1: 
          System.out.print("1")
          break;
    case 2:
       System.out.print("2")
         break;
}
  

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

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

1. Моя проблема с операторами switch, используемыми в моем коде, заключается в том, что условия, которые я устанавливаю, представляют собой диапазоны значений (т. Е. От 93 до 96), а не конкретные значения, и если я использую операторы switch, то в итоге у меня будет больше строк кода. Хотя я бы подумал об этом, если я имею дело только с 8-10 конкретными значениями.