Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   programa C++ que solicite 2 vectores desde el teclado (https://www.clubdelphi.com/foros/showthread.php?t=61462)

yuNesko 08-11-2008 18:05:55

programa C++ que solicite 2 vectores desde el teclado
 

Hola : pueden ayudarme un poco en la construccion de un programa
, que solicite 2 vectores desde el teclado y calcule su
producto escalar y su producto vectorial en Rn.

no se como pasarlo a la estructura que me enseñaron ; como por ej :

EditNormA->Text=FloatToStr(NormaEuclidiana(va)); Es con interfaz grafica.



coso 08-11-2008 20:31:14

Hola, nos tendrias que poner como es la estructura que quieres llenar. Para pasar un texto a un vector podrias usar algo como esto:

Código:

// formato de vector : (1 2 1 3.4 2)
double *StringToVector(unsigned char *s)
{
    TStrings *ss;
    double *res;
   
    ss = TStringList->Create;

    s = StringReplace(s,"(","",[]);
    s = StringReplace(s,")","",[]);
   
    ss->CommaText = s;
    SetLength(res,ss->Count); // no se si existe en c++. si no fuera asi, se deberia usar getmem(ss,ss->Count*sizeof(double));

    for (int i=0;i<ss->Count;i++)
          res[i] = StrToFloat(ss[i]);

    ss->Free;

    return(res);
}

llamando a la funcion asi

Código:

{
    double *v;

    v = StringToVector("(1 2 1 3)");
    v = StringToVector(Edit1->Text);
    ...
    SetLength(v,0); // o bien freemem(v);
}

Para pasar de vector a string, seria algo asi

Código:

unsigned char *VectorToString(double *v)
{
    unsigned char *s;
    getmem(s,Length(v)*sizeof(unsigned char));

    for(int i=0;i<Length(v);i++)
    s[i] = char(FloatToStr(v[i]));

    return(s);
}

y llamarla con

Código:

{
      unsigned char *s;
      double *v;

      SetLength(v,3);

      v[0] = 1;
      v[1] = 4;
      v[2] = 3;

      s = VectorToString(v);
      ShowMessage(s);

      freemem(s);
      SetLength(v,0);
}

PD : mi C esta bastante oxidado, por lo que seguro que te saltan bastantes errores de compilacion, aparte que se podran usar classes para los vectores y las cadenas.

coso 08-11-2008 20:33:49

Por otra banda, para calcular el producto vectorial en Rn tendras que usar determinantes y, por consiguiente, matrices. Te recomiendo que si no las tienes, te prepares unas clases con los metodos concretos poco a poco (vector, matriznporm, matrizcuadrada, matrizcuadrada->determinante) etc...

coso 08-11-2008 20:35:27

Me he entretenido bastante para responder este post. Dejo aqui el resultado (en delphi)

Código Delphi [-]
unit vect;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type Vector = array of Extended;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Button1: TButton;
    Label1: TLabel;
    Label2: TLabel;
    procedure Button1Click(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

function StringToVector(s : string) : Vector;
var
     ss : TStrings;
     i  : integer;
begin
     ss := TStringList.create;

     s := stringreplace(s,'(','',[]);
     s := stringreplace(s,')','',[]);

     ss.CommaText := s;
     setlength(result,ss.Count);

     for i := 0 to ss.Count - 1 do
     try
     result[i] := strtofloat(ss[i]);
     except
     ShowMessage('Error de formato en ' + s[i]);
     end;
end;

function ProductoEscalar(v1,v2 : Vector): extended;
var
     i : integer;
begin
     if length(v1) <> length(v2) then
     begin
          MessageDLG('Vectores de entrada de diferente dimension',mtError,[mbOK],0);
          exit;
     end;

     result := 0;
     for i := 0 to length(v1) - 1 do
     result := result + v1[i]*v2[i];
end;

function VectorToString(v : vector): string;
var
     i : integer;
begin
     result := '(';
     for i := 0 to Length(v) - 1 do
     result := result + ' ' + formatfloat('0.000',v[i]);

     result := result + ')';
end;

function ProductoVectorial(u,v : Vector) : vector;
begin
     if length(u) <> length(v) then
     begin
          MessageDLG('Vectores de entrada de diferente dimension',mtError,[mbOK],0);
          exit;
     end;

     if length(u) <> 3 then
     begin
          MessageDLG('Producto vectorial limitado a vectores en R³',mtError,[mbOk],0);
          exit;
     end;

     setlength(result,3);

     result[0] := u[1]*v[2] - u[2]*v[1];
     result[1] := u[0]*v[2] - u[2]*v[0];
     result[2] := u[0]*v[1] - u[1]*v[0];
end;

procedure TForm1.Button1Click(Sender: TObject);
var
     v1,v2 : Vector;
begin
     v1 := StringToVector(Edit1.Text);
     v2 := stringToVector(Edit2.Text);

     Label1.Caption := floattostr(ProductoEscalar(v1,v2));
     Label2.Caption := VectorToString(ProductoVectorial(v1,v2));
end;


La franja horaria es GMT +2. Ahora son las 03:30:14.

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