16 - Concepto de funciones - Programación estructurada


Hasta ahora hemos trabajado con una metodología de programación lineal. Todas las instrucciones de nuestro programa se ejecutan en forma secuencial de principio a fin.

Esta forma de organizar un programa solo puede ser llevado a cabo si el mismo es muy pequeño (decenas de líneas)

Cuando los problemas a resolver tienden a ser más grandes la metodología de programación lineal se vuelve ineficiente y compleja.

El paradigma de programación que propone el lenguaje C es la programación estructurada.

La programación estructurada busca dividir o descomponer un problema complejo en pequeños problemas. La solución de cada uno de esos pequeños problemas nos trae la solución del problema complejo.

En el lenguaje C el planteo de esas pequeñas soluciones al problema complejo se hace dividiendo el programa en funciones.

Una función es un conjunto de instrucciones que resuelven un problema específico. En el lenguaje C es obligatorio el planteo de una función como mínimo llamada main:

int main()
{
    ....
}

El lenguaje C tiene librerías que proveen algunas funcionalidades básicas. Algunas de ellas ya las utilizamos en conceptos anteriores como son las funciones: scanf, printf, strlen, strcpy etc.

Veamos ahora como crear nuestras propias funciones.

El tema de funciones en un principio puede presentar dificultades para entenderlo y ver sus ventajas ante la metodología de programación lineal que veníamos trabajando todo en la función main.

Los primeros problemas que presentaremos nos puede parecer que sea más conveniente trabajar todo en la función main en vez de dividir el problema en varias funciones.

A medida que avancemos veremos que si un programa empieza a ser más complejo (cientos de líneas, miles de líneas o más) la división en pequeñas funciones nos permitirá tener un programa más ordenado y fácil de entender y por lo tanto en mantener.

Estructura de una función.

Una función tiene un nombre, puede tener parámetros y encerrada entre llaves le sigue su algoritmo:

[valor que retorna]   [nombre de la función] ([parámetros de la función])
{
    [altoritmo]
}

Problema 1:

Confeccionar un programa que muestre una presentación en pantalla del programa. Solicite la carga de dos valores y nos muestre la suma. Mostrar finalmente un mensaje de despedida del programa.

Implementar estas actividades en tres funciones.

Programa: programa85.c

Ver video

#include<stdio.h>
#include<conio.h>

void presentacion()
{
    printf("Programa que permite cargar dos valores por teclado.\n");
    printf("Efectua la suma de los valores\n");
    printf("Muestra el resultado de la suma\n");
    printf("*******************************\n");
}

void cargaSuma()
{
    int valor1,valor2,suma;
    printf("Ingrese el primer valor:");
    scanf("%i",&valor1);
    printf("Ingrese el segundo valor:");
    scanf("%i",&valor2);
    suma=valor1+valor2;
    printf("La suma de los dos valores es: %i",suma);
}

void finalizacion()
{
    printf("\n*******************************\n");
    printf("Gracias por utilizar este programa");
}


int main()
{
    presentacion();
    cargaSuma();
    finalizacion();
    getch();
    return 0;
}

Como podemos observar hemos dispuesto previo a la función main otras tres funciones.

Lo importante es tener en cuenta que todo programa en C comienza a ejecutarse siempre a partir de la primer línea contenida en la función main, en nuestro ejemplo sería:

