2011-10-31 8 views
5

これは非常に奇妙で非常に具体的な質問です。Javaのifステートメントを使用していません

最終的に私は

  • 配列
  • ループ
  • ユーザー定義のメソッド(とりわけ)Javaのソースを取り込み、プログラム変換を記述しようとしている、そしてそれは、そのような、それは使用しないことを変換しています
  • 先生がそれことを私に言った後にこれは、私が自分自身のために設定挑戦です文

場合これらを使わずにプログラムを書くことは不可能でした。

私は関数のインライン化や配列の置き換えを含めて、これらの多くを処理しましたが、if文の管理方法を考えることはできません。

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

私の質問はこれです:それは、このようなことがあればしかし、キーワードを使用していない、機能的に同じであることを変換することができますどのようにコードのセクションを考える 、

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

。ループ構造も問題ではないことに注意してください。

これを考えると、else文とelse文を簡単に作成できます。 しかし、これを使ってループを作成する方法についてもわかりません.GOTOステートメントやメソッドはありません。

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

これらの条件は、IBコンピュータサイエンスSLが必要とするコースから来ています。私はHLを取っています。クラスとして、if文を含むSLの '熟練'の要素を笑っていました。 'paramsと戻り値の型を持つユーザー定義のメソッドです)。正しく機能するプログラムを生成しながら、SLのマスターテストを効果的にFAILするのが難題です。

回答:(bdares別)

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

gotoとlabelsを使ったループはまだループですが、別の構文を使用しているだけです。ループを真に取り除くには、ループを展開する必要があります。つまり、ステートメントをループ内に配置して、代わりに順次実行します。無限ループ(例えばwhile(1))では不可能です。 –

+1

@JoachimPileborgは真ではありません。彼はあらかじめ書かれたライブラリのループを使って除外しているわけではないので、そのようなライブラリが存在すれば(理論的に) 'java.util.Loop(myObject.class、10);'と書くことができます。それは、コレクションオブジェクトなどのソリューションをハックすることができます。 – bdares

+0

http://www.antiifcampaign。com /これは改善されたOOP(改善されたデザインを通してIFとしてネストされたひずんだ隠れたロジックを削除する)です。 – earcam

答えて

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

がに変換することができます。

A?X():Y(); 

ネストすることができ、あなたがしたい、または単に:の片側を削除し、取得するこれらのすべて単純なif。条件は簡単です。ループの場合

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

あなたのコードをアンロールすることができます

String result = A?"0":"A"; 
try{ 
    Integer.parseInt(result); 
    X(); 
} catch(NumberFormatException e){ 
    Y(); 
} 
+0

まあ、配列の代わりにLinkedListsも使用できます。と?:複雑なif文には使用できません。すべての行に接頭辞としてvar =(condition)を付ける必要はありませんか?/*ここで関数や何かを呼び出す* /:var – James

+0

彼は再帰を排除しませんでした。 – stivlo

+0

@stivlo "ライブラリ関数"(SE6またはSE7と仮定します)を使用することが許されていれば、任意のコードをループする方法はたくさんあります。私は彼の制限を誤解した。 – bdares

2

あなたは条件演算子とスイッチを使用することができます:あなたはそれがvoidのメソッドのために仕事をしたい場合は

は、こちらの方法ですいくつかの条件に基づいて早期に展開されたコードから抜け出すために、ラベル付きのブレークを使用します。ブレークを使用して、Javaのコードブロックをループだけでなく終了させることができます。

Java言語にはGotoはありませんが、仮想マシンにはそれがありますので、もちろんJVM命令を直接生成することもできますが、通常のJavaコンパイラとはほとんど違いはありませんが、すべてのifsループをジャンプ命令に変換します。

+0

switchは引数として 'int'だけをとります(java 7の' String') 。 –

+0

ありがとうございますが、switch文は別の構文 "ブラックリスト"です。私は言及すべきだった、質問を更新する – James

1

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文に)あなたのコードであるということですそれはテストし、維持することです。

+0

私はOOPに精通しており、プログラミングに熟練しています。しかし、Javaは私の主な言語からは遠いです。補足として、コンバーターは現在、ユーザークラスと構造体の削除をサポートしていますが、それ以上のOOPはありません。 – James

0

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

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

と同等です:

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

EDIT:

これは一例であるが、もちろんあなたは1つの文の代わりにはるかに複雑なビット操作を行うことができますif文の束を使ってやっています。

+0

面白いですが、isPositive = x> 0;と書くことができるときは、整数のサイズに依存します。 – stivlo

+0

@stivloもちろん、if文の束を使って行うのではなく、1つの文でより複雑なビット操作を行うことができます。 –

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()); 
関連する問題