Está en la página 1de 14

Capt.

6
ESTRUCTURAS REPETITIVAS – While
La sentencia WHILE
La sintaxis de una sentencia WHILE es:
while expresión do
sentencias
En esta estructura la condición es evaluada antes de la primera ejecución de la
secuencia de sentencias. De este modo, si la condición es falsa la secuencia de
sentencias nunca es ejecutada.

La ejecución del bucle continua tantas veces como expresión retorne True. La expresión
se evalúa antes de cada iteración.

Inicialización
Cualquier variable que aparezca en la condición de WHILE debe haber recibido un valor
inicial antes de entrar en el ciclo, porque la variable ya debe tener un valor la primera vez
que se pruebe la condición del ciclo.

Retinas de Control de Ciclo


Podemos usar los procedimientos estándar Break, Continúe, Exit y Halt para controlar el
flujo de una sentencia Repeat, While o For.

 Break termina la instrucción en la cual esta ocurre, esto es, causa que el control
de flujo salga de un lazo for, while o repeat y continúe en la siguiente instrucción,
luego del lazo. Una llamada a Break debe estar contenida en una sentencia for,
while, o repeat o el compilador reportara un error.
 Continúe dirige el flujo a la siguiente iteración de la secuencia. El compilador
reporta un error si una llamada a Continúe se hace fuera de un lazo.
 Exit sale del procedimiento actual. Si el procedimiento actual es el programa
principal, Exit causa que el programa termine.
 Halt produce una terminación anormal de un programa y retorna al sistema
operativo.

1) Suma de Términos Pares y Términos Impares


Determinar la suma de los términos pares y la suma de los términos impares, por
separado, de la siguiente serie, considerando que el denominador no debe exceder de
N, el cual será ingresado por e usuario.
Ejemplo para N = 150.

1
¾ - 7/8 + 15/16 – 31/32 + 63/64 – 127/128
Siga estos pasos:
1. Crear una nueva aplicación con formulario.
2. En el formulario colocar los siguientes componentes: 3 etiquetas, 3 cuadros de
edición y 2 controles BitBtn.
3. Modificar las propiedades de los componentes:

Control Propiedad Valor


Form1 Caption Serie del Seno
Position poScreenCenter
Label1 Caption Ingrese N:
Label2 Caption Suma de términos pares
Label3 Caption Suma de términos impares
Edit1 Text ‘‘
Edit2 Text ‘‘
ReadOnly True
Edit3 Text ‘’
ReadOnly True
BitBtn1 Kind bkIgnore
Caption &Calcular
Enabled False
BitBtn2 Caption &Salir
Kind bkClose

Aspecto de la Interfaz de usuario:

Asociemos un procedimiento al control Edit1 para el evento OnKeyPress.


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

