Brüche

  • VB.NET

Es gibt 20 Antworten in diesem Thema. Der letzte Beitrag () ist von Artentus.

    Hallo Leute,

    ich habe schon viel gesucht und leider nichts gefunden.
    :(
    Ich möchte zwei Zahlen dividieren und das Ergebnis als Bruch erhalten damit es 100 % genau ist und nicht gerundet.
    Habt ihr eine Idee oder gibt es sogar eine fertige Funktion in VB?

    Vielen Dank im voraus, __JOEY__
    Abend. Der User @Artentus: hat mal eine Klasse hier "veröffentlicht".
    Ist zwar noch nicht ganz perfekt, aber schon sehr gut.
    Hier ist der Link [VB.NET] Unbekannte Dezimalzahl als Bruch
    Mit der Klasse (eigentlich Struktur) kannst du sogar schon rechnen. Cool ist, dass die Brüche direkt gekürzt werden, wenn möglich.
    Danke

    Aber geht es nicht irgendwie etwas kleiner, einfacher und übersichtlicher? ?(

    Da blick ich überhaupt nicht durch :D


    Und wisst ihr ab wie viel Stellen eine Kommazahl (ich benutze double ist das richtig??) als periode gekennzeichnet wird?
    Einfach eine Klasse erstellen und das ganze nutzen. Das sind afaik 2-3 Zeilen Code um damit zu rechnen.
    Wo ist das Problem?
    "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

    Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!
    Sagen wir mal, du hast zwei Zahlen, X und Y. Wenn du X durch Y dividieren willst, ist das Ergebnis X/Y (einfach mal als Bruch vorstellen ;)). Jetzt zählst du von 1-X die Zahlen durch und prüfst dabei, ob die aktuelle Zahl (nennen wir sie mal Z) ein Teiler von X und Y ist. Wenn ja, teilst du beide Zahlen durch Z, speicherst sie ab und beginnst die Schleife von neu. Der Ablauf könnte so aussehen:
    120 geteilt durch 60
    -> 120/60
    -> 60/30 (Z war bei 2)
    -> 30/15 (Z war wieder bei 2)
    -> 10/5 (Z bei 3)
    -> 2/1 (Z bei 5)
    Und schon hast du deinen Bruch :).
    Hey, die Klasse, die LaMiy gepostet hat, ist veraltet und nicht sehr sauber programmiert. Ich hab inzwischen aber eine bessere Programmiert, sie ist Teil von MathUtils:
    [OpenSource] MathUtils 2.4.2 - erweiterte Mathematikbibliothek
    Oder hier der Direktlink zum Code:
    github.com/Artentus/MathUtils/…ter/MathUtils/Rational.cs
    Der größte gemeinsame Teiler lässt sich übrigens effizienter berechnen, als mit nafets Weg:

    VB.NET-Quellcode

    1. Public Shared Function GCD(a As Long, b As Long) As Long
    2. While b <> 0
    3. Dim tmp As Long = b
    4. b = a Mod b
    5. a = tmp
    6. End While
    7. Return a
    8. End Function
    cool

    weißt du wie der befehl heißt um aus einem string an bestimmter position ein zeichen auszulesen?





    oh ich habs einfach x = string(stelle)

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

    Das geht noch kürzer @Artentus :P

    VB.NET-Quellcode

    1. Function gcd(a As Long, b As Long) As Long
    2. If b = 0 Then Return a Else Return gcd(b, a Mod b)
    3. End Function


    @TE:

    String.SubString bitte, das sieht mehr nach nem StringArry aus ;)
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais
    @nafets3646:

    nafets3646 schrieb:

    Ein String ist wenn schon ein Char-Array

    Das ist so nicht richtig. String und Char() sind unterschiedliche Datentypen. Auch wenn in C ein String so nicht vorhanden ist und gerne mal als Char-Array bezeichnet wird, da er aus Chars besteht, ist das trotzdem Umgangssprache. Beides sind zwar ebenfalls Referenztypen, jedoch sind sie nicht das gleiche.

    Strings bestehen aus Chars, und Char() auch, jedoch ist String kein Char().
    Der Name Array passt hier also nicht. Ich würde eher Char-Kette dazu sagen, da sich mehrere Chars aneinander reihen, aber ein Array ist das keinenfalls, denn das zusammen sind unterschiedliche Datentypen, auch wenn man das in anderen Sprachen mal gern so bezeichnet.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

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

    Artentus schrieb:

    Dafür ist meins schneller und weniger Speicherintensiv.
    Ich meine einmal gehört zu haben, ohne es genau zu wissen, das mod sehr inefizient ist, d.h. es zwar schön zu schreiben ist, doch in wirklichkeit dem Prozessor an die Wäsche gegangen wird... Hab leider aber dazu nicht einmal ein Agument, und würde mich freuen, wenn du meine Aussage verneinen könntest ;)
    Mit freundlichen Grüßen



    GVI (Teil1/2): 80%
    Ein String ist eine IList<Char> und ein Char[] ist auch eine IList<Char>. Das Wort "Char-Array" wird wegen diesem Zusammenhang halt gerne verwendet, indem man eine IList<Char> als Char-Array bezeichnet. Im Prinzip ist das auch nicht wirklich falsch, denn ein String kann das selbe wie ein Char[], aber er kann halt noch mehr. Ein String ist also quasi ein verbessertes Char-Array. Wie nahe sich die beiden Klassen stehen sieht man auch daran, dass man sie ineinander konvertieren kann, ohne Informationen zu verlieren (widening-Konvertierung), und dass beide im Speicher fast identisch aussehen.

    @lurker
    Das hängt vom Prozessor (bzw. Mikrocontroller) ab. Wenn Modulo harwareseitig implementiert ist sollte es die gleiche Performance wie Ganzzahlteilung besitzen. Es es jedoch nicht implementiert, so muss das irgendwie so gelöst werden:

    C-Quellcode

    1. int Mod(int a, int b)
    2. {
    3. while (a >= b)
    4. {
    5. a -= b;
    6. }
    7. return a;
    8. }
    Das ist dann natürlich nicht mehr so schnell.
    Ich bin auf dem Gebiet aber nicht sonderlich informiert, also kann ich dir da keine konkrete Antwort mit Beweis liefern.
    Hi
    Modulo ist auch einfach durch eine Division umsetzbar, aber bereits bei der Division ist auf einem x86-Prozessor afaik der Rest einer Division von 2 32-Bit Ganzzahlen in den EDX abgelegt, insofern lädt man einfach das EDX-Register auf den Stapel oder dergleichen und hat Modulo gerechnet. Modulo an sich lässt sich wesentlich effizienter ausdrücken, als durch Artentus' Algorithmus, es ergibt sich einfach zu a - a/b * b, wenn / die abrundende Ganzzahldivision ist (ansonsten halt a - floor(a/b) * b).

    Gruß
    ~blaze~
    @Artentus: Ein String ist keine IList<char> und verwendet intern einen Zeiger ;)
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!: