Tyler_Durden Geschrieben 16. Januar 2011 Teilen Geschrieben 16. Januar 2011 Hallo, wie kann ich in c einen ausdruck innerhalb eines strings berechnen ohne atoi etc. zu verwenden, also wie würde die funktion dazu aussehen? Bsp.: In meinem string steht 1002+883 und dazu soll dann im Ergebnis folgerichtig 1885 stehen. Hab am freitag prüfung in c und diese aufgabe habe ich in ner älteren prüfung gefunden. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 16. Januar 2011 Teilen Geschrieben 16. Januar 2011 Man muss einen Parser für arithmetische Ausdrücke benutzen, wenn man aus einem String einen beliebigen Ausdruck berechnen möchte. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Tyler_Durden Geschrieben 16. Januar 2011 Autor Teilen Geschrieben 16. Januar 2011 und was ist ein parser? und wie würde das für meine aufgabe aussehen? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 16. Januar 2011 Teilen Geschrieben 16. Januar 2011 und was ist ein parser? Parser ? Wikipedia und wie würde das für meine aufgabe aussehen?Das kommt darauf an, wie dein Ausdruck aufgebaut ist. Ein einzelnes Beispiel hilft da nicht viel weiter. Welche und wieviele Operanden? Nur positive Ganzzahlen? Welche Operatoren? Klammern erlaubt? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
lilith2k3 Geschrieben 16. Januar 2011 Teilen Geschrieben 16. Januar 2011 zum Rechnen hilft der ASCII-Code der Zahlen weiter Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 16. Januar 2011 Teilen Geschrieben 16. Januar 2011 zum Rechnen hilft der ASCII-Code der Zahlen weiter Wohl weniger, wie willst Du denn "sin(1.234)" berechnen !? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
lilith2k3 Geschrieben 17. Januar 2011 Teilen Geschrieben 17. Januar 2011 (bearbeitet) Wohl weniger, wie willst Du denn "sin(1.234)" berechnen !? Äh, indem ich den Ausdruck derart Parse, dass ich zum einen sin(x) als Funktion identifizieren kann und 1.234 mittells ASCII-Wert in die entsprechende Zahl konvertiere? Üblicherweise kann man e.g. Integerzahlen einfach mit folgendem Algorithmus umwandlen: int ConvertToInt (char *String) { int konvertierteZahl=0; while(*String!='\0') { konvertierteZahl*=10; konvertierteZahl+=*String-'0'; String++; } return konvertierteZahl; } [/PHP] Wesentlich für die Umwandlung ist String[i] als char Wert und der Wert von '0' als Bezugspunkte zu setzen. Anders sehen AFAIK die Funktionen der Standardbibliothek auch nicht aus. Und da der TO die Vorgabe hat, ohne atoi etc. zu verwenden sich aber offensichtlich nicht zu helfen weiss, habe ich ihm den Tipp gegeben, wie er sich die Funktion selbst schreiben könnte. Insofern bin ich über Deinen Einwand mehr als erstaunt. Bearbeitet 17. Januar 2011 von lilith2k3 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 17. Januar 2011 Teilen Geschrieben 17. Januar 2011 (bearbeitet) Äh, indem ich den Ausdruck derart Parse [...] Du rechnest also nicht die Stringwerte um, sondern baust einen eigenen Parser. Ich würde davon abraten und dann eher zu GNU Bison ? Wikipedia mit einer entsprechenden Backus-Naur-Form ? Wikipedia meiner Sprache greifen. Gerade um die korrekten Rechenregeln aufzustellen braucht man nicht viel (in Prolog sieht die EBNF Ausdrücke so aus): expr(S) --> sexpr(S). expr(S) --> sexpr(A), [plus], expr(, {S is A+B}. expr(S) --> sexpr(A), [minus], expr(, {S is A-B}. sexpr(S) --> pexpr(S). sexpr(S) --> pexpr(A), [plus], pexpr(, {S is A+B}. sexpr(S) --> pexpr(A), [minus], pexpr(, {S is A-B}. pexpr(S) --> factor(A), [mal], pexpr(, {S is A*B}. pexpr(S) --> factor(A), [durch], pexpr(, {S is A//B}. pexpr(S) --> factor(S). factor(S) --> [klammerauf], expr(S), [klammerzu]. [/code] Wobei hier die Operatoren als Wörter angegeben wurden, d.h. "5 mal klammerauf 3 plus 6 klammerzu" wäre eine korrekte Eingabe. Ergänzen muss dann noch die Zahlendarstellen, die dann als factor(S) eingefügt wird. Bearbeitet 17. Januar 2011 von flashpixx Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
lilith2k3 Geschrieben 17. Januar 2011 Teilen Geschrieben 17. Januar 2011 (bearbeitet) Du rechnest also nicht die Stringwerte um, sondern baust einen eigenen Parser. Wenn es Teil der Übung wäre, würde ich das wohl tun. Im gegebenen Kontext empfinde ich es als unangebracht auf Tools wie Bison zu verweisen. Hab am freitag prüfung in c und diese aufgabe habe ich in ner älteren prüfung gefunden. innerhalb eines strings berechnen ohne atoi etc. zu verwenden impliziert in meinen Augen die Prüfungsaufgabe eine Funktion wie atoi selbst zu schreiben, und unter Beweis zu stellen, dass man die Grundlagen der Sprache C verstanden hat. Es geht weniger darum, Sprachen zu entwickeln, zu formalisieren und per Bison/YACC sich einen Kompiler dafür generieren zu lassen, als vielmehr den Schüler/Studenten zum nachdenken anzuregen, wie man ohne Standardlibs sich dennoch behelfen kann. Bearbeitet 17. Januar 2011 von lilith2k3 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 17. Januar 2011 Teilen Geschrieben 17. Januar 2011 Im gegebenen Kontext empfinde ich es als unangebracht auf Tools wie Bison zu verweisen. Nein eben nicht. Die Aufgabenstellung lautete "...wie kann ich in c einen ausdruck innerhalb eines strings berechnen..." Wenn es nur genau um den angegebenen Ausdruck geht, ist der von Dir genannte Lösungsweg in Ordnung. Es geht weniger darum, Sprachen zu entwickeln, zu formalisieren und per Bison/YACC sich einen Kompiler dafür generieren zu lassen, als vielmehr den Schüler/Studenten zum nachdenken anzuregen, wie man ohne Standardlibs sich dennoch behelfen kann. Genau das, man muss nachdenken. Wenn wie gesagt ein einzelner Ausdruck verarbeitet werden soll und das Alphabet klein ist, dann kann ich das via Schleife und ASCII Zerlegung machen. Wenn aber ein beliebiger arithmetischer Ausdruck verarbeitet werden soll, dann ist der Ansatz das ganze über eine Grammatik zu realisieren. Wobei dazu dann Tools wie Bison oder AntLR eingesetzt werden sollten. Es geht weder der eine, noch der andere Ansatz aus der Aufgabenstellung klar hervor. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
lilith2k3 Geschrieben 17. Januar 2011 Teilen Geschrieben 17. Januar 2011 Es geht weder der eine, noch der andere Ansatz aus der Aufgabenstellung klar hervor. D'Accord. Klar hervor geht es nicht. Ich habe nur auf eine mögliche "Prüfungssituation" geschlossen;) Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 17. Januar 2011 Teilen Geschrieben 17. Januar 2011 Ich habe nur auf eine mögliche "Prüfungssituation" geschlossen;) Naja beide Antworten wären ja für eine Prüfung auch nicht falsch, es wäre halt sinnvoll zu wissen, wie der Kontext ist. Rein technisch macht der Lexikalischer Scanner ? Wikipedia ja auch nur ne Trennung der Stringdaten in Tokens.... (wobei ich mich eben dann nicht mehr selbst darum kümmern muss) Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.