Por lo tanto, quiero que el número permanezca siempre entre 0 y 359, incluso si pasa a 360, 361, 362, 363 ... etc. o inferior a -1, -2, -3, -4 .. etc. cada vez que llamo Cualquiera de los métodos a continuación. Digamos que si pasa a 360, quiero que vuelva a cambiar a 0, etc. y si pasa a -1, quiero que cambie a 359, etc. Tengo este código y funciona, pero el problema es que si cambio el Disminuir o aumentar la cantidad del encabezado a más de 5, entonces solo tengo que seguir haciendo otras declaraciones if. ¿Cuál es una mejor manera de escribir el código en el que tomaría en cuenta un mayor incremento o disminución del encabezado?

heading = 3;
public void changeHeadingLeft() {
    heading -= 5;
    if (heading == -1) {heading = 359;}
    else if (heading == -2) {heading = 358;}
    else if (heading == -3) {heading = 357;}
    else if (heading == -4) {heading = 356;}
    else if (heading == -5) {heading = 355;}
heading = 358
public void changeHeadingRight() {
    heading += 5;
    if (heading == 360) {heading = 0;}
    else if (heading == 361) {heading = 1;}
    else if (heading == 362) {heading = 2;}
    else if (heading == 363) {heading = 3;}
    else if (heading == 364) {heading = 4;}
0
T.H. 1 mar. 2018 a las 09:31

7 respuestas

La mejor respuesta

Puede hacerlo sin usar if y bucles.

Para incremento , use:

(header + amt) % 360

Para decremento , use:

(360 + header - (amt % 360)) % 360    //(amt % 360) incase amt > 360

Ejemplo:

Aumentar 5 al encabezado:

(0 + 5) % 360 = 5

Aumente 5 al encabezado con desbordamiento:

(360 + 5) % 360 = 5

Disminuya 5 al encabezado:

(360 + 100 - (5 % 360)) % 360 = 95

Disminuya 5 al encabezado con flujo inferior:

(360 + 0 - (5 % 360)) % 360 = 355

Disminuya 725 al encabezado con flujo inferior y con amt> 360:

(360 + 0 - (725 % 360)) % 360 = 355

Puede agregarlos como métodos, luego no tiene que recordar cuándo usar cuáles. Por ejemplo:

class CircularNumber{

    private static final int BOUND = 360;
    private int header;

    public void add(int amt){
        header = (header + amt) % BOUND;
    }

    public void deduct(int amt){
        header = (360 + header - (amt % BOUND)) % BOUND;
    }
}

Al aplicar el módulo en la cantidad a deducir con 360 antes de la deducción, no es necesario usar un ciclo para seguir agregando 360 al encabezado hasta que se vuelva positivo.

2
user3437460 1 mar. 2018 a las 07:42

Es un trabajo perfecto para el operador de módulo.

heading = heading % 360;

Esto tendrá un ciclo heading de 0 a 359, luego nuevamente a 0

Y para manejar el caso negativo, sí, solo agregue 360 hasta que heading sea positivo.

4
Stephen Docy 1 mar. 2018 a las 06:38
 if (heading < 0) { heading += 360;}

Funciona para bajar a -360. Y de manera similar

 if (heading >= 360) { heading -= 360; }
3
john 1 mar. 2018 a las 06:36

Puede usar la siguiente función:

public static int getHeading(int val)
{
    val %= 360;
    return (val < 0)? (val+360) :val;
}

Véalo funcionando aquí en C ++ y aquí en Java:

class Test
{
    public static int getHeading(int val)
    {
        val %= 360;
        return (val < 0)? (val+360) :val;
    }

    public static void main (String[] args) throws java.lang.Exception
    {
        int[] vals = {-360, 360, -361, 361, -1, 1};

        for(int i = 0; i< vals.length; i++)
        {
            System.out.println(vals[i] +  " = " + getHeading(vals[i]));
        }
    }
}

SALIDA:

-360 = 0
360 = 0
-361 = 359
361 = 1
-1 = 359
1 = 1
3
cse 1 mar. 2018 a las 07:21

Para valores menores que 0

while(heading < 0){heading+=360;}

Para un valor mayor que 360

while(heading >= 360){heading-=360;}

Con los bucles while también es posible ir con valores más pequeños que -360

2
HauptstroßnKoal 1 mar. 2018 a las 06:40
     import java.util.Scanner;
public class myClass {
    public static void main (String args[]) {
Scanner sc = new Scanner(System.in); 
System.out.println("Enter a number: ");
int n = sc.nextInt();
while(n < 0){n+=360;}
while(n >= 360){n-=360;}
System.out.println(" number: " + n);

    }
}
0
master ArSuKa 1 mar. 2018 a las 07:09

Para cambio a la izquierda:

heading = heading > 0 ? heading : 360 + heading

Y para un cambio correcto:

heading = heading < 360 ? heading : heading - 360
2
Joe Hany 1 mar. 2018 a las 06:48