int main()
{
    presentacion();

Lo que estamos indicando en esta línea es llamar a la función presentacion que debe estar codificada en líneas anteriores en nuestro archivo.

La codificación de la función presentacion es:

void presentacion()
{
    printf("Programa que permite cargar dos valores por teclado.\n");
    printf("Efectua la suma de los valores\n");
    printf("Muestra el resultado de la suma\n");
    printf("*******************************\n");
}

Veamos un poco la sintaxis necesaria para crear una función en el lenguaje C.
Toda función tiene un nombre que no puede tener espacios en blanco, comenzar con un número ni tener caracteres especiales. Previo al nombre de la función indicamos el dato que devuelve la función, con la palabra clave void indicamos que la función no retorna valor (no requiere que tenga la palabra clave return como hemos dispuesto siempre en la función main)

Luego del nombre de la función indicamos entre paréntesis los parámetros, si no los tiene disponemos los paréntesis abiertos y cerrados y no disponemos un punto y coma al final:

void presentacion()

Luego del nombre de la función debe ir encerrado entre llaves el algoritmo propio de la función, en nuestro ejemplo disponemos una serie de llamadas a la función printf para mostrar la presentación del programa:

{
    printf("Programa que permite cargar dos valores por teclado.\n");
    printf("Efectua la suma de los valores\n");
    printf("Muestra el resultado de la suma\n");
    printf("*******************************\n");
}

Cuando se ejecuta esta función al llegar a la llave de cerrado vuelve a la función main desde donde se la llamó.

De regreso en la función main ahora se llama a la función cargaSuma:

int main()
{
    presentacion();
    cargaSuma();

El programa ahora nuevamente sale de la función main y pasa a ejecutarse la función cargaSuma:

void cargaSuma()
{
    int valor1,valor2,suma;
    printf("Ingrese el primer valor:");
    scanf("%i",&valor1);
    printf("Ingrese el segundo valor:");
    scanf("%i",&valor2);
    suma=valor1+valor2;
    printf("La suma de los dos valores es: %i",suma);
}

La función cargaSuma no tiene parámetros y no devuelve datos (void)

Dentro del algoritmo de la función cargaSuma definimos tres variables llamadas locales a la función cargaSuma. Estas variables solo existen mientras se ejecuta la función cargaSuma y no pueden ser utilizadas por las otras funciones de nuestro programa.

El algoritmo de cargar dos valores por teclado, sumarlos y mostrar la suma por pantalla no varía con lo visto anteriormente, pero si varía la ubicación de dicho algoritmo dentro de una función creada por nosotros.

Cuando finaliza de ejecutarse cada una de las instrucciones de la función cargaSuma regresa a la función main donde se procederá a llamar a la tercer función que creamos nosotros llamada finalizacion:

int main()
{
    presentacion();
    cargaSuma();
    finalizacion();

Como vemos desde la main debemos indicar el nombre exacto de la función que llamamos (recordar que el lenguaje C es sensible a mayúsculas y minúsculas)

La función finalizacion tiene por objetivo mostrar una serie de mensajes por pantalla para que el operador sepa que el programa está finalizando:

void finalizacion()
{
    printf("\n*******************************\n");
    printf("Gracias por utilizar este programa");
}

Luego de ejecutar los dos printf de la función finalizacion el programa regresa a la main:

int main()
{
    presentacion();
    cargaSuma();
    finalizacion();
    getch();
    return 0;
}

En la main solo queda la llamada a la función getch y la instrucción return que finaliza el programa.

Si ejecutamos el programa podemos ver una salida por pantalla similar a esta:

funciones en C

Recordar que cuando se llama a una función desde la main cuando la misma finaliza regresa a la siguiente línea de la main:

funciones en C

Si no hacemos las llamadas a las funciones los algoritmos que implementan las funciones previas a la main nunca se ejecutarán:

int main()
{
    getch();
    return 0;
}

El orden que llamamos a las funciones desde la main también es muy importante, si implementamos la main con este orden de llamadas a las funciones el resultado será muy distinto:

int main()
{
    finalizacion();
    cargaSuma();
    presentacion();
    getch();
    return 0;
}

Problema 2:

Confeccionar una aplicación que solicite la carga de dos valores enteros y muestre su suma.
Repetir la carga de otros dos valores, sumarlos y mostrar.
Mostrar una línea separadora después de cada vez que cargamos dos valores y mostramos su suma.

Programa: programa86.c

Ver video

#include<stdio.h>
#include<conio.h>

void cargaSuma()
{
    int valor1,valor2,suma;
    printf("Ingrese el primer valor:");
    scanf("%i",&valor1);
    printf("Ingrese el segundo valor:");
    scanf("%i",&valor2);
    suma=valor1+valor2;
    printf("La suma de los dos valores es: %i",suma);
}

void separacion()
{
    printf("\n*******************************\n");
}


int main()
{
    cargaSuma();
    separacion();
    cargaSuma();
    separacion();
    getch();
    return 0;
}

Hemos declarado dos funciones, una que permite cargar dos enteros sumarlos y mostrar el resultado:

void cargaSuma()
{
    int valor1,valor2,suma;
    printf("Ingrese el primer valor:");
    scanf("%i",&valor1);
    printf("Ingrese el segundo valor:");
    scanf("%i",&valor2);
    suma=valor1+valor2;
    printf("La suma de los dos valores es: %i",suma);
}

Y otra función que tiene por objetivo mostrar una línea separadora con asteriscos:

void separacion()
{
    printf("\n*******************************\n");
}

Ahora en nuestra función main, recordemos que estas líneas son las primeras que se ejecutarán cuando ejecutamos el programa:

int main()
{
    cargaSuma();
    separacion();
    cargaSuma();
    separacion();
    getch();
    return 0;
}

Como vemos podemos llamar a la función cargaSuma() varias veces, esta es una ventaja con respecto a desarrollar todo en la main.

Lo nuevo que debe quedar claro es que la llamada a las funciones desde la función main de nuestro programa puede hacerse múltiples veces (esto es lógico, recordemos que printf es una función ya creada en C y la llamamos múltiples veces dentro de nuestro algoritmo)

Problemas propuestos

Solución
programa87.c

#include<stdio.h>
#include<conio.h>

void calcularCuadrado()
{
    int valor,cuadrado;
    printf("Ingrese un entero:");
    scanf("%i",&valor);
    cuadrado=valor*valor;
    printf("El cuadrado es %i\n",cuadrado);
}

void calcularProducto()
{
    int valor1,valor2,producto;
    printf("Ingrese primer valor:");
    scanf("%i",&valor1);
    printf("Ingese segundo valor:");
    scanf("%i",&valor2);
    producto=valor1*valor2;
    printf("El producto de los valores es: %i",producto);
}


int main()
{
    calcularCuadrado();
    calcularProducto();
    getch();
    return 0;
}




programa88.c

#include<stdio.h>
#include<conio.h>

void menorValor()
{
    int valor1,valor2,valor3;
    printf("Ingrese primer valor:");
    scanf("%i",&valor1);
    printf("Ingrese segundo valor:");
    scanf("%i",&valor2);
    printf("Ingrese tercer valor:");
    scanf("%i",&valor3);
    if (valor1<valor2 && valor1<valor3)
    {
        printf("Menor valor:%i\n",valor1);
    }
    else
    {
        if (valor2<valor3)
        {
            printf("Menor valor:%i\n",valor2);
        }
        else
        {
            printf("Menor valor:%i\n",valor3);
        }
    }
}


int main()
{
    menorValor();
    menorValor();
    menorValor();
    getch();
    return 0;
}

Retornar