BotonMenu
BotonIndice

Visita : http://www.conoce3000.com
Paypal : https://www.paypal.me/conoce3000/1

PASCAL CON FREE PASCAL

PASCAL CON FREE PASCAL

PASCAL CON FREE PASCAL


6. FUNCIONES, PROCEDIMIENTOS Y UNIDADES.
6.3. PARÁMETROS DE FUNCIONES Y PROCEDIMIENTOS.
6. FUNCIONES, PROCEDIMIENTOS Y UNIDADES.
6.3. PARÁMETROS DE FUNCIONES Y PROCEDIMIENTOS.
6. FUNCIONES, PROCEDIMIENTOS Y UNIDADES.
6.3. PARÁMETROS DE FUNCIONES Y PROCEDIMIENTOS.

SIGUIENTE

SIGUIENTE

SIGUIENTE


‒ Parámetros de funciones y procedimientos.

Las funciones y procedimientos también pueden usar parámetros, los parámetros son el medio de comunicación que permite pasar variables del programa a un procedimiento o función. Los parámetros se encierran entre dos paréntesis y se debe indicar el tipo de dato que se va usar con los parámetros. A continuación el primer ejemplo:


Descargar
{$codepage UTF8}

PROCEDURE Lectura(Var a,b:integer);
  Begin 
    Write('Ingrese primer sumando : ');readln(a); 
    Write('Ingrese segundo sumando : ');readln(b); 
  End;

FUNCTION Suma(a,b:integer):integer;
  Begin
    Suma:=a+b;
  End;

VAR a,b,c:integer;

BEGIN
  Lectura(a,b);
  c:=Suma(a,b);
  Writeln('La Suma es ',c);
END.
Código fuente 3: Parámetros en las funciones y procedimientos.
Descargar

Se puede observar que las variables globales a,b,c se colocarón después de haber escrito el procedimiento Lectura y la función suma. Esto es posible debido a que el procedimiento Lectura y la función Suma no usan directamente las variables globales a y b del programa, si no que los usan a través de sus parámetros de un modo indirecto. Si los procedimientos Suma y Lectura no tuvierán que usar estas variables globales entonces se deben declarar antes de crear o escribir los procedimientos o funciones mencionados.

Como puede observar en el programa anterior, el procedimiento Lectura hace uso de la palabra reservada Var antes de declarar sus parámetros, esto permite indicarle al procedimiento que el valor de la variable que se pasa a través de sus parámetros, puede ser modificado dentro del procedimiento por cualquier instrucción.

Es decir si queremos que el procedimiento o función nos permita devolver alterados o cambiados los valores de las variables ingresadas a través de sus parámetros, entonces hacemos uso de la palabra reservada var en caso contrario no la usamos, y los valores de las variables no serán alteradas así se use una instrucción de asignación. Las variables ingresadas deben ser estrictamente del tipo de dato declarado en el procedimiento o función, es decir por ejemplo si las variables a,b fueran de tipo byte entonces el compilador no podría compilar el programa.

Además cuando se declara un parámetro como Var, le estamos indicando al procedimiento o función que no cree una copia de dicha variable en memoria, y cuando declaramos un parámetro sin Var entonces el procedimiento o función creará una copia en memoria, el espacio de memoria en donde se colocan las copias de dichos parámetros se conoce como Pila.

Se conocen como parámetros por referencia, a los parámetros que usan la palabra reservada Var, ya que estos parámetros se usan como referencia para poder acceder y cambiar los valores de la variable que se coloca en el parámetro.

Las variables locales de un procedimiento o función también se almacenan en la Pila. Cuando un procedimiento o función finaliza con su conjunto de instrucciones los parámetros y sus variables locales son destruidos o liberados dejando espacio para ser usados por otro procedimiento o función.

Los identificadores de los parámetros pueden ser los mismos que cualquier variable global declarada dentro de un programa, pero sin embargo dentro de la definición o declaración de los parámetros de una función o procedimiento, no deben existir identificadores con el mismo nombre. Es decir lo siguiente es incorrecto:

Function Suma(b,b:integer):integer;

