Anda di halaman 1dari 39

Tugas Struktur Data ke-3

Oleh Kelompok: 1. Arif Romadhan (10112063) 2. Yoga Limka (10112061) 3. M. Hadi Panji (10112059) 4. M. Romdon Nurdin S (10111040) 5. Dery Muhammad Ramdani (10111017) Kelas : IF 3

Program Studi Teknik Informatika Fakultas Teknik dan Ilmu Komputer UNIKOM 2013

BAB I PENDAHULUAN
1.1. LATAR BELAKANG Linked list (list bertaut) adalah salah satu struktur data dasar yang sangat fundamental dalam bidang ilmu komputer. Dengan menggunakan linked list maka programmer dapat menimpan datanya kapanpun dibutuhkan. Linked list mirip dangan array, kecuali pada linked list data yang ingin disimpan dapat dialokasikan secara dinamis pada saat pengoperasian program (run-time). Pada array, apabila programmer mendefinisikan ingin besar menyimpan array data, programmer dahulu, diharuskan untuk

terlebih

seringkali

programmer

mengalokasikan array yang sangat besar(misal 100). Hal ini tidak efektif karena seringkali yang dipakai tidak sebesar itu. Dan apabila programmer ingin menyimpan data lebih dari seratus data, maka hal itu tidak dapat dimungkinkan karena sifat array yang besarnya statik. Linked list adalah salah satu struktur data yang mampu menutupi kelemahan tersebut.

1.2. TUJUAN PENYUSUNAN Adapun tujuan dari penulisan makalah ini adalah sebagai berikut: a) Memahami pengertian linked list, gunanya dan dapat mengimplementasikan dalam pemrograman, b) Dapat mengidentifikasi permasalahan-permasalahan pemrograman yang harus diselesaikan dengan menggunakan linked list, sekaligus menyelesaikannya.

1.3. LANDASAN TEORI A. DEFINISI ALGORITMA Algoritma adalah urutan langkahlangkah untuk memecahkan suatu masalah. Salah satu contoh dari Algoritma adalah Linked List.

B. DEFINISI LINKED LIST Linked list atau senarai berantai adalah kumpulan liniar sejumlah data , atau kumpulan komponen yang disusun secara berurutan pointer.Masingmasing komponen dinamakan dengan simpul (node). Simpul dalam suatu Linked list terbagi menjadi dua bagian yaitu medan informasi yang berisi informasi yang akan disimpan dan diolah, dan medan penyambung (Link field) yang berisi simpul berikutnya.

BAB II PEMBAHASAN 2.1. PENGERTIAN SINGLE LINKED LIST Single linked list atau biasa disebut linked list terdiri dari elemen-elemen individu, dimana masing-masing dihubungkan dengan pointer tunggal. Masing-masing elemen terdiri dari dua bagian, yaitu sebuah data dan sebuah pointer yang disebut dengan pointer next. Dengan menggunakan struktur two-member seperti ini, linked list dibentuk dengan 8cara menunjuk pointer next suatu elemen ke elemen yang mengikutinya seperti gambar 2.1. Pointer next pada elemen terakhir merupakan NULL, yang menunjukkan akhir dari suatu list. Elemen pada awal suatu list disebut head, dan elemen terakhir dari suatu list disebut tail.

Gambar 2.1 Elemen yang Dihubungkan Bersama Dalam Bentuk Linked List Untuk mengakses elemen dalam linked list, dimulai dari head dan menggunakan pointer next dari elemen selanjutnya untuk berpindah dari elemen ke elemen berikutnya sampai elemen yang diminta dicapai. Dengan single linke list, list dapat dilintasi hanya satu arah dari head ke tail karena masing-masing elemen tidak terdapat link dengan elemen sebelumnya. Sehingga, apabila kita mulai dari head dan berpindah ke beberapa elemen dan berharap dapat mengakses elemen sebelumnya, kita harus mulai dari head. Secara konseptual, linked list

merupakan deretan elemen yang berdampingan. Akan tetapi, karena elemenelemen tersebut dialokasikan secara dinamis (menggunakan malloc), sangat penting untuk diingat bahwa kenyataannya, linked list akan terpencarpencar di memori seperti Gambar 2.2. Pointer dari elemen ke elemen berarti sebagai penjamin bahwa semua elemen dapat diakses.

Gambar 2.2 Elemen Pada Linked List Dihubungkan Secara TerpencarPencar pada Alamat Memori

