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

Ispitivac zagradi-potrebna pomoc

[es] :: C/C++ programiranje :: Ispitivac zagradi-potrebna pomoc

[ Pregleda: 2889 | Odgovora: 19 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

sikzs
student

Član broj: 238898
Poruke: 4
*.adsl-a-1.sezampro.yu.



Profil

icon Ispitivac zagradi-potrebna pomoc08.11.2009. u 11:21 - pre 176 meseci
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]
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: Ispitivac zagradi-potrebna pomoc08.11.2009. u 11:43 - pre 176 meseci
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).
 
Odgovor na temu

sikzs
student

Član broj: 238898
Poruke: 4
*.adsl-a-1.sezampro.yu.



Profil

icon Re: Ispitivac zagradi-potrebna pomoc08.11.2009. u 14:24 - pre 176 meseci
Probao sam to shto si rekao jos pre nego sto sam postovao program, ali problem su ')(' neuparene zagrade. Ispisuje tacno.
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: Ispitivac zagradi-potrebna pomoc08.11.2009. u 15:30 - pre 176 meseci
Nisi lepo pročitao. Posle svakog dekrementiranja brojača moraš da ispituješ da li je brojač pao ispod nule.
 
Odgovor na temu

sikzs
student

Član broj: 238898
Poruke: 4
*.adsl-a-1.sezampro.yu.



Profil

icon Re: Ispitivac zagradi-potrebna pomoc08.11.2009. u 16:28 - pre 176 meseci
Hmm...opet sam negde pogresio...Ako bi mogao da mi ispises kod bilo bi super..
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: Ispitivac zagradi-potrebna pomoc08.11.2009. u 16:52 - pre 176 meseci
Bolje postavi ti ovde svoj kod, pa da vidimo u čemu je problem.
 
Odgovor na temu

sikzs
student

Član broj: 238898
Poruke: 4
*.adsl-a-1.sezampro.yu.



Profil

icon Re: Ispitivac zagradi-potrebna pomoc08.11.2009. u 17:16 - pre 176 meseci
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...
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: Ispitivac zagradi-potrebna pomoc08.11.2009. u 17:56 - pre 176 meseci
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.
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
*.dynamic.sbb.rs.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Ispitivac zagradi-potrebna pomoc08.11.2009. u 18:25 - pre 176 meseci
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;
}


 
Odgovor na temu

dusan2309
Dusan Lukic
diplomirani matematicar-informaticar
Srbija

Član broj: 189208
Poruke: 225
195.178.35.*



+1 Profil

icon Re: Ispitivac zagradi-potrebna pomoc08.11.2009. u 18:26 - pre 176 meseci
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");
}
 
Odgovor na temu

Burgos
Nemanja Borić
Amazon Web Services
Berlin

Član broj: 12484
Poruke: 1947
82.208.225.*

Sajt: stackoverflow.com/users/1..


+480 Profil

icon Re: Ispitivac zagradi-potrebna pomoc08.11.2009. u 19:38 - pre 176 meseci
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.
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: Ispitivac zagradi-potrebna pomoc08.11.2009. u 20:05 - pre 176 meseci
Čovek je početnik, nemoj da ga zbunjuješ suvišnim informacijama :-)
 
Odgovor na temu

unisoft
Uzice

Član broj: 124050
Poruke: 346
93.86.233.*



+1 Profil

icon Re: Ispitivac zagradi-potrebna pomoc24.11.2009. u 11:45 - pre 175 meseci
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.
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: Ispitivac zagradi-potrebna pomoc24.11.2009. u 11:55 - pre 175 meseci
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.
 
Odgovor na temu

unisoft
Uzice

Član broj: 124050
Poruke: 346
93.86.233.*



+1 Profil

icon Re: Ispitivac zagradi-potrebna pomoc24.11.2009. u 12:40 - pre 175 meseci
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
 
Odgovor na temu

unisoft
Uzice

Član broj: 124050
Poruke: 346
93.86.233.*



+1 Profil

icon Re: Ispitivac zagradi-potrebna pomoc24.11.2009. u 13:11 - pre 175 meseci
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 !!! :)
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: Ispitivac zagradi-potrebna pomoc24.11.2009. u 13:29 - pre 175 meseci
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.
 
Odgovor na temu

unisoft
Uzice

Član broj: 124050
Poruke: 346
93.86.233.*



+1 Profil

icon Re: Ispitivac zagradi-potrebna pomoc24.11.2009. u 13:40 - pre 175 meseci
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 !!!
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: Ispitivac zagradi-potrebna pomoc24.11.2009. u 13:55 - pre 175 meseci
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.
 
Odgovor na temu

unisoft
Uzice

Član broj: 124050
Poruke: 346
93.86.233.*



+1 Profil

icon Re: Ispitivac zagradi-potrebna pomoc24.11.2009. u 14:34 - pre 175 meseci
e onda je u redu.
 
Odgovor na temu

[es] :: C/C++ programiranje :: Ispitivac zagradi-potrebna pomoc

[ Pregleda: 2889 | Odgovora: 19 ] > FB > Twit

Postavi temu Odgovori

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