Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #21  
Antiguo 22-02-2008
[egostar] egostar is offline
Registrado
 
Registrado: feb 2006
Posts: 6.561
Poder: 25
egostar Va camino a la fama
Este hilo me hace recordar esto......

Salud OS (+)
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney
Responder Con Cita
  #22  
Antiguo 22-02-2008
rauros rauros is offline
Miembro
 
Registrado: feb 2008
Ubicación: Alicante - Sax / Sax - Alicante
Posts: 235
Poder: 17
rauros Va por buen camino
No no es una tarea. En mi país con mi edad nunca piden nada de informática. Lo hago(quiero hacer) porque pienso que es algo útil y que me va a servir de ayuda en el futuro, ya sea como programación y como calculadora. Voy a empezar con algo sencillo, es a traducir algo escrito en un "Tedit" de matemáticas de las que te enseñan en la escuela a RPN (notacion polaca inversa). ¿Por donde debería empezar?
Responder Con Cita
  #23  
Antiguo 22-02-2008
rauros rauros is offline
Miembro
 
Registrado: feb 2008
Ubicación: Alicante - Sax / Sax - Alicante
Posts: 235
Poder: 17
rauros Va por buen camino
Egostar he leído el tema. Los pasos son para calcular una ecuación ya puesta antes. Yo una ecuación siempre sabré simplificarla. El problema es como simplificar una cualquiera, dando igual si lo que pongo es uno o dos incógnitas...

Ejemplo de simplificación:

2x - 15 = 23 / x
x - 15 = 23 / x / 2
x*x - 15 = 23 / 2
x^=11.5-15
x=sqrt(-3.5) (Esta no se podría hacer por que no hay raíz cuadrada de un número negativo...)

En RPN

x2*15-=23x/ (corregidme si me equivoco)
Responder Con Cita
  #24  
Antiguo 22-02-2008
rauros rauros is offline
Miembro
 
Registrado: feb 2008
Ubicación: Alicante - Sax / Sax - Alicante
Posts: 235
Poder: 17
rauros Va por buen camino
Saludillos. Hoy durmiendo (técnicamente entre ayer y hoy) me vino un rayo de luz de inspiración, y he pensado como hacerlo. Es un método poco potente, ya que solo podrá llegar a calcular incógnitas pequeñas o como yo deseé. De ahora en adelante seguiré con este proyecto hasta encontrar un método menos heterodoxo. Necesito que me ayudéis con el código. Si me podéis poner las funciones que deba usar o el código comentado, os lo agradecería nuevamente.

Cogemos 3 "Tedit". En uno de ellos ponemos la parte que está a la izquierda del igual, en el otro ponemos la que está a la derecha. En el otro ponemos que letra se usará para incógnita.

Está hecho a memoria sin comprobar (contad como que las variables ya estuvieran declaradas):

Código Delphi [-]
begin
letraincg=edit3.caption;
for incognita := 1 to 99999 do
{Sutituimos de alguna manera (no se ninguna) lo que iguale letraincg por incognita
Ejemplo:
letraincg=x
pues sustituimos todas las x por el valor de incognita}
ParteIzq=edit1.caption;
ParteDrc=edit2.caption;
If ParteIzq = ParteDrc then begin
{paramos el for (¿¿como se hace??)}
label1.caption='La incognita es '+incognita
end;
end.

Nota: Hasta cuantos for me recomendáis hacer?

Última edición por rauros fecha: 22-02-2008 a las 15:58:25.
Responder Con Cita
  #25  
Antiguo 22-02-2008
Robert01 Robert01 is offline
Miembro
 
Registrado: feb 2006
Ubicación: Córdoba, Argentina
Posts: 895
Poder: 19
Robert01 Va por buen camino
Cita:
Empezado por rauros Ver Mensaje
2x - 15 = 23 / x
x - 15 = 23 / x / 2
x*x - 15 = 23 / 2
x^=11.5-15
x=sqrt(-3.5) (Esta no se podría hacer por que no hay raíz cuadrada de un número negativo...)
No entiendo lo de arriba. Yo creo salvo que hoy esté muy mal que esto va así:

(2x - 15) *x = 23

2x*x - 15 x = 23

x^2 - 7.5x - 11.5 = 0

x = (7.5 + sqrt(7.5^2 + 4*11.5)) / 2

x = (7.5 - sqrt(7.5^2 + 4*11.5)) / 2

Salu2
Responder Con Cita
  #26  
