Sabtu, 16 April 2022

Source Code Python Program Perpustakaan CRUD (LinkedList, Sorting, Fibbonaci Search, Queue)

#Copyright Kalam Aulia Sistem Informasi 2020 

import time

from time import sleep
from datetime import datetime
from datetime import date
from typing import Deque
import os

today = date.today()
day = today.strftime("%d-%m-%Y")
now = datetime.now()
current_time = now.strftime("%H:%M:%S")

# data

adm = {"nama":"admin", "pin":"2021"}

mahasiswa =  [
            {

                "nama":"pina",
                "pin":"6036",
            },
            {

                "nama":"farah",
                "pin":"6007",
            },
            {

                "nama":"kalam",
                "pin":"6005",
            },
            {

                "nama":"anisa",
                "pin":"6008",
            }
        ]

user = {"nama":"", "pin":""}
# functions

class Library:
    def __init__(self):
        self._judulBuku = ''
        self._genre = ''
        self._tahunTerbit = 0
    def addbook(self):
        try:
            self._judulBuku = input('Masukkan Judul Buku: ')
            self._genre = input('Masukkan Genre Buku: ')
            self._tahunTerbit = int(input('Masukkan Tahun Terbit Buku: '))
            queue.enqueue(self._judulBuku)
            data1.append(self._judulBuku)
            link.addLast(self._judulBuku)
            histori.append(self._judulBuku)
            histori1.append(self._genre)
            histori2.append(self._tahunTerbit)
            return True
        except ValueError:
            print('Buku Tidak Dapat Ditambahkan')
            print('Mohon Memasukkan Tahun Buku Hanya Menggunakan Angka')
            return False
    def backbook(self):
        try:
            self._judulBuku = input('Masukkan Judul Buku: ')
            self._genre = input('Masukkan Genre Buku: ')
            self._tahunTerbit = int(input('Masukkan Tahun Terbit Buku: '))
            if self._judulBuku in histori and self._genre in histori1 and self._tahunTerbit in histori2:
                data1.append(self._judulBuku)
                return True
            else:
                print("Nama Buku Tidak sesuai Dengan Yang Dipinjam")
        except ValueError:
            print('Mohon Memasukkan Tahun Buku Hanya Menggunakan Angka')
            return False
    def __str__(self):
        return '\t'.join(str(x) for x in [self._judulBuku, self._genre, self._tahunTerbit])

class Lemari:
    def __init__(self):
        self.books = []
    def addBook(self):
        book = Library()
        if book.addbook() == True:
            self.books.append(book)
            print ()
            print('Buku Telah Ditambahkan')
    def backBook(self):
        book = Library()
        if book.backbook() == True:
            self.books.append(book)
            print ()
            print('Buku Telah Dikembalikan')
    def viewLemari(self):
        print('\t'.join(['No.','Judul', 'Genre','Tahun']))
        for idx, book in enumerate(self.books) :
            print(idx + 1, end='\t')
            print(book)

class Node:
    def __init__(self, data):
        self.data = data
        self.next = None

class LinkedList:
    def __init__(self):
        self.head = None
        self.count = 0
   
    def addLast(self, data):
        if self.head is None:
            self.head = Node(data)
            self.count += 1
        else:
            nodeAkhir = self.head
            while nodeAkhir.next is not None:
                nodeAkhir = nodeAkhir.next
            nodeAkhir.next = Node(data)
            self.count += 1
           
    def deleteNode(self,position):
        if self.head == None:
            return
        temp = self.head
       
        if position == 0:
            self.head = temp.next
            temp = None
            return
       
        for i in range (position,-1):
            temp = temp.next
            if temp is None:
                break
        if temp is None :
            return
        if temp.next is None:
            return
        next = temp.next.next
        temp.next = None
        temp.next = next
       
    def printList(self):
        if self.head is None:
            print('Linked List Kosong')
        else:
            nodeTampil = self.head
            print("Buku Yang Pernah Masuk: ")
            while nodeTampil is not None:
                print('-> ', nodeTampil.data)
                nodeTampil = nodeTampil.next
        print()
       
    def iterate_item(self):
        # Iterate the list.
        current_item = self.head
        while current_item:
            val = current_item.data
            current_item = current_item.next
        yield val

