Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Delphi 2
Delphi 2
Ferm Vil
55
II . Procedimientos y Funciones
La Programacin Estructurada se basa en dividir el programa en bloques ms
pequeos, buscando una mayor legibilidad, y ms comodidad a la hora de corregir o ampliar.
Dichos bloques pueden ser de dos tipos: procedimientos (procedure) y funciones
(function).
La diferencia entre ellos es que un procedimiento ejecuta una serie de acciones que estn
relacionadas entre s, y no devuelve ningn valor, mientras que la funcin s que va a devolver
valores.
a) Function
- Escribe la siguiente aplicacin tipo cnsola:
program Project045;
{$APPTYPE CONSOLE}
uses
SysUtils;
var
n1,n2:integer;
function potencia(a,b:integer):integer;
var
i:integer;
temp:integer;
begin
temp:=1;
for i:=1 to b do
temp:=temp*a;
potencia:=temp;
end;
begin
writeln('Potencia de un nmero entero');
writeln;
writeln('Introduce el primer nmero entero (base de la potencia):
');
readln(n1);
writeln('Introduce el exponente (tambin entero)');
readln(n2);
writeln(n1,' elevado a ',n2,' vale ',potencia(n1,n2));
readln;
Delphi 7
Ferm Vil
end.
- Grbalo en TuCarpeta con el nombre Project045.dpr y ejectalo.
- Estudio del Project045:
Observa la estructura de una funcin:
Function potencia(a,b: integer): integer;
Var
Begin
potencia:=
end;
Observa de qu forma llamamos a la funcin: potencia(n1 , n2)
Es decir: los parmetros de entrada son n1, n2 (nmeros enteros). El resultado o
parmetro de salida de la funcin potencia no es ms que n1 elevado a n2
(multiplicar n2 veces el nmero n1 consigo mismo).
b) Procedure
- Escribe el siguiente programa tipo cnsola:
program Project046;
{$APPTYPE CONSOLE}
uses
SysUtils;
procedure saludo(nom:string);
begin
writeln('Hola ',nom,' qu
tal?');
end;
begin
writeln;
saludo('Pepe');
readln;
end.
- Grbalo como Project046.dpr y ejectalo.
- Observa la diferencia entre una function y un procedure: aparte de nombrarlos de forma
distinta, la nica diferencia estriba en que el procedure no devuelve ningn valor.
56
Delphi 7
Ferm Vil
57
Delphi 7
Ferm Vil
58
Delphi 7
Ferm Vil
59
end;
Memo1.Text:=salida;
end;
- Desde la ventana de cdigo del formulario, donde acabas de escribir el procedimiento de evento
anterior, localiza el apartado public y escribe en l:
function potenciaReal(a,b:real):real;
Y en el apartado implementation, escribe:
function TForm1.potenciaReal(a,b:real):real;
begin
potenciaReal:=exp(b*ln(a));
end;
- Ejecuta el programa. Si quieres calcular muchas potencias, seria conveniente incluir en el
componente Memo una barra de desplazamiento vertical, de la siguiente forma:
Selecciona el Meno1
En el Inspector de Objetos, cambia la propiedad ScrollBars por ssVertical
- Graba el programa como Unit049.pas Project049.dpr
Delphi 7
Ferm Vil
60
begin
RaizCubica:=exp((1/3)*ln(a));
end;
- Grbalo como Unit050.pas Project050.dpr y ejectalo.
f) Programa con dos functions
- Men File New - Application
- Inserta en el formulario, un button y un Memo (con la propiedad ScrollBars = ssVertical).
- Clic clic en [Button1] y escribe el siguiente procedimiento de evento:
procedure TForm1.Button1Click(Sender: TObject);
var
num1,num2:real;
opcion:string[1];
torni:string[1];
salida:string;
begin
torni:='S'; salida:='';
while (torni='S') Or (torni='s') do
begin
opcion:=InputBox('Sumar - Multiplicar','Qu quieres sumar o multiplicar (S/M)?','');
num1:=StrToFloat(InputBox('Entrada de Datos','Escribe el primer nmero',''));
num2:=StrToFloat(InputBox('Entrada de Datos','Escribe el segundo nmero',''));
if (opcion='S') Or (opcion='s') then
salida:=salida+'La suma de '+FloatToStr(num1)+' y '+FloatToStr(num2)+' es
'+FloatToStr(Suma(num1,num2))+#13+#10;
if (opcion='M') Or (opcion='m') then
salida:=salida+'El producto de '+FloatToStr(num1)+' y '+FloatToStr(num2)+' es
'+FloatToStr(Producto(num1,num2))+#13+#10;
torni:=InputBox('Repetir','Quieres volver a calcular (S/N)?','');
end;
Memo1.Text:=salida;
end;
- Escribe en el apartado public:
function Suma(a,b:real):real;
function Producto(a,b:real):real;
- Escribe en el apartado implementation:
function TForm1.Suma(a,b:real):real;
begin
Suma:=a+b;
end;
function TForm1.Producto(a,b:real):real;
begin
Delphi 7
Ferm Vil
61
Producto:=a*b;
end;
- Grbalo como Unit051.pas Project051.dpr y ejectalo.
g) Programa que calcula la letra del NIF
Segn el resto de la divisin entera del DNI con el nmero 23, corresponder una letra u
otra en el NIF, de la siguiente forma:
Resto
Letra
Resto
Letra
0
T
12
N
1
R
13
J
2
W
14
Z
3
A
15
S
4
G
16
Q
5
M
17
V
6
Y
18
H
7
F
19
L
8
P
20
C
9
D
21
K
10
X
22
E
11
B
- Men File New - Application
- Inserta en el formulario, un button y un memo, con la propiedad ScrollBars = ssVertical
- Clic-clic en el [Button1] y escribe:
procedure TForm1.Button1Click(Sender: TObject);
var
numero:integer;
torni,salida:string;
begin
torni:='S'; salida:='';
while (torni='S') Or (torni='s') do
begin
numero:=StrToInt(InputBox('DNI','Escribe el DNI',''));
salida:=salida+'DNI = '+IntToStr(numero)+' - NIF =
'+IntToStr(numero)+NIF(numero)+#13+#10;
torni:=InputBox('Repetir','Quieres calcular otro NIF
(S/N)?','');
end;
Memo1.Text:=salida;
end;
- Escribe en:
El apartado public:
function NIF(dni:integer):string;
El apartado implementation:
Delphi 7
Ferm Vil
function TForm1.NIF(dni:integer):string;
const
letras:string[23]='TRWAGMYFPDXBNJZSQVHLCKE';
begin
NIF:=letras[(dni MOD 23)+1];
end;
- Grbalo como Unit052.pas Project052.dpr y prubalo.
62
Delphi 7
Ferm Vil
63
Delphi 7
Ferm Vil
64
j) Recursividad
El factorial de un nmero n, es el producto del nmero n, por sus sucesivos nmeros
disminuidos en una unidad, hasta llegar a uno, es decir:
Factorial de n = n(n-1)(n-2)(n-3) 2.1
Por ejemplo, el factorial de 5, que matemticamente se expresa 5! Es 120, porque
5.4.3.2.1 = 120
- Vamos a hacer un programa que calcule el factorial
Men File
New
Application
- Inserta en el formulario, un button y un memo (con la propiedad ScrollBars = ssVertical).
- Escribe el siguiente procedimiento de evento:
procedure TForm1.Button1Click(Sender: TObject);
var
i,n,fact:integer;
salida:string;
opc:string[1];
begin
salida:='Factorial de un nmero'+#13+#10;
salida:=salida+'======================='+#13+#10;
opc:='S';
while (opc='S') Or (opc='s') do
begin
n:=StrToInt(InputBox('Factorial de un nmero','Introduce un nmero entero',''));
fact:=1;
for i:=1 to n do
fact:=fact*i;
salida:=salida+#13+#10;
salida:=salida+'El Factorial de '+IntToStr(n)+' es '+IntToStr(fact)+#13+#10;
opc:=InputBox('Otro factorial','Quieres calcular otro factorial (S/N)?','');
end;
Memo1.Text:=salida;
Delphi 7
Ferm Vil
65
end;
- Grbalo como Unit055.pas Project055.dpr y ejectalo.
- Si intentas calcular el factorial a partir del nmero 17, el programa anterior no nos sirve, ya que
17! Es mayor que el mximo nmero integer. Vamos a calcular el factorial de otra manera: forma
recursiva
- Men File New - Application
- Inserta en el formulario, un button y un memo con la propiedad ScrollBars = ssVertical
- Escribe el siguiente procedimiento de evento:
procedure TForm1.Button1Click(Sender: TObject);
var
n:integer;
salida:string;
opc:string[1];
begin
salida:='Factorial de un nmero'+#13+#10;
salida:=salida+'======================='+#13+#10;
opc:='S';
while (opc='S') Or (opc='s') do
begin
n:=StrToInt(InputBox('Factorial de un nmero','Introduce un nmero entero',''));
salida:=salida+#13+#10;
salida:=salida+'El Factorial de '+IntToStr(n)+' es
'+IntToStr(factorial(n))+#13+#10;
opc:=InputBox('Otro factorial','Quieres calcular otro factorial (S/N)?','');
end;
Memo1.Text:=salida;
end;
- Escribe en el apartado public del Unit:
function factorial(x:integer):integer;
- Escribe en el apartado implementation del mdulo:
function TForm1.factorial(x:integer):integer;
begin
if x=1 then
factorial:=1
else
factorial:=x*factorial(x-1);
end;
- Grbalo como Unit056.pas Project056.dpr y ejectalo.
- Un procedimiento o funcin decimos que es recursivo, si se llama a si mismo.
Delphi 7
Ferm Vil
66
Delphi 7
Ferm Vil
67
Delphi 7
Ferm Vil
68
Delphi 7
Ferm Vil
69
n) Aplicacin windows que escribe los nmeros pares entre dos nmeros cualesquiera e
indica los que son mltiplos de 3.
La idea del programa es hacer un procedimiento que determine si un nmero es mltiplo
de 3 o no.
- Men File New - Application
- Inserta en el formulario, un button y un memo, con la propiedad ScrollBars = ssVertical.
- Escribe:
Delphi 7
Ferm Vil
70
Delphi 7
Ferm Vil
p) Funcin de Euler
Dado un nmero entero positivo A, su funcin de Euler es el nmero de enteros
positivos inferiores a A y que adems son primos con A
Dos nmeros son primos si su mximo comn divisor es 1. Por lo tanto deberemos
utilizar la funcin del programa anterior
- Men File New - Application
- Inserta un button y un memo
- Cdigo:
procedure TForm1.Button1Click(Sender: TObject);
var
num:integer;
begin
sa:='';
num:=StrToInt(InputBox('Funcin de Euler del nmero','',''));
sa:=sa+'Funcin de Euler del nmero'+IntToStr(num)+#13#10;
Euler(num);
Memo1.Text:=sa;
end;
- En public:
sa:string;
function
MCD(x,y:integer):integer;
function Euler(x:integer):integer;
- En implementation:
function TForm1.MCD(x,y:integer):integer;
var
71
Delphi 7
Ferm Vil
aux,resto:integer;
begin
resto:=0;
if (x<y) then
begin
aux:=x;
x:=y;
y:=aux;
end;
if (x mod y)=0 then
resto:=y;
while ((x mod y)<>0) do
begin
resto:=x mod y;
x:=y;
y:=resto;
end;
MCD:=resto;
end;
function TForm1.Euler(x:integer):integer;
var
i,contador:integer;
begin
contador:=0;
for i:=1 to x-1 do
if MCD(x,i)=1 then
begin
contador:=contador+1;
sa:=sa+IntToStr(i)+',';
end;
sa:=sa+#13#10+'N. de Euler= '+IntToStr(contador);
Euler:=contador;
end;
- Grbalo como Unit062.pas Project062.dpr y prubalo.
72
Delphi 7
Ferm Vil
begin
ano:=StrToInt(InputBox('Ao','',''));
if bisiesto(ano) then
Memo1.Text:='El Ao '+IntToStr(ano)+' es bisiesto'
else
Memo1.Text:='El Ao '+IntToStr(ano)+' no es
bisiesto';
end;
- En public:
function
bisiesto(x:integer):boolean;
- En implementation:
function TForm1.bisiesto(x:integer):boolean;
begin
bisiesto:=((x mod 4=0) And (x mod 100<>0)) Or (x mod
400=0);
end;
- Grbalo como Unit063.pas Project063.dpr y ejectalo.
73
Delphi 7
Ferm Vil
- Apartado implementation:
function TForm1.Primo(num:integer):integer;
var
i,resto:integer;
solucion:integer;
begin
solucion:=0;
for i:=2 to num-1 do
begin
resto:=num mod i;
if (resto=0) And (num<>2) then
begin
solucion:=1;
break;
end;
end;
Primo:=solucion;//Primo=0 ser primo
end;
- Grbalo como Unit064.pas Project064.dpr y ejectalo.
74
Delphi 7
Ferm Vil
i,resto:integer;
solucion:integer;
begin
solucion:=0;
for i:=2 to num-1 do
begin
resto:=num mod i;
if (resto=0) And (num<>2) then
begin
solucion:=1;
break;
end;
end;
Primo:=solucion;//Primo=0 ser primo
end;
procedure TForm1.Primos_Menores(x:integer);
var
i:integer;
begin
for i:=1 to x-1 do
if Primo(i)=0 then
sa:=sa+IntToStr(i)+' , ';
end;
- Grbalo como Unit065.pas Project065.dpr y ejectalo.
75
Delphi 7
Ferm Vil
function Primo(num:integer):integer;
procedure
primeros_primos(p:integer);
- Apartado implementation:
function TForm1.Primo(num:integer):integer;
var
i,resto:integer;
solucion:integer;
begin
solucion:=0;
for i:=2 to num-1 do
begin
resto:=num mod i;
if (resto=0) And (num<>2) then
begin
solucion:=1;
break;
end;
end;
Primo:=solucion;//Primo=0 ser primo
end;
procedure TForm1.primeros_primos(p:integer);
var
contador,numero:integer;
begin
contador:=0;
numero:=1;
repeat
if Primo(numero)=0 then
begin
sa:=sa+IntToStr(numero)+' , ';
contador:=contador+1;
end;
numero:=numero+1;
until contador=p;
end;
- Grbalo como Unit066.pas Project066.dpr y ejectalo.
u) Programa que lee una frase y cuenta el nmero de veces que aparece cada letra en la
frase
- Men File New - Application
76
Delphi 7
Ferm Vil
Ejercicios
a a / MCD(a, b)
=
b b / MCD(a, b)
77
Delphi 7
Ferm Vil
78
3) Haz un programa de nombre Ejer27.pas ProjectEjer27.dpr, que sirva para sumar o restar
dos fracciones y despus simplifique el resultado.
Observa:
a c a (mcm(b, d ) / d ) + c(mcm(b, d ) / d )
+ =
b d
mcm(b, d )
5) Haz un programa de nombre Ejer29.pas ProjectEjer29.dpr, que sirva para calcular el rea
de un tringulo en el espacio, utilizando la funcin del ejercicio anterior.
Recuerda: A=(a1,a2,a3), B=(b1,b2,b3), C=(c1,c2,c3)
AB=(b1-a1,b2-a2,b3-a3), AC=(c1-a1,c2-a2,c3-a3)
rea del triangulo ABC = del mdulo del producto vectorial de AB y AC (consulta el
ProjectEjer21)
Comprubalo para el siguiente caso:
Delphi 7
Ferm Vil
m
m!
=
n n!(m n)!
Recuerda:
0
0
1 1
0 1
2 2 2
0 1 2
79