2017-11-04 5 views
0

Ich bin ein Anfänger C-Programmierer und ich versuche, ein Programm zu machen, das den Benutzer nach einer booleschen Funktion fragt, dann druckt die Wahrheitstabelle.Wie erstellt man eine Wahrheitstabelle basierend auf Benutzereingaben

!b && (a || d) 

Wie könnte ich den Benutzer zur Eingabe frage der Booleschen Ausdruck, und es dann im Code später verwenden:

Der Benutzer würde Eingabe als Booleschen Ausdruck wie diese angeben?

+1

was meinst du? Bitte geben Sie ein Beispiel an – bolov

+0

Diese Frage ist nicht sehr klar. Ich schlage vor, Sie beginnen mit der Beschreibung der Eingabe und der gewünschten Ausgabe, z. Welchen Text erwarten Sie von einem Benutzer? –

+0

Dies scheint * way * zu breit. Bitte nehmen Sie sich etwas Zeit, [die Hilfeseiten] (http://stackoverflow.com/help) zu lesen, besonders die Abschnitte mit dem Namen ["Welche Themen kann ich hier fragen?"] (Http: // stackoverflow.com/help/on-topic) und ["Welche Art von Fragen sollte ich vermeiden zu fragen?"] (http://stackoverflow.com/help/dont-ask). Auch bitte [nehmen Sie die Tour] (http://stackoverflow.com/tour) und [lesen Sie, wie man gute Fragen stellt] (http://stackoverflow.com/help/how-to-ask). Zuletzt erfahren Sie, wie Sie ein [minimales, vollständiges und verifizierbares Beispiel] (http://stackoverflow.com/help/mcve) erstellen können. –

Antwort

1

Wie die Kommentare erwähnt haben, ist dies typischerweise ein mehrstufiger Prozess. Ich habe meine eigene truth table generator gebaut, die nach dem funktioniert, was Sie vorschlagen. Der allgemeine Prozess, dies zu tun sieht ungefähr so ​​aus:

  • Scanning: Die Eingabe von dem Benutzer erhältst, ist ein roher String, der nur eine Reihe von Zeichen. Sie müssen schließlich von dieser Zeichenfolge zu einer internen Darstellung gelangen, die angibt, was die Zeichenfolge "bedeutet". Der erste Schritt dabei ist typischerweise, die Eingabe auseinander zu brechen, so dass Sie die Eingabe als eine Folge einzelner logischer Einheiten sehen. Zum Beispiel könnten brechen Sie die Eingabe a && !b || (c && d) in die Sequenz [a], [&&], [!], [b], [||], [(], [c], [&&], [d], [)]. Auf diese Weise repräsentiert jede einzelne Einheit (typischerweise Token oder Lexeme) etwas Sinnvolles und Sie beschäftigen sich nicht länger mit einem String-Verarbeitungsproblem.

  • Parsing. Der nächste Schritt besteht darin, den Strom von Tokens zu nehmen und herauszufinden, was der Ausdruck "bedeutet" bedeutet. Dies nennt man Parsing. Für die Anwendung, die Sie beschreiben, würde ich empfehlen, Dijkstras Rangierbahnhof-Algorithmus zu betrachten, der mit einer Reihe von Tokens beginnt, die eine mathematische Operation darstellen, und rekonstruiert die Vorrangstellung des Operators daraus. Die bevorzugte Ausgabe dieses Schritts ist eine Baumstruktur, die die Struktur Ihrer Formel darstellt, die typischerweise als abstrakter Syntaxbaum (AST) oder als Ausdrucksbaum bezeichnet wird.

  • Bewertung. An dieser Stelle haben Sie jetzt Ihren AST, der die hierarchische Struktur des Ausdrucks anzeigt. Jetzt müssen Sie die Wahrheitstabelle generieren. Sie können dies tun, indem Sie den Baum durchlaufen, um eine Liste von Variablen zu extrahieren, und dann alle möglichen Kombinationen durchgehen, deren Variablen wahr und falsch sind. Für jeden von ihnen können Sie den Baum durchlaufen, um zu bestimmen, was der Ausdruck in diesem Fall auswertet.

Wenn Sie neugierig sind, was dieses wie in der Praxis aussieht, ist die source code für die Wahrheitstabelle Tool, das ich oben verlinkten hier zur Verfügung und wird in diesen Schritten abgebaut werden. Sie können die Scan-, Parsing- und AST-Logik sehen, um ein Gefühl dafür zu bekommen, wie die Dinge aussehen.

+0

Okay. Ich denke nicht, dass meine Programmierkenntnisse für diese Art von Programm noch ausreichen. Danke für deine Antwort sowieso! –

+1

@yacc Als jemand, der eine Menge neuer Programmierer unterrichtet, denke ich, dass es nicht unvernünftig ist zu vermuten, dass so etwas nicht zu anspruchsvoll ist. Ich denke, das ist einer dieser Bereiche, in denen es überraschend ist, wie schwierig es ist und wie viele Schritte es gibt. – templatetypedef

Verwandte Themen