Está en la página 1de 25

Delphi 7

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

c) Adaptacin de la funcin potencia para nmeros reales.


Ante todo necesitamos investigar las funciones predefinidas: exp() y ln()
- Escribe el siguiente programa tipo cnsola:
program Project047;
{$APPTYPE CONSOLE}
uses
SysUtils;
begin
writeln('e elevado a 1 es ',exp(1));
writeln('e elevado a 3 es ',exp(3));
writeln('e elevado a 1/2 es ',exp(0.5));
writeln('ln(1) es ',ln(1));
writeln('ln(2.71) es ',ln(2.71));
writeln('3 elevado a 5 es ',exp(5*ln(3)));
readln;
end.
- Grbalo como Project047.dpr y ejectalo.
Ahora s, podremos programar una function para calcular la potencia de nmeros
reales.
- Escribe el siguiente programa MS/DOS:
program Project048;
{$APPTYPE CONSOLE}
uses
SysUtils;
function potenciaReal(a,b:real):real;
begin
potenciaReal:=exp(b*ln(a));
end;
var
num1,num2:real;
begin
write('Escribe la base de la potencia: ');
readln(num1);

57

Delphi 7

Ferm Vil

write('Escribe el exponente: ');


readln(num2);
writeln(num1:15:5,' elevado a ',num2:15:5,' es
',potenciaReal(num1,num2):15:5);
readln;
end.
- Grbalo como Project048.dpr y ejectalo varias veces para comprobar que funciona.

d) Function y Procedure en una aplicacin windows


- Men File New - Application
- Inserta en el formulario, un button y un Memo (paleta Standard), de forma que tengas
aproximadamente:

- Clic-clic en el [Button1] y escribe el siguiente procedimiento de evento:


procedure TForm1.Button1Click(Sender: TObject);
var
num1,num2,res:real;
salida:string;
opc:string[1];
begin
opc:='S';salida:='';
while (opc='S') Or (opc='s') do
begin
num1:=StrToFloat(InputBox('Clculo de Potencias','Introduce el valor de la base de la
potencia',''));
num2:=StrToFloat(InputBox('Clculo de Potencias','Introduce el valor del exponente',''));
res:=potenciaReal(num1,num2);
salida:=salida+FloatToStr(num1)+' elevado a '+FloatToStr(num2)+' es '+
FloatToStr(res)+#13+#10;
opc:=InputBox('Repetir','Quieres calcular otra potencia (S/N)?','');

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

e) Function raz cbica


- 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 el siguiente procedimiento de evento:
procedure TForm1.Button1Click(Sender: TObject);
var
num:real;
begin
num:=StrToFloat(InputBox('Raz Cbica','Escribe un nmero',''));
Memo1.Text:='La Raz Cbica de '+FloatToStr(num)+' es
'+FloatToStr(RaizCubica(num));
end;
- Escribe en el Mdulo del Formulario:
Apartado public:
function
RaizCubica(a:real):real;
Apartado implementation:
function TForm1.RaizCubica(a:real):real;

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.

h) Parmetro por valor


- Men File New - Application
- Inserta en el formulario un button y un memo .
- Escribe el siguiente procedimiento de evento:
procedure TForm1.Button1Click(Sender: TObject);
var
dato:integer;
begin
salida:='';
dato:=2;
salida:=salida+'Inicialmente el dato es = '+IntToStr(dato)+#13+#10;
modifica(dato);
salida:=salida+'Despus de pasar por el procedure, dato =
'+IntToStr(dato)+#13+#10;
Memo1.Text:=salida;
end;
- Escribe en el apartado public del mdulo:
salida:string;
procedure
modifica(vari:integer);
- Escribe en el apartado implementation del mdulo:
procedure TForm1.modifica(vari:integer);
begin
vari:=3;
salida:=salida+'En el interior del procedure, el dato es =
'+IntToStr(vari)+#13+#10;
end;
- Grbalo como Unit053.pas Project053.dpr y prubalo.
- Si todo funciona correctamente aparece:

62

Delphi 7

Ferm Vil

63

- Estudio del Project053:


