Papiercomputer [BETA]

    • Beta
    • Closed Source

    Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von freddy6218.

      Papiercomputer [BETA]

      Name:
      Papiercomputer

      Beschreibung:
      Zeigt die Funktionsweise von Computern in ihrer möglichst einfachsten Form.
      Mit den 5 Anweisungen lassen sich sämtliche mathematische Probleme lösen.

      1. stp -
        Stopp/Ende Befehl. Wird diese Zeile erreicht, ist das Programm beendet.
      2. inc -
        Increment Befehl. Der angegebene Zwischenspeicher wird um eins erhöht.
      3. dec -
        Decrement Befehl. Der angegebene Zwischenspeicher wird um eins verringert.
      4. jmp -
        Jump/GoTo Befehl. Springt in die angegebene Programmzeile und setzt das Programm dort fort.
      5. isz -
        Is zero Befehl. Überprüft ob der angegebene Zwischenspeicher gleich 0 ist.
        Falls dies der Fall ist, wird das Programm in der übernächsten Zeile fortgesetzt.
        Ist dies nicht der Fall, wird das Programm in der nächsten Zeile fortgesetzt.
      Codebeispiel:
      //Das ist ein Kommentar
      Befehl # Zwischenspeicher # Codezeile
      isz#1#0


      Beispieldateien für die Grundrechenarten sind beigefügt.
      In den ersten beiden Zwischenspeichern sind...
      z.b. Summand 1 & Summand 2
      Im dritten Zwischenspeicher ist dann das Ergebnis.
      Die anderen Zwischenspeicher werden ggf. als Ablage verwendet :)


      Inspiriert von Wolfgang Backs Know How Computer
      wolfgang-back.com/knowhow_home.php



      Screenshot(s):

      Hauptfenster


      Skripteditor


      Verwendete Programmiersprache(n) und IDE(s):
      Visual C# 2010

      Download(s):
      siehe Anhang

      Lizenz/Weitergabe:
      Freeware

      Changelog:
      28.02.2015
      [+] Skripteditor + Codeüberprüfung
      [+] Kommentare -> Syntax: //Kommentar
      [ ] div. Codeanpassungen

      Dateien

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

      Finde ich wirklich toll. Musste in Schule selbst mal mit so einem ähnlichen Programm arbeiten. Fands recht amüsant :). Ist aber teilweise gar nicht so leicht wie man denken würde.
      Aber toll gemacht.


      Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.

      nafets schrieb:

      Wo ist eigentlich der grundlegende Unterschied zwischen solch einem "Papiercomputer" und Brainfuck?
      Brainfuck ist digital ;) sonst gibt es da keinen Unterschied.
      @nafets

      Ich beziehe mich auf en.wikipedia.org/wiki/Brainfuck#Commands
      . und , sind für die Betrachtung egal, weil sie eine Interaktion mit einem "größeren System" benötigen. Also beispielsweise müsste ein Interpreter darauf warten, dass ein Benutzer Text in eine Entwicklungsumgebung eintippt, was natürlich nicht Teil von Brainfuck selbst ist.

      Brainfuck hat Syntax: [ und ] müssen paarweise bzw. verschachtelt vorkommen, weil sie mehr oder weniger eine While-Schleife darstellen. Der Papiercomputer hat sowas nicht.

      Bei Brainfuck gibt es keine "Argumente". Beispielsweise muss man beim Papiercomputer für jmp die "Zeilennummer" dazuschreiben. Oder bei inc und dec die Nummer der Speicherzelle. Bei Brainfuck gibt's das nicht. Da beziehen sich + und - immer auf die Speicherzelle, auf die der Pointer zeigt.

      Was uns zum nächsten Problem bringt: Brainfuck hat einen Pointer, der Papiercomputer nicht. Genau das nimmt ihm vermutlich die Touring-Vollständigkeit (ich vermute mal, aber beweisen kann ich das nicht). Beim Papiercomputer gibt es keine Möglichkeit, anhand eines Wertes im Speicher die Adresse einer Speicherzelle zu bestimmen. Man müsste alle möglichen Adressen im Code abfragen:
      Eine Menge Code

      C-Quellcode

      1. // Bisschen erweiterte Syntax für Sprungadressen
      2. // In #0 liegt die Adresse
      3. // #1 ist 0
      4. // In #1 soll der Wert an der Adresse abgelegt werden
      5. // Der Wert an der ursprünglichen Adresse wird einfachheitshalber auf 0 gesetzt
      6. isz #0 // Wenn die Adresse 0 ist,
      7. jmp Read0 // dann Speicherzelle 0 lesen,
      8. dec #0 // ansonsten um 1 verringern.
      9. isz #0 // Wenn die Adresse jetzt 0 ist, war sie vorher 1, also
      10. jmp Read1 // also Speicherzelle 1 lesen,
      11. dec #0 // ansonsten wieder um 1 verringern.
      12. isz #0 // Wenn die Adresse jetzt 0 ist, war sie vorher 2... und so weiter
      13. jmp Read2
      14. dec #0
      15. isz #0
      16. jmp Read3
      17. dec #0
      18. // und so weiter
      19. // Hier wird der Wert von der Speicherzelle 0 in die Speicherzelle 1 "verschoben"
      20. Read0:
      21. isz #0
      22. jmp Move0
      23. jmp Continue
      24. Move0:
      25. dec #0
      26. inc #1
      27. jmp Read0
      28. // Und hier von 1 nach 1 (sinnlos, aber es geht ums Prinzip)
      29. Read1:
      30. isz #1
      31. jmp Move1
      32. jmp Continue
      33. Move1:
      34. dec #1
      35. inc #1
      36. jmp Read1
      37. // Und 2
      38. Read2:
      39. isz #2
      40. jmp Move2
      41. jmp Continue
      42. Move1:
      43. dec #2
      44. inc #1
      45. jmp Read2
      46. // Und so weiter
      47. Continue: // Hier wird weiter gemacht, sobald der Wert gelesen ist.

      Das Problem ist, dass man nicht auf alle möglichen Werte reagieren kann, außer man macht den Quellcode unendlich lang, was aber nicht Sinn der Sache ist.

      @enba
      Mich kann niemand daran hindern, Brainfuck mit Stift und Papier auszuführen... oder, wie der TE, den "Papiercomputer" digital ausführen zu lassen.

      @freddy6218
      Ich habe mal mit den Zeilennummern in den ppc-Dateien herumgespielt. Es sieht nicht so aus, als würden die einen Unterschied machen. Ich würde also empfehlen, die ganz weg zu lassen. Bzw wenn ich sie weglasse, fliegt eine IndexOutOfRangeException bei Papiercomputer.frmMain.parseFile.
      Ich würde Dir ganz stark raten, für viele Eingaben Plausibilitätsprüfungen einzubauen. Bei negativen oder zu großen Sprungadressen:

      Quellcode

      1. System.ArgumentOutOfRangeException: InvalidArgument=Value mit dem Wert -1 ist für index ungültig.
      2. Parametername: index
      3. bei System.Windows.Forms.ListView.ListViewItemCollection.get_Item(Int32 index)
      4. bei Papiercomputer.frmMain.doWork(Int32 intLine)
      5. bei Papiercomputer.frmMain.cmdWorkStep_Click(Object sender, EventArgs e)
      6. bei System.Windows.Forms.Control.OnClick(EventArgs e)
      7. bei System.Windows.Forms.Button.OnClick(EventArgs e)
      8. ...
      Oder bei Bananen als Sprungadressen:

      Quellcode

      1. System.FormatException: Die Eingabezeichenfolge hat das falsche Format.
      2. bei System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
      3. bei System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info)
      4. bei System.Int16.Parse(String s, NumberStyles style, NumberFormatInfo info)
      5. bei System.Convert.ToInt16(String value)
      6. bei Papiercomputer.frmMain.doWork(Int32 intLine)
      7. bei Papiercomputer.frmMain.cmdWorkStep_Click(Object sender, EventArgs e)
      8. bei System.Windows.Forms.Control.OnClick(EventArgs e)
      9. bei System.Windows.Forms.Button.OnClick(EventArgs e)
      10. ...
      Ähnliches beim Angeben von ungültigen Speicherzellen-Nummern. Oder wenn man eine Speicherzelle dekrementiert, wenn sie bereits den Wert 0 hat. Oder beim Ausführen ohne geladenen Code.

      Eventuell könntest Du ein etwas anderes Layout verwenden. Denn im Moment kann man die Form nicht maximieren. Und für die Speicherzellen könnte man auch eine Liste mit beliebiger Größe nehmen. Nur auf 8 Speicherzellen beschränkt zu sein, ist etwas umständlich.

      Davon abgesehen funktioniert das Programm gut. Wenn Du Lust hast, kannst Du ja mehrere Befehlssätze implementieren. Also z.B. sowas wie einen Pointer wie bei Brainfuck.
      "Luckily luh... luckily it wasn't poi-"
      -- Brady in Wonderland, 23. Februar 2015, 1:56
      Desktop Pinner | ApplicationSettings | OnUtils
      :) Danke für die Anregungen werd mich mal an die Arbeit machen...

      und ja erwischt hehe hab mich bis jetzt noch nicht um die Fehlerbehandlung gekümmert

      UPDATE
      28.02.2015
      [+] Skripteditor + Codeüberprüfung
      [+] Kommentare -> Syntax: //Kommentar
      [ ] div. Codeanpassungen

      Download siehe ersten Post

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