¿Qué son y para qué sirven las funciones en C?

manueldemeza 18/12/2025

Bienvenidos a la arquitectura de software mis estimados STEAMdiantes. Hoy dejamos de escribir “scripts” y empezamos a construir sistemas.

Hasta ahora, hemos escrito todo nuestro código dentro de main(). Para programas pequeños (de 20 líneas), eso funciona. Pero imagínate el software de un avión o de un banco, que tiene millones de líneas. Si metieras todo en main, tendrías un “código espagueti” imposible de leer y de arreglar.

La ingeniería se basa en dividir y vencer. Un coche no se fabrica como una sola pieza fundida; se ensambla con un motor, una transmisión y ruedas. Hoy aprenderemos a fabricar esas piezas por separado.

Funciones

Una función es un bloque de código independiente, con un nombre propio, diseñado para realizar una tarea específica. Es una “sub-rutina” que puedes invocar (llamar) tantas veces como quieras desde cualquier parte de tu programa.

Piensa en la función main() como el director general de una obra. El director no pone los ladrillos, ni conecta los cables eléctricos. El director llama al electricista (funcion_electricidad) y al albañil (funcion_construccion) para que hagan el trabajo.

¿Por qué usar funciones?

  1. Reutilización: escribes el código una vez y lo usas mil veces. Si necesitas calcular el área de un círculo en 10 lugares distintos, no copias y pegas la fórmula 10 veces; llamas a calcular_area().
  2. Mantenibilidad: si descubres un error en tu fórmula, solo lo corriges en un lugar (la función) y se arregla automáticamente en todo el programa.
  3. Abstracción: te permite ignorar los detalles complejos. Cuando usas printf(), no sabes (ni te importa) cómo C controla los pixeles de la pantalla. Solo sabes que imprime. Eso es abstracción.

Anatomía de una función

Una función en C funciona como una máquina de procesamiento o una “caja negra”. Tiene una entrada (ingredientes), un proceso (la receta) y una salida (el pastel).

La sintaxis obligatoria es:

tipo_de_retorno nombre_de_funcion ( lista_de_parametros ) {
    // CUERPO DE LA FUNCIÓN
    // Aquí van las instrucciones y cálculos
    return valor;
}

Desglosemos las partes:

  1. tipo_de_retorno: ¿qué me va a devolver esta máquina? ¿un entero (int), un decimal (float), o nada (void)?
  2. nombre: la etiqueta para llamarla (ej: sumar, imprimir_alerta).
  3. parametros: los datos que la máquina necesita para trabajar (los inputs).
  4. return: la palabra clave que “escupe” el resultado final y termina la función.

Prototipo, llamada y definición

C es un lenguaje “de una sola pasada”. Lee el código de arriba a abajo. Si en el main intentas usar una función que está escrita más abajo, el compilador te dirá: “oye, no sé qué es esto”.

Para solucionar esto, los ingenieros usamos un orden estricto de 3 pasos:

  1. Declaración (prototipo): va antes del main. Es un aviso al compilador: “te prometo que más abajo existe una función llamada X que recibe Y”.
  2. Llamada (invocación): es cuando usamos la función dentro del main.
  3. Definición (implementación): es el código real de la función, que solemos poner después del main para mantener el código ordenado.

Tipos de funciones

Función que recibe y devuelve (la clásica)

Matemática pura. Le das números, te regresa un resultado.

int sumar(int a, int b) {
    int resultado = a + b;
    return resultado; // Devuelve el valor al main
}
Función void (la de acción)

Realiza una tarea (encender un motor, imprimir un menú) pero no devuelve ningún valor numérico al main.

void mostrar_saludo() {
    printf("--- Bienvenido al Sistema ---\n");
    // No lleva return con valor
}
Función sin parámetros

No necesita datos externos para trabajar.

float obtener_pi() {
    return 3.14159;
}

Ámbito de variables (Scope)

Este es el error #1 de los novatos. Las variables que creas dentro de una función son locales. Nacen cuando la función empieza y mueren cuando la función termina.

  • La variable x dentro de sumar() no es la misma que la variable x dentro de main(). Son dos cajas distintas en almacenes distintos, aunque tengan la misma etiqueta.
  • Si quieres sacar un dato de una función, tienes que usar return.

Práctica: calculadora geométrica modular

Vamos a Visual Studio. Olvida el código espagueti. Vamos a hacer un programa modular para calcular propiedades de un cilindro.

Observa cómo el main queda limpio y fácil de leer.

#include <stdio.h>

// --- 1. PROTOTIPOS (Las Promesas) ---
// Avisamos qué funciones vamos a crear
float calcular_area_base(float radio);
float calcular_volumen(float area_base, float altura);
void imprimir_reporte(float r, float h, float v);

// --- 2. FUNCIÓN PRINCIPAL (El Director) ---
int main() {
    float radio_usuario, altura_usuario;
    
    printf("Ingrese el radio del cilindro (cm): ");
    scanf("%f", &radio_usuario);
    
    printf("Ingrese la altura del cilindro (cm): ");
    scanf("%f", &altura_usuario);

    // LLAMADA A FUNCIONES
    // Paso 1: Calculamos la base delegando la tarea
    float area = calcular_area_base(radio_usuario);
    
    // Paso 2: Usamos ese resultado para calcular el volumen
    float volumen_total = calcular_volumen(area, altura_usuario);
    
    // Paso 3: Llamamos a la función de impresión (no devuelve nada)
    imprimir_reporte(radio_usuario, altura_usuario, volumen_total);

    return 0; 
}

// --- 3. DEFINICIONES (La Maquinaria Real) ---

// Función que calcula área de un círculo
float calcular_area_base(float radio) {
    const float PI = 3.1416;
    return PI * (radio * radio); // Devuelve el cálculo directo
}

// Función que calcula volumen
float calcular_volumen(float area_base, float altura) {
    float resultado = area_base * altura;
    return resultado;
}

// Función void (solo imprime)
void imprimir_reporte(float r, float h, float v) {
    printf("\n=== REPORTE DE INGENIERIA ===\n");
    printf("Cilindro de Radio: %.2f cm y Altura: %.2f cm\n", r, h);
    printf("VOLUMEN TOTAL: %.2f cm3\n", v);
    printf("=============================\n");
}

Análisis:

  1. Si mañana cambia el valor de PI o la fórmula del área, solo modificas calcular_area_base. El main ni se entera. Eso es mantenibilidad.
  2. imprimir_reporte recibe copias de los datos. Si cambias r dentro de esa función, el radio_usuario del main no se ve afectado.

Con esto, has dado el salto de “escribir código” a “diseñar software”.

Pero, ¿qué pasa si en lugar de pasar una sola variable (como el radio), queremos pasar una lista de 100 temperaturas? ¿Vamos a crear 100 variables? ¡Claro que no! En el siguiente artículo, aprenderemos a manejar colecciones de datos.

Gracias por leernos.
Si te gusto este artículo, únete a nuestra comunidad en Facebook o WhatsApp para más…
¡Hasta la próxima!

Etiquetas:
¿Te gustó este artículo? ¡Compártelo!

Comentarios

5 1 vote
Valora este artículo
Suscribirse
Notificarme de
guest
0 Comentarios
Oldest
Newest Most Voted
Inline Feedbacks
View all comments