martes, 15 de julio de 2008

PROCEDIMIENTOS Y FUNCIONES


Delphi, es un lenguaje estructurado, lo cual indica que los programas escritos en este lenguaje, pueden descomponerse en pequeños módulos que pueden ser llamados cuando los necesitemos. Estos módulos en Pascal se llaman funciones y se identifican mediante un nombre. Se declaran del siguiente modo:



function nombre (argumento1: tipo; argumento2: tipo;...) : tipo;
Begin
/Acciones a realizar/
End;

Donde nombre es el nombre que se asignará a la función, argumento1 y argumento2 son valores que pasan a la función y tipo es el tipo de valor que retornará como resultado. Por ejemplo, si queremos implementar en Pascal la función matemática: f(x, y) = (x * x + y) / x siendo x e y números enteros, se realizaría de este modo:

Function f (x: integer; y: integer) : integer;
Begin
F = (x * x + y) / x;
End;

Dicha función, se definirá una sola ocasión durante el programa, y únicamente será necesario hacer llamada a esta función mediante su nombre y sus valores dados entre paréntesis.

a := f(1, 2); {llamada a f con x=1 e y=2}
b := f(a, 3); {llamada a f con x=a e y=3}
c := f(a, b) + f(1, 4);

Los valores colocados entre paréntesis de la función, reciben el nombre de argumentos. Estos se comportan dentro de la función, como si se tratase de variables.

PROCEDIMIENTOS

Toda función que no retorna valores ningún valor, o que no realiza operaciones matemáticas o genera resultados numéricos, recibe el nombre de procedimiento. La programación estructurada, se basa en dividirse en pequeñas partes autosuficientes que realizan una tarea muy concreta, y que pueden ser invocados cuando se desee. Se puede realizar alguna función o tarea especifica que arroje información de modo no numérico, o sin realizar operaciones, es entonces cuando se utilizan los procedimientos.

Un procedimiento se declara del mismo modo que una función, a diferencia que la palabra reservada Function cambia por Procedure y al final de la lista de argumentos no se pone ningún tipo de valor de respuesta, pues no arroja ningún resultado. Ejemplo:

Program Ejemplo2;
Procedure Di (mensaje: String);
Begin
Showmessage(mensaje);
End;
Begin
Di (‘Mi nombre es: ’);
Di (‘David Osornio Fernández’);
End;

También es posible construir funciones o procedimientos que no tengas argumentos, pues pueden realizar una tarea concreta, no importando alguna otra cosa. Ejemplo:

Program Ejemplo3;
Procedure Saluda;
Begin
Showmessage(‘Hola a todos’);
End;
Procedure Nombre;
Begin
Showmessage(‘Mi nombre es David Osornio Fernández’);
End;
Procedure Despidete;
Begin
Showmessage(‘Adiós a todos’);
End;
Saluda;
Nombre;
Despidete;
End;

SELECCIÓN MULTIPLE


Cuando se realiza un programa, es frecuente encontrarse con alguna variable que según su valor realizara alguna acción. Esto se podría realizar con muchos If´s anidados, pero resultaria algo enredado, por ejemplo: Si se desea que cuando a tenga el valor 1, c tome el valor 10, cuando a tenga el valor 2, c tome el valor 15, cuando a tenga el valor 3, c tome el valor 20 y cuando no sea alguno de los 3 valores, entonces que c tome el valor 0:



If a = 1 then c := 10 Else

If a = 2 then c := 15 Else

If a = 3 then c := 20 Else

c := 0;



Esta forma de tomar decisiones resulta muy poco ortodoxa. El lenguaje Pascal nos ofrece para dicho propósito otra forma mas fácil de hacerlo. Mediante la palabra reservada case of. La sintaxis de dicha instrucción es la siguiente.



case variable of

valor1: acción1;

valor2: acción2;

....

Else acción N;

End;



Donde variable es el identificador de la variable que será comprobada y valor1, valor2... son los diferentes valores que puede tomar dicha variable. Si tomamos el problema anteriormente planteado, tendremos que la solución sería de este modo:



case a of

1: c := 10;

2: c := 15;

3: c := 20;

Else c:= 0;

End;

ANIDAMIENTOS

Es sabido que después de la palabra reservada Then se pueden ejecutar secuencias de instrucciones las cuales pueden ser de cualquier tipo, ahora bien, ¿Es posible colocar un if dentro del bloque then de otro?. La respuesta es si, a estas sentencias de “If´s” encadenados se le denomina anidamiento.

El punto clave es tomar en cuenta que cuando se coloquen anidamientos es recomendable colocar las instrucciones Begin y End entre Then y Else de este modo sabremos exactamente a que if pertenece cada Else. Ejemplo:



If a = 7 then

Begin

If b = 2 then

c := 3

Else

c := 2

End

Else

c := 1;

viernes, 4 de julio de 2008

Redondeo y dolores de cabeza

5908467redondeo La clásica función Round de Delphi y las más recientes funciones RoundTo se proyectan sobre algoritmos de redondeo de la CPU y la FPU. De manera predeterminada, las CPU de Intel utilizan el redondeo bancario, que es también el tipo de redondeo que se suele encontrar en aplicaciones de hojas de cálculo.
        
El redondeo bancario se basa en la suposición de que cuando se redondean números que residen exactamente entre dos valores (10s números ,5), a1 redondearlos arriba o abajo se aumenta o reduce estadisticarnente la cantidad total (en general de capital). Por este motivo, la regla del redondeo bancario indica que 10s números ,5 deberían redondearse arriba o abajo dependiendo de que el número (sin decimales) sea impar o par. De esta manera, el redondeo se equilibrara, a1 menos estadísticamente. 

image

El ejernplo de redondeo de la figura, dernuestra el redondeo bancario y el aritmetico.

El programa tambidn utiliza otro tipo de redondeo proporcionado por la unidad Math mediante la funcion SimpleRoundTo, que utiliza un redondeo aritmktico asimetrico.

En este caso, todos 10s numeros ,5 se redondean a1 valor superior. Sin embargo, tal y como se recalca en el ejemplo de redondeo, la funcion no actua como se esperaria cuando se redondea hasta un digito decimal (es decir, cuando se pasa un segundo parametro negativo). En este caso, debido a 10s errores de representacion de 10s numeros de coma flotante, el redondeo recorta 10s valores; por ejemplo convierte 1,15 en 1,l en lugar del esperado 1.2. La solucion es multiplicar el valor por diez antes de redondear, redondearlos hasta cero digitos decimales, y despues dividirlo, como se muestra a continuacion:

(SimpleRoundTo ( d *10 , 0) / 10 )