• Tidak ada hasil yang ditemukan

A. Bagian I. Studi Kasus

N/A
N/A
Protected

Academic year: 2021

Membagikan "A. Bagian I. Studi Kasus"

Copied!
15
0
0

Teks penuh

(1)

UJIAN TENGAH SEMESTER GANJIL 2008/2009

NIM:

Algoritma dan Struktur Data / CS2014

Nama :

HARI : Rabu, 5 November 2008

Tanda tangan: WAKTU : 135 menit

DOSEN : TIM

SIFAT : Tutup Buku 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

P1 P2 P3

B2

P2

B3

P1 P3

KodeBuku : B1, B2, B3

IdPengarang : P1, P2, P3

Representasi :

(2)

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 = <FirstP: adrPengarang> type ListBuku = <FirstB: 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 } Kamus pBuku: adrBuku pPengarang: adrPengarang pRel: adrRelasi Algoritma pBuku ←←←← LBuku.First

{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.First 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.

(3)

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}

Kamus

pPengarang: adrPengarang pRel: adrRelasi

JumBuku : integer {Jumlah buku} Algoritma pPengarang ←←←← LPengarang.First 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:

Kamus address:^Element_list Element_list=Record < info:integer next:address > List=Record < First : 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 

(4)

elemen yang terhapus. List L terdefinisi, mungkin kosong.}

Kamus p,prec : address count: integer Algoritma 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

(5)

Jika informasi tersebut direpresentasikan dengan struktur data internal seperti gambar di bawah ini

a. Tuliskan kamus untuk representasi tersebut Jawab:

Kamus

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 FirstPeg: ListPeg, input FirstPProj: ListPProj)

(6)

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”.}

Kamus

ptrPeg: adrPeg ptrRelasi: adrRelasi Algoritma

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 FirstPeg: ListPeg, input FirstPProj: 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}

Kamus ptrPeg: adrPeg ptrRelasi: adrRelasi honor: integer Algoritma ptrPeg  FirstPeg 

if ptrPeg=nil then output (”List Pegawai Kosong”) else

(7)

repeat output(namaPeg(ptrPeg)) ptrRelasi  FirstPProj  honor  0  while (ptrRelasi<>nil) if pegawai(ptrRelasi)=ptrPeg then

honorhonor + waktu(ptrRelasi)*tarif(proyek(ptrRelasi))  ptrRelasinextRelasi(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 FirstPProj: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. }

Kamus ptrRelasi: adrRelasi Algoritma ptrRelasi  FirstPProj  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 InsertFirst(I/O L:List, P:address)

/* I.S. L mungkin kosong, P Sudah di alokasi */

/* F.S. P elemen pertama List L*/

(8)

/* 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 =

< First: 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 */

Kamus

JmlElmn : int;

P

: address

Algoritma

P







 First(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 */

Kamus

JmlL1 : int;

Counter : int;

Last,

newP

: address;

Algoritma

CreateList(L1); CreateList(L2);

if First(L) <> Nil then

(9)

JmlL1 



 JumlahElemenList(L) div 2;



Counter 





 0

{traversal list L sampai akhir}

Last 



 First(L)



while (next(Last) <> Nil) do

newP=alokasi(info(Last))

if (Counter <= JmlL1) then

if First(L1) = Nil then

InsertFirst(L1,

newP

);

else

InsertLast(L1,

newP

);

endif

else

if First(L2) = Nil then

InsertFirst(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:

Kamus :

{List direpresentasi dg pointer}

Type Address : ^ElmtList {pointer to ElmList juga boleh} type InfoType : ……….{terdefinisi}

type ElmtList : <Info: InfoType, Next: address> type List : address

First

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}

(10)

Kamus : Algoritma : P←←←← L.First while P <> nil do P←←←←P^.next B.

Procedure NunjukAkhir (input L: list, output P:address ) {IS : Terdefinisi L

FS : P menunjuk elemen terakhir dari List, elemen list tidak berubah}

Kamus :

Algoritma : P←←←← L.First

while P ^.next<> nil do P←←←←P^.next

C.

Procedure NunjukAkhir (input First: list, output P:address ) {IS : Terdefinisi L

FS : P menunjuk elemen terakhir dari List, elemen list tidak berubah} Kamus : Algoritma : P←←←← First while P <> nil do P←←←←P^.next D.

Procedure NunjukAkhir (input First: list, output P:address ) {IS : Terdefinisi L

FS : P menunjuk elemen terakhir dari List, elemen list tidak berubah}

Kamus :

Algoritma : P←←←← First

while P^.next <> nil do P←←←←P^.next

E.

Procedure NunjukAkhir (input L : list, output P:address ) {IS : Terdefinisi L

FS : P menunjuk elemen terakhir dari List, elemen list tidak berubah}

Kamus :

Algoritma :

while P^.next <> nil do L.First←←←←L.First^.next

P←←←←L.First Jawab: D

(11)

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

(12)

3. Jika diketahui representasi fisik suatu list dengan menggunakan pointer adalah sebagai berikut :

Kamus

type adrElmt = ^Elmt

type Elmt = <info : character, kanan : adrElmt, kiri : adrElmt > type List = <first : adrElmt>

A B C D

First

P

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 

(13)

Jawab: C

4.

Jika suatu list dideklarasikan sebagai berikut :

Kamus

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 :

D A F E First Q P 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 :

Kamus (Deklarasi)

Type adrCabangOR = ^ElmtCabangOR Type adrKontingen = ^ElmtKontingen

(14)

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 = <First : adrCabangOR>

Var L :List

Representasi logik list dengan deklarasi seperti di atas adalah :

A. F irst First First . . . . . . . . . B. . . . First . . . C. . . . First

(15)

D.

. . .

E. Tidak ada jawaban yang tepat Jawab: B

Gambar

Tabel Pegawai

Referensi

Dokumen terkait

• Bahwa saksi mengetahui pemohon dan termohon adalah suami istri yang telah menikah sekitar bulan Desember 2006 di Kabupaten Lombok Barat karena saksi turut

“Telah merasakan nikmatnya iman, orang yang rela menjadikan Allah sebagai Rabbnya, Islam sebagi agamanya, dan Muhammad sebagai Rasulnya.” (HR. Wahai ibuku, hendaklah

Dengan memanjatkan puji syukur kehadirat Allah SWT yang telah melimpahkan rahmat, taufik dan hidayah serta inayah-NYA, sehingga skripsi yang berjudul: “Upaya

Hasil akurasi ini dapat ditingkatkan dengan menerapkan teknik bagging menghasilkan akurasi sebesar 81,84%, sehingga terjadi peningkatan akurasi sebesar 8,86% dari penerapan

Riwayat Pendidikan/Pelatihan/Kursus Tambahan... Riwayat

Hasil penelitian organoleptis terhadap bau yaitu bau apel marshmallow kurang diterima oleh sebagian besar responden dimana penilaian responden yaitu untuk pernyataan sangat

perikanan merupakan mata rantai penting dalam pencegahan IUU fishing, tanpa pengawasan dan pengendalian di lapangan sebagai unsur MCS (Monitoring,

Dari hasil pengamatan didapat lama penyimpanan telur ayam merawang (Gallusgallus) menunjukkan berpengaruh sangat nyata (P&lt;0.05) terhadap berat tetas, hal ini