Lección 13 · 13 de 20
Parámetros, retorno y prototipos · C
Declare prototipos en C para escribir las funciones después de main, pase varios parámetros por valor y use varios return en una función.

Un prototipo es la primera línea de una función terminada en punto y coma: double apply_discount(double price, int percent);. Le dice al compilador el nombre, los parámetros y el tipo que devuelve, de modo que main puede usarla aunque su cuerpo esté escrito más abajo. En programas largos, main queda arriba y se lee primero.
Al llamar a la función, los argumentos se reparten en el mismo orden que los parámetros: en apply_discount(59.90, 20), price vale 59.90 y percent, 20.
En C los parámetros se pasan por valor: la función recibe una copia. Aunque apply_discount cambie su price, la variable price de main sigue valiendo 10.00. Si se llama sin guardar el resultado, este se pierde; para quedárselo hay que asignarlo: price = apply_discount(price, 50);.
Una función puede tener varios `return`: el primero que se alcanza la termina. is_leap aplica las reglas del calendario por orden: múltiplo de 400, bisiesto; de 100, no; y en otro caso, bisiesto si es múltiplo de 4. Por eso 1900 no lo es y 2000 sí.
Código · main.c
#include <stdio.h>// Prototypes announce the functions; their bodies come after main.double apply_discount(double price, int percent);int is_leap(int year);int main(void) { // Arguments go in the same order as the parameters. printf("Headphones: %.2f\n", apply_discount(59.90, 20)); printf("Keyboard: %.2f\n", apply_discount(45.00, 15)); // Parameters are copies: the function cannot change price here. double price = 10.0; apply_discount(price, 50); printf("price is still %.2f\n", price); price = apply_discount(price, 50); // keep the returned value printf("now price is %.2f\n", price); int years[] = {1900, 2000, 2024, 2026}; for (int i = 0; i < 4; i++) printf("%d: %s\n", years[i], is_leap(years[i]) ? "leap" : "normal"); return 0;}double apply_discount(double price, int percent) { price = price * (100 - percent) / 100; // changes only the copy return price;}int is_leap(int year) { if (year % 400 == 0) return 1; // return ends the function at once if (year % 100 == 0) return 0; return year % 4 == 0;}Salida · cc main.c -o main && ./main
Headphones: 47.92 Keyboard: 38.25 price is still 10.00 now price is 5.00 1900: normal 2000: leap 2024: leap 2026: normal
Para recordar
- Un prototipo anuncia una función antes de definirla.
- Los argumentos se asignan a los parámetros por orden.
- Los parámetros son copias: la función no cambia las variables de quien llama.
- Guarde el valor devuelto si lo necesita.
- El primer
returnque se alcanza termina la función.
Ejercicio
Añada el prototipo y la función int days_in_february(int year) que use is_leap para devolver 28 o 29, y escriba el resultado para los cuatro años.