var s:string; cl,cr:integer; procedure right(l, r : integer); forward; procedure swap(l, r : integer); var c : char; begin if (l>=1) and (r<=length(s)) then begin c:=s[l]; s[l]:=s[r]; s[r]:=c; end; end; procedure left(l, r : integer); begin inc(cl); swap(l,r); if (r<length(s)) then right(l,r+1); end; procedure right(l, r : integer); begin inc(cr); swap(l,r); if (l>1) then left(l-1,r); end; begin s:='gogetgold'; left(9,1); writeln(s); writeln(cl,',',cr); end.
-
Apakah yang akan tercetak dari hasil pemanggilan perintah writeln(cl,’,’,cr)?
-
Jika perintah left(9,1) diganti dengan left(5,5), apakah yang akan tercetak dari hasil pemanggilan perintah writeln(s)?
-
Pemanggilan pertama menggunakan left(9,1) sehingga cl akan bernilai 1. kemudian prosedur left akan dipanggil oleh prosedur right selama l > 1, sedangkan prosedur right akan dipanggil selama nilai r < 9. Sehingga nilai cl akan bertambah sebanyak l0 – 1 sedangkan cr akan bertambah sebanyak length(s) – rawal.
Karena cl awal bernilai 1 (dari pemanggilan pertama), maka cl = 1 + (9-1) = 9.
cr = length(s) – 1 = 9 – 1 = 8.
Dengan demikian yang tercetak dari perintah tersebut adalah 9,8. -
Jika perintah diubah menjadi left(5,5), maka penukaran yang terjadi adalah:
(5,5), (5,6), (4,6), (4,7), (3,7), (3,8), (2,8), (2,9), (1,9)
gogetgold
gogegtold
gogtgeold
gogogetld
gotogegld
gologegtd
gtlogegod
gdlogegot
tdlogegogDengan demikian kata yang tercetak adalah tdlogegog.
Prosedur swap akan menukar posisi dua kata pada s.
Prosedur left dan right akan menukar posisi index l dengan r, namun pemanggilan left akan menambah nilai r sedangkan
pemanggilan right akan mengurangi nilai l. Kemudian cl dan cr akan bertambah setiap pemanggilan left (untuk cl) dan
right (untuk cr).