Menu
Coddy logo textTech

Pasar funciones como argumentos

Parte de la sección Programación Orientada a Objetos del Journey de C de Coddy. Lección 36 de 61.

Uno de los usos más potentes de los punteros a funciones es pasarlos como argumentos a otras funciones. Esto te permite incorporar un comportamiento personalizado en una función sin modificar su código: una técnica que a veces se denomina callback.

Considera una función que realiza un cálculo con dos números. En lugar de codificar la operación directamente, puedes aceptar un puntero a función que defina qué operación realizar:

typedef int (*Operation)(int, int);

int compute(int a, int b, Operation op) {
    return op(a, b);
}

La función compute no sabe si está sumando, restando o haciendo algo completamente distinto. Simplemente llama a la función que se le pasa:

int add(int a, int b) { return a + b; }
int multiply(int a, int b) { return a * b; }

int main() {
    printf("%d\n", compute(5, 3, add));       // Salida: 8
    printf("%d\n", compute(5, 3, multiply));  // Salida: 15
    return 0;
}

Observa cómo la misma función compute produce resultados diferentes según la función que pasemos. Este patrón es fundamental para escribir código flexible y reutilizable. Escribes la estructura una vez, y quienes usan tu función proporcionan la lógica específica que necesitan.

challenge icon

Desafío

Fácil

Escribe una función apply_twice que reciba dos enteros y un código de operación, aplique la operación a los números dos veces en secuencia y devuelva el resultado final.

Tu función recibirá un código de operación que determina qué operación usar. Debes definir las funciones de operación dentro de tu solución y pasarlas a una función auxiliar compute que acepte un puntero a función.

Nota: solo se necesitan las funciones. Las pruebas llaman directamente a apply_twice y comprueban su valor de retorno, así que no leas la entrada ni imprimas nada.

Estructura requerida:

  • Define un typedef llamado Operation para un puntero a función que reciba dos parámetros int y devuelva un int
  • Define dos funciones de operación: add (devuelve a + b) y multiply (devuelve a * b)
  • Define una función compute que reciba dos enteros y un puntero a función Operation, y después devuelva el resultado de llamar a la operación
  • En apply_twice, selecciona la operación adecuada según el código y después usa compute dos veces: primero con los números originales y después con el resultado y el segundo número de nuevo

Lógica:

  1. Selecciona la función de operación según op_code (1 = add, 2 = multiply)
  2. Llama a compute(a, b, operation) para obtener un resultado intermedio
  3. Llama a compute(intermediate, b, operation) para obtener el resultado final
  4. Devuelve el resultado final

Parámetros:

  • a (int): Primer número
  • b (int): Segundo número
  • op_code (int): Código de operación (1 para add, 2 para multiply)

Devuelve: El resultado después de aplicar la operación dos veces en secuencia (int)

Ejemplo: Con a = 5, b = 3, op_code = 1 (add):

  • Primer cálculo: 5 + 3 = 8
  • Segundo cálculo: 8 + 3 = 11
  • Devuelve: 11

Con a = 2, b = 4, op_code = 2 (multiply):

  • Primer cálculo: 2 × 4 = 8
  • Segundo cálculo: 8 × 4 = 32
  • Devuelve: 32

Pruébalo tú mismo

int apply_twice(int a, int b, int op_code) {
    // Escribe el código aquí
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación Orientada a Objetos

Practica por tu cuenta: Compilador de C online