PDA

Ver la Versión Completa : Expresiones algebraicas


rauros
20-02-2008, 15:23:04
Saludos. Me gustaría saber como poder obtener la solución de una expresión algebraica de primer y/o segundo grado. Os refresco la memoria porque parece que el único que sigue en el instituto soy yo xD.

1er grado:

x - (3x + 90)/5 = x/3

Creo que x = 1350

2do grado.

y + x = 22 - 3y
2y = 12 - x

Aquí x=2 & y=5

Pues me gustaría saber como se pueden calcular con delphi, a mi no se me ocurre ninguna manera :S.

Ivanzinho
20-02-2008, 16:49:27
Os refresco la memoria porque parece que el único que sigue en el instituto soy yo xD.

1er grado:

x - (3x + 90)/5 = x/3

Creo que x = 1350

Creo que al que hay que refrescar la memoria es a ti ;):).

Lo primero que debes hacer antes de programarlo es saber hacerlo en papel.

Para empezar se me ocurre que deberías analizar la expresión, introducida como un string, identificando cada uno de los operandos de la ecuación separados por + o -. En el ejemplo anterior sería x, -(3x + 90)/5 y x/3 sabiendo en cada momento a que lado del igual se encuentra cada operando.

Expresiones como -(3x + 90)/5 tendrás que descomponerlas hasta llegar a expresiones simples -3x/5, -18. En caso de que haya expresiones complejas dentro de otras expresiones complejas deberías utilizar recusividad.

El siguiente paso sería obtener todos los divisores (aqui tenemos 3 y 5) para hallar em mínimo común múltiplo y eliminarlos. En este caso tendriamos como mínimo común múltiplo el 15.

Una vez calculado el mínimo común multiplo eliminaríamos los divisores, obteniendo una expresión más simple. 15x - 9x - 270 = 5x.

Ahora sólo faltaría calcular el factor que múltiplica la incognita y despejar.

Par el caso en que se tenga dos variables con dos ecuaciones el caso sería paracido a lo comentado anteriormente para despejar una de las variables y luego reemplazar en la otra ecuación para terminar haciendo exactamente los mismos pasos que en el caso anterior.

Ten en cuenta que esto es sólo una idea de como abordar el problema que se me ocurrio sobre la marcha, seguro que analizando se puede llegar a un método mucho mejor, pero para darte un enfoque de como resolver le problema creo que puede valer.

Un saúdo y espero que te sirva de ayuda.

