2011-10-31 4 views
5

Đây là câu hỏi rất kỳ quặc và khá cụ thể.Không sử dụng câu lệnh if trong Java

Rốt cuộc tôi đang cố gắng để viết một chuyển đổi chương trình mà mất trong nguồn java, và biến đổi nó như vậy mà nó không sử dụng (Trong số những thứ khác)

  • Mảng
  • Loops
  • Người dùng xác định các phương pháp
  • Nếu tuyên bố

Đây là thách thức mà tôi tự đặt ra, sau khi giáo viên của tôi nói với tôi rằng không thể viết một chương trình mà không sử dụng những thứ này.

Tôi có hầu hết các tính năng này, bao gồm chức năng nội tuyến và thay thế mảng, tuy nhiên tôi không thể tìm ra cách quản lý câu lệnh if.

Trong C++ tôi muốn sử dụng nhãn và ảnh và có thể ?:, tuy nhiên Java không hỗ trợ các câu lệnh GOTO.

Câu hỏi của tôi là thế này: Cho một phần của mã,

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

Làm thế nào có thể biến nó như vậy mà nó có chức năng như nhau, tuy nhiên không sử dụng từ khóa if. Lưu ý rằng cấu trúc vòng lặp cũng nằm ngoài câu hỏi.

Với điều này, sẽ dễ dàng tạo ra người khác và nếu không, nếu có phát biểu. Tuy nhiên tôi cũng không chắc chắn về cách tạo vòng lặp bằng cách sử dụng này, vì không có câu lệnh và phương thức GOTO nào nằm ngoài câu hỏi.