2.1.1. REPRESENTASI SIMPUL (NODE) Struktur node pada linked list merupakan suatu simpul(node) yang berisi pointer ke suatu data yang merupakan data dirinya sendiri. Model struktur dari linked list tersebut dalam C adalah sebagai berikut: typedef struct node *list; struct node { int datalist; struct node *next; }; dilanjutkan dengan deklarasi dari pointer ke struktur di atas sebagai berikut: struct node *head; atau list head;

2.1.2. ALOKASI SIMPUL Ketika sebuah variabel dideklarasikan, terlebih dahulu harus diinisialisasi. Demikian juga dengan pengalokasian secara dinamis. Sehingga, fungsi untuk mengalokasikan sebuah node baru, fungsi allocate_node() menggunakan malloc() untuk mendapatkan memori aktual, yang akan menginisialisasi suatu field data. Next selalu diinisialisasi sebagai NULL. Untuk melihat kemungkinan alokasi memori gagal, maka fungsi allocate_nodemenghasilkan 0, bila berhasil maka menghasilkan 1. Untuk membebaskan node digunakan fungsi free_node. Fungsi dari alokasi node adalah sebagai berikut : int allocate_node(int data, list *new) { new = (list) malloc (sizeof(node)); if(new==NULL) return 0; new->datalist = data; new->next=NULL; return 1; } Untuk inisialisasi list setelah alokasi untuk node pertama maka ditambahkan statement sebagai berikut: head = new; Ilustrasi dari fungsi i allocate_node() adalah sebagai berikut

Untuk inisialisasi list setelah alokasi untuk node pertama ilustrasinya adalah sebagai berikut:

Fungsi free_node() menggunakan memori dinamis dengan fungsi free(). free() akan menghancurkan node yang menunjuk ke pointer yang dilewati, sehingga tempat yang ada dapat dipakai untuk lainnya. Akan tetapi, pointer yang melewati free() tidak otomatis menjadi null, tetapi akan menunjuk ke node yang sudah tidak ada. Karena itu pointer harus didefinisikan dengan NULL. void free_node(list p_L) { free(p_L); p_L=NULL; } Ilustrasi dari fungsi free_node() dapat dilihat pada gambar berikut : free(*p_L);

2.1.3 OPERASI PADA LINKED LIST Pada sub bab ini akan dijelaskan mengenai operasi yang terpenting pada linked list, yaitu menambahkan node (insert) dan menghapus node (delete). 2.1.3.1 INSERT Fungsi insert pada linked list meliputi : - insert sebagai node awal (head) dari linked list - insert setelah node tertentu - insert sebelum node tertentu - insert sebagai node akhir (tail) dari linked list Insert sebagai node awal (head) dari linked list Statement kelanjutan dengan deklarasi seperti diatas untuk insert sebagai node awal (head) dari linked list adalah sebagai berikut: void insertashead(list insert) { insert->next=head; head = insert; } ilustrasi dari fungsi diatas adalah sebagai berikut:

Insert setelah node tertentu Statement untuk insert setelah node tertentu dari linked list adalah sebagai berikut: void insertafternode(int x, list insert) { list after; after = head; do after = after->next; while (after->datalist != x); insert->next = after->next; after->next = insert;

} ilustrasi dari fungsi diatas adalah sebagai berikut:

Langkah-langkah untuk proses di atas adalah sebagai berikut: 1. Pointer next dari elemen baru menunjuk elemen setelah elemen tertentu

10

2. Pointer next elemen sebelumnya menunjuk ke elemen baru Insert sebelum node tertentu Statement untuk insert setelah node tertentu dari linked list adalah sebagai berikut: void insertbeforenode(int x, list insert) { list before, prevbefore; if (head->datalist = x) insertashead(insert) else { before = head; do prevbefore = before; before = before->next; while (before->datalist != x); insert->next = before; prevbefore->next = insert; } }

11

ilustrasi dari fungsi diatas adalah sebagai berikut:

12

Langkah-langkah untuk proses di atas adalah sebagai berikut: 1. Telusuri list sampai elemen tertentu, catat juga elemen sebelumnya 2. Lakukan penyisipan sebelum elemen tertentu tersebut

Insert di akhir (tail) dari linked list Statement untuk insert di akhir dari list adalah sebagai berikut: void insertastail(list insert) { list tail; tail = head; do tail = tail->next; while (tail->next != NULL); tail->next = insert; tail = tail->next; } ilustrasi dari fungsi diatas adalah sebagai berikut:

