Gå til innhold

Kalkulator - Utregning av mattestykke [LØST]


Anbefalte innlegg

Videoannonse
Annonse

Så TextBox1.Text = Val(TextBox2.Text) betyr at strengen i TextBox2 skal konverteres til individuelle tall og operatorer, og resultatet legges i TextBox1 ?

Tror muligens du må lage funksjonen Val først kanskje ?

Er dersverre enda på det nivået at jeg ikke kan noen av biblotekene til vb.net utenat selv enda :)

Lenke til kommentar

Å snekre seg en Eval()-funksjon (hvilket tolker uttrykk) i et programmeringsspråk kan være en en svært givende og lærerik utfordring og noe jeg absolutt vil anbefale, men om kodeknapphet er et behov, er det ikke problematisk å finne alternative snarveier, eksempelvis den innebyggede kodekompilatoren i .NET:

 

Imports System.Text

Imports System.CodeDom.Compiler

 

Public Class EvalProvider

   Public Shared Function Eval(ByVal vbCode As String, ByVal ParamArray Assemblies() As String) As Object

 

       Dim Compiler As CodeDomProvider = CodeDomProvider.CreateProvider("VB")

       Dim Parameters As New CompilerParameters(Assemblies), Code As New StringBuilder

 

       With Parameters

           .ReferencedAssemblies.Add("system.dll")

           .CompilerOptions = "/t:library"

           .GenerateInMemory = True

       End With

 

       With Code

           .AppendLine("Imports System")

           .AppendLine("Imports System.Math")

           .AppendLine("Namespace Snippet")

           .AppendLine("Class Core")

           .AppendLine("Public Function EvalCode() As Object")

           .AppendLine(vbCode)

           .AppendLine("End Function")

           .AppendLine("End Class")

           .AppendLine("End Namespace")

       End With

 

       ' Compile and execute

       Return Compiler.CompileAssemblyFromSource(Parameters, Code.ToString). _

        CompiledAssembly.CreateInstance("Snippet.Core").EvalCode

 

   End Function

End Class

 

Da kan du kalle EvalProvider.Eval("Return " & Text1.Text) for å tolke innholdet i en tekstboks som helt ordinær VB-kode.

Lenke til kommentar
Å snekre seg en Eval()-funksjon (hvilket tolker uttrykk) i et programmeringsspråk kan være en en svært givende og lærerik utfordring og noe jeg absolutt vil anbefale

Dette har jeg prøvd på, da jeg vil ha mulighet for å regne med litt mer avanserte uttrykk, som f.eks p = e^(j*pi) (altså å kunne bruke imaginære tall, til kompleks utregning av lydtrykk, etc). Men jeg vet jo ikke en gang hvor jeg skal begynne!

 

Begynte å kikke på RegEx, men da ble jeg bare enda mer forvirret... :(

 

 

 

Noen pointers her, Aadnk? :)

Lenke til kommentar

Om du ikke har behov for all verdens nøyaktighet og funksjonalitet, burde de mange trivielle implementasjonene av komplekse tall-klasser på nettet være tilstrekkelig. Her er en VB.NET-variant jeg oversatte direkte fra C#:

 

Imports System

Imports System.Diagnostics

 

<DebuggerDisplay("{Real} + {Imag}i")> _

