[ sikzs @ 08.11.2009. 11:21 ] @
Treba mi mala pomoc oko ovog programa:

Napisati program koji proverava da li su zagrade ( i ) dobro uparene. Na primer :
()(()()) tačno, ()())() netačno.

to treba da uradim tako sto cu editovati ovaj program:

Code:

#include <stdio.h>                       
#include <stdlib.h>
#include <ctype.h>
main()
{
    int c;
    int brSlova = 0;
    int brBrojeva = 0;
    int brOstalih = 0;
    while((c=getchar()) != EOF)
    {
        if (isalnum(c)){
            if (isdigit(c)) {
                brBrojeva++;
            } else if (isalpha(c)) {
                brSlova++;
            }
        }
        else if (c!=10){//10 je ENTER, pa da se izuzme iz brojanja
            brOstalih++;
        }
    }

    printf("U unetom tekstu ima :\nslova\t%d\nbrojeva\t%d\nostali\t%d\n", brBrojeva, brSlova, brOstalih );

    return 0;
}


hvala unapred

[Ovu poruku je menjao Mihajlo Cvetanović dana 08.11.2009. u 12:36 GMT+1]
[ Mihajlo Cvetanović @ 08.11.2009. 11:43 ] @
Dodao sam [code ] tagove za čitljiviji program.

Zagrade su dobro uparene ako nema višak zagrada. Kad proveravaš niz znak po znak treba da inkrementiraš neki brojač kad god naiđeš na '(' i dekrementiraš kad naiđeš na ')'. Na kraju niza brojač mora da ima istu vrednost kao na početku, to jest nula. Ako bilo kad u toku ispitivanja brojač padne ispod nule onda tu imaš ')' viška. Ako na kraju rada brojač bude veći od nule onda imaš '(' viška. Kad napraviš program testiraj ga sa nizom ")(" (neuparene zagrade).
[ sikzs @ 08.11.2009. 14:24 ] @
Probao sam to shto si rekao jos pre nego sto sam postovao program, ali problem su ')(' neuparene zagrade. Ispisuje tacno.
[ Mihajlo Cvetanović @ 08.11.2009. 15:30 ] @
Nisi lepo pročitao. Posle svakog dekrementiranja brojača moraš da ispituješ da li je brojač pao ispod nule.
[ sikzs @ 08.11.2009. 16:28 ] @
Hmm...opet sam negde pogresio...Ako bi mogao da mi ispises kod bilo bi super..
[ Mihajlo Cvetanović @ 08.11.2009. 16:52 ] @
Bolje postavi ti ovde svoj kod, pa da vidimo u čemu je problem.
[ sikzs @ 08.11.2009. 17:16 ] @
problem je uslov u while(????).... koristio sam gets() umesto getchar(jer je isto u ovom slucaju) i onda sam video da ne moze jer ne znam kako da ispitujem string posle toga...nemam predstavu kako da napravim ovaj program a da zauzima samo jedno mesto u memoriji...
[ Mihajlo Cvetanović @ 08.11.2009. 17:56 ] @
Prvo kažeš problem je primer neuparenih zagrada ")(", a onda problem je uslov u while petlji. Takođe, ne razumem šta to znači da program zauzima samo jedno mesto u memoriji. Postavi ovde kod, pa da i mi vidimo šta je problem. I stavi code tagove, da program bude čitljiviji.
[ X Files @ 08.11.2009. 18:25 ] @
Sto se tice provere uparenosti zagrada, evo ti mali test kod, a na tebi je da implementiras ostatak, kao sto ti je rekao Mihajlo:
Citat:

Zagrade su dobro uparene ako nema višak zagrada. Kad proveravaš niz znak po znak treba da inkrementiraš neki brojač kad god naiđeš na '(' i dekrementiraš kad naiđeš na ')'. Na kraju niza brojač mora da ima istu vrednost kao na početku, to jest nula. Ako bilo kad u toku ispitivanja brojač padne ispod nule onda tu imaš ')' viška. Ako na kraju rada brojač bude veći od nule onda imaš '(' viška. Kad napraviš program testiraj ga sa nizom ")(" (neuparene zagrade).