Antiguo 22-02-2008
rauros rauros is offline
Miembro
 
Registrado: feb 2008
Ubicación: Alicante - Sax / Sax - Alicante
Posts: 235
Poder: 17
rauros Va por buen camino
Bueno las ecuaciones dan igual, mirad el código.
Responder Con Cita
  #27  
Antiguo 24-02-2008
rauros rauros is offline
Miembro
 
Registrado: feb 2008
Ubicación: Alicante - Sax / Sax - Alicante
Posts: 235
Poder: 17
rauros Va por buen camino
Saludos. Ahora he hecho esto, pero me da un error de que el valor introducido no es un valor integer.

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
label4.caption:='';
partizq := StrToInt(edit1.text);
partder := StrToInt(edit2.text);
for x := 1 to 100 do
if partizq = partder then begin
label4.caption := IntToStr(x);
end
end;
end.

El problema es que quiero poner 3x = 3x y no puedo, porque no es un valor integer. Yo quiero hacer que si pongo 4x + 2 = 5x - 2 (x=4) no puedo tomar ni sumas, ni restas, ni incógnitas con integer. Como podría hacerlo?
Responder Con Cita
  #28  
Antiguo 24-02-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Cita:
Empezado por rauros Ver Mensaje
Saludos. Ahora he hecho esto, pero me da un error de que el valor introducido no es un valor integer.

El problema es que quiero poner 3x = 3x y no puedo, porque no es un valor integer. Yo quiero hacer que si pongo 4x + 2 = 5x - 2 (x=4) no puedo tomar ni sumas, ni restas, ni incógnitas con integer. Como podría hacerlo?
Obvio, que no vas a poder de ese modo.
StrToInt() sólo va a funcionar si lo que se ingresa es un entero. Si llega a ver un caracter extraño, va a producir una excepción (error).

Veamos como puedo guiarte.
El ejemplo que te voy a dar es muy simple, pero espero que pueda ilustrarte.

Supongamos que tienes dos edits (Edit1 y Edit2). El primero tiene una operación algebraica y el segundo es para mostrar el resultado. A manera de ilustración digamos que tenemos 5 + 12.

Bueno, entonces lo que debemos hacer es inspeccionar caracter a caracter para ver si nos encontramos con un número o una operación.
Hagamos de cuenta que tenemos tres variables: operando1, operando2 y resultado.

En operando1 guardaremos 5, en operando2 guardamos 12, y en resultado pues... 17.
¿Cómo conseguimos esto?
Como sabrás, el contenido de un string puede ser analizado como un vector, de modo que en la posición 1 se ubique el primer caracter, en la 2, el segundo, etc...

De modo que el primer operando será aquel que esté antes del caracter de la operación.

No quiero darte código, quiero invitarte a que lo razones, la idea es:

Código:
1. Mientras Edit1.Text[i] not in Operacion hacer:
1.1. concatenar Edit1.Text[i] en Aux.
2. Convertir Aux en entero y guardarlo en operando1
Operación es un conjunto que está formado por los simbolos que representan las 4 operaciones elementales.

Hagamos el supuesto de que tienes además una variable Operador que guarda el caracter que representa al operador, teniendo esto en mente podemos hacer algo como esto:

Código:
1. En caso de que Operador sea:
1.1. '+' hacer: Resultado = Operando1 + Operando2
1.2. '-' hacer: Resultado = Operando1 - Operando2
1.3. '*' hacer: Resultado = Operando1 * Operando2
1.4. '/' hacer: Resultado = Operando1 / Operando2
¿Se entiende? Debes explorar el contenido del Edit e ir guardando el contenido en sus respectivas variables.

Esto se vincula al hecho de porque te decíamos que estudiaras e investigaras sobre la notación polaca inversa. En notación polaca inversa el operador lo vas a encontrar al final, y para separar un operando de otro puedes usar un caracter "bandera", como puede ser #. De modo que si tienes 5#12+ Lo que haces es encontrar la posición del caracter bandera. Todo lo que esté detrás sera operando1. Localizas a operador (siempre está al final), y lo que esté después de bandera y antes de operador es operando2.

También te hemos dicho que estudies Pos, Legth(), replace... Estas funciones te asistirán a hacer lo que te comento.

Espero haberte guiado un poco.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]

Última edición por Delphius fecha: 24-02-2008 a las 17:57:33.
Responder Con Cita
  #29  
Antiguo 24-02-2008
rauros rauros is offline
Miembro
 
