DMarlon Studio

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.

C · Parámetros, retorno y prototipos en DMarlon Studio: el código del ejemplo y su salida en la terminal

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 return que 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.