Introducción

Introducción

La biblioteca estándar C ofrece una gran cantidad de funciones para muchas tareas habituales. También hay muchas bibliotecas para funcionalidad adicional, como el diseño de GUI (GTK+) o la interfaz de la base de datos (libpq). Sin embargo, a medida que avanza en el mundo de la programación de C, pronto se encontrará repitiendo las mismas instrucciones en el mismo orden una y otra vez y eso se convertirá en mucho tiempo e ineficiente. Para que pueda envolver todas esas instrucciones en una función y solo llamar Dicho función cuando la necesitas. Esto es lo que vas a aprender leyendo este artículo, además de algunos consejos útiles que te facilitarán la vida.

Creando tus funciones

Para un comienzo simple, digamos que quieres escribir una calculadora. No nos centraremos en la interfaz (GUI VS CRUSSES VS SLANG VS CLI) ya que estamos interesados ​​en las partes internas. Sería torpe a no Cree una función para cada operación que decida apoyar, a menos que ya haya una, como Pow (), definida en matemáticas.h, que devuelve el resultado de una base elevada a un poder. Entonces, por ejemplo, para su adición tendrá una función llamada add () que toma dos argumentos, al menos por ahora, y devoluciones el resultado. Entonces, cuando el usuario elige agregar los números que introdujo, solo llamar la función con los números que ingresó el usuario y no debe preocuparse por nada más. Estos tres términos que escribí en cursiva son esenciales para comprender las funciones. Una función generalmente (pero no siempre) toma algo, hace una serie de operaciones sobre eso y escupe el resultado. "No siempre" porque Main (), como se puede ver antes, se puede llamar sin argumentos, y también hay otros ejemplos. Pero por ahora, centrémonos en nuestros ejemplos. Los números que deben sumarse son los argumentos, que "algo" le da a la función para procesar. La parte de procesamiento está en el cuerpo de la función, cuando le dice que agregue los números. Después de eso, la parte de "escupir" se llama devolver un valor, que es, en nuestro caso, el resultado de la adición.

Veamos de qué hablamos en un ejemplo práctico:

#incluir  /* Esto contiene la definición de printf ()*/ doble agregar (doble x, doble y); int main () float primero, segundo; printf ("Ingrese el primer número.\ n "); scanf ("%f ", y primero); printf (" Ingrese el segundo número.\ n "); scanf ("%f ", y segundo); doble agregar (doble a, doble b)  devolver a + b;  printf ("El resultado de la adición es %f \ n", add (primero, segundo)); devolver 0; 

El código anterior, aunque simplista en el mejor de los casos, nos ayuda a señalar con precisión de lo que hablamos antes. Primero declaramos la función, antes main (), y el propósito es conocer el nombre, el tipo de argumentos y el tipo que devuelve la función. Esta línea también se llama definir el prototipo de funciones. Como puede ver, los nombres de los argumentos de la declaración no deben ser los mismos que los utilizados en la definición, pero si eso lo preocupa, use un esquema de nombres constante, está bien. Antes de usar la función, debemos definirla, como en decirle al mundo qué es exactamente lo que hace. Incluso si el cuerpo de la función es una sola línea, al igual que en nuestro ejemplo, es mejor que use aparatos ortopédicos para la legibilidad y para un buen hábito. Aquí, todo lo que hace la función es devolver el resultado de la adición entre dos números.

Le sugerimos que use nombres para funciones, argumentos y variables ordinarias o constantes que reflejen lo que hacen, nuevamente para un buen hábito y para ahorrar a los programadores que leen su código los intentos de adivinar para qué "xyzgth" se usa. También, Use comentarios. Incluso si en el código anterior, los comentarios pueden parecer excesivos, no son. Cuando mira el código dos meses después, no tendrá idea de lo que tenía en mente cuando escribió el código. Así que usa y abuse de comentarios, te salvarán, confía en mí.

Ejercicio

