UJIAN TENGAH SEMESTER GANJIL NIM: 2010/2011 dan Struktur Data / CS2014 Nama : HARI : Kamis, 30 Oktober 2009 WAKTU : 110 menit DOSEN : TIM SIFAT : Tutup Buku, No Electronic Device Tanda tangan: Petunjuk: Periksalah kelengkapan halaman soal. Tidak ada toleransi penilaian bagi mahasiswa yang tidak lengkap halaman soalnya. Soal terdiri atas dua bagian dengan rincian: tiga soal studi kasus dan lima soal pilihan ganda, dan semua dikerjakan pada lembar soal ini. Bagian I. Studi Kasus [82] Studi Kasus 1. Property Warna RGB Diperlukan sebuah struktur data untuk menyimpan property warna RGB sebuah gambar digital. Struktur data yang akan digunakan adalah sebuah list linier. Dalam list tersebut disimpan property warna pixel yang terdapat dalam gambar, dan sebuah kombinasi RGB hanya disimpan 1 kali (unik). Properti warna yang disimpan terdiri dari Red,Green,Blue dengan rentang nilai 0-255. 1. Buatlah definisi type List Warna (list linier sederhana) Type InfoType : <red : integer, {nilai integer komponen Red} green : integer, {nilai integer komponen Green} blue : integer> {nilai integer komponen Blue} Type ElmtList : <info : InfoType, next : Address> {komponen sebuah elemen list} Type Address : pointer to ElmtList Type ListWarna: <First : Address> 2. Tuliskan implementasi prosedur InvertColor yang akan melakukan inverse warna (per komponen, Red, Green, dan Blue). Misal nilai komponen Red sebuah elemen 0, maka inverse-nya adalah 255, nilai komponen Green sebuah elemen 10, maka inversenya adalah 245, dan nilai komponen Bluenya adalah 230, maka inversenya adalah 25. Procedure InvertColor(input/output LW : ListWarna) {I.S : ListWarna terdefinisi, TIDAK kosong, minimal terdapat 1 elemen} {F.S: nilai komponen Red, Green, dan Blue tiap elemen diubah menjadi inverse dari nilai awal} P : address Halaman 1 dari 10
P First(LW) {awal traversal List} repeat info(p).red 255 (^P.info).red{invers nilai komponen Red} info(p).green 255 - info(p).green{invers nilai komponen Green} info(p).blue 255 - info(p).blue{invers nilai komponen Blue} P next(p) {next elemen} Until (P=Nil){kondisi berhenti} 3. Tuliskan implementasi prosedur untuk menambahkan sebuah kombinasi warna. Pastikan terlebih dahulu bahwa kombinasi warna tersebut belum ada di list awal. Procedure AddElmt(input/output LW : ListWarna, input r,g,b : integer) {I.S : ListWarna terdefinisi, mungkinkosong} {F.S: menambahkan sebuah elemen dengan info r,g,b, jika pada list belum terdapat kombinasi RGB tersebut} {asumsi : alokasi elemen baru pasti berhasil} Prev,P,PNew : address Found : Boolean {true jika sebuah elemen nilai rgbnya=rgb yg akan diinsert} Prev Nil {inisialisasi} P First(LW) {awal traversal List} If (P=Nil)then{list kosong} else {insert first} Alokasi(P) Info(P).red r Info(P).green g Info(P).blue b Next(P) Nil First(LW) P Halaman 2 dari 10
found false {inisialisasi} repeat if ((info(p).red=r) and (info(p).green=g) and (info(p).blue=b))then {cek apakah rgb current=rgb yang akan diinsert} Found true Else Prev P {next element} Until (P=Nil OR found){kondisi berhentinya di Prev sbg Elmt terakhir yg bukan Nil} If (not found) {insert last} Alokasi(PNew) {alokasi} Info(PNew).red r{set atribut elemen baru} Info(PNew).green g {set atribut elemen baru} Info(PNew).blue b{set atribut elemen baru} Next(PNew) Next(Prev) {insert last} Next(Prev) PNew 4. Tulisakan implementasi fungsi yang akan menghitung jumlah kombinasi warna dengan nilai komponen RGB yang sama, misal R=100,G=100,B=100. Function GetCountEqElmt(LW : ListWarna) integer {mengembalikan 0 jika List kosong} count : integer {variable untuk menyimpan jumlah sementara} P : address {inisialisasi} P First(LW) count 0 While (P<>Nil){kondisi perulangan} Halaman 3 dari 10
If ((Info(P).red= Info(P).green) and (Info(P).red= Info(P).blue))then{kondisi penjumlahan} count count+1 {next element} count {terminasi} Studi Kasus 2 : Kelola Data Macebook Suatu sistem harus mengelola informasi keanggotaan jejaring Macebook yang dapat mengelola anggota, dan relasi (hubungan pertemanan antar anggota). Aturan yang ada adalah anggota harus terdaftar pada list anggota. Masing-masing member bisa berteman dengan member yang lain. Hubungan ini didaftarkan pada suatu list relasi. List Anggota List Relasi IDAnggota Nama 001 Spongebob 002 Patrick 003 Mr Crab 004 Squidward RelasiA 002 001 002 004 003 001 001 003 RelasiB Pada list relasi, Relasi A menyatakan pointer ke member yang meminta hubungan pertemanan, sedangkan relasi B merupakan pointer ke member yang menyetuijui pertemanan. Jika informasi di atas direpresentasikan dengan struktur data internal akan terlihat seperti gambar di bawah ini : 1. Tuliskan kamus untuk representasi struktur data di atas! Jawab: kamus type ElmtAnggota : <IDAnggota: string; nama: string; nextanggota : adranggota > type ElmtRelasi : <RelasiA: adranggota; RelasiB : adranggota; Halaman 4 dari 10
NextRelasi : adrrelasi> type adranggota : ^ElmtAnggota type adrrelasi : ^ElmtRelasi type ListAnggota : <FirstAngg: adranggota> type ListRelasi LAnggota LRelasi : <FirstRel: adrrelasi> : ListAnggota : ListRelasi b. Tuliskan algoritma procedure untuk menampilkan seluruh daftar pertemanan (siapa berteman dengan siapa)! Procedure PrintPertemanan(input LAnggota: ListAnggota, input LRelasi: ListRelasi) {Menuliskan daftar pertemanan pada data Macebook I.S: List Anggota & List Relasi terdefinisi, mungkin kosong. F.S: Menuliskan seluruh daftar pertemanan pada media output. Jika list anggota kosong, tuliskan List Anggota kosong, Jika list relasi kosong, tuliskan List Relasi kosong, } pang: adranggota prel: adrrelasi {mengecek apakah list anggota kosong} if FirstAngg(LAnggota)= nil then output( List Anggota kosong ) elseif FirstRelasi(LRelasi) = nil then {mengecek apakah list relasi kosong} else output( List Relasi kosong ) prel FirstRelasi(LRelasi) repeat {mengambil dan mengoutputkan nama peminta Pertemanan } pang RelasiA(pRel) output(namaanggota(pang)) Halaman 5 dari 10
{mengambil dan mengoutputkan nama yang menyetujui Pertemanan } pang RelasiB(pRel) output(namaanggota(pang)) {memproses relasi berikutnya} prel nextrel(prel) until ( prel=nil ) c. Tuliskan algoritma procedure untuk menampilkan jumlah pertemanan (number of friends)! Procedure printcountrelasi(input LAnggota: ListAnggota, input LRelasi: ListRelasi) {Menuliskan jumlah pertemanan member yang terdaftar pada data Macebook I.S: List Anggota & List Relasi terdefinisi, asumsi tidak kosong. F.S: Menuliskan jumlah pertemanan dari semua member pada media output. Relasi bisa berupa permintaan atau persetujuan terhadap pertemanan. } pang: adranggota; prel: adrrelasi; count : Integer pang FirstAnggota(LAnggota) repeat {Inisialisasi loop} Count 0; prel FirstRelasi(LRelasi) {menuliskan nama anggota yang akan dihitung} output(namaanggota(pang)) While prel <> Nil do If ( pang = RelasiA(pRel)) or ( pang = RelasiB(pRel)) then Count Count + 1 prel nextrel(prel) {proses relasi berikutnya} output(count) {menampilkan jumlah} pang nextang(pang) {proses anggota berikutnya} until ( pang=nil ) d. Tuliskan algoritma procedure untuk menampilkan daftar teman dari seseorang anggota! Procedure printteman(input LAnggota: ListAnggota, input LRelasi: ListRelasi, Halaman 6 dari 10
input NamaMember : string) {Menuliskan semua teman oleh seorang member yang diinputkan pada parameter. I.S: List Anggota & List Relasi terdefinisi, asumsi tidak kosong. NamaMember terdefinisi F.S: Menuliskan semua nama teman dari seorang member (NamaMember) ke media output. } pang: adranggota prel: adrrelasi pang FirstAnggota(LAnggota) while (NamaAnggota(pAng) <> NamaMember) and (nextang(pang) <> Nil) do pang nextang(pang) // bila pang = nil program akan NULL POINTER EXCEPTION if (NamaAnggota(pAng) <> NamaMember) then else output( bukan anggota member ) prel FirstRelasi(LRelasi) while prel <> Nil do If ( pang = RelasiA(pRel)) then output(namaanggota(relasib(prel))) If ( pang = RelasiB(pRel)) then output(namaanggota(relasia(prel))) prel nextrel(prel) Halaman 7 dari 10
Bagian II. Pilihan Ganda [18] Berilah tanda silang (X) pada jawaban yang tepat. Poin setiap soal adalah 3 1. Sebuah modul ADT dalam bahasa C terdiri atas beberapa file. Definisi type dituliskan dalam file : a. Main b. Driver c. Header d. Implementasi e. Dictionary 2. Suatu list direpresentasikan sebagai berikut : Misal last adalah address yang akan melakukan traversal sampai menemukan elemen list terakhir, maka skema traversal yang benar adalah : a. Last First(L) b. Last First(L) While last <> nil do Last next(last) c. Last First(L) While next(last) <> First(L) do Last next(last) e. Last First(L) While next(last) <> A do Last <-- next(last) While next(last) <> nil do Last next(last) d. Last First(L) While last <> First(L) do Last next(last) 3. Diketahui penggalan algoritma berikut ini : Procedure Tebak(input/output L : List, output P : address) {IS. Terdefinisi List L dan address P} {FS. Silahkan ditebak} Last, PrecLast : address Last First(L) While (Next(Last) nil)do Halaman 8 dari 10
PrecLast Last Last Next(Last) {end while} P Last if (PrecLast = NIL) then First(L)=NIL else Next(PrecLast)=NIL di atas melakukan proses : a. Delete first pada circular list b. Delete last pada circular list c. Delete first pada linear list d. Delete last pada linear list e. Delete first pada linear list dengan first dan last 4. Perhatikan ilustrasi double linked list berikut ini: Ilustrasi di atas adalah ilustrasi untuk insert after pada double linked list. Mana dari pernyataan berikut yang benar untuk proses algoritma insert after. a. {a, b, c, d} b. {a, d, c, b} c. {a, c, b, d} d. {d, c, b, a} e. Jika urut-urutan langkah di atas dikerjakan tidak ada yang benar. 5. Apa yang menjadi kesamaan antara representasi data Sigle Circular List dengan Linear List? a. Struktur Datanya b. Algortima InsertFirst-nya c. Algortima InsertLast-nya d. DeleteFirst-nya e. DeleteLast-nya Halaman 9 dari 10
6. Berikut ini cara yang paling tepat untuk menghapus elemen terakhir ialah... a. P First(L) While Next(P)<>First(L) do Next(P) First(L) Last(L) P b. P First(L) While Next(P)<>Last(L) do Last(L) P Next(P) Last(L) c. P First(L) While Next(Next(P))<>First(L) do Next(P) Next(Next(P)) Last(L) Next(P) d. P First(L) While Next(P)<>First(L) do Last(L) P Next(P) First(L) e. P First(L) While Next(P)<>Last(L) do Next(P) First(L) Last(L) P Halaman 10 dari 10