2

初等物理学の運動方程式を解くプログラムを開発しました。解決するには、可能な 5 つの変数のうち 3 つが必要です。既知の 3 つの変数の組み合わせは 10 通りあります。以下の 2 つのコード ブロックに似た 10 のシナリオをコーディングしました。

    // If we have acceleration, final velocity, and initial velocity
    if (varEntered[0] == true && varEntered[1] == true && varEntered[2] == true)
    {
        double acceleration = knownVariables[0];        //Setting acceleration
        double finalVelocity = knownVariables[1];       //Setting finalVelocity
        double initVelocity = knownVariables[2];        //Setting initVelocity

        double time = ((finalVelocity - initVelocity)/acceleration);        //Finding time using an equation
        double distance = ((finalVelocity + initVelocity)*((0.5)*time));    //Finding distance using an equation

        System.out.println("The time is " + time + " seconds");             //Printing time
        System.out.println("The distance is " + distance + " meters");      //Printing distance
    }




    //If we have distance, final velocity, initial velocity
    if (varEntered[3] == true && varEntered[1] == true && varEntered[2] == true)
    {
        //Known variables
        double distance = knownVariables[3];        //Acceleration
        double finalVelocity = knownVariables[1];   //Final Velocity
        double initVelocity = knownVariables[2];    //Initial Velocity

        // Unknown variables
        double time = (distance/((0.5)*(finalVelocity + initVelocity)));    //Time
        double acceleration = ((finalVelocity - initVelocity)/time);        //Acceleration

        System.out.println("The time is " + time + " meters/second");                               //Printing time
        System.out.println("The acceleration is " + acceleration + " meters/second^2");     //Printing distance
    }

これらは非常に似ているように見えますが、異なるシナリオです。プログラミングの初心者として、私が使用しているアルゴリズムを変更してコードを短縮できるかどうか疑問に思っています。さらに情報が必要な場合は、喜んで提供させていただきます。

4

4 に答える 4

0

私が気づいたことから、各変数は数値に関連付けられているようです。考えられるすべてのシナリオを完全に排除し、5 つの変数のそれぞれに if 条件を設定できます。これにより、最初に 3 つの変数を識別し、ローカル変数を初期化します。それらは割り当てられたときに互いに独立しているため、それほど多くの組み合わせを作成する理由はありません。これにより、コードが大幅に短縮されます。

次のステップは、組み合わせの数を減らすことです。私が考えることができる最善の方法は、計算する必要がある 2 つの値を見つけて数式を使用することです。つまり、if else ステートメントの別のブロックです。コードは次のようになります。

//initialize all to 0
double acceleration = 0;
double distance = 0;        
double finalVelocity = 0;
double initVelocity = 0;
double time = 0;

//place the proper values for each 
if (varEntered[0] == true){
    acceleration = knownVariables[0];
}
if (varEntered[1] == true){
    finalVelocity = knownVariables[1];
}
if (varEntered[2] == true){
    initVelocity = knownVariables[2];
}
if (varEntered[3] == true){
    distance = knownVariables[3];
}
if (varEntered[4] == true){
   time = knownVariables[4];
}

// now you have 10 cases 
if(varEntered[0] == false && varEntered[1] == false){
//use the formulas here
} else if (varEntered[0] == false && varEntered[2] == false){
//use other formula here
}// repeat for the next 8, with each time you change the condition and formulas 
//like you have it. Also, I noticed that you missed the else in your conditionals; 
//it is more efficient if you use if-else clauses when only one should execute every time you run the code.

お役に立てれば。

これを自由にコピーして、残りを入力して試してみてください。

于 2012-10-17T01:44:26.757 に答える
0

3 つの数値を受け取り、一般的な計算を実行する関数を定義する必要があります。初心者の方は、このチュートリアルをお試しください。次に、関数を 2 回呼び出すことができます。毎回異なる変数のセットを使用します。

于 2012-10-17T00:48:48.927 に答える
0

依存関係に注意すれば、それぞれ 2 つの計算を行う 10 ケースではなく、それぞれ 1 つの計算を行う 5 つのケースを回避できます。これを行うには、2 つの変数が互いに直接依存しないようにする必要があります。それが起こった場合、両方の変数が不明であるとき、あなたは運が悪いでしょう.

これを行う 1 つの方法は、次の例のように、変数のリストを取得し、次の 3 つの観点から各変数を計算することです (リストの最後に到達したら折り返します)。この例では、solveAll は未知数が Double.MAX_VALUE に設定された double の配列を取り、未知数を正しい値に設定します。(未知数が 3 つ以上ある場合は、無限再帰になります。)

// Really should use enum instead of constant ints, and an EnumMap instead of an array.
public final static int ACCELERATION = 0;
public final static int FINALVELOCITY = 1;
public final static int INITVELOCITY = 2;
public final static int DISTANCE = 3;
public final static int TIME = 4;

private double[] vars;

public void solveAll(double[] vars) {
    this.vars = vars;
    for (int i=ACCELERATION; i<=TIME; i++) {
        get(i);
    }
}

private double get(int v) {
    if (vars[v] != Double.MAX_VALUE) {
        return vars[v];
    }

    switch (v) {
    case ACCELERATION:
        return (vars[ACCELERATION] = (get(FINALVELOCITY)*get(FINALVELOCITY) - get(INITVELOCITY)*get(INITVELOCITY)) / (2*get(DISTANCE)));
    case FINALVELOCITY:
        return (vars[FINALVELOCITY] = 2*get(DISTANCE)/get(TIME) - get(INITVELOCITY));
    case INITVELOCITY:
        return (vars[INITVELOCITY] = get(DISTANCE)/get(TIME) - get(ACCELERATION)*get(TIME)/2);
    case DISTANCE:
        return (vars[DISTANCE] = (get(FINALVELOCITY) - get(ACCELERATION)*get(TIME)/2) * get(TIME));
    case TIME:
        return (vars[TIME] = (get(FINALVELOCITY) - get(INITVELOCITY)) / get(ACCELERATION));
    }

    return Double.MAX_VALUE; // Bad variable index
}
于 2012-10-17T20:57:40.300 に答える
0

Map を使用して、次のようなことを行います (警告: 疑似コード):

import java.util.HashMap;
import java.util.Map;

 Map<String,double> map=new HashMap<String, double>();

既知のすべての値でマップを初期化します。例:

 map.put("initVelocity", 0.35);

次に、次の関数を定義できます。

void  calculateValues(Map<double,String> map){

if( map.containsKey("initVelocity") && map.containsKey("finalVelocity") && map.containsKey("acceleration")){
map.put("time",((map.get("finalVelocity") - map.get("initVelocity")/map.get("acceleration"));    
}

add all the other algorithms here in the same way!!!

}

この関数は、HashMap で既に定義されている値を取得し、不足しているパラメーターを計算しようとします。多くの場合、すべてのパラメーターが設定されるまで、マップ上で複数回呼び出す必要があります。次のようなことができます:

while( the map has not all values set){
calculateValues(map);
} 

また、結果の値がまだ設定されていない場合にのみ、アルゴリズムのいずれかが呼び出されるようにすることもできます (この条件を if ステートメントに追加することにより)。しかし、それについてあまり心配しないでください。

于 2012-10-17T01:19:11.277 に答える