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 :
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; inputLPengarang: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.
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
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 PROYEKSuatu 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
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)
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
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*/
/* 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
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}
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
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
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
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: B5.
Diketahuhi deklarasi list seperti berikut :
Kamus (Deklarasi)
Type adrCabangOR = ^ElmtCabangOR Type adrKontingen = ^ElmtKontingen
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. . . . FirstD.
. . .
E. Tidak ada jawaban yang tepat Jawab: B