получение 0 выходных данных вместо правильного вывода

#java

#java

Вопрос:

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

 import java.util.Scanner;

public class LogBook  { 
    public static void main(String[] args) {
        GradeCalculation g = new GradeCalculation();
        g.Askmarks();
        g.finalmark();
    }
}
  

 import java.util.Scanner;

public class GradeCalculation {
    Scanner kb = new Scanner(System.in);

    private double quiz, midsemester, appliedproject, finaltest, finalmarks;

    GradeCalculation(double quiz, double midsemester, double appliedproject, double finaltest, double finalmarks){
    }

    GradeCalculation(){

    }

    public void Askmarks(){
        System.out.print("Enter the QUIZ marks: ");
        double quiz = kb.nextDouble();
        System.out.print("Enter the midsemester marks: "); 
        double midsemester = kb.nextDouble();
        System.out.print("Enter the appliedproject: ");
        double appliedproject = kb.nextDouble();
        System.out.print("Enter the finaltest: ");  
        double finaltest = kb.nextDouble();
    }

    public void finalmark(){
        finalmarks= 0.1*(quiz) 0.2*(midsemester) 0.4*(appliedproject) 0.3*(finaltest);
        System.out.print("Enter the final: "   finalmarks);  
    }   
}
  

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

1. Вы никогда нигде не инициализируете свои поля (т. Е. this.quiz И т. Д.). Все, что вы делаете в AskMarks (который должен быть назван askMarks), — это инициализация локальных переменных, которые имеют то же имя, что и поля

2. Вы затеняете свои поля AskMarks() . 🙂

3. спасибо за решение этой проблемы, хорошего вам друга

Ответ №1:

Проблема в том, что вы определяли локальные переменные в Askmarks

 double quiz = kb.nextDouble();
...
double finaltest = kb.nextDouble();
  

Они не влияют на поля

 private double quiz, midsemester ,appliedproject ,finaltest,finalmarks;
  

и, следовательно, в finalmark , вы получаете значение по умолчанию для каждого double поля, которое 0.0 .

Решением будет установка полей, а не инициализация локальных переменных.

 this.quiz = kb.nextDouble();
...
this.finaltest = kb.nextDouble();
  

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

1. @aNKY, было бы здорово, если бы вы установили флажок в этом ответе, поскольку вы обнаружите, что этот ответ решает вашу проблему.

Ответ №2:

В вашем Askmarks методе вы переопределяете переменные, предваряя их double . Если вы удалите doubles из своего Askmarks метода, он должен работать.

 public void Askmarks(){
    System.out.print("Enter the QUIZ marks: ");
    quiz = kb.nextDouble();
    System.out.print("Enter the midsemester marks: "); 
    midsemester = kb.nextDouble();
    System.out.print("Enter the appliedproject: ");
    appliedproject = kb.nextDouble();
    System.out.print("Enter the finaltest: ");  
    finaltest = kb.nextDouble();
}
  

Ответ №3:

Вы затеняете свои поля в GradeCalculation in Askmarks() . Удалите объявления типов переменных внутри функции. Итак, вместо:

 ...
double quiz = kb.nextDouble();
...
  

Вы должны использовать:

 ...
quiz = kb.nextDouble();
...
  

или

 ...
this.quiz = kb.nextDouble();
...
  

Что вы делаете с:

 ...
double quiz = kb.nextDouble();
...
double midsemester = kb.nextDouble();
...
  

заключается в том, что вы затеняете поля класса с тем же именем (например double quiz , собираетесь затенять класс quiz ). Затенение относится к поведению, при котором переменная, объявленная и / или инициализированная в некоторой области, «заменяет» другую переменную с тем же именем, находящуюся во внешней области.

В вашем случае Askmarks() теперь будет думать, что, например, quiz это локальная переменная, которая существует только внутри функции, а поле класса quiz больше не существует в его точке зрения.

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

1. На самом деле, здесь нет затенения, OP не ссылался ни на какие локальные переменные после их инициализации

2. Я не думаю, что вам нужно ссылаться на какие-либо локальные переменные, прежде чем может произойти затенение. Затенение уже произошло, поскольку OP определил локальные переменные с тем же именем, что и переменные экземпляра.

3. Я полностью согласен с тем, что «двойная викторина затенит викторину класса». Я просто говорю, что определение переменной с более узкой областью видимости и игнорирование ее не приводит к затенению. Итак, технически во фрагменте OP нет затенения / скрытия.