Kleiner Taschenrechner

    • Beta
    • Closed Source

    Es gibt 56 Antworten in diesem Thema. Der letzte Beitrag () ist von MircoTuor.

      Hi,

      ich würde mir noch wünschen, dass Klammern wenigstens hervorgehoben werden. Also wenn der Cursor an einer öffnenden Klammer ist, soll diese und die dazugehörige schließende Klammer farblich hervorgehoben werden (Verschachtelung berücksichtigt, und dasselbe natürlich auch umgekehrt, also wenn Cursor an schließender Klammer, entsprechend die öffnende hervorheben).

      Hab dir mal eben eine Art Vorlage zusammengewurschtelt:

      Spoiler anzeigen

      VB.NET-Quellcode

      1. Imports System.Text.RegularExpressions
      2. Public Class frmMain
      3. Sub test()
      4. Dim ci As Integer = rtbCalc.SelectionStart
      5. Dim sl As Integer = rtbCalc.SelectionLength
      6. rtbCalc.SelectionLength = 1
      7. Dim p As String = rtbCalc.SelectedText
      8. rtbCalc.SelectionLength = 0
      9. rtbCalc.SelectionStart = 0
      10. rtbCalc.SelectionLength = rtbCalc.TextLength
      11. rtbCalc.SelectionBackColor = ColorTranslator.FromHtml("#ffffff")
      12. rtbCalc.SelectionColor = ColorTranslator.FromHtml("#000000")
      13. rtbCalc.SelectionLength = 0
      14. If p = "(" Then 'Wenn öffnende Klammer gefunden wird, suche nach schließender
      15. 'Skip ist dazu da, um einen Fund zu überspringen, wenn während des Durchlaufs eine
      16. 'weitere öffnende Klammer gefunden wird. Sonst funktioniert es für verschachtelte
      17. 'Klammern nicht
      18. Dim skip As Integer = 0
      19. For i As Integer = ci To rtbCalc.TextLength
      20. If rtbCalc.Text(i) = "(" Then
      21. skip += 1
      22. Continue For
      23. End If
      24. If rtbCalc.Text(i) = ")" Then
      25. skip -= 1
      26. If skip > 0 Then
      27. Continue For
      28. End If
      29. rtbCalc.SelectionStart = i
      30. rtbCalc.SelectionLength = 1
      31. rtbCalc.SelectionBackColor = ColorTranslator.FromHtml("#aaaaaa")
      32. rtbCalc.SelectionColor = ColorTranslator.FromHtml("#ffffff")
      33. rtbCalc.SelectionStart = ci
      34. rtbCalc.SelectionLength = 1
      35. rtbCalc.SelectionBackColor = ColorTranslator.FromHtml("#aaaaaa")
      36. rtbCalc.SelectionColor = ColorTranslator.FromHtml("#ffffff")
      37. Exit For
      38. End If
      39. Next
      40. End If
      41. If p = ")" Then 'Wenn schließende Klammer gefunden wird, suche nach öffnender
      42. Dim skip As Integer = 0
      43. For i As Integer = ci To 0 Step -1
      44. If rtbCalc.Text(i) = ")" Then
      45. skip += 1
      46. Continue For
      47. End If
      48. If rtbCalc.Text(i) = "(" Then
      49. skip -= 1
      50. If skip > 0 Then
      51. Continue For
      52. End If
      53. rtbCalc.SelectionStart = i
      54. rtbCalc.SelectionLength = 1
      55. rtbCalc.SelectionBackColor = ColorTranslator.FromHtml("#aaaaaa")
      56. rtbCalc.SelectionColor = ColorTranslator.FromHtml("#ffffff")
      57. rtbCalc.SelectionStart = ci
      58. rtbCalc.SelectionLength = 1
      59. rtbCalc.SelectionBackColor = ColorTranslator.FromHtml("#aaaaaa")
      60. rtbCalc.SelectionColor = ColorTranslator.FromHtml("#ffffff")
      61. Exit For
      62. End If
      63. Next
      64. End If
      65. rtbCalc.SelectionStart = ci
      66. rtbCalc.SelectionLength = sl
      67. rtbCalc.SelectionBackColor = ColorTranslator.FromHtml("#ffffff")
      68. rtbCalc.SelectionColor = ColorTranslator.FromHtml("#000000")
      69. End Sub
      70. Private Sub RichTextBox1_Click(sender As Object, e As EventArgs) Handles rtbCalc.Click
      71. test()
      72. End Sub
      73. Private Sub RichTextBox1_KeyUp(sender As Object, e As KeyEventArgs) Handles rtbCalc.KeyUp
      74. test()
      75. End Sub
      76. End Class

      Ist auf die schnelle zusammengefummelt, aber funktioniert super :)

      Bild:


      Download: beispiel_exe_datei.rar


      Link :thumbup:
      Hello World
      Ja ich weiß hab ich vor 1 Std bemerkt, habe es nun gefixxt, gab nämlich Probleme mit den Vorzeichen.
      Werde es bald hochladen, habe jetzt auch MOD mit % ersetzt.


      € So, einfach mal in Startpost gucken, habs neu hochgeladen nun funktionierts auch mit den Vorzeichen und Modulo wurde durch % ersetzt.
      Ihr könnt übrigens auch Dezimalzahlen bei dem Funktionsgraphen angeben (für 'Von', 'Bis' etc)

      € Oh man, habe eben einen neuen Bug mit Modulo entdeckt also nicht wundern wenns da hackt.. Hätte erstmal schauen sollen dachte würde mit % genauso funktionieren wie mit mod, kümmere mich drum.

      Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „RushDen“ ()

      faxe1008 schrieb:

      Ableitung, Integral
      Ist sehr schwer umzusetzen. Sowas erfordert, dass man einen kompletten Baum an Funktionen aufbaut, wobei jede Funktion wiederum aus Funktionen besteht bis runter zu den Konstanten. Jede dieser Funktionen muss sich dann selbst ableiten und integrieren können. Außerdem musst du in der Lage sein, den Baum und Teilbäume umzustellen und zu kürzen.
      Ich habs schon mal versucht und bin kläglich gescheitert. Eigentlich schade, muss ich Mathe-Hausaufgaben wohl doch im Kopf lösen. :(
      :D

      faxe1008 schrieb:

      Nullstellen
      Das ist sogar noch schwerer als obiges. Für ein möglichst korrektes Ergebnis musst du vollständige Polynomdivision durchführen können.
      @Artentus Das Integral ist schwer, das stimmt. Jedoch lässt sich die Ableitung mit f'(x)= (f(x+h)-f(x))/h annähren. Mit h = E-8 liefert es verdammt gute Werte. Die Nullstellen lassen sich mit dem sogenannten Newtonverfahren annähren:
      g=guess= also ein grobes raten wo die Nullstelle liegt:
      g=g-(f(g)/f'(g))
      nach circa 10 maligen Ausführen stimmt das Ergebnis.

      Mit diesem Trick lässt sich auch eine Schnittstelle bestimmen:
      f(x)=h(x) => h(x)-f(x)=0 und nun kann man h(x)-g(x) als neue Funktion g(x) auffassen wodurch sich:
      guess = guess - (g(guess)/g'(guess ))

      und nun wieder zurückschreiben:
      guess = guess - ((h(guess )-g(guess ))/ (h'(guess )-g'(guess ))) => fertig :)

      8-) faxe1008 8-)
      Habs jetzt übrigens wieder gelöst, sollte also alles funktionieren.
      Ich werd mal jetzt schauen ob ich's hinkriege das reinzubauen, was ihr da genannt habt.

      Mal eine Frage zur Ableitung, muss man da einfach die Basis * die Potenz ^ die Potenz - 1 nehmen, bis keine Potenz mehr vorhanden ist bzw keine Variable?

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „RushDen“ ()

      kleines Update:

      -Exponentialfunktion hinzugefügt-
      -2 kleine Rechenfehler verbessert
      -Funktionsgraphenstergröße ist nun Änderbar
      -Ausdrücke mit x können nun so geschrieben werden: 2x3-13, das * wird dann automatisch ergänzt.
      Download im Startpost

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „RushDen“ ()

      Es gibt außerdem noch Verkettete und Produktableitungen:

      Verkettung:
      Spoiler anzeigen
      Beispiel: f(x) = (3x+4)^2
      innere Funktion = 3x+4
      äußere Funktion = x^2

      allgemeine Formel:
      f'(x)= äußere Funktion'(innere Funktion) * innere Funktion'

      also für das obige Beispiel: f'(x)=2(3x+4) * 3


      Produkt:
      Spoiler anzeigen
      Beispiel: f(x) = x * sin(x)
      u(x) = x
      v(x) = sin(x)
      => f'(x) = u'(x) *v(x) + u(x) * v'(x)
      am Beispiel: f'(x)= 1 * sin(x) + x * cos(x)


      Wäre toll wen du das noch mit einbauen könntest und dazu noch die ganzen anderen Algos zur Annährung die ich dir angegeben habe. :D

      Artentus schrieb:

      Nix Annäherungen, entweder ganz oder gar nicht. Das Ziel ist, dass man die exakte Ableitungsfunktion herausbekommt (die Funktion, nicht einzelne Werte).
      Und das Newton-Verfahren ist sowieso die hässlichste Annäherung überhaupt.


      Für sämtliche Dinge die du mit dem Taschenrechner berechnest genügt dir eine Tabelle an Werten - so macht das jeder Taschenrechner, nämlich über Annährung, oder glaubst du das die Dinger das syntaktisch zerlegen und mit dem Term weiterarbeiten, wenn das ganze in einer aktezptablen Geschwindigkeit stattfinden soll (in Bezug auf die Prozessorleistung) :D ? Btw.: Der Newton-Algo ist zwar nicht sehr formschön, tut jedoch was er soll und das in einer akteptablen Zeit, oder kennst du ein schöneres Verfahren 8| ?

      8-) faxe1008 8-)

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „faxe1008“ ()

      Artentus schrieb:

      @faxe1008
      Nix Annäherungen, entweder ganz oder gar nicht. Das Ziel ist, dass man die exakte Ableitungsfunktion herausbekommt (die Funktion, nicht einzelne Werte).
      Und das Newton-Verfahren ist sowieso die hässlichste Annäherung überhaupt.


      Für das was man in der Schule macht, kann man das ja noch umsetzen. Fakt ist, dass man sonst eher die numerischen Methoden anwendet, weil man nicht dann der Ableitungsfunktion bzw. der Stammfunktion, sondern der Ableitung bzw. dem Integral selbst interessiert ist. Zu vielen Funktionen existiert beispielsweise auch gar keine Stammfunktion. Da bekommst du das Integral auch nur numerisch.
      @faxe1008

      Ja ich arbeite gerade an dem Funktionsgraphen, baue noch das zoomen im Graphen ein.

      Bei deinen Beispielen, z.B. bei der Verkettung hät ich eine Frage:

      f'(x)= äußere Funktion'(innere Funktion) * innere Funktion'
      also für das obige Beispiel: f'(x)=2(3x+4) * 3
      ...
      innere Funktion = 3x+4
      äußere Funktion = x^2


      Nicht 2*(3x+4) * 3x+4?
      oder warum die 3? Versteh ich nicht so ganz, was wäre bei z.B:
      f(x) = (8x-3)^3

      Wäre das dann f(x) = 3*(8x-3) * 8?

      und ist das jetzt so gemeint, dass der Benutzer x angibt (also nicht einfach x sondern eine Zahl dafür) und diese dann in die Verkettungsgleichung eingesetzt wird und dann ausgerechnet?
      Weil mein Taschenrechner kann Ausdrücke mit X nicht lösen, wenn X nicht gegeben ist, also bspweise:
      x*x*x+5*8
      zu
      x^3+40
      geht nicht.
      f'(x)= äußere Funktion'(innere Funktion) * innere Funktion'

      in Worten die Ableitung von f(x) ist die innere Funktion in die Ableitung der äußeren eingesetzt und mit der Ableitung der inneren multipliziert.

      f(x) = (8x-3)^3
      innen: 8x-3
      außen: x^3
      f'(x)= 3(8x-3)^2 * 8


      Das ist dafür gedacht, dass wenn du wirklich Artentus Weg folgen willst, weißt wie du diesen Typus von Funktion syntaktisch ableiten kannst ;)

      8-) faxe1008 8-)