0

私はここで初めてのユーザーですが、私の初心者の質問への回答を見つけようとして、過去にここにたどり着くことがありました.

つまり、基本的に、地球の表面温度を見つけるために使用しているこのコードがあり、提供されたいくつかのフォーラムを実装しています。大気中の炭素レベルに応じて変化する値 (epCarbonDi) を見つける必要があります。「for」ループを使用して、炭素の量が変化するたびにJavaに式を実行させましたが、bluejはそれをコンパイルしませんでした。変数が初期化されていない可能性があるとのことでした。「for」ループの前に宣言しましたが、値を割り当てませんでした。「for」ループは変数に値を入力するためのものであり、後でループの外で使用する必要があるためです。

ループの外側の変数を 0 で初期化すれば、そのように動作するはずだとどこかで読んだので^^、それを実行したところ、コンパイルが完了し、素晴らしい結果が得られました。私はそれを実行しに行き、私の情報行はすべてうまくいきますが、見よ、すべての答えは同じです!!

それで、「for」ループが1回実行されて答えが見つかったが、それを行うために必要な他のすべての値に対してそれを行っていないことを収集しますか?

誰かが何かアドバイスを持っているなら、本当に本当に必要です..私はとても感謝しています. 次の方程式のループ値を使用して、「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);
4

4 に答える 4

1

ループでは常に 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の値としてそのループから何を求めているか教えてください。私はあなたを助けます

于 2013-05-21T06:21:45.213 に答える
0

私が見るいくつかの問題

  • ループ内に割り当ててepCarbonDiいますが、コンパイラはループが常に実行されるという事実を理解できません。最初の反復から条件が false になるepCarbonDi可能性があるため、後で初期化せずに使用できます。
  • インクリメント条件として使用carbonDiox = carbonDiox += 5しますが、同等ですcarbonDiox += 5
  • ループ内では値を蓄積せず、値を代入するだけで ( epCarbonDi = ..)、前の反復を上書きします。これは意図した動作ですか、それとも何ですか?
于 2013-05-21T04:02:58.263 に答える
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;
        }

これをチェックしてください。

于 2013-05-21T04:33:36.557 に答える
0

使用した変数は double です。for ループが実行されるたびに、desire 変数に値が割り当てられます。ただし、反復ごとに値が書き換えられます。つまり、ループの最初の実行時。変数に値 1 が割り当てられているとします。2 回目の実行では、別の値を同じ変数に再割り当てしています (2 など)。したがって、変数には、for ループの最後の実行から計算された値が常に含まれます。

for ループで計算されたすべての値を使用する場合は、それを配列またはリストに格納し、後で必要に応じて使用します。

于 2013-05-21T06:30:08.277 に答える