Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

[Zadatak] Ispitivanje zagrada preko stacka

[es] :: C/C++ programiranje :: C/C++ za početnike :: [Zadatak] Ispitivanje zagrada preko stacka

[ Pregleda: 2633 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

ssnnaaxx

Član broj: 83286
Poruke: 11
*.PPPoE-4196.sa.bih.net.ba.



Profil

icon [Zadatak] Ispitivanje zagrada preko stacka06.06.2006. u 17:18 - pre 217 meseci
radim program ispitivanje zagrada preko steka "stacka" ,pa imam problem kod ovog ...
kad uzimam elemente sa steka imam uslov za provjeravanje dali su ispravno napisane zagrade ..
kad upisem zagrade
" ) ( " ispise mi da je ispravno a ovako izgleda dio koda koji ispituje tacnost malih zagrada

if (pok->Ime=='(' ) { lijeva ++; // povecavamo brojac za jedan resetiramo vrijednost

prvo = false ;
break;
}

if (pok->Ime== ')' ) { desna ++;
if (prvo == true) cout<<"Nevalja redoslijed; "; //znaci da se ista zagrada uzastopce ponovila

prvo = true;
}

dali neko zna koji jos uslov da postavim da bi mi ispisao da su zagrade netacne ako ih napisem ovako )( ???
 
Odgovor na temu

Mali Misha
Mihajlo Anđelković
NBGD

Član broj: 79396
Poruke: 379
*.powernet.bg.

ICQ: 195487525
Sajt: cpptea.com


+1 Profil

icon Re: [Zadatak] Ispitivanje zagrada preko stacka06.06.2006. u 17:34 - pre 217 meseci
Ako zagrade nisu otvarane, svako njihovo zatvaranje treba da proizvodi grešku.

Ako kontrolišeš samo male zagrade, mogao bi da koristiš samo jednu varijablu koja nosi podatak koliko je zagrada trenutno otvoreno. Za svako '(' uverćaš variablu za 1 a za svako ')' je umanjiš za 1. Ako variabla igde padne ispod nule, dogodilo se da ima koja ')' viška. Ako je varijabla na kraju nula, postignut je balans itd. Mislim da je ovo već lako napisati prema opisu.

Mogao bi da baciš pogled i na sličnu temu:

http://www.elitesecurity.org/tema/161708/0#1055850

Ovde se vodilo računa i o drugim tipovima zagrada kao i o njihovom prioritetu.

[Ovu poruku je menjao Mali Misha dana 06.06.2006. u 18:46 GMT+1]
Ipak se ++uje.
 
Odgovor na temu

#Ninja#
Tuzla

Član broj: 28925
Poruke: 259
*.PPPoE-1353.sa.bih.net.ba.



+1 Profil

icon Re: [Zadatak] Ispitivanje zagrada preko stacka06.06.2006. u 22:08 - pre 217 meseci
Kada petlja naiđe na otvorenu zagradu, dodaj je na vrh stacka. Kad naiđe na zatvorenu zagradu, sa stacka ukloniš gornji element i smjestiš ga u neku varijablu (npr. x). Onda ubaciš provjeru:
Code:
if ((x == '{' && zagrade[i]=='}') || (x == '[' && zagrade[i]==']') || (x == '(' && zagrade[i]==')'))

Ako je uslov ispunjen, sve je u redu.
 
Odgovor na temu

ssnnaaxx

Član broj: 83286
Poruke: 11
*.PPPoE-113.sa.bih.net.ba.



Profil

icon Re: [Zadatak] Ispitivanje zagrada preko stacka06.06.2006. u 22:42 - pre 217 meseci
dobio sam zadatak da uradim ispitivanje zagrada preko stacka u c++-u i JAvi ...
al program mora da ispituje za sve tri vrste zagrada tacnije {[()]}
zagrade moraju da imaju prioritete ,tj da se nesmije pojaviti ovako nesto ({}[]) ili slicno tome .... {} ima najveci prioritet , [] manji prioritet ,() najman ji prioritet

ja sam nest od toga uradio pa cu ti poslati code ... al mi fali taj dio ispitivanja dali je dobro ili ne ....

#include<conio.h>
#include <iostream.h>
struct cvor{ // struktura cvor koja sadrzi znak i dva pokazivaca
int Ime;
cvor *sljedeci;
cvor *predhodni;
};

cvor *glava = NULL; cvor *rep = NULL;


struct cvor *novicvor(int broj){ // pravi objekt
struct cvor *nuovo = new cvor;
if (nuovo == NULL)
return NULL;
else {
nuovo->Ime = broj;
return nuovo;
}

}

void dodajnakraj(struct cvor *novi){ //dodaje na vrh


if(glava == NULL) {
glava = novi;
rep = novi;
glava->sljedeci = NULL;
glava ->predhodni = NULL;
}
else {
rep ->sljedeci = novi;
novi->predhodni = rep;
rep= novi;
rep->sljedeci=NULL;
glava->predhodni = NULL;
}
}

void brisicvor(cvor *brisi) { // brise cvor sa vrha

if (glava->sljedeci == NULL) {
glava = NULL;
rep = NULL;
return;
}

struct cvor *tmp;
tmp = brisi;

if ( tmp == rep){
rep= rep -> predhodni;
rep ->sljedeci = NULL;
delete tmp;
}
}

OVDJE MI FALI FUNKCIJA KOJA BI SE ZVALA zagrada(); i KOJA BI ISPITIVALA DALI SU ZAGRADE TACNO NAPISANE ... PA AKO MOZETE POMOC , HVALA

NEMOGU SLATI PP ,NEMAM 10 postova ...

}


