[英]use a variable from inside a for loop, outside of the loop
我是這里的第一次用戶,盡管過去有時試圖找到有關我的nooby問題的答案的經驗。
因此,基本上,我使用此代碼來查找行星的表面溫度,並實現了一些已提供的論壇。 我需要找到一個值(epCarbonDi),該值根據大氣中的碳含量而變化。 每當碳量發生變化時,我都使用“ for”循環讓java來執行方程式,但是bluej不會對其進行編譯,它表示該變量可能尚未初始化。 我已經在“ for”循環之前聲明了它,但沒有給它賦值,因為“ for”循環意味着要在其中用一個值填充變量,然后我需要在循環外使用它。
我在某處讀到,如果您只是將循環外的變量初始化為0,則它應該以這種方式工作^^,所以我做到了,並且可以編譯並且效果很好。 我去執行它,我所有的信息行都很好,但是瞧瞧,所有答案都是一樣的!
因此,我收集到“ for”循環已執行一次並找到了答案,但是對於我需要它執行的所有其他值沒有做到這一點?
如果有人有的話,我真的真的需要一些建議。我將非常感謝。 我需要能夠將“ for”循環外的epCarbonDi變量與下一個方程式的循環值一起使用! 如果有人可以向我指出正確的方向,那就太好了。 我對Java還是很陌生,我已經重新閱讀了所有筆記和教科書,並在Google上進行了搜索,但找不到任何可以使它正常工作的東西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);
每次循環中都會替換epCarbon值,因此每次循環完成后,epCarbon中的值將成為A + B * Math.log(400 / PREINDUST_CARBONDI)的結果; 正如我上面提到的,它等效於單個語句,因此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的值我會幫助您
我看到的一些問題
epCarbonDi
,但編譯器無法弄清楚循環始終執行的事實,該條件可能在第一次迭代時為假,因此epCarbonDi
可以在未初始化后使用。 carbonDiox = carbonDiox += 5
作為增量條件,但它等效於carbonDiox += 5
epCarbonDi = ..
),從而覆蓋了之前的迭代,它是預期的行為還是什么? @ 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;
}
看一下這個。
您使用的變量是雙精度型。 每次執行for循環時,都會為期望變量分配一個值。 但是在每次迭代中,該值都會被重寫。 即在循環的第一次運行中。 假設變量分配了值1。在第二次運行中,您正在將另一個值重新分配給同一變量,例如2,依此類推。 因此,該變量將始終具有從for循環的最后一次運行中計算出的值。
如果要使用for循環中計算出的每個值,請將其存儲在數組或列表中,然后根據需要使用它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.