[ Emp @ 09.04.2005. 21:31 ] @
Ako moze pomoc oko sledeceg zadatka bio bih zahvalan:)

Zadatak:Napisati program koji sa standardnog ulaza ucitava prirodan broj k,a zatim u sledecih k redova rijeci engleske abecede duzine ne vece od 50 i za svaku od ucitanih rijeci provjerava da li je oblika a^n•c•b^2n•d ( n prirodan broj ili nula).Na primjer,rijeci cd,acbbd i aacbbbbd jesu datog oblika,dok aacbbbd,daacb i aaacbb nisu.
[ IgLo @ 10.04.2005. 00:11 ] @
Ajde da prvo malo prokomentarisem:

1. Predpostavicu da vazi komutativnost, odnosno da je aabbccdd = abcdabcd = cadbabdc idt.
2. A elemente ne moramo posmatrati uopste jer koliko god da ih ima (ili ih uopste nema) rec je ispravna
3. C elemenata moze biti 1 i samo 1
4. D elemenata moze biti 1 i samo 1
5. B elemenata mora biti paran broj ili 0
6. u reci moze biti iskljucivo A, B, C i D elemenata
7. A=a, B=b, C=c, D=d

Ako je ovo sto sam gore predpostavio tacno, onda ce ti sledeci kod pomoci:

Code:

Program ProveraReci;

Const
     MaxReci = 100;
     MaxLen = 50;

Var
   k,
   X : Integer;

   Reci : Array [1..MaxReci] Of String;

   Duzine : Array ['A'..'D'] Of Integer;

   Ch : Char;

Function UpperCase (S : String) : String;

Var
   x : Integer;

Begin
     For X := 1 To Length (S) Do
         S [x] := UpCase (S [x]);
     UpperCase := S;
End;

Begin

     Repeat
           Write ('Koliko reci zelite da unesete (1-', MaxReci, ')? ');
           ReadLn (k);
           If (k < 1) Or (K > MaxReci) Then
              Write ('Pogresan unos ! ');
     Until (K >= 1) And (K <= MaxReci);

     For X := 1 To K Do Begin
             Repeat
                   Write ('Unesite rec pod rednim brojem ', x, ': ');
                   ReadLn (Reci [x]);
                   If Length (Reci [x]) > MaxLen Then
                      WriteLn ('Predugacka rec! Maksimalna duzina je ', MaxLen, ' znakova!')
                   Else
                       Reci [x] := UpperCase (Reci [x]);
             Until (Length (Reci [x]) <= MaxLen);
     End;

     For X := 1 To K Do Begin
         Write (x, ': Rec ', Reci [x], ' je ');
         For Ch := 'A' To 'D' Do Begin
             Duzine [Ch] := 0;
             While Pos (Ch, Reci [x]) > 0 Do Begin
                   Inc (Duzine [Ch]);
                   Delete (Reci [x], Pos (Ch, Reci [x]), 1);
             End;
         End;
         If Length (Reci [x]) > 0 Then
            WriteLn ('neispravna jer ima ilegalnih karaktera')
         Else If Duzine ['C'] <> 1 Then
            WriteLn ('neispravna jer nema 1 i samo 1 element C ')
         Else If Duzine ['D'] <> 1 Then
            WriteLn ('neispravna jer nema 1 i samo 1 element D ')
         Else If (Duzine ['B'] Mod 2) <> 0 Then
            WriteLn ('neispravna jer ima neispravan broj B elemenata')
         Else
             WriteLn ('ispravna');

     End;
     readln;
End.


Program je testiran u TP7.0, ne znam da li For petlje sa Char-ovima rade u predhodnim verzijama.
[ noviKorisnik @ 10.04.2005. 03:09 ] @
Citat:
IgLo:
1. Predpostavicu da vazi komutativnost, odnosno da je aabbccdd = abcdabcd = cadbabdc idt.
2. A elemente ne moramo posmatrati uopste jer koliko god da ih ima (ili ih uopste nema) rec je ispravna
3. C elemenata moze biti 1 i samo 1
4. D elemenata moze biti 1 i samo 1
5. B elemenata mora biti paran broj ili 0
6. u reci moze biti iskljucivo A, B, C i D elemenata
7. A=a, B=b, C=c, D=d

Pogledaj šta kaže pravilo:
Citat:
Emp:
a^n•c•b^2n•d

Redosled je bitan. Ide n puta "a", pa tačno jedno "c", pa dva n puta "b" i na kraju dolazi jedno "d".
Dakle:
1. Kakva komutativnost? Slovo "d" je tačno jedno i nalazi se na kraju reči. Reč nije ispravna ako nema slovo "d", nije ispravna ni ako ima više od jednog, kao ni ako ima jedno koje se ne nalazi na kraju reči. Ovo poslednje isključuje komutativnost.
2. A elemente moramo posmatrati jer ukoliko ih ima, moraju se sva nalaziti na početku reči pre bilo kog drugog elementa. Bitno je koliko ima elemenata A. Taj broj je n.
3. OK, tačno jedno C, pre koga može da bude samo A, a posle mora da bude B ili D.
4. OK, tačno jedno D, i to samo na kraju reči. Pre njega je C ili B.
5. OK, B elemenata mora biti duplo više nego A, dva puta broj n. Pre B grupe elemenata mora da se nalazi C, a iza D.
[ RnD57 @ 10.04.2005. 04:38 ] @
{Nakon shto zavrshish unos, provere validnosti ulaza i sav taj fancy interface, napravi neshto ovako:}

boolean dobraRech:=true;
int n:=0;

while rech[n+1][k]='a' do n:=n+1; { naravno, unos cesh prilagoditi tako da ti se rechi pamte u matrici 50x100 dimenzija (ako je 100 max(k)) tj. char rech[50][100]. Za kraj jedne rechi u matrici koristi, recimo $ ili u posebnom nizu chuvaj broj slova svake rechi}

if rech[n+1][k]<>'c' then dobraRech:=false;
else if n>0 then
for i= 1 to 2*n do
if rech[n+1+i][k]<>'b' then dobraRech:=false;

if dobraRech then if rech[3*n+2][k]<>'d' then dobraRech:=false;

if rech[3*(n+1)][k]<>'$' then dobraRech:=false; {ako koristish $ za oznachavanje kraja rechi}
{if (3*n+2)<>duzhina[k] then dobraRech:=false; ako koristish onaj dodatni niz za duzhine}

{Ovo bi trebalo da pokrije sve shto treba, samo ne zaboravi da to stavish pod neki veliki for da ti odradi svaku rech. Mozhesh neke uslove da stavish pod jedan if, samo sa and izmedju, naravno. Bitno ti je samo da ti je onaj while na pochetku, kako bi izrachunao broj 'a'-ova, a ostale uslove mozhesh i proizvoljno da premeshtash. Npr. mozhesh provere za 'c' i 'd' da stavish odmah posle while-a pod jedan if, a pod njegovim else-om onu for petlju, kako bi u sluchaju da broj 'c'-ova ili 'd'-ova ne valja zaobishao celu for petlju}

{Izvini za eventualne greshke u sintaksi...Ne secam se najbolje pascala...8)}