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

Pomoc oko zadatka

[es] :: Pascal / Delphi / Kylix :: Pomoc oko zadatka

[ Pregleda: 1985 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Suvajac
Srbac

Član broj: 281681
Poruke: 7
*.teol.net.



+4 Profil

icon Pomoc oko zadatka23.05.2011. u 14:07 - pre 157 meseci
Imam problem oko zadatka, zadatak glasi:

Broj je ”dobar” ako mu je svaka cifra veća od zbira cifara, koje se nalaze desno od nje. Na primer, dobri brojevi su 7, 531 i 8421, a brojevi 33, 287 i 321 nisu dobri. Napisati program kojim se unose prirodni brojevi dok se ne unese 0, a ispisuje se najveći ”dobar” broj. Ako takav broj među unetim brojevima ne postoji, dati odgovarajuću poruku.

Ja sam uradio zadatak, ali kad unesem neki sestocifren ili sedmocifren broj, program mi ne daje tacne rezultate. Zasto???
Code:
program peti;
var da,db,ta,tb,tc,ca,cb,cc,cd,pa,pb,pc,pd,pe,i,g,max:integer;
    broj:array[1..20] of integer;
begin
  repeat
    g:=g+1;
    write(g,'.broj: ');
    readln(broj[g]);
  until broj[g]=0;
  max:=0;
  for i:=1 to (g-1) do
    begin
      if (broj[i]>9) and (broj[i]<100) then
        begin
          da:=broj[i] div 10;
          db:=broj[i] mod 10;
          if da>db then
            max:=broj[i];
        end;
      if (broj[i]>99) and (broj[i]<1000) then
        begin
          ta:=broj[i] div 100;
          tb:=broj[i] mod 100 div 10;
          tc:=broj[i] mod 100 mod 10;
          if (ta>tb+tc) and (broj[i]>max) then
            max:=broj[i];
        end;
      if (broj[i]>999) and (broj[i]<10000) then
        begin
          ca:=broj[i] div 1000;
          cb:=broj[i] mod 1000 div 100;
          cc:=broj[i] mod 1000 mod 100 div 10;
          cd:=broj[i] mod 1000 mod 100 mod 10;
          if (ca>cb+cc+cd) and (broj[i]>max) then
            max:=broj[i];
        end;
      if (broj[i]>9999) and (broj[i]<100000) then
        begin
          pa:=broj[i] div 10000;
          pb:=broj[i] mod 10000 div 1000;
          pc:=broj[i] mod 10000 mod 1000 div 100;
          pd:=broj[i] mod 10000 mod 1000 mod 100 div 10;
          pe:=broj[i] mod 10000 mod 1000 mod 100 mod 10;
          if (pa>pb+pc+pd+pe) and (broj[i]>max) then
            max:=broj[i];
        end;
  end;
  if max<>0 then
    write('Rezultat je: ',max)
  else
    write('Nema dobrih brojeva!');
  readln;
end.
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Pomoc oko zadatka23.05.2011. u 22:40 - pre 157 meseci
> Ja sam uradio zadatak, ali kad unesem neki sestocifren ili sedmocifren broj, program mi ne daje tacne rezultate. Zasto???

Ti obrađuješ brojeve do 100000 tj. 5 cifara. Moraš dodati i ostale uslove ili ako možeš prepisati program da koristi rekurziju što je prirodan način rešavanja ovakvog problema.
 
Odgovor na temu

Suvajac
Srbac

Član broj: 281681
Poruke: 7
*.teol.net.



+4 Profil

icon Re: Pomoc oko zadatka24.05.2011. u 15:57 - pre 157 meseci
Pa to i jest problem, nemogu ja za sve i jedan broj koji postoji postaviti uslov. A za rekurziju jos nisam cuo, pa ako moze neka pomoc....
 
Odgovor na temu

((BugA))
Igor Djordjevic
Bor, Srbija

Član broj: 29241
Poruke: 196
*.dynamic.isp.telekom.rs.

ICQ: 66516695
Sajt: www.MalamutKlub.com


+17 Profil

icon Re: Pomoc oko zadatka24.05.2011. u 22:57 - pre 157 meseci
Smes li da koristis funkcije/procedure, ili sve mora ovako "pesice"?

Najprostije receno, rekurzija je kada funkcija/procedura u toku svog izvrsavanja poziva samu sebe (ukoliko je i dalje potrebno izvrsavati to sto funkcija/procedura radi). Time se nastavlja dalje izvrsavanje funkcije/procedure "po dubini" - prvi poziv funkcije ne moze da se zavrsi dok se ne zavrsi drugi poziv, i tako redom ( 1 - 2 - 3 - 4 - ... - 4 - 3 - 2 - 1 ). Da te ne zbunjujem, bitno je da se funkcija moze koristiti unutar sebe same kada je to potrebno (tj. dokle god je to potrebno), bez potrebe da se pise novi deo koda ili nova funkcija, i bez potrebe da se sama funkcija ponovo poziva iz programa (sama sebe "vrti" koliko god treba, a zatim konacno resenje vraca programu - za primer broja 8421 funkcija ce proveriti broj 8 > 4+2+1, zatim 4 > 2+1, pa 2 > 1, i na kraju 1 (>0) - i tek ako je svaki broj "dobar', vratice true za ceo broj 8421).

Evo jednog moguceg resenja (ukoliko smes da koristis funkcije). Verovatno moze i krace (i bolje :), no eto ti ovo za pocetak, pa ti izvuci zakljucak za sebe :) Zadaj sebi neke brojeve, pa probaj na papiru da pratis sta se desava i kako ovo radi. Sustina je da ce ovo raditi za bilo koje brojeve - s tim da si na pocetku zadao da je moguce uneti najvise 20 brojeva, i da je tip podatka deklarisan kao LongInt (koliki je to broj zavisi od verzije kompajlera koji korisitis, pogledaj help). Mozes i da vratis Integer kao sto si hteo, ali to je (dosta) manji broj (manje cifara), pogotovo ako koristis neki Turbo Pascal...
Code:
program peti;

var i, g: integer;
    max: LongInt;
    broj: array[1..20] of LongInt;
    
function jeDobar(x: LongInt): boolean;
var L, D, c, i: integer;
    y: LongInt;
begin
    { inicijalizacija }
    jeDobar := false;    { pretpostavljamo da broj nije "dobar" }
    y := x;              { privremena promenljiva }
    c := 0;              { brojac cifara }
    L := 0;              { cifra levo }
    D := 0;              { zbir cifara sa desne strane }
    { provera da li je broj "dobar", }
    { razdvajanje cifara }
    repeat
        c := c + 1;       { brojimo novu cifru }
        D := D + L;       { sabiramo cifre sa desne strane }
        L := y mod 10;    { izdvajanje poslednje cifre }
        y := y div 10;    { izbacivanje poslednje cifre }
    until (y = 0);
    { poredjenje }
    if (L > D) then
    begin
        if (c = 1) then jeDobar := true
        else
        begin
            { izbacivanje prve cifre }
            y := L;
            for i := 1 to (c - 1) do y := y * 10;
            x := x - y;
            { proveri novi broj, bez prve cifre }
            jeDobar := jeDobar(x); { eto rekurzije ;) }
        end;
    end
    else jeDobar := false; { broj nije "dobar" }
end;    
    
begin
    { inicijalizacija }
    g   := 0;
    max := 0;
    { upisivanje brojeva }
    repeat
        g := g + 1;
        write(g, '.broj: ');
        readln(broj[g]);
    until ((broj[g] = 0) or (g = 20));
    { provera brojeva }
    for i := 1 to g-1 do
    begin
        if ((jeDobar(broj[i])) and (broj[i] > max)) then max := broj[i];
    end;
    if (max <> 0) then write('Rezultat je: ', max)
    else write('Nema dobrih brojeva!');
    readln;
end.


[Ovu poruku je menjao ((BugA)) dana 25.05.2011. u 08:18 GMT+1]
 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: Pomoc oko zadatka

[ Pregleda: 1985 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

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