Observa que la variable salida la utilizamos en los dos procedures, por esta razn es
necesario declararla en el apartado public del mdulo. De esta forma (variable pblica),
dicha variable ser reconocida por cualquier procedimiento y/o funcin del mismo
mdulo.
El procedimiento modifica, toma una variable de tipo entero, le asigna el valor 3 y la
escribe. Lgicamente este procedimiento siempre har lo mismo escribir un 3.
Al hacer clic en el [Button1] se ejecuta en primer lugar el procedure Button1Click y
ste asigna a dato el nmero 2.
Seguidamente escribimos el valor de este dato, o sea 2.
Llamamos al procedimiento modifica, por lo tanto escribir 3.
Volvemos al procedure Button1Click y escribimos de nuevo el valor de dato: debera
escribir 3, pero contra toda lgica escribe 2.
La razn es la siguiente:
Las modificaciones que hagamos a la variable dato dentro del procedimiento
modifica, slo son vlidas mientras estemos dentro del procedimiento. Esto se llama pasar un
parmetro por valor. Si realmente queremos modificar el parmetro hemos de aadir la
palabra var delante del parmetro, como veremos en el siguiente programa.

i) Parmetro por referencia


- Continuando con el programa anterior, en la lnea: procedure modifica(vari: integer) del
apartado public, aade las letras var delante del nombre de la variable, de forma que nos quede:
procedure modifica(var
vari:integer);
- Haz lo mismo en el apartado implementation, es decir, que tendremos el procedure:
procedure TForm1.modifica(var vari:integer);
begin
vari:=3;
salida:=salida+'En el interior del procedure, el dato es =
'+IntToStr(vari)+#13+#10;
end;

Delphi 7

Ferm Vil

64

- Graba el mdulo con el nombre Unit054.pas y el proyecto como Project054.dpr y ejectalo.


Ahora s que en la tercera lnea, el programa nos escribe un 3 y no un 2.
Decimos que pasamos un parmetro por referencia. El nombre referencia alude a que
no se pasa realmente al procedimiento o funcin el valor de la variable, sino la direccin de
memoria en la que se encuentra, direccin de memoria que se denomina puntero.

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

k) Funcin recursiva que calcula el producto de dos enteros positivos