13

Langkah-langkah untuk proses di atas adalah sebagai berikut: 1. Telusuri list sampai elemen terakhir (tail->next=NULL) 2. Lakukan pentisipan setelah elemen terakhir

14

2.1.3.2 DELETE Fungsi delete pada linked list meliputi : - delete sebagai simpul pertama(head) dari linked list - delete setelah simpul tertentu - delete simpul terakhir

Langkah-langkah untuk proses di atas adalah sebagai berikut: 1. Pointer first diarahkan pada data ke-2 2. Pointer p diarahkan pada data ke-1 3. Bebaskan pointer p (secara otomatis data ke-1 terhapus)

15

Langkah-langkah untuk proses di atas adalah sebagai berikut: 1. Arahkan pointer first s/d data yang ditunjuk 2. Pointer p diarahkan pada first->next 3. Arahkan pointer first->next pada p->next 4. Bebaskan pointer p (secara otomatis data setelah simpul tertentu terhapus)

16

Langkah-langkah untuk proses di atas adalah sebagai berikut: 1. Telusuri simpul s/d first->next = NULL 2. Arahkan pointer p ke first 3. Bebaskan pointer p->next (Simpul Terakhir) 4. Arahkan p->next ke NULL

17

Program Penggajian Pegawai Dengan Single Linked List


program penggajian_pegawai; uses crt; type pointer = ^data; data = record nip : integer;

nama : string; gol : string;

status : string; tmk : integer;

next : pointer; end; var awal, akhir nip, tmk : pointer; : integer; : string;

nama, gol, status

pilihsisip, pilihhapus : integer; pilih : shortint;

{Menampilkan Menu Utama} procedure tampil_menu_utama(var pilih : shortint); begin repeat window(1,1,80,25);textbackground(blue);clrscr; gotoxy(30,4);textcolor(white);writeln('.:Program Gaji Pegawai:.'); gotoxy(27,5);writeln('============================='); gotoxy(26,6);writeln(' (dengan single lingked list)'); gotoxy(27,7);writeln('============================='); gotoxy(35,8);writeln('Menu Pilihan');

18

gotoxy(27,9);writeln('-----------------------------'); gotoxy(27,10);writeln('1. Masukan Data Pegawai'); gotoxy(27,11);writeln('2. Tampil Data Pegawai'); gotoxy(27,12);writeln('3. Tampil Gaji Pegawai'); gotoxy(27,13);writeln('4. Penghapusan Data'); gotoxy(27,14);writeln('5. Cari Data Berdasarkan Nama '); gotoxy(27,15);writeln('6. Pengurutan Berdasarkan NIP'); gotoxy(27,16);writeln('7. Penghancuran Data'); gotoxy(27,17);writeln('8. [Exit]'); gotoxy(27,18);writeln('============================='); gotoxy(27,19);write('Select :'); gotoxy(36,19);write('-= =-'); gotoxy(38,19);readln(Pilih);

if(pilih < 1) or (pilih > 8) then begin writeln('Salah memilih menu, silahkan ulangi. Tekan Enter !'); end; until (pilih >= 1) and (pilih <= 8) end;

{Memasukan Data Pegawai} procedure isi_data(var nip, tmk : integer; var nama, gol, status : string); begin window(1,1,80,25);textbackground(blue);clrscr; gotoxy(30,1);textcolor(white);write('masukan data pegawai'); gotoxy(2,2);textcolor(white);write('----Data Pegawai-----'); gotoxy(2,4);write('NIP gotoxy(2,5);write('Nama gotoxy(2,6);write('Status gotoxy(2,7);write('Golongan :'); :'); :'); :');

gotoxy(2,8);write('Tidak Masuk Kerja :');

19

gotoxy(24,4);readln(nip); gotoxy(24,5);readln(nama); gotoxy(24,6);readln(status);

{validasi status} while(status <> 'menikah') and (status <> 'melum menikah') do begin gotoxy(24,8);clreol; gotoxy(2,13);textcolor(red);writeln('Di isi antara "menikah" dan "belum menikah", silahkan ulangi lagi..!!'); gotoxy(71,13);readln; gotoxy(2,13);clreol; textcolor(white); gotoxy(24,8);readln(status); end;

