Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > Lazarus, FreePascal, Kylix, etc.
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 19-04-2017
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 38
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

Es que esa no es la forma correcta de declarar el inicio y finalizacíon de una función o procedimiento, el formato general sería:
Código:
function Nombre (<parámetros>): tipo retorno;

<const (declaración de constantes locales)>
<type (definición local de tipos)> 
<var (declaración de variables locales)>
  
  <function(<parámetros>): tipo retorno; (declaración de funciones locales)
    begin
      ...
    end>
  <procedure(<parámetros>);         (declaración de procedimientos locales)
    begin
    ...
    end>

begin
  (cuerpo de la función)
end;
Podes usar las funciones o procedimientos de dos modos, habiéndo sido declaradas externas a la función:
Código Delphi [-]
function potencia(...): Integer;
begin
  ...
end;

function factorial(...): Integer;
begin
  ...
end;

function Suma(...): Integer;
begin
  potencia(...);
  factorial(...)
  ...
end;

o como locales a ella:
Código Delphi [-]
function Suma(...): Integer;
...

  function potencia(...): Integer;
  begin
    ...
  end;

  function factorial(...): Integer;
  begin
    ...
  end;

begin
  potencia(...);
  factorial(...);
end;
Las funciones potencia y factorial (locales o externas) podrían escribirse de modo iterativo,
Código Delphi [-]
function potencia( base, expo: Integer ): Integer;
var
  i: Integer;
begin
  Result := 1;
  for i := 1 to expo do
    Result := Result * base;
end;

function factorial( numero: Integer ): Integer;
var
  i: Integer;
begin
  Result := 1;
  for i := 1 to numero do
    Result := Result * i;
end;

o de modo recursivo:
Código Delphi [-]
function potencia(base, expo: Integer): Integer;
begin
  if expo = 0 then
    potencia := 1
  else
    potencia := base * potencia(base, expo - 1);
end;

function factorial(n: Integer): Integer;
begin
  if n = 0 then
    factorial := 1
  else
    factorial := n * factorial( n - 1);
end;
Pero en cualquiera de los casos, contando con las funciones potencia/factorial, la función Suma podría ser:
Código Delphi [-]
function Suma(const x, y: Integer): Double;
var
  i: Integer;

  // ...
  
begin
  Result := 0;
  for i := 0 to y do
    Result := Result + potencia(x, i) / factorial(i);
end;

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #2  
Antiguo 19-04-2017
Daniel2622 Daniel2622 is offline
Miembro
NULL
 
Registrado: abr 2017
Posts: 29
Poder: 0
Daniel2622 Va por buen camino
Hola ecfisa, ya trate de construir un código siguiendo tus recomendaciones.
El programa ya corre, pero al momento de imprimir los valores y calcular el resultado me sale este mensaje:

El proyecto project1 ha lanzado una exepción de la claes 'External:SIGFPE'.

At address 43E83B

Y este es mi nuevo código:

Código Delphi [-]
Function Potencia(b,n:Integer):Integer;
var c,p:Integer;
  begin
    p:=1;
    For c:=1 to n do
    p:=p*b;
    Potencia:=p;
  end;
Function Factorial(n:Integer):Integer;
var c:Integer;f:Longint;
  begin
    f:=1;
    For c:=1 to n do
    f:=f*c;
    Factorial:=f;
  end;
Function Suma(const x,y:Integer)ouble;
var i:Integer;
  begin
    Result:=0;
    For i:=0 to y do
    Result:=Result+(Potencia(x,i)/Factorial(i));
  end;
procedure TForm1.BitBtn1Click(Sender: TObject);
var b,n,p:Integer;
    i:Real;
begin
val(Edit1.Text,n);
p:=Potencia(b,n);
Edit2.Text:=IntToStr(p);
Edit3.Text:=FloatToStr(i);
end;

Esperó y me puedas seguir ayudando.
Saludos y Gracias.
Responder Con Cita
  #3  
Antiguo 19-04-2017
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 38
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

Intentalo de este modo:
Código Delphi [-]
Function Potencia(b,n:Integer):Integer;
var c,p:Integer;
  begin
    p:=1;
    For c:=1 to n do
    p:=p*b;
    Potencia:=p;
  end;

