Ez már szintaktikai hiba, nem zárójel probléma. Hm?
Nem tudom, kicsit gondban is voltam a feladatkiírással: nem tudom, hogy mit jelent az pontosan, hogy 'zárójelprobléma'. Igazából egy karaktersorozat vagy szintaktikailag helyes egy zárójeleket is tartalmazó nyelvben, vagy nem. Van valami definíciód arra, hogy mi az a zárójelprobléma (ha nem az, hogy valamely zárójel rossz helyen van)? Mondjuk ha pont úgy definiáljuk, hogy zárójelprobléma akkor és csak akkor van ha a lent vázolt counteres algoritmus false-al tér vissza, az működik, csak elég öncélú.
Bocs, de most olyan szinten nincs időm meg kedvem belemenni, hogy adott egyszerű algoritmushoz hogyan szerkesszünk struktogrammot. Amúgy egy tapasztalt fejlesztőnek ezek a stuktorgrammok teljesen feleslegesek sőt szerintem gagyik, zavaróak, szóval nem szoktam ilyeneket rajzolgatni.
Azért a rend kedvéért még leírok egy szerintem korrekt algoritmust:
Tegyük fel, hogy a kifejezés zárójelekből, szorzásjelekből, összeadásjelekből és atomokból áll, ahol az atomok alfanumerikus karakterekből állnak.
Ekkor induljunk el a kifejezés string elején és olvassuk a karaktereket egyesével. A következő állapotokat vezetem be:
nyilván minden egyes állapot esetén megnézed, hogy mit olvasva milyen új állapotba kerülsz, illetve adott állapotban azt egy helyes kifejezésben lehet-e olvasni. Ezt rádbízom.
Ezt kell kiegészíteni a counter kezeléssel, amit QXY-val írtunk, és akkor az algoritmus helyes lesz.
Röviden: egyszerű állapotgéppel + egy counter változóval szvsz. egész elegánsan megoldható a feladat.
végén a stack-nak 0-nak kell lennie, ha helyes a zárójelezés
Pontosabban végig figyelni kell, hogy a 'stack' nagyobbegyenlő 0 maradjon és a végén nullának kell lennie: ez szükséges feltétele a helyes zárójelenzésnek.
Tehát ez nem jó:
) y * z (
pedig a végén 0 a 'stack' (én counter-nek hívnám.).
De még ez sem elégséges feltétel. Pl. erre amit írtál azt mondja, hogy helyes, pedig nem az:
Az ilyet veremmel "szokás" megoldani.
- Nyitó zárójelnél beraksz a verembe, bezárónál kiveszel.
- Ha kivételnél üres a verem (nincs mit kivenni), akkor rossz a zárójelezés: END
- Ha a karaktertömb elfogy és üres a verem: jó a zárójelezés.
- Ha a karaktertömb elfogy és nem üres a verem: rossz a zárójelezés.
Mivel a verembe pakolt dolgoknak nincs jelentősége, érdemes szimulálni a dolgot.
- indulásnál: int stack = 0
- bepakolás: stack++
- kivétel: stack--
- végén a stack-nak 0-nak kell lennie, ha helyes a zárójelezés
XY(N) N elemű karaktertömb egy algebrai kifejezést tartalmaz. Készítsünk algoritmust annak ellenőrzésére, hogy helyesen zárójelezett-e?
Az algoritmus beadandó 2 tervezési módszerrel:
- Folyamatábra
- Struktogram
Hogy csináljam meg?Ezzel szenvedek.
Előre is köszönöm a segítséget.