2011-10-31 10 views
5

Esta es una pregunta muy extraña y bastante específica.No se utiliza una instrucción if en Java

En última instancia Estoy intentando escribir un convertido programa que toma en fuente de Java, y lo transforma de tal manera que no utiliza (entre otras cosas)

  • matrices
  • Bucles
  • métodos definidos por el usuario
  • Si los estados

Este es un reto que me propuse, después de que mi maestro me dijo que era imposible escribir un programa sin usar estas cosas.

Tengo la mayoría de estos funcionó, incluyendo la función en línea y la sustitución de matriz, sin embargo, no puedo resolver cómo administrar una instrucción if.

En C++ usaría etiquetas y gotos y tal vez?:, Sin embargo, Java no es compatible con las instrucciones GOTO.

Mi pregunta es la siguiente: Dada una sección de código,

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

Cómo puede transformarlo tal que es funcionalmente la misma, sin embargo no utilizar la palabra clave if. Tenga en cuenta que las estructuras de bucle también están fuera de cuestión.

Dado esto, sería fácil crear sentencias else y else if. Sin embargo, tampoco estoy seguro de cómo crear bucles utilizando esto, ya que no hay instrucción GOTO y los métodos están fuera de cuestión.

Editar: Tenga en cuenta que los interruptores están también prohibidos, ni es la recursividad (descartada por el hecho de que no se puede definir métodos de usuario, y una función principal recursivo no quiere trabajar con todos los programas) El operador?: no funciona para todas las situaciones AFAIK no puede llamar a una función vacía con?: Como quiere asignar un valor como parte de su operación.

Estas condiciones provienen del IB Computer Science SL requiere curso, estoy tomando HL y como clase nos reíamos de los factores de "maestría" para SL que incluyen declaraciones 'if' (Y si el hecho 3/15 de ellos son 'Métodos definidos por el usuario con params y tipos de devolución) El desafío es, efectivamente, FALLAR una prueba de dominio en SL mientras se sigue produciendo un programa que funciona correctamente.

Respuesta: (Por bdares)

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

Un bucle que usa goto y etiquetas sigue siendo un bucle, solo está usando otra sintaxis. Para deshacerse realmente de los bucles, debe desenrollarlos, es decir, colocar las instrucciones en el bucle para que se ejecuten secuencialmente. Lo cual será imposible para bucles infinitos (por ejemplo, 'while (1)'.) –

+1

@JoachimPileborg no es verdadero; él no descarta utilizar los bucles de bibliotecas preescritas, por lo que podría (teóricamente) escribir 'java.util.Loop (myObject.class, 10);' si existiera dicha biblioteca. Tal como está, él puede hackear una solución de, digamos, objetos de colección. – bdares

+0

http: //www.antiifcampaign.com/sin embargo, esto se trata de una OOP mejorada (eliminando la lógica filtrada y oculta anidada como IF a través de un mejor diseño) – earcam

Respuesta

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

se puede convertir en:

A?X():Y(); 

Puede anidar estos todo lo que quieres, o simplemente quitar un lado de la : y obtener un simple if. Los condicionales son fáciles.

Si quieres que funcione para los métodos de vacío, aquí hay una manera:

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

Bueno, también puedo usar LinkedLists en lugar de matrices. Y?: No se puede usar para sentencias if complejas, sin tener que prefijar cada línea con var = (condición)?/* Llamar a una función o algo aquí * /: var – James

+0

que no descarta la recursión. – stivlo

+0

@stivlo Supongo que no ... si se le permite usar "funciones de biblioteca" (supongo que SE6 o SE7), entonces hay muchas formas de recorrer el código arbitrario. Yo malinterpreté sus restricciones. – bdares

2

Usted puede utilizar el operador condicional y un interruptor:

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

Para los bucles se puede desenrollar su código hasta un máximo predefinido y use roturas etiquetadas para saltar temprano del código desenrollado en función de alguna condición. Puede usar break to end cualquier bloque de código en Java, no solo bucles. El lenguaje Java no tiene goto, pero la Máquina Virtual lo tiene, por lo que también podría generar instrucciones JVM directamente, aunque esto no sería muy diferente de un compilador Java común que también traduce todos los ifs en bucles en instrucciones de salto.

+0

switch toma solo 'int' como argumento (también' String' en java 7) . –

+0

Gracias, pero las declaraciones de cambio son otra construcción "en la lista negra". Debería haber mencionado, actualizaré la pregunta – James

1

No estoy seguro de que sea posible escribir un programa útil completo sin usar una instrucción if. Sin embargo, creo que lo que su profesor puede llegar a decir es que puede escribir código para seguir la misma ruta "lógica" utilizando un enfoque más orientado a objetos en lugar de una instrucción if. Por ejemplo:

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

... y luego en el código de aplicación principal:

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

El principio aquí es que el menor número de caminos posibles que hay en su código (debido a las sentencias if) el más fácil es para probar y mantener.

+0

Estoy familiarizado con OOP y tengo experiencia en programación. Sin embargo, Java está lejos de mi idioma principal. Como nota al margen, el convertidor admite actualmente la eliminación de clases y estructuras de usuario, no más OOP :) – James

0

En algunos casos, puede utilizar la manipulación de bits. Por ejemplo:

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

es equivalente a:

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

EDIT:

Esto es sólo un ejemplo, por supuesto, usted puede hacer mucho más compleja manipulación de bit con una declaración en lugar de hacerlo usando muchas declaraciones if.

+0

divertido, depende del tamaño del número entero, cuando puede simplemente escribir 'isPositive = x> 0;' – stivlo

+0

@stivlo Esto es solo una Por ejemplo, puede hacer mucha más manipulación de bits complejos con una instrucción en lugar de hacerlo usando varias instrucciones if. –

0

si se dejen de usar clases internas anónimas (que probablemente clasifican como métodos definidos por el usuario, pero dejaré que sea usted el juez):

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

se convierte en:

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

con la firma:

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

Por supuesto, lambdas JDK8 haría que este mucho más agradable:

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