gotoxy(24,7);readln(gol); while(gol <> 'a') and (gol <> 'b') and (gol <> 'c') and (gol <> 'd') do begin gotoxy(24,9);clreol; gotoxy(2,13);textcolor(red);writeln('Golongan a / b / c / d, Silahkan Ulangi..!'); gotoxy(44,13);readln; gotoxy(2,13);clreol; textcolor(white); gotoxy(24,7);readln(gol) end;

20

gotoxy(27,8);writeln('Hari'); gotoxy(24,8);readln(tmk); gotoxy(2,13);textcolor(blue);write('Data Saved..!'); textcolor(white); gotoxy(2,14);write('Tekan enter untuk kembali ke menu!'); readln; end;

{proses penyisipan depan} procedure tambah_depan(var nip, tmk : integer;var nama, gol, status : string; var awal, akhir : pointer); var pgw : pointer; begin new(pgw); pgw^.nip := nip; pgw^.nama := nama; pgw^.status := status; pgw^.gol := gol; pgw^.tmk := tmk; if (awal = nil) then begin pgw^.next := nil; akhir := pgw; end else pgw^.next := awal; awal := pgw; end;

{proses penyisipan belakang} procedure tambah_belakang(var nip, tmk : integer;var nama, gol, status : string;

21

var awal, akhir : pointer); var pgw : pointer; begin new(pgw); pgw^.nip := nip; pgw^.nama := nama; pgw^.status := status; pgw^.gol := gol; pgw^.tmk := tmk; if (awal = nil) then begin awal := pgw end else begin akhir^.next := pgw; end; akhir := pgw; end;

procedure tambah_tengah(var nip,tmk : integer; var nama,gol,status : string; var awal,akhir : pointer); var pgw, bantu : pointer; ketemu : boolean; data_sisip : integer; begin if (awal = nil) then begin new(pgw); pgw^.nip := nip;

22

pgw^.nama := nama; pgw^.status := status; pgw^.gol := gol; pgw^.tmk := tmk;

pgw^.next := nil; awal := pgw; akhir := pgw; end else write('Tambah data setelah - (ketik NIP Pegawai) '); readln(data_sisip); bantu := awal; ketemu := false; while(not ketemu) and (bantu <> nil) do begin if (bantu^.nip = data_sisip) then ketemu := true else bantu := bantu^.next end; if (ketemu) then begin new(pgw); pgw^.nip := nip; pgw^.nama := nama; pgw^.status := status; pgw^.gol := gol; pgw^.tmk := tmk; if (bantu = akhir) then tambah_belakang(nip,tmk,nama,status,gol,awal,akhir) else

23

begin pgw^.next := bantu^.next; bantu^.next := pgw; end; end else writeln('Data tidak ditemukan'); end;

{proses penghitungan tunjangan} function tunjangan(status: string):integer; begin if(status = 'menikah')then begin tunjangan := 500000; end else tunjangan := 0; end;

{proses penghitungan gaji pokok} function gajipokok(gol: string):integer; begin if(gol = 'a')then gajipokok := 1000000 else if(gol = 'b')then gajipokok := 1500000 else if(gol = 'c')then gajipokok := 2000000 else

24

gajipokok := 2500000 end;

{proses penghitungan potongan} function potongan(tmk : integer):integer; begin if ((tmk >=0) and (tmk <=5))then potongan := 0 else if ((tmk >=6) and (tmk <=10))then potongan := 50000 else if ((tmk >= 11) and (tmk <=15))then potongan := 100000 else potongan := 200000; end;

{proses tampilan data pegawai} procedure tampil_data(var awal : pointer); var bantu : pointer; begin window(1,1,80,25);textbackground(blue); clrscr; bantu := awal; if (bantu = nil) then begin writeln('Data masih kosong'); end else begin

25

writeln(' Data Pegawai" '); writeln(' ------------------------------ '); writeln('================================================='); writeln('| NRP | Nama | status | gol | Tidak Masuk kerja |'); writeln('================================================='); writeln('-------------------------------------------------'); while (bantu <> nil) do begin write(' | ',bantu^.nip); write(' | ',bantu^.nama); write(' | ',bantu^.gol); write(' | ',bantu^.status); writeln(' | ',bantu^.tmk,' bantu := bantu^.next; writeln('-------------------------------------------------'); end; end; end; | ');

procedure tampil_gaji(var awal : pointer); var bantu : pointer; baris : integer; begin clrscr; bantu := awal; if (bantu = nil) then begin writeln('Data Masih Kosong'); end else begin

26