Chỉnh sửa: Xin lưu ý rằng thiết bị chuyển mạch cũng không được phép hoặc không đệ quy (Loại trừ bởi thực tế là bạn không thể xác định phương pháp người dùng và chức năng chính đệ quy sẽ không hoạt động với mọi chương trình) không hoạt động cho mọi tình huống. AFAIK bạn không thể gọi một hàm void với?: Vì nó muốn gán một giá trị như là một phần của hoạt động của nó. Các điều kiện này đến từ Khoa học Máy tính SL yêu cầu khóa học, tôi lấy HL và là một lớp chúng tôi đã cười vào các yếu tố 'làm chủ' cho SL bao gồm các câu lệnh 'if' (Và nếu thực tế 3/15 trong số đó 'Các phương thức do người dùng định nghĩa với các tham số và kiểu trả về) Thử thách là có hiệu quả để FAIL kiểm tra làm chủ trong SL trong khi vẫn tạo ra một chương trình hoạt động chính xác.

trả lời: (Bằng bdares)

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

Vòng lặp bằng goto và nhãn vẫn là vòng lặp, nó chỉ sử dụng cú pháp khác. Để thực sự loại bỏ các vòng lặp, bạn cần phải hủy bỏ chúng, tức là đặt các câu lệnh trong vòng lặp được thực hiện tuần tự thay thế. Sẽ không thể thực hiện được các vòng vô hạn (ví dụ: 'while (1)'.) –

+1

@JoachimPileborg không đúng; anh ta không loại trừ việc sử dụng các vòng lặp của các thư viện được viết trước, vì vậy anh ta có thể (về mặt lý thuyết) viết 'java.util.Loop (myObject.class, 10);' nếu một thư viện như vậy tồn tại. Khi nó đứng, ông có thể hack một giải pháp ra khỏi, nói rằng, Bộ sưu tập các đối tượng. – bdares

+0

http: //www.antiifcampaign.com/Tuy nhiên điều này là về cải thiện OOP (loại bỏ căng thẳng, ẩn logic lồng nhau như IFs thông qua thiết kế tốt hơn) – earcam

Trả lời

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

có thể được chuyển đổi sang:

A?X():Y(); 

Bạn có thể làm tổ này tất cả các bạn muốn, hoặc đơn giản là loại bỏ một bên của : và nhận được một đơn giản if. Các điều kiện rất dễ dàng.

Nếu bạn muốn nó để làm việc cho các phương pháp có hiệu lực, đây là một cách:

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

Vâng tôi có thể sử dụng LinkedLists thay vì mảng quá. Và?: Không thể được sử dụng cho các câu lệnh phức tạp nếu không có tiền tố mỗi dòng với var = (điều kiện)?/* Gọi một chức năng hoặc một cái gì đó ở đây * /: var – James

+0

ông đã không loại trừ đệ quy. – stivlo

+0

@stivlo Tôi giả sử không ... nếu bạn được phép sử dụng "chức năng thư viện" (tôi giả sử SE6 hoặc SE7), thì có rất nhiều cách để lặp lại mã tùy ý. Tôi đã hiểu sai những hạn chế của anh ta. – bdares

2

Bạn có thể sử dụng toán tử điều kiện và một công tắc:

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

Đối với các vòng bạn có thể cuộn mã của bạn đến một số tối đa được xác định trước và sử dụng các dấu ngắt được gắn nhãn để nhảy ra khỏi mã chưa được kiểm soát sớm dựa trên một số điều kiện. Bạn có thể sử dụng break để kết thúc bất kỳ khối mã nào trong Java không chỉ là các vòng lặp.

Ngôn ngữ Java không có goto nhưng Virtual Machine có nó, vì vậy bạn có thể cũng tạo ra các hướng dẫn JVM trực tiếp mặc dù điều này sẽ không khác nhiều so với trình biên dịch Java thông thường.

+0

chuyển đổi chỉ mất 'int' như một đối số (cũng' String' trong java 7) . –

+0

Cảm ơn, nhưng các câu lệnh chuyển đổi là một cấu trúc khác "danh sách đen". Tôi nên đề cập, sẽ cập nhật câu hỏi – James

1

Tôi không chắc là có thể viết toàn bộ chương trình hữu ích mà không sử dụng câu lệnh if. Tuy nhiên, tôi nghĩ những gì giáo viên của bạn có thể nhận được là bạn có thể viết mã để thực hiện theo cùng một đường dẫn "hợp lý" bằng cách sử dụng cách tiếp cận hướng đối tượng hơn thay cho câu lệnh if. Ví dụ:

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

... và sau đó trong mã ứng dụng chính của bạn:

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

Nguyên tắc ở đây là con đường có thể ít có trong mã của bạn (do nếu báo cáo) dễ dàng hơn nó là để kiểm tra và duy trì.

+0

Tôi quen thuộc với OOP và có kinh nghiệm với lập trình. Tuy nhiên Java là xa ngôn ngữ chính của tôi. Là một lưu ý phụ, bộ chuyển đổi hiện hỗ trợ loại bỏ các lớp và cấu trúc người dùng, không còn OOP :) – James

0

Trong một số trường hợp, bạn có thể sử dụng thao tác bit. Ví dụ:

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

tương đương với:

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

EDIT:

Đây chỉ là một ví dụ, tất nhiên bạn có thể làm phức tạp hơn nhiều thao tác bit với một tuyên bố thay vì làm nó bằng cách sử dụng bó của câu lệnh if.

+0

vui, bạn phụ thuộc vào kích thước của số nguyên, khi bạn chỉ có thể viết 'isPositive = x> 0;' – stivlo

+0

@stivlo Đây chỉ là một Ví dụ, tất nhiên bạn có thể thực hiện thao tác bit phức tạp hơn với một câu lệnh thay vì thực hiện nó bằng cách sử dụng các câu lệnh if. –

0

Nếu bạn được phép sử dụng các lớp bên trong vô danh (những lẽ phân loại như các phương pháp dùng định nghĩa, nhưng tôi sẽ cho bạn được các thẩm phán):

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

trở thành:

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

có chữ ký:

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

Tất nhiên, JDK8 lambdas sẽ làm cho điều này đẹp hơn nhiều:

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