UJIAN TENGAH SEMESTER GANJIL 2008/2009 NIM: dan Struktur Data / CS2014 Nama : HARI : Rabu, 5 November 2008 WAKTU DOSEN SIFAT : 135 menit : TIM : Tutup Buku Tanda tangan: Petunjuk: Periksalah kelengkapan halaman soal. Tidak ada toleransi penilaian bagi mahasiswa yang lalai memeriksa kelengkapan halaman soal. Soal terdiri atas dua bagian dengan rincian: empat soal studi kasus dan lima soal pilihan ganda, dan semua dikerjakan pada lembar soal ini. A. Bagian I. Studi Kasus 1. BUKU Diketahui data pengarang dan buku. Aturan yang berlaku adalah : seorang pengarang dapat mengarang dapat mengarang lebih dari satu buku, dan satu buku dapat dikarang oleh lebih dari 1 buku dapat dikarang oleh lebih dari satu pengarang. Pengarang dan buku memiliki identitas yang unik Contoh : B1 B2 B3 P1 P2 P3 P2 P1 P3 KodeBuku : B1, B2, B3 IdPengarang : P1, P2, P3 Representasi : a. Tuliskan kamus untuk mendefinisikan tipe data berdasarkan representasi struktur Halaman 1 dari 15
data di atas! Jawab: type adrpengarang = ^ElmtPengarang type adrbuku = ^ElmtBuku type adrrelasi = ^ElmtRelasi type ElmtPengarang = <IdPengarang: string; Mengarang: adrrelasi; Next: adrpengarang> type ElmtBuku = <KodeBuku: string; Next: adrbuku> type ElmtRelasi = <Pengarang: adrbuku; Next: adrrelasi> type ListPengarang = <P: adrpengarang> type ListBuku = <B: adrbuku> b. Tuliskan procedure untuk mencetak idpengarang jika diketahui kodebuku. Contoh : input : B3 maka yang dicetak adalah idpengarang dari pengarang buku B3 yaitu: P1, P3 Procedure CetakIdPengarang (input LBuku:ListBuku; input LPengarang:ListPengarang; input KodeCari:string) {I.S. LBuku adalah list buku dan LPengarang list Pengarang, keduanya terdefinisi dan tidak kosong} {F.S. Data pengarang dengan KodeCari diketahui telah dicetak } pbuku: adrbuku ppengarang: adrpengarang prel: adrrelasi pbuku LBuku. {Pencarian KodeBuku yang bersesuaian dengan KodeCari} while (pbuku^.next<>nil) and (pbuku^.kodebuku<>kodecari) do pbuku pbuku^.next {EndWhile} if pbuku^.kodebuku = KodeCari then ppengarang LPengarang. while ppengarang<>nil do prel ppengarang^.mengarang while prel<>nil do if prel^.pengarang=pbuku then output(ppengarang^.idpengarang) prel prel^.next {EndWhile} ppengarang ppengarang^.next else 0utput ( data tidak ada ) Petunjuk : Selain perintah output yang ada di template soal, tidak ada perintah output lagi c. Tuliskan algoritma procedure untuk mencetak jumlah buku yang sudah dikarang oleh masing-masing penulis. Halaman 2 dari 15
Procedure JmlBukuPenulis (input LPengarang :ListPengarang; input LBuku:ListBuku) {I.S. ListPengarang adalah list Pengarang dan LBuku list buku, keduanya terdefinisi dan tidak kosong} {F.S. Kode setiap pengarang beserta jumlah buku yang dikarangnya telah dicetak} ppengarang: adrpengarang prel: adrrelasi JumBuku : integer {Jumlah buku} ppengarang LPengarang. while ppengarang<>nil do output(ppengarang^.idpengarang) prel ppengarang^.mengarang JumBuku 0 while prel<>nil do JumBuku JumBuku + 1 prel prel^.next {prel=nil} Output(JumBuku) ppengarang ppengarang^.next {pmk=nil} Petunjuk : Selain perintah output yang ada di template soal, tidak ada perintah output lagi 2. BILANGAN GANJIL Jika diketahui definisi kamus sebagai berikut: address:^element_list Element_list=Record < info:integer next:address > List=Record < : address > Tuliskan algoritma untuk menghapus semua bilangan ganjil, baik positif maupun negatif. Gambar di bawah ini menggambarkan kondisi initial state dan final state dari persoalan tersebut. Function DeleteOdd(I/O L:List) integer { mengembalikan jumlah elemen yang dihapus jika berhasil, dan nilai 0 jika tidak ada Halaman 3 dari 15
elemen yang terhapus. List L terdefinisi, mungkin kosong.} p,prec : address count: integer count 0 prec nil p first(l) while p<>nil if (info(p)mod 2 = 1) then count++ /* periksa posisi p */ if prec=nil then /*delete first*/ first(l) next(first(l)) p first(l) else /* delete after and last */ next(prec) next(next(prec)) p next(prec) else { jika elemen bilangan genap } prec p p next(p) {end while} count 3. DATA PROYEK Suatu sistem harus mengelola data pegawai terhadap proyek yang dikerjakannya. Hal ini untuk keperluan honor yang akan diterima oleh setiap pegawai sesuai kontribusi waktu. Informasi lengkapnya dapat dilihat pada tabel di bawah ini: Tabel Pegawai Id_Pegawai Nama TanggalLahir P1 Joe 7 Juli 1949 P2 Mary 3 Juni 1961 P3 Andrew 11 Pebruari 1965 P4 Joe 22 April 1964 P5 Jill 17 Mei 1966 Tabel Proyek Id_Proyek Deskripsi Tarif per satuan waktu Proj 1 SIM Akademik 100000 Proj 2 SIM Perpustakaan 200000 Proj 3 SIM Kepegawaian 150000 Tabel Pegawai_Proyek Id_Pegawai No Proyek Total waktu untuk proyek P1 Proj 1 20 P3 Proj 1 16 P2 Proj 2 35 P2 Proj 3 42 P3 Proj 2 17 P2 Proj 1 83 P5 Proj 3 41 Halaman 4 dari 15
Jika informasi tersebut direpresentasikan dengan struktur data internal seperti gambar di bawah ini Jawab: a. Tuliskan kamus untuk representasi tersebut Type adrrelasi: pointer to ElmtRelasi Type adrpeg: pointer to ElmtPeg Type adrproj: pointer to ElmtProj Type ElmtRelasi: < waktu: integer; Pegawai: adrpeg; Proyek: adrproj; nextrelasi: adrrelasi > Type ElmtPeg: < idpeg: string; tgllahir: date; namapeg: string; nextpeg: adrpeg > Type ElmtProj: < id_proj: string; Deskripsi: string; Tarif: integer; nextproj: adrproj > Type ListPProj: adrrelasi Type ListPeg: adrpeg Type ListProj: adrproj b. Tuliskan procedure untuk menuliskan data pegawai lengkap beserta data proyek, jika terlibat dalam proyek. Procedure ListProjLengkap(input Peg: ListPeg, input PProj: ListPProj) {Menuliskan daftar id pegawai & nama pegawai beserta proyek yang Halaman 5 dari 15
dikerjakan oleh pegawai tersebut I.S: List Pegawai & pegawai_proyek terdefinisi, mungkin kosong. F.S: Menuliskan informasi pegawai beserta proyek yang dikerjakan. Jika list pegawai kosong, tuliskan List pegawai kosong.} ptrpeg: adrpeg ptrrelasi: adrrelasi ptrpeg firstpeg If ptrpeg=nil then output List pegawai kosong Else Repeat Output (idpeg(ptrpeg)) Output (namapeg(ptrpeg)) ptrrelasi firstpproj while (ptrrelasi<>nil) if pegawai(ptrrelasi)=ptrpeg then output (id_proj(proyek(ptrrelasi))) ptrrelasi nextrelasi(ptrrelasi) {seorang pegawai sudah ditulis informasinya} {cek pegawai berikutnya} ptrpeg nextpeg(ptrpeg) Until ptrpeg=nil c. Tuliskan procedure untuk menghitung honor proyek yang diterima setiap pegawai yang terlibat berdasarkan kontribusi waktu. Tampilan yang diharapkan sebagai berikut: Pegawai Total Honor P1 Nominal 1 P2 Nominal 2 P3 Nominal 3 P5 Nominal 4 Procedure HitungHonorProj(input Peg: ListPeg, input PProj: ListPProj) {Menuliskan daftar honor setiap pegawai berdasarkan kontribusi waktu I.S: List Pegawai & Pegawai_Proyek terdefinisi, mungkin kosong F.S: Hanya pegawai yang mempunyai kontribusi waktu didalam proyek, dihitung honornya sesuai tarif proyek. Jika list pegawai kosong, tuliskan List Pegawai kosong. Ada kemungkinan seorang pegawai mendapat honor lebih dari satu proyek} ptrpeg: adrpeg ptrrelasi: adrrelasi honor: integer ptrpeg Peg if ptrpeg=nil then output ( List Pegawai Kosong ) else Halaman 6 dari 15
repeat output(namapeg(ptrpeg)) ptrrelasi PProj honor 0 while (ptrrelasi<>nil) if pegawai(ptrrelasi)=ptrpeg then honor honor + waktu(ptrrelasi)*tarif(proyek(ptrrelasi)) ptrrelasi nextrelasi(ptrrelasi) {honor seorang pegawai selesai dihitung, tuliskan} Output ( Total honor:,honor) ptrpeg nextpeg(ptrpeg) until ptrpeg=nil d. Tuliskan procedure untuk menuliskan nama-nama pegawai yang terlibat dalam proyek berdasarkan Id_Proyek-nya. Procedure ProyekPeg(input PProj:ListPProj, input IdProyek: string) {Mencari nama-nama pegawai yang mengerjakan proyek IdProyek I.S: List Pegawai_Proyek tidak kosong. F.S: Jika ditemukan Id_proyek=IdProyek, dituliskan nama pegawai yang terlibat. Jika tidak ada IdProyek, tidak menuliskan apa-apa. } ptrrelasi: adrrelasi ptrrelasi PProj while (ptrrelasi<>nil) if id_proj(proyek(ptrrelasi))=idproyek then output(namapeg(pegawai(ptrrelasi))) ptrrelasi nextrelasi(ptrrelasi) 4. Diketahui sebuah list berisi sejumlah elemen, beberapa procedure primitive telah disediakan, antara lain: function IsEmpty(L:List) boolean /* I.S. sembarang*/ /* F.S. Mengembalikan nilai True jika list kosong Mengembalikan nilai False jika list tidak kosong */ Procedure CreateList(Output L:List) /* I.S. sembarang*/ /* F.S. Terbentuk List Kosong*/ function Alokasi(L: integer) address /* I.S. sembarang*/ /* F.S. Terbentuk List Kosong*/ Procedure Insert(I/O L:List, P:address) /* I.S. L mungkin kosong, P Sudah di alokasi */ /* F.S. P elemen pertama List L*/ Procedure InsertLast(I/O L:List, P:address) Halaman 7 dari 15
/* I.S. L mungkin kosong, P Sudah di alokasi */ /* F.S. P elemen Terakhir dari List L */ Tugas anda adalah sebagai berikut : a. Mendefinisikan Struktur List yang akan anda buat Type address: ^ElemenList Type ElemenList = < info: integer; next: address; > Type List = < : address > b. List tersebut akan dipisah menjadi 2 buah list yang baru dan berbeda (List L akan di pisah menjadi L1 dan L2), buatlah algoritma untuk memisahkan list tersebut Function JumlahElemenList(L:List) integer /* I.S. sembarang*/ /* F.S. mengembalikan banyaknya elemen list, mengirimkan 0 jika list kosong */ JmlElmn : int; P : address P (L); JmlElmn 0; while (P <> Nil) do JmlElmn JmlElmn + 1; P next(p); end while; JmlElmn Procedure PisahList(output L1:List, output L2:List, input L:List) /* I.S. L mungkin kosong */ /* F.S. dibuat dua buah list L1 dan L2 */ /* seharusnya ada tambahan statemen bahwa L tetap */ /* L1 berisi setengah elemen dari List L, */ /* dan L2 sisanya */ /* jika banyak elemen di L ganjil, maka separuh nya adalah JumlahElemenList(L) div 2 */ JmlL1 : int; Counter : int; Last, newp : address; CreateList(L1); CreateList(L2); if (L) <> Nil then Halaman 8 dari 15
JmlL1 JumlahElemenList(L) div 2; Counter 0 {traversal list L sampai akhir} Last (L) while (next(last) <> Nil) do newp=alokasi(info(last)) if (Counter <= JmlL1) then if (L1) = Nil then Insert(L1, newp); else InsertLast(L1, newp); endif else if (L2) = Nil then Insert(L2, newp); else InsertLast(L2, newp); endif endif Counter Counter + 1: Last next(last); end while else print LIST KOSONG! endif B. Bagian II. Pilihan Ganda Berilah tanda silang (X) pada jawaban yang tepat. 1. Diketahui definisi kamus dan gambar sebagai berikut: : {List direpresentasi dg pointer} Type Address : ^ElmtList {pointer to ElmList type InfoType :.{terdefinisi} type ElmtList : <Info: InfoType, Next: address> type List : address juga boleh} A B C D Dibawah ini adalah potongan algoritma yang benar agar P menunjuk elemen terakhir dari list adalah : A. Procedure NunjukAkhir (input L: list, output P:address ) {IS : Terdefinisi L FS : P menunjuk elemen terakhir dari List, elemen list tidak berubah} Halaman 9 dari 15
: B. C. D. E. Jawab: D : P L. while P <> nil do P P^.next Procedure NunjukAkhir (input L: list, output P:address ) {IS : Terdefinisi L FS : P menunjuk elemen terakhir dari List, elemen list tidak berubah} : : P L. while P ^.next<> nil do P P^.next Procedure NunjukAkhir (input : list, output P:address ) {IS : Terdefinisi L FS : P menunjuk elemen terakhir dari List, elemen list tidak berubah} : : P while P <> nil do P P^.next Procedure NunjukAkhir (input : list, output P:address ) {IS : Terdefinisi L FS : P menunjuk elemen terakhir dari List, elemen list tidak berubah} : : P while P^.next <> nil do P P^.next Procedure NunjukAkhir (input L : list, output P:address ) {IS : Terdefinisi L FS : P menunjuk elemen terakhir dari List, elemen list tidak berubah} : : while P^.next <> nil do L. L.^.next P L. Halaman 10 dari 15
2. Diketahui Potongan program sebagai berikut : [01]typedef struct telmtlist *address; [02]typedef int infotype; [03]typedef struct telmtlist [04] { [05] infotype info; [06] address next; [07] }Elmlist; [08] [09]typedef struct [10] { [11] address first; [12] }list; [13] [14]void BalikList(list *L) [15]{ [16] address p,preclast,last; [17] /*mencari alamat elemen terakhir*/ [18] last= (*L).first; [19] while (last->next!=null) [20] { [21] last=last->next; [22] } [23] /*last->next=nil*/ [24] p=(*l).first; [25] /*Proses membalik list*/ [26] (*L).first = last; [27] do [28] { [29] preclast=p; [30] /*mencari alamat sebelum elemen yang ditunjuk last*/ [31] while (preclast->next!= last) [32] preclast=preclast->next; [33] last->next=preclast; [34] last=preclast; [35] }while (last!=p); [36] last->next=null; [37] } Procdure Balik List di atas digunakan untuk membalik susunan list Ilustrasi : Statement yang salah dari potongan program di atas adalah : A. baris [35] harusnya while (last->next!=p); B. baris [33] harusnya last=preclast; C. baris [33] harusnya last=preclast->next; D. baris [19] harusnya while (last->next!=null) E. Tidak ada statement yang salah Jawab: E Halaman 11 dari 15
3. Jika diketahui representasi fisik suatu list dengan menggunakan pointer adalah sebagai berikut : type adrelmt = ^Elmt type Elmt = <info : character, kanan : adrelmt, kiri : adrelmt > type List = <first : adrelmt> P A B C D manakah bagian algoritma yang tepat untuk menghapus elemen C dari list : A. P^. Kiri^. Kanan P^. Kanan P^. Kiri Nil P^. Kanan^. Kiri P^. Kiri P^. Kanan Nil free(p) B. P^ Kiri^ Kanan P^ Kanan P^ Kanan^ Kiri P^ Kiri P^ Kiri Nil P^ Kanan Nil free(p) C. P^. Kiri^. Kanan P^. Kanan P^. Kanan^. Kiri P^. Kiri P^. Kiri Nil P^. Kanan Nil free(p) D. P^ Kiri^ Kanan P^ Kanan P^ Kiri Nil P^ Kanan^ Kiri P^ Kiri P^ Kanan Nil free(p) E. P^. Kiri Nil P^. Kanan Nil P^. Kiri^. Kanan P^. Kanan P^. Kanan^. Kiri P^. Kiri free(p) Halaman 12 dari 15
Jawab: C 4. Jika suatu list dideklarasikan sebagai berikut : type adrelmt = ^Elmt type Elmt = <info : character, Next : adrelmt> type List = <first : adrelmt> Pada gambar di bawah ini, manakah instruksi yang tepat untuk menambahkan elemen sesudah elemen yang ditunjuk oleh pointer P : Q P E A D F A. Next(P) Q Next (Q) Next(P) B. Next(Q) Next (P) Next (P) Q C. Next (Q) P Next (P) Q D. Next(P) Q Next (Q) P E. Next (P) Q Next (Q) Next (P) Jawab: B 5. Diketahuhi deklarasi list seperti berikut : (Deklarasi) Type adrcabangor = ^ElmtCabangOR Type adrkontingen = ^ElmtKontingen Halaman 13 dari 15
Type adratlet = ^ElmtAtlet Type ElmtCabangOR = <Nama_Cabang : string; Peserta : adrkontingen Next_Cab : adrcabangor> Type ElmtKontingen= <Nama_Kontingen : string; Anggota_Kontingen : adratlet Next_Kontingen : adrkontingen> Type ElmtAtlet = <Id_Atlet : integer; Next_Atlet : adratlet> Type List = < : adrcabangor> Var L :List Representasi logik list dengan deklarasi seperti di atas adalah : A.......... B....... C.... Halaman 14 dari 15
D.... Jawab: B E. Tidak ada jawaban yang tepat Halaman 15 dari 15