- Men File New - Application
- Inserta en el formulario, un button y un memo, con la propiedad ScrollBars = ssVertical.
- Escribe:
procedure TForm1.Button1Click(Sender: TObject);
var
num1,num2:integer;
opc:string[1];
salida:string;
begin
salida:='Producto de dos enteros positivos'+#13+#10;
salida:=salida+'utilizando una funcin RECURSIVA'+#13+#10;
salida:=salida+'=================================='+#13+#10;
opc:='S';
while (opc='S') Or (opc='s') do
begin
num1:=StrToInt(InputBox('Producto Recursivo','Escribe un nmero entero
positivo',''));
num2:=StrToInt(InputBox('Producto Recursivo','Escribe otro nmero entero
positivo',''));
salida:=salida+'El producto recursivo de '+IntToStr(num1)+' y '+IntToStr(num2)+' es
'+IntToStr(prod(num1,num2))+#13+#10;
opc:=InputBox('Otro Producto','Quieres calcularotro producto recursivo (S/N)?','');
end;
Memo1.Text:=salida;
end;
- Escribe en el apartado public del Unit:
function prod(a,b:integer):integer;
- Escribe en el apartado implementation:
function
TForm1.prod(a,b:integer):integer;
begin
if b=1 then
prod:=a
else
prod:=a+prod(a,b-1);
end;

Delphi 7

Ferm Vil

67

- Grbalo como Unit057.pas Project057.dpr y ejectalo

l) Funcin que calcula una potencia de forma recursiva


- Men File New - Application
- Inserta en el formulario, un button y un memo, con la propiedad ScrollBars = ssVertical.
- Escribe:
procedure TForm1.Button1Click(Sender: TObject);
var
num1,num2:integer;
opc:string[1];
salida:string;
begin
salida:='Potencia RECURSIVA'+#13+#10;
salida:=salida+'====================='+#13+#10;
opc:='S';
while (opc='S') Or (opc='s') do
begin
num1:=StrToInt(InputBox('Potencia Recursiva','Escribe la base de la potencia',''));
num2:=StrToInt(InputBox('Potencia Recursiva','Escribe el exponente',''));
salida:=salida+IntToStr(num1)+' elevado a '+IntToStr(num2)+' es
'+IntToStr(pot(num1,num2))+#13+#10;
opc:=InputBox('Otra Potencia','Quieres calcular otra potencia recursiva (S/N)?','');
end;
Memo1.Text:=salida;
end;
- Escribe en el apartado public del Unit:
function
pot(a,b:integer):integer;
- Escribe en el apartado implementation:
function TForm1.pot(a,b:integer):integer;
begin
if b=1 then
pot:=a
else
pot:=a*pot(a,b-1);
end;
- Grbalo como Unit058.pas Project058.dpr y ejectalo.

Delphi 7

Ferm Vil

68

m) Procedure que dibuja cuadrados


- Men File New - Application
- Inserta en el formulario, un button y un memo, con la propiedad ScrollBars = ssVertical.
- Escribe:
procedure TForm1.Button1Click(Sender: TObject);
var
j,num,n:integer;
begin
sa:='';
num:=StrToInt(InputBox('Cuantos cuadrados quieres
dibujar','',''));
for j:=1 to num do
begin
n:=StrToInt(InputBox('Longitud del lado=','',''));
Cuadrado(n);
sa:=sa+#13#10+#13#10;
end;
Memo1.Text:=sa;
end;
- Escribe en el apartado public del Unit:
sa:string;
procedure
Cuadrado(n:integer);
- Escribe en el apartado implementation del mdulo:
procedure TForm1.Cuadrado(n:integer);
var
i,j:integer;
begin
for i:=1 to n do
begin
for j:=1 to n do
sa:=sa+'o';
sa:=sa+#13#10;
end;
end;
- Grbalo como Unit059.pas Project059.dpr y ejectalo

Delphi 7

Ferm Vil

69

Observa que la variable sa es pblica, ya que la utilizamos en los dos procedures:


Button1Click y Cuadrado, por esta razn hemos de declararla en el apartado public del unit.

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:

procedure TForm1.Button1Click(Sender: TObject);


var
num1,num2,i:integer;
begin
num1:=StrToInt(InputBox('Numero menor: ','Escribe el primer nmero
entero',''));
num2:=StrToInt(InputBox('Entero mayor: ','Escribe el segundo nmero
entero',''));
sa:='';
for i:=num1 to num2 do
if (i mod 2=0) then
begin
sa:=sa+IntToStr(i)+' , ';
Multiplo3(i);
end;
Memo1.Text:=sa;
end;
- En el rea public del unit, escribe:
sa:string;
procedure Multiplo3(x:integer);
- En el rea implementation del unit escribe:
procedure TForm1.Multiplo3(x:integer);
begin
if x mod 3 =0 then
sa:=sa+'(Multiplo de 3),';
end;

Delphi 7

Ferm Vil

70

- Guarda el programa como Unit060.pas Project060.dpr y ejectalo.

o) Funcin que calcula el mximo comn divisor de dos nmeros


- Men File New - Application
- Inserta en el formulario, un button y un memo, con la propiedad ScrollBars = ssVertical.
- Escribe:
procedure TForm1.Button1Click(Sender:
TObject);
var
a,b,sol:integer;
begin
a:=StrToInt(InputBox('Escribe un numero','',''));
b:=StrToInt(InputBox('Escribe otro numero','',''));
sol:=MCD(a,b);
Memo1.Text:='El MCD es '+IntToStr(sol);
end;
- En el rea public del mdulo, escribe:
function
MCD(x,y:integer):integer;
- En el rea implementation escribe:
function TForm1.MCD(x,y:integer):integer;
var
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;

Delphi 7

Ferm Vil

- Grbalo como Unit061.pas Project061.dpr y prubalo para los casos:


MCD( 7 , 3 ) = 1
MCD( 6 , 10 ) = 2
MCD( 12 , 4 ) = 4
MCD( 42 , 70 ) = 14
- Para nuestra function MCD utilizamos el llamado algoritmo de Euclides. Repasemos este
algoritmo, calculando el MCD de 36 y 48:
1) Necesitamos saber el nmero mayor (por esta razn en nuestro programa utilizamos la
variable auxiliar aux
2) Divido el mayor entre el menor: 48/36 = 1 y resto 12
3) Divido el divisor de antes entre el resto (de antes): 36/12 = 3 y resto 0
4) Continuamos dividiendo divisor/resto, hasta que la divisin sea exacta.
5) El MCD es el ltimo resto distinto de cero, en nuestro ejemplo, 12

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.

q) Funcin que determina si un ao es bisiesto o no


- Men File New - Application
- Inserta un button y un memo
- Cdigo:
procedure TForm1.Button1Click(Sender: TObject);
var
ano:integer;

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.

r) Funcin que determina si un nmero es primo.


- Men File New - Application
- Inserta un button y un memo
- Cdigo:
procedure TForm1.Button1Click(Sender: TObject);
var
num:integer;
begin
num:=StrToInt(InputBox('Nmero','',''));
if Primo(num)=1 then
Memo1.Text:='El numero '+IntToStr(num)+' no es
primo'
else
Memo1.Text:='El numero '+IntToStr(num)+' es primo';
end;
- Apartado public:
function
Primo(num:integer):integer;

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.

s) Programa que determina los nmeros primos menores de x (Criba de Eratstenes)


