principal contenidos <-- test editor indice


¿Qué es programación modular?

Los procedimientos (parámetros)

Variables globales y locales

Un ejemplo sobre los procedimientos

Las funciones predefinidas

Las funciones de usuario

Un ejemplo con las funciones











¿Qué es programación modular?

Uno de los métodos más conocidos para resolver un problema es dividirlo en problemas más pequeños, llamados subproblemas. De esta manera, en lugar de resolver una tarea compleja y tediosa, resolvemos otras más sencillas y a partir de ellas llegamos a la solución. Esta técnica se usa mucho en programación ya que programar no es más que resolver problemas, y se le suele llamar diseño descendente, metodología del divide y vencerás o programación top-down.

Es evidente que si esta metodología nos lleva a tratar con subproblemas, entonces también tengamos la necesidad de poder crear y trabajar con subprogramas para resolverlos. A estos subprogramas se les suele llamar módulos, de ahí viene el nombre de programación modular. En Pascal disponemos de dos tipos de módulos: los procedimientos y las funciones.

Veamos un ejemplo de cómo emplear el diseño descendente para resolver un problema. Supongamos que un profesor quiere crear un programa para gestionar las notas de sus alumnos. Quiere que dicho programa le permita realizar tareas tales como asignar notas, cambiar notas, ver las notas según distintas calificaciones, etc. A continuación tines un esquema que representa una de las posibles divisiones del problema en módulos.

Volver al inicio de la página
Pasar al siguiente apartado sobre los procedimientos

 











Los procedimientos

Un procedimiento es un subprograma que realiza una tarea específica. Para invocarlo, es decir, para hacer que se ejecute, basta con escribir su nombre en el cuerpo de otro procedimiento o en el programa principal. Pero, hay que tener muy en cuenta que su declaración debe hacerse antes de que sea llamado por otro módulo.

Una vez que has construido varios programillas en Pascal, crear un procedimiento no es nada complicado, pues tiene prácticamente la misma estructura que un programa. Veamos las secciones que comparten y no comparten un procedimiento y un programa principal:

Todas estas diferencias y similitudes que hemos comentado, puedes apreciarlas en los siguientes esquemas que representan las estructuras de un programa y de un procedimiento:

   program nombre_programa;
   const declarar_ctes;
   type declarar_tipos;
   var declarar_vars;
   					
   (*aquí irían los subprogramas*)
   					
   begin
       cuerpo_programa
   end .
				
				
   procedure nombre (lista_parametros);
   const declarar_ctes;
   type declarar_tipos;
   var declarar_vars;
					
   (*aquí irían los subprogramas*)
					
   begin
       cuerpo_procedimiento
   end ;
   		

Los parámetros (argumentos)
Como habrás observado, con los procedimientos nos llega un concepto nuevo, el de los parámetros. A los parámetros también se les conoce como argumentos y tienen la misión de comunicar al procedimiento con el programa que lo llama. Por ejemplo, si quieres hacer un subprograma que multimplique dos números, lo más cómodo es que al llamar al procedimiento le pases los valores que participarán en la operación. Podría ser algo como:

   procedure producto (a,b : integer; var rdo : integer) ;
       (* resto del procedimiento *) 					
					

Los parámetros por valor tiene dicho nombre porque lo que recibe el subprograma no son más que copias de los valores de los datos que el programa invocador le pasa. Por tanto si en el procedimiento modificamos alguno de estos valores, los datos originales permaneceran inalterados. En el ejemplo, son a y b.

En cambio, en los parámetros por referencia lo que se pasa al procedimiento son los datos en sí. Y si éste los modifica, los cambios permanecerán una vez que la ejecución vuelva al módulo que invocó al procedimiento. Se utilizan para obtener valores de los cálculos que haga un subprograma, y en el anterior ejemplo es rdo.

¿Cómo se especifica que un parámetro es por valor o por referencia?

Pues es tan sencillo como anteponer la palabra reservada var cuando quieres que un argumento sea considerado como referencia. Esto se observa claramente con el parámetro rdo del ejemplo.

nota: si no tienes muy clara la diferencia entre parámetros por valor y por referencia, te aconsejo que vayas al ejemplo sobre procedimientos del que dispones en este tema, estoy seguro que te ayudará.



Volver al inicio de la página
Pasar al siguiente apartado sobre variables globales y locales

 











Las variables globales y locales

Despues de estudiar los procedimientos de Pascal y las diferencias entre parámetros por valor y por referencia, es hora de tratar otro aspecto clave en la programación modular: la distinción entre variables globales y locales.

Veamos un ejemplo que, como siempre, nos ayudará en la explicación de estos nuevos conceptos:

   program varsGlobalesLocales;
   var
      vGlobal : integer;

   procedure nombreProc(param : integer);
   var
      vLocal : integer;
   begin
      vLocal := 2 * param;
      vGlobal := vLocal      
   end;
   
   (*cuerpo principal del programa*)   
   begin               
      vGlobal := 1;
      nombreProc(4);
      writeln('vGlobal vale : ',vGlobal)      
   end.               
				

Una variable local es una variable que está declarada dentro de un subprograma, y se dice que es local al subprograma. Y lo que la caracteriza es que su valor sólo está disponible mientras se ejecuta el subprograma. Dicho de otra manera, el programa principal no tiene conocimiento alguno de las variables locales de sus procedimientos y funciones.

