Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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.

und was ist ein parser? und wie würde das für meine aufgabe aussehen?

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

Ä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

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

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.

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.