Sie sind auf Seite 1von 35

Capt.

9
PROCEDIMIENTOS – MANEJO DE CADENAS
PROCEDIMIENTOS
Una declaración de procedimiento tiene la forma:
Procedure IdProc(ListadeParamentros); directivas;
//Declaraciones locales
begin
instrucciones
end;

La ListadeParametros es una secuencia de declaraciones de parámetros separados por


puntos y coma y encerrados entre paréntesis. Esta define un conjunto de variables
locales, de allí los nombres de los parámetros no pueden ser redeclarados en la sección
de declaraciones locales.
Cualquier declaración de parámetros puede estar precedida por una de las palabras reservadas:
var, const y out.

(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;

Cada parámetro se clasifica en valor, variable, constante o de salida. El parámetro valor es el


predeterminado¸ las palabras var, const y out indican parámetros constantes, variables y de
salida respectivamente.

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:

Procedure Ordenar(A: array[1..10] of integer); //error de sintaxis

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;

aquí comúnmente no es necesario repetir las lista de parámetros o el tipo de retorno.

1) Aplicación Cifrar Datos


Una empresa desea transmitir datos mediante el teléfono; pero están preocupados que
estos pudieran ser intervenidos. Todos sus datos se transmiten como enteros de cuatro
dígitos. Le han solicitado que diseñe una aplicación que cifre sus datos, de tal forma que
puedan ser transmitidos con mayor seguridad. El programa leerá un entero de cuatro
dígitos y cifrarlo como sigue: reemplazar cada digito por (la suma del dígito mas 7)
modulo 10. Luego, intercambiar el primer digito con el tercero y el segundo con el cuarto.
A continuación mostrar el entero cifrado. Edite un subprograma por separado, que
introduzca un entero de cuatro dígitos cifrado, y que lo descifre para formar el numero
original.
Siga estos pasos:
1. Crear una nueva aplicación con formulario
2. En el formulario coloque: 1 etiqueta, 1 cuadro de Edición, 1 control BitBtn, una
Caja de Agrupadora y 2 Radio Botones.
3. Modifique las propiedades de los componentes:
2
Control Propiedad Valor
Form1 Caption Transmisión de Datos
Position poScreenCenter
Label1 Caption Ingrese número
Label2 Caption ‘‘
Edit1 Text ‘‘
MaxLength 4
GroupBox1 Caption Alternativas
RadioButton1 Caption Cifrar Número
Checked True
RadioButton2 Caption Descifrar Número
BitBtn1 Kind bkOK
Caption &Procesar
BitBtn2 Kind bkClose
Caption &Cerrar

Aspecto de la interfaz de usuario:

Definamos el tipo TVector como un array unidimensional que almacenara los digitos.
Type
TVector=array[1..4] of byte;

Declaremos dos variables globales: n (entera) y D (array) en la sección:


Var
n: integer;
D: TVector;

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;

Asociemos un procedimiento al control Edit1 para el evento OnKeyPress. Aquí


permitiremos el acceso sólo de dígitos:

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);


begin
if key=#13 then BitBtn2.SetFocus;
if not (key in ['0'..'9',#8]) then key:=#0
end;

El control BitBtn2 solo se habilitara al ingresar 4 dígitos:

procedure TForm1.Edit1Change(Sender: TObject);


begin
if length(Edit1.Text)=4 Then
BitBtn2.Enabled:= true
else
BitBtn2.Enabled:= false;
Label2.Caption:='';
end;

Al seleccionar alguno de los Radio Botones seleccionaremos y enviaremos el enfoque al


Cuadro de edición:

procedure TForm1.RadioButton1Click(Sender: TObject);


var n:byte;
begin
n:=Length(Edit1.Text);
Edit1.SetFocus;
Edit1.SelText
end;

procedure TForm1.RadioButton2Click(Sender: TObject);


var n:byte;
begin
n:=Length(Edit1.Text);
Edit1.SetFocus;
Edit1.SelText
end;

Asociemos un procedimiento al control BitBtn2 accionado por el evento OnClick. Este


procedimiento llamará a las rutinas Cifrar o Descifrar de acuerdo a la elección del
usuario:

procedure TForm1.BitBtn2Click(Sender: TObject);


begin
5
n:=StrToInt(Edit1.text);
Descomponer(n,D);
If RadioButton1.Checked Then
Cifrar(D)
Else
Descifrar(D)
end;

Cifrando el número:

Descifrando el Número:

2) Ordenar por letras


Desarrollar una aplicación que:
1. Utilice un procedimiento para ordenar alfabéticamente todas las letras de una
palabra. En caso que se repita una letra, se debe mostrar tantas veces como
ocurra. Por ejemplo, “PELELE” deberá visualizarse como “EEELLP”.

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:

Control Propiedad Valor


Form1 Caption Ordenar Letras
Position poScreenCenter
Label1 Caption Palabra:
Label2 Caption Ordenada por Letras
Label3 Caption Sin Repetición
Edit1 Text ‘‘
CharCase ecUpperCase
Edit2 Text ‘‘
Edit3 Text ‘‘
BitBtn1 Kind bkCustom
Caption &Salir
Enabled False
BitBtn2 Kind bkClose
Caption &Salir

Aspecto de la interfaz de usuario:

En la sección Implementation digitar el código de los procedimientos Ordenar y


SinRepetir.

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;

Asociemos un procedimiento al control Edit1 para el evento OnKeyPress. Aquí


permitiremos el acceso solo de letras.

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);