Hay funciones que pueden aceptar un número variable de argumentos, como printf (), por ejemplo,. Puede usar Google para ver lo que hacen e intentar reescribir la función add () para aceptar más de dos argumentos, o crear otra función. También puede usar "Man 3 Printf".


Le dijimos antes que Main () se pueda llamar sin argumentos. Por supuesto, eso significa que también se puede llamar con argumentos. Cuando es esto útil? En programas simples como el nuestro, ya que los llamamos sin argumentos, los paréntesis de Main () están vacíos. Pero cuando sus programas crecerán en complejidad, especialmente si estarán orientados a la línea de comandos, necesitará agregar la funcionalidad de los argumentos, como el indicador -v de GCC que imprime la versión. Cuando se desea dicha funcionalidad, Main () debe tener argumentos, dos para ser precisos. La función principal se convierte en

int main (int argc, char ** argv) …

Antes de asustar los nombres crípticos y los dobles asteriscos, espere hasta que obtenga la explicación, que en realidad es simple. El primer argumento es un entero llamado Argc, y el nombre proviene del "recuento de argumentos". Un poco mejor, correcto? Sobre el segundo argumento ... bueno, el nombre representa "vector de argumento" oficialmente y es un puntero a un puntero a un char. Ahora, en inglés, mientras Argc almacena el número de argumentos, Argv almacena los argumentos como una serie de cuerdas. La parte "puntero a ..." se explicará en la siguiente parte del artículo, por ahora todo lo que necesita saber es que si, por ejemplo, el usuario escribirá tres argumentos para el programa, el índice cero de Argv será el nombre del programa en sí, el índice uno almacenará el primer argumento al programa, etc. Así es como puede usar un conmutador/estuche para verificar los argumentos pasados ​​a sus programas. Antes de darle un breve ejemplo, nos sentimos obligados a decirle que Main tiene dos argumentos según lo definido por el estándar, y así es como se usa en la mayoría de los sistemas de Linux y Unix. Sin embargo, si (() trabaja en Windows o Darwin, Main () tendrá uno o dos argumentos más, pero esos dependen del sistema y, por lo tanto, no están definidos o requeridos por el estándar. Además, "char ** argv" también podría escribirse como "char *argv []". Verá ambos, dependiendo de la preferencia del desarrollador.

Quizás recuerdes que te dijimos en la primera parte de nuestra serie cómo usaremos el programa de antaño de Kimball Hawkins para ver ejemplos. Es hora de que comencemos, así que así es como el yest trata con una parte de la posible entrada del usuario:

si (strncmp (argv [i], "--help", 6) == 0 || strncmp (argv [i], ",",-?", 2) == 0 || strncmp (argv [i],"?", 1) == 0 || strncmp (argv [i]," ayuda ", 4) == 0) yest_help (); / * Ayuda solicitada, visualelo */ si (strncmp (argv [i], "--version", 9) == 0 || strncmp (argv [i], "--license", 9) == 0) yest_version (); / * Información de versión/licencia solicitada */

Puede ver en este código cómo Kimball comenta su código, aunque el nombre de las funciones que llama - yest_help () y yest_version () - se explican bastante por sí mismo. La función strncmp () estándar, que se encuentra en la cadena.H, compara dos cadenas, en nuestro caso Argv [i] y "ayuda", por ejemplo, pero solo los primeros X caracteres (4 en la línea "Ayuda") y devuelve cero si la primera cadena coincide con la segunda.

Ejercicio

¿Cómo usaría Switch/Case para verificar si el primer argumento es "-Help" y el segundo es "-versión"? ¿Se pueden usar estas opciones juntas?? ¿Cómo diferiría el código??

Cosas de las que estar al tanto

C no le permite definir una función dentro de otra, con la excepción main (), que es, como podemos ver, especial. Sea consciente de que lo que define dentro de una función "vive" solo dentro de una función. Por lo tanto, puede tener una variable llamada "A" definida dentro de tres funciones diferentes sin ningún problema, pero eso puede conducir a problemas en programas más grandes, por lo que no lo recomendamos.

Archivos de encabezado personalizados

A medida que sus programas se crecerán más y más grande, encontrará la necesidad de dividirlos. Puede tener más de un archivo fuente, pero también puede escribir sus propios encabezados. Entonces, volviendo a nuestro programa de adición, puede crear un encabezado con nombre de operaciones.h que tendrá la línea "doble agregar (doble x, doble y);", para que su programa solo se ocupará de la definición, la parte donde dice que add () devolverá A + B. La inclusión de su encabezado personalizado se realiza justo cuando incluye los que incluyen el sistema con una excepción importante: recuerde usar citas dobles en lugar de soportes de ángulo, como este: "#include" operaciones.H "". Este encabezado se puede colocar en el directorio donde se almacenan los otros archivos de origen o en otra ruta, especificados como un argumento a GCC para que sepa dónde mirar. Los archivos de encabezado pueden contener también definiciones de constantes (con #define) u otras declaraciones, siempre que sepa que se utilizarán en cada archivo fuente del programa. No es obligatorio, es solo una buena práctica. Entonces, ¿cómo escribiría una calculadora que se ocupa solo de las operaciones aritméticas básicas y usa encabezados??

Funciones recursivas

Como esperamos que tenga algunos antecedentes de programación, estamos seguros de que sabe cuáles son las funciones recursivas y cómo/cuándo usarlas. Es por eso que este subcapítulo será más corto de lo que normalmente sería. En resumen, uno dice que una función es recursiva cuando se llama a sí mismo. Aunque el concepto puede ser desalentador para los nuevos programadores, se puede explicar una forma más simple y de la vida real: intente sentarse entre dos espejos frente a los demás. El efecto que ve es una representación visual de la recursión. Pero le daremos un breve ejemplo, para que comprenda mejor cuándo y cómo usarlo. Probablemente recuerdes de la escuela cuando te enseñaron sobre factores. Un factorial es el producto de todos los enteros más pequeños que él o igual, siempre que sean mayores que cero. La notación para esto es un signo de exclamación, así que 6! = 6*5*4*3*2*1 = 720. ¿Cómo podemos hacer esto en C de la manera más eficiente?? Por supuesto, usando la recursión.

int factorial (int número)  si(número <= 1) devolver 1; demás devolver número * factorial (número-1)

Conclusión

Le recomendamos que use funciones con la mayor frecuencia posible y coloque sus prototipos en archivos de encabezado con tanta frecuencia, porque su código estará más organizado y su trabajo se volverá más fácil. Hablando de encabezados, dejamos que sea un ejercicio final para que comience a leer el archivo de encabezado que define las operaciones matemáticas (matemáticas.h) Para tener una idea de cómo se ve y qué contiene. Luego úselo para mejorar la calculadora con alguna funcionalidad mejorada más allá de lo básico.

Esto es lo que puede esperar a continuación:

  • I. C Desarrollo en Linux - Introducción
  • II. Comparación entre C y otros lenguajes de programación
  • III. Tipos, operadores, variables
  • IV. Control de flujo
  • V. Funciones
  • VI. Punteros y matrices
  • VII. Estructuras
  • VIII. E/S básica
  • Ix. Estilo de codificación y recomendaciones
  • X. Construyendo un programa
  • Xi. Embalaje para Debian y Fedora
  • Xii. Obtener un paquete en los repositorios oficiales de Debian

Tutoriales de Linux relacionados:

  • Cosas para instalar en Ubuntu 20.04
  • Una introducción a la automatización, herramientas y técnicas de Linux
  • Cosas que hacer después de instalar Ubuntu 20.04 fossa focal Linux
  • Mastering Bash Script Loops
  • Cosas para instalar en Ubuntu 22.04
  • Ubuntu 20.04 Guía
  • Tutorial de Sqlite Linux para principiantes
  • Mint 20: Mejor que Ubuntu y Microsoft Windows?
  • Cosas que hacer después de instalar Ubuntu 22.04 Jellyfish de Jammy ..
  • Cómo arrancar dual Kali Linux y Windows 10