Programación: estructura de un programa C – Parte 2

Segunda parte de la serie de entradas que explican la estructura de un programa en lenguaje C dentro de la serie Programación. Una vez ya tienes claro la diferencia entre los paradigmas de la programación estructurada versus la programación orientada a objetos, ahora vamos a ver los conceptos básicos y cómo se distribuye un código fuente y los algoritmos para C. Algo básico si quieres ser un «arquitecto» de programas y que suele obviarse en muchos cursos y manuales…

Cuando escribes tu primer «Hola Mundo», simplemente copias las instrucciones o pones ciertas partes del código ahí porque lo has leído en otro lugar. Pero ¿realmente sabes cuál es la función de cada parte? Tal vez muchos simplemente entiendan la función printf() que es la que muestra el mensaje en pantalla. Pero sin el resto que la acompaña, el programa no funcionaría. Es decir, tal vez te hayan enseñado, o hayas aprendido de forma autodidacta, la parte menos trascendental de todas las que aparecen. De hecho, esa función no sería nada sin la cabecera stdio.h que has incluido al inicio del código.

Estructura de datos y de control

Ya sabes que el paradigma de programación estructurada se compone de una estructura de datos y otra de control, algo así como los paths datos y control de una CPU si te gusta la serie Microarquitectura de este blog. Los datos ya sabes que son simplemente el conjunto de datos (constantes, variables,…) que se manejan o almacenan durante la ejecución del programa. En cambio, la estructura de control es la que controla cómo se va a ejecutar el programa.

Esta estructura de control son una serie de instrucciones ordenadas. La forma de ordenarlas es clave dentro de este paradigma, ya que solo cuentan con un solo punto de entrada y un punto de salida. Dentro de estas estructuras existen varios tipos:

  • Secuenciales:  las instrucciones se ejecutan en orden, desde la primera a la última, sin saltar ninguna.
  • Selectivas: evaluando si una condición es verdadera o falsa, se elige una opción (una o varias instrucciones).
  • De iteración: una acción que se repite una cantidad de veces definida o indefinidamente. Será una condición la que determine hasta cuando.

Todas estas estructuras se mezclan y combinan para componer los programas., aunque algunos programas sencillos puedan usar solo algún tipo concreto, pero no es lo normal.

Estructura del algoritmo y del código

Si recuerdas artículos previos, dije que saber crear un algoritmo o usar pseudocódigo puede ser vital para saber diseñar un programa desde cero. Algunos cursos y manuales simplemente se basan en darte snippets de código para que los copies, los pruebes, o los modifiques. Pero cuando terminas ese curso, e intentas diseñar un programa por ti mismo, no sabes ni por donde empezar. Estarás completamente perdido y lo que intentarás hacer es buscar otro ejemplo de código fuente que te pueda servir  de base… ¿Y si no existe porque lo que intentas hacer es novedoso? ¡Te quedas anclado!

Otro de los escoyos que encuentras a la hora de crear un programa es la de no saber cómo escribirlo cuando no usas otro código como referencia, puesto que no te han enseñado cómo se estructura y para qué sirve cada parte. Vamos a ver un ejemplo de pseudocódigo en C para ir luego desgranando cada parte:

//Comentario de una sola línea
/*Comentarios cuando ocupan más de una línea para determinar dónde está el comienzo y donde se encuentra el final. En estos comentarios del inicio se suele especificar para qué sirve el programa o algunos datos de interés para mantenedores, consideraciones, etc.*/

#include <stdio.h>    //Declaración de las cabeceras o bibliotecas a incluir. 
#include <conio.h>

void bienvenido(char nombre):  //Prototipo de funciones

char nombre[100];   //Declaración de variables y constantes globales

main()  //Programa principal

{
int num1, num2, suma;   //Declaración de variables y constantes locales
     printf("Introduce un nombre:\n");    //Funciones o instrucciones... El cuerpo del programa
     scanf("%s", &nombre);
     printf("Introduce un número:\n");
     scanf("%d", &num1);
     printf("Introduce otro número:\n");
     scanf("%d", &num2);
     suma=num1+num2;
     bienvenido(nombre);     //Llamada a la función
     printf("La suma es: %d", suma); 
     getch();
     return(); 
}
void bienvenido(char nombre[])    //Declaración de funciones
{
     printf("\n Un saludo %s", nombre);           //Otro módulo
     getch();
}

Ahora iré desglosando parte a parte de este ejemplo simple:

  • Comentarios: pueden ir en cualquier parte del programa y a estas alturas deberías saber cómo introducirlos de entradas previas de esta serie de Programación. Si van al principio suelen ser referentes a la descripción del programa, consideraciones importantes, etc. Y si van a lo largo del programa serán comentarios sobre lo que hace una determinada parte, etc. Ya sabes que estos comentarios serán ignorados por el compilador, es decir, no tienen efecto, pero sirve para todos los que lean el código con fines de modificarlo o mantenerlo.
  • Declaración de cabeceras: se incluyen las bibliotecas donde se encuentran las funciones que se van a usar durante el programa, como stdio.h que contiene definida la función printf, etc. También se pueden declarar funciones, variables, constantes, etc. Ya lo vimos en unos artículos previos si recuerdas lo que era el Precompilador.
  • Prototipo de funciones: en este caso no llevan el .h, pero avisan igualmente al compilador que existe una función que va a regresar un determinado tipo de dato y qué parámetros va a usar.
  • Declaración de variables y constantes: pueden ser globales, que se van a usar en todo el programa, es decir, en todas esas partes o módulos, pero también las hay locales. En el caso de las locales, solo se usarán en una parte específica. Se pueden declarar en cualquier parte, aunque se recomienda hacerlo al principio. Por cierto, esto es lo que pertenece a esa estructura de datos de la que hablamos…
  • Función o programa principal: en este caso main() que lo puedes encontrar con varios formatos. Es la parte por la que debe comenzar el programa por tanto, avisa al compilador de la forma en la que ordenará las instrucciones del binario resultante. Esta función contendrá sus instrucciones de control y datos entre {}, formando el cuerpo principal del programa. Ya sabes que todo lo que vaya delante del return(0), que pone fin, y cuando finaliza con éxito no devolverá nada en este caso. En caso contrario aparecería un código de error. En programas complejos se recomienda sustituir el return(0) por EXIT_SUCESS;, pero esto ya lo veremos más adelante…

En ocasiones puedes encontrar solo main(), otras int main(), void main(), int main(void), etc., en función de si devuelve un valor numérico, un valor vacío, etc. Casi siempre suelen estar vacías o con void, que al caso es igual, pero no siempre lo están. Por ejemplo cuando el programa debe devolver algún valor al sistema operativo o a una aplicación. Algunos compiladores pueden no aceptar algunos de estos formatos…

  • Declaración de funciones: las sentencias o funciones con las que trabajará el programa y que las crea el propio programador, es decir, no son como printf y similares, que se encuentran definidas en los archivos de cabecera (prefabricadas). En este caso se crean desde cero. Aunque no es estrictamente necesario, ya que lo único fundamental para un programa es la cabecera y función main().

Espero que ahora lo tengas un poco más claro…

Isaac

Apasionado de la computación y la tecnología en general. Siempre intentando desaprender para apreHender.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

A %d blogueros les gusta esto:

Si continuas utilizando este sitio aceptas el uso de cookies. más información

Los ajustes de cookies de esta web están configurados para "permitir cookies" y así ofrecerte la mejor experiencia de navegación posible. Si sigues utilizando esta web sin cambiar tus ajustes de cookies o haces clic en "Aceptar" estarás dando tu consentimiento a esto.

Cerrar