FONForum
http://www.fonforum.org/

Mala slova u velika - pascal procedura
http://www.fonforum.org/viewtopic.php?f=8&t=1323
Stranica 1 od 3

Autoru:  Black [ 04.11.2002. 23:58:45 ]
Tema posta: 

Zadatak glasi ovako:
Napisati proceduru koja mala slova niske X zamenjuje velikim. Ostali znakovi u nisci ostaju nepromenjeni.

Zaboravio sam kako se ovo radi ???

Autoru:  Black [ 05.11.2002. 04:53:39 ]
Tema posta: 

A evo i resenja

procedure promeni (var x:string);
var i:integer;
begin
for i:=1 to lenght (x) do
x[i]:=upcase (x[i]);
end;

Nego... kako biste uradili ovaj:
Napisati proceduru koja sortirane nizove x i y spaja u sortirani niz z.

Autoru:  zAkiLi [ 05.11.2002. 09:21:27 ]
Tema posta: 

Nisi dovoljno detaljno postavio zadatak.
Da li nizovi x i y imaju isti broj clanova?

Mislim da bi najlakse bilo da se uradi sa dve petlje, u prvoj da se napravi i napuni niz z, a u drugoj da se sortira.
Kod:
Procedure nizovi (x,y :array [1..10] of integer;var z:array[1..10] of integer; bX,bY: integer; var bZ:integer);

Var i,j,pom : integer;

Begin
   For i := 1 to bX do
            z[i]:=x[i];
   For i:=bX to bX+bY do
            z[i]:=y[i];
   bZ:=bX+bY;
   
  For i:= 1 to bZ-1 do
        For j:= i to bZ do
              if z[j]>z[i] then
                   begin
                       pom:=z[j];
                       z[j]:=z[i];
                       z[i]:= pom;
                   end;
End;   


Mozda jeste malo glomaznije, ali je najlakse resenje :)

Autoru:  Black [ 05.11.2002. 11:49:11 ]
Tema posta: 

Mislim da ti se potkrala greska. Elemente niza Y bi trebalo ubaciti ovako
Kod:
for i:=bX+1 to bX+bY do
 z[i]:=Y[i-bX];


Jer su clanovi niza Y takodje indeksirani od 1 pa do bY.

U svakom slucaju ideja je dobra, treba se snaci :)
Ali mene i dalje kopka da li bi nekako mogli da iskoristimo to sto su nizovi X i Y vec sortirani.

Autoru:  aleksaX [ 05.11.2002. 15:19:34 ]
Tema posta: 

A ovako:

Kod:

i:=1; r:=1; j:=1;
while (j<=nb) do
        begin
          while (i<=na) and (a[i]<=b[j]) do
              begin
                if a[i]=b[j] then
                j:=j+1
                c[r]:=a[i];
                i:=i+1;
                r:=r+1;
              end;

          c[r]:=b[j];
          r:=r+1;
          j:=j+1;
        end;



Nisam pisala celu funkciju, ali se podrazumeva da saljes sortirane nizove a i b

Autoru:  BugiVugi [ 05.11.2002. 17:49:35 ]
Tema posta: 

zAkiLi je napisao:
Kod:
  For i:= 1 to bZ-1 do
        For j:= i to bZ do
              if z[j]>z[i] then
                   begin
                       pom:=z[j];
                       z[j]:=z[i];
                       z[i]:= pom;
                   end;

Ispravka (druga linija):
Kod:
for j:=i+1 to bZ do

Autoru:  kruzer [ 05.11.2002. 18:12:26 ]
Tema posta: 

bl

Autoru:  kruzer [ 05.11.2002. 18:19:01 ]
Tema posta: 

kruzer je napisao:
aleksaX je napisao:
Nisam pisala celu funkciju, ali se podrazumeva da saljes sortirane nizove a i b

Autoru:  kruzer [ 05.11.2002. 19:35:04 ]
Tema posta: 

