Saltar al contenido
Topos Uranos

Resumen

Hasta aquí cada programa del curso ha sido un solo bloque, main, en el que todo se escribe donde se usa. Esta clase enseña a dar nombre a una parte de un programa y a usarla sin mirar su interior: la función. Se estudian la declaración, que anuncia al compilador el nombre, el tipo de retorno y los parámetros; la definición, que añade el cuerpo; y la invocación, que transfiere el control a ese cuerpo y recibe el valor devuelto. Se distingue lo que el compilador comprueba al compilar (que cada llamada concuerde con una declaración) de lo que ocurre al ejecutar (el salto a la definición y el regreso). Se explica por qué llegar al final de una función que debe devolver un valor sin un return es comportamiento indefinido. Se sigue la ejecución con la pila de llamadas, que guarda un marco por cada llamada en curso. Y se especifica cada función con un contrato, su precondición y su poscondición, que dice qué exige la función a quien la llama y qué garantiza a cambio.

Objetivos de aprendizaje

  1. Declarar, definir e invocar funciones con parámetros y valor de retorno, y señalar en un programa qué parte es la declaración y cuál la definición.
  2. Seguir con un diagrama de la pila de llamadas la ejecución de un programa con funciones que se llaman entre sí.
  3. Especificar una función con su precondición y su poscondición, y escribir una llamada que viole la precondición.
  4. Explicar por qué una función que no devuelve valor en algún camino es comportamiento indefinido, y reconocer el aviso del compilador correspondiente.

Por qué funciones

Los programas de la unidad anterior resolvían cada problema dentro de main, y eso bastó mientras los problemas eran pequeños. Ahora bien, en cuanto un programa crece aparecen tres dificultades. La primera es la repetición: si el mismo cálculo se necesita en tres lugares, se escribe tres veces, y un error en él se corrige tres veces (o se olvida corregir en una). La segunda es la lectura: un bloque de cincuenta líneas no dice qué hace, sino cómo lo hace, y el lector debe reconstruir la intención a partir del mecanismo. La tercera es la prueba: si todo está mezclado, no hay manera de comprobar una parte sin ejecutar el resto.

Una función es un fragmento de programa con nombre, que recibe datos, llamados parámetros, y entrega un resultado, llamado valor de retorno. La matemática conoce la idea desde hace siglos: la distancia entre dos puntos del plano es una función de sus cuatro coordenadas, d(x1,y1,x2,y2)=(x2−x1)2+(y2−y1)2d(x_1, y_1, x_2, y_2) = \sqrt{(x_2 - x_1)^2 + (y_2 - y_1)^2}, y quien calcula el perímetro de un triángulo no repite la fórmula tres veces, sino que la nombra y la aplica tres veces. En C++ se escribe lo mismo.

EjemploEl perímetro de un triángulo

El programa lee las coordenadas de los tres vértices de un triángulo y escribe su perímetro, que es la suma de las longitudes de sus tres lados.

Programa en C++
#include <cmath>#include <iostream>#include <print>​// Distancia entre los puntos (x1, y1) y (x2, y2).double distance(double x1, double y1, double x2, double y2){    const double dx{x2 - x1};    const double dy{y2 - y1};    return std::sqrt(dx * dx + dy * dy);}​int main(){    double ax{};    double ay{};    double bx{};    double by{};    double cx{};    double cy{};    std::cin >> ax >> ay >> bx >> by >> cx >> cy;    const double perimeter{distance(ax, ay, bx, by) + distance(bx, by, cx, cy)                           + distance(cx, cy, ax, ay)};    std::println("Perímetro: {}", perimeter);}
Entrada del programa
0 0 3 0 0 4
Salida
Perímetro: 12

Los lados del triángulo de vértices (0,0)(0, 0), (3,0)(3, 0) y (0,4)(0, 4) miden 3, 5 y 4, y su suma es 12.

La función distance se escribe una vez y se usa tres; main se lee como la definición del perímetro, «la suma de tres distancias»; y distance puede probarse sola, con un par de puntos cuya distancia se conoce. Se ganan así las tres cosas que faltaban. La lección general, que vale en cualquier lenguaje, es que una función nombra una idea: quien la usa piensa en qué hace, no en cómo lo hace. Esta separación entre el uso y la realización se llama abstracción procedural, y es el tema de toda la unidad.