Las variables declaradas en la sección correspondiente a esta labor en el programa principal se denominan variables globales. Y a diferencia de las locales, su valor está disponible tanto en el cuerpo del programa principal como en el de cualquiera de los subprogramas declarados.

En el ejemplo anterior se declara una variable local llamada vLocal, y si se intentase usarla en el cuerpo del programa principal, por ejemplo para asignarle un valor, recibiríamos un error del compilador. También se declara una variable global (vGlobal), cuyo valor se cambia en el cuerpo del procedimiento, y este cambio permanece después de ejecutarlo, pues el resultado que se mostraría en pantalla sería : vGlobal vale : 8.

nota: aunque en el ejemplo se hace, no es una buena práctica en programación tratar con variables globales en los subprogramas, porque pueden aparecer errores debidos a algún cambio no previsto en una de estas variables. Este tipo de errores son conocidos como efectos laterales y se evitan usando los parámetros en la comunicación de un programa con sus procedimientos.



Volver al inicio de la página
Pasar al siguiente ejemplo sobre los procedimientos

 











Un ejemplo con los procedimientos

Después de hablar de procedimientos, parámetros por valor y por referencia y variables globales y locales, es la hora de presentarte un ejemplo con el que puedas reforzar lo que hemos visto. Con él se pretende que queden absolutamente claros estos conceptos porque son fundamentales en la programación.

En el ejemplo, tienes a la izquierda el código de un programa en el que hay un procedimiento. A la derecha, tienes tres casillas en las que debes introducir numéros enteros para variables que participan en el programa. Después de dar los valores, deberías examinar el código y determinar qué salida crees que se producirá. Por último, pulsando el botón puedes ver la salida real y compararla con la que tenías en mente.




Volver al inicio de la página
Pasar al siguiente apartado sobre las funciones predefinidas

 











Las funciones predefinidas

Este tema trata de la programación modular, y como ya hemos dicho, Pascal nos ofrece dos tipos de módulos. Uno ya lo hemos comentado, los procedimientos, y el otro, es el que vamos a tratar ahora, las funciones.

La división a más alto nivel que se suele hacer con las funciones, es la que las divide según quien sea el autor de las mismas. Así tenemos funciones predifinidas o estándar, y funciones de usuario. Las de usuario las trataremos más adelante. Ahora nos centraremos en las predefinidas.

Las funciones predefinidas, también llamadas estándar, son las que el propio lenguaje Pascal pone a disposición del programador. Por ejemplo, si necesitas calcular el valor absoluto de un número, no es necesario que construyas la función, pues ya se dispone de una que lo hace.

Dependiendo del tipo de compilador de Pascal que uses, dispondrás de más o menos funciones estándar, pero siempre tendrás un grupo básico que comparten todos. A continuación se citan unas cuantas funciones de las básicas:

sin(x:real) seno de x cos(x:real) coseno de x
sqr(x:real) cuadrado de x sqrt(x:real) raíz cuadrada de x
abs(x:real) valor absoluto de x ln(x:real) logaritmo neperiano de x
int(x:real) parte entera de x frac(x:real) parte decimal de x
pred(x:tipo ordinal) predecesor de x succ(x:tipo ordinal) sucesor de x
pi (*no args.*) valor de la constante pi odd(x:integer) si x es o no impar



Volver al inicio de la página
Pasar al siguiente apartado sobre funciones de usuario

 











Funciones definidas por el usuario

Las funciones de usuario son, como su nombre indica, las que el propio usuario declara, de igual manera que declara procedimientos. Las funciones nacen con el propósito de ser subprogramas que siempre tienen que devolver algún valor.

Las dos principales diferencias entre procedimientos y funciones son:

Veamos el esqueleto básico que comparten las funciones:

   function nombre [(p1,p2,...)] : tipo;
   const lista_ctes;
   type lista_tipos;
   var lista_vars;
   (*declaracion de subprogramas*)
   begin
      (* cuerpo de la función *)
      nombre := valor_devuelto
   end;
  	

Comentemos la sintaxis de una función que aparece en el cuadro anterior:

Ahora es el momento de que vayas a un divertido ejemplo sobre las funciones disponible en este tema. Aunque más que ejemplo, se le podría llamar juego, ya que en él tienes la posibilidad de construir varias funciones pudiendo comprobar si son o no correctas.



Volver al inicio de la página
Pasar al siguiente ejemplo sobre las funciones

 











Un ejemplo sobre las funciones

A continuación tienes un ejemplo para que refuerces lo aprendido en el punto anterior sobre las funciones. El ejemplo es como un pequeño juego con el que se pretende construir una función. Para ello, puedes seleccionar lo que quieres que haga la función y las instrucciones que la forman.

En la izquierda, además de poder seleccionar el objetivo, tienes un cuadro que contiene las instrucciones disponibles. En la parte derecha tienes tres selectores para marcar que instrucciones quieres utilizar, y también tienes un cuadro para comprobar si la función es o no correcta. Suerte!!

nota: para que un programa sea considerado como correcto no basta con que funcione, sino que también es necesario que no contenga instrucciones que no aporten nada.



Volver al inicio de la página
Volver al apartado anterior sobre funciones de usuario

| Inicio | Contenidos | Introducción | Estructura | Variables |
| Tipos de datos | E/S de datos | Sentencias | Control del flujo | Progr. modular |