1

私は CS の割り当てに取り組んでおり、ユーザーが指定した成長率を指定して、時間の増分で銀行口座の金額を表す double の配列を出力する方法を理解するのに少し苦労しています。$のinitialAmount、growthRate、および時間間隔の数をユーザーに要求するメインメソッドがあります(初期量、成長率、および期間の数はiA、gR、およびnPで示されます)。このメソッドは、戻り値の型が double[] である別のメソッドを呼び出します。私の問題は、for ループ内のコードにあります。コンパイルは正常に行われますが、意味不明な出力になります。コードは次のとおりです。

import java.util.Scanner;

public class Benford {
    public static double[] generateBenfordNumbers (double iA, double gR, int nP) {  
        double[] bankStatement = new double[nP];

        for (int i = 0; i<nP; i++) { 
            bankStatement[i] = (iA*(Math.pow((1+(gR)), (i++))));
        }

        return bankStatement;
    }

    public static void main (String[] args) {
        Scanner scan = new Scanner(System.in); 
        double iA;
        double gR;
        int nP;

        System.out.print("What is the initial amount of money that you are starting with? : ");
        iA = scan.nextDouble();
        System.out.println();

        System.out.print("What is the amount of growth per time period? : ");
        gR = scan.nextDouble();
        System.out.println();

        System.out.print("How many time periods would you like to use? : ");
        nP = scan.nextInt();
        System.out.println();

        generateBenfordNumbers(iA, gR, nP);
        System.out.print(generateBenfordNumbers(iA, gR, nP));
    }
}
4

5 に答える 5

2

ラインで

bankStatement[i] = (iA*(Math.pow((1+(gR)), (i++))));

i++2 回目にインクリメントiします。あなたはおそらく欲しい:

bankStatement[i] = (iA*(Math.pow((1+(gR)), i + 1)));

または、それをきれいにすると、

bankStatement[i] = iA * Math.pow(1 + gR, i + 1);

i + 1の値より 1 大きい値を返しますが、i実際には変数自体をインクリメントしません。


また、本当にMath.pow毎回使わないといけないのでしょうか?配列の最初の要素を手動で設定してiA、その後bankStatement[i-1]計算に使用することはできませんbankStatement[i]か? このようなことを行うと、おそらくプログラムが改善されます。

于 2012-10-08T22:23:53.140 に答える
1

i は 2 回インクリメントされます: ループ レベルで本体に

于 2012-10-08T22:22:07.973 に答える
1

意味不明な出力は次のようになります。

[D@1b67f74

これは double 配列のテキスト表現です。あなたが使用することができます:

System.out.print(Arrays.toString(generateBenfordNumbers(iA, gR, nP)));
于 2012-10-08T22:25:51.047 に答える
0

他の人が言ったことは、あなたは i を 2 回インクリメントしているので、それを繰り返すつもりはありません。括弧は式を整理し、計算の正しい実行順序を確保するのに適していることを付け加えておきますが、括弧を使いすぎると、プログラムの意図がわかりにくくなり、探している問題を見つけにくくなる可能性があります。比較

bankStatement[i] = iA * Math.pow(1.0 + gR, i+1);

bankStatement[i] = (iA*(Math.pow((1+(gR)), (i))));

私が何を意味するか分かりますか?

編集 - i の初期値に関する ARS の非常に有効な発言に続いて、クリーンアップされたステートメントを変更しました。

于 2012-10-08T22:33:02.497 に答える
0

Math.pow への呼び出し内で i をインクリメントしないでください。これは、for ループで既にインクリメントしているためです。その結果、配列の要素がスキップされ、設定されません。これはおそらく、ぎこちないことから来ているところです。

おそらく変更したいでしょう:

bankStatement[i] = (iA*(Math.pow((1+(gR)), (i++))));

に:

bankStatement[i] = iA*Math.pow(1+gR, i);

また、余談ですが、読みにくくなるため、通常はあまり多くの括弧を使用しないでください。操作の順序がわからない場合は、調べてください

于 2012-10-08T22:24:37.957 に答える