View
22
Download
0
Category
Preview:
DESCRIPTION
PEMDEK
Citation preview
Pemdekgampangpendekgampan
gpendekmudahpemdejsusahngga
kyapemdekitususahpemdekgam
panginsyaallahhjklzxcvbnmqwer
tyuiopasdfghjklzxcvbnmrtyuiopa
sdfghjklzxcvbnmqwertyuiopasdf
ghjklzxcvbnmqwertyuiopasdfghj
klzxcvbnmqwepemdekpemekpe
mdekpemdekpemdekpemdekpe
mdekgampangpgampangitumahr
tyuiopasdfghjklzxcvbnmqwertyu
iopasdfghjklzxcvbnmqwertyuiop
asdfghjklzxcvbnmqwertyuiopasd
fghjklzxcvbnmqwertyuiopasdfgh
jklzxcvbnmqwertyuiopasdfghjkl
zxcvbnmqwertyuiopasdfghjklzxc
Laporan Tugas Pemrograman 1
Pemrograman Deklaratif
Azhar Fauzan
130638192 PEMDEK-B
Azhar Fauzan, 1306381692
1
A. Deklarasi Struktur, dan Implementasi Fungsi Pembantu
let listKul = [(100,"pemdek",3); (101,"ddp",6); (102,"sda",4) ; (103, "tba",3) ] ;; let listMhs = [(10, "ari"); (11, "budi"); (12, "cecep"); (14, "dono")] ;; let listMhsKul = [(10,[100;101;102]); (11,[101]); (14,[]); (12,[100;101])] ;; // Di bawah ini merupakan fungsi-fungsi standar let rec addlen = function | (n, []) -> n | (n, x::xs) -> addlen (n+1, xs);; let rec quik = function | ([], sorted) -> sorted | ([x], sorted) -> x::sorted | (a::bs, sorted) -> let rec part = function | (l, r, []) -> quik (l, a::quik(r, sorted)) | (l, r, x::xs) -> if x
Azhar Fauzan, 1306381692
2
2. Syntax:
let rec getNama = function | ((mNpm,nama)::listMhs,npm) -> if npm=mNpm then nama else getNama(listMhs,npm);;
Deskripsi:
Fungsi getNama mempunyai dua buah argumen, yaitu listMhs dan NPM, serta fungsi ini
mengembalikan string nama dari mahasiswa yang berasosiasi dengan NPM tersebut. Kita
asumsikan NPM pasti dapat ditemukan pada listMhs.
Penjelasan Proses:
- Fungsi getNama akan selesai dan mengembalikan nama jika telah menemukan npm yang
sesuai dengan npm yang ada pada listMhs.
- Jika tidak, fungsi akan terus rekursif.
3. Syntax:
let rec numKuliahMhs = function | ((kNpm,idKul)::listMhsKul,npm) -> if kNpm=npm then addlen(0,idKul) else numKuliahMhs(listMhsKul,npm);;
Deskripsi:
Fungsi numKuliahMhs mempunyai dua buah argumen, yaitu listMhsKul dan NPM, serta fungsi ini
mengembalikan nilai banyaknya kuliah yang diambil oleh mahasiswa dengan NPM tersebut. Kita
asumsikan NPM pasti dapat ditemukan pada listMhsKul.
Penjelasan Proses:
- Fungsi numKuliahMhs akan terrekursif mencari npm yang bersesuaian dengan listMhsKul
- Jika telah sama, maka akan mmanggil fungsi addlen (listId) dan mengembalikan panjang dari
list tersebut.
4. Syntax:
let rec pickSks = function | ([],id) -> 0 | ((idKul,matKul,sksKul)::listKul,id) -> if id=idKul then sksKul else pickSks(listKul,id);; let rec getSks = function | ([],listKul) -> 0 | (id::listId,listKul) -> pickSks(listKul,id) + getSks(listId,listKul);; let rec jumSks = function | ((kNpm,listId)::listMhsKul,listKul,npm) -> if kNpm = npm then getSks(listId,listKul) else jumSks(listMhsKul,listKul,npm);;
Deskripsi:
Azhar Fauzan, 1306381692
3
Fungsi pickSks mempunyai dua buah argumen, yaitu listKul, dan id, serta fungsi ini
mengembalikan nilai sks dari kuliah yang sesuai dengan id.
Fungsi getSks mempunyai dua buah argumen, listId, dan listKul, serta fungsi ini mengembalikan
nilai dari jumlah sks dari semua listId yang ada di listMhsKul.
Fungsi jumSks mempunyai tiga buah argumen, yaitu listMhsKul, listKul,dan NPM, serta fungsi ini
mengembalikan nilai jumlah total SKS yang diambil oleh mahasiswa dengan NPM tersebut. Kita
asumsikan NPM pasti dapat ditemukan pada listMhsKul.
Penjelasan Proses:
- Fungsi jumSks membandingkan npm masukan dan npm pada listMhsKul
- Jika sama, akan memanggil fungsi getSks dimana masukannya adalah listId yang sesuai,
fungsi getSks ini menghitung jumlah semua nilai sks yang telah diambil oleh pickSks.
5. Syntax:
let rec pesertaKuliah = function | ([],listMhs,id) -> [] | ((npm,listId)::listMhsKul,listMhs,id) -> if isMember(id,listId) then quik(getNama(listMhs,npm)::pesertaKuliah(listMhsKul,listMhs,id),[]) else pesertaKuliah(listMhsKul,listMhs,id);;
Deskripsi:
Fungsi pesertaKuliah mempunyai tiga buah argumen, yaitu listMhsKul, listMhs, dan IDkuliah,
serta fungsi ini mengembalikan list yang berisi daftar nama mahasiswa yang mengambil kuliah
dengan ID tersebut . Nama nama tersebut harus terurut secara leksikografis.
Penjelasan Proses:
- Fungsi pesertaKuliah akan rekursif mencari nilai id yang sesuai dengan nilai id pada list
kemudian mengambil nama mahasiswa berdasarkan npm dengan fungsi getNama.
6. Syntax:
let rec getListId = function | ([],npm) -> [] | ((kNpm,listId)::listMhsKul,npm) -> if kNpm=npm then listId else getListId(listMhsKul,npm);; let rec getMatKul = function | ((id,kuliah,sks)::listKul,idKul) -> if id=idKul then kuliah else getMatKul(listKul,idKul);; let daftarKelasSama (listMhsKul,listKul,n,m) = let ls = inter(getListId(listMhsKul,n),getListId(listMhsKul,m)) let rec getKelas = function | ([],listKul) -> [] | (l::ls, listKul) -> getMatKul(listKul,l)::getKelas(ls,listKul) quik(getKelas(ls,listKul),[]);;
Azhar Fauzan, 1306381692
4
Deskripsi:
Fungsi getListId mempunyai dua buah argumen, yaitu listMhsKul, dan NPM, serta fungsi ini
mengembalikan list ID Kuliah yang diambil oleh mahasiswa dengan NPM tersebut. Kita asumsikan
NPM pasti dapat ditemukan pada listMhsKul.
Fungsi getMatKul mempunyai dua buah argumen, yaitu listKul, dan idKul. Fungsi ini akan
mengembalikan nama kuliah dari listKul yang sesuai dengan idKul.
Fungsi daftarKelasSama mempunyai 4 buah argumen, yaitu listMhsKul, listMhs, NPM dari
mahasiswa pertama, dan NPM dari mahasiswa kedua. Fungsi ini akan mengembalikan daftar
kelas dimana mahasiswa dengan NPM1 sekelas dengan mahasiswa NPM2 ( daftar kuliah yang
diambil bersama). Kita asumsikan NPM1 dan NPM2 pasti dapat ditemukan pada listMhsKul. List
yang dikembalikan terurut secara leksikografis.
Penjelasan Proses:
- Fungsi daftarKelasSama akan mengambil nama-nama matkul setiap daftar kelas yang sama
(hasil intersect dari listId npm1 dengan npm2) dari listKul dengan rekursif.
- Pada fungsi datarKelasSama, digunakan pula fungsi getNamaKelas untuk mengambil nama
kelas oleh id yang bersesuaian di listKul.
7. Syntax:
let rec countMatkul = function | (idKul,[]) -> 0 | (idKul,(npm,listId)::listMhsKul) -> if isMember(idKul,listId) then 1 + countMatkul(idKul,listMhsKul) else countMatkul(idKul,listMhsKul);; let kuliahFavorit (listMhsKul,listKul) = let rec listKuliah = function | ([],listMhsKul,max,result) -> result | ((id,kuliah,sks)::listKul,listMhsKul,max,result) -> let jumKul = countMatkul(id,listMhsKul) if jumKul > max then listKuliah(listKul,listMhsKul,jumKul,[kuliah]) elif jumKul = max then listKuliah(listKul,listMhsKul,jumKul,kuliah::result) else listKuliah(listKul,listMhsKul,max,result) quik(listKuliah(listKul,listMhsKul,0,[]),[]);;
Deskripsi:
Fungsi countMatkul mempunyai dua buah argumen, yaitu idKul, dan listMhsKul, serta fungsi ini
mengembalikan jumlah mata kuliah (integer) yang bersesuaian dengan idKul darisetiap listId
pada listMhsKul.
Fungsi kuliahFavorit mempunyai 2 argumen, yaitu listMhsKul dan listKul. Fungsi ini akan
mengembalikan list yang berisi nama -nama kuliah favorit. Kuliah favorit adalah kuliah yang
mempunyai nilai banyaknya peserta kuliah yang paling banyak (bisa lebih dari satu). Kembalian
berupa list karena bisa jadi ada lebih dari satu kuliah yang favorit. List yang dikembalikan terurut
secara leksikografis.
Azhar Fauzan, 1306381692
5
Penjelasan Proses:
- Fungsi kuliahFavorit akan mendeklarasi fungsi listKuliah, listKuliah akan mengembalikan list-
list kuliah yang favorit.
- Fungsi listKuliah ini akan membandingkan setiap jumlah kuliah (countMatkul) pada suatu
listKuliahMhs. Jika ditemukan jumlah kuliah yang lebih banyak maka akan di-bind ke list yang
baru dan jika sama maka akan ditambahkan ke list sebelumnya.
- Dan fungsi ini menggunakan fungsi quick sort pada akhir.
8. Syntax:
let rec cekItAll = function | (listId,id::[]) -> isMember (id,listId) | (listId,id::lstIdMataKuliah) -> isMember (id,listId) && cekItAll(listId,lstIdMataKuliah);; let rec daftarMhsKul = function | ([],listMhs,lstIdMataKuliah) -> [] | ((npm,listId)::listMhsKul,listMhs,lstIdMataKuliah) -> let nama = getNama (listMhs,npm) if cekItAll(listId,lstIdMataKuliah) then quik(nama::daftarMhsKul(listMhsKul,listMhs,lstIdMataKuliah),[]) else daftarMhsKul(listMhsKul,listMhs,lstIdMataKuliah);;
Deskripsi:
Fungsi cekItAll mempunyai 2 argumen, yaitu listId, dan lstIdMataKuliah. Fungsi ini akan
mengecek apakah lstIdMataKuliah semua elemennya terdapat pada sebuah listId.
Fungsi daftarMhsKul mempunyai 3 argumen, yaitu listMhsKul, listMhs, dan list yang berisi ID dari
beberapa mata kuliah. Fungsi ini akan mengembalikan list nama mahasiswa yang mengambil
SEMUA kuliah yang IDnya ada pada lstIdMataKuliah. List yang dikembalikan terurut secara
leksikografis.
Penjelasan Proses:
- Fungsi daftarMhsKul akan mengecek setiap listId dari mahasiswa apakah ada lstIdMataKuliah
yang semuanya bersesuaian dengan listId mahasiswa.
- Untuk mengeceknya, fungsi ini akan memanggil fungsi helper cekItAll, yang mengembalikan
nilai true jika semua lstMataKuliah bersesuaian dengan listId.
9. Syntax:
let rec cekItPart = function | (listId,id::[]) -> isMember (id,listId) | (listId,id::lstIdMataKuliah) -> isMember (id,listId) || cekItPart(listId,lstIdMataKuliah);; let rec daftarMhsKul2 = function | ([],listMhs,lstIdMataKuliah) -> [] | ((npm,listId)::listMhsKul,listMhs,lstIdMataKuliah) -> let nama = getNama (listMhs,npm)
Azhar Fauzan, 1306381692
6
if cekItPart(listId,lstIdMataKuliah) then quik(nama::daftarMhsKul2(listMhsKul,listMhs,lstIdMataKuliah),[]) else daftarMhsKul2(listMhsKul,listMhs,lstIdMataKuliah);;
Deskripsi:
Fungsi cekItPart mempunyai 2 argumen, yaitu listId, dan lstIdMataKuliah. Fungsi ini akan
mengecek apakah lstIdMataKuliah ada (minimal satu) elemennya pada sebuah listId.
Fungsi daftarMhsKul2 mempunyai 3 argumen, yaitu listMhsKul, listMhs, dan list yang berisi ID
dari beberapa mata kuliah. Fungsi ini akan mengembalikan list nama mahasiswa yang mengambil
PALING TIDAK SATU kuliah yang ID-nya ada pada lstIdMataKuliah. List yang dikembalikan terurut
secara leksikografis.
Penjelasan Proses:
- Fungsi daftarMhsKul2 akan mengecek setiap untuk setiap listId dari mahasiswa apakah ada
lstIdMataKuliah yang minimal satu bersesuaian dengan listId mahasiswa.
- Untuk mengeceknya, fungsi ini akan memanggil fungsi helper cekItpart, yang mengembalikan
nilai true jika ada lstMataKuliah bersesuaian dengan listId.
10. Syntax:
let rec listPasanganSekelas = function | ([],listMhs) -> [] | ((kNpm,listId)::listMhsKul, listMhs) -> let rec list = function | (kNpm,listId,listMhs, []) -> [] | (kNpm,listId,listMhs, (npm,listKul)::listMhsKul) -> if(inter(listId,listKul) []) then (getNama (listMhs,kNpm),getNama(listMhs,npm))::list(kNpm,listId,listMhs,listMhsKul) else list(kNpm,listId,listMhs,listMhsKul) list(kNpm,listId,listMhs,listMhsKul) @ listPasanganSekelas (listMhsKul,listMhs);;
Deskripsi:
Fungsi listPasanganSekelas mempunyai 2 argumen, yaitu listMhsKul dan listMhs. Fungsi
mengembalikan list yang mempunyai elemen berupa pair (nama1, nama2) yang bertipe string *
string. nama1 dan nama2 adalah 2 nama mahasiswa yang sekelas atau mengambil mata kuliah
yang sama (apapun kuliahnya) . Jika (nama1, nama2) sudah ada pada list, maka (nama2, nama1)
tidak boleh ada lagi pada list tersebut. List tidak perlu terurut berdasarkan kaidah tertentu.
Penjelasan Proses:
- Fungsi listPasanganSekelas akan memanggil fungsi list, dimana fungsi ini akan megembalikan
list of tuple. Tuple ini berisikan sepasang nama yang sekelas.
- Fungsi listPasanganSekelas akan terus rekursif untuk setiap listId dari listMhsKul. Dan
kebalian dari fungsi list untuk setiap listId akan di-append.
Recommended