Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


Funktion

Postades av 2004-10-22 21:01:45 - Daniel Tellberg, i forum visual basic - allmänt, Tråden har 10 Kommentarer och lästs av 880 personer

hej.
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?


Svara

Sv: Funktion

Postades av 2004-10-22 21:52:16 - Johan Forsberg

Det är drygt.
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 Forsberg


Svara

Sv: Funktion

Postades av 2004-10-22 22:39:57 - Per-Olof Ohlsson

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.
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 Sub


Svara

Sv: Funktion

Postades av 2004-10-22 23:56:18 - Daniel Tellberg

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?


Svara

Sv: Funktion

Postades av 2004-10-23 00:03:14 - Daniel Tellberg

Jag kollade upp din sciprt komponenten du tlaade om. Det jag fann var: Microsoft script kontroll 1.0.
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 dessa


Svara

Sv: Funktion

Postades av 2004-10-23 00:10:08 - Per Persson

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.


Svara

Sv: Funktion

Postades av 2004-10-23 00:58:27 - Daniel Tellberg

Låter intressant. har du möjlighet att visa någon konkret kod på det?
är nämligen inte så värst hajj på detta, även om jag kan grunderna.


Svara

Sv: Funktion

Postades av 2004-10-23 01:55:28 - Niklas Jansson

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å.

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!


Svara

Sv: Funktion

Postades av 2004-10-23 22:36:43 - Per-Olof Ohlsson

Det är de events som kontrollen kan trigga, men den har metoder också, t.ex. Eval.

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.


Svara

Sv: Funktion

Postades av 2004-10-24 00:30:11 - Daniel Tellberg

har du möjlighet att visa den konkreta koden du använde för detta?
Gärna med kommentarer. Förstår inte riktigt hur ni menar när ni berättar nämligen. Vore jätteschysst :)


Svara

Sv: Funktion

Postades av 2004-10-24 13:53:39 - Per-Olof Ohlsson

Visst.
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.


Svara

Nyligen

  • 19:55 kick-off med fokus på hälsa?
  • 19:53 kick-off med fokus på hälsa?
  • 16:24 Föreslå en skönhetsklinik online
  • 16:23 Föreslå en skönhetsklinik online
  • 18:42 Hvor finder man håndlavede lamper
  • 18:41 Hvor finder man håndlavede lamper
  • 16:36 Allt du behöver veta om keramiskt
  • 16:14 Vem anlitar man egentligen när tak

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 570 718
27 958
271 751
3 326
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies