Está en la página 1de 18

Capt.

8
ESTRUCTURAS REPETITIVAS – MISCELANEA
1) Generador de temperaturas
Simular una proyección del estado del tiempo (temperatura) para los próximos “D” días
generando temperaturas mínimas y máximas aleatorias mostrando como temperatura
del día el promedio de la mínima y la máxima. Estadísticamente el rango de las
temperaturas esta entre 10 y 36 grados; además asumir que las temperaturas no
siempre son enteras. El programa deberá mostrar el siguiente encabezado, acompañada
de sus respectivos valores:
Día T. Mínima T. Máxima T. Promedio
Siga estos pasos:
1. Crear una nueva aplicación con formulario
2. En el formulario colocar los siguientes componentes: 1 Etiqueta, 2 Cuadro de
Edición, 2 Botones de figura y 1 Control StringGrid.
3. Modificar las propiedades de los componentes:

Control Propiedad Valor


Form1 Caption Proyección del Estado del Tiempo
Label1 Caption Total de días:
Edit1 Text ‘‘
StringGrid Name Rejilla
Height 249
Lef 8
Top 48
Width 409
BitBtn1 Kind bkCustom
Caption &Calcular
Enabled False
BitBtn2 Kind bkClose
Caption &Salir
Aspecto de la interfaz de usuario:

1
Declaremos 5 variables globales reales en la sección
var
a, b, c, tmin, tmax,:real;

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

implementation

{$R *.DFM}
procedure LimpiarRejilla(Rejilla:TStringGrid);
var i,j:byte;
begin
for i:=1 to Rejilla.RowCount do
for j:=1 to Rejilla.ColCount do
Rejilla.Cells[j,i]:=''
end;

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


usuario inicie la aplicación, este procedimiento se encargará de modificar la apariencia
de la rejilla.

procedure TForm1.FormCreate(Sender: TObject);


var f:byte;
begin
Form1.WindowState:=WsMaximized;
Rejilla.ColWidths[0]:=25;
for f:=1 to Rejilla.RowCount do Rejilla.Cells[0,f]:=IntToStr(f);
Rejilla.Cells[0,0]:='Dia';
Rejilla.Cells[1,0]:='T. Mínima';
Rejilla.Cells[2,0]:='T. Máxima';
Rejilla.Cells[3,0]:='T. Promedio';
BitBtn1.Enabled:=false
end;
2
Asociemos un procedimiento al control Edit1 para el evento OnKeyPress. Aquí
permitiremos el acceso solo de dígitos.

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


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

El control ButBtn1 sólo se habilitará al ingresar un número:

procedure TForm1.Edit1Change(Sender: TObject);


begin
If length(edit1.Text)>0 then
Bitbtn1.Enabled:=True
else
BitBtn1.Enabled:=false
end;

Haga doble clic en botón de figura BitBtn1 ( se abre el controlador de evento OnClick)
Este evento obtendrá dos valores en el rango establecido determinando a continuación
la temperatura máxima y mínima almacenándola en tmax y tmin respectivamente.

procedure TForm1.BitBtn1Click(Sender: TObject);


var i,d:byte;
begin
d:=StrToInt(Edit1.text);
LimpiarRejilla(Rejilla);
randomize;
for i:=1 to d do
begin
Repeat
a:=26*random+10;
b:=26*random+10;
Until a<>b;
If a>b then
begin
tmax:=a;
tmin:=b
end
Else
begin
tmax:=b;
tmin:=a
end;
3
Rejilla.Cells[1,i]:=FloatToStr(tmin);
Rejilla.Cells[2,i]:=FloatToStr(tmax);
Rejilla.Cells[3,i]:=FloatToStr((tmin+tmax)/2);
Edit1.SetFocus;
Edit1.SelStart:=0;
Edit1.SelLength:=Length(Edit1.Text)
end
end;

Programa ejecutándose:

2) Divisores y Dígitos

Elaborar un programa para obtener los divisores de un numero, cifra mayor, cifra menor
y suma de cifras.

