UJIAN AKHIR SEMESTER GANJIL 2007/2008 ALGORITMA & STRUKTUR DATA / CS2014 HARI WAKTU DOSEN SIFAT
: : : :
Sabtu, 19 Januari 2008 135 Menit KMA, RIE, RMB, ZKA Tutup Buku
NIM: Nama :
Tanda tangan:
Petunjuk • Baca dengan teliti setiap petunjuk soalnya. • Soal ujian terdiri atas lima bagian. Jawaban seluruh bagian soal dituliskan pada lembar ini. • Periksa kelengkapan halaman soal sebelum Anda mengerjakan soal ujian.
BAGIAN I : Data Abstraction (notasi bahasa C) [20] Anda bekerja di sebuah perusahaan pada bagian gudang yang menyimpan automobile part (onderdil mobil). Perusahaan tsb menyimpan data banyaknya onderdil yang terdapat pada gudang. Basic operational perusahaan dapat dikatakan ada dua, yaitu pemesanan onderdil ke supplier dan pengiriman onderdil ke bengkel-bengkel. Pemilik bengkel biasanya akan marah jika perusahaan automobile part tersebut tidak memiliki onderdil yang dipesannya, karena pelanggan-pelanggannya akan menunggu lama agar mobil mereka dapat segera diperbaiki. Anda harus menulis program agar pengadaan barang (inventory) di gudang selalu tersedia. Inti program Anda adalah menuliskan ADT INVENTORY yang menangani bookkeeping. Primitif-primitif yang harus dimiliki adalah • Menghitung banyaknya onderdil yang ada di gudang • Melakukan update data jika ada pengiriman onderdil baru dari supplier ke gudang • Melakukan update data jika ada pengiriman onderdil ke bengkel-bengkel. • Pimpinan perusahaan juga ingin mengetahui kuantitas onderdil yang telah dibawah standar minimum perusahaan (istilah: low, asumsi standar minimum adalah 10 unit/onderdil) sehingga perusahaan dapat melakukan pemesanan onderdil ke supplier sebelum onderdil tsb habis di gudang. (dalam hal ini Anda harus mempunyai parameter kuantitas) Untuk menyederhanakan persoalan, Anda boleh berasumsi bahwa setiap ada pengiriman dan pemesanan onderdil hanya untuk satu jenis onderdil dan banyaknya item tidak dibatasi. Dalam hal ini, Anda tidak tahu ada berapa jenis onderdil di dalam gudang dan terkadang Anda menerima pengiriman onderdil yang jenisnya belum ada di gudang.
1.
Lengkapilah tabel ADT Inventory di bawah ini dengan menerapkan List, berdasarkan atribut-atribut yang disediakan.
Primitive name
Parameter names and type
Transform process
Return type and value
constructor
--------------
Create empty list
List kosong
Hal 1 dari 15
Order
Int Idpart Int quantity
Jika part belum ada maka insert, selain itu tambahkan pada quantity yang ada
--------------
Delivery
Int Idpart Int quantity
Quantity part tsb berkurang sesuai amount yang dipesan.
-------------
howMany
Int Idpart
--------------
Quantity part tsb yg tdp di gudang
------------
Daftar Idpart yg menunjukkan seluruh part yang quantity-nya telah < minimum
Low
2.
Int minimum
Tuliskan representasi fisik (berkait pointer, berkait tabel, atau kontigu) dan struktur data yang akan digunakan untuk implementasi ADT Inventory sesuai dengan representasi fisiknya. Jawaban: Representasi fisik: berkait pointer (contoh yg lain blm dibuat ☺ ) Struktur data: #define #define #define #define
idPart(p) (p)->idPart qty(p) (p)->qty next(p) (p)->next first(L) ((L).first)
typedef int infotype; typedef struct tElmtList *address; typedef struct tElmtList { char idPart[20]; infotype qty; address next; }ElmtList; typedef struct { address first; }List;
3.
Tuliskan lengkap realisasi setiap primitive names untuk ADT Inventory tsb dengan mengacu pada tabel di atas. Asumsi: primitif standar list sudah terdefinisi. Jawaban:
void createEmpty(List *L) /* I.S. sembarang */ /* F.S. terbentuk list kosong */ { first(*L)=nil; } void order(List *L,char part[],infotype quantity) /* I.S. */ /* F.S. */ /* proses: searching */
Hal 2 dari 15
{ address item,p; item=first(*L); /*cari apakah part ada dalam list*/ while (strcmp(idPart(item),part)!=0 && next(item)!=nil) { item=next(item); } /*cek elemen terakhir*/ if (strcmp(idPart(item),part)==0) { qty(item)+=quantity; /*part sudah ada di gudang, qty-nya saja yg bertambah*/ } else InsVLast(&(*L),part,quantity); /*part blm ada di gudang, tambahkan*/ } void delivery(List *L,char part[],infotype quantity) /* I.S. part quantity selalu > 1 */ /* F.S. */ /* proses: searching */ { address item; item=first(*L); while (strcmp(idPart(item),part)!=0 && next(item)!=nil) { item=next(item); } /*cek elemen terakhir*/ if (strcmp(idPart(item),part)==0) { qty(item)-=quantity; } } infotype HowMany(List L,char part[]) /* I.S. */ /* F.S. */ /* proses: */ { address item; item=first(L); while (strcmp(idPart(item),part)!=0 && next(item)!=nil) { item=next(item); } if (strcmp(idPart(item),part)==0) { return qty(item); } else return 0; } void low(List L,int min) /* I.S. */ /* F.S. */ /* proses: searching */ { address item; item=first(L);
Hal 3 dari 15
while (item!=nil) { if (qty(item)<min) { printf("\n\t Id Part = %s\n",idPart(item)," unit"); } item=next(item); } }
BAGIAN II. MULTILIST (Notasi Algoritmik) [20] Diketahui data pengarang dan buku. Aturan yang berlaku adalah : seorang pengarang dapat mengarang lebih dari satu buku, dan satu buku dapat dikarang oleh lebih dari satu pengarang. Pengarang dan buku memiliki identitas yang unik Contoh : Buku B1 B2 B3
Pengarang P1 P2 P3 P2 P1 P3
Representasi :
Lengkapilah struktur data di bawah ini berdasarkan representasi di atas. Kamus type type type type
type type type type
adrPengarang = ^ElmtPengarang adrBuku = ^ElmtBuku adrRelasi = ^ElmtRelasi ElmtPengarang =
ElmtBuku = ElmtRelasi = ListDosen = ListMatakuliah =
Hal 4 dari 15
Tuliskan procedure output() untuk mencetak setiap buku beserta pengarang-pengarangnya Procedure Output (input LBuku:ListBuku; input LPengarang:ListPengarang) {I.S. LBuku adalah list buku dan LPengarang list Pengarang, keduanya terdefinisi dan tidak kosong} {F.S. Kode setiap buku beserta kode pengarang-pengarangnya telah dicetak} Kamus pBuku: adrBuku pPengarang: adrPengarang pRel: adrRelasi Algoritma pBuku ← LBuku.First while pBuku<>NIL do output(pBuku^.KodeBuku) pPengarang ← LPengarang.First while pPengarang<>NIL do pRel ← pPengarang^.Mengarang while pRel<>NIL do if pRel^.MK=pBuku then output(pPengarang^.IdPengarang) pRel ← pRel^.Next {EndWhile} pPengarang ← pPengarang^.Next {EndWhile} pBuku ← pBuku^.Next {EndWhile}
Petunjuk : Selain perintah output yang ada di template soal, tidak ada perintah output lagi Tuliskan procedure Jumlah() untuk mencetak jumlah buku yang sudah dikarang oleh masingmasing penulis Procedure Jumlah(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
Hal 5 dari 15
BAGIAN III. PILIHAN GANDA [10] Petunjuk: pilihlah satu jawaban yang paling benar 1. Manakah tahapan aksi yang tepat untuk menghapus node P dari List L, jika diketahui kamus datanya sebagai berikut : Type Address = pointer to Elmt Type Infotype = integer Type Elmt = Type List = Var L : list P : Address
A. Next (P) Nil Prev(P) Nil Next(Prev (P)) Next (P) Prev(Next (P)) Prev(P) B. Next(Next (P)) Next (P) Prev(Prev (P)) Prev(P) Next(P) Nil Prev(P) Nil C. Next(Prev (P)) Next (P) Next(P) Nil Prev(Next (P)) Prev(P) Prev(P) Nil D. Prev(Next (P)) Prev (P) Prev(P) Nil Next(Prev (P)) Next (P) Next(P) Nil E. Next(Prev (P)) Next (P) Prev(P) Nil Prev(Next (P)) Prev(P) Next(P) Nil Jawaban : E 2. Diketahui stack S1 dan S2 memiliki elemen bertipe integer, dan variabel C dan i bertipe integer. Pada stack S1 dan S2 dilakukan serangkaian operasi sebagai berikut : i traversal [1..5] push (S1,i^2)
Hal 6 dari 15
repeat pop (S1, C) push (S2, C Div 2) until (S1 = Nil)
Manakah diantara statement di bawah ini yang tidak tepat, mengenai kondisi stack S1 dan S2 : A. Setelah seluruh aksi dijalankan, stack S1 menjadi kosong, dan S2 berisi 5 elemen B. Sebelum aksi repeat dijalankan, S1 berisi hasil pangkat dua dari tiap bilangan i, mulai dari 1 sampai 5 C. Hasil yang sama pada S2 akan didapatkan, meskipun Stack S1 diganti dengan queue Q, dengan mengganti operasi push(S1, i ^2) diganti dengan AddQ(Q, i^2), dan Pop (S1, C) dengan DelQ(Q, C) D. Pada akhir proses S2 tidak Nil E. Nilai Top(S2) = 0 Jawaban : C 3. Jika stack S dideklarasikan secara berkait pointer dengan deklarasi sebagai berikut : Type Address = pointer to Elmt Type Infotype = character Type Elmt = Type Stack = S : Stack P : address
Maka aksi yang dilakukan untuk menambah elemen R (bertipe character) pada stack S adalah : A. Next (P) Top(S) Top(S) P B. Next (P) Top(S) Top(S) P Alokasi (P) Info (P) R C. Alokasi (P) Next (P) Top(S) Top(S) P D. Alokasi (P) Info (P) R Next (P) Top(S) Top(S) P Hal 7 dari 15
E. Alokasi (P) Info (P) R Top(S) P Next (P) Top(S) Jawaban : E 4. Suatu array sirkular direpresentasikan menggunakan array, dengan deklarasi :
Const Nmaks type address type Queue
: integer = : integer : < Head : Tail : Count : TabElmt
25
{jml maksimum elemen Queue}
address,{elemen terdepan Queue} address,{elemen terakhir Queue} address,{jml elemen pd Queue} : array[1..NMaks]of integer >
Var Q
: Queue
Manakah dari pernyataan berikut ini yang sesuai dengan Queue sirkular tersebut : A. Operasi insert elemen pada antrian pasti dapat dilakukan selama Q.Tail ≠ NMaks B. Alamat Head antrian selalu lebih kecil dari alamat Tail antrian C. Operasi insert elemen x (x bertipe integer) pada Queue dilakukan dengan tahapan: If (Q.Count ≠ Nmaks) then Q.Tail Q.Head + Q.Count +1 If (Q.Tail > Nmaks) then Q.Tail Q.Tail – Nmaks Q.TabElmt[Q.Tail] x
D. Perlu dilakukan operasi pergeseran elemen setiap kali selesai dilakukan operasi delete pada antrian. E. Jika function IsFull (Q:Queue) Boolean
merupakan fungsi yang mengembalikan nilai true jika antrian penuh, maka algoritma fungsi tersebut berisi aksi (Q.Tail = NMaks) Jawaban : E 5. Perhatikan graf berikut:
A
B
D
C
E
F
G
H
Hal 8 dari 15
Pernyataan manakah yang benar ? A. Hasil penelusuran BFS dan DFS sama untuk graf di atas sama B. Hasil DFS untuk graf di atas: A-B-D-H-E-F-G-C C. Hasil BFS untuk graf di atas: A-B-C-D-E-F-G-H D. Penelusuran BFS menggunakan struktur data stack E. Penelusuran DFS memerlukan struktur data queue Jawaban : C 6. Perhatikan Pohon T di bawah ini : A
B
D
H
C
E
F
G
I
function F1(P:BinaryTree) integer; if (P<>Nil)then 1+F1(Left(P))+F1(Right(P)) else 0;
integer; function F2(P:BinaryTree) if (P=Nil)then 0 else if (left(P)=Nil and right(P)=NIL)then 1 Else F2(Left(P))+F2(Right(P));
Manakah pernyataan yang salah: A. F1 adalah fungsi untuk menghitung jumlah simpul pada sebuah pohon B. F1 dan F2 tidak mungkin menghasilkan nilai yang sama pada pohon yang tidak kosong C. Untuk pohon T di atas hasil F1 adalah 9 D. Untuk pohon T di atas hasil F2 adalah 5 E. Untuk pohon dengan 1 simpul hasil F2 adalah 1 Jawaban : B 7. Sebuah Complete Binary Tree A direpresentasikan dengan representasi kontigu sebagi berikut :
Manakah pernyataan berikut ini yang salah : A. Simpul H adalah root B. Pada tree tersebut terdapat 6 leaf node Hal 9 dari 15
C. Simpul A merupakan internal node D. Anak kiri dari simpul K adalah J E. Simpul J hanya memiliki satu anak Jawaban : C 8. Perhatikan pohon biner berikut ini : A I E G
A. A I E G H J L B. G E H I J L A C. G E H I L J A D. G H E L J I O E. G E I A H L J Jawaban : C
O L
H
J
O O O A O
9. Perhatikan Pohon T berikut ini : A
B
D
H
Procedure F1(P:BinTree) if (P<>Nil)then Proses(P) F1(Left(P)) F1(Right(P))
C
E
F
G
I
Procedure F2(P:BinTree) if (P<>Nil)then F2(Left(P)) F2(Right(P)) Proses(P)
Procedure F3(P:BinTree) if (P<>Nil)then F3(Left(P)) Proses(P) F3(Right(P))
Manakah pernyataan yang salah: A. F1 merupakan prosedur penelusuran tree PreOrder B. F3 merupakan prosedur penelusuran tree InOrder C. Hasil F2 untuk pohon T di atas: H-I-D-E-B-F-G-C-A D. Hasil F3 untuk pohon T di atas: H-D-I-B-E-A-F-C-G E. F1, F2, F3 tidak mungkin memberikan hasil yang sama Jawaban : E 10. Struktur stack umumnya digunakan pada proses-proses berikut ini, kecuali : Hal 10 dari 15
A. B. C. D. E.
Backtracking Implementasi Rekursif Pemanggilan Prosedur Simulasi penjadwalan Implementasi operasi2 aritmatika seperti konversi infix to postfix dan evaluasi ekspresi postfix Jawaban: D BAGIAN IV : Konsep [30] Tuliskan jawaban T/F (true/false) pada ruang yang disediakan. __T__ Status memori menjadi “bebas” pada saat pointer diset NULL __T__ Dua variabel pointer dapat menunjuk lokasi memori yang sama. __F__ Sebuah stack tidak akan pernah FULL jika diimplementasikan menggunakan dynamic memory. __T__ Stack dan Queues dapat diimplementasikan menggunakan array. __T__ Stack dan Queue lebih tepat diimplementasikan menggunakan array. __T__ Pada queue, data dilayani dengan aturan first-in-first-out order. __T__ Stack dapat digunakan untuk evaluasi ekspresi aritmatika dalam notasi postfix. __F__ Queue dapat digunakan untuk mensimulasikan kelakuan suatu fungsi rekursif. __T__ Semua fungsi rekursif harus memiliki terminating condition. __T__ Semua fungsi rekursif dapat ditransform menjadi iteratif. __F__ Sebuah linked list dengan 100 node membutuhkan memori lebih sedikit dibandingkan array dengan 100 elemen. __T__ Lebih mudah menyisipkan elemen pada linked list yang tidak terurut dibandingkan linked list yang elemennya terurut. __T__ Pencarian elemen pada linked list yang terurut membutuhkan waktu lebih cepat dibandingkan linked list yang tidak terurut. __T__ Menyisipkan data pada BST membutuhkan waktu lebih cepat dibandingkan pada array yang terurut. __T__ Heap tree dapat digunakan sebagai ilustrasi priority queue. Pada bagian kiri, tuliskan nomor jawaban dari istilah yang sesuai dengan definisi Tabel 1
__4_ a linked list in which the rear item refers back to the head item __9_ reduction of a problem to a smaller instance of the same problem
1.linked list 2.object 3.stack Hal 11 dari 15
__12_ a repeated computation _1__ a data structure of values linked together in memory by a chain of references _3__ a data structure with last-in first-out behavior, supporting push and pop _10_ how to carry out a computation, may be implemented as a procedure _7__ a data structure with first-in first-out behavior _15_ a predicate that becomes true when a computation ends _5__ a programming language construct that supports iteration _8__ a diagram showing the operators and operands of an expression
4.circular list 5.loop 6.primitive data 7.queue 8.expression tree 9.recursion 10. algorithm 11. reduction 12. iteration 13. semantic 14. abstraction 15. termination condition
_6__, such as numbers and symbols, that are built into the language Isian Singkat. Telusuri dua algoritma di bawah ini kemudian tuliskan nama proses yang dilakukan algoritmaalgoritma tersebut. Procedure ProcessX(T:BinTree) Kamus S: stack N: BinTree Algoritma CreateEmpty(S); Push(S,T); While (not(Empty(S))) do Pop(S,N); If (N<>nil) then Output(info(N)); Push(S,right(N)); Push(S,left(N));
Algoritma tersebut melakukan proses: Preorder traversal Ekivalen terhadap proses DFS pada graf. Procedure ProcessY(T:BinTree) Kamus Q: Queue N: BinTree Algoritma CreateEmpty(Q); Insert(Q,T); While (not(Empty(Q))) do Remove(Q,N); If (N<>nil) then Output(info(N)); Insert(Q,left(N)); Insert(Q,right(N));
Hal 12 dari 15
Algoritma tersebut melakukan proses: Level Order Traversal Ekivalen terhadap proses BFS pada graf.
BAGIAN V : GRAPH (Notasi Bahasa C) [20] Berikut adalah program dalam bahasa C yang digunakan untuk merepresentasikan graph berarah dalam bentuk array dengan jumlah node maksimum 10. Adapun fungsionalitas utama yang dimiliki oleh program tersebut yaitu : a. Meminta jumlah node yang akan dipergunakan b. Menghubungkan antar node c. Menampilkan isi matrix d. Menampilkan keterhubungan antar node dengan node yang lain.
Ilustrasi matrix beserta graph hasil dapat dilihat pada gambar berikut ini.
1 2 3 4
1 0 0 0 0
1 2 3 4
1 0 0 0 1
Jumlah Node=4 2 3 4 0 0 0 0 0 0 0 0 0 0 0 0 2 1 0 1 0
3 1 0 0 0
Graph
4 0 0 0 0
Lengkapi program dibawah ini sehingga menghasilkan program yang utuh. Aturan : Tidak perlu menambahkan variabel ataupun baris program. #include<stdio.h> #include int max,graph[10][10],n1,n2; char pil; void main() { //inisialisasi array for(n1=0;n1<10;n1++) for(n2=0;n2<10;n2++) graph[n1][n2]=0;
Hal 13 dari 15
clrscr(); //masukkan jumlah node maksimum yang akan dipakai printf("\nMasukan jumlah node : "); scanf("%d",&max); do { clrscr(); printf("\nMenu :"); printf("\n1. Hubungkan graph"); printf("\n2. Cek Keterhubungan Node"); printf("\n3. Display Array"); printf("\n0. Exit"); printf("\nPilihan : "); pil=getche(); if (pil=='1') { printf("\nMasukkan Node awal : "); scanf("%d",&n1); n1--; printf("Masukan Node Akhir : "); scanf("%d",&n2); n2--; //cek jangan sampai node yang dipilih diatas nilai maksimum if ((n1<=max)&&(n2<=max)) { graph[n1][n2]=1; } } else if (pil=='2') { for (n1=0;n1<max;n1++) { printf("\nNode %d terhubung dengan : ",n1+1); for (n2=0;n2<max;n2++) { if (graph[n1][n2]==1) printf("%d ",n2+1); } } } else if (pil=='3') { printf("\n"); for (n1=0;n1<max;n1++) { for(n2=0;n2<max;n2++) Hal 14 dari 15
printf("%d ",graph[n1][n2]); printf("\n"); } } getche(); } while (pil!='0'); }
Hal 15 dari 15