Paradigmas de la Programación

La unidad básica de la programación estructurada es el procedimiento o función. Un programa C++ se diseña como un conjunto de funciones, las cuales se comunican entre sí mediante el paso de parámetros y la devolución de valores.

Un módulo es un conjunto de procedimientos relacionados, junto con los datos que se manipulan. La aplicación de esta definición fue la que inició la programación modular que encapsula un conjunto de operaciones relacionadas actuando sobre un conjunto de datos.

Un módulo muestra una interfaz al usuario que permite actuar sobre un conjunto de datos; solo es posible adaptarla a nuevos usos modificando el propio módulo, lo que demuestra una poca flexibilidad de adaptación hacia nuevas necesidades.

C++ fué diseñado para apoyar la abstracción de datos y la programación orientada a objetos, pero sin forzar al usuario a utilizar este estilo de programación.

Estructura de un programa C++

Para tener una idea veamos el siguiente programa:

holamundo_listado

Este programa es el típico para los que hemos empezado a programar, el resultado en pantalla después de compilar y ejecutar  es:

holamundo_salida1

Es uno de los programas más simples que podemos escribir en C++, pero ya tiene los componentes fundamentales de todos los programas escritos en C++. Analicémoslo línea por línea:

desglose

Vamos crear un programa que hará una tabla de conversión de Grados Centígrados a Grados Fahrenheit, análogamente podemos ver que hemos creado una función llamada convertir.

listado_convertir

Después de compilarlo y ejecutarlo nos saldrá algo como esto:

salida_convertir

Vamos a realizar un estudio de las distintas partes que forman la estructura del programa anterior consta de:

  • Directrices #include (inclusión de declaraciones y/o definiciones)
  • Directrices using (definir los espacios de nombres a los que se refiere nuestro programa).
  • Función principal main.
  • Otras funciones y/o declaraciones. El orden establecido no es esencial, aunque sí bastante habitual. Así mismo, cada función consta de:
    • Definiciones y/o declaraciones.
    • Sentencia a ejecutar.

Directrices para el preprocesador

La finalidad de las directrices es facilitar el desarrollo, la compilación y el mantenimiento de un programa. Una directriz para el preprocesador se identifica porque empieza con el carácter #. Las más usuales son la directriz de inclusión, #include, la directriz de definición, #define, y las condicionales #ifndef y #endif. Estas directrices son procesadas por el preprocesador de C++, que es invocado por el compilador antes de proceder a la traducción del programa fuente.

directrices_preprocesador

Inclusión incondicional

 Cuando se hace uso de un elemento de C++ (constante, variable, clase, objeto, función, etc.), es necesario que dicho elemento que dicho elemento esté previamente declarado. Por ejemplo, el objeto cout del programa anterior ¿como sabe el compilador que cout admite los argumentos especificados? Lo sabe por la información aportada por el fichero de cabecera iostream.

iostream

Lo mismo para las funciones setw (ancho) o setprecision (precisión) cuya información respecto a los parámetros que aceptan esta funciones y que valor retornan es proporcionada por el fichero de cabecera iomanip.

iomanip

Según lo expuesto anteriormente, para incluir la declaración de un elemento de la biblioteca cd C++ antes de utilizarlo por primera vez, basta con añadir el fichero de cabecera que lo contiene. Esto se hace utilizando la directriz #include de alguna manera de las dos formas siguientes:

inclusion_incondicional

 Si el fichero de cabecera se delimita por los caracteres <>, el preprocesador de C++ buscará ese fichero directamente en las rutas especificadas para los ficheros de cabecera (generalmente esta información la proporciona una variable de entorno del sistema, por ejemplo, INCLUDE). En cambio, si el fichero de cabecera se delimita por caracteres ” “, el preprocesador de C++ buscará ese fichero primero en el directorio actual de trabajo y si no lo encuentra, entonces continúa la búsqueda por las rutas a las que nos hemos referido anteriormente. En cualquier caso si el fichero no se encuentra se mostrará un error.