Public Structure Complex

 

   Public Real As Double

   Public Imag As Double

 

   Public Sub New(ByVal real As Double, ByVal imag As Double)

       Me.Real = real

       Me.Imag = imag

   End Sub

 

   Public ReadOnly Property Conjugate() As Complex

       Get

           Return New Complex(Real, -Imag)

       End Get

   End Property

 

   Public ReadOnly Property Norm() As Double

       Get

           Return Real * Real + Imag * Imag

       End Get

   End Property

 

   Public ReadOnly Property Modulus() As Double

       Get

           Return System.Math.Sqrt(Real * Real + Imag * Imag)

       End Get

   End Property

 

   Public ReadOnly Property Argument() As Double

       Get

           Return System.Math.Atan2(Imag, Real)

       End Get

   End Property

 

   Public Shared Function Polar(ByVal modulus As Double, ByVal argument As Double) As Complex

       Return New Complex(modulus * System.Math.Cos(argument), modulus * System.Math.Sin(argument))

   End Function

 

   Public Shared Operator +(ByVal z1 As Complex, ByVal z2 As Complex) As Complex

       Return New Complex(z1.Real + z2.Real, z1.Imag + z2.Imag)

   End Operator

 

   Public Shared Operator -(ByVal z1 As Complex, ByVal z2 As Complex) As Complex

       Return New Complex(z1.Real - z2.Real, z1.Imag - z2.Imag)

   End Operator

 

   Public Shared Operator *(ByVal z1 As Complex, ByVal z2 As Complex) As Complex

       Return New Complex(z1.Real * z2.Real - z1.Imag * z2.Imag, z1.Real * z2.Imag + z1.Imag * z2.Real)

   End Operator

 

   Public Shared Operator /(ByVal z1 As Complex, ByVal z2 As Complex) As Complex

       Dim value As Double = z2.Real * z2.Real + z2.Imag * z2.Imag

       Return New Complex((z1.Real * z2.Real + z1.Imag * z2.Imag) / value, (z1.Imag * z2.Real - z1.Real * z2.Imag) / value)

   End Operator

 

   Public Shared Operator =(ByVal z1 As Complex, ByVal z2 As Complex) As Boolean

       Return (z1.Real = z2.Real AndAlso z1.Imag = z2.Imag)

   End Operator

 

   Public Shared Operator <>(ByVal z1 As Complex, ByVal z2 As Complex) As Boolean

       Return (z1.Real <> z2.Real OrElse z1.Imag = z2.Imag)

   End Operator

 

   Public Shared Function Cos(ByVal z As Complex) As Complex

       Dim z1 As Complex = Exp(New Complex(-z.Imag, z.Real))

       Dim z2 As Complex = Exp(New Complex(z.Imag, -z.Real))

 

       Return New Complex(0.5 * (z1.Real + z2.Real), 0.5 * (z1.Imag + z2.Imag))

   End Function

 

   Public Shared Function Cosh(ByVal z As Complex) As Complex

       Dim z1 As Complex = Exp(z)

       Dim z2 As Complex = Exp(New Complex(-z.Real, -z.Imag))

 

       Return New Complex(0.5 * (z1.Real + z2.Real), 0.5 * (z1.Imag + z2.Imag))

   End Function

 

   Public Shared Function Sin(ByVal z As Complex) As Complex

       Dim z1 As Complex = Exp(New Complex(-z.Imag, z.Real))

       Dim z2 As Complex = Exp(New Complex(z.Imag, -z.Real))

 

       Return New Complex(0.5 * (z1.Imag - z2.Imag), 0.5 * (z2.Real - z1.Real))

   End Function

 

   Public Shared Function Sinh(ByVal z As Complex) As Complex

       Dim z1 As Complex = Exp(z)

       Dim z2 As Complex = Exp(New Complex(-z.Real, -z.Imag))

 

       Return New Complex(0.5 * (z1.Real - z2.Real), 0.5 * (z1.Imag - z2.Imag))

   End Function

 

   Public Shared Function Tan(ByVal z As Complex) As Complex

       Return Sin(z) / Cos(z)

   End Function

 

   Public Shared Function Tanh(ByVal z As Complex) As Complex

       Return Sinh(z) / Cosh(z)

   End Function

 

   Public Shared Function Exp(ByVal z As Complex) As Complex

       Dim value As Double = System.Math.Exp(z.Real)

 

       Return New Complex(value * System.Math.Cos(z.Imag), value * System.Math.Sin(z.Imag))

   End Function

 

   Public Shared Function Log(ByVal z As Complex) As Complex

       Return New Complex(System.Math.Log(z.Modulus), z.Argument)

   End Function

 

   Public Shared Function Pow(ByVal baseNumber As Complex, ByVal index As Complex) As Complex

       Return Exp(index * Log(baseNumber))

   End Function

 

   Public Shared Function Sqrt(ByVal z As Complex) As Complex

       Dim value As Double = System.Math.Sqrt(z.Real * z.Real + z.Imag * z.Imag) + z.Real

       Return New Complex(System.Math.Sqrt(0.5 * value), System.Math.Sqrt(0.5 / value) * z.Imag)

   End Function

 

   Public Overloads Overrides Function ToString() As String

       Return ([string].Format("{0} + {1}i", Real, Imag))

   End Function

 

   Public Overloads Overrides Function GetHashCode() As Integer

       Return Real.GetHashCode() Xor Imag.GetHashCode()

   End Function

End Structure

 

 

Ettersom strukturen anvender operator overloading, kan den brukes likså den var native (med plus, minus, ect.), slik at eventuelle utreninger forenkles. Den kan såklart òg brukes sammen med Eval()-funksjonen ovenfor, om det gis en referanse til Assembly'et den opptar.

Lenke til kommentar

	Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click, Button1.Click, Button4.Click, Button3.Click, Button11.Click, Button10.Click, Button9.Click, Button14.Click, Button13.Click, Button12.Click, Button17.Click, Button16.Click, Button15.Click, Button20.Click,
	TextBox2.Text &= sender.Text()
End Sub

Plis, for ryddighetens skyld :)

Lenke til kommentar

Det skal jeg begynne med også. Gi kontrollene mine navn med random nummer bak.

 

Så når jeg trykker på Button15, så skal Function29 kjøres, som igjen trigger Event73, som oppdaterer teksten i Text784. Sånn bare for oversiktlighetens skyld.

Lenke til kommentar
Faktisk har du ett poeng der Manfred.

 

Dette vil gjøre at om koden blir stjelt vil det være umulig for tyven å tyde koden.

Synes koden hans så bra ut jeg. Det står jo tross alt button, TextBox etc.

 

Når jeg overtok næringsregnskaps programmet til daTax skal jeg si det var mye morro gitt. Der var det en fet blanding av globale og lokale implisitte (uten prototype) variabler som het a, b, c, d, e, f, g etc. og ja - disse blei brukt over alt!! Det programmet tok det sin tid å rydde opp i ;-) Skreiv om hele greia til OOP og fjernet alt som het a, b, c o.s.v.

Lenke til kommentar

Ja, jeg likte også godt at han hadde en funksjon for Button20 som la til teksten "0" og slikt også, i stedet for EN funksjon som bare legger til knappens tekst. Det gjorde det hele så oversiktlig og fint. Og det er jo ekstremt vanskelig å endre navnene på knappene også, så jeg skjønner jo hvorfor man vil beholde Button20!!

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...