2
If key=#13 Then BitBtn1.SetFocus;
If not (key in ['0'..'9',#8]) Then key:=#0
end;
Veamos otro procedimiento vinculado al Cuadro de Edición y accionado por el evento
OnChange. El botón Calcular recién se habilitara al ingresa un valor para N.
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 calculara por separado la Suma de Términos Pares y la Suma de
Términos Impares guardando los valores en las variables sTPares y StImpares
respectivamente.
procedure TForm1.BitBtn1Click(Sender: TObject);
var n:Word;
num,den,sTPares,sTImpares:Real;
i:byte;
begin
n:=StrToInt(Edit1.Text);
i:=2;sTPares:=0;sTImpares:=0;
while (n>=exp(i*ln(2))) do
begin
den:=exp(i*ln(2));
num:=den-1;
If i mod 2 = 0 Then
sTPares:=sTPares+num/den
Else
sTImpares:=sTImpares-num/den;
inc(i)
end;
Edit2.Text:=FloatToStr(sTPares);
Edit3.Text:=FloatToStr(sTImpares)
end;
Programa ejecutándose:

3
2) Primos Gemelos
Si a y b son primos y b = a + 2, la pareja (a, b) se llama Primos Gemelos. Por ejemplo
3 y 5 son primos gemelos. Desarrolle una aplicación en la que el usuario decida la
cantidad de pares de primos gemelos a listar.
Siga los siguientes pasos:
1. Crear una nueva aplicación con formulario.
2. En el formulario coloque los siguientes componentes: 1 etiqueta, 1 Cuadro de
edición, 1 control BitBtn y 1 control StrigGrid
3. Modifique las propiedades de los componentes:

Control Propiedad Valor


Form1 Caption Primos Gemelos
Label1 Caption Total de Pares
Edit1 Text ‘‘
StringGrid1 Name Rejilla
BitBtn1 Kind bkClose
Caption &Salir

El programa usara un algoritmo para averiguar si el número ingresado es o no primo


partiendo del hecho que 2 es el primer primo, el cual será el primer valor que almacenara
la variable ant. En caso de ser primo tal número se guardara en la variable sig.
Enseguida se determinara si este par son primos gemelos (si se diferencian en dos) y en
caso de serlo se ubicaran en las celdas del objeto Rejilla.
A continuación se actualiza el dato de la variable ant al ultimo primo encontrado.
Obsérvese también que se usa el contador k para controlar el total de primos gemelos
hallados hasta el momento.
El procedimiento LimpiarRejilla borra todos los datos obtenidos en la última ejecución y
espera que se ingrese un nuevo número de pares. Aspecto de la Interfaz de usuario:

4
Diseñada la interfaz de usuario, asociemos un procedimiento al formulario accionado por
el evento OnCreate.
procedure TForm1.FormCreate(Sender: TObject);
var f,c:byte;
begin
Form1.WindowState:=WsMaximized;
Rejilla.ColWidths[0]:=25;
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.
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
var
ant,sig,contador,j,k:integer;
total:byte;
begin
if key=#13 then
begin
try
LimpiarRejilla(Rejilla);
total:=StrToInt(Edit1.Text);
k:=2;contador:=1;
ant:=2;
while(contador<=total) do
begin
j:=2;
while(k mod j <>0) do
inc(j);
if (k=j)then
begin

5
sig:=k;
if (sig=ant+2)then
begin
Rejilla.Cells[2,contador]:=IntToStr(ant);
Rejilla.Cells[3,contador]:=IntToStr(sig);
inc(contador)
end;
ant:=sig
end;
inc(k)
end;
Edit1.SetFocus;
Edit1.SelStart:=0;
Edit1.SelLength:=Length(Edit1.Text)
except
on EConvertError do
ShowMessage('El número es muy grande')
end
end;
if not (key in ['0'..'9',#8]) then key:=#0
end;
Coloquemos el código de LimpiarRejilla en la sección Implementation:
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;

Programa ejecutándose:

6
3) Multiplicación Mediante Sumas
Desarrollemos un programa que multiplique dos números enteros sin utilizar el operador
“ * “. Resolveremos este problema mediante sumas sucesivas. Por Ejemplo, para hallar
el producto de 4 x 6, el programa debe realizar las siguientes sumas:
0 + 4 = 4
4 + 4 = 8
8 + 4 = 12
12 + 4 = 16
16 + 4 = 20
20 + 4 = 24
Obsérvese que las sumas se realizan tantas veces como indica el segundo factor, de
modo que el producto es la ultima suma.

Siga estos pasos:


1. Crear una nueva aplicación con formulario
2. En el formulario colocar los siguientes componentes: 3 etiquetas, 3 cuadros de
edición y 2 controles BitBtn.
3. Modificar las propiedades de los componentes.

Control Propiedad Valor


Form1 Caption Multiplicación mediante sumas
BorderStyle bsSingle
Label1 Caption &Multiplicando
Label2 Caption M&ultiplicador
Label3 Caption Producto

7
Edit1 Text ‘‘
Edit2 Text ‘‘
Edit3 Text ‘‘
BitBtn1 Kind bkRetry
Caption &Calcular
BitBtn2 Caption &Salir
Kind bkAbort

Aspecto de la Interfaz de usuario:

Asociemos un procedimiento común para los controles Eit1 y Edit2. Este procedimiento
debe impedir el ingreso de caracteres no numéricos en los controles Edit1 y Edit2.
Además, si se presiona la tecla Enter estando el cursor en el control Edit1, el enfoque
debe pasar al control Edit2. Si el cursor está en el control Edit2 y se pulsa Enter, el
enfoque debe pasar al control BitBtn1.

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


begin
if key=#13 then
begin
if Sender=Edit1 then
Edit2.setfocus //Pasa el enfoque al control Edit2.
else
BitBtn1.setfocus; //Pasa el enfoque al control BitBtn1.
end;
//Impide el ingreso de caracteres no numéricos
if not(key in['0'..'9',#8]) then key := #0
end;

Después de digitar el código que antecede en el evento OnKeyPress del control Edit1,
siga los siguientes pasos:

8
1. En el formulario seleccione el control Edit2.
2. Sitúese en la ficha Events del Inspector de Objetos
3. Haga clic en la flecha de bajada que aparece en la columna derecha del evento
que se va a compartir (OnKeyPress) y seleccione el evento de la lista desplegable
(Edit1KeyPress)

Asociemos un procedimiento al botón de comandos Calcular. Este procedimiento debe


calcular el producto de los números ingresados en los controles edit1 y Edit2.
procedure TForm1.BitBtn1Click(Sender: TObject);
var A, B, Producto : Integer;
begin
try
A:=StrToInt(Edit1.Text);
B:=StrToInt(Edit2.Text);
Producto:=0;
while B > 0 do
begin
Producto:=Producto + A;
B:=B - 1;
end;
Edit3.Text:=IntToStr(Producto)
except
//Error de conversión
on EConvertError do
ShowMessage('Uno de los valores es demasiado grande!.');
end
end;

9
Programa ejecutándose:

4) División Mediante Restas


Desarrollemos un programa que divida dos números enteros sin utilizar el operador “ / “.
Un algoritmo que nos permitirá solucionar este problema consiste en repetir restas
sucesivas hasta que la última diferencia sea menor que el divisor. Por ejemplo, para
dividir el número 38 entre 7, deberíamos realizar las siguientes restas:
38 - 7 = 31
31 - 7 = 24 Las cinco sustracciones nos dan el cociente 5,
24 - 7 = 17 y la última, el resto es 3
17 - 7 = 10
10 - 7 = 3

Siga estos pasos:


1. Crear una nueva aplicación con formulario
2. En el formulario colocar: 4 etiquetas, 4 cuadros de edición y 2 controles BitBtn.
3. Modificar las propiedades de los componentes

Control Propiedad Valor


Form1 Caption División mediante restas
BorderStyle bsSingle
Label1 Caption &Dividendo
Label2 Caption Di&visor
Label3 Caption Cociente
Label4 Caption Resto
Edit1 Text ‘‘
Edit2 Text ‘‘
Edit3 Text ‘‘
Edit4 Text ‘‘
BitBtn1 Kind bkRetry
Caption &Calcular

10
BitBtn2 Caption &Salir
Kind bkAbort

Luego de asignar propiedades a cada uno de los controles, la interfaz debe tener el
siguiente aspecto:

Asociemos un procedimiento común a los controles Edit1 y Edit2 que impida el ingreso
de caracteres no numéricos en estos controles. Para ello, siga los dictados en el
programa anterior.
Asociemos un procedimiento al control BitBtn1. Cuando el usuario haga clic en este
botón, el procedimiento debe calcular, mediante restas, la división de los números.

procedure TForm1.BitBtn1Click(Sender: TObject);


var A, B, Contador : Integer;
begin
try
A:=StrToInt(Edit1.Text);
B:=StrToInt(Edit2.Text);
Contador:=0;
while A >= B do
begin
A:=A - B;
Contador:=Contador + 1
end;
Edit3.Text:=IntToStr(Contador);
Edit4.Text:=IntToStr(A);
except

11
//Error de conversión
on EConvertError do
ShowMessage('Uno de los valores es demasiado grande!.');
end
end;

Programa ejecutándose:

5) Total de cifras del Factorial de un Número


Desarrollemos una aplicación que calcule el total de cifras del factorial de un número. El
procedimiento se basa en lo siguiente:
n! = n(n-1)(n-2)…..3*2*1
A = Log(n!) = Log n(n-1)(m-2)…..3*2*1
A = Log(n!) = Log(n) + Log(n-1) + Log(n-2) + …. + Log(3) + Log(2) + Log(1)

Siga estos pasos:


1. Crear una nueva aplicación con formulario.
2. Colocar los siguientes componentes: 2 etiquetas, 2 cuadros de edición, y 2
controles BitBtn. La siguiente ilustración muestra los cambios realizados en las
propiedades de los componentes:

12
Haga doble clic en el control BitBtn. En el controlador de evento que se abre en el
Editor de Código, digite el siguiente código:

procedure TForm1.BitBtn1Click(Sender: TObject);


var A, n, i : double;
begin
try
n:=StrToInt(Edit1.Text);
A:=0;
while n >= 1 do
begin
A:=A + Ln(n)/Ln(10);
n:=n - 1
end;
Edit2.Text:=FloatToStr(Int(A) + 1)
except
on EConvertError do //Error de conversión
ShowMessage('Uno de los valores es demasiado grande!.');
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
BitBtn1.Enabled:=False
end;

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


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

procedure TForm1.Edit1Change(Sender: TObject);


begin

13
if length(Edit1.Text)=0 then
BitBtn1.Enabled:=False
else
BitBtn1.Enabled:=True;
end;

En Delphi la función logaritmo neperiano se expresa como Ln; por eso el logaritmo en
base diez de un número N lo expresamos como:

Ln(n)/Ln(10)

El logaritmo neperiano es el logaritmo en base e. El valor de la constante e es 2.718282


aproximadamente.

Programa ejecutándose:

14

También podría gustarte