Dokumentasi Tugas Pemrograman 1 (Azhar Fauzan)

7
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

description

PEMDEK

Transcript of Dokumentasi Tugas Pemrograman 1 (Azhar Fauzan)

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