hej. Det är drygt. Om du kan tänka dig att använda Script-kontrollen som finns i min VB i alla fall. (Vet inte riktigt när den kommit dit.) msscript.ocx kan man lösa ditt exempel ganska enkelt. Det är någon liknande lösning jag har funderat på. Det som jag bvara inte förstå hur jag ska gör är hur jag sdan ska få operatorna som jsut matematiska operatorer, och inte som strängar, Hur ska man omvandla funktionsstängen till en matematisk funktion? Jag kollade upp din sciprt komponenten du tlaade om. Det jag fann var: Microsoft script kontroll 1.0. Du kan skapa en funktion som parsar uttrycket till en form som du sedan lätt skriver en tolk till, t.ex. RPN. Uttrycket ovan, 2*x+2*x^2, skulle då kunna omvandlas till en array [2 x * 2 x 2 pow * +]. Med en liten stackbaserad virtuell maskin kan uttrycket sedan enkelt beräknas. Låter intressant. har du möjlighet att visa någon konkret kod på det? Pers metod är definitivt bäst, och hade jag bara vetat den för två år sen hade mitt Java-projekt varit mycket lättare - gjorde nämligen precis det du vill göra då. Det är de events som kontrollen kan trigga, men den har metoder också, t.ex. Eval. har du möjlighet att visa den konkreta koden du använde för detta? Visst.Funktion
Håller på att göra ettprogram där mattematiska funktioner kommer att var en del utav det.
jag vill att man ska kunna skriva in en matematisk funktion, och sedan räkna ut den med ett värde fårn en variabel eller från en textbox.
Man ska alltså tex kunna mata in 2*x+2*x^2
och sen ska man häma ett värde och stoppa in det i x, för att sedan skriva ut svaret i en annan textbox. Hur gör man detta? Sv: Funktion
Man skulle kunna tänka sig att man har tre vektorer.
En för numeriska värden, en för de olika operatorerna och sedan sätter in x efteråt.
Den sista vektorn använder du när du stegar igenom och måste identifiera vilken typ av data du skall behandla när.
Man stegar igenom varje tecken och identifierar det.
Du får helt enkelt sätta villkor för de olika operatorerna och stega igenom.
Om du har en konstant funktion som du skall behandla är det ju inga problem.
Eller om du har en funktion i sk. normalform.
Sedan kan du skicka med vektorerna till funktionen, men det går inte att returnera en vektor från en funktion (med undantaget av varianter förstås).
Du får göra något som liknar nedanstående:
for i = 1 to len(txtFunktion.text)
if isnumeric(mid(txtFunktion.text,i,1)) then 'Om ett tal finns representerat i den positionen
Sätt det i den tredje vektorn som t.ex. en etta (1) för att markera ett tal.
elseif mid(txtFunktion.text,i,1) = "x" then 'Om x finns på den positionen
Sätt i vektorn att på den positionen finns det tal du skall ha i framtiden
else 'Annars har vi en oparator (möjligt att du måste komplettera denna kodrad)
Identifiera i vektorn med ett heltal vilken typ av operator deet är frågan om
(I detta fall skulle man kunna tänka sig att använda en enumeration)
end if
next i
I varje "sektion" (del-if/else-sats) ska du sedan ange de reella värdena för det du läst in.
Det finns andra lösningar på detta, men jag använder själv en typ ungerfär som den jag skrev nu.
Men eftersom man är lat så orkar man ju inte förklara allt och skriva all kod korrekt.
Det är up till dig som programmerare att sätta dig in i. Jag har ett koncept som fungerar för mig.
Mvh Johan ForsbergSv: Funktion
Tyvärr verkar Eval-funktionen bara finnas i VB-Scripting edition som man kommer åt vid denna kontroll.
SC är alltså scriptkontrollen.
TextF innehåller formeln.
TextX värdet på X
TextR resultatet.
Private Sub Command_Click()
Dim sTmp As String
sTmp = TextF.Text
sTmp = Replace(sTmp, "x", TextX.Text)
TextR.Text = SC.Eval(sTmp)
End SubSv: Funktion
Sv: Funktion
Men de enda tillgänliga va:
Private Sub ScriptControl1_Error()
och
Private Sub ScriptControl1_Timeout()
förstår inte hur jag ska koppla din kod till dessaSv: Funktion
Sv: Funktion
är nämligen inte så värst hajj på detta, även om jag kan grunderna. Sv: Funktion
Min metod funkade också, om dock lite krångligt tills det var i ordning. Du kan ju ha det i åtanke, eller som kuriosa... =)
Jag hade en princip där jag gjorde en sån här metod:
1. Börja på första tecknet och gå till slutet.
2. Om det bara är ett tal, "markera det" och avsluta.
3. Om det bara är en variabel, "markera det" och avsluta.
4. Om man är på en funktion, t.ex. sin[x], så "markerar man sin" och kör samma grej på det inom [] rekursivt.
Då har man fått bort de lättaste fallen.
5. Om det är exakt en operator i strängen (som inte är inom parenteser), delar man upp den i två delar och kör metoden rekursivt på vänstra och högra, samt markerar vilken operator det är.
6. För varje "(" - räkna upp en variabel med 1, för varje ")" räkna ner variabeln med 1. På detta sätt kan man se hur "nivån" man är på ökar och avtar. När man är nere på grundnivå igen så tar man allt mellan ens startpos och ens slutpos och slänger in det rekursivt igen.
Den här metoden skall dessutom startas med att man lägger in parenteser överallt för att göra om uttrycket till enkla uttryck.
Alltså
sin[x+x^2]-2*x^(x+3*y)
blir
sin[x+(x^2)]-(2*(x^(x+(3*y))))
uppenbarligen blir det lite krångligt, men jag fick ändå det att funka ganska lätt. (och principen är ju i stort sett samma oavsett hur man parsar).
Fan nu blev jag sugen på att skriva en vettig parser för funktionsuttryck, kom på massa ideer om hur man kan beräkna gränsvärden och grejer!Sv: Funktion
Men hur avancerade uttryck den kan lösa vet jag inte, provade med 5-6 variabler, lite trigonometri och logaritmer, verkar gå bra, men prestanda har jag ingen aning om.Sv: Funktion
Gärna med kommentarer. Förstår inte riktigt hur ni menar när ni berättar nämligen. Vore jätteschysst :) Sv: Funktion
Jag testade med ett enklet projekt.
Skapa ett nytt projekt med en form. Lägg in Scriptkontrollen och döp den till SC.
Skapa tre textboxar och namnge dem TextF, TextX och TextR.
Lägg till en knapp Command1.
I klickeventet för knappen lägger du in följande kodsnutt.
Private Sub Command1_Click()
Dim sTmp As String
sTmp = TextF.Text ' hämta uttrycket från textboxen till en sträng
sTmp = Replace(sTmp, "x", TextX.Text) ' byr ut x i uttrycket mot värdet i TextX, som alltså är värdet på x
TextR.Text = SC.Eval(sTmp) ' anropa Evalmetoden i scriptkontrollen och skicka med uttrycket, lägg resultatet i TextR
End Sub
Skriv nu ditt uttryck i TextF och värdet på x i TextX och klicka på Knappen, voila.
Man kan naturligtvis upprepa Replace för t.ex. y och z eller vilka fler variabler som ingår i uttrycket.
jag lade in fler textboxar för bl.a. y och z och testade med t.ex. följande uttryck:
log(abs(sin(x)*x^y)+z)/250)
Lägg till felhantering så att du fångar upp när kontrollen anmärker på syntax eller värden.