# sort with quickSort
def partition(arr, low, high):
    i = (low-1)      
    pivot = arr[high]    
    for j in range(low, high):
        if arr[j] <= pivot:
            i = i+1
            arr[i], arr[j] = arr[j], arr[i]
    arr[i+1], arr[high] = arr[high], arr[i+1]
    return (i+1)

def quickSort(arr, low, high):
    if len(arr) == 1:
        return arr
    if low < high:
        pi = partition(arr, low, high)
        quickSort(arr, low, pi-1)
        quickSort(arr, pi+1, high)

# search with fibonacci search
def searching(isi, x, n):
    fibonaci2 = 0
    fibonaci1 = 1
    fibonaci = fibonaci2 + fibonaci1
    while (fibonaci < n):
        fibonaci2 = fibonaci1
        fibonaci1 = fibonaci
        fibonaci = fibonaci2 + fibonaci1
    offset = -1
    while (fibonaci > 1):
        i = min(offset+fibonaci2, n-1)
        if (isi[i] < x):
            fibonaci = fibonaci1
            fibonaci1 = fibonaci2
            fibonaci2 = fibonaci - fibonaci1
            offset = i
        elif (isi[i] > x):
            fibonaci = fibonaci2
            fibonaci1 = fibonaci1 - fibonaci2
            fibonaci2 = fibonaci - fibonaci1
        else:
            return i
    if(fibonaci1 and isi[n-1] == x):
        return n-1
    return -1

def search():
    n = len(data1)
    x = input("Masukan Judul Buku Yang anda cari : ")
    time.sleep(1.5)
    isi = searching(data1, x, n)
    if isi >= 0:
        print("Ditemukan di Rak ke :",isi)
    else:
        print(x,"Tidak ada di Rak atau Telah Dipinjam")

# Queue
class Queue:
    def __init__(self):
        self.items = []
    def isEmpty(self):
        return self.items == []
    def enqueue(self, item):
        self.items.insert(0, item)
    def dequeue(self):
        return self.items.pop()
    def size(self):
        return len(self.items)
    def peek(self):
        return self.items[len(self.items)-1]
    def semua(self):
        return self.items

#database
###########################
lemari = Lemari()         #
book = Library()          #
queue = Queue()           #
link = LinkedList()       #
mhs1=[]                   #
data1 = ["0"]             #
histori = []              #
histori1 = []             #
histori2 = []             #
###########################


# log in and menus

def log():
    log1 = input("Masukkan Nama: ")
    log2 = input("Masukkan PIN: ")
    for each in mahasiswa:
        if log1 in each["nama"] and log2 in each["pin"]:
            print ("Selamat datang", each["nama"])
            menu_member()
            break
    else:
        print("Nama atau NIM Anda Salah")
        log()

def baru():
    user["nama"] = input("Masukkan Username Baru: ")
    user["pin"] = input("Masukkan PIN Baru: ")
    mhs1.append(user["nama"])
    print("Selamat Akun Anda Berhasil dibuat")
    print("Silahkan Login Menggunakan Menu Member Baru")
    welcome()
   
       
def member():
    log1 = input("Masukkan Nama: ")
    log2 = input("Masukkan PIN: ")
    if log1 == user["nama"] and log2 == user["pin"]:
        print ("Selamat datang", user["nama"])
        menu_member()
    else:
        print("Nama atau NIM Anda Salah")
        member()
 
def admin():
    nama = input("Masukkan Nama: ")
    pin = input("Masukkan PIN: ")
    if nama == adm['nama'] and pin == adm['pin']:
        print("Selamat Datang Admin")
        menu_admin()
    else:
        print("Nama atau PIN Anda Salah")
        admin()
       
def regis1():
    log2 = input("Masukkan PIN Lama: ")
    for each in mahasiswa:
        if log2 in each["pin"]:
            each["pin"] = input("Masukkan PIN Baru: ")
            print("PIN Anda Berhasil Diganti")
            print("Login Kembali")
            log()
            break
    else:
        print("PIN Anda Salah")
        regis1()
       
def regis2():
    log2 = input("Masukkan Nama Lama: ")
    for each in mahasiswa:
        if log2 in each["nama"]:
            each["nama"] = input("Masukkan Nama Baru: ")
            print("Nama Anda Berhasil Diganti")
            print("Login Kembali")
            log()
            break
    else:
        print("Nama Anda Salah")
        regis2()

def regis():
    print('Pilihan')
    print('1. Edit Nama')
    print('2. Edit PIN')
    print('3. Menu')
    while True:
        try:
            pilih = int(input('Masukkan Pilihan: '))
            break
        except:
            print("Masukan Dengan Angka")
    if pilih == 1:
        regis2()
    elif pilih == 2:
        regis1()
    elif pilih == 3:
        welcome()
    else:
        print('Pilihan Tidak Ada')
        regis()

def welcome():
    print("Tanggal: ", day)
    print("Logged in time: ", current_time)
    print("=====================================")
    print("Selamat datang di Perpustakaan Python")
    print("Pilih menu dibawah sesuai dengan role anda")
    print("1. Admin")
    print("2. Member")
    print("3. Member Baru")
    print("4. Daftar Member Baru")
    print("5. Keluar")
    print("============================================")
    while True:
        try:
            options = int(input("Enter your choice: "))
            os.system('cls')
            break
        except:
            print("Masukan Dengan Angka")
    if options == 1:
        os.system('cls')
        time.sleep(1.5)
        admin()
    elif options == 2:
        os.system('cls')
        time.sleep(1.5)
        log()
    elif options == 3:
        os.system('cls')
        time.sleep(1.5)
        member()
    elif options == 4:
        os.system('cls')
        time.sleep(1.5)
        baru()
    elif options == 5:
        print("Terima Kasih Telah Mengunjungi Perpustakaan Python")
        raise SystemExit
    else:
        print("Pilihan Tidak Ada")
        os.system('cls')
        welcome()

def menu_admin():
    ulang = 'ya'
    while ulang == 'ya':
        print("=======================")
        print("1. Tambah Buku")
        print("2. Lihat Buku")
        print("3. Hapus Buku")
        print("4. Lihat Data Member")
        print("5. Update Buku")
        print("6. Data Buku")
        print("7. Search Data Buku")
        print("8. Kembali Ke Menu Login")
        print("9. Keluar")
        print("=======================")
        while True:
            try:
                pilih = int(input("Masukkan Pilihan Anda: "))
                break
            except:
                print("Masukan Dengan Angka")
        if __name__ == '__main__':
            if pilih == 1:
                time.sleep(1.5)
                lemari.addBook()
                time.sleep(1.5)
            elif pilih == 2:
                if len(lemari.books) < 1:
                    print('Tidak Ada Buku Yang Ditambahkan Atau Tidak Tersedia')
                    time.sleep(1.5)
                    continue
                lemari.viewLemari()
                time.sleep(1.5)
            elif pilih == 3:
                if len(lemari.books) < 1:
                    print('Tidak Ada Buku Yang Ditambahkan Atau Tidak Tersedia')
                    time.sleep(1.5)
                    continue
                lemari.viewLemari()
                while True:
                    try:
                        item = int(input('Pilih Nomor Buku Yang Ingin Dihapus: '))
                        time.sleep(1.5)
                        break
                    except:
                        print("Masukan Dengan Angka")
                if item - 1  > len(lemari.books):
                    print('Pilihan Nomor Tidak Ada')
                    time.sleep(1.5)
                else:
                    lemari.books.remove(lemari.books[item - 1])
                    data1.pop(item)
                    print ()
                    print("Buku Yang Anda Pilih Telah Dihapus")
                    time.sleep(1.5)
                   
            elif pilih == 4:
                time.sleep(1.5)
                for y in mahasiswa:
                    y = y["nama"]
                    mhs1.append(y)    
                n = len(mhs1)
                quickSort(mhs1, 0, n-1)
                for x in mhs1:
                    print("->",x)
                time.sleep(1.5)
            elif pilih == 5:
                time.sleep(1.5)
                if len(lemari.books) < 1:
                    print('Tidak Ada Buku Yang Ditambahkan Atau Tidak Tersedia')
                    time.sleep(1.5)
                    continue
                lemari.viewLemari()
                while True:
                    try:
                        item = int(input('Pilih Nomor Buku Yang Ingin Diupdate: '))
                        time.sleep(1.5)
                        break
                    except:
                        print("Masukan Dengan Angka")
                if item - 1  > len(lemari.books):
                    print('Pilihan Nomor Tidak Ada')
                    time.sleep(1.5)
                else:
                    library = Library()
                    if library.addbook() == True :
                        lemari.books.remove(lemari.books[item - 1])
                        lemari.books.insert(item - 1, library)
                        print ()
                        print('Buku Yang Anda Pilih Telah Diupdate')
                        time.sleep(1.5)
                if len(lemari.books) < 1:
                    print('Tidak Ada Buku Yang Ditambahkan Atau Tidak Tersedia')
                    time.sleep(1.5)
                    continue
            elif pilih == 6:
                time.sleep(1.5)
                if len(lemari.books) < 1:
                    print('Tidak Ada Buku Yang Pernah Di Data atau Kosong')
                    time.sleep(1.5)
                    continue
                print(link.printList())
                #print("Buku Yang Pernah Masuk: ",link.printList())
                print("Banyaknya Buku Yang Pernah Masuk: ", queue.size())
                time.sleep(1.5)
            elif pilih == 7:
                if len(lemari.books) < 1:
                    print('Tidak Ada Buku Yang Ditambahkan Atau Tidak Tersedia')
                    time.sleep(1.5)
                    continue
                lemari.viewLemari()
                search()
            elif pilih == 8:
                os.system('cls')
                welcome()
                time.sleep(1.5)
            elif pilih == 9:
                print("Terima Kasih Telah Mengunjungi Perpustakaan Python")
                raise SystemExit
            else:
                print("Pilihan Hanya 1-10!")
                print("Jika Ingin Kembali Ketik ya atau Jika Tidak Tekan Enter")
                ulang = input('Ingin Kembali? ')
    else:
        print("Terima Kasih Telah Mengunjungi Perpustakaan Python")
        raise SystemExit

def menu_member():
    ulang = 'ya'
    while ulang == 'ya':
        print("========================")
        print("1. Lihat buku")
        print("2. Peminjaman Buku")
        print("3. Kembalikan Buku")
        print("4. Edit Akun")
        print("5. Kembali Ke Menu Login")
        print("6. Keluar")
        print("========================")
        while True:
            try:
                pilih = int(input("Masukkan Pilihan Anda: "))
                break
            except:
                print("Masukan Dengan Angka")
        if __name__ == '__main__':
            if pilih == 1:
                time.sleep(1.5)
                if len(lemari.books) < 1:
                    print('Tidak Ada Buku Yang Ditambahkan Atau Tidak Tersedia')
                    time.sleep(1.5)
                    continue
                lemari.viewLemari()
                time.sleep(1.5)
            elif pilih == 2:
                if len(lemari.books) < 1:
                    print('Tidak Ada Buku Yang Ditambahkan Atau Tidak Tersedia')
                    time.sleep(1.5)
                    continue
                lemari.viewLemari()                
                while True:
                    try:
                        item = int(input('Pilih Nomor Buku Yang Ingin Dipinjam: '))
                        time.sleep(1.5)
                        break
                    except:
                        print("Masukan Dengan Angka")
                if item - 1  > len(lemari.books):
                        print('Pilihan Nomor Tidak Ada')
                else:
                    lemari.books.remove(lemari.books[item - 1])
                    data1.pop(item)
                    print ()
                    print("Sukses Meminjam Buku")
                    time.sleep(1.5)
            elif pilih == 3:
                time.sleep(1.5)
                if len(lemari.books) < 1:
                    print('Tidak Ada Buku Yang Ditambahkan Atau Tidak Tersedia')
                    time.sleep(1.5)
                    continue
                lemari.backBook()
                time.sleep(1.5)
            elif pilih == 4:
                time.sleep(1.5)
                regis()
            elif pilih == 5:
                os.system('cls')
                time.sleep(1.5)
                welcome()
            elif pilih == 6:
                print("Terima Kasih Telah Mengunjungi Perpustakaan Python")
                raise SystemExit
            else:
                print("Pilihan Hanya 1-6!")
                print("Jika Ingin Kembali Ketik ya atau Jika Tidak Tekan Enter")
                ulang = input('Ingin Kembali? ')
               
    else:
        print("Terima Kasih Telah Mengunjungi Perpustakaan Python")
        raise SystemExit

welcome()

Source Code Python Program Perpustakaan CRUD (LinkedList, Sorting, Fibbonaci Search, Queue)

#Copyright Kalam Aulia Sistem Informasi 2020   import time from time import sleep from datetime import datetime from datetime import ...