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. ![]() 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.
![]() 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/ |