5

これは非常に奇妙で、非常に具体的な質問です。

最終的に、私はJavaソースを取り込んで、それを使用しないように変換するプログラム変換を作成しようとしています(とりわけ)

  • 配列
  • ループ
  • ユーザー定義のメソッド
  • Ifステートメント

これらを使わずにプログラムを書くことは不可能だと先生から言われた後、これは私が自分で設定した課題です。

関数のインライン化や配列の置換など、これらのほとんどは解決しましたが、ifステートメントの管理方法を理解できません。

C ++では、ラベルとgotoを使用し、おそらく?:を使用しますが、JavaはGOTOステートメントをサポートしていません。

私の質問はこれです:コードのセクションを考えると、

if(CONDITION)
{
   //More code in here
}

機能的に同じになるように変換するにはどうすればよいですか。ただし、ifキーワードは使用しません。ループ構造も問題外であることに注意してください。

これを考えると、elseおよびelseifステートメントを作成するのは簡単です。ただし、GOTOステートメントがなく、メソッドが問題外であるため、これを使用してループを作成する方法もわかりません。

編集:スイッチも許可されておらず、再帰も許可されていないことに注意してください(ユーザーメソッドを定義できず、再帰的なメイン関数がすべてのプログラムで機能するとは限らないという事実によって除外されます)?:演算子はすべての状況で機能するわけではありません。AFAIKは、操作の一部として値を割り当てたいため、?:を使用してvoid関数を呼び出すことはできません。

これらの条件は、IB Computer Science SLがコースを必要とすることから来ています。私はHLを受講しており、クラスとして、「if」ステートメントを含むSLの「習熟」要素を笑っていました(そして、事実の3/15が「ユーザー定義」である場合paramsとreturntypesを持つメソッド)課題は、正しく機能するプログラムを作成しながら、SLでのマスタリーテストに事実上失敗することです。

回答:(bdaresによる)

String result = (CONDITION)?"0":"A";
try{
    Integer.parseInt(result);
    //Condition is true
} catch(NumberFormatException e){
    //Condition is false
}
4

5 に答える 5

2
if(A) {
    X();
}
else{
    Y();
}

次のように変換できます。

A?X():Y();

これらをすべてネストすることも、の片側を削除:して単純なを取得することもできifます。条件文は簡単です。

voidメソッドで機能させたい場合は、次の方法があります。

String result = A?"0":"A";
try{
    Integer.parseInt(result);
    X();
} catch(NumberFormatException e){
    Y();
}
于 2011-10-31T08:02:40.910 に答える
2

条件演算子とスイッチを使用できます。

switch( CONDITION ? 1 : 0 )
{
    case 1:
        //... true code
        break;
    case 0:
        //... false code
        break;
}

ループの場合、コードを事前定義された最大値まで展開し、ラベル付きのブレークを使用して、特定の条件に基づいて展開されたコードから早期にジャンプできます。breakを使用して、ループだけでなくJavaの任意のコードブロックを終了できます。

Java言語にはgotoはありませんが、仮想マシンにはgotoがあるため、もちろん、JVM命令を直接生成することもできますが、これは、すべてのifループをジャンプ命令に変換する通常のJavaコンパイラと大差ありません。

于 2011-10-31T08:04:05.150 に答える
2

ifステートメントを使用せずに有用なプログラム全体を作成できるかどうかはわかりません。ただし、先生が理解しているのは、ifステートメントの代わりに、よりオブジェクト指向のアプローチを使用することで、同じ「論理」パスをたどるコードを記述できることだと思います。例えば:

public interface Moveable {
  void move(int x, int y);
}

public class Ball implements Moveable {
  private int x;
  private int y;

  public void move(int x, int y) {
    this.x = x;
    this.y = y;
  }
}

public class NullMoveable {
  public void move(int x, int y) {
    // Do nothing.
  }
}

...そしてメインアプリケーションコードで:

Moveable mv = new NullMoveable();    
// Move object; don't care if it's a Ball or a NullMoveable
// so no need to explicitly check with an if-statement.
mv.move(10, 50);

ここでの原則は、コード内に存在する可能性のあるパスが少ないほど(ifステートメントのため)、テストと保守が容易になるということです。

于 2011-10-31T08:04:22.343 に答える
0

場合によっては、ビット操作を使用できます。例えば:

if(x > 0) // positive number
{
    isPositive = true;
}
else // negative number
{
    isPositive = flase;
}

次と同等です。

isPositive = (x >> 31) == 0;

編集:

これは単なる例です。もちろん、多数の if ステートメントを使用する代わりに、1 つのステートメントではるかに複雑なビット操作を実行できます。

于 2011-10-31T08:15:48.290 に答える
0

匿名の内部クラスの使用が許可されている場合 (これらはおそらくユーザー定義メソッドとして分類されますが、判断はあなたに任せます):

if(COND) {
  X();
} else {
  Y();
}

になります:

ifReplacement(COND, 
              new Runnable() { public void run() { X();}},
              new Runnable() { public void run() { Y();}});

署名付き:

public static void ifReplacement(boolean condition,
                                 Runnable ifBranch,
                                 Runnable elseBranch)

もちろん、JDK8 ラムダはこれをより良くします:

ifReplacement(COND, ()->X(), ()->Y());
于 2011-10-31T09:05:39.730 に答える