Resultados 1 al 6 de 6

Tema: Need Help! Alguien que la tenga mas o menos clara con Delphi??

  1. #1
    Senior Member Avatar de MARS
    Fecha de Ingreso
    01 sep, 05
    Ubicación
    La Plata
    Mensajes
    4,714

    Need Help! Alguien que la tenga mas o menos clara con Delphi??

    Basicamente lo que necesito es ingresar una funcion mediante un TEdit.

    Digamos, Asquerosamente a lo bruto, algo asi:

    function func(x):double;
    begin
    func:=Form1.Edit1.Text;
    end;

    Donde Edit1.Text sea por ejemplo: (exp(-x))-x;

    me estoy rompiendo el mate con eso hace horas, y encima supongo que debe ser una gilada de aquellas.

    btw, para el curioso, el programa es de Busqueda de Raices por Biseccion, Regula Falsi, Punto Fijo, Newton Raphson con tabla de iteraciones detallada, etc, funca todo, lo unico q me falta para dejarlo pipi cucu es eso xD

    Por si a alguien le interesa el .pas

    Código:
    unit AN;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, DB, DBTables, Grids, DBGrids, ComCtrls, ExtCtrls;
    
    type
      TForm1 = class(TForm)
        Panel1: TPanel;
        PageControl1: TPageControl;
        TabSheet1: TTabSheet;
        TabSheet2: TTabSheet;
        TabSheet4: TTabSheet;
        TabSheet5: TTabSheet;
        DataSource1: TDataSource;
        DBGrid1: TDBGrid;
        Table1: TTable;
        Edit1: TEdit;
        Edit2: TEdit;
        Edit3: TEdit;
        Edit4: TEdit;
        Edit5: TEdit;
        Button1: TButton;
        Label1: TLabel;
        Label2: TLabel;
        Label3: TLabel;
        Label4: TLabel;
        Label5: TLabel;
        Edit6: TEdit;
        Edit7: TEdit;
        Edit8: TEdit;
        Edit9: TEdit;
        Edit10: TEdit;
        Label16: TLabel;
        TabSheet3: TTabSheet;
        Label6: TLabel;
        Label7: TLabel;
        Label8: TLabel;
        Label9: TLabel;
        Label10: TLabel;
        DBGrid2: TDBGrid;
        DataSource2: TDataSource;
        Table2: TTable;
        Button2: TButton;
        DataSource3: TDataSource;
        Table3: TTable;
        DBGrid3: TDBGrid;
        Edit11: TEdit;
        Edit12: TEdit;
        Edit13: TEdit;
        Edit14: TEdit;
        Label11: TLabel;
        Label12: TLabel;
        Label13: TLabel;
        Label14: TLabel;
        Button3: TButton;
        DBGrid4: TDBGrid;
        Table4: TTable;
        DataSource4: TDataSource;
        Edit15: TEdit;
        Edit16: TEdit;
        Edit17: TEdit;
        Edit18: TEdit;
        Label15: TLabel;
        Label17: TLabel;
        Label18: TLabel;
        Label19: TLabel;
        Button4: TButton;
        Edit19: TEdit;
        Edit20: TEdit;
        Edit21: TEdit;
        Edit22: TEdit;
        Label20: TLabel;
        Label21: TLabel;
        Label22: TLabel;
        Label23: TLabel;
        DBGrid5: TDBGrid;
        DataSource5: TDataSource;
        Table5: TTable;
        Button5: TButton;
        Edit23: TEdit;
        Label24: TLabel;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure Button3Click(Sender: TObject);
        procedure Button4Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    
    var
      Form1: TForm1;
      var xl,xu,es,imax,iter:double;
      var xr,ea,xrold,test:double;
      var x:double;
      var aux:double;
    
    implementation
    
    function func(x:double):double;
    //var aux:double;
    begin
    
    func:= (exp(-x))-x;
    
    end;
    
    function deriv(x:double):double;
    begin
    
    deriv:=(-exp(-x))-1;
    
    end;
    
    function xpunto(x:double):double;
    begin
    xpunto:=exp(-x);
    end;
    
    function bisect(xl,xu,es,imax:double):double;
    begin
    
    iter:=0;
    ea:=1;
    while (ea > es) and (iter <= imax)
    do
    begin
    
    form1.Table1.Append;
    form1.Table1.FieldByName('ITER').AsFloat := iter;
    form1.table1.FieldByName('AI').AsFloat := xl;
    form1.table1.FieldByName('BI').AsFloat := xu;
    form1.table1.FieldByName('FA').AsFloat := func(xl);
    form1.table1.FieldByName('FB').AsFloat := func(xu);
    
    xrold:=xr;
    xr:= (xl+xu)/2;
    
    form1.table1.FieldByName('RI').AsFloat := xr;
    form1.table1.FieldByName('FRI').AsFloat := func(xr);
    
    iter:=iter+1;
    if (func(xr) <> 0) then
    begin
    aux:=(xr-xrold)/xr;
    
    ea:= abs(aux);
    
    form1.table1.FieldByName('EI').AsFloat := ea;
    
    end;
    test:=func(xl) * func(xr);
    
    if (test<0) then
    begin
    xu:=xr;
    
    end
    else if (test>0) then
    begin
    xl:=xr;
    
    form1.Table1.Post;
    end
    else
    begin
    ea:=0;
    end;
    end;
    bisect:=xr;
    end;
    
    
    function interp(xl,xu,es,imax:double):double;
    begin
    
    iter:=0;
    ea:=1;
    while (ea > es) and (iter <= imax)
    do
    begin
    
    form1.Table2.Append;
    form1.Table2.FieldByName('ITER').AsFloat := iter;
    form1.table2.FieldByName('AI').AsFloat := xl;
    form1.table2.FieldByName('BI').AsFloat := xu;
    form1.table2.FieldByName('FA').AsFloat := func(xl);
    form1.table2.FieldByName('FB').AsFloat := func(xu);
    
    xrold:=xr;
    xr:= xu-((func(xu)*(xu-xl))/(func(xu)-func(xl)));
    
    form1.table2.FieldByName('RI').AsFloat := xr;
    form1.table2.FieldByName('FRI').AsFloat := func(xr);
    
    iter:=iter+1;
    if (func(xr) <> 0) then
    begin
    aux:=(xr-xrold)/xr;
    
    ea:= abs(aux);
    
    form1.table2.FieldByName('EI').AsFloat := ea;
    
    end;
    test:=func(xl) * func(xr);
    
    
    if (test<0) then
    begin
    xu:=xr;
    
    end
    else if (test>0) then
    begin
    xl:=xr;
    
    form1.Table2.Post;
    end
    else
    begin
    ea:=0;
    end;
    end;
    interp:=xr;
    end;
    
    function newton(xl,es,imax:double):double;
    begin
    
    iter:=0;
    ea:=1;
    
    while (ea > es) and (iter <= imax)
    do
    begin
    
    form1.Table3.Append;
    form1.Table3.FieldByName('ITER').AsFloat := iter;
    form1.table3.FieldByName('XI').AsFloat := xl;
    form1.table3.FieldByName('FXI').AsFloat := func(xl);
    
    xrold:=xr;
    xr:= -(func(xl)/deriv(xl))+xl;
    
    form1.table3.FieldByName('XR').AsFloat := xr;
    form1.table3.FieldByName('FXR').AsFloat := func(xr);
    
    iter:=iter+1;
    if (func(xr) <> 0) then
    begin
    aux:=(xr-xl)/xr;
    
    ea:= abs(aux);
    
    form1.table3.FieldByName('EI').AsFloat := ea;
    
    end;
    xl:=xr;
    form1.Table3.Post;
    
    end;
    newton:=xr;
    end;
    
    function punto(xl,es,imax:double):double;
    begin
    
    iter:=0;
    ea:=1;
    
    while (ea > es) and (iter <= imax)
    do
    begin
    
    form1.Table4.Append;
    form1.Table4.FieldByName('ITER').AsFloat := iter;
    form1.table4.FieldByName('XI').AsFloat := xl;
    form1.table4.FieldByName('FXI').AsFloat := func(xl);
    
    xrold:=xr;
    xr:= xpunto(xl);
    
    form1.table4.FieldByName('XR').AsFloat := xr;
    form1.table4.FieldByName('FXR').AsFloat := func(xr);
    
    iter:=iter+1;
    if (func(xr) <> 0) then
    begin
    aux:=(xr-xl)/xr;
    
    ea:= abs(aux);
    
    form1.table4.FieldByName('EI').AsFloat := ea;
    
    end;
    xl:=xr;
    form1.Table4.Post;
    
    end;
    punto:=xr;
    end;
    
    
    {$R *.dfm}
    
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    while(form1.Table1.Bof = false) do
            form1.Table1.Prior;
    While(form1.Table1.IsEmpty<>true)do
            form1.Table1.Delete;
    xl := StrToFloat(edit1.Text);
    xu := StrToFloat(edit2.Text);
    es := StrToFloat(edit3.Text);
    imax := StrToFloat(edit4.Text);
    
    if (abs(xl)=abs(xu))
    then
    MessageDlg('El resultado de Xl + Xu tiene que ser diferente de 0',mtError,[mbOk],0)
    else
    
    Edit5.Text := FloatToStr(bisect(xl,xu,es,imax));
    
    end;
    
    procedure TForm1.Button2Click(Sender: TObject);
    begin
    while(form1.Table2.Bof = false) do
            form1.Table2.Prior;
    While(form1.Table2.IsEmpty<>true)do
            form1.Table2.Delete;
    xl := StrToFloat(edit6.Text);
    xu := StrToFloat(edit7.Text);
    es := StrToFloat(edit8.Text);
    imax := StrToFloat(edit9.Text);
    
    Edit10.Text := FloatToStr(interp(xl,xu,es,imax));
    
    end;
    
    procedure TForm1.Button3Click(Sender: TObject);
    begin
    while(form1.Table3.Bof = false) do
            form1.Table3.Prior;
    While(form1.Table3.IsEmpty<>true)do
            form1.Table3.Delete;
    xl := StrToFloat(edit11.Text);
    es := StrToFloat(edit12.Text);
    imax := StrToFloat(edit13.Text);
    
    Edit14.Text := FloatToStr(newton(xl,es,imax));
    
    end;
    
    procedure TForm1.Button4Click(Sender: TObject);
    begin
    while(form1.Table4.Bof = false) do
            form1.Table4.Prior;
    While(form1.Table4.IsEmpty<>true)do
            form1.Table4.Delete;
    xl := StrToFloat(edit15.Text);
    es := StrToFloat(edit16.Text);
    imax := StrToFloat(edit17.Text);
    
    Edit18.Text := FloatToStr(punto(xl,es,imax));
    
    end;
    
    end.
    Última edición por MARS; 28/05/2008 a las 16:29
    Eclipse Clan Member - RETIRADO - ESTUDIANTES TETRACAMPEON DE AMERICA
    || MARS || Elwyn Server ||
    ~Hell Knight 78~ ~SoulTaker 77~ ~HawkEye 70~
    Powered By:
    Nostromo N52te
    Logitech MX Revolution
    Logitech G15 Gaming Keyboard

  2. #2
    Piip Piiip Avatar de Lawrien
    Fecha de Ingreso
    13 abr, 05
    Ubicación
    Un lugar cósmico
    Mensajes
    3,062

    Re: Need Help! Alguien que la tenga mas o menos clara con Delphi??

    No vas a poder. O sea, necesitás hacerte un parser para poder seccionar la funcion en partes y poder interpretarla.

    Para eso vas a tener que armarte una tablita de precedencia de operadores para ver cual tiene mas peso. La precedencia de un operador indica qué tan "cerca" se agrupan dos expresiones. Por ejemplo, en la expresión 1 + 5 * 3, la respuesta es 16 y no 18, ya que el operador de multiplicación tiene una mayor precedencia que el operador de adición. Los paréntesis pueden ser usados para marcar la precedencia, si resulta necesario. Por ejemplo: (1 + 5) * 3 es 18.

    Una vez que tenés eso, spliteas la función por los operadores, casteas los numeros a float y dependiendo del operador le decís que haga tal operación comparando en un case.

    Para cálculos numéricos supongo que podés ahorrarte mucho trabajo sacando de la función sólo los valores que te hagan falta, pero te va a quedar algo muy acotado... o sea, no vas a poder meterle cualquier función esperando que funcione joya.

  3. #3
    Senior Member Avatar de MARS
    Fecha de Ingreso
    01 sep, 05
    Ubicación
    La Plata
    Mensajes
    4,714

    Re: Need Help! Alguien que la tenga mas o menos clara con Delphi??

    Cita Iniciado por Lawrien Ver Mensaje
    No vas a poder. O sea, necesitás hacerte un parser para poder seccionar la funcion en partes y poder interpretarla.

    Para eso vas a tener que armarte una tablita de precedencia de operadores para ver cual tiene mas peso. La precedencia de un operador indica qué tan "cerca" se agrupan dos expresiones. Por ejemplo, en la expresión 1 + 5 * 3, la respuesta es 16 y no 18, ya que el operador de multiplicación tiene una mayor precedencia que el operador de adición. Los paréntesis pueden ser usados para marcar la precedencia, si resulta necesario. Por ejemplo: (1 + 5) * 3 es 18.

    Una vez que tenés eso, spliteas la función por los operadores, casteas los numeros a float y dependiendo del operador le decís que haga tal operación comparando en un case.

    Para cálculos numéricos supongo que podés ahorrarte mucho trabajo sacando de la función sólo los valores que te hagan falta, pero te va a quedar algo muy acotado... o sea, no vas a poder meterle cualquier función esperando que funcione joya.
    Gracias Law, es lo que se me habia ocurrido realmente, pero es un bardo, es mas, lo estube intentando de hacer, y con funciones simples me daba, pero donde calso algun logaritmo, o e me tira cualquier fruta..
    Eclipse Clan Member - RETIRADO - ESTUDIANTES TETRACAMPEON DE AMERICA
    || MARS || Elwyn Server ||
    ~Hell Knight 78~ ~SoulTaker 77~ ~HawkEye 70~
    Powered By:
    Nostromo N52te
    Logitech MX Revolution
    Logitech G15 Gaming Keyboard

  4. #4
    Piip Piiip Avatar de Lawrien
    Fecha de Ingreso
    13 abr, 05
    Ubicación
    Un lugar cósmico
    Mensajes
    3,062

    Re: Need Help! Alguien que la tenga mas o menos clara con Delphi??

    Cita Iniciado por Ranura Ver Mensaje
    Gracias Law, es lo que se me habia ocurrido realmente, pero es un bardo, es mas, lo estube intentando de hacer, y con funciones simples me daba, pero donde calso algun logaritmo, o e me tira cualquier fruta..
    Sep, es bastante jodido de hacer... o sea, probablemente te lleve el doble de tiempo de lo que te llevó hacer lo que hiciste hasta ahora. Pensá que hay programas como mathlab que se dedican especialmente al cálculo y graficación de funciones... fácil no es

    Lo que podrías hacer es que en algún lado definas el grado de los polinomios y dependiendo de esto te muestre X cantidad de edits donde cargues los datos de los coeficientes. Sólo te serviría para polinomios pero bue...

  5. #5
    Soy SaikO Avatar de Zildaie
    Fecha de Ingreso
    13 abr, 05
    Ubicación
    no te importa
    Mensajes
    1,241

    Re: Need Help! Alguien que la tenga mas o menos clara con Delphi??

    que groso es leer todo esto y no saber de que mierda se habla.

  6. #6
    Der Teufel Avatar de Von Satan
    Fecha de Ingreso
    31 oct, 04
    Ubicación
    Die Hölle
    Mensajes
    945

    Re: Need Help! Alguien que la tenga mas o menos clara con Delphi??

    Ese programita lo haces porque estas al pedo o porque lo necesitas? si lo necesitas, ya hay muchos de ese estilo dando vueltas y muy potentes.
    Consejo, no pierdas tu tiempo con delphi, aprende C++

Temas Similares

  1. Busco a alguien que la tenga clara
    Por MANDIGAN2 en el foro General
    Respuestas: 2
    Último Mensaje: 13/11/2007, 02:08
  2. Respuestas: 3
    Último Mensaje: 22/01/2005, 11:22

Permisos de Publicación

  • No puedes crear nuevos temas
  • No puedes responder temas
  • No puedes subir archivos adjuntos
  • No puedes editar tus mensajes
  •  

ESCORTS Capital Federal | ESCORTS Zona Sur | ESCORTS Zona Norte | ESCORTS Zona Oeste | ESCORTS Mar del Plata | ESCORTS La Plata | ESCORTS Cordoba | ESCORTS Rosario | ESCORTS Tucuman | Escorts Almagro | Escorts Belgrano | Escorts Caballito | Escorts Centro | Escorts Flores | Escorts Microcentro | Escorts Once | Escorts Palermo | Escorts Recoleta | Escorts Tribunales | Escorts Devoto | Escorts Villa Urquiza | Escorts Caba