Function Factorial(n:Integer):Integer;
var c:Integer;f:Longint;
  begin
    f:=1;
    For c:=1 to n do
    f:=f*c;
    Factorial:=f;
  end;

Function Suma(const x,y:Integer):double;
var i:Integer;
  begin
    Result:=0;
    For i:=0 to y do
    Result:=Result+ Potencia(x,i) / Factorial(i) ;
  end;

procedure TForm1.BitBtn1Click(Sender: TObject);
var
  a,b: Integer;
  i : Double;
begin
  a := StrToIntDef( Edit1.Text, 0 ); // a : primer argumento de Suma
  b := StrToIntDef( Edit2.Text, 0 ); // b : segundo argumento de Suma
  i := Suma( a, b );                 // i : resultado de Suma

  // mostrar el valor de "i" en Edit3
  Edit3.Text := FloatToStr( i );    
end;

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #4  
Antiguo 19-04-2017
Daniel2622 Daniel2622 is offline
Miembro
NULL
 
Registrado: abr 2017
Posts: 29
Poder: 0
Daniel2622 Va por buen camino
Gracias ecfisa, me sirvió mucho el último código.
Sólo que tengo dos dudas, la primera es:
¿Por qué se utiliza el tipo de retorno "Double"? y ¿Para qué sirve el "StrToIntDef"?

Saludos.
Responder Con Cita
  #5  
Antiguo 20-04-2017
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 38
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.
Cita:
Empezado por Daniel2622 Ver Mensaje
¿Por qué se utiliza el tipo de retorno "Double"?
A fin de obtener un resultado mas fidedigno.

Se podría declarar con un retorno de tipo entero, vg.:
Código Delphi [-]
function SumaInt(const x, y: Integer): Integer;
var
  i: Integer;
begin
  Result := 0;
  for i := 0 to y do
    Result := Result + Trunc(pot(x, i) / fac(i) );
        // ó: Result := Result + pot(x, i) div fac(i);
end;
Pero se pierden decimales por la división entera, ejemplificando: Si enviamos a la función SumaInt como argumentos los valores 3 y 4 nos devuelve como resultado 15, cuando debería ser 16,375

Cita:
Empezado por Daniel2622 Ver Mensaje
y ¿Para qué sirve el "StrToIntDef"?
La función StrToIntDef convierte una cadena en un número entero y de no ser posible la conversión, devuelve el valor por defecto (segundo parámetro), ejemplo:
Código Delphi [-]
var
  n : Integer;
begin
  n := StrToIntDef( 'xxx', 99 );
  Caption := FloatToStr( n ); // Caption = '99'
Usé esa función por que tu código toma los valores a convertir desde dos Edits y el usuario podría introducir un valor que no represente un número válido y por tanto elevar una excepción como sucedería en el caso de usar la función StrToInt.

Por si desearas hacer comprobaciónes, te pongo dos ejemplos con distintos modos:
Código Delphi [-]
...
var
  n : Integer;
begin
  try
    n := StrToInt( Edit1.Text );
  except on E: Exception do
    ShowMessage(E.Message);
  end;
end;

Código Delphi [-]
var
  n : Integer;
begin
  if not TryStrToInt( Edit1.Text, n ) then
    ShowMessage('Edit1 no contiene un entero válido');


Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 20-04-2017 a las 04:04:52.
Responder Con Cita
  #6  
Antiguo 20-04-2017
Daniel2622 Daniel2622 is offline
Miembro
NULL
 
Registrado: abr 2017
Posts: 29
Poder: 0
Daniel2622 Va por buen camino
Muchas gracias ecfisa, me fue de gran ayuda tu explicación.
Saludos.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Consulta Mysql Suma entre rango de fechas kaeltas MySQL 4 22-06-2012 21:30:44
Factorial hasta 1000 Cheswar Varios 29 21-09-2007 20:43:27
Compatibilidad entre aplicaciones ASP.NET entre Delphi 8 .Net y Visual Studio.Net kenyamg .NET 0 21-02-2007 07:30:33
exponente con delphi JODELSA Varios 1 22-06-2005 15:12:22
Calcular exponente [Gunman] Varios 0 18-04-2005 13:28:39


La franja horaria es GMT +2. Ahora son las 03:15:09.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi