2013-05-21 133 views
0

我是第一次在這裏用戶,儘管試圖找到我的nooby問題的答案有時會讓我在這裏過去。所以基本上,我用這個代碼來找到行星地球的表面溫度,實現我已經提供的幾個論壇。我需要找到一個值(epCarbonDi),這個值取決於大氣中的碳含量。我使用了一個「for」循環來讓java在每次碳變化時都做這個方程,但bluej不會編譯它,它表示變量可能沒有被初始化。我已經在「for」循環之前聲明瞭它,但沒有爲它賦值,因爲「for」循環意味着在那裏用變量填充變量,然後我需要在循環之外使用它。在循環外使用for循環中的變量

我在某處讀到,如果你只是用0初始化循環外部的變量,它應該以這種方式工作^^,所以我做到了,編譯並且很棒。我去執行它,我所有的信息都很好,但是你看,所有的答案都是相同的!

所以我認爲「for」循環執行了一次並找到了答案,但之後沒有完成所有其他值,我需要它來做到這一點?

我真的很需要一些建議,如果任何人有任何..我會非常感激。我需要能夠在「for」循環之外使用epCarbonDi變量,以及下一個等式的循環值/ s!如果有人能指出我的方向是正確的,那就太棒了。我很新的Java,我已經重新閱讀我的筆記和我的教科書,我已經谷歌搜索它,我找不到任何使它的工作D:

這是我的整個代碼

import java.text.DecimalFormat; 
import java.math.RoundingMode; 

/** 
* A program to calculate the surface temperature of Earth 
* based on a range of carbon dioxide levels. 
* 
* @author Lyssa ------ - Student #--------- 
* @version ---------- 
*/ 
public class Stage4 
{ 
    public static void main(String[] args) 
    { 
     //define constants for calculating emissivity 
     final double EP_WATER = 0.65;   //component of emissivity due to water 
     final double A = 0.1;     //component of emissivity due to carbon dioxide 
     final double B = 0.06;     //component of emissivity due to carbon dioxide 
     final double PREINDUST_CARBONDI = 280; //pre-industrial level of carbon dioxide in Earth's atmosphere 

     //define surface temperature constants 
     final double SOLAR_CONSTANT = 1367; 
     final double ALBEDO = 0.3; 
     final double STEFANB_CONSTANT = 5.67E-8; 
     final double ORBIT_RAD = 1.0;   //the orbital radius of Earth. 
     final double KELV_CELS_DIFF = 273.15; //the difference between kelvin and celsius. 

     //declare variables to hold answer values 
     double epsilon;       //emissivity of the planet 
     double epCarbonDi = 0.0;    //component of emissivity due to carbon dioxide 
     double surfaceTemp; 
     double surfaceTempCelsius; 

     //formula to calcluate value of emissivity due to carbon dioxide 
     for(double carbonDiox = 280.0; carbonDiox <= 400.0; carbonDiox = carbonDiox += 5) 
     { 
      epCarbonDi = A + B*Math.log(carbonDiox/PREINDUST_CARBONDI); 
     } 

     //formula to calculate emissivity 
     epsilon = 1.0 - (EP_WATER + epCarbonDi/2); 

     //write calculation to find surface temperature 
     surfaceTemp = 
       Math.pow((SOLAR_CONSTANT/4)*(1.0 - ALBEDO) 
       /(STEFANB_CONSTANT*epsilon*ORBIT_RAD*ORBIT_RAD), 0.25); 

     //convert answer from kelvin to celcius 
     surfaceTempCelsius = surfaceTemp - KELV_CELS_DIFF; 

     //enable answer to be truncated to 2 decimal places 
     DecimalFormat df = new DecimalFormat("####0.00"); 
     df.setRoundingMode(RoundingMode.FLOOR); 

     for(double carbonDiox = 280.0; carbonDiox <= 400.0; carbonDiox = carbonDiox += 5) 
     { 
      System.out.print("For a carbon level of " + carbonDiox + 
          " the surface temperature is: " 
          + df.format(surfaceTempCelsius) 
          + " \u00b0" + "C"); 
      System.out.print("\n"); 
     } 
    } 
} 

,這是在具有即時通訊的問題:

//declare variables to hold answer values 
     double epsilon;       //emissivity of the planet 
     double epCarbonDi = 0.0;    //component of emissivity due to carbon dioxide 
     double surfaceTemp; 
     double surfaceTempCelsius; 

     //formula to calcluate value of emissivity due to carbon dioxide 
     for(double carbonDiox = 280.0; carbonDiox <= 400.0; carbonDiox = carbonDiox += 5) 
     { 
      epCarbonDi = A + B*Math.log(carbonDiox/PREINDUST_CARBONDI); 
     } 

     //formula to calculate emissivity 
     epsilon = 1.0 - (EP_WATER + epCarbonDi/2); 

     //write calculation to find surface temperature 
     surfaceTemp = 
       Math.pow((SOLAR_CONSTANT/4)*(1.0 - ALBEDO) 
       /(STEFANB_CONSTANT*epsilon*ORBIT_RAD*ORBIT_RAD), 0.25); 
+1