Code:

#include <stdio.h>
#include <stdlib.h>

int main( void )
{
    int brojac=0;
    //char ch, *izraz="()()()"; // 1 0 1 0 1 0
    // char ch, *izraz=")("; // -1 0
    // char ch, *izraz="((()))"; // 1 2 3 2 1 0
    //char ch, *izraz="((())))"; // 1 2 3 2 1 0 -1
    char ch, *izraz="(()()())"; // 1 2 1 2 1 2 1 0

    while ( ch = *izraz++ )
    {
        brojac += 1 * ( ch == '(' ) - 1 * ( ch == ')' );
        printf( "%d\n", brojac );
    }

    return 0;
}


[ dusan2309 @ 08.11.2009. 18:26 ] @
Evo kako bi mogao da se resi ovaj problem:
Code:

#include <stdio.h>
#include <stdlib.h>

int odgovarajuce(char z1, char z2)
{
 return (z1 == '(' && z2 == ')');
}

main()
{
 int c;
 char otvorene_zagrade[100];
 int br_otv = 0;
 while((c=getchar()) != '\n')
 {
  switch(c)
   {
    case '(':
     otvorene_zagrade[br_otv] = c;
     br_otv++;
     break;
    case ')':
     if (br_otv>0 && odgovarajuce(otvorene_zagrade[br_otv-1], c) )
     {
       br_otv--;
     }
     else
      {
       printf("Visak zatvorenih zagrada\n");
       exit(1);
      }
    break;
            
  }
}
if (br_otv == 0) printf("Zagrade su u ok\n");
else printf("Visak otvorenih zagrada\n");
}
[ Burgos @ 08.11.2009. 19:38 ] @
A možda bi mogao i da pretvoriš ceo izraz u prefiksni ili infiksni oblik - na taj način bi mogao da proveriš ispravnost celog izraza. Imaš gotovih primera na netu.

Pogledaj i materijale sa vežbi: rti.etf.rs, predmet Algoritmi i Strukture Podataka.
[ Mihajlo Cvetanović @ 08.11.2009. 20:05 ] @
Čovek je početnik, nemoj da ga zbunjuješ suvišnim informacijama :-)
[ unisoft @ 24.11.2009. 11:45 ] @
Da ti dam jedan vrlo lak odgovor za ovaj tvoj problem.

ovako ;
Code:

 char c;
 int otv = 0, zat = 0;

 while ((c = getchar()) != EOF & c != '\n' & c = '(') {
         otv++;
          ....... ;
         }
 while ((c = getchar()) != EOF & c != '\n' & c = ')') {
         zat++;
          ....... ;
         }
if ( otv == zat )
         printf("BROJ ZAGRADA JE JEDNAK");
else if
       printf("BROJ ZAGRADA NIJE JEDNAK);



ovo je ako sto rekoh veoma prost i lak odogovor koji svaki pocetnik moze razumeti , kod je veoma razumljiv naravno za pocetnika.

Kao sto svi znamo u C-jeziku ne postoji funkcija koja radi sa celim stringom vec samo sa jednim znakom pa zato c = getchar()) != EOF znaci petlja ce se izvrsavati sve dok se ne zavrsi red a red se zavrsava kada pritisnemo enter.
[ Mihajlo Cvetanović @ 24.11.2009. 11:55 ] @
Neće to da radi. Čitaš znakove u prvoj petlji dok ne dođeš do EOF, a onda ponovo čitaš drugoj petlji dok ponovo ne dođeš do EOF. Postoji samo jedan EOF, koliko ja znam. Čak i kad bi uspeo nekako da se prebaciš na početak pred drugu petlju program opet nema smisla jer recimo primer ")(" ima isti broj zagrada, ali nije dobro formiran.
[ unisoft @ 24.11.2009. 12:40 ] @
Malo se muci da napises program :).

ja sam ti samo dao osnove stvari, treba samo malko da se pomucis da zavrsis program do kraja.Malo razmisli sta treba da se uradi sa one dve petlje.

Evo poslednja pomoc. Stavis jednu petlju i u toj petlji na pocetku napisi c = getchar() a onda sa if ispituj slucajeve.

veruj mi veoma je lak program samo moras malo da razmislis kako da izmenis GORE napisano !!! malo se muci pa ako ne uspes ja cu ti pomoci
[ unisoft @ 24.11.2009. 13:11 ] @
Program koje radim su pisani u C-Free 4.0 verziji pa ako imas neki problem pokreni ga sa ovim kompajlerom.
He izvinjenje sa moje strane zato sto ne moze da se u napise ( zagrada vec kada pritisnes shift+9 za znak ( on ti prikaze <.Stavrno ne znam kako je kod tebe meni moguce da je ovako zbog programa

evo resenja
Code:

#include <stdio.h>
main()
{
    char c, n;
    int otv =0, zat = 0;
    
    while ((c = getchar()) != EOF ) {
        n = c;
        if (n == '\n')           /*  komanda \n je za prelazak u novi red */
            goto a;
        if (n == '>')
            otv++;
        if (n == '<')
            zat++;
        }
a:
    if (otv == zat)
        printf(" \n \t BROJ ZAGRADA JE JEDNAK:  >= %d   <= %d \n",otv,zat);
    if (otv != zat)
        printf(" \n \t BROJ ZAGRADA NIJE JEDNAK: >= %d  <= %d \n",otv,zat);
}    

ako ti radis u nekom drugom C programu koji kada pokrenes prikazuje ti ( i ) ti u kodu kod if zameni '>' sa '(' i '<' sa ')'


Koji je tvoj komentar sada !!! :)
[ Mihajlo Cvetanović @ 24.11.2009. 13:29 ] @
Prvo, ja nisam originalni poster, meni ne treba rešenje. Drugo, originalni poster se nije dugo javljao, tako da možemo pretpostaviti da mu pomoć više ni ne treba. Treće, da bi ovaj kod proradio treba mu još samo jedan deo u uslovu while petlje:

Code:
while ((c = getchar()) != EOF && otv >= zat)


I četvrto, goto se izbegava ako postoji drugo rešenje. Ovde ladno možeš da staviš break. Sve ostalo je u redu.
[ unisoft @ 24.11.2009. 13:40 ] @
He he.Ja sam odgovorio na temu - nisam citao postove drugih.Naravno.Slazem se sa tobom.GoTo se izbegava u svim knjiga to pise ali mrzelo me da malo bolje mozgam ja sam mu napisao resenje 1 od mogucih pa sada ako zna neke osnovne stvari u C moze kod lako da prepravi .

a za ovaj deo se ne bih slozio
Code:

&& otv >= zat


jel sta ako u jednom trenutku ima vise zat od otv a nije jos EOF kraj fajla,nije procitao sve znakove...


Na primer otkucamo:


w223>2312321> 213213 <2323 <232332 <233232 wewewewe wewe w> wewewe>
>.1 >2. <.1 <2. <3. >.3. >.4
sada je 2 3 a ostale su jos dve zagrade vidis na sta mislim

:) po meni ako dobro vidim && otv >= jer && znaci 'i' - petlja se prekida ako jedna od ova dva uslova nije TRUE zato ovo je greska ako dopisemo u while petlji.Mozda se nismo dobro razumeli !!!
[ Mihajlo Cvetanović @ 24.11.2009. 13:55 ] @
Pročitaj originalni zadatak. Ne traži se da li je broj otvorenih i zatvorenih zagrada jednak, nego da li su zagrade uparene. Ovaj dodatni uslov upravo to rešava.
[ unisoft @ 24.11.2009. 14:34 ] @
e onda je u redu.