Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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.

Geschrieben
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?

Geschrieben (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 von lilith2k3
Geschrieben (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 von flashpixx
Geschrieben (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 von lilith2k3
Geschrieben

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.

Geschrieben
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;)

Geschrieben

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 Benutzerkonto oder melde Dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde Dich hier an.

Jetzt anmelden

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...