Ejemplo:
Número: 714

Divisores: 1 2 3 6 7 14 17 21 34 42 102 119 238 357 714


Cifra mayor: 7
Cifra menor: 1
Suma de cifras: 12
1. Crear una nueva aplicación con formulario
2. En el formulario colocar los siguientes componentes: 1 Etiqueta, 2 Cuadro de
Edición, 2 Botones de figura y 1 Control StringGrid.
3. Modificar las propiedades de los componentes:
4
Control Propiedad Valor
Form1 Caption Primos , Divisores y Suma de Cifras
Position poScreenCenter
Label1 Caption Ingrese un Número
Label2 Caption Factores primos
Label3 Caption Divisores
Label4 Caption Cifra Mayor
Label5 Caption Cifra Menor
Label6 Caption Suma de Cifras
Edit1 Text ‘‘
Edit2 Text ‘‘
ReadOnly True
Edit3 Text ‘‘
ReadOnly True
Edit4 Text ‘‘
ReadOnly True
Button1 Caption &Calcular
Button2 Kind bkClose
Caption &Salir

Aspecto de la interfaz de usuario:

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


procedimiento para un número ingresado calculara los primos, divisores, cifra menor y
mayor y suma de cifras.

procedure TForm1.Button1Click(Sender: TObject);


var i,j,n,num:integer;
r,min,max,dig,suma:byte;
begin
ListBox1.Clear;

