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
56
end. - Grbalo en TuCarpeta con el nombre [Link] 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 [Link] 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.
Delphi 7
Ferm Vil
57
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 [Link] 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);
Delphi 7
Ferm Vil
58
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 [Link] 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)?','');
Delphi 7
Ferm Vil
59
end; [Link]:=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 [Link](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 [Link] [Link]
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','')); [Link]:='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 [Link](a:real):real;
Delphi 7
Ferm Vil
60
begin RaizCubica:=exp((1/3)*ln(a)); end; - Grbalo como [Link] [Link] 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; [Link]:=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 [Link](a,b:real):real; begin Suma:=a+b; end; function [Link](a,b:real):real; begin
Delphi 7
Ferm Vil
61
Producto:=a*b; end; - Grbalo como [Link] [Link] 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; [Link]:=salida; end; - Escribe en: El apartado public:
function NIF(dni:integer):string; El apartado implementation:
Delphi 7
Ferm Vil
62
function [Link](dni:integer):string; const letras:string[23]='TRWAGMYFPDXBNJZSQVHLCKE'; begin NIF:=letras[(dni MOD 23)+1]; end; - Grbalo como [Link] [Link] 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; [Link]:=salida; end; - Escribe en el apartado public del mdulo: salida:string; procedure modifica(vari:integer); - Escribe en el apartado implementation del mdulo: procedure [Link](vari:integer); begin vari:=3; salida:=salida+'En el interior del procedure, el dato es = '+IntToStr(vari)+#13+#10; end; - Grbalo como [Link] [Link] y prubalo. - Si todo funciona correctamente aparece:
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 [Link](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 [Link] y el proyecto como [Link] 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 [Link].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; [Link]:=salida;
Delphi 7
Ferm Vil
65
end; - Grbalo como [Link] [Link] 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; [Link]:=salida; end; - Escribe en el apartado public del Unit: function factorial(x:integer):integer; - Escribe en el apartado implementation del mdulo: function [Link](x:integer):integer; begin if x=1 then factorial:=1 else factorial:=x*factorial(x-1); end; - Grbalo como [Link] [Link] 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; [Link]:=salida; end; - Escribe en el apartado public del Unit: function prod(a,b:integer):integer; - Escribe en el apartado implementation: function [Link](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 [Link] [Link] 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; [Link]:=salida; end; - Escribe en el apartado public del Unit: function pot(a,b:integer):integer; - Escribe en el apartado implementation: function [Link](a,b:integer):integer; begin if b=1 then pot:=a else pot:=a*pot(a,b-1); end; - Grbalo como [Link] [Link] 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; [Link]:=sa; end; - Escribe en el apartado public del Unit: sa:string; procedure Cuadrado(n:integer); - Escribe en el apartado implementation del mdulo: procedure [Link](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 [Link] [Link] 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; [Link]:=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 [Link] [Link] 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); [Link]:='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 [Link](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
71
- Grbalo como [Link] [Link] 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); [Link]:=sa; end; - En public: sa:string; function MCD(x,y:integer):integer; function Euler(x:integer):integer; - En implementation: function [Link](x,y:integer):integer; var
Delphi 7
Ferm Vil
72
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 [Link](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 [Link] [Link] 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;
Delphi 7
Ferm Vil
73
begin ano:=StrToInt(InputBox('Ao','','')); if bisiesto(ano) then [Link]:='El Ao '+IntToStr(ano)+' es bisiesto' else [Link]:='El Ao '+IntToStr(ano)+' no es bisiesto'; end; - En public: function bisiesto(x:integer):boolean; - En implementation: function [Link](x:integer):boolean; begin bisiesto:=((x mod 4=0) And (x mod 100<>0)) Or (x mod 400=0); end; - Grbalo como [Link] [Link] 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 [Link]:='El numero '+IntToStr(num)+' no es primo' else [Link]:='El numero '+IntToStr(num)+' es primo'; end; - Apartado public: function Primo(num:integer):integer;
Delphi 7
Ferm Vil
74
- Apartado implementation: function [Link](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 [Link] [Link] 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); [Link]:=sa; end; - Apartado public: sa:string; procedure Primos_Menores(x:integer); function Primo(num:integer):integer; - Apartado implementation: function [Link](num:integer):integer; var
Delphi 7
Ferm Vil
75
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 [Link] [Link] 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); [Link]:=sa; end; - Apartado public: sa:string;
Delphi 7
Ferm Vil
76
function Primo(num:integer):integer; procedure primeros_primos(p:integer); - Apartado implementation: function [Link](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 [Link] [Link] 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
Delphi 7
Ferm Vil
77
- 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; [Link]:=sa; end; - Grbalo como [Link] [Link] 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 [Link] [Link] 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 [Link] [Link] 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:
Delphi 7
Ferm Vil
78
3) Haz un programa de nombre [Link] [Link], 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 [Link] [Link], que sirva para calcular el mdulo de un vector en el espacio, utilizando una funcin.
5) Haz un programa de nombre [Link] [Link], 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 [Link] [Link], 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
79
Recuerda:
3.- El tringulo de Tartaglia no es ms que los resultados de los nmeros combinatorios:
m m! = n!(m n)! n
4.- El programa nos ha de preguntar de entrada el nmero de filas del tringulo.
0 0 1 1 0 1 2 2 2 0 1 2
7) Haz un programa de nombre [Link] [Link] que calcule los 50 primeros trminos de la sucesin de trmino general: (3n + 1) / (2n 1)