Registrado: feb 2008
Ubicación: Alicante - Sax / Sax - Alicante
Posts: 235
Poder: 17
rauros Va por buen camino
Okey, pero sigo teniendo una duda. Como puedo hacer que hayan variables llamadas operaciones como tantas "banderas" hayan?

Y de lo estudiado yo he entendido:

Pos: ni idea, devuelve datos sin contar la bandera?. Ejemplo:

pos('2#2+','#')=22+ ??

Length: tamaño de el valor seleccionado.

replace: Ni idea. Pero supongo que servirá para sustituir todas las partículas seleccionadas por lo que quieras, como:

replace('a','e','Maria come comida del chino')=Merie come comide del chino ???????

Última edición por rauros fecha: 24-02-2008 a las 21:44:07. Razón: Añadir datos
Responder Con Cita
  #30  
Antiguo 24-02-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Cita:
Empezado por rauros Ver Mensaje
Okey, pero sigo teniendo una duda. Como puedo hacer que hayan variables llamadas operaciones como tantas "banderas" hayan?
¿A que viene esta pregunta?

Creo que no me expliqué adecuadamente. el simbolo que se usa de "bandera", "flag" o como le quieras llamar es algo ficticio. Algo que se usa a modo de control.

En este caso se lo emplea para separar un operando de otro. No existe más de un tipo de bandera. Una manera de definirla es esta:

Código Delphi [-]
const
BANDERA = '#';

Y puedes hacer una comprobación así:

Código Delphi [-]
if Edit1.Text[i] = BANDERA
  then begin
           ShowMessage('Oye! En la posición i del edit se ha encontrado la bandera');
         end;

Cuando dije conjunto de operaciones, me refería a algo como:

Código Delphi [-]
Operaciones = ['+','-','*','/'];

Sugiero que para recibir ayuda, debemos conocer tus avances. A ciegas y sin saber como vás con tu código no te podemos ser de utilidad.
Lamento decirtelo pero los códigos que habías puesto antes no dicen nada de como avanzaste.
¡Te estás ahogando en un vaso con agua! Tranquilo... respira y cuentanos exactamente como estás avanzando.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #31  
Antiguo 24-02-2008
rauros rauros is offline
Miembro
 
Registrado: feb 2008
Ubicación: Alicante - Sax / Sax - Alicante
Posts: 235
Poder: 17
rauros Va por buen camino
Exactamente lo que tengo es poco. Ya que hay errores, y los pongo en comentarios para probar lo poco que tengo ... Tengo :

Código Delphi [-]
program calculadoraalgebra;

uses
  Forms,
  calculadora_de_algebra in 'calculadora_de_algebra.pas' {Form1};

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

Código Delphi [-]
unit calculadora_de_algebra;

interface

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

type
  TForm1 = class(TForm)
    Image1: TImage;
    Edit1: TEdit;
    Edit2: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  incognita: integer;
  partizq: integer;
  partder: integer;
  x: integer;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
Image1.Picture.LoadFromFile('fondo.bmp');
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
label4.caption:='';
partizq := StrToInt(edit1.text);
partder := StrToInt(edit2.text);
for x := 1 to 100 do
if partizq = partder then begin
label4.caption := IntToStr(x);
end
end;
end.

Código Delphi [-]
object Form1: TForm1
  Left = 284
  Top = 177
  Width = 387
  Height = 268
  Caption = 'Form1'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  OnCreate = FormCreate
  PixelsPerInch = 96
  TextHeight = 13
  object Image1: TImage
    Left = 0
    Top = 0
    Width = 377
    Height = 233
  end
  object Label1: TLabel
    Left = 128
    Top = 64
    Width = 119
    Height = 13
    Caption = 'La incógnita siempre es x'
  end
  object Label2: TLabel
    Left = 176
    Top = 32
    Width = 6
    Height = 13
    Caption = '='
  end
  object Label3: TLabel
    Left = 40
    Top = 96
    Width = 51
    Height = 13
    Caption = 'Resultado:'
  end
  object Label4: TLabel
    Left = 96
    Top = 96
    Width = 3
    Height = 13
  end
  object Edit1: TEdit
    Left = 40
    Top = 32
    Width = 121
    Height = 21
    TabOrder = 0
  end
  object Edit2: TEdit
    Left = 200
    Top = 32
    Width = 121
    Height = 21
    TabOrder = 1
  end
  object Button1: TButton
    Left = 152
    Top = 112
    Width = 75
    Height = 25
    Caption = 'Calcular'
    TabOrder = 2
    OnClick = Button1Click
  end