5
ListBox2.Clear;
n:=StrToInt(edit1.Text);
// Cálculo de primos
for i:=1 to n-1 do
if n mod i=0 then
begin
r:=0;
for j:=2 to i-1 do
if (i mod j=0) then
r:=1;
if r=0 then ListBox1.Items.Add(inttostr(i))
end;
num:=n;
// Cálculo de divisores
for i:=1 to n do
if n mod i=0 then
ListBox2.Items.Add(inttostr(i));
// Cálculo de cifra menor y mayor y suma de cifras
min:=9;
max:=0;
suma:=0;
repeat
dig:=num mod 10;
suma:=suma+dig;
if dig<=min then
min:=dig;
if dig>=max then
max:=dig;
num:=num div 10
until num=0;
edit2.text:=IntToStr(max);
edit3.text:=IntToStr(min);
edit4.text:=IntToStr(suma)
end;
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
If key=#13 then button1.SetFocus;
If not (key in ['0'..'9',#8]) Then key:=#0
end;

El programa ejecutándose:

6
3) Lotería

Desarrollar una aplicación para simular una lotería. Se deben escoger 6 números
distintos de 1 a max (Ejemplo: max=15 ). Luego el programa generara los números del
boleto ganador. Una salida típica podría ser:

Los seis números son: 1 11 2 13 8 6


1. Crear una nueva aplicación con formulario
2. En el formulario colocar los siguientes componentes: 1 Etiqueta, 2 Cuadro de
Edición, 3 controles BitBtn y 1 Control StringGrid.
3. Modificar las propiedades de los componentes:

Control Propiedad Valor


Form1 Caption Lotería
Position poScreenCenter
Label1 Caption Número
Edit1 Text ‘‘
StringGrid1 Name Rejilla
BitBtn1 Caption &Ingresar
Kind bkOK
BitBtn2 Caption &Ver Ganador
Kind bkHelp
BitBtn3 Caption &Salir
Kind bkClose

Aspecto de la Interfaz de usuario:

7
Fijemos las constantes total, que indica la cantidad de números a adivinar y max que
indica el mayor número que se puede escoger. Si desea ampliar el rango bastara con
modificar los valores en la sección.

const
Total=6;
Max=15;

Con el tipo TLoteria definimos un array de enteros cortos:

type
TLoteria= array[1..total] of byte;

Declaremos dos array del tipo TLoteria, dos conjuntos y contador como variables
globales en la sección

var
k:byte;
Num, Lot: TLotería;
Conj1, Conj2: Set of Byte;

En la sección Implementation digite el codigo del procedimiento LimpiarRejilla:

implementation

{$R *.DFM}
procedure LimpiarRejilla(Rejilla:TStringGrid);
var i,j:byte;
begin
8
for i:=1 to Rejilla.RowCount do
for j:=1 to Rejilla.ColCount do
Rejilla.Cells[j,i]:=''
end;

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


usuario inicie la aplicación, este procedimiento se encargará de modificar la apariencia
de la rejilla.

procedure TForm1.FormCreate(Sender: TObject);


var c:byte;
begin
Form1.WindowState:=WsMaximized;
Rejilla.ColWidths[0]:=60;
for c:=1 to total do Rejilla.Cells[c,0]:=IntToStr(c);
Rejilla.Cells[0,0]:='Número';
Rejilla.Cells[0,1]:='Lotería';
Rejilla.Cells[0,2]:='Ganador'
end;

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


permitiremos el acceso solo de dígitos.

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


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

El control ButBtn1 sólo se habilitará al ingresar un número. Haga doble clic en el


componente Edit1:

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 BitBtn1 accionado por el evento OnClick. Este


procedimiento permitirá el ingreso de 6 números diferentes a la rejilla:

procedure TForm1.BitBtn1Click(Sender: TObject);


var elem:byte;
begin
elem:=StrToInt(Edit1.Text);
if elem<=max then
begin
9
inc(k);
if k=1 then
begin
Conj2:=[elem];
lot[k]:=elem;
Rejilla.Cells[k,1]:=Edit1.text
end
else
begin
if elem in Conj2 then dec(k)
else begin
Conj2:=Conj2+[elem];
lot[k]:=strtoint(Edit1.Text);
Rejilla.Cells[k,1]:=Edit1.text
end
end
end
else ShowMessage('Número muy alto');
if k<total then
begin
Edit1.SetFocus;
Edit1.SelStart:=0;
Edit1.SelLength:=Length(Edit1.Text)
end
else
begin
Edit1.ReadOnly:=true;
BitBtn2.Enabled:=true;
BitBtn2.SetFocus
end;
BitBtn1.Enabled:=false
end;

Haga doble clic en el control ButBtn2. En esta sección se generara el boleto ganador y
se enviara un mensaje indicando el total de números adivinados. En el controlador de
evento que se abre en el Editor de Código, digite las siguientes instrucciones:

procedure TForm1.BitBtn2Click(Sender: TObject);


var i,j,cont,elem:byte;
begin
randomize;i:=1;
elem:=trunc(max*random);
Num[i]:=elem;
Conj1:=[elem];
Rejilla.Cells[i,2]:=IntToStr(Num[i]);
while i<total do
begin
inc(i);
10
elem:=trunc(max*random);
if (elem in Conj1) then dec(i)
else
begin
Conj1:=Conj1+[elem];
Num[i]:=elem;
Rejilla.Cells[i,2]:=IntToStr(elem)
end
end;
cont:=0;
for i:=1 to total do
for j:=1 to total do
if Num[i]=Lot[j] then
cont:=cont+1;
if cont=total then
showmessage('Felicitaciones,ganó el premio mayor');
showmessage('Acertó '+inttostr(cont)+' números');
BitBtn1.Enabled:=true
end;

Programa ejecutándose:

4) Números Perfectos

Un número perfecto es un número entero positivo, que es igual a la suma de sus


divisores (incluido el 1 y excluido el propio número). El primer número perfecto es 6, ya
que los divisores de 6 son: 1, 2, 3 y 1 + 2 + 3 = 6.

11
Desarrollar una aplicación que busque números perfectos en el rango de 1 hasta un
número dado. Siga los siguientes pasos

1. Crear una nueva aplicación con formulario


2. En el formulario colocar los siguientes componentes: 1 Cuadro de Edición y 1
Control StringGrid tal como se observa en la siguiente ilustración:

La tabla siguiente muestra las propiedades de los controles:

Control Propiedad Valor


Form1 Caption Números Perfectos
Heigth 375
Width 544
Edit1 Text ‘‘
Heigth 21
Left 2
Top 4
Width 534
StringGrid1 Name Rejilla
Heigth 321
Left 1
Top 27
Width 535

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


usuario inicie la aplicación, este procedimiento se encargará de modificar la apariencia
de la rejilla.
procedure TForm1.FormCreate(Sender: TObject);
var f, c : integer;
begin
Form1.WindowState:=WsMaximized;
rejilla.ColWidths[0]:=25;
12
for f:=1 to rejilla.RowCount do rejilla.Cells[0,f]:=IntToStr(f);
for c:=1 to rejilla.ColCount do rejilla.Cells[c,0]:=Chr(64+c);
end;
Asociemos un procedimiento al control Edit1 para el evento OnKeyPress. Este
Procedimiento debe impedir el ingreso de caracteres no numéricos en el control Edit1 y,
cuando el usuario pulse la tecla Enter, localizar y mostrar los números perfectos en el
control StringGrid.
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
var n, suma, j : integer;
c : byte;
begin
if Key=#13 then
begin
//El puntero del mouse adopta la forma de un reloj de arena.
try
rejilla.Cursor:=-11;
n:=6;
c:=0;
repeat
suma:=1;
for j:= 2 to round(n/2) do
begin
if n mod j = 0 then
suma:=suma + (n div j)
end;
if suma=n then
begin
rejilla.Cells[c+2,2]:=IntToStr(n);
c:=c + 1;
end;
n:=n + 1
until n > StrToInt(Edit1.text);
//El puntero del mouse adopta su forma original.
rejilla.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;
end;
if not(key in['0'..'9',#8]) then key:=#0;
end;
Asociemos otro procedimiento al formulario accionado por el evento OnResize, Cuando
el usuario modifique el tamaño del formulario, este procedimiento debe modificar las
dimensiones de los controles Edit1 y StrigGrid1.
1. Haga clic en el formulario para seleccionarlo
13
2. En la ficha events del Inspector de Objetos, haga doble clic en el evento
OnResize.
3. Digite el siguiente código.
procedure TForm1.FormResize(Sender: TObject);
begin
Edit1.Width:=Form1.Width - 10;
rejilla.Height:=Form1.Height - 55;
rejilla.Width:=Form1.Width - 9;
end;
Ejecute el programa. Ingrese un número en control Edit1 y pulse la tecla Enter. El
Programa buscara los números perfectos que estén entre 6 y el número ingresado.

5) Conversión de una serie de números de base diez a


números de base 2 al 20

Desarrollar un programa que convierta una serie de números en base diez a números de
base 2 al 20.
Siga los siguientes pasos:
1. Crear una nueva aplicación con formulario.
2. Guardar la ficha con el nombre uConvBase.pas y la aplicación con el nombre
pConvBase.dpr
3. Colocar un control StringGrid en el formulario. Este control se encuentra en la
pestaña Additional de la Paleta de Componentes.
4. En el formulario, ajuste el tamaño del control StringGrid.
5. Con el control StringGrid seleccionado, presiones la tecla F11 para visualizar el
Inspector de Objetos.
6. Asigne las siguientes propiedades al Control StringGrid.

Propiedad Valor
Name sgdConv
ColCount 30
FixedCols 1
14
FixedRow 1
s
RowCount 25
ScrollBars ssBoth

Seguidamente, añada un control Label y tres controles Button en el formulario. Luego, asígneles las
siguientes propiedades:

Control Propiedad Valor


Form1 Caption Conversión de números de base 10 a
números de base 2 al 20
Position poDesktopCenter
ShowHints True
Label1 Caption ‘Ingrese un número’
Edit1 Text *
Name Edit1
Button1 Enabled False
Caption &Calcular
Button2 Hint Limpiar la lista ingresada
Caption &Repetir
Button3 Caption &Salir
Hint Abandona la aplicación

La interfaz de usuario debe ser similar a la siguiente ilustración:

15
Observe que la propiedad Position en poDesktopCenter ubica el formulario en el centro
del Escritorio. Diseñada la interfaz de usuario, asociemos un procedimiento al formulario.
Cuando el usuario inicie el programa, este procedimiento se ejecutará automáticamente ,
ajustara las anchuras de las columnas del control StrinGrid y seleccionará la celda 0,1:
procedure TForm1.FormCreate(Sender: TObject);
var K:Integer;
begin
//Ajusta las anchuras de las columnas en el control StringGrid
sgdConv.ColWidths[0]:=30;
For k:=1 To 29 Do
sgdConv.ColWidths[k]:=80;
xfil:=0;
xcol:=1
end;
Asociemos un procedimiento al cuadro de edición Edit1 accionado por el suceso
OnKeyPress. Este procedimiento solo debe permitir el ingreso de los dígitos 0,….,9 en
el cuadro Edit1 y, cuando el usuario pulse Enter, el número introducido en la caja Edit1
debe aparecer en la celda activa. Además, debe seleccionar la celda contigua a la
derecha de la celda activa y limpiar el cuadro de edición Edit1.
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
If (Key=#13) and (Edit1.Text<>'') Then
begin
//Muestra en la celda activa el número ingresado en el control Edit1
sgdConv.Cells[xcol,xfil]:=Edit1.Text;
xcol:=sgdConv.Col+1;
//Selecciona la celda contigua a la derecha de la celda activa
sgdConv.Col:=sgdConv.Col+1;
sgdConv.Row:=sgdConv.Row;
//Limpia el cuadro de edición Edit1
Edit1.Clear
end;
//Sólo permite el ingreso de los dígitos 0,..,9 en la caja Edit1
If not (Key in ['0'..'9',#8]) Then
begin
Beep;
Key:=#0
end;
If xcol>1 Then
button1.Enabled:=true
end;
Asociemos un procedimiento al botón Calcular accionado por el suceso OnClick.
Cuando el usuario haga clic en el botón calcular, este procedimiento debe convertir los
números ingresados en las celdas del control StringGrid a números de base 2 al 20.
procedure TForm1.Button1Click(Sender: TObject);
var
16
i,base,n:integer;
NuevoSist:String;
begin
i:=1;
Repeat
For base:=2 To 20 Do
begin
If i=1 Then
sgdConv.Cells[0,base-1]:=IntToStr(base);
n:=StrToInt(sgdConv.Cells[i,0]);
NuevoSist:='';
Repeat
If n Mod base>=10 Then
NuevoSist:=chr((n Mod base)+55)+NuevoSist
Else
NuevoSist:=chr((n Mod base)+48)+NuevoSist;
n:=n Div base
Until n<1;
sgdConv.Cells[i,base-1]:=NuevoSist
end;
i:=i+1
Until (i>=xcol)
end;
Asociemos un procedimiento al botón Repetir accionado por el suceso OnClick.
Cuando el usuario haga clic en el botón Repetir, este procedimiento debe seleccionar
todas las celdas del control StringGrid y borrar los datos de estas celdas.
procedure TForm1.Button2Click(Sender: TObject);
begin
with sgdConv Do
begin
//Limpia todas las celdas de la rejilla
LimpiarRejilla(sgdConv);
xfil:=0;
xcol:=1;
row:=0;col:=1;//seleccion de la celda 0,1
//Enfoca el cuadro de edición Edit1
Edit1.SetFocus
end;
Button1.Enabled:=false
end;
//Limpia las celdas del control StringGrid1.
procedure LimpiarRejilla(Rejilla:TStringGrid);
var
i,j:integer;
begin
for i:=0 to Rejilla.RowCount do
for j:=0 to Rejilla.ColCount do
17
Rejilla.Cells[j,i]:=''
end;
Luego de introducir todos los números, haga clic en el botón Calcular:

18

También podría gustarte