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