¿Cómo puedo convertir una declaración if..else if..else en una sola fórmula?

Tengo este programa donde hice una variable x, y quiero asignarle un valor basado en esta fórmula (donde c es un número entero positivo):

X = F ( C ) = { C C < 100 100 100 <= C < 200 C 100 C >= 200
En este momento tengo esto en algún código usando una declaración if, pero me gustaría tener esto usando una sola asignación con solo una fórmula y sin declaraciones if.

  int x;
  if (c < 100) 
    x = c;
  else if (c < 200)
    x = 100;
  else
    x = c-100;

Escuché que si las declaraciones como esta se pueden convertir en alguna fórmula, pero no estoy seguro de por dónde empezar, ¡cualquier ayuda sería apreciada! Al final, espero tener solo una declaración:

int x = f(c);

Respuestas (4)

Podrías usar:

F ( C ) = C 50 + | C 200 | | C 100 | 2

Wolfram Alpha

¡Oh, Dios mío, gracias! ¿Cómo lo enfocaste para llegar a esta solución?
Está buscando una función continua, lineal por partes, y la función de valor absoluto es la más simple de ese tipo. tienes problemas en C = 100 y C = 200 por lo que es lógico que la función que está buscando sea una combinación lineal de C , | C 100 | , y | C 200 | . Entonces es solo cuestión de averiguar los coeficientes correctos para obtener las tres pendientes correctas y el término constante para obtener el valor correcto para F ( 0 ) .
¡Gracias! ¡Tu respuesta es muy detallada y respondiste tan rápido! Espero poder encontrar algo como esto la próxima vez que tenga un problema similar.
(-1) Esto funciona y desde una perspectiva matemática puede ser agradable, pero desde una perspectiva de programación no es una buena forma de expresar esta tarea. El problema es que no expresa la intención de la asignación, sino que utiliza un truco para obtener el valor correcto.
@Magdiragdag Pero estamos en un foro de matemáticas... así que (+1).
En un contexto matemático, la forma comprensible de expresar esta función es exactamente cómo lo ha hecho el OP. También allí, no hay razón para ofuscar la función.

La mayoría de los lenguajes de programación tienen alguna función ternaria-if. Puede verse como (c, c ++, java)

int x = c < 100 ? c : c < 200 ? 100 : c - 100;

o (pitón)

x = c if c < 100 else 100 if c < 200 else c - 100

Esto expresa claramente la intención de su asignación. Los paréntesis no son necesarios en este caso, pero es posible que desee agregarlos para que quede aún más claro, por ejemplo,

int x = c < 100 ? c : (c < 200 ? 100 : c - 100);

Ahora, estos no contienen sentencias if , pero sí contienen expresiones if . Si no está satisfecho con eso, debe recurrir al engaño como en la respuesta de Jaap Scherphuis.

En una tangente menor, necesita los paréntesis si está programando en PHP, ya que por alguna extraña razón (probablemente solo por falta de diseño y planificación adecuados) hicieron que el operador condicional ternario fuera asociativo a la izquierda . Pero en ese caso el verdadero problema no es la falta de paréntesis, sino el hecho de que estás usando PHP. ;)

En la teoría de la computabilidad he encontrado la siguiente notación

F ( X ) = X x X < 100 + 100 x 100 X < 200 + ( X 100 ) x X 200

dónde x A ( A es un conjunto) es una función 0-1 tal que x A ( X ) = 1 si X A y 0 de otra manera

Creo que esto realmente no aborda la pregunta del OP, esto solo codifica si las declaraciones usan la función característica.
Pero esta expresión se puede implementar mediante llamadas a procedimientos.
@Westenfux seguro, pero todavía hay estructuras "si", incluso si están encapsuladas en la definición de la función característica. La respuesta de Jaap no sufre este hándicap.
La función de valor absoluto en la respuesta de Jaap podría estar usando si detrás de escena.

Definir una función como esta

int f(int c){
  if (c < 100) 
    return c;
  else if (c < 200)
    return 100;
  else
    return c-100
}

Ahora puede llamarlo en una declaración como esta, según sea necesario.

int x = f(c);