TL; DR;假設文本和代碼的所有內容都屬於標題中的問題:*在循環外使用一個變量,在循環外*,在具有初始值的'for'循環之外和之前聲明變量,使用將它填入'for'循環並在'for'循環完成其工作後使用它。 –

+0

只是我注意到的一件快事,你的for循環沒有做任何有用的事情。你的意思是使用類似'+ =','* ='等的東西嗎? – Breavyn

回答

0

一些問題,我看到

  • 您要指派給epCarbonDi在循環內,但編譯器無法確定循環總是執行的事實,從第一次迭代開始條件可能是錯誤的,因此epCarbonDi可能在未初始化後使用。
  • 您使用carbonDiox = carbonDiox += 5作爲增量的條件,但它相當於carbonDiox += 5
  • 你的循環中你沒有積累任何價值,只是分配給它(epCarbonDi = ..),從而覆蓋以前的迭代,是預期的行爲還是什麼?
+0

1)不太確定我在追隨D:我喜歡小菜,對不起。 2)哦。呵呵>。>真的我確定我知道,但是在編寫代碼時我沒有想到:/謝謝:) 3)嗯,我猜不是,不。如果它在下一次執行方程時覆蓋每個答案,則不。我需要每個方程給出的每個值。 –

0

@ honeyb_93如果覆蓋epCarbonDi不期望的行爲,那麼你應該使用存儲的epCarbonDi所有的值的數組。

 double epsilon;       //emissivity of the planet 
     double epCarbonDi[] = new double[ /*NO. OF VALUES TO BE STORED*/ ];    //component of emissivity due to carbon dioxide 
     double surfaceTemp; 
     double surfaceTempCelsius; 

     //formula to calcluate value of emissivity due to carbon dioxide 
     int i = 0; 
     for(double carbonDiox = 280.0; carbonDiox <= 400.0; carbonDiox = carbonDiox += 5) 
     { 
      epCarbonDi[i] = A + B*Math.log(carbonDiox/PREINDUST_CARBONDI); 
      i = i+1; 
     } 

看看這個。

+0

謝謝非常感謝您回答:)我按照您的建議做了,然後將此公式改爲:epsilon = 1.0 - (EP_WATER + epCarbonDi [i]/2);和以前一樣的事情發生了。答案都是一樣的。答案是不同於以前的時間,但他們都是一樣的... –

1

在您的循環中超時epCarbon值被替換,所以永久的時間一旦循環完成epCarbon的值將是A + B * Math.log(400/PREINDUST_CARBONDI)的reult。它相當於我上面提到的單個語句,因此for循環沒有任何意義。告訴我你想要的環路epCarbonDi裏面究竟是什麼,對於每個迭代結果你希望它添加到先前的結果在這種情況下,你的代碼更改爲以下

for(double carbonDiox = 280.0; carbonDiox <= 400.0; carbonDiox = carbonDiox += 5) 
    { 
     epCarbonDi = epCarbonDi+(A + B*Math.log(carbonDiox/PREINDUST_CARBONDI)); 
    } 

,或者如果你想整個事情,直到每個迭代的System.out然後把整個事情在1環

//formula to calcluate value of emissivity due to carbon dioxide 
    for(double carbonDiox = 280.0; carbonDiox <= 400.0; carbonDiox = carbonDiox += 5) 
    { 
     epCarbonDi = A + B*Math.log(carbonDiox/PREINDUST_CARBONDI);  

     //formula to calculate emissivity 
     epsilon = 1.0 - (EP_WATER + epCarbonDi/2); 

     //write calculation to find surface temperature 
     surfaceTemp = 
      Math.pow((SOLAR_CONSTANT/4)*(1.0 - ALBEDO) 
      /(STEFANB_CONSTANT*epsilon*ORBIT_RAD*ORBIT_RAD), 0.25); 

     //convert answer from kelvin to celcius 
     surfaceTempCelsius = surfaceTemp - KELV_CELS_DIFF; 

     //enable answer to be truncated to 2 decimal places 
     DecimalFormat df = new DecimalFormat("####0.00"); 
     df.setRoundingMode(RoundingMode.FLOOR);  
     System.out.print("For a carbon level of " + carbonDiox + 
         " the surface temperature is: " 
         + df.format(surfaceTempCelsius) 
         + " \u00b0" + "C"); 
     System.out.print("\n"); 
} 

,如果這不是你想要什麼,然後告訴我你想要的是循環爲epCarbonDi的價值是什麼,我會幫你

+0

oh.my.goodness。你是一個傳奇!第二個解決方案正是我所需要的。我非常感激!謝謝這麼多:)它可能應該發生在我把整個織物的東西進入循環,但它沒有,所以謝謝你!只要它讓我按下按鈕來接受你的答案,我就會:D THANKYOU !! –

0

您使用的變量是雙精度型。每次執行for循環時,它都會爲需要的變量賦值。但在每次迭代中,值都被重寫。即在循環的第一次運行中。假設變量被賦值爲1.在第二次運行時,您將重新賦值給同一個變量,比如2,依此類推。所以變量將始終具有從for循環的最後一次運行計算出的值。

如果要使用for循環中計算的每個值,請將其存儲在數組或列表中,並稍後根據需要使用它們。