• 17 odgovora
  • 4.671 pregleda
problem sa jednim programom 16.02.2006. u 18:14 · pre 251 meseci #1
Pozdrav svima na forumu.
Moj program izgleda ovako:

#include <iostream>
#include<conio>
using namespace std;
int main()
{
char text[100];
int oz[100], oz1[100], oz2[100];
int n1 = 0, n2 = 0, n11 = 0, n22 = 0;
bool tacan = true;

cout<<"Unesite relaciju:";
cin.getline(text, 100);

for(int i = 0; i < 100; i++) {
oz1 = 1000;
oz2 = 1000;
}

for(int i = 0; i < 100; i++) {
if(text == '(')
oz = 1;
else if(text == ')')
oz = 2;
else
oz = 0;
}

for(int i = 0; i < 100; i++) {
if(oz == 1) {
n1++;
oz1[n11] = i;
n11++;
}
if(oz == 2) {
n2++;
oz2[n22] = i;
n22++;
}
}
for(int i = 0; i < 100; i++) {
if(oz1 > oz2) {
cout << "\nNemoze biti prva ')' zagrada!";
cout << "\nOna se nalazi na poziciji " << oz2 + 1 << ".";
tacan = false;
}
}

if(n1 != n2)
tacan = false;
if(tacan == false)
cout << "\nZagrade nisu dobro zatvorene!";
if(tacan == true)
cout << "\nZagrade su ispravno zatvorene!";
getch ();

}

Ovaj program provjerava jesu li tacno zatvorene sve zagrade u unesenom izrazu.Naime problem je u tome da on radi samo za male zagrade (,),a mene interesuje koko mogu ubaciti da program radi i za ostale dvije vrste zagrada,tj.da provjerava jesu li i ostale dvije vrste zagrada pravilno zatvorene.

npr:
{12+[45-(2-1)]}-ispravno
[8+(5-8)+{4-1}]-ne ispravno

[Ovu poruku je menjao Ballistic dana 22.02.2006. u 20:18 GMT+1]
Re: Provjeravanje da li su u algebarskom izrazu sve zagrade pravilno zatvorene 17.02.2006. u 19:32 · pre 251 meseci #6
Citat:
Ballistic: Stack implementirati pomocu vezane liste

Rekurzija je definitivno najbolje i najelegantno resenje. Zasto da se muci da implementira stack, kad rekurzija to mu daje besplatno :)




[Ovu poruku je menjao dimitar 16 dana 17.02.2006. u 20:34 GMT+1]
Re: Provjeravanje da li su u algebarskom izrazu sve zagrade pravilno zatvorene 20.02.2006. u 19:49 · pre 251 meseci #14
A zar ne moze da se upotrebi i (unsigned) int niz od samo tri clana?

Code:
#include <iostream>
using namespace std;

bool valid(const char * t)
{
    unsigned int z[3] = {0};

    while(*t)
    {
        switch(*t)
        {
            case '(':
                z[2]++;
                break;

            case ')':
                if(z[2]==0)
                {
                    cout << "Suvisna ')'.\n";
                    return false;
                }

                z[2]--;
                break;


            case '[':
                if(z[2])
                {
                    cout << "Nedozvoljeno otvaranje '['\n";
                    return false;
                }
                z[1]++;
                break;

            case ']':
                if(!z[1])
                {
                    cout << "Suvisna ']'.\n";
                    return false;
                }
                if(z[2])
                {
                    cout << "Nedozvoljeno zatvaranje ']'.\n";
                    return false;
                }
                z[1]--;
                break;


            case '{':
                if(z[2] || z[1])
                {
                    cout << "Nedozvoljeno otvaranje '{'.\n";
                    return false;
                }
                z[0]++;
                break;

            case '}':
                if(!z[0])
                {
                    cout << "Suvisna '}'.\n";
                    return false;
                }
                if(z[1] || z[2])
                {
                    cout << "Nedozvoljeno '}'.\n";
                    return false;
                }
                z[0]--;
        }
        
        t++;
    }

    if(z[0]||z[1]||z[2])
    {
        cout << "Nezatvorene zagrade:" <<  (z[0]?" {":" ") <<
            (z[1]?" [":" ") << (z[2]?" (":"") << '\n';
        return false;
    }

    return true;
}

main()
{
    char text[500];

    cin.getline(text,500);
    
    valid(text);
}

Nisam siguran da li ima rupa, ali to je jedna ideja...
*edit I*: Switch se moze zameniti i sa nekoliko ugnezdjenih for-ova. Tako ce f-ja biti sporija ali kraca.
*edit II*: opis:

( - ok
) - greska ako nisu otvorene (
[ - greska ako su otvorene (
] - greska ako nisu otvorene [ ili ako su otvorene (
{ - greska ako su otvorene ( ili [
} - greska ako nisu otvorene } ili ako su otvorene ( ili [

greska ako nisu zatvorene sve koje su otvorene.

[Ovu poruku je menjao Mali Misha dana 20.02.2006. u 21:04 GMT+1]
Potpis
Ipak se ++uje.
Re: Provjeravanje da li su u algebarskom izrazu sve zagrade pravilno zatvorene 20.02.2006. u 20:42 · pre 251 meseci #15
Siguran sam da tvoj greedy algoritam ne radi kako treba.
samo ova crta proizvodi nebuloze
Citat:
[ - greska ako su otvorene (

npr. naredba ( a*3+[3-1]*2 ) je valjana.

Primjedba na:
Citat:
Switch se moze zameniti i sa nekoliko ugnezdjenih for-ova. Tako ce f-ja biti sporija ali kraca.

Iz ovoga se vidi da si pocetnik. Sjecam se svojih prvih koraka i teznjom sa sto vise optimiziram do granica normalnog.
No ovo je greska, jer nitko, ema bas nitko nece osjetiti tu razliku izmedju fora i switcha, a for ce ti povecati preglednost... iako algoritam ne funcionira.

Prijedlog:
Igraj se sa sto vise sa natjecateljskom informatikom, odnosno zadatcima, jer ce ti bas oni pomoci da razvijes osjecaj za takve vrste optimizacija, a da ne govorim o vrijednom znanju. Govorim iz iskustva.

Poz.
Re: Provjeravanje da li su u algebarskom izrazu sve zagrade pravilno zatvorene 20.02.2006. u 21:41 · pre 251 meseci #16
Citat:
npr. naredba ( a*3+[3-1]*2 ) je valjana.

Ma daj, molim te... priseti se prioriteta a vidi i primer u prvom postu teme.

Citat:
Iz ovoga se vidi da si pocetnik. Sjecam se svojih prvih koraka i teznjom sa sto vise optimiziram do granica normalnog.

Interesantan stereotip *pocetnika*. :p Bilo kako bilo, na mestu je bilo da spomenem alternative i razlike u njihovom ponasanju. Uzgred, *preglednost* (relativnog li pojma) ne znaci i *kratkoca*. Obrati paznju na reci koriscene u prethodna dva posta.

[Ovu poruku je menjao Mali Misha dana 20.02.2006. u 23:43 GMT+1]
Potpis
Ipak se ++uje.
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme