Beruflich Dokumente
Kultur Dokumente
9
PROCEDIMIENTOS – MANEJO DE CADENAS
PROCEDIMIENTOS
Una declaración de procedimiento tiene la forma:
Procedure IdProc(ListadeParamentros); directivas;
//Declaraciones locales
begin
instrucciones
end;
(X, Y:Real)
(var S:String; X:Integer)
(const P; I: Integer)
La lista de parámetros indica el número, orden y tipo de parámetros que deben ser pasados a la
rutina cuando esta es llamada. Si una rutina no toma parámetros omita los paréntesis en la
declaración:
Procedure Menu;
begin
…..
end;
Los Archivos e instancias de tipos estructurados que contienen archivos pueden ser pasados
sólo como parámetros variable.
Parámetros Array
Al declarar rutinas que tomen parámetros Array no podemos incluir especificadores de
tipo de índice en las declaraciones de parámetros. Así, la declaración:
1
causa un error de compilación, pero:
type
TDigitos=array[1..10] of Integer;
Procedure Ordenar(A:TDigitos);
es correcto.
La directiva Forward
La directiva Forward reemplaza el bloque, incluyendo variables locales e instrucciones
en una declaración de función o procedimiento. Por ejemplo:
function Calcular (X, Y: Integer): Real; forward;
declara una función llamada Calcular. Algunas líneas debajo de la declaración forward la
rutina debe ser redeclarada incluyendo la definición y el bloque. La declaración para
calcular se asemejaría a:
function Calcular;
……{ declaraciones }
begin
……{bloque de sentencias}
end;
Definamos el tipo TVector como un array unidimensional que almacenara los digitos.
Type
TVector=array[1..4] of byte;
3
En la sección Implementation digite el código de los procedimientos Descomponer,
Cifrar y Descifrar.
implementation
{$R *.DFM}
procedure Descomponer(n:integer;var A:TVector);
var i:byte;
begin
i:=5;
while n>0 do
begin
i:=i-1;
D[i]:=n mod 10;
n:=n div 10
end
end;
procedure Cifrar(var D:TVector);
var j,aux:byte;
S:String;
begin
for j:=1 to 4 do
D[j]:=(D[j]+7) mod 10;
for j:=1 to 2 do
begin
aux:=D[j];
D[j]:=D[j+2];
D[j+2]:=aux
end;
for j:=1 to 4 do
S:=S+IntToStr(D[j]);
Form1.Label2.Caption:='Número Cifrado '+S
end;
procedure Descifrar(var A:TVector);
var j,aux:byte;
S:String;
begin
for j:=1 to 2 do
begin
aux:=D[j];
D[j]:=D[j+2];
D[j+2]:=aux
end;
for j:=1 to 4 do
D[j]:=(D[j]+3) mod 10;
S:='';
for j:=1 to 4 do
S:=S+IntToStr(D[j]);
4
Form1.Label2.Caption:='Número Descifrado '+S
end;
Cifrando el número:
Descifrando el Número:
6
2. Realice otro procedimiento de manera que no se visualicen las letras mas de una
vez: Ejemplo: “PELELE” deberá escribirse “ELP”.
Lleve a cabo estos pasos:
1. Crear una aplicación con formulario:
2. En el formulario coloque los siguientes componentes: 3 etiquetas, 3 Cuadros de
Edición y 2 botones de figura.
3. Modifique las propiedades de los componentes:
implementation
{$R *.DFM}
procedure Ordenar(var v1:String;n:byte);
7
var i,j:byte;
aux:char;
begin
for i:=1 to (n-1) do
for j:=i+1 to n do
if (v1[i] > v1[j]) then
begin
aux:=v1[i];
v1[i]:=v1[j];
v1[j]:= aux
end
end;
procedure SinRepetir(v1:String;n:byte);
var i:byte;
sRep:string;
begin
for i:=1 to n-1 do
if (v1[i]=v1[i+1])then
v1[i]:=' ';
sRep:='';
for i:=1 to n do
if v1[i]<>' ' then
sRep:= sRep + v1[i];
Form1.Edit3.text:=sRep
end;
8
procedure TForm1.BitBtn1Click(Sender: TObject);
var
S:String;
n:byte;
begin
S:=Edit1.Text;
n:=Length(Trim(S));
Ordenar(S,n);
SinRepetir(S,n);
Edit2.Text:=S
end;
Programa ejecutándose:
3) Movimiento de proyectiles
Si un proyectil se dispara a una velocidad V(m/seg) con un ángulo de inclinación de Φ
(radianes), su posición en el tiempo t(seg) esta dada por:
const g=9.8;
implementation
{$R *.DFM}
10
procedure Posicion(v,ang,t:real;var x,y:real);
begin
ang:=ang*pi/180;
x:=v*cos(ang)*t;
y:=v*sin(ang)*t-g*sqr(t)/2
end;
Haga doble clic en el control BitBtn1. Aquí se tomaran los valores para V, Theta y t que
serán los parámetros de entrada que recibirá el procedimiento Posición. Este generará
valores para los parámetros de salida que serán mostrados en los controles Edit4 y
Edit5. En el controlador de evento que se abre en el Editor de Código, digite el siguiente
segmento:
11
4) Criba de Eratóstenes
Desarrollemos una aplicación que muestre una lista de números primos menores que un
número dado. El procedimiento es parecido a como Eratóstenes realizo su celebre criba.
12
begin
// maximiza el tamaño del formulario
Form1.WindowState:=WsMaximized;
end;
Asociemos otro procedimiento al formulario accionado por el evento OnResize. Cuando
el usuario modifique el tamaño del formulario, este procedimiento debe ajustar el tamaño
de los controles Edit1 y StringGrid1 al tamaño del formulario.
procedure TForm1.FormResize(Sender: TObject);
begin
Edit1.Width:=Form1.Width - 12;
StringGrid1.Height:=Form1.Height - 56;
StringGrid1.Width:=Form1.Width - 12;
end;
Asociemos un procedimiento al control Edit1 accionado por el evento OnKeyPress. Este
procedimiento debe impedir el ingreso de caracteres no numéricos en el control Edit1 y,
cuando el usuario pulse Enter, debe mostrar los números primos en el control
StringGrid1.
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
var n, k : integer;
Primo : vector;
begin
if key=#13 then
try
//Hace que el puntero del mouse adopte la forma de un reloj de arena.
StringGrid1.Cursor:=-11;
n:=StrToInt(Edit1.Text);
if n > 50000 then
Raise ERangeError.Create('Ingrese un número menor o igual que 50000.');
//Llama al procedimiento LimpiarRejilla.
LimpiarRejilla(StringGrid1);
//Llama al procedimiento Criba.
criba(primo,k, n);
//Llama al procedimiento VerPrimos.
VerPrimos(StringGrid1,primo,k );
//Hace que el puntero del mouse adopte la forma original.
StringGrid1.Cursor:=0;
//En caso de que se produzca una excepción se entra a este bloque.
except
on x : exception do ShowMessage('" ' + x.Message+'" ');
end;
//Sólo permite el ingreso de dígitos en el control Edit1.
if not(key in['0'..'9']) then key:=#0
end;
13
Coloquemos el código de los procedimientos LimpiarRejilla, Criba y VerPrimos en la
sección Implementation.
implementation
{$R *.DFM}
type vector=array[0..50000] of integer;
procedure LimpiarRejilla(Rejilla : TStringGrid);
var i, j : integer;
begin
{Limpia las celdas de la rejilla}
for i:=1 to Rejilla.RowCount do
for j:=1 to Rejilla.ColCount do
Rejilla.Cells[j,i]:='';
end;
//Genera los números primos y los almacena en el vector Primo.
procedure criba(var primo : vector; var k : integer; n : integer);
var i, j : integer;
begin
k:=-1;
for j:=2 to n do
for i:=2 to j do
begin
if i > Sqrt(j) then
begin
k:=k + 1;
Primo[k]:=j;
break
end;
if j mod i=0 then break
end;
end;
14
end;
end;
Programa ejecutándose:
16
Procedimiento accionado por el evento OnResize. Este procedimiento ajusta el tamaño
de los controles si el formulario es redimensionado.
procedure TForm1.FormResize(Sender: TObject);
begin
Edit2.Width:=Form1.Width - 125;
StringGrid1.Height:=Form1.Height - 55;
StringGrid1.Width:=Form1.Width - 11;
end;
19
6) Cuadro Latino
Un cuadro latino es una matriz cuadrada en que su primera fila contiene los N primeros
números naturales y cada una de las siguientes N – 1 filas contiene la rotación de la fila
anterior un lugar a la derecha. Ejemplo:
1 2 3 4 5
5 1 2 3 4
4 5 1 2 3
3 4 5 1 2 Cuadro latino de orden 5
2 3 4 5 1
20
Desarrollar una aplicación con formulario, añadiendo un control Edit y un control
StringGrid en el formulario. Modificar las propiedades de los controles:
implementation
{$R *.DFM}
type matrix=array[1..100,1..100] of integer;
7) Cuadro Mágico
Un cuadro Mágico es una matriz cuadrada de orden N que contiene números enteros
desde 1 hasta N2. La suma de los números que figuran en cada fila, columna y
diagonales son iguales.
Pasos para generar un cuadro mágico:
1. Sitúe el número 1 en la casilla central de la primera fila.
2. Cada número que sigue debe colocarse en la casilla correspondiente a la fila
anterior y columna posterior.
3. Si el número generado cae en una casilla ocupada, no aplique la regla anterior,
sino que debe colocarlo en casilla de la fila posterior e igual columna.
4. Se considera que la fila anterior a la primera es la última y la columna posterior a
la última es la primera.
Crear una nueva aplicación con formulario, en el que se ha colocado un control Edit y un
control StringGrid. Las propiedades asignadas a los controles son las siguientes:
24
Control Propiedad Valor
Form1 Caption Cuadro Mágico
Height 355
Width 498
Edit1 Hint Ingrese un número impar y pulse Enter
Height 21
Left 2
ShowHint True
Text ‘ ‘
Width 487
StringGrid1 ColCount 50
FixedCols 1
FixedRow 1
s 2
Left 50
RowCount 487
Width
implementation
{$R *.DFM}
Programa en ejecución:
8) Fecha a Texto
Formato 1 Formato2
25/7/65 25 de Julio de 1965
2/10/92 2 de Octubre de 1992
28
Asociemos un procedimiento al control bitBtn1 accionado por el evento OnClick. Este
procedimiento tomara la fecha y almacenara en las variables cadena d, m, a los
números de día, mes y año. Luego usando un selector la convertirá a texto.
Agregue otra ficha y realice el mismo diseño. En la segunda ficha utilicemos funciones
para el manejo de cadenas que nos ayuden a reducir la cantidad de líneas de código.
Copy: Retorna una subcadena de una cadena que tiene Num Caracteres y empieza
en S[ini].
Sintaxis: copy (S, Ini, Num);
UpperCase: Función que retorna una copia de la cadena S, con el mismo texto pero
con todos los caracteres convertidos a mayúsculas.
Sintaxis: UpperCase(S);
LowerCase: Función que retorna una copia de la cadena S, con el mismo texto
pero con todos los caracteres convertidos a minúsculas.
Sintaxis: LowerCase(S);
Pos: Función entera que busca la subcadena, SubCad, en una cadena S y retorna un
valor entero que es el índice del primer carácter de SubCad en S. Pos es sensible a las
mayúsculas. Si SubCad no es encontrada Pos retorna cero.
Sintaxis Pos(SubCad, S);
9) Ordenando Nombres
Desarrollar una aplicación que ordene los elementos de una lista de nombres en una
segunda lista:
a) Basado en las longitudes de las cadenas. Por ejemplo: Silvia vendrá antes que
Lisseth.
b) De forma alfabética (ascendente): Por ejemplo: Lisseth vendrá antes que Silvia.
Siga estos pasos:
1. Crear una nueva aplicación con formulario
2. Colocar los siguientes componentes: 3 etiquetas, 1 Cuadro de Edición, 2
Cuadros de Lista, 2 Botones de figura, 1 Caja Agrupadora y 2 botones de Radio.
3. Modificar las propiedades de los componentes:
33
aux:string;
begin
Form1.ListBox2.Clear;
for i:=0 to Form1.ListBox1.Items.Count-1 do
Form1.ListBox2.Items.Add(Form1.ListBox1.Items.Strings[i]);
for i:=0 to Form1.ListBox2.Items.Count-2 do
for j:= i+1 to Form1.ListBox2.Items.Count-1 do
if Form1.ListBox2.Items.Strings[i]>Form1.ListBox1.Items.Strings[j] then
begin
aux:=Form1.ListBox2.Items.Strings[i];
Form1.ListBox2.Items.Strings[i]:=Form1.ListBox2.Items.Strings[j];
Form1.ListBox2.Items.Strings[j]:=aux
end
end;
Asociemos un procedimiento al control Edit1 para el evento OnKeyPress. En esta parte
se añaden elementos al Cuadro de Lista ListBox1.
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if key=#13 then
begin
ListBox1.Items.Add(Edit1.text);
Edit1.SetFocus;
Edit1.SelStart:=0;
Edit1.SelLength:=Length(Edit1.Text)
end
end;
35