Zum Inhalt springen

stringsumme


Tyler_Durden

Empfohlene Beiträge

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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
Link zu diesem Kommentar
Auf anderen Seiten teilen

Ä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
Link zu diesem Kommentar
Auf anderen Seiten teilen

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
Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

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...