int main () {

cvor *pok;
char a;

cout << endl<< "Unesi alg. izraz:"<<endl<<"(Kraj izraza potvrdi sa = )\n\n";

while ( a != '=' ){ // u prevodu: ponavljaj dok se ne unese znak jednako
cin >> a;
pok= novicvor(a); // poziva se funkcija koja pravi objekt (cvor) koji sadrzi znak
// unesen sa tipkovnice
dodajnakraj(pok); // onda taj cvor stavljamo na vrh steka
}

// kada smo napunili stek pozivamo funciju zgrda() koja uzima elemente sa steka i
// provjerava da li redoslije zagrada ispravan

zagrada();

cout << endl;
getch();
return 0;
}



 
Odgovor na temu

#Ninja#
Tuzla

Član broj: 28925
Poruke: 259
*.PPPoE-1818.sa.bih.net.ba.



+1 Profil

icon Re: [Zadatak] Ispitivanje zagrada preko stacka07.06.2006. u 01:13 - pre 217 meseci
Nešto mi ovo ne liči na stack. Moglo je jednostavnije.

Ispravi petlju u glavnoj funkciji:
Code:
int main () {

    cvor *pok;
    char a;

    cout << endl<< "Unesi alg. izraz:"<<endl<<"(Kraj izraza potvrdi sa = )\n\n";

    do {                //petlja treba da se izvrši bar jednom, jer je char a samo inicijalizovan
        cin >> a;
        pok= novicvor(a); // poziva se funkcija koja pravi objekt (cvor) koji sadrzi znak
        // unesen sa tipkovnice
        dodajnakraj(pok); // onda taj cvor stavljamo na vrh steka
    } while ( a != '=' );

I stavi CODE tagove oko programskog koda da bi bio čitljiviji.

Ja bih preradio glavni program da učitava kompletan izraz (pomoću cin.getline()), pa da ga provjerava for petljom. Ovako se svaki znak mora posebno učitati.
 
Odgovor na temu

Mali Misha
Mihajlo Anđelković
NBGD

Član broj: 79396
Poruke: 379
*.powernet.bg.

ICQ: 195487525
Sajt: cpptea.com


+1 Profil

icon Re: [Zadatak] Ispitivanje zagrada preko stacka07.06.2006. u 02:11 - pre 217 meseci
Zašto ne bi proveravao validnost formuje tokom građenja steka?

Otvaranje zagrade bi bilo dodavanje novog elementa na stek. U slučaju da zagrada koju treba dodati ima manji prioritet od one na vrhu steka (npr. '{' ima manji prioritet od '[' itd.), prijavljuje se odgovarajuća greška.

Zatvaranje zagrade je skidanje elementa sa steka. Ako je stek u ovom momentu prazan, radi se zatvaranju zagrade koja nije prethodno otvorena. Ukoliko zatvarajuća zagrada ne odgovara onoj koja se nalazi na vrhu steka (npr. zagradi '(' odgovara samo zagrada ')' dok druge dve ne), radi se ili o prevremenom ili o suvišnom zatvaranju zagrade.

Dovoljno je da napraviš jednu bool varijablu koja će na startu provere biti true a prilikom kršenja bilo kog od pravila biti postavljena na false. Ako je po završetku obrade ulaza zajedno ta varijabla true a stek prazan, formula je validna. Evo i jedne implementacije koja radi malo više od traženog, jer se preko dva niza, opening i closing, mogu definisati simboli koji predstavljaju zagrade (a može ih biti i više od 3) a i prioritet među njima. Sa pojednostavljenjima možeš dobiti brži kod koji radi upravo ono što tebi treba. Komentari bi trebali biti od pomoći.
Ipak se ++uje.
Prikačeni fajlovi
 
Odgovor na temu

ssnnaaxx

Član broj: 83286
Poruke: 11
*.PPPoE-3568.sa.bih.net.ba.



Profil

icon Re: [Zadatak] Ispitivanje zagrada preko stacka07.06.2006. u 11:59 - pre 217 meseci
hvala :) uspio sam srediti ....sad je sve okej
 
Odgovor na temu

[es] :: C/C++ programiranje :: C/C++ za početnike :: [Zadatak] Ispitivanje zagrada preko stacka

[ Pregleda: 2633 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.