Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Industrial programming >> Lenguaje C

Cuatro patrones probados para funciones definidas por el usuario en C

Cuatro patrones probados para funciones definidas por el usuario en C

Explore cuatro formas distintas de implementar una función definida por el usuario que verifica si un número es primo, y aprenda qué enfoque ofrece mayor claridad y reutilización.

A continuación, cuatro programas completos demuestran cómo la misma tarea lógica puede expresarse con diferentes firmas de función. Las cuatro salidas son idénticas, pero las elecciones de diseño varían, ilustrando compensaciones clave en el diseño de funciones.


Ejemplo 1: Sin argumentos, sin valor de retorno

#include <stdio.h>
void verificarNumeroPrimo();
int main() {
    verificarNumeroPrimo(); // argumento no pasado
    return 0;
}
// tipo de retorno es void significando que no devuelve ningún valor
void verificarNumeroPrimo() {
    int n, i, flag = 0;
    printf("Ingrese un entero positivo: ");
    scanf("%d", &n);
    for(i=2; i <= n/2; ++i) {
        if(n%i == 0) {
            flag = 1;
        }
    }
    if (flag == 1)
        printf("%d no es un número primo.", n);
    else
        printf("%d es un número primo.", n);
}

La función verificarNumeroPrimo() es responsable de leer la entrada del usuario, realizar la prueba de primalidad e imprimir el resultado. Como su tipo de retorno es void, comunica el resultado únicamente a través de efectos secundarios.


Ejemplo 2: Sin argumentos, pero con valor de retorno

#include <stdio.h>
int obtenerEntero();
int main() {
    int n, i, flag = 0;
    // no se pasa argumento
    n = obtenerEntero();
    for(i=2; i<=n/2; ++i) {
        if(n%i==0){
            flag = 1;
            break;
        }
    }
    if (flag == 1)
        printf("%d no es un número primo.", n);
    else
        printf("%d es un número primo.", n);
    return 0;
}
// devuelve el entero ingresado por el usuario
int obtenerEntero() {
    int n;
    printf("Ingrese un entero positivo: ");
    scanf("%d", &n);
    return n;
}

Aquí, obtenerEntero() encapsula la rutina de entrada y devuelve el valor a main, que luego maneja la lógica de verificación de primos. Esta separación hace que el paso de entrada sea reutilizable en diferentes contextos.


Ejemplo 3: Argumento pasado, sin valor de retorno

#include <stdio.h>
void verificarPrimoYMostrar(int n);
int main() {
    int n;
    printf("Ingrese un entero positivo: ");
    scanf("%d", &n);
    // n se pasa a la función
    verificarPrimoYMostrar(n);
    return 0;
}
// tipo de retorno es void significando que no devuelve ningún valor
void verificarPrimoYMostrar(int n) {
    int i, flag = 0;
    for(i=2; i <= n/2; ++i) {
        if(n%i == 0){
            flag = 1;
            break;
        }
    }
    if(flag == 1)
        printf("%d no es un número primo.", n);
    else
        printf("%d es un número primo.", n);
}

En este patrón, la responsabilidad de mostrar el resultado se desplaza a la función auxiliar. Si bien esto mantiene main ligero, la función ahora acopla el algoritmo con E/S, reduciendo su reutilización.


Ejemplo 4: Argumento pasado y valor de retorno

#include <stdio.h>
int verificarNumeroPrimo(int n);
int main() {
    int n, flag;
    printf("Ingrese un entero positivo: ");
    scanf("%d", &n);
    // n se pasa a la función verificarNumeroPrimo()
    // el valor devuelto se asigna a la variable flag
    flag = verificarNumeroPrimo(n);
    if(flag == 1)
        printf("%d no es un número primo", n);
    else
        printf("%d es un número primo", n);
    return 0;
}
// int es devuelto desde la función
int verificarNumeroPrimo(int n) {
    int i;
    for(i=2; i <= n/2; ++i) {
        if(n%i == 0)
            return 1;
    }
    return 0;
}

Este diseño mantiene el algoritmo aislado y devuelve una simple bandera de estado. El llamador decide cómo presentar el resultado, lo que hace que la función sea altamente reutilizable en bibliotecas o aplicaciones más grandes.


Elegir el patrón óptimo

Si bien las cuatro implementaciones producen la misma salida, el enfoque más mantenible y testeable es el Ejemplo 4: pasar el número como argumento y devolver una bandera estilo booleano. Este patrón se adhiere al principio de responsabilidad única, permite pruebas unitarias de verificarNumeroPrimo sin dependencias de E/S, y se puede integrar fácilmente en sistemas más complejos.

En última instancia, la elección depende de la arquitectura de su proyecto. Si la función debe interactuar directamente con el usuario, el Ejemplo 3 podría bastar. Para código de biblioteca o servicios donde la E/S se maneja en otro lugar, el Ejemplo 4 ofrece la mayor flexibilidad.

Lenguaje C

  1. Dominando los Espacios de Nombres en C#: Organización, Ámbito y Mejores Prácticas
  2. Tipos de datos en C explicados: int, float, char y más – guía completa
  3. Dominando los operadores en programación C: guía completa
  4. Dominando funciones de la biblioteca estándar de C: Guía práctica
  5. Variables y tipos de datos en C++: Guía experta sobre int, double, char, string, bool
  6. Punteros en C: Guía completa sobre tipos, uso y mejores prácticas
  7. Dominar la programación en C: Tutorial completo para principiantes
  8. Entendiendo los tipos de datos en C: Guía completa
  9. Dominando funciones en C: Estructura, declaración y mejores prácticas
  10. Dominando Argumentos Variables en C: Guía Práctica
  11. Variables en C#: Tipos, almacenamiento y uso