begin
if Key=#13 then BitBtn1.SetFocus;
if not (UPCASE(key) in['A'..'Z',#8]) then key:=#0
end;

El control BitBtn1 sólo se habilitará si se ingresa una palabra:

procedure TForm1.Edit1Change(Sender: TObject);


begin
if Length(Edit1.Text)>0 then
BitBtn1.Enabled:=true
else
BitBtn1.Enabled:=false;
end;

Asociemos un procedimiento al control BtiBtn1 accionado por el evento OnClick. Este


procedimiento llamará a las rutinas Ordena y SinRepetir.

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:

x = V cos(Φ) t ; y = sen(Φ) t – (g t2)/2

donde: 0 < Φ < π/2; g = 9.8 m/seg2

Diseñe una aplicación que lea Φ, V y t y muestre las coordenadas x e y


correspondientes a la posición.

Siga estos pasos

1. Crear una aplicación con formulario.


2. En el formulario colocar: 5 etiquetas, 5 Cuadros de edición, 2 Controles BtiBtn y 2
Cajas Agrupadoras.
3. Modificar las propiedades de los componentes:

Control Propiedad Valor


Form1 Caption Movimiento de Proyectiles
9
Label1 Caption Velocidad:
Label2 Caption Angulo (Sex)
Label3 Caption Tiempo
Label4 Caption x=
Label4 Cap`tion y=
Edit1 Text ‘‘
Edit2 Text ‘‘
Edit3 Text ‘‘
Edit4 Text ‘‘
ReadOnly True
Edit5 Text ‘‘
ReadOnly True
GroupBox1 Caption Ingrese Valores
GroupBox2 Caption Posición
BitBtn1 Kind bkIgnore
Caption &Calcular
Enabled False
BitBtn2 Kind bkClose
Caption &Salir

Aspecto de la interfaz de usuario:

Para facilitar la entrada de datos al usuario le solicitaremos que ingrese el ángulo en


Sexagesimales.

Declararemos la aceleración de la gravedad en la sección de constantes:

const g=9.8;

En la sección Implementation digite el código del procedimiento Posición. Justamente


aquí se efectuara la conversión del ángulo del sistema sexagesimal al Circular. Luego d
esto recién podremos usar las funciones trigonométricas Sen y Cos.

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;

Código para el evento OnKeyPress de los controles Edit1 y Edit2:

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);


begin
if key=#13 then Edit2.SetFocus;
if not (key in ['0'..'9',#8,',']) then key:=#0
end;

procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char);


begin
if key=#13 then Edit3.SetFocus;
if not (key in ['0'..'9',#8,',']) then key:=#0
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:

procedure TForm1.BitBtn1Click(Sender: TObject);


var t,theta,v,x,y:real;
begin
v:=StrToFloat(Edit1.Text);
theta:=StrToFloat(Edit2.Text);
t:=StrToFloat(Edit3.Text);
Posicion(v,theta,t,x,y);
Edit4.Text:=FloatToStr(x);
Edit5.Text:=FloatToStr(Y)
end;

Al poner a prueba la aplicación la salida debe ser similar al modelo siguiente:

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.

Siga es estos pasos.

1. Crear una nueva aplicación con formulario


2. Colocar un Control Edit y un control StrigGrid en el formulario
3. Modificar las propiedades de los controles.

Control Propiedad Valor


Form1 Caption Criba de Eratóstenes
Height 290
Width 462
Edit1 Text ‘‘
Height 21
Left 2
Top 2
Width 447
StringGrid1 Height 290
Left 2
Top 26
Width 449

Asociemos un procedimiento al formulario accionado por el evento OnCreate. Este


procedimiento debe maximizar el tamaño del formulario.
1. Haga doble clic en el formulario. Delphi abre un controlador de evento para el
evento OnCreate.
2. Digite las siguientes instrucciones:
procedure TForm1.FormCreate(Sender: TObject);

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;

{Muestra los números primos en la rejilla}


procedure VerPrimos(Rejilla : TStringGrid ; primo : vector ; k : integer);
var i, j, p : integer;
begin
i:=1; j:=1;
for p:=0 to k do
begin
Rejilla.Cells[j,i]:=IntToStr(primo[p]);
j:=j+1;
if j=20 then
begin
j:=1;
i:=i+1;
end;

14
end;
end;

Programa ejecutándose:

5) Mínimo Común Múltiplo de una Serie de Números


Desarrollar una aplicación que calcule el mínimo común múltiplo de una serie de
números. Para ello, cree una nueva aplicación y diseñe una interfaz similar a la
ilustración.

Establezca las propiedades de los controles:

Control Propiedad Valor


Form1 Caption MCM de una serie de números
Height 290
15
Width 462
Edit1 Text ‘‘
Height 21
Left 2
Top 2
Width 113
Edit2 Text ‘‘
Height 21
Left 118
Top 2
Width 312
StringGrid1 Height 290
Left 2
Top 26
Width 427

Procedimientos vinculados al formulario:


Procedimiento accionado por el evento OnCreate. Maximiza el tamaño del formulario y
modifica las propiedades del control StringGrid.
procedure TForm1.FormCreate(Sender: TObject);
var f, c : integer;
begin
// Maximiza el tamaño del formulario
Form1.WindowState:=WsMaximized;
// Establece el numero de columnas del control StringGrid
StringGrid1.ColCount:=27;
// Establece el numero de filas del control StringGrid
StringGrid1.RowCount:=27;
// Establece la altura de las columnas del control StringGrid
StringGrid1.DefaultColWidth:=55;
// Establece la altura de las filas del control StringGrid
StringGrid1.DefaultRowHeight:=18;
// Establece la anchura solo de la columna 0
StringGrid1.ColWidths[0]:=25;
// Asigna un numero a cada una de las celdas de la columna 0
for f:=1 to StringGrid1.RowCount do StringGrid1.Cells[0,f]:=IntToStr(f);
// Asigna un caracter a cada una de las celdas de la fila 0
for c:=1 to StringGrid1.ColCount do StringGrid1.Cells[c,0]:=Chr(64+c);
end;
Procedimiento activado por el evento OnActivate. Activa la celda de la columna 2, fila 2.
procedure TForm1.FormActivate(Sender: TObject);
begin
StringGrid1.Col:=2;
StringGrid1.Row:=2
end;

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;

Procedimientos vinculados la control StringGrid.


Procedimiento accionado por el evento OnSelectCell. Este procedimiento se ejecuta
cuando una celda del control StingGrid es seleccionada.
procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
ARow: Integer; var CanSelect: Boolean);
begin
Edit2.Text:=StringGrid1.Cells[ACol,ARow];
Edit2.SetFocus;
xfil:=ARow;
xcol:=ACol;
end;
Procedimiento accionado por el evento OnMouseMove. Cuando el usuario seleccione
un rango de celdas, este procedimiento muestra en el control Edit1 las coordenadas de
la celda superior izquierda.
procedure TForm1.StringGrid1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
StringGrid1.MouseToCell(X, Y, x1, y1);
Edit1.Text:=chr(64+x1)+IntToStr(y1);
end;

Procedimiento accionado por el evento OnMouseUp. Muestra en el control Edit1 las


coordenadas de la celda inferior derecha del rango seleccionado.
procedure TForm1.StringGrid1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
StringGrid1.MouseToCell(X, Y, x2, y2);
Edit1.Text:=Edit1.Text + ':' + chr(64+x2)+IntToStr(y2);
end;

Procedimientos vinculados al control Edit2.


Procedimiento accionado por el evento OnKeyPress. Impide el ingreso de caracteres no
numéricos en el control Edit2. Además, cuando la tecla Enter es pulsada, selecciona la
celda contigua, a la derecha de la celda activa.
procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char);
begin
17
if Key=#13 then
begin
StringGrid1.Col:=StringGrid1.Col + 1;
StringGrid1.Row:=StringGrid1.Row;
end;
if not(key in['0'..'9','-']) then key:=#0;
end;

Procedimiento accionado por el evento OnKeyPress. Muestra el número ingresado en el


control Edit2 en la celda activa del control StrinGrid.
procedure TForm1.Edit2KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
StringGrid1.Cells[xcol,xfil]:=Edit2.Text
end;

Procedimiento vinculado el control Edit1 y accionado por el evento OnKeyPress.


procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
var a, b, i : integer;
num : vector;
begin
if Key=#13 then
begin
try
a:=x2-x1;
b:=y2-y1;
//Almacena en la matriz Num los datos introducidos en las celdas
for i:=0 to a do
num[i]:=StrToInt(StringGrid1.Cells[x1+i,y1]);
//Llama al procedimiento MCM
MCM(num, a, StringGrid1, Edit2);

//En caso de que se produzca una excepción se entra a este bloque


except
on x : exception do ShowMessage('" ' + x.Message+'" ');
end;
end;
end;

Declaración de variables globales al inicio de la sección Implementation.


implementation
{$R *.DFM}
type
vector=array[0..29] of integer;
var
xfil, xcol, x1, y1, x2, y2 : integer;
18
Este procedimiento calcula el MCM de los números ingresados en las celdas del control
StringGrid.
//Cálculo del mínimo común múltiplo
procedure MCM(num : vector; a : integer; Rejilla : TStringGrid; Cuadro : TEdit);
var i, j, dvsr, mcm, sw1, sw2 : integer;
begin
dvsr:=2;
mcm:=1;
j:=0;
repeat
sw1:=1;
sw2:=1;
for i:=0 to a do
begin
if (num[i] mod dvsr)=0 then
begin
sw1:=0;
num[i]:=num[i] div dvsr;
end;
if (num[i]<>1) then sw2:=0;
end;
if sw1=0 then
begin
Rejilla.Cells[x2+1,y1+j]:=IntToStr(dvsr);
mcm:=mcm*dvsr;
j:=j + 1;
for i:=0 to a do
Rejilla.Cells[x1+i,y1+j]:=IntToStr(num[i]);
end
else
dvsr:=dvsr + 1;
until sw2 <> 0;
Cuadro.Text:='El mínimo común múltiplo es: '+IntToStr(mcm);
end;
Ejecución del programa:

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:

Control Propiedad Valor


Form1 Caption Cuadro Latino
Height 355
Width 498
Edit1 Hint Ingrese un número y pulse Enter
Height 21
Left 2
ShowHint True
Text ‘ ‘
Width 487
StringGrid1 ColCount 104
FixedCols 1
FixedRow 1
s 2
Left 104
RowCount ssBoth
ScrollBars 487
Width

La interfaz de usuario debe tener el siguiente aspecto:

Asociemos un procedimiento al formulario accionado por el evento OnCreate.

procedure TForm1.FormCreate(Sender: TObject);


var f, c : integer;
begin
// Maximiza el tamaño del formulario
Form1.WindowState:=WsMaximized;
// Establece a 25 las anchuras (enpixel) de todas las columnas en el control StringGrid
StringGrid1.ColWidths[0]:=25;
// Enumera la columna 0 del control StringGrid
21
for f:=1 to StringGrid1.RowCount do StringGrid1.Cells[0,f]:=IntToStr(f);
// Asigna un caracter a la fila 0 del control StringGrid
for c:=1 to StringGrid1.ColCount do StringGrid1.Cells[c,0]:=Chr(64+c);
end;

Vinculemos un procedimiento al formulario accionado por el evento OnActivate. Este


procedimiento debe activar la celda de la columna 2, fila 2 del control StrigGrid.

Con el formulario seleccionado, sitúese en la ficha Events del Inspector de Objetos y


haga doble clic en el evento OnActivate y luego digite el siguiente código:

procedure TForm1.FormActivate(Sender: TObject);


begin
StringGrid1.Col:=2;
StringGrid1.Row:=2
end;

Asociemos un procedimiento al formulario por el evento OnResize. Este Procedimiento


debe ajustar el tamaño de los controles Edit1 y StringGrid1 cuando el usuario
redimensione el tamaño del formulario.

procedure TForm1.FormResize(Sender: TObject);


begin
Edit1.Width:=Form1.Width - 11;
StringGrid1.Height:=Form1.Height - 53;
StringGrid1.Width:=Form1.Width - 11;
end;

Vinculemos un procedimiento al control Edit1m para el evento OnKeyPress. Este


procedimiento solo debe permitir el ingreso de los dígitos 0, 1, …, 9 en el control Edit1 y,
cuando el usuario pulse la tecla Enter, debe invocar a los procedimientos
LimpiarCeldas, GenerarCuadroLarino, MostrarCuadroLatino.

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);


var M : matrix;
n : integer;
begin
if key=#13 then
begin
n:=StrToInt(Edit1.Text);
if n > 100 then
ShowMessage('Ingrese un número menor o igual que 100.')
else
begin
//Modifica el ícono del cursor al de un reloj de arena.
StringGrid1.Cursor:=-11;
//Llama al procedimiento LimpiarCeldas.
22
LimpiarCeldas(StringGrid1);
//Llama al procedimiento GenerarCuadradoLatino.
GenerarCuadradoLatino(n,M);
//Llama al procedimiento MostrarCuadradoLatino.
MostrarCuadradoLatino(StringGrid1,n,M);
//El cursor vuelve a su ícono original
StringGrid1.Cursor:=0;
end;
end;
{Sólo permite el ingreso de dígitos en el control Edit1}
if not(key in['0'..'9']) then key:=#0
end;

Digite el código de los procedimiento LimpiarCeldas, GenerarCuadroLarino,


MostrarCuadroLatino al inicio de la sección Implementation.

implementation

{$R *.DFM}
type matrix=array[1..100,1..100] of integer;

{Limpia las celdas de la rejilla}


procedure LimpiarCeldas(Rejilla : TStringGrid);
var f, c : integer;
begin
for f:=1 to Rejilla.RowCount do
for c:=1 to Rejilla.ColCount do
Rejilla.Cells[c,f]:='';
end;

{Almacena el cuadrado latino en la matriz M.}


procedure GenerarCuadradoLatino(n : integer; var M : matrix);
var f, c, k, sw, temp : integer;
begin
sw:=0;
for f:=1 to n do
if sw=0 then
begin
for c:=1 to n do M[f,c]:=c;
sw:=1
end
else
begin
temp:=M[f-1,n];
for k:=n downto 2 do M[f,k]:=M[f-1,k-1];
M[f,1]:=temp;
end;
end;
23
{Muestra el cuadrado latino en las celdas del control StringGrid1}
procedure MostrarCuadradoLatino(Rejilla : TStringGrid; n : integer; M : matrix);
var f, c : integer;
begin
for f:=1 to n do
for c:=1 to n do
Rejilla.Cells[c+1,f+1]:=IntToStr(M[f,c]);
end;

Ejecución del programa:

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

Diseñada la interfaz de usuario, asocie tres procedimientos al formulario accionados por


el evento OnCreate, OnActivate y OnResize.
procedure TForm1.FormCreate(Sender: TObject);
var f, c : integer;
begin
Form1.WindowState:=WsMaximized;
StringGrid1.ColWidths[0]:=25;
for f:=1 to StringGrid1.RowCount do StringGrid1.Cells[0,f]:=IntToStr(f);
for c:=1 to StringGrid1.ColCount do StringGrid1.Cells[c,0]:=Chr(64+c);
end;
procedure TForm1.FormActivate(Sender: TObject);
begin
StringGrid1.Col:=2;
StringGrid1.Row:=2
end;
procedure TForm1.FormResize(Sender: TObject);
begin
Edit1.Width:=Form1.Width - 12;
StringGrid1.Height:=Form1.Height - 54;
StringGrid1.Width:=Form1.Width - 11;
end;

Asociemos un procedimiento al control Edit1 para el evento OnKeyPress.


procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
var n : integer;
M : matrix;
begin
if key=#13 then
25
begin
n:=StrToInt(Edit1.Text);
if (n < 3)or(n > 29)or(n mod 2=0) then
ShowMessage('Ingrese un número impar mayor que 2 y menor que 30.')
else
begin
{Llama al procedimiento LimpiarCeldas}
LimpiarCeldas(StringGrid1);
{Llama al procedimiento CuadradoMagico}
CuadradoMagico(M,n);
{Llama al procedimiento MostrarCuadradoMagico}
MostrarCuadradoMagico(StringGrid1,n,M)
end;
end;
//Sólo permite el ingreso de los dígitos 0, 1,..., 9 en el control Edit1.
if not(key in['0'..'9']) then key:=#0
end;

Código de los procedimientos LimpiarCeldas, CuadroMagico y MostrarCuadroMagico

implementation
{$R *.DFM}

type matrix=array[0..31,0..31] of integer;

{Limpia las celdas del control StringGrid1}


procedure LimpiarCeldas(Rejilla : TStringGrid);
var f, c : integer;
begin
for f:=1 to Rejilla.RowCount do
for c:=1 to Rejilla.ColCount do
Rejilla.Cells[c,f]:='';
end;

//Almacena el cuadrado mágico en la matriz M.


procedure CuadradoMagico(var M : matrix; n : integer);
var f, c, j : integer;
begin
f:=1;
c:=trunc(n/2)+1;
for j:=1 to n*n do
begin
M[f,c]:=j;
if (j mod n)=0 then
f:=f + 1
else
begin
if f=1 then f:=n else f:=f - 1;
26
if c=n then c:=1 else c:=c + 1
end;
end;
end;

{Muestra el cuadrado mágico en las celdas del control StringGrid1}


procedure MostrarCuadradoMagico(Rejilla : TStringGrid; n : integer; M : matrix);
var f, c : integer;
begin
for f:=1 to n do
for c:=1 to n do
Rejilla.Cells[c+1,f+1]:=IntToStr(M[f,c]);
end;

Programa en ejecución:

8) Fecha a Texto

En la correspondencia de negocios, las fechas se imprimen comúnmente en varios


formatos diferentes. Dos de los más comunes son:

Formato 1 Formato2
25/7/65 25 de Julio de 1965
2/10/92 2 de Octubre de 1992

Desarrollar un aplicación que lea una fecha en el primer formato y la visualice en el


segundo verificando que soporte entradas como las anteriores.
27
Siga los siguientes pasos:
1. Crear una nueva aplicación con formulario
2. Colocar en el formulario los siguientes componentes: 2 etiquetas, 1 Cuadro de
Edición, 2 controles BitBtn y una mascara de edición.
3. Modificar las propiedades de los componentes:

Control Propiedad Valor


Form1 Caption Fecha a Texto
Posición poScreenCenter
Label1 Caption Ingrese fecha:
Label2 Caption Valor en Texto:
MaskEdit1 Text ‘‘
ReadOnly True
Edit1 Text ‘‘
ReadOnly True
BitBtn1 Caption &Calcular
Kind bkOK
BitBtn2 Caption &Salir
Kind bkClose
BitBtn3 Caption &Mejora
Kind bkIgnore

Aspecto de la Interfaz de usuario:

En el formulario selecciones el componente MaskEdit1:


1. Sitúese en la ficha Properties del Inspector de Objetos y, en la propiedad
EditMask haga doble clic en el botón de los tres puntos.
2. El editor Input Mask permite seleccionar una mascara de entrada a partir del
cuadro ejemplos de Mascaras (Sample Mask), pero también pide que se le
indique un carácter a emplear como marcador de posición. En el cuadro Sample
Mask elija el tipo Date y luego haga clic en el botón OK.

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.

procedure TForm1.BitBtn1Click(Sender: TObject);


var d,mm,m,a,S:string;
i:Byte;
begin
S:=MaskEdit1.Text;i:=1;
while(i<=8) do
begin
if S[i]<>'/' then
begin
if i<3 then
d:=d+S[i];
if (i>3) and (i<6) then
m:=m+S[i];
if i>6 then
a:=a+S[i]
end;
inc(i)
end;
case StrToInt(Trim(m)) of
1:mm:='Enero';
2:mm:='Febrero';
3:mm:='Marzo';
4:mm:='Abril';
5:mm:='Mayo';
6:mm:='Junio';
7:mm:='Julio';
8:mm:='Agosto';
29
9:mm:='Setiembre';
10:mm:='Octubre';
11:mm:='Noviembre';
12:mm:='Diciembre'
end;
if StrToInt(Trim(a))>3 then
Edit1.Text:=Trim(d)+' de '+mm+' de 19'+a
else
Edit1.Text:=Trim(d)+' de '+mm+' del 20'+a
end;

procedure TForm1.BitBtn3Click(Sender: TObject);


begin
Form1.Hide;
Form2.Show
end;

El primer formulario del ejemplo pFecha1.DPR en ejecución.

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.

procedure TForm2.BitBtn1Click(Sender: TObject);


var dd,mm,aa,S:string;
begin
S:=MaskEdit1.Text;
dd:=Copy(S,1,2);
mm:=Copy(S,4,2);
aa:=Copy(S,7,2);
case StrToInt(Trim(mm)) of
1: mm:='Enero';
2: mm:='Febrero';
3: mm:='Marzo';
4: mm:='Abril';
5: mm:='Mayo';
6: mm:='Junio';
7: mm:='Julio';
8: mm:='Agosto';
30
9: mm:='Setiembre';
10: mm:='Octubre';
11: mm:='Noviembre';
12: mm:='Diciembre'
end;
if StrToInt(Trim(aa))>3 then
Edit1.Text:=Trim(dd)+' de '+mm+' de 19'+Trim(aa)
else
Edit1.Text:=Trim(dd)+' de '+mm+' del 20'+Trim(aa)
end;

procedure TForm2.BitBtn2Click(Sender: TObject);


begin
Form1.Close;
Form2.Close
end;

El segundo formulario del ejemplo pFecha1.DPR en ejecución

Funciones de Manejo de Cadenas

Copy: Retorna una subcadena de una cadena que tiene Num Caracteres y empieza
en S[ini].
Sintaxis: copy (S, Ini, Num);

Donde: S es una cadena


Ini y Num son enteros

Si Ini es mayor que la longitud de S, Copy retorna una cadena vacía.


Trim: Función que elimina los espacios y caracteres de control de los extremos de una
cadena.
Sintaxis: Trim(S);

UpCase: Función que convierte un carácter en mayúscula , Ch es una expresión de


tipo Char.
31
Sintaxis: UpCase(S);

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);

Length: Función que retorna el numero de caracteres usados actualmente en la


cadena o el número de elementos en el array.
Sintaxis: Length(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:

Control Propiedad Valor


Form1 Caption Ordenamiento de Listas
Position poScreenCenter
Label1 Caption Ingrese Nombre:
Label2 Caption Lista Original
Label3 Caption Lista Ordenada
32
Edit1 Text ‘‘
GroupBox1 Caption Opciones
RadioButton1 Caption Por la Longitud
RadioButton2 Caption Alfabeticamente
BitBtn1 Kind bkCustom
Caption &Ordenar
Enabled False
BitBtn2 Kind bkClose
Caption &Cerrar
Aspecto de la interfaz de usuario:

En la sección Implementation digite el código de los procedimientos PorLongitud y


Alfabetico.
implementation
{$R *.DFM}
procedure PorLongitud;
var
i,j:integer;
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 length(Form1.ListBox2.Items.Strings[i])>length(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;
procedure Alfabetico;
var
i,j:integer;

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;

Los siguientes procedimientos habilitan el control BitBtn1 solo si se han seleccionado el


RadioButton1 o bien el RadioButton2.
procedure TForm1.RadioButton1Click(Sender: TObject);
begin
BitBtn1.Enabled:=true
end;

procedure TForm1.RadioButton2Click(Sender: TObject);


begin
BitBtn1.Enabled:=true
34
end;
Asociemos un procedimiento al control BitBtn1 accionado por el evento OnClick. Este
procedimiento llamara a las rutinas PorLongitud o Alfabetico de acuerdo a la selección
del usuario.
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
if RadioButton1.Checked Then
PorLongitud;
if RadioButton2.Checked Then
Alfabetico
end;

Ordenamiento por Longitud

Ordenamiento Alfabético Ascendente

35

Das könnte Ihnen auch gefallen