2011-10-31 19 views
5

Bu çok garip ve oldukça özel bir sorudur. Java'da bir if deyimi kullanılmıyor

Sonuçta ben java kaynağı götüren bir programdır dönüştürmek yazmaya çalışıyorum ve

  • Diziler
  • Döngüler
  • Kullanıcı tanımlı yöntemleri (diğer şeylerin yanı sıra) kullanmıyorsa o şekilde dönüştürür am
  • ise ifadeleri

hocam bunun söyledi sonra bu, kendim için ayarlanmış bir meydan okumadır bu şeyleri kullanmadan bir program yazmak imkansızdı.

İşlevler dizisi ve dizi değiştirme de dahil olmak üzere bunların çoğunu çalıştım, ancak if deyimini nasıl yönetebileceğimi bilmiyorum.

C++ 'da etiketler ve gotolar kullanıyorum ve belki de?:, Ancak Java GOTO deyimlerini desteklemiyor. Böyle o, ancak eğer anahtar kelimeyi aynı kullanmaz işlevsel olduğunu dönüştürebilir nasıl

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

kanununun Verilen :

Sorum şudur. Döngü yapılarının da söz konusu olmadığını unutmayın.

Bunu göz önünde bulundurarak, başka ifadeler oluşturmak ve ifadeler yapmak daha kolay olurdu. Bununla birlikte, GOTO ifadesi bulunmadığından ve yöntemlerin söz konusu olmadığı için bunu kullanarak döngü oluşturma konusunda da emin değilim.

Düzenleme: anahtarları da izin verilmediği gibi, (eğer kullanıcı yöntemlerini tanımlamak olamaz ve bir özyinelemeli ana işlevi her programla işe yaramaz gerçeğiyle dışarı yönetilen) tekrarlama vermediğine dikkat edin:? Operatörü tüm durumlar için çalışmaz. AFAIK ile bir void işlevini çağıramazsınız: • işleminin bir parçası olarak bir değer atamak istediğinden.

Bu koşullar, IB Computer Science SL'nin dersi gerektirir, HL'yi alıyorum ve SL için 'ustalık' faktörlerini içeren 'ustalık' faktörlerine güldüğümüz bir sınıf olarak (Ve eğer bunların 3/15'i ise) 'Param ve geri dönüş türleriyle kullanıcı tanımlı yöntemler' dir. Zorlu bir şekilde çalışan bir program üretirken, SL'deki bir ustalık testini FAIL yapmak etkili olacaktır.

Cevap: (bdares By)

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

Goto ve etiketleri kullanarak bir döngü hala bir döngüdür, sadece başka bir sözdizimi kullanıyor. Gerçekten döngülerden kurtulmak için onları açmanız gerekir, yani ifadeleri döngü içinde yerine koymak yerine sırayla yerleştirmeniz gerekir. Sonsuz döngülerin (ör. 'While (1)'.) –

+1

@JoachimPileborg'un doğru olmadığı; Önceden yazılmış kütüphanelerin döngülerinden yararlanma kararı almıyor, böylece (teorik olarak) java.util.Loop (myObject.class, 10) yazabiliyordu, eğer böyle bir kütüphane var ise. O durduğu gibi, Koleksiyon nesneleri dışında bir çözümü kesebilir. – bdares

+0

http: //www.antiifcampaign.com/ancak bu geliştirilmiş OOP ile ilgilidir (daha iyi tasarımla IF'ler gibi iç içe geçmiş gizli mantıkların çıkarılması) – earcam

cevap

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

dönüştürülebilir:

A?X():Y(); 

Yapabilirsiniz istediğiniz veya sadece : bir tarafını kaldırıp olsun bunların hepsi yuva Basit bir if. Şartlar kolay.döngüler için

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

kodunuzu göz önüne sermek edebilirsiniz:

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

Kuyruklu dizileri de diziler yerine kullanabilirim. Ve?: Ifadeleri, var = (koşul) ile her satırı önek zorunda kalmadan, karmaşık için kullanılamaz?/* Burada bir işlev veya bir şey arayın * /: var – James

+0

o, özyinelendirmeyi göz ardı etmedi. – stivlo

+0

@stivlo Sanırım, "kütüphane işlevlerini" kullanabiliyorsan (SE6 veya SE7'yi varsayabilirim), o zaman keyfi kodun döngü yapmanın birçok yolu var. Onun kısıtlamalarını yanlış yorumladım. – bdares

2

Sen koşullu operatör ve bir anahtarı kullanabilirsiniz: Eğer boşluk yöntemleri için çalışmak istiyorsanız

, burada bir yoldur önceden tanımlanmış bazı maksimum değerlere ve bazı koşullara bağlı olarak önceden kodlanmamış koddan dışarı atlamak için etiketli molalar kullanın. Java'daki herhangi bir kod bloğunu sonlandırmak için sadece döngüler değil, mola kullanabilirsiniz.

Java dilinin bir goto'su yoktur, ancak Virtual Machine'de buna sahiptir, bu nedenle JVM komutlarını da doğrudan üretebilirsiniz, ancak bu, tüm ifs'leri bir atlama komutuna dönüştüren normal bir Java derleyicisinden çok farklı olmayacak olsa da.

+0

anahtar argüman olarak sadece 'int' alır (ayrıca java 7 'String') . –

+0

Teşekkürler, ancak anahtar deyimleri "kara listeye alınmış" başka bir yapıdır. Anlatmalıydım, – James

1

Bir if ifadesi kullanmadan tüm yararlı bir program yazmanın mümkün olmadığından emin değilim. Ancak, öğretmeninizin ne alabileceğini düşünüyorum, eğer bir “if” ifadesinin yerine daha nesne yönelimli bir yaklaşım kullanarak aynı “mantıklı” yolu takip etmek için kod yazabilirsiniz. Örneğin:

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. 
    } 
} 

... ve sonra ana uygulama kodunda:

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); 

burada ilke daha az olası yolları daha kolay (nedeniyle ifadeleri ettiyseniz) kodunda olmasıdır test etmek ve korumaktır.

+0

numaralı telefonu güncelleyeceğim. OOP'a aşinayım ve programlama konusunda tecrübem var. Ancak Java benim ana dilimin uzağında. Bir yan not olarak dönüştürücü şu anda kullanıcı sınıflarını ve yapıları kaldırmayı destekliyor, artık OOP yok :) – James

0

Bazı durumlarda, bit manipülasyonunu kullanabilirsiniz. Örneğin:

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

eşdeğerdir:

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

DÜZENLEME:

Bu sadece bir örnektir, tabii ki bir deyimi yerine birlikte çok daha karmaşık bir bit düzenleme yapabilir If deyimleri demet kullanarak yapıyor.

+0

komik, tamsayı büyüklüğüne bağlı olarak, sadece ispositive = x> 0 yazabilirken; – stivlo

+0

@stivlo Bu sadece bir Örneğin, tabiri ifadeleri kullanarak bunu yapmak yerine bir deyim ile çok daha karmaşık bit manipülasyon yapabilirsiniz. –

0

Anonim iç sınıflarını kullanmak için izin verildi ise (bunlar muhtemelen kullanıcı tanımlı yöntemler olarak sınıflandırmak, ama yargıç olarak bildireceğiz):

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

olur:

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

imzayla:

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

, JDK8 lambda'lar bu kadar güzel yapar:

ifReplacement(COND,()->X(),()->Y());