Veröffentlicht 16. Januar 201114 j 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.
16. Januar 201114 j Man muss einen Parser für arithmetische Ausdrücke benutzen, wenn man aus einem String einen beliebigen Ausdruck berechnen möchte.
16. Januar 201114 j 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?
16. Januar 201114 j zum Rechnen hilft der ASCII-Code der Zahlen weiter Wohl weniger, wie willst Du denn "sin(1.234)" berechnen !?
17. Januar 201114 j 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 201114 j von lilith2k3
17. Januar 201114 j Ä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 201114 j von flashpixx
17. Januar 201114 j 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 201114 j von lilith2k3
17. Januar 201114 j 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.
17. Januar 201114 j 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;)
17. Januar 201114 j 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)
Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.