Milyen algoritmussal oldanátok meg azt a feladatot, ha sztringként meg van adva egy számolási kifejezés, és eredményül az adott összeget várja?
pl "1+2*3" outputként:7
használható nálunk VAL(X) függvény,ami adott karakterből valós számot csinál, az még stimmel is,de akkor ott marad karakterként egy + vagy * jel, amit nem lehet annyival elintézni hogy
If SZO[I] = '+'
SZO[I] <- +
2 órája ezen a feladaton gondolkodok,de lövésem sincs, vagyis annyi, hogy magát sztringet nyílván járjuk be tömbként alakitsuk valós számra,de akkor még figyelni kell arra,szorzás előbb végzendő...
Nagyon nem egyszerű feladat.
Tokenizálni kell egy nyelvtan alapján, fordított lengyel normál formára hozni, aztán kiértékelni.
Én szét tördelném ("split" a str-t), valami string-stream-es cuccal. Arra nem emlékszem ebben a "nyelvben" van-e ilyesmi.
Vagy sima if-el karakterenként rávizsgálnék while cilussal a string végéig.
Az a baj (ezzel a nyelvvel főként), elég absztrakt, nem feltétlen a példából kell kiindulni, mert univerzális megoldásra van szükség. Abban meg tetszőleges számú char, műveleti jel stb lehet.
C++, C#, Java hamarabb megvalósítható lenne.
A műveleti sorrendet amúgy a fordítók optimalizálják, hogy a leggyorsabb. Kivéve ebben a pszeudokódban, ahol kötött és zh kérdés is...
A (fordított) lengyel logikának, ahogy felettem írták utána olvasgathatsz esetleg, hátha segít.
Két lehetőséged van:
1) Vagy csinálsz egy saját értelmezőt a matematikai műveletekre, amire ott az ANTLR például
2) Vagy nem szívatod magad és fogod a jó öreg fordítót, hogy elvégezze a piszkos munkát.
Utóbbit javaslom. Én C# fejlesztő vagyok, szóval azon mutatnám be a működését.
Ehhez a következőkre lesz szükséged:
1) Elolvasni a neten, hogy működik a CSharpCodeProvider osztály, és hogyan tudod meghívni a CompileAssemblyFromSource metódusát. Ha beállítod, hogy memóriába készítse el az assembly-t, nagyon nyerő ügyed van, mert
2) ezt az assembly-t reflection-nel meg tudod hívni és le tudod futtatni.
Szóval:
1) Generálsz egy valid C# kódot string-ként, valahogy így:
string expression = "3 + 6 * 3";
string code = "namespace A {public static class B { public static int Calculate() => EXPR; }}";
code = code.Replace("EXPR", expression);
2) Lefordítod a code-ot memóriába:
CompilerParameters CompilerParams = new CompilerParameters(); //ezt felkonfigolod megfelelően
CSharpCodeProvider provider = new CSharpCodeProvider();
CompilerResults compile = provider.CompileAssemblyFromSource(CompilerParams, code);
if (compile.Errors.HasErrors) {} //szintaktikai hibás az expression
Assembly result = compile.CompiledAssembly;
3) Reflection-nel meghívod a result assembly Calculate metódusát. Ezt már a fantáziádra bízom.
Ennek ugyanakkor van egy olyan veszélye, hogy a program rávehető bármilyen káros kód végrehajtására is, szóval az inputot megfelelően ellenőrizni kell.
Papiron kell programoznia, az a baj :D
Itt se compailer, se semmi. A tanár jóindulatán múlik, "lefordul-e". Assembly szóba se jöhet.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!