Estoy haciendo bue.. intentando.. hacer un programa para realizar Ecuaciones de Primer grado, segundo, tercero y hasta lo q me de mi cabezita.
La cosa es q el usuario podra poner por ejemplo:
2x-4+6
Y yo lo q quiero hacer es q pase por unos procedimientos q haran como un filtro y la iran acomodando a la ecuacion para q quede bien formada, la cosa es como hacerlo? xD Solo pido que me expliquen como hacer para sacar el numero 2, el numero 4, el 3 y el 6. Luego yo vere como hacer lo q sigue..
Para estar seguros prueben haciendo con esto:
50x-9+114-32x
Esque intente de todo un poco, asique espero q alguno lo sepa hacer
--------------------------------------------------------------------
Esto lo pedi en la sección de .Net pero como a ustedes les gustan los retos me parecia bien ponerlo aca tamb ya q podria intentar traducirlo luego.
HOLA!!!
Yo quise armarlo eso, muy dificil... Solucion EqWiz (creo que era asi).
GRACIAS POR LEER!!!
Ahí no hay una ecuación. Las ecuaciones son igualdades entre expresiones algebraicas ( 6x + 6 = 18 )
Basicamente tienes que leerte todo esto :
http://www.recursosvisualbasic.com.ar/htm/tutoriales/tutorial-basico5.htm
Y luego de eso usa tu creatividad :D!
HOLA!!!
Cita de: .:WindHack:. en 12 Marzo 2011, 01:05 AM
Ahí no hay una ecuación. Las ecuaciones son igualdades entre expresiones algebraicas ( 6x + 6 = 18 )
Creo que las expresiones que puso se suponia que iban igualadas a 0 osea...
2x-4+6=0
50x-9+114-32x=0
GRACIAS POR LEER!!!
Cita de: 79137913 en 12 Marzo 2011, 03:12 AM
HOLA!!!
Creo que las expresiones que puso se suponia que iban igualadas a 0 osea...
Un número puede alterar todo y no podemos suponer que existe "otro" por ahí. Así que hay que ser concretos y conciso. ;)
.
No quierop sonar pretencioso pero la ecuacion de 1er y 2do Grado pueden ser faciles si:
* Quitamos espcios
* Simpificamos las ecuaciones al maximo.
* Usamos la gerarquia de los operandos con la implementacion de unos Split()
* Usamos tacticas de recursividad ya que esto tiene cierta dificultad.
P.D.: Lo tomare como reto, ya les contare dentro de unos dias como me fue.
Temibles Lunas!¡.
Cita de: .:WindHack:. en 12 Marzo 2011, 03:42 AM
Un número puede alterar todo y no podemos suponer que existe "otro" por ahí. Así que hay que ser concretos y conciso. ;)
Se iguala a cero aqui y en china pára denotar la ecuacion y cumplir las mismas.
(http://upload.wikimedia.org/math/0/9/a/09ae1dfa849c95c09ecf38db22e13636.png)
Ej.
1) 50x-9+114-32x
2) (50-32)x = 9-114
3) x = (9-114) / (50-32)
4) x= (-105)/(18) = -5.83333...333
por lo tanto:
(50-32)(-105)/(18)=9-114
(50-32)(-105)/(18)-9+114=0
Temibles Lunas!¡.
-.
Todas las ecuaciones tienen una forma canónica... tu en tu programa debes requerir que asi vengan... a no ser que quieras hacer un Derive en VB :laugh:
Esperen, yo se hacer las ecuaciones xD se q se iguala a otro numero, pero esq eso ya lo hice, por eso puse q solo pido q hagan esa parte, yo con lo de separar miembros lo hice con un split al "=" pero lo otro me esta costando hacer, esq si sigo usando split para dividir con los signos de + o - (solamente esos para empezar con lo basico y facil) luego tengo q hacer un recorrido para saber cuantas cifras tenia ese numero y eso es lo q no me da la cabeza para hacerlo xD
Por ejemplo 50x-9+114-32x, hago un split al signo de - y me quedaria split[0] = "50x" y split[1] = "9+114" y split[2] = "32x"
Pero ahora para recorrer para atras o para adelante ta dificil xD me confundo.
Si alguien lo puede hacer con esa ecuacion asi como pido en el post principal, le agradezco la verdad
.
@XXX-ZERO-XXX
No se si esto que estoy haciendo te ayude (Lo estoy haciendo para tratar Despejes):
'
' ////////////////////////////////////////////////////////////////
' // Autor: BlackZeroX ( Ortega Avila Miguel Angel ) //
' // //
' // Web: http://InfrAngeluX.Sytes.Net/ //
' // //
' // |-> Pueden Distribuir Este Código siempre y cuando //
' // no se eliminen los créditos originales de este código //
' // No importando que sea modificado/editado o engrandecido //
' // o achicado, si es en base a este código //
' ////////////////////////////////////////////////////////////////
' //
' ////////////////////////////////////////////////////////////////
' 50x-9+114-32x
' (50-32)x = 9-114
' x = (9-114) / (50-32)
Option Explicit
Enum eOperandos
eParentesisI = 0
eParentesisF = 1
ePotencia = 2
eRaiz = 3
eMultiplicacion = 4
eDivicion = 5
eSuma = 6
eResta = 7
End Enum
Private Operandos(0 To 7) As String
' // Ecuación de 1er grado.
'Public Function EcuacionLineal(ByVal vExpresion$) As String'
'Dim str_Exp$()
' str_expr$() = Split(vExpresion$, "=", 2)'
' If UBound(str_expr$) = 1 Then
' ReDim Preserve str_expr$(0 To 1)
' End If
' // Hubicamos los terminos (Incognitas en el lado izquierdo y las constantes en el derecho)
'End Function
Public Function GetParentesis(ByVal vExpresion$) As String
Dim lng_op&(0 To 1) ' // Posicion Inicial/Final
Dim str_bloq$
Dim boo_res As Boolean
lng_op&(1) = InStr(1, vExpresion$, Operandos(eOperandos.eParentesisF))
If (lng_op&(1) <> 0) Then
lng_op&(0) = InStrRev(vExpresion$, Operandos(eOperandos.eParentesisI), lng_op&(1))
If (lng_op&(0) = 0) Then
lng_op&(0) = 1
Else
lng_op&(0) = lng_op&(0) + 1
End If
GetParentesis = Mid$(vExpresion$, lng_op&(0), lng_op&(1) - lng_op&(0))
Else
GetParentesis = vExpresion$
End If
End Function
' // Terminos Semejantes ( Con incognita ).
Public Function ReduccionDeOperandos(ByVal vExpresion$, Optional ByVal Incognita As String = "x") As String
Dim str_spl$()
Dim lng_val#(0 To 1)
Dim lng_ing&(0 To 1)
Dim str_coll$()
Dim lng_c&
Dim str_res$
Dim lng_Opd&
vExpresion$ = Replace$(vExpresion$, " ", "")
vExpresion$ = Replace$(vExpresion$, ",", ".")
If (Len(vExpresion$)) Then
Do
lng_Opd& = BuscarOperando(vExpresion$)
If (lng_Opd& > -1) Then
str_spl$ = Split(vExpresion$, Operandos(lng_Opd&), 2)
If (lng_Opd& = eOperandos.eRaiz) Then
lng_val#(0) = GetVal(str_spl$(UBound(str_spl$)), &H0, False)
str_res$ = Sqr(lng_val#(0))
vExpresion$ = Replace$(vExpresion$, Operandos(lng_Opd&) & lng_val#(0), str_res$)
ElseIf (lng_Opd& <= eOperandos.eResta) Then
lng_val#(0) = GetVal(str_spl$(0), &H0, True)
lng_val#(1) = GetVal(str_spl$(1), &H0, False)
lng_ing&(0) = InStr(1, str_spl$(0), Incognita, vbTextCompare)
lng_ing&(1) = InStr(1, str_spl$(1), Incognita, vbTextCompare)
Select Case lng_Opd&
Case eOperandos.ePotencia
str_res$ = lng_val#(0) ^ lng_val#(1)
Case eOperandos.eMultiplicacion
str_res$ = lng_val#(0) * lng_val#(1)
Case eOperandos.eDivicion
str_res$ = FormatNumber(lng_val#(0) / lng_val#(1), 9)
Case eOperandos.eSuma
str_res$ = lng_val#(0) + lng_val#(1)
Case eOperandos.eResta
str_res$ = lng_val#(0) - lng_val#(1)
End Select
vExpresion$ = Replace$(vExpresion$, lng_val#(0) & Operandos(lng_Opd&) & lng_val#(1), str_res$)
Else
ReduccionDeOperandos = vExpresion$
Exit Function
End If
End If
Loop Until lng_Opd& = -1
End If
ReduccionDeOperandos = vExpresion$
End Function
Public Function BuscarOperando(ByVal vExpresion$, Optional ByVal Reverse As Boolean = False, Optional ByRef Inpos&) As Long
Dim lng_Opd&
lng_Opd& = -1
If (Len(vExpresion$)) Then
For lng_Opd& = 2 To UBound(Operandos)
If (Reverse) Then
Inpos& = InStrRev(vExpresion$, Operandos(lng_Opd&), Len(vExpresion$))
Else
Inpos& = InStr(1, vExpresion$, Operandos(lng_Opd&))
End If
If (Inpos&) Then
Exit For
End If
Next lng_Opd&
If (lng_Opd& = UBound(Operandos) + 1) Then
BuscarOperando = -1
Else
BuscarOperando = lng_Opd&
End If
End If
End Function
Public Function GetVal(ByVal vExpresion$, ByRef OutPos As Long, Optional ByVal Reverse As Boolean = False) As Double
Dim str_res$
If (Len(vExpresion$)) Then
str_res$ = BuscarOperando(vExpresion$, Reverse, OutPos)
If (Reverse) Then
If (str_res$ = -1) Then
OutPos = 1
End If
GetVal = Val(Mid$(vExpresion$, OutPos))
Else
If (str_res$ = -1) Then
GetVal = Val(Mid$(vExpresion$, 1))
OutPos = Len(vExpresion$)
Else
GetVal = Val(Mid$(vExpresion$, 1, OutPos))
End If
End If
End If
End Function
Private Sub Class_Initialize()
Operandos(eOperandos.eParentesisI) = "("
Operandos(eOperandos.eParentesisF) = ")"
Operandos(eOperandos.ePotencia) = "^"
Operandos(eOperandos.eRaiz) = "sqrt"
Operandos(eOperandos.eMultiplicacion) = "*"
Operandos(eOperandos.eDivicion) = "/"
Operandos(eOperandos.eSuma) = "+"
Operandos(eOperandos.eResta) = "-"
End Sub
Ej.
Private Sub Form_Load()
Dim cls_ecuLineal As New cls_ecuLineal
With cls_ecuLineal
Dim str$, str2$
str2$ = "((7 + 4 * 5 + 4)) + 54 + (42) * (4 * (8 / (45 * 10)))*sqrt(9)"
Do
DoEvents
str$ = .GetParentesis(str2$)
If Len(str2$) <> Len(str$) Then
str2$ = Replace(str2, "(" & str$ & ")", .ReduccionDeOperandos(str$))
Else
MsgBox .ReduccionDeOperandos(str$) & vbNewLine & ((7 + 4 * 5 + 4)) + 54 + (42) * (4 * (8 / (45 * 10))) * Sqr(9)
Exit Do
End If
Loop
End With
End Sub
P.D.: Haber si mañana lo termino.
Dulces Lunas!¡.
Ma black, sos un kapo!, siguelo para tener otro codigo mas creado por vs, porq para mi no ya q no entiendo ni la mitad de las cosas q haces xD
Gracias! yo pense q se podia hacer mas simple pero se ve q esta dificil, de ultima terminen este tema como un reto ;)
HOLA!!!
Mirate este codigo, te va a servir para el programa...
http://foro.elhacker.net/programacion_visual_basic/source_multisplit7913_un_split_diferente_xd-t321862.0.html
GRACIAS POR LEER!!!