Kezdőoldal » Számítástechnika » Programozás » Milyen algoritmussal oldanátok...

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?

Figyelt kérdés

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



2019. okt. 11. 21:15
 1/6 anonim ***** válasza:
Nézz utána a lengyelformának.
2019. okt. 11. 21:28
Hasznos számodra ez a válasz?
 2/6 anonim ***** válasza:

Nagyon nem egyszerű feladat.

Tokenizálni kell egy nyelvtan alapján, fordított lengyel normál formára hozni, aztán kiértékelni.

2019. okt. 11. 21:32
Hasznos számodra ez a válasz?
 3/6 anonim ***** válasza:

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

2019. okt. 11. 22:34
Hasznos számodra ez a válasz?
 4/6 anonim ***** válasza:
56%

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.

2019. okt. 11. 23:32
Hasznos számodra ez a válasz?
 5/6 anonim ***** válasza:

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.

2019. okt. 11. 23:51
Hasznos számodra ez a válasz?
 6/6 anonim ***** válasza:
4-es, nem volt gyanus, hogy a feladat celja a programozas alapjait gyakoroltatni? :D
2019. okt. 12. 08:34
Hasznos számodra ez a válasz?

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!