gotoxy(15,1);writeln('Data Gaji Pegawai'); gotoxy(2,2);writeln(' ---------------------------------------------------------------------------- '); gotoxy(2,3);writeln(' | No | NIP | Nama |'); gotoxy(2,4);writeln(' ---------------------------------------------------------------------------- '); | Gol | Gaji |Tunjangan|Potongan| Total

while (bantu <> nil) do begin baris := 4; gotoxy(3,Baris+1);writeln('| | | | | | | | |');

gotoxy(9,Baris+1);writeln(bantu^.nip); gotoxy(19,Baris+1);writeln(bantu^.nama); gotoxy(33,Baris+1);writeln(bantu^.status); gotoxy(40,Baris+1);writeln(gajipokok(bantu^.gol)); gotoxy(50,Baris+1);writeln(tunjangan(bantu^.status)); gotoxy(58,Baris+1);writeln(potongan(bantu^.tmk)); gotoxy(58,Baris+1);writeln(gajipokok(bantu^.gol) + tunjangan(bantu^.status) potongan(bantu^.tmk)) ;

bantu := bantu^.next; Baris := Baris +1; end; gotoxy(2,Baris +1);writeln(' ---------------------------------------------------------------------------- ');

if(bantu = nil)then begin gotoxy(2,Baris +2);write('Data kosong !'); end; gotoxy(2,Baris +3);write('Tekan enter untuk kembali ke menu!'); readln; end; end;

27

{proses penghapusan depan} procedure hapus_depan(var awal, akhir: pointer); var phapus : pointer; begin phapus := awal; if (awal = nil) then begin writeln('Data Masih Kosong, Tidak Ada Data Yang Bisa di Hapus'); end else begin if (awal = akhir) then begin awal := nil; akhir := nil; end else awal := awal^.next; dispose(phapus); end; end;

{proses penghapusan belakang} procedure hapus_belakang(var awal, akhir: pointer); var phapus : pointer; begin if (awal = nil) then begin writeln('Data Masih Kosong, Tidak Ada Data Yang Bisa di Hapus');

28

end else begin phapus := awal; if (awal = akhir) then begin awal := nil; akhir := nil; end else while(phapus^.next <> akhir) do begin phapus := phapus^.next end; akhir := phapus; phapus := phapus^.next; akhir^.next := nil; dispose(phapus); end; end;

{proses penghapusa tengah} procedure hapus_tengah(var awal, akhir: pointer); var phapus,bantu : pointer; x,i : integer; begin if (awal = nil) then begin writeln('Data Masih Kosong, Tidak Ada Data Yang Bisa di Hapus'); end else

29

begin write('Hapus Data Yang ke- ');readln(x); if (awal = akhir) or (x = 1) then hapus_depan(awal,akhir) else begin bantu := awal; i := 1; while (i < x-1) and (bantu^.next <> nil) do bantu := bantu^.next; phapus := bantu^.next; bantu^.next := phapus^.next; phapus^.next := nil; dispose(phapus); end; end; end;

procedure pencarian_nama(awal : pointer); var bantu : pointer;

ketemu : boolean; data_cari : string; ulang begin clrscr; if (awal = nil ) then begin writeln('Data masih kosong, lakukan pengisian dan penambahan data terlebih dahulu!!'); writeln; end else : char;

30

begin if (awal <> nil) then ulang := 'Y';

while (ulang <> 'T') do begin clrscr; write('Cari Data berdasarkan Nama : '); readln(data_cari); writeln; ketemu := false; bantu := awal;

while(not ketemu) and (bantu <> nil) do begin if (upcase(bantu^.nama) = upcase(data_cari)) then ketemu := true else bantu := bantu^.next; end;

if (ketemu = true) then begin gotoxy(2,5);write('Data Ditemukan!'); gotoxy(2,7);write('--== Data Pegawai ==--');

gotoxy(2,9);write('NIP gotoxy(2,10);write('Nama gotoxy(2,11);write('Status gotoxy(2,12);write('Golongan

:'); :'); :'); :');

gotoxy(2,13);write('Tidak Masuk Kerja :');

gotoxy(21,9);write(bantu^.nip); gotoxy(21,10);write(bantu^.nama);

31

gotoxy(21,11);write(bantu^.status); gotoxy(21,12);write(bantu^.gol); gotoxy(21,13);write(bantu^.tmk);

gotoxy(2,14);write('---------------------');

write('Cari Data Lagi?? [Y/T] '); readln(ulang); ulang:=upcase(ulang); writeln; end else begin write('Data Tidak Ditemukan, Coba Ulangi Pencarian, Ulangi?? [Y/T]'); readln(ulang); ulang:=upcase(ulang); end end; end; end;

procedure penghancuran(var awal,akhir:pointer); var phapus:pointer; begin phapus:=awal; while (phapus <> nil) do begin awal:=awal^.next; dispose(phapus); phapus:=awal; end; akhir:=nil;

32

end;

{program utama} begin repeat clrscr; tampil_menu_utama(pilih); case (pilih) of 1 : begin clrscr; isi_data(nip, tmk, nama, gol, status); tambah_belakang(nip,tmk,nama,status,gol,awal,akhir); end; 2 : begin repeat clrscr; tampil_data(awal); writeln(' Tambah Data '); writeln(' ----------- '); writeln('1. Tambah Data Pegawai di Depan'); writeln('2. Tambah Data Pegawai di Tengah'); writeln('3. Tambah Data Pegawai di Belakang'); write('Masukan pilihan Anda 1/2/3 : '); readln(pilihsisip); until (pilihsisip > 0) and (pilihsisip < 4); case (pilihsisip) of 1 : begin isi_data(nip, tmk, nama, gol, status); tambah_depan(nip,tmk,nama,status,gol,awal,akhir); end; 2 : begin

33

isi_data(nip, tmk, nama, gol, status); tambah_tengah(nip,tmk,nama,status,gol,awal,akhir); end; 3 : begin isi_data(nip, tmk, nama, gol, status); tambah_belakang(nip,tmk,nama,status,gol,awal,akhir); readln; end; end; {end case} end; {end pilih 2} 3 : begin clrscr; tampil_gaji(awal); readln; end;

4 : begin clrscr; tampil_data(awal); repeat writeln(' Hapus Data '); writeln(' ---------- '); writeln('1. Hapus Data Pegawai di Depan'); writeln('2. Hapus Data Pegawai di Tengah'); writeln('3. Hapus Data Pegawai di Belakang'); write('Masukan pilihan Anda 1/2/3 : ');readln(pilihhapus); until (pilihhapus > 0) and (pilihhapus < 4); if pilihhapus = 1 then begin hapus_depan(awal,akhir); writeln('Tekan Enter untuk kembali ke menu utama');

34

readln; end else if pilihhapus = 2 then begin hapus_tengah(awal,akhir); writeln('Tekan Enter untuk kembali ke menu utama'); readln; end else if pilihhapus = 3 then begin hapus_belakang(awal,akhir); writeln('Tekan Enter untuk kembali ke menu utama'); readln; end end;

5 : begin clrscr; pencarian_nama(awal); readln; end;

7 : begin clrscr; penghancuran(awal,akhir); writeln('Data Telah Dihapus'); readln; end; 8 : begin

35

exit; end; end; until (pilih >9) or (pilih < 1); end.

36

BAB III PENUTUP


3.1. KESIMPULAN 1. Linked list adalah sebuah struktur untuk menyimpan data yang bersifat dinamik 2. Beberapa operasi dapat diterapkan pada linked list seperti sisip(insert), hapus(delete) 3. Operasi-operasi yang ada pada linked list relatif lebih sulit jika dibandingkan dengan operasi-operasi pada struktur yang statis

37

JOBDESK TIAP - TIAP ANGGOTA

Arif Romadhan (10112063) Membuat Algoritma dan Membuat Program Pascal. Membuat procedure pencarian_nama (sequential search dengan boolean). Membuat function gaji pokok. Membuat function potongan. Membuat procedure sisip depan Membuat procedure sisip tengah Membuat procedure sisip belakang Membuat procedure hapus depan. Membuat procedure hapus belakang Membuat procedure tampil_data

Yoga Limka (10112061) Membuat procedure tampil_menu_utama. Mencari referensi teori Mendesign tampilan program. Editor dalam penyusunan makalah. M. Hadi Panji (10112059) Membuat procedure penghancuran Membuat procedure isi_data. Mendesign tampilan program. Mengetik dan menyusun materi. M. Romdon Nurdin S (10111040) Membuat function tunjangan. Mencari referensi teori.

38

Editor dalam penyusunan makalah.

Dery Muhammad Ramdani (10111017) Mendesign tampilan program. Mengetik dan menyusun materi. Mencari referensi teori. Membuat procedure tampil_gaji.

39

Anda mungkin juga menyukai