end
Responder Con Cita
  #32  
Antiguo 24-02-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Rauros,
Sigo sin ver donde estás poniendo en práctica todo lo que se vino comentando en el hilo, ni siquiera que estuviera entre comentarios.

Dices que te da errores, ¿Cuáles?¿Donde?

Porque sigues insistiendo en ese código que nada ayuda. ¿Que es ese x?¿Qué es ese 100? ¿Porqué ese for?

Te he dicho que comencemos por acotar el problema. Por empezar en ecuaciones con una incognita.

La pregunta que debes hacerte es ¿Como se resuelve mentalmente esto? Aplicando los principios: si resto de un miembro, debo adicionarlo en el otro, si multiplico, en el otro divido.

Te hemos dados las pistas para que avances... no veo práctica de ellas.
Dime la verdad: ¿Deseas el código?

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #33  
Antiguo 25-02-2008
rauros rauros is offline
Miembro
 
Registrado: feb 2008
Ubicación: Alicante - Sax / Sax - Alicante
Posts: 235
Poder: 17
rauros Va por buen camino
No no lo deseo, no me lo deis. A ver el for lo he puesto porque mi idea es probar si la x=1 y si no probar si x=2 así hasta el 100 o hasta un número que me recomendéis vosotros que no llegue a colapsar una maquina. Luego de lo otro es que como no me vea un ejemplo no voy a saber ponerlo en practica. Sorry ... Y la x pensaba que si yo digo que x=1 luego al escribir en el edit 1+x saldría 2... Ese es uno de los errores que os digo que tengo.

Última edición por rauros fecha: 25-02-2008 a las 16:55:02. Razón: añadir datos
Responder Con Cita
  #34  
Antiguo 27-02-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Bueno si hay algo que no me gusta es que yo quede como el "malo de la película".

Viendo que no hubo nada nuevo por aquí decidí arrojar un poco de luz sobre rauros para ver si con ello se ilumina y entiende por donde van las cosas.

Hice un pequeña función, algo simple, que recibe una ecuación elemental en notación polaca inversa (string) y calcula el resultado (float).

Creería que con este simple ejemplo rauros, y cualquier otro interesado en el tema, podría comprender de como proceder. Bueno... no más rollo aquí va el código:
Código Delphi [-]
function TForm1.CalcularEcuacion(Ecuacion: string): real;
// CalcularEcuacion es una funcion que realiza cálculos de ecuaciones
// simples del tipo: Operando1#Operando2Operador
// Por ejemplo: 21#12+, es equivalente a hacer 21 + 12.
// Los operadores permitidos son: +,-,*,/

// La función puede trabajar con números reales.
// NOTA: no tiene demasiados controles, es sólo una demostración.
const
  FLAG = '#'; // nuestra bandera!
var i,len: integer;
    op1,op2: real; //operandos
    res: real; //resultado
    pos_flag: integer;

    aux: string;
    oper: char;
begin
    res := 0;

    len := Length(Ecuacion);  // calculamos el "tamaño"
    pos_flag := Pos(FLAG,Ecuacion); // obtenemos la posicion de bandera

    // Obtenemos operando 1
    for i := 1 to (pos_flag - 1) do
      Aux := Aux + Ecuacion[i];

    op1 := StrToFloat(Aux);

    //preventiva..
    Aux := '';

    // Obtenemos operando 2
    for i := (pos_flag + 1) to (len - 1) do
       Aux := Aux + Ecuacion[i];

    Op2 :=  StrTofloat(Aux);

   // obtenemos el operador
   oper := Ecuacion[len];

   //calculamos según el operador
   case oper of
   '+': res := Op1 + op2;
   '-': res := op1 - op2;
   '*': res := op1 * op2;
   '/': if op2 <> 0.0
           then res := op1 / op2;
   end; // fin case

   result := res;
end;

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
Respuesta



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
Expresiones en QuickReport (Delphi 7) Carlos A Ortega Impresión 5 12-06-2007 11:55:09
expresiones regulares en sql jonmendi SQL 1 24-12-2004 15:28:39
Expresiones en QReport StartKill Impresión 4 31-05-2004 23:20:29
Expresiones matemáticas Pandre Varios 0 04-09-2003 01:43:49
Expresiones regulares roman Varios 1 18-08-2003 17:08:37


La franja horaria es GMT +2. Ahora son las 19:49:02.


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