- Men File New - Application
- Inserta un button y un memo
- Cdigo:
procedure TForm1.Button1Click(Sender: TObject);
var
num:integer;
begin
num:=StrToInt(InputBox('Nmeros primos hasta','',''));
Primos_Menores(num);
Memo1.Text:=sa;
end;
- Apartado public:
sa:string;
procedure
Primos_Menores(x:integer);
function Primo(num:integer):integer;
- Apartado implementation:
function TForm1.Primo(num:integer):integer;
var

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.

t) Programa que escribe los primeros p nmeros primos (Criba de Eratstenes)


- Men File New - Application
- Inserta un button y un memo
- Cdigo:
procedure TForm1.Button1Click(Sender: TObject);
var
num:integer;
begin
num:=StrToInt(InputBox('Cuntos primos
quieres','',''));
primeros_primos(num);
Memo1.Text:=sa;
end;
- Apartado public:
sa:string;

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

- Inserta en el formulario un button y un memo


- Cdigo:
procedure TForm1.Button1Click(Sender: TObject);
type
cadena=string[255];
letras='A'..'Z';
lista=Array[letras] of integer;
var
frase:cadena;
sa:string;
cuenta:lista;
indice:letras;
i:integer;
begin
for indice:='A' to 'Z' do
cuenta[indice]:=0;
frase:=InputBox('Escribe una frase','','');
for indice:='A' to 'Z' do
for i:=1 to length(frase) do
if indice=Upcase(frase[i]) then
cuenta[indice]:=cuenta[indice]+1;
sa:='';
for indice:='A'to'Z' do
sa:=sa+indice+#9+IntToStr(cuenta[indice])+#13#10;
Memo1.Text:=sa;
end;
- Grbalo como Unit067.pas Project067.dpr y ejectalo
- Estudio del Project067:
UpCase(carcter): es una funcin que escribe en mayscula el carcter
#9: determina una tabulacin: el cdigo ASCII nmero 9 corresponde al tabulador

Ejercicios

1) Haz un programa de nombre Ejer25.pas ProjectEjer25.dpr que calcule el mnimo comn


mltiplo de dos nmeros utilizando la funcin MCD del Project061 y sabiendo que mcm(x,y) =
x*y / MCD(x,y)
2) Haz un programa de nombre Ejer26.pas ProjectEjer26.dpr que sirva para simplificar una
fraccin numrica, debes utilizar la funcin MCD del ejercicio anterior.
Observa:

a a / MCD(a, b)
=
b b / MCD(a, b)

La salida debera ser de la forma:

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 )

La salida debera ser:

4) Haz un programa de nombre Ejer28.pas ProjectEjer28.dpr, que sirva para calcular el


mdulo de un vector en el espacio, utilizando una funcin.

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:

6) Haz un programa de nombre Ejer30.pas ProjectEjer30.dpr, que construya el tringulo de


Tartaglia o Pascal de la siguiente forma:
1.- Crea una funcin que calcule el factorial de un nmero (Project056).
2.- Crea otra funcin que permita calcular un nmero combinatorio.

Delphi 7

Ferm Vil

m
m!
=
n n!(m n)!

Recuerda:

3.- El tringulo de Tartaglia no es ms que los resultados de los nmeros combinatorios:

0

0
1 1

0 1
2 2 2

0 1 2

4.- El programa nos ha de preguntar de entrada el nmero de filas del tringulo.

7) Haz un programa de nombre Ejer31.pas ProjectEjer31.dpr que calcule los 50 primeros


trminos de la sucesin de trmino general: (3n + 1) / (2n 1)

79

También podría gustarte