App-Vorschlag

  • Danke für eure Antworten...
    Verstehen tu ich leider bisher noch nix...

    Ok, also Macmoonshine, nutzt du dafür auch diese Postfix-Schreibweise?

    Rekursiv habe ich schon mal gehört, das muss ich mir anscheinend mal zu gemüte führen.

    Und hab ich das richtig verstanden: Man hat für jeden rechenoperator eine eigene Klasse, also + - * /...
    Diese Klassen haben als Attribute Strings wo dann entweder die zahlen oder Variablen (x, y, etc.) drin stehen. Wenn man nun alles so aufgebrochen hat, dann rechnet man das Rekursiv aus oder anders?
    Gruß

    Robin
  • robin_ schrieb:

    Ok, also Macmoonshine, nutzt du dafür auch diese Postfix-Schreibweise?

    Nö, der Pseudocode ist für Infix-Notation, deswegen behandelt er ja auch Klammern ;) Für die Umgekehrte Polnische Notation findest Du ein Beispiel im Kernighan & Ritchie.

    robin_ schrieb:

    Rekursiv habe ich schon mal gehört, das muss ich mir anscheinend mal zu gemüte führen.

    Rekursiv bedeutet in der Programmierung bzw. Mathematik, dass eine Funktion sich selbst (direkt oder indirekt) aufruft. Der Rekursive Abstieg ist ein Vorgehen im Compilerbau, der auf wechselseitig rekursiven Funktionsaufrufen basiert.

    robin_ schrieb:

    Und hab ich das richtig verstanden: Man hat für jeden rechenoperator eine eigene Klasse, also + - * /...

    Du hast für jeden Operator - genauer für Operatoren mit gleicher Priorität - eine eigene Methode.
    „Meine Komplikation hatte eine Komplikation.“
  • Mh ok, dann werde ich das Projekt wohl verschieben, denn in den ganzen Sachen die jetzt hier im Thread stehen, verstehe ich echt gar nichts :( Weder weiß ich genau was diese Schreibweisen der Mathematik sind, noch bei deinem Pseudocode die Funktionen oder was lookahead sein soll etc.

    wert = punktrechnung(eingabe);

    Als was ist "wert" definiert? Von der Syntax ist das C oder? also mit punktrechnung(eingabe) ruft man ja die funktion punktrechnung auf, dass weiß ich. Nur was ist "eingabe"? Ein String mit "y = 4x-44" oder halt Mathematische Funktionen?

    Das soll hier jetzt bitte nicht falsch verstanden werden, aber das hier ist für mich gerade so, als wenn man noch nie Xcode gestartet hat, noch nie eine App geschrieben hat und dann Eine App schreiben will die CoreData zum speichern hat und eigene Views mit CG zeichnet....

    Und Rekursion hat also keine eigene schreibweise, so wie blocks oder so?

    Also komplett Neuland und deshalb werde ich das "Projekt" denke ich wenn überhaupt verschieben...
    Gruß

    Robin
  • Ein ganz einfache Beispiel für eine Rekursion ist z.B. die Berechnung der Fakultät einer Zahl:

    Quellcode

    1. fakultät_rekursiv(n)
    2. {
    3. wenn n <= 1
    4. dann return 1
    5. sonst return ( n * fakultät_rekursiv(n-1) )
    6. }


    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Ah ok. Fakultät von 3 wäre 1*2*3 ne?

    Also wird sich diese Funktion so lange selber aufrufen, bis das gewünschte Ergebnis da ist.


    Kennt jemand das Mathequiz:

    "Ein Bauer kriegt vom König ein Wunsch frei. Er wünscht sich Reiskörner. Für jedes Feld auf dem Schachbrett soll sich die Anzahl der Reiskörner verdoppeln. Angefangen mit 1, dann 2, dann 4... also 63 mal verdoppeln. Die Frage wäre, wie viele er auf dem Feld x bekommt und wie viele er bis zum Feld x insgesamt mit allen Feldern hat.

    Das müsste man auch Rekursiv lösen oder?
    Gruß

    Robin
  • robin_ schrieb:

    Mh ok, dann werde ich das Projekt wohl verschieben, denn in den ganzen Sachen die jetzt hier im Thread stehen, verstehe ich echt gar nichts :( Weder weiß ich genau was diese Schreibweisen der Mathematik sind, noch bei deinem Pseudocode die Funktionen oder was lookahead sein soll etc.

    wert = punktrechnung(eingabe);

    Als was ist "wert" definiert? Von der Syntax ist das C oder? also mit punktrechnung(eingabe) ruft man ja die funktion punktrechnung auf, dass weiß ich. Nur was ist "eingabe"? Ein String mit "y = 4x-44" oder halt Mathematische Funktionen?

    Das soll hier jetzt bitte nicht falsch verstanden werden, aber das hier ist für mich gerade so, als wenn man noch nie Xcode gestartet hat, noch nie eine App geschrieben hat und dann Eine App schreiben will die CoreData zum speichern hat und eigene Views mit CG zeichnet....

    Und Rekursion hat also keine eigene schreibweise, so wie blocks oder so?

    Also komplett Neuland und deshalb werde ich das "Projekt" denke ich wenn überhaupt verschieben...

    Beim Compilerbau stellst Du Dir den Quelltext, der übersetzt werden soll, als Band vor. In der Regel gehst Du auf dem Band nur vorwärts. Das ist in meinem Pseudocode eingabe. Die Funktion lookahead liefert das nächste Symbol vom Band, ohne vorwärtszugehen (to look ahead = vorausschauen). Ansonsten gehst Du beim Lesen auch immer vorwärts. In C könntest Du einfach einen char-Pointer als Band nehmen.

    Was Du für wert als Datentyp nimmst, hängt von Deinem Problem ab. Im einfachsten Fall kann es ein int sein. Die Funktionen lookahead und punktrechnung könnten in C so aussehen:

    Quellcode

    1. int lookahead(char *eingabe) {
    2. return *eingabe;
    3. }
    4. int punktrechnung(char *eingabe) {
    5. int wert = faktor(eingabe);
    6. while(lookahead(eingabe) == '*' || lookahead(eingabe) == '/') {
    7. char theOperator = *eingabe++;
    8. wert = theOperator = '*' ? wert * faktor(eingabe) : wert / faktor(eingabe);
    9. }
    10. return wert;
    11. }
    Alles anzeigen

    strichrechnung ist analog zu punktrechnung und faktor ist im eine große Fallunterscheidung. Das Ganze sieht am Anfang komplizierter aus, als es ist.
    „Meine Komplikation hatte eine Komplikation.“
  • robin_ schrieb:

    Mh ok.
    Eine Frage noch: Warum verwendest du hier C? Ist das für diesen Zweck einfacher oder Geschmackssache?

    Damit muss ich am wenigsten tippen. In Objective-C kannst Du als Eingabeband einen NSScanner verwenden. Aber dafür hätte ich eine Reihe Methoden nachschlagen müssen und der Code wäre auch länger. ;)

    Thallius schrieb:

    Ich würde sagen weil er keine Lust hatte seinen fertigen Code von damals neu zu tippen

    Nö, ich habe zwar schon in einigen Sprachen so einen Parser geschrieben. Die letzte C-Version ist aber schon vor 15 Jahren auf den Müll geflogen.

    Der Code sollte zwar so funktionieren, aber er ist bestimmt noch verbesserungsfähig; z. B. erlaubt er keine Leerzeichen zwischen den Symbolen...
    Bei größeren Grammatiken würde ich auch eher einen Compilergenerator einsetzen.
    „Meine Komplikation hatte eine Komplikation.“
  • robin_ schrieb:

    Das müsste man auch Rekursiv lösen oder?


    2^(x-1) ist etwas einfacher …
    Xcode 4 sucks – „,Multiple exclamation marks‘, he went on, shaking his head, are a sure sign of a diseased mind.‘“ (Terry Pratchett 1992: Eric)

    "Wir ordnen und befehlen hiermit allen Ernstes, dass die Advocati wollene schwarze Mäntel, welche bis unter das Knie gehen, unserer Verordnung gemäß zu tragen haben, damit man die Spitzbuben schon von weitem erkennt." (Friedrich Wilhelm I., Soldatenkönig)
  • Mh ok...
    Also mit NSScanner?

    Ich wollte gerade ein CharachterSet machen mit =+-*/ um dann gegebenenfalls dort hin zu scannen damit ich das trennen kann um das dann irgendwie auf andere Objekte aufspalten zu können, um es dan rekursiv zu lösen (???)

    Nunja, ich wollte von NSScanner die Methode:

    scanUpToCharactersFromSet:<#(NSCharacterSet *)#> intoString:<#(NSString *__autoreleasing *)#>

    nehmen... aber wie ihr schon sehen könnt, erwartet der einen autoreleasing string aber das geht nicht, da ich ARC benutze... insgesammt sind fast alle NSScaner Methoden mit autoreleasing versehen. Ich kann aber in der Docu auch keien Klasse mit NSScanner finden... also wenn ich nsscanner in Xcode stehen habe und mit Alt-Klick drauf klicke, dann sagt er "No Founds".

    Was soll ich machen?
    Gruß

    Robin
  • Also für diese Postfix-Schreibweise habe ich nun ein Tutorial gefunden, welches erklärt, wie man von der normalen Schreibweise zur Postfix kommt und wie man diese auflöst.
    Soweit eigentlich ganz durchsichtig.

    Nur, in diesen Beispielen war es mit 2*3-4/5...

    Wenn ich aber eine Gleichung wie y=mx+n habe, und m und n ausgefüllt sind, will ich ja "nur" eine gerade zeichnen.
    Dafür müsste ich dann aber für x 1, 2, ...n Werte "eintragen" und ausrechnen, weil ich ja sonst keine Punkte habe, die ich ins KoordinatenSystem zeichnen könnte, oder? Also ich bräuchte dafür eine Wertetabelle oder?
    Gruß

    Robin
  • Wie ich bereits oben geschrieben habe, kannst Du den Term auch in einen Baum umwandeln. In dem sind die inneren Knoten die Operatoren und die Blätter sind entweder Konstanten oder Variablen. Beispielsweise kannst Du 3 * x + 5 durch

    Quellcode

    1. +
    2. / \
    3. * 5
    4. / \
    5. 3 x

    darstellen und den Wert für ein bestimmtes x kannst mit einem In-Order-Durchlauf ermitteln.
    „Meine Komplikation hatte eine Komplikation.“
  • OK, für das Beispiel von zb. 20 = 3x+5 wäre dies ja klar. Man würde das dann in einem Baum oder in die Postfix-Schreibweise umwandeln.

    Aber wenn ja dann X eine konstante ist, würde doch eine Grafische Auswertung keinen Sinn machen oder?

    und: wie würde man mit deinem Baumkonstrukt y=3*x+5 darstellen, also nicht nur 3*x+5??

    Und nochmal zur Frage für Grafische Auswertung: WerteTabelle ja oder nein?
    Gruß

    Robin
  • robin_ schrieb:

    und: wie würde man mit deinem Baumkonstrukt y=3*x+5 darstellen, also nicht nur 3*x+5??

    Auch das Gleichheitszeichen ist ein Operator. Wie könnte der Baum damit wohl aussehen? Das Ergebnis der Auswertung ist dann natürlich keine Zahl mehr sondern nur noch ein boolscher Wert.

    robin_ schrieb:

    Und nochmal zur Frage für Grafische Auswertung: WerteTabelle ja oder nein?

    Was willst Du mit einer Tabelle? Wenn Du einen Knoten für Variablen hast, kannst Du jeden Wert für x einsetzen, den Du willst.

    Mit der Baumdarstellung kannst Du übrigens lustige Sachen machen; z. B. die Gleichung nach x auflösen oder die Ableitung berechnen.
    „Meine Komplikation hatte eine Komplikation.“