E nemam na kompu pascal, a po

Autoru:  zlatko [ 05.11.2002. 20:29:20 ]
Tema posta: 

kruzer je napisao:
if (((x<an) & (a[x]<b[y])) | (y+1>bn)) c[z]=a[x++];

Da li si siguran da si upotrebio prave logi

Autoru:  zlatko [ 05.11.2002. 20:31:06 ]
Tema posta: 

Evo re

Autoru:  BugiVugi [ 05.11.2002. 20:44:25 ]
Tema posta: 

Sto se tice resenja AleksaX ono ne radi ... izbacuje duplirane elemente iz konacnog niza c.

Evo poredjenja mog resenja sa resenjem zakilija, obzirom da svi znamo da bi kod u c++ radio sigurno brze nego pascal-ov, pa ga zato nisam ni testirao.

zAkiLi je napisao:
Nisi dovoljno detaljno postavio zadatak.
Da li nizovi x i y imaju isti broj clanova?

Mislim da bi najlakse bilo da se uradi sa dve petlje, u prvoj da se napravi i napuni niz z, a u drugoj da se sortira.
Kod:
Procedure nizovi (x,y :array [1..10] of integer;var z:array[1..10] of integer; bX,bY: integer; var bZ:integer);

Var i,j,pom : integer;

Begin
   For i := 1 to bX do
            z[i]:=x[i];
   For i:=bX to bX+bY do
            z[i]:=y[i];
   bZ:=bX+bY;
   
  For i:= 1 to bZ-1 do
        For j:= i to bZ do
              if z[j]>z[i] then
                   begin
                       pom:=z[j];
                       z[j]:=z[i];
                       z[i]:= pom;
                   end;
End;   


Mozda jeste malo glomaznije, ali je najlakse resenje :)

Sto se tice zakilijevog resenja, ono jeste, mozda, najlakse, ALI evo brzeg:

Kod:
begin
  ka := 1; kb := 1; kc := 1;
  ia := true;
  while kc < 6 do
  begin
    if (kb = 3) then ia := true;
    if (ka = 3) then ia := false;
    if (ia) then
    begin
      if (kb = 3) then begin c[kc] := a[ka]; inc(kc); inc(ka); end;
      if (a[ka] <= b[kb]) then begin c[kc] := a[ka]; inc(kc); inc(ka); end else ia := false;
    end else
    begin
      if (ka = 3) then begin c[kc] := b[kb]; inc(kc); inc(kb); end;
      if (b[kb] <= a[ka]) then begin c[kc] := b[kb]; inc(kc); inc(kb); end else ia := true;
    end;
  end;
end;


a,b,c nizovi (1-based) gde je c niz koji treba da se sacini spajanjem sortiranih a i b. Pretpostavio sam da su nizovi a i b sa 3 elementa (c ce imati 6).

Kako sam merio ovo i zakilijevo resenje? Stavio sam u for petlju (od 1000000 iteracija) oba resenja. Sa funkcijom(koja vraca trenutno vreme u Msec):
Kod:
TimeStampToMsecs(DateTimeToTimeStamp(Now));

sam uzeo vremena neposredno pre i posle izvrsenja ciklusa, oduzeo ih i dobio da se moje resenje izvrsava za ~109Msec a zakilijevo za ~178Msec, sto ce reci da je moje bre za ~39,1%. Napominjem da sam oba resenja pokrenuo pod identicnim memorijskim i procesorskim uslovima, a sve to u Delphi 5. Ako treba detaljniji komentar na kod, tu sam ... mada se prolaskom kroz resenje moze videti sta ono radi.

.to kruzer: Pa nije bitno koliko ima linija tvoj kod (dobro, u razumnim granicama) vec brzina izvrsavanja, evo zakili ima duplo manje linija od mene (ako expand-ujes moje begin i end) ali je moj kod, dokazano, brzi. :D

P.S. Interesantno je to da kada se, recimo moje, resenje smesti u funkciju i poziva tako za izvrsavanje gore napomenute for petlje trebace ~247Msec sto je vise nego duplo u odnosu kada se kod direktno izvrsava.

Autoru:  aleksaX [ 05.11.2002. 23:44:23 ]
Tema posta: 

Huh, kod mene je radilo... :o...mislim nije mi dupliralo elemente...

Autoru:  kruzer [ 06.11.2002. 01:04:43 ]
Tema posta: 

BugiVugi je napisao:
a.to kruzer: Pa nije bitno koliko ima linija tvoj kod (dobro, u razumnim granicama) vec brzina izvrsavanja, evo zakili ima duplo manje linija od mene (ako expand-ujes moje begin i end) ali je moj kod, dokazano, brzi. :D

ma

Autoru:  kruzer [ 06.11.2002. 01:06:29 ]
Tema posta: 

zlatko je napisao:
Da li si siguran da si upotrebio prave logi

Autoru:  zlatko [ 06.11.2002. 07:57:23 ]
Tema posta: 

kruzer je napisao:
// Copyright by Kruzer 2002
void sort(int a[], int b[], int *c, int an, int bn) {
int x=0, y=0, z;
for (z=0; z<(bn+an); z++)
if (((x<an) & (a[x]<b[y])) | (y+1>bn)) c[z]=a[x++];
else c[z]=b[y++];
}

Ko razume - shvati

Autoru:  aleksaX [ 06.11.2002. 09:13:20 ]
Tema posta: 

Ajde sada probajte pa mi recite jer proradio moj programcic :)

Kod:

i:=1; r:=1; j:=1;
while (j<=nb) do
   begin
     while (i<=na) and (a[i]<=b[j]) do
        begin
         if a[i]=b[j] then
           begin
      c[r]:=b[j];
      j:=j+1;
      r:=r+1;
      i:=i+1;
            end
         else
       begin
      c[r]:=a[i];
      i:=i+1;
      r:=r+1;
      end;
       end;

     c[r]:=b[j];
     r:=r+1;
     j:=j+1;

     if j>nb then
     c[r]:=a[i];
     end;


Uf, od kada ovo nisam radila!

Autoru:  zlatko [ 06.11.2002. 10:05:31 ]
Tema posta: 

Bugi tvoj kod delimi

Autoru:  zAkiLi [ 06.11.2002. 10:44:09 ]
Tema posta: 

I? Zar posle svega niste videli da je najlakse prvo spojiti nizove, a zatim sortirati novodobijeni :)
Sorry zbog greske, kucao sam "iz glave"....

Autoru:  kruzer [ 06.11.2002. 15:34:03 ]
Tema posta: 

zlatko je napisao:
E sad da

Autoru:  kruzer [ 06.11.2002. 17:25:33 ]
Tema posta: 

zlatko je napisao:
Ovo je najefikasnije i najkra

Autoru:  BugiVugi [ 06.11.2002. 17:41:23 ]
Tema posta: 

zlatko je napisao:
Bugi tvoj kod delimi

Autoru:  zlatko [ 07.11.2002. 09:44:39 ]
Tema posta: 

Kona

Autoru:  zlatko [ 07.11.2002. 15:39:50 ]
Tema posta: 

kruzer je napisao:
Aj ti umesto

Autoru:  zlatko [ 07.11.2002. 15:42:18 ]
Tema posta: 

BugiVugi je napisao:
Da li je moguce? Jesi li proverio kroz pascal? Evo upravo sam pustio kroz Delphi date nizove i vratio je u prvom slucaju c=6,7,8,9,10,11 i u drugom c=7,7,8,9,10,10 ... dakle, radi. Proveri ti to opet ... nemoguce da ne radi.

Probao sam na TP7 i jopet isto. A mo

Stranica 1 od 3 Sva vremena su u UTC + 1 sat
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/