Okay, zuerst danke, dass du dir die Zeit genommen hast, meinen Post zu lesen !! (^ o ^) / Und bevor ich das ganze Problem ein wenig in den Kontext stelle: Ich lerne selbst C und habe das Buch "Illustrating C" gefunden, an dem ich arbeite. In seinem Buch verwendete Donald Alcock eine Symbol-Status-Tabelle für die Logik in einem Programm, das eine römische Zahl in arabischer Zahl ändern soll.
Dies ist der Code:
%Vor%Hier ein Link zum Bild des Buches: roman_2
Nun, da erklärt er die Logik der Tabelle.
Später schrieb er dies über Schalter und Symbolzustandstabellen:
Verschachtelte Switch-Anweisungen sind nützlich für die Implementierung der Logik in Symbol-State-Tabellen enthalten. Der äußere Schalter ist ein Fall für jeder Zustand (Zeile) der Tabelle. Die Logik in jedem dieser Fälle umfasst einen inneren Schalter mit einem Fall für jedes Symbol (Spalte) von die Tabelle.
Mit dem, was er sagt, kann dieser Code ersetzt werden
%Vor%für diesen
%Vor%Ich schätze, Sie haben jetzt die Idee.
Nun endlich, als alles zusammenbrach. (T.T.)
Sagen Sie im Kapitel Übung 4.2:
Schreiben Sie eine Funktion mit einer Symbol-Status-Tabelle, um eine Oktalzahl zu lesen Umwandlung von der Tastatur in eine Dezimalzahl (vom Typ long) .Verlasse ein vorangestelltes + oder - Zeichen. Zum Beispiel sollte das Programm lesen -74 und bekomme das Ergebnis -60. Ihre Statustabelle sollte vier Spalten haben. Diese sind: [0] um mit dem führenden + oder -, [1] umzugehen, um mit irgendwelchen umzugehen stell dich von 0 bis 7, 2 um mit einem Leerzeichen umzugehen, [3] um damit umzugehen mit einem anderen Zeichen (ein Fehler). Der Wert in jeder Zelle sollte ein Label enthalten (zur Verwendung in einer zugehörigen 'switch'-Anweisung) und die Nummer des nächsten 'Staates' oder der nächsten Zeile. Der 'Fall' gehört zu gültige Ziffern sollten das akkumulierende Ergebnis mit der Zahl multiplizieren base, 8, dann die aktuelle Ziffer hinzufügen. Schreiben Sie ein Test-Bett-Programm zum Lesen Oktalzahlen von der Tastatur und zeigen ihre Dezimaläquivalente auf dem Bildschirm.
und das was ich bis jetzt habe:
%Vor%Funktioniert mit einigen kleinen Problemen, konvertiert aber das Oktal in Dezimal.
Das Problem ist, ich kann nicht verstehen, wie man die Tabelle mit dem Schalter benutzt und lösche die if's und for's hier:
%Vor%Und der Weltraumcharakter ... ich weiß einfach nicht, was ich damit machen soll !!!!.
Wie man die Tabelle mit Schaltern benutzt, um zu vermeiden, wenn's und for's sind, wenn die Tabelle Symbole in verschiedenen Spalten und Zeilen hat (im Gegensatz zu römischen Zahlen, jedes Symbol mit einer Spalte ...), wobei jede Zelle ein Label und hat ein nächster Staat.
Tut mir leid, dass Sie das zu lange machen und für jeden Fehler, den Sie in der Grammatik gefunden haben, ist Englisch nicht meine Muttersprache.
Nochmals vielen Dank!
Meiner Meinung nach liegt der Schlüssel zum Verständnis der Verwendung der Tabelle in diesen beiden Zeilen in der inneren Schleife.
%Vor%Die in der Tabelle gespeicherten Werte haben 2 "Felder" in einer gepackten Dezimaldarstellung. Es gibt eine kleine Schleife, um nach dem Eingabezeichen in einem Char-Array zu suchen (strchr wäre eine gebräuchlichere Methode dafür). Dann wird der Wert aus der Tabelle unter Verwendung von / und% zerlegt, um den "Zehner" -Platz und den "Einsen" -Platz zu erhalten, die den nächsten Zustand (den Reihenwert für die nächste Iteration der großen Schleife) und "Hunderte" angeben höhere Stellen, die, wenn sie durch 100 geteilt werden, den Betrag angeben, den dieses Zeichen zum Ausgabewert beiträgt.
Okay, zuerst müssen Sie im Beispiel so etwas wie diese kleine Schleife machen. Dies ist die Zeichenklassifikationsfunktion. Sie können alle Zeichenkonstanten aus dem Code entfernen und in eine Datenstruktur einfügen, in die sie gehören.
Das heißt, ich bin dabei, mich an einem solchen Programm zu versuchen. Nicht sicher, ob Sie nach einer vollständigen Lösung oder nur nach einer kleinen Hilfe suchen. Ich schaue zurück, wenn ich mehr habe.
Bearbeiten: Ich denke, die Problembeschreibung ist ein wenig irreführend. Sie benötigen für jedes gültige Zeichen eine Spalte. Sehen Sie sich diese Version der Tabellen an.
%Vor%Ich empfehle dringend, Kommentare wie diese um Ihre Tische zu legen, damit Sie sich zurechtfinden. Übrigens kann ich nicht herausfinden, was der Raum auch tun soll.
Bearbeiten: Die Verwendung eines Makros erleichtert das Anzeigen der Felder.
%Vor%Später ... Ich habe kürzlich dieselbe Datenstruktur und denselben Algorithmus für einen Scanner für eine APL-ähnliche Programmiersprache verwendet ( zur Überprüfung gepostet ).
Tags und Links c nested switch-statement nested-loops