rauros
20-02-2008, 16:57:59
Tranquilo, yo desde la hoja ya se hacerlo, de todas las formas. Lo que pasa es que nunca he usado string. Tengo un libro de delphi 7 pero tiene 1052 paginas, de las cuales solo me he leído 3 jaj. Supongo que habrá que decirle a string separar cada signo de +-/* y excepción al primer número. El problema es que no sé como hacer eso. Yo de mientras iré pensando algo para hacer con cada numero y signo.

Ivanzinho
20-02-2008, 17:08:10
Puedes empezar mirando bucles, recursividad y las funciones Copy, Length, StrToInt, IntToStr, FloatToStr, StrToFloat y StringReplace entre otras. Según vayas avanzando con el proyecto y tengas dudas puedes postearlas y te ayudaremos con gusto.

Un saúdo.

maeyanes
20-02-2008, 17:40:44
Hola...

También es bueno que te documentes sobre la Notación Polaca Inversa (http://es.wikipedia.org/wiki/Notaci%C3%B3n_polaca_inversa) la cual se usa para resolver este tipo de problemas...



Saludos...

ixMike
20-02-2008, 17:59:35
2do grado.

y + x = 22 - 3y
2y = 12 - x

Aquí x=2 & y=5


Temo informarte de que eso no son ecuaciones de segundo grado. De segundo grado son cuando la única incógnita está elevada al cuadrado. Eso que has puesto es un sistema de dos ecuaciones con dos incógnitas.


Salu2.

rauros
20-02-2008, 18:21:28
Lol? Pos estoy equivocado, con lo de segundo grado me quería referir a que tiene más de una incógnita. Perdón.

ixMike
20-02-2008, 18:29:12
Lol? Pos estoy equivocado, con lo de segundo grado me quería referir a que tiene más de una incógnita. Perdón.

jeje :D, no pasa nada, ¡pero que no te oiga el profesor! ;)

rauros
20-02-2008, 18:39:05
Jaj muy buena. Ahora estoy leyendo y intentando entender los comandos. Si lo que yo he entendido de cada uno es (mirad si estoy equivocado):

·Copy De este más bien poco. (¿copiar y pegar?)

·Lenght(s) El tamaño de s en número.

·StrToInt Intenta introducir un valor string a otro integer.

·IntTostr Intenta introducir un valor integer a otro string.

·floatToStr Intenta introducir un valor float (con decimales??) a otro string.

·StringReplace De esté no entendí nada.

Toda la ayuda la intente sacar de la ayuda rápida (f1). Gracias a todos por ayudarme en mis proyectos. Ahora, he leído sobre la notación polaca inversa, pero no sé que se le puede atribuir a lo que quiero hacer :S.

EDITADO: Manejo a la perfección for y if then else por si sirve de algo.

Delphius
20-02-2008, 19:03:12
Hola Rauros,
La explicación viene así:

1. Copy: copia de un string a otro. El primer parámetro es el texto a copiar (puede ser una variable string), el segundo desde que posición empieza a contar, y el tercero la cantidad de caracteres a copiar.

UnString := Copy('Hola mi nick es Delphius',1,4');

En este caso el resultado es 4.

2. Los formatos xxxToyyy no es que intentan introducir, sino que convierten del tipo xxx al tipo yyy. Por ejemplo: StrToInt lo que hace es convertir un string a un integer.

Si acercaste a medias al decir intenta. Pues si el string que se suministra como parámetros es inválido (no reconocido como un número) se producirá un error (mejor dicho excepción).

StringReplace: Reemplaza un string por otro. Recibe en orden, el texto a analizar, el string a reemplazar, el string por cual reemplazar. Y el último parámetro es un tanto "especial" Dependiendo de lo introduzcas puedes hacer que reemplaze todas las ocurrencias, que solamente sea la primera, y/o que sea case sensitive.

EDITO:
El manejo de la notación polaca inversa permite escribir las escuaciones de manera más fácil para hacer las operaciones. Al escribir (a(b + c))/3 + 2
Se te hace más dificil programar el algoritmo de resolución. Pues debes tener en cuenta la posición de los paréntesis e ir resolviendolos en dicho orden:
1) (b + c), digamos que tenemos una variable aux que guarda el valor. Y nos queda: aux = b + c
2) (a*aux), lo que nos lleva a aux = aux * a
3) aux/3, que nos da un aux = aux/3
4) aux + 2, que nos da un aux = aux + 2
5) aux. Queda en aux el valor conseguido.

Con el método de notación polaca inversa, se ingresa los operandos y las operaciones en el orden en que se resuelven, y por tanto te olvidas de los paréntesis y otras operaciones complejas. Si no falla el dedo viene así:
bc+a*3/2+

Que se lee así:
1. bc+: sumar b a c y guardar valor en c, c = c + b
2. ca*: multiplicar c por a y guardar valor en a, a = a * c
3. a3/: dividir el valor de a en 3, guardar en a, a = a/3
4. a2+: sumar 2 a a, guardar valor en a, a = a + 2.

¿Ves la diferencia? La lectura de las operaciones se hace en forma directa. Mientras que con el primero debes ir de "adentro" hacia "afuera"

Espero que esto pueda aclararte una idea, además de este método piensa en un bucle y en sentencias CASE. Creo que con estas pistas, ya te podrías imaginar algún algoritmo.

Por cierto, quisiera preguntarte hasta que tamaño de sistemas de ecuaciones deseas resolver. Porque el algebra tiene una herramienta poderosa para resolver sistemas de ecuaciones. Un método se conoce bajo el nombre de su "inventor": Gauss-Jordan.

Saludos,

maeyanes
20-02-2008, 19:34:30
Hola...


Toda la ayuda la intente sacar de la ayuda rápida (f1). Gracias a todos por ayudarme en mis proyectos. Ahora, he leído sobre la notación polaca inversa, pero no sé que se le puede atribuir a lo que quiero hacer :S.

EDITADO: Manejo a la perfección for y if then else por si sirve de algo.

Para resolver operaciones matemáticas desde un programa, pasándole a este un string del tipo (5 + 8) * 9 (notación Infija), es necesario convertir esa operación a notación postfija (o polaca inversa): 9 * 5 8 +

Para resolver esto necesitas una estructura tipo LIFO (Last In First Out), la más usada es una pila.

En la web puedes encontrar varios algoritmos para convertir de infijo a postfijo.


Saludos...

P.D. Veo que Delphius ya dio una explicación sobre esto...

rauros
20-02-2008, 19:38:55
Lo primero, muchísimas gracias, que se os ve con muchísimo ánimo para ayudar, y yo no puedo hacer nada por vosotros, así que me siento súper agradecido. Empezando, sigo sin entender una cosa. Las operaciones de álgebra tienen un igual en medio, y operaciones a derecha e izquierda. Ejemplo

| izquierda
| |Derecha
| |
a + 4 = 2a //Aquí a = 4



Pues me gustaría que me enseñaran como llegar a transformar eso en la notación polaca inversa.

Yo pienso que esto sería a4+ = a*2 (pero esto no llegaría a ninguna parte en delphi)

NOTA: he leído sobre la eliminación gaussiana pero se ve que tengo la mente aun poco madura para entender esas cosas.

Delphius
20-02-2008, 20:48:35
Rauros, veo que vas entendiendo. La notación hungara te servirá para ir resolviendo las ecuaciones miembro a miembro. Lo que tu deberías resolver es el pasaje de un miembro a otro, al igual que con la notación normal, hasta conseguir que en miembro quede el resultado y en el otro la variable.

Con tu ejemplo sería asi:
a4+ = 2a*
Resto a ambos miembros:
4 = 2a*a-

Y para comprobar que es correcto, sustituímos el valor en dicha ecuación:

4 = 24*4- // Se mutiplica 2 y 4
4 = 84- // se resta 4 a 8
4= 4 // Se cumple la operación

Esto es relativamente simple cuando se trata de una sola ecuación.

Pero cuando se trata de sistemas de m ecuaciones con m incognitas es un poco más lioso. En estos momentos tengo la cabeza en otra parte... y creo estoy mezclando cosas... si logro mantener la mente en calma y recuerdo algo te ayudo.

Saludos,

rauros
20-02-2008, 20:57:11
Si pero a mi el gauss-jordan me parece más difícil que hacer una bomba nuclear con un Mc menú infantil y un litro de horchata...

Delphius
20-02-2008, 21:02:20
rauros, disculpa estuve mezclando temas... gauss-jordan no es útil en este caso...

Nos estamos liando... Supuestamente estamos resolviendo igualación de ecuaciones ¿No es cierto?

Gauss-Jordan es para resolver sistemas de ecuaciones. Es otra cosa.

edite mi mensaje anterior.

Saludos,

rauros
20-02-2008, 21:05:00
Y yo pensando que esto sería algo sencillo... De todos modos no pienso parar de buscar información hasta que no lo termine. Si encuentro algo relacionado lo aviso aquí.

Delphius
20-02-2008, 21:18:56
Y yo pensando que esto sería algo sencillo... De todos modos no pienso parar de buscar información hasta que no lo termine. Si encuentro algo relacionado lo aviso aquí.

Bueno, por fin te diste cuenta de que en ocasiones lo sencillo es realmente más complicado de lo que es.
Lamento haberte mantenido así, pero sabiendo que te estás iniciando preferí buscar el modo en que tu te sientes a buscar a informarte sobre el tema en vez de irte tal vez por una solución barata.

En ocasiones la cura es peor que la enfermedad. Y sabiendo que estás iniciandote, peor aún.

¿Te digo un secreto? Existen componentes Delphi que hacen estos tipos cosas. No los he probado, ni conozco sus nombres. Pero de que los hay es muy seguro.

Si yo te decía que existen estos componentes, muy seguramente no hubiera despertado el interés de comprender la complejidad del tema y haberte formado el sentido lógico. Espero que no lo tomes a mal.
El problema al que puedes ver sometido con estos componentes es:
1. Como instalarlos.
2. Como usarlos.

En torry.net vas a tener más chances de encontrarlos.

Si es para una "tarea", habría que buscar la manera de simplificar el problema ¿No te parece?

rauros
20-02-2008, 21:27:43
No me lo tomo a mal, no quiero una solución barata, yo siempre quiero entender lo que estoy programando, y si en ocasiones no puedo entenderlo, no lo uso. Así que buscaré uno para ver como funciona, y lo pondré por aquí para comentarlo entre todos, ya que yo me voy a marear en las lineas de comentario.

rauros
21-02-2008, 22:57:59
He visto que si que hay una, pero que es de pago :S. Yo no puedo permitirme pagar por tales cosas, así que deberé abandonar por falta de métodos. Es que por mucho que le de vueltas a la cabeza no se si el problema es más matemático o más funciones delphi...

Delphius
22-02-2008, 01:50:27
He visto que si que hay una, pero que es de pago :S. Yo no puedo permitirme pagar por tales cosas, así que deberé abandonar por falta de métodos. Es que por mucho que le de vueltas a la cabeza no se si el problema es más matemático o más funciones delphi...

Rauros, no nos supiste decir de si se trata de una tarea. Si lo estabas haciendo con el fin de practicar no hay problema, pero si se trata de una tarea hazla, al menos presenta lo que hayas entendido.

Independientemente de si se trata de una cuestión de aprender para práctica y/o si es un trabajo, no te rindas. De poder se puede, y en la informática tenemos la regla de que todo se puede.

Si te cuesta tanto, lo que debes hacer es acotar los límites del sistema, achicarlo un poco y trabajar sobre ello, una vez que consigas eso y si ves que te resulta viable continuar ampliarlo.

Saludos,

egostar
22-02-2008, 02:09:56
Este hilo me hace recordar esto...... (http://www.clubdelphi.com/foros/showthread.php?t=50150)

Salud OS (+)

rauros
22-02-2008, 07:12:41
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?

rauros
22-02-2008, 07:27:18
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)

rauros
22-02-2008, 15:54:44
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):


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?

Robert01
22-02-2008, 18:13:33
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

rauros
22-02-2008, 18:45:52
Bueno las ecuaciones dan igual, mirad el código.

rauros
24-02-2008, 17:20:57
Saludos. Ahora he hecho esto, pero me da un error de que el valor introducido no es un valor integer.

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?

Delphius
24-02-2008, 17:52:16
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:

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:

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,

rauros
24-02-2008, 21:34:55
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 ???????

Delphius
24-02-2008, 21:51:33
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:


const
BANDERA = '#';


Y puedes hacer una comprobación así:

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:

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,

rauros
24-02-2008, 23:24:43
Exactamente lo que tengo es poco. Ya que hay errores, y los pongo en comentarios para probar lo poco que tengo ... Tengo :

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.

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.

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

Delphius
24-02-2008, 23:36:30
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,

rauros
25-02-2008, 16:53:59
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.

Delphius
27-02-2008, 17:51:36
Bueno si hay algo que no me gusta es que yo quede como el "malo de la película".:o

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:

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,