comillas_inclusion

Lógicamente, con esta directriz se puede incluir cualquier fichero que contenga código fuente, independientemente de la extensión que tenga.

Definición de un identificador

Mediante la directriz #define identificador se indica al preprocesador que declare ese identificador.  El comando #define establece una macro en el código fuente. Existen dos posibilidades de definición:

define

Antes de comenzar la compilación, el preprocesador analiza el programa y cada vez que encuentra el identificador NOMBRE lo sustituye por el texto que se especifica a continuación en el comando #define . Por ejemplo, si se tienen las siguientes líneas en el código fuente:

define2

Al terminar de actuar el preprocesador, se habrá realizado la sustitución de E por el valor indicado. Este mecanismo de sustitución permite definir constantes simbólicas o valores numéricos (tales como E, PI, SIZE, etc.) y poder cambiarlas fácilmente, a la vez que el programa se mantiene más legible.

 Es recomendable tener presente que el comando #define :

  • No define variables.
  • Sus parámetros no son variables.
  • En el preprocesamiento no se realiza una revisión de tipos, ni de sintaxis.
  • Sólo se realizan sustituciones de código.

 Inclusión condicional

Utilizando las directrices #ifndef id (si no está definido id) y #endif (fin del if) se puede especificar que un determinado código sea o no incluido en un programa. Uno de los usos más frecuentes de las macros es para establecer bloques de compilación opcionales. Por ejemplo:

inclusion_condicional

El código que se compilará será cout <<"hola" en caso de estar definida la macro COMP_HOLA ; en caso contrario (lo cuál ocurrirá la primera vez que se ejecute #ifndef), se compilará la línea cout <<"adiós" . Esta compilación condicional se utiliza con frecuencia para desarrollar código portable a varios distintos tipos de computadores; según de qué computador se trate, se compilan unas líneas u otras.

Definiciones y declaraciones

 Una declaración introduce uno o más nombres en un programa. Por lo tanto, todo nombre (identificador) debe ser declarado antes de ser utilizado. Es aconsejable hacerlo en el mismo lugar donde vaya a ser utilizado por primera vez. La declaración de un nombre implica especificar su tipo para que el compilador esté informado sobre que tipo de entidad se refiere. Algunos ejemplos son:

declaracion_definicion1

donde las variables suma e i son declaradas y creadas como double e int en el momento de iniciarse la ejecución del bucle for.

Una declaración es una definición a menos que no haya asignación de memoria como ocurre en las líneas siguientes:

definiciones_declaraciones2

 La definición de una función (método o procedimiento) declara la función y además incluye el cuerpo de la misma. Por ejemplo:

declaracion_definicion3

La declaración o la definición de una variable puede realizarse a nivel interno (dentro del cuerpo de una función) o nivel externo (fuera de toda definición de función), pero la definición de una función no puede realizarse dentro de otra función.

Sentencias simples

Una sentencia simple es una expresión de algún tipo terminada con un carácter (;). Un caso típico son las declaraciones o las sentencias aritméticas. Cuando se escriba una sentencia debemos tener en cuenta las reglas siguientes:

  • Las sentencias simple deben terminar con punto y coma (;).
  • Dos o más sentencias pueden aparecer sobre una misma línea, separadas siempre, por un punto y coma (;), aunque no es aconsejable si queremos claridad en el código del programa.

En algunas ocasiones es necesario introducir en el programa una sentencia que ocupe un lugar, pero que no realice ninguna tarea. A esta sentencia se le denomina sentencia vacía y consta de un simple carácter (;).

Sentencia compuesta o bloque

 Una sentencia compuesta o bloque es una colección de sentencias simples incluidas entre llaves { }. Un bloque puede contener a otros bloques. Un ejemplo de una sentencia de este tipo sería:

bloques_1

atras2

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s