Si deseamos usar parámetros con tipos de datos diferentes en nuestras funciones o procedimientos, es decir definir los parámetros a y b como un integer y el parámetro c como un double, se debe separar los parámetros a y b del parámetro c, usando el punto y coma. Tal como se muestra a continuación:

Function Operacion01(a,b:integer;c:double):integer;

Los parámetros que usen tipos de datos simples como los números enteros, booleanos, caracteres, y reales se usan del modo como se explico anteriormente, pero para usar los tipos de datos string o cadena de caracteres en las funciones y procedimientos como parámetros, se deben usar del siguiente modo:

procedure (Cad01:string;cad02:string[10]);

como puede observar cad01 y cad02 están separados por un punto y coma, debido a que ambos son parámetros con diferente cantidad de caracteres; también se puede definir un tipo de dato, a cambio de usar el string[10], del siguiente modo:

Type
   Cad10=String[10];

procedure (Cad01:string;cad02:Cad10);

A continuación un ejemplo:


Descargar
{$codepage UTF8}

TYPE  TNombre=String[10];

FUNCTION Vocales(Cad:string):byte;
  var i,aux:byte;
      Voc:set of char;  
  Begin
     aux:=0;
     Voc:=['a','e','i','o','u','A','E','I','O','U',#160,#130,#161,#162,#163];
     for i:=1 to length(Cad) do
      if Cad[i] in Voc then aux:=aux+1;
   Vocales:=aux; 
  End;  

VAR frase:string;
    nombre:TNombre;
	
BEGIN
  Write('Ingrese un nombre menor de 10 caracteres : ');readln(nombre);
  Write('Ingrese una frase : ');readln(frase);
  Writeln('Su nombre tiene : ', Vocales(nombre),' vocales');
  Writeln('Su frase tiene : ', Vocales(frase),' vocales');
END.
Código fuente 4: Ejemplo de parámetro string.
Descargar

La función Vocales del programa anterior cuenta las vocales que tiene una frase, de acuerdo al juego de caracteres IBM 437 y sin tomar en consideración el tamaño de la cadena de caracteres. Cuando un parámetro de tipo de dato string es de menor longitud y se pasa una variable de tipo de dato string de mayor longitud, lo que hará el compilador es truncar dicha variable a la longitud que se usa en el parámetro. A continuación un ejemplo :


Descargar
{$codepage UTF8}

TYPE TCad5=String[5];
     TCad10=String[10];


PROCEDURE Truncar5(Cad:TCad5);
 Begin
   Writeln(Cad)
 End;
 
VAR Cad01 : TCad5;
    Cad02 : TCad10;
    Cad03 : String; 

BEGIN
  Cad01:='Hola';
  Cad02:='Hola como estas';
  Cad03:='Bastante grande pero no lo suficiente';
  Truncar5(Cad01);
  Truncar5(Cad02);
  Truncar5(Cad03);
  Truncar5('La frase no llegara a mostrarse completa');
END.
Código fuente 5: Ejemplo de parámetro String truncados.
Descargar

El programa anterior no es muy útil pero demuestra lo explicado anteriormente. Para los tipos de datos enumerados y subrango se debe crear el tipo de dato con anterioridad, para usarlo después como un tipo de dato en el parámetro, es decir primero declaramos el tipo de dato enumerado:

Type
  TNumeros = (cero,uno,dos,tres,cuatro);

y después, lo usamos en la declaración del procedimiento, del siguiente modo:

procedure (M:TNumeros);

Del mismo modo se hace con los tipos de datos subrango. A continuación un ejemplo usando un tipo de dato enumerado:


Descargar
{$codepage UTF8}

TYPE TUnidades=(centimetro,pulgada,pie,yarda);
											 
VAR Valores : array [0..3] of double = (1,2.54,30.48,91.44);

{
  1 pulgada   2.54 cm
  1 pie      30.48 cm
  1 yarda    91.44 cm
}

FUNCTION LeeUnidades:TUnidades;
 Var aux:byte;
 Begin
   Writeln('[0] centimetro');
   Writeln('[1] pulgada');
   Writeln('[2] pie');
   Writeln('[3] yarda');
   Write('opcion : ');readln(aux);
   LeeUnidades:=TUnidades(aux);
 End;

FUNCTION Convertir(n:double;Unidad01,Unidad02:TUnidades):double; 
  Var aux:double;
    Begin
       aux:=n*Valores[Ord(Unidad01)]; //convertimos a centimetros
       Convertir:=aux/Valores[Ord(Unidad02)]   
    End; 

VAR n:double;
    U01,U02:TUnidades;
	
BEGIN
  Write('Ingrese longitud a convertir :');readln(n);
  Writeln('Ingrese Unidad de medida : ');
  U01:=LeeUnidades;
  Writeln('Ingrese Unidad de medida a convertir : ');
  U02:=LeeUnidades; 
  Writeln(Convertir(n,U01,U02):10:3)  
END.
Código fuente 6: Parámetros con tipos de datos enumerados.
Descargar

El programa nos permite convertir una longitud a centímetros, pulgadas, pies y yardas. Para ello el programa usa dos funciones, la función Convertir tiene tres parámetros n, unidad01 y unidad02; los parámetros unidad01 y unidad02 son de tipo TUnidades que es un tipo de dato enumerado, la función convertir hace uso de la función ord para realizar la conversión de las medidas, usando el arreglo valores. La función LeeUnidades devuelve un tipo de dato enumerado TUnidades, como se puede observar en el ejemplo, cuando queremos usar como parámetro un tipo de dato enumerado primero se debe declarar el tipo de dato con anterioridad para después usarlo en el procedimiento o función. Para el caso de los conjuntos también se procede del mismo modo, a continuación un ejemplo:


Descargar
{$codepage UTF8}

{Nota: Para que el programa funcione adecuadamente establecer la codificación
 de caracteres del intérprete de comandos a IBM 437.}
 
TYPE
  TCaracteres=set of char;

FUNCTION NCaracteres(frase:string;Conjunto:TCaracteres):byte;
 var aux,i:byte;
 Begin
   aux:=0;
   for i:=1 to length(frase) do
      if frase[i] in Conjunto then aux:=aux+1;
   NCaracteres:=aux; 
 End;    

VAR Vocales : TCaracteres = ['a','e','i','o','u','A','E','I','O','U',#160,#130,#161,#162,#163];
    Digitos : TCaracteres = ['0'..'9'];
    Mayusculas : TCaracteres = ['A'..'Z',#165];
    Minusculas : TCaracteres = ['a'..'z',#164,#160,#130,#161,#162,#163];     
    frase : string; 

BEGIN
  Write('Ingrese una frase : ');
  readln(frase);
  Writeln('Existen ',NCaracteres(frase,Vocales),' vocales en la frase'); 
  Writeln('Existen ',NCaracteres(frase,Digitos),' digitos en la frase');
  Writeln('Existen ',NCaracteres(frase,Mayusculas),' mayusculas en la frase');
  Writeln('Existen ',NCaracteres(frase,Minusculas),' minusculas en la frase');       
END.
Código fuente 7: Parámetros con tipos de datos conjuntos.
Descargar

Cuando queramos usar registros en los parametros de una función o procedimiento se tiene que crear el tipo de dato que representa al registro, el siguiente programa crea un tipo de dato registro con identificador TAlumno, que después será usado en los procedimientos LeerRegistro y MostrarRegistro.


Descargar
{$codepage UTF8}

TYPE TAlumno = Record
                Nombre:String;
                Edad  : byte;
                Sexo  : Char;
        	     End;
VAR   alumnos:array [1..10] of  TAlumno;
      i,j : byte;
      aux : TAlumno;
      
PROCEDURE LeerRegistro(Var Reg:TAlumno);
  Begin
    Write('   Nombre : ');Readln(Reg.Nombre);
    Write('   Edad    : ');Readln(Reg.Edad);
    Write('   Sexo : ');Readln(Reg.Sexo);
  End;      
    
PROCEDURE MostrarRegistro(Reg:TAlumno);
  Begin
    Writeln(Reg.Nombre:10,Reg.Edad:10,Reg.Sexo:10);
  End;
      
BEGIN      
   for i:=1 to 10 do
    Begin
      Writeln('Registro [',i,']');
      LeerRegistro(alumnos[i])      
    End;
    
     For i:=2 to 10 do
       Begin
         aux:=alumnos[i];
         j:=i-1;
         While ( (j>=1) and (alumnos[j].Nombre>aux.Nombre) ) do
            Begin
              alumnos[j+1]:= alumnos[j];
              j := j - 1;
            End;
         alumnos[j+1]:=aux;
       End;
       
    Writeln;
    
    for i:= 1 to 10 do
      MostrarRegistro(alumnos[i]);      
END.
Código fuente 8: Parámetros con tipos de datos registro.
Descargar

El programa anterior es un programa que se uso en capítulos anteriores y lo único que hace es leer los registros del arreglo, ordenarlos y mostrarlos por pantalla ordenados por el nombre. El programa ordena la lista acorde al alfabeto en latín, (El alfabeto latín no tiene ñ).

A modo de resumen se puede decir que cuando deseamos usar los tipos de datos enumerados, subrangos, conjuntos y registros se debe definir un tipo de dato para usarlo como parámetros en nuestros procedimientos o funciones. Para usar los arreglos como parámetros en los procedimientos o funciones, se debe primero definir como tipo de dato para después usarlo en la cabecera del procedimiento o función, del mismo modo como la hacíamos con los tipos de datos enumerados, subrangos, conjuntos y registros, ejemplo:

Type Tlista30=array [1..30] of integer;

Procedure HacerAlgo(Var N:Tlista30);

El procedimiento o función sólo aceptara arreglos con la misma cantidad de elementos, si se intentase pasar un arreglo de menor o mayor cantidad de elementos no se podrá compilar el programa. A continuación un ejemplo:


Descargar
{$codepage UTF8}

TYPE TAlumno = Record
                Nombre:String;
                Edad  : byte;
                Sexo  : Char;
        	     End;
      TListaAlumnos=array [1..10] of  TAlumno;
        	     
VAR   alumnos:TListaAlumnos;      
            
PROCEDURE LeerRegistro(Var Reg:TAlumno);
  Begin
    Write('   Nombre : ');Readln(Reg.Nombre);
    Write('   Edad    : ');Readln(Reg.Edad);
    Write('   Sexo : ');Readln(Reg.Sexo);
  End;    

PROCEDURE Ordenar(Var alumnos:TListaAlumnos);
 Var i,j:byte;
     aux:TAlumno;
 Begin
   For i:=2 to 10 do
    Begin
      aux:=alumnos[i];
      j:=i-1;
      While ( (j>=1) and (alumnos[j].Nombre>aux.Nombre) ) do
        Begin
          alumnos[j+1]:= alumnos[j];
          j := j - 1;
        End;
        alumnos[j+1]:=aux;
    End;   
 End;    
    
PROCEDURE MostrarRegistro(Reg:TAlumno);
  Begin
    Writeln(Reg.Nombre:10,Reg.Edad:10,Reg.Sexo:10);
  End;
  
VAR i:byte;      

BEGIN      
   for i:=1 to 10 do
    Begin
      Writeln('Registro [',i,']');
      LeerRegistro(alumnos[i])      
    End;    
   Ordenar(alumnos);        
    for i:= 1 to 10 do
      MostrarRegistro(alumnos[i]);      
END.
Código fuente 9: Parámetros con arreglos.
Descargar


Última revisión: 03/05/2013.



SIGUIENTE
SIGUIENTE
SIGUIENTE


 
‒ Comentarios y sugerencias.

Agradezco de antemano, todo comentario, sugerencia, y donativo (a través de Paypal me), que ayude a mejorar los contenidos educativos de Conoce 3000. Además, cualquier pregunta o duda que tengas lo puedes hacer por este medio. Pero, todo contenido que pueda resultar ofensivo, malicioso, racista, sexista, discriminatorio, obsceno, vulgar será eliminado.








PORTADA |  INTERESANTE |  APUNTES |  LIBROS |  GALERIA


Creative Commons License


Todos los textos, imágenes y videos de Conoce3000 estan colocados bajo una licencia : Creative Commons Reconocimiento-NoComercial 3.0 Unported License.