{ PEMINJAMAN BUKU
}
{ ======================================================= }
{ pembuat : Team 2-C : }
{ Widodo Muda Saputra J2F007050
Nur Imanullah J2F007036
Pramudita Eka H. J2F007039
Havit Choirul R. J2F007016
Candra S. A. J2F007006
M. Shoffa Al Arofat J2F007030
M. Abdur Rohman J2F005278 }
{ ======================================================= }
{ tanggal : 21-12-2008 }
Program ini dibuat pada sebuah perpustakaan untuk mendata member yang meminjam buku dan buku
yang dipinjam.
Pembagian tugas dan prosedur – prosedur yang digunakan dalam program ini:
Solusi:
Sebelum penjelasan mengenai solusi akan dikemukakan terlebih dahulu asumsi yang digunakan:
1. Pada member aktif, jika semua member pada list hanya meminjam sekali maka yang ditampilkan
“tidak ada member aktif”.
2. Jika ada lebih dari dua member dengan jumlah peminjaman yang sama maka akan ditampilkan
semua.
3. Analog dengan member aktif, pada buku aktif yang ditampilkan bukan idBuku, melainkan
judulnya.
4. IdMember hanya menerima inputan integer.
Penjelasan Solusi:
Solusi yang digunakan kelompok kami adalah:
1. Untuk DisplayPeminjaman menggunakan algoritma dari PrintList dengan sedikit modifikasi.
2. Untuk AddPeminjaman menggunakan algoritma dari InsertLast dengan sedikit modifikasi,
mengurangi nilai stok buku yang dipinjam.
3. Untuk Pengembalian menggunakan algoritma dari DeleteCurrent (menghapus pointer yang
mengandung nilai sama) dengan sedikit modifikasi, menambah nilai stok buku yang
dikembalikan.
4. Untuk SavePinjam menggunakan file eksternal untuk menyimpan pointer yang dibuat.
5. Untuk LoadPinjam menggunakan algoritma dari Mesin Karakter dengan sedikit modifikasi,
membaca angka dan string secara bersamaan.
6. Untuk MemberAktif mencari ID Member yang melakukan paling banyak peminjaman pada list
menggunakan sequensial search dan menampilkan ID Member nya.
7. Untuk BukuAktif mencari ID Buku yang melakukan paling banyak peminjaman pada list
menggunakan sequensial search dan menampilkan Judul Buku nya
Dokumentasi :
Pertemuan 1 : 7 Desember 2008 : Pembagian Kerja dan Pembahasan Solusi tiap subrutin yang dibuat.
Pertemuan 2 : 14 Desember 2008 : Pembahasan Solusi yang tidak berhasil dipecahkan dan mencari solusi
baru.
Pertemuan 3 : 20 Desember 2008 : Pengumpulan tiap subrutin dan menggabungkannya.
Pertemuan 4 : 21 Desember 2008 : Pengumpulan dan penggabungan semua program dari kelompok lain
dan menggabungkannya.
Pertemuan 5 : 01 Januari 2009 : Revisi program dan penambalan Bug.
ALGORITMA
{ KAMUS GLOBAL }
Peminjaman : < IdMember : integer
IdBuku : integer >
Addr_Peminjaman : pointer to Node_Peminjaman
Node_Peminjaman : < info : Peminjaman
next : Addr_Peminjaman >
List_Peminjaman : < Addr_Peminjaman first >
{ algoritma }
Alokasi(AP)
if (AP≠NIL) then
infoIdmP(AP)idM
infoIdb(AP)idB
nextP(AP)firstP(P)
firstP(P)AP
Procedure insertLastP(input/output P:List_Peminjaman, input : idM:integer,
idB:integer)
{ I.S. : elemen idM dan idB terpisah dari List_Peminjaman P }
{ F.S. : elemen idM dan idB berada dalam List_Peminjaman P di akhir}
{ Proses : memasukkan elemen idM dan idB ke dalam List_Peminjaman P pada
akhir List_Peminjaman }
{ kamus lokal }
AP1, AP2 : Addr_Peminjaman
{ algoritma }
Alokasi(AP1)
infoIdmP(AP1) idM
infoIdb(AP1) idB
nextP(AP1) NIL
AP2 firstP(P)
if (AP1≠NIL) then
if (firstP(P)=NIL)
firstP(P)=AP1
else
while (nextP(AP2) ≠ NIL) do
AP2=nextP(AP2)
nextP(AP2)=AP1
{ algoritma }
AP firstP(P)
if(isListEmpty(P)) then
while (AP≠NIL) do
output(infoIdmP(AP), infoIdb(AP))
AP=nextP(AP)
{ algoritma }
if((first(B) ≠NIL) AND (firstM(M) ≠NIL))
if((IsMemberBuku(B, J)=true) AND (IsMember(M, A)=true))
Ketemufalse
ABfirst(B)
while(AB≠NIL && Ketemu!=true)
AB1 AB
if(infoIdB(AB)=J)
Ketemutrue
AB next(AB)
nextP(AP2)AP1
infoSt(AB1)infoSt(AB1)-1
{ algoritma }
AP1firstP(*P)
if(AP1≠NIL)
while(AP1≠NIL)
if(infoIdmP(AP1)=A AND infoIdb(AP1)=J)
if(AP1=firstP(P))
firstP(P)nextP(AP1)
nextP(AP1)NIL
else
nextP(AP2)nextP(AP1)
nextP(AP1)NIL
Dealokasi (AP1)
Ketemu false
AB first(B)
while(AB≠NIL AND Ketemu≠true)
AB1 AB
if(infoIdB(AB)=J)
Ketemutrue
ABnext(AB)
infoSt(AB1)infoSt(AB1)+1
AP2AP1
AP1 nextP(AP1)
{ algoritma }
open(F,”pinjam.dat”,”w”)
APfirstP(P)
while(AP≠NIL) do
output(F, infoIdmP(AP), infoIdb(AP))
AP nextP(AP)
}
close(F)
{ algoritma }
open(F,"pinjam.dat", "r")
input(F, CC)
if(NOT(EOP))
while(CC≠10 && retval≠EOF)
input(F, CC)
createListP(P)
input(F, &idM, &idB)
while(retvalInt≠EOF)
insertLastP(P, idM, idB)
input(F, idM, idB)
close(F)
Procedure MemberAktif(P:list_Peminjaman)
{ I.S. : MemberAktif belum diketahui }
{ F.S. : MemberAktif didapatkan }
{ Proses : mencari frekuensi kemunculan idMember terbanyak }
{ kamus lokal }
AP1, AP2: Addr_Peminjaman
Tab : < id : integer
sum:integer >
i,
maxi,
max,
j,
k,
l,
m,n : integer
T : pointer to integer
Tab: pointer to tab
{ algoritma }
AP1 firstP(P)
if(AP1≠NIL) {
Alokasi(T)
Alokasi(Tab)
max infoIdmP(AP1)
maxi 1
j0
k 0
l0
n0
T[l]1
Tab[k].id max
while(AP1≠NIL) do
AP2=AP1
AP2nextP(AP2)
if(T[l]=1) then
i 1
ml
while(AP2≠NIL) do
m m+1
if(AP1=firstP(P)) then
jj+1
T[j]1
if(infoIdmP(AP2)=infoIdmP(AP1))
maxinfoIdmP(AP1)
ii+1
T[m]0
AP2 nextP(AP2)
if(i=maxi) then
maxi i
max infoIdmP(AP1)
Tab[k].idmax
Tab[k].summaxi
kk+1
else if(i>maxi)
maxii
maxinfoIdmP(AP1)
Dealokasi(Tab)
k0
Tab[k].id max
Tab[k].sum maxi
kk+1
n n+1
l l+1;
AP1=nextP(AP1)
if(maxi>1)
output (k)
i traversal [0..k]
output(Tab[i].id, Tab[i].sum)
Procedure BukuAktif(P:list_Peminjaman)
{ I.S. : BukuAktif belum diketahui }
{ F.S. : BukuAktif didapatkan }
{ Proses : mencari frekuensi kemunculan idBuku terbanyak }
/* kamus lokal */
AP1, AP2: Addr_Peminjaman
AB1: Addr_Buku
tab :<int id
char Jdl[30]
int sum >
i,
maxi,
max,
j,
k,
l,
m,n : integer
T : pointer to integer
Tab : pointer to tab
/* algoritma */
AP1 firstP(P);
if(AP1≠NIL) {
Alokasi(T)
Alokasi(Tab)
Max infoIdb(AP1)
Maxi 1
j 0
k 0
l 0
n 0
T[l] 1
Tab[k].id max
while(AP1≠NIL) do
AP2 AP1
AP2 nextP(AP2)
if(T[l]=1) then
i 1
m l
while(AP2≠ NIL) do
mm+1
if(AP1= firstP(P))
j=j+1
T[j] 1
if(infoIdb(AP2)=infoIdb(AP1))
max infoIdb(AP1)
i=i+1
T[m] 0
AP2 nextP(AP2)
if(i= maxi)
maxi i
max infoIdb(AP1)
Tab[k].id max
Tab[k].sum maxi
kk+1
else if(i>maxi)then
maxi i
max infoIdb(AP1)
Dealokasi(Tab)
k 0
Tab[k].id max
Tab[k].sum maxi
kk+1
nn+1
l l+1
AP1 nextP(AP1)
if(maxi≠1) then
i traversal [0..k]
AB1 first(B)
while((AB1≠NIL) AND (infoIdB(AB1) ≠Tab[i].id))
AB1<-- next(AB1)
Tab[i].Jdl infoJdl(AB1)
Output(Tab[i].Jdl, Tab[i].sum)