2013-07-02 33 views
2

嗨,大家好我正在寫一個數學測驗計劃作爲一個學習練習,我不能得到這個'響應'變量,以後在方法中被識別。具體來說,'* response'變量與* s的任何一方都不會鏈接到之前聲明的響應變量。我是編程新手,非常確定我正在犯一個基本錯誤,但是我不能解決它,如果有人能幫助我,我會很感激。謝謝!如何在該方法中稍後識別此變量?

import acm.util.*; 
import acm.program.*; 


public class MathsQuiz extends ConsoleProgram{ 

    public void run(){ 
     println("This program gives atudents a series of maths questions"); 
     askQuestions(); 
    } 

    private void askQuestions(){ 
     for (int i = 0; i < NUMBER_OF_QS; i++){ 
      askQ(); 
     } 
    } 

    private void askQ(){ 
     int answer = rgen.nextInt(0,20); 
     int number1 = rgen.nextInt(0,20); 
     int number2 = answer - number1; 

     if (number2 > 0){ 
      int response = readInt("What is " + number1 + "+" + number2 + "?"); 

     }else { 
      int response = readInt("What is " + number1 + " " + number2 + "?"); 
     } 

       if (**response** == answer){ 
        println("Correct!"); 
       }else{ 
        println("Incorrect"); 
       } 
     } 


    private RandomGenerator rgen = RandomGenerator.getInstance(); 

    int NUMBER_OF_QS = 5; 
    int RES = 0; 
} 
+0

http://www.java2s.com/Tutorial/Java/ 0020__Language/VariableScope.htm – kfis

+0

響應僅在您聲明的塊中有作用域。將它的聲明移動到外部塊並且事情將起作用。注意只聲明一次,否則你會隱藏外部聲明。 – DaveRlz

+0

總體意義。感謝所有回答的人! –

回答

3

移動response到外部範圍:

int response; 

if (number2 > 0) { 
    response = readInt("What is " + number1 + "+" + number2 + "?"); 
} else { 
    response = readInt("What is " + number1 + " " + number2 + "?"); 
} 

局部變量具有最有限的範圍。這樣的變量只能從其聲明的函數或塊訪問。 局部變量的作用域來自它們聲明的行,直到 聲明的方法或代碼塊的結束大括號。

+0

總體意義。感謝所有回答的人! –

1

您需要responseif聲明之外的定義:

int response = -1; 

if (number2 > 0) { 
    response = /* ... Something ... */ 
} else { 
    response = /* ... Something else ... */ 
} 
1

之前就宣佈它if聲明:

int response; 
if (number2 > 0) { 
    response = ... 
} else { 
    response = ... 
} 

另外,現貨兩個塊之間的差異量小,並且只是使用條件運算符改變:

String separator = number2 > 0 ? "+" : " "; 
int response = readInt("What is " + number1 + separator + number2 + "?"); 
1

它的原因是您在if語句內部創建了變量響應。試試這個,而不是

private void askQ(){ 
int answer = rgen.nextInt(0,20); 
int number1 = rgen.nextInt(0,20); 
int number2 = answer - number1; 
int response; //to create the variable in the right scope 


if (number2 > 0){ 
    response = readInt("What is " + number1 + "+" + number2 + "?"); 

}else { 
    response = readInt("What is " + number1 + " " + number2 + "?"); 
} 

     if (**response** == answer){ 
      println("Correct!"); 
     }else{ 
      println("Incorrect"); 
     } 
} 
+0

爲什麼最初將該值設置爲0,當該值永遠不會被讀取? –

+0

你可以在那裏放一個分號,但看着他的代碼我看到它不會改變任何東西,他說他是編程新手,所以對他來說可能更有意義 – Ben

+0

我會爭辯說,任何時候你當你不需要的時候指定一個值(以及什麼時候它永遠不會被讀取),你正在寫錯誤的代碼。它看起來像你真的*想*值是0 - 當它從未使用過。 –

1

response是一個局部變量,其可訪問僅限於在其已申報塊內。因此,response只能在if else塊內訪問。如果您嘗試在範圍外使用response,那麼您將收到編譯時錯誤,直到您不重新聲明它爲止。

所以,如果你想使用響應了if else塊的,你必須聲明它的塊如下:

int response; 
if (number2 > 0){ 
    response = readInt("What is " + number1 + "+" + number2 + "?"); 
}else { 
    response = readInt("What is " + number1 + " " + number2 + "?"); 
}