program antrian;
{I.S : Program antrian diberi harga awal}
{F.S : Program antrian dalam keadaan siap digunakan}
uses crt;
const
Max=3;
type
Data = record
Nama: string[15];
NIM : string[15];
Kota: string[15];
Lama: byte;
Tipe: string[10];
end;
LarikQueue = array [1..Max] of data;
var
Queue : LarikQueue;
Front, Rear, N_antrian : Integer;
Menu, Lagi :char;
Elemen : data;
carinim,carinama : string[15];
Procedure inisialisasi (var Front,Rear: Integer);
{I.S: Peubah penunjuk front dan rear diberi harga awal nol}
{F.S: Peubah penunjuk front dan rear bernilai nol}
begin
Front:=0;
Rear:=0;
end;
Function Kosong(Rear: Integer): boolean;
{I.S: Penunjuk rear dalam keadaan terdefinisi}
{F.S: Mengecek indeks penunjuk rear bernilai 0 atau tidak}
begin
Kosong:=false;
if (Rear=0) then
kosong:=true;
end;
Function Penuh(Rear: Integer): boolean;
{I.S: Penunjuk rear dalam keadaan terdefinisi}
{F.S: Mengecek indeks penunjuk rear bernilai max atau tidak }
begin
Penuh:=false;
if (Rear=max) then
penuh:=true;
end;
Function SatuElemen(Rear: Integer): boolean;
{I.S: penunjuk rear dalam keadaan terdefinisi}
{F.S: Mengecek indeks rear bernilai 1 atau lebih}
begin
satuelemen:=false;
if (Rear=1) then
satuelemen:=true;
end;
Procedure InputElemen (var Elemen: data);
{I.S: Elemen dibaca dari piranti masukan}
{F.S: Elemen disimpan kedalam memori komputer}
begin
gotoxy (25,5); write (' -----------Enqueue Data---------- ');
gotoxy (25,7); write (' Masukan Nama : ');readln (elemen.nama);
gotoxy (25,8); write (' Masukan NIM : ');readln (elemen.nim);
gotoxy (25,9); write (' Masukan Kota : ');readln (elemen.kota);
gotoxy (25,10);write (' Masukan Lama Sewa : ');readln (elemen.lama);
gotoxy (25,11);write (' Masukan tipe mobil : ');readln (elemen.tipe);
gotoxy (25,13);writeln (' ------------------------------- ');
end;
Procedure CetakElemen (Elemen: data);
{I.S: Elemen dibaca dari piranti masukan}
{F.S: Elemen disimpan kedalam memori komputer}
begin
gotoxy (25,5); writeln (' ---------Dequeue Data----------- ');
gotoxy (25,7); writeln (' Nama : ',elemen.nama);
gotoxy (25,8); writeln (' NIM : ',elemen.nim);
gotoxy (25,9); writeln (' Kota : ',elemen.kota);
gotoxy (25,10);writeln (' Lama Sewa : ',elemen.lama);
gotoxy (25,11);writeln (' Tipe mobil : ',elemen.tipe);
gotoxy (25,13);writeln (' ------------------------------- ');
end;
Procedure PUSH (var Queue: LarikQueue; Rear: integer; Elemen: data);
{I.S: Queue dan front sudah terdefinisi}
{F.S: Menambahkan elemen kedalam Queue}
begin
Queue[rear].nama:=elemen.nama;
Queue[rear].nim :=elemen.nim;
Queue[rear].kota:=elemen.kota;
Queue[rear].lama:=elemen.lama;
Queue[rear].tipe:=elemen.tipe;
end;
Procedure POP (var Queue: LarikQueue; Front: integer; var Elemen: data);
{I.S: Queue dan front sudah terdefinisi}
{F.S: Mengeluarkan data dari Queue untuk kemudian disimpan kedalam elemen}
begin
elemen.nama:=Queue[front].nama;
elemen.nim :=Queue[front].nim;
elemen.kota:=Queue[front].kota;
elemen.lama:=Queue[front].lama;
elemen.tipe:=Queue[front].tipe;
end;
Procedure GeserData (var Queue: LarikQueue; var Front,Rear: integer);
{I.S: Queue, front dan rear terdefinisi}
{F.S: memindahkan posisi rear dan data ke-i ke posisi i-1}
var
Bantu: integer;
begin
Bantu:=front;
repeat
begin
Queue[bantu]:=Queue[bantu+1];
bantu:=bantu+1;
end
until (bantu=rear);
rear:=rear-1;
end;
Procedure Enqueue (var Queue: LarikQueue; var Front, Rear : integer; Elemen : Data);
{I.S: Queue, front, rear dan elemen terdefinisi}
{F.S: Menambahkan elemen kedalam larik Queue}
begin
if (not penuh(rear)) then
begin
N_antrian:=N_antrian+1;
InputElemen(Elemen);
if (kosong(rear)) then
begin
front:=1;
rear:=1;
end
else
rear:=rear+1;
Push (Queue,Rear,Elemen);
end
else
begin
gotoxy (20,8); writeln ('Tidak bisa melakukan enqueue! Antrian Penuh!');
end;
end;
Procedure Dequeue (var Queue: LarikQueue; var Front, Rear : integer; var Elemen : Data);
{I.S: Queue, front dan rear terdefinisi}
{F.S: Mengeluarkan data yang ada di indeks front ke elemen }
begin
if (not kosong(rear)) then
begin
N_antrian:=N_antrian-1;
POP (Queue,Front,Elemen);
CetakElemen(Elemen);
if (SatuElemen(rear)) then
begin
front:=0;
rear:=0;
end
else
begin
GeserData (Queue,Front,Rear);
end;
end
else
begin
gotoxy (25,6); Writeln ('Dequeue gagal, queue kosong!');
end;
end;
Procedure pencarian_nim (Queue : LarikQueue; Front,Rear : Integer; carinim: string );
{I.S: Melakukan pencarian unik terhadap nim}
{F.S: Menampilkan hasil pencarian jika data ditemukan}
var
ketemu: boolean;
bantu: integer;
begin
if (kosong(rear)) then
begin
gotoxy (19,5); writeln ('Pencarian NIM');
gotoxy (19,6); writeln ('----------------------------------------');
gotoxy (19,13);writeln ('Antrian kosong!');
gotoxy (19,14);writeln ('----------------------------------------');
end
else
begin
gotoxy (19,5); writeln ('Pencarian NIM');
gotoxy (19,6); writeln ('----------------------------------------');
gotoxy (19,14);writeln ('----------------------------------------');
gotoxy (19,7); write ('Masukan Nim dicari : '); readln(carinim);
ketemu:=false;
bantu:=front;
while (not kosong(rear)) and ((bantu<>rear+1) and (not ketemu)) do
begin
if (Queue[bantu].nim=carinim) then
begin
ketemu:=true;
end
else
begin
bantu:=bantu+1;
end;
end;
if (ketemu) then
begin
gotoxy (19,9); writeln ('NIM : ',Queue[bantu].nim);
gotoxy (19,10);writeln ('Nama : ',Queue[bantu].nama);
gotoxy (19,11);writeln ('Kota : ',Queue[bantu].kota);
gotoxy (19,12);writeln ('Lama Sewa : ',Queue[bantu].lama);
gotoxy (19,13);writeln ('Tipe Mobil : ',Queue[bantu].tipe);
end
else
begin
gotoxy (19,13);writeln('Tidak ditemukan penyewa dengan NIM "',carinim,'"');
end;
end;
gotoxy (19,15);write('Tekan (y) untuk kembali : '); readln(menu);
end;
Procedure pencarian_nama (Queue : LarikQueue; Front,Rear: integer; nama_dicari : string);
{I.S: Melakukan pencarian data tidak unik terhadap nama penyewa}
{F.S: Menampilkan seluruh data hasil pencarian yang mempunyai kecocokan}
var
x,y,bantu : integer;
ketemu : boolean;
begin
if (kosong(rear)) then
begin
gotoxy (19,5); writeln ('Pencarian Nama');
gotoxy (19,6); writeln ('----------------------------------------');
gotoxy (19,7); write ('Antrian Kosong! ');
gotoxy (19,15);writeln ('----------------------------------------');
gotoxy (19,16);write ('Tekan (y) untuk kembali : '); readln(menu);
end
else
begin
x:=10;
y:=7;
bantu:=front;
ketemu:=false;
gotoxy (19,5); writeln ('Pencarian Nama');
gotoxy (19,6); writeln ('----------------------------------------');
gotoxy (19,15);writeln ('----------------------------------------');
gotoxy (19,7); write ('Masukan nama yang dicari : ');readln(nama_dicari);
clrscr;
gotoxy (10,3); writeln ('Pencarian Nama');
gotoxy (10,4); writeln ('------------------------------------------------------------------');
gotoxy (10,5); writeln ('| NIM | Nama | Kota | Lama Sewa | Tipe Mobil |');
gotoxy (10,6); writeln ('------------------------------------------------------------------');
while ((not kosong(rear)) and (bantu<>rear+1)) do
begin
if (Queue[bantu].nama=nama_dicari) then
begin
gotoxy (x,y); writeln ('| ',Queue[bantu].nim);
gotoxy (x+12,y); writeln ('| ',Queue[bantu].nama);
gotoxy (x+26,y); writeln ('| ',Queue[bantu].kota);
gotoxy (x+38,y); writeln ('| ',Queue[bantu].lama,' hari');
gotoxy (x+50,y); writeln ('| ',Queue[bantu].tipe);
gotoxy (x+65,y); writeln ('|');
y:=y+1;
ketemu:=true;
end;
bantu:=bantu+1;
end;
if (ketemu) then
begin
gotoxy (x,y);writeln ('------------------------------------------------------------------');
gotoxy (x,y+1);write('Pencarian Selesai, tekan (y) untuk kembali : '); readln(menu);
end
else
begin
gotoxy (10,8); writeln ('Nama yang anda cari tidak ditemukan di antrian!');
gotoxy (10,9);writeln ('------------------------------------------------------------------');
gotoxy (10,10);write('Pencarian Selesai, tekan (y) untuk kembali : '); readln(menu);
end;
end;
end;
Procedure TampilQueue (Queue : LarikQueue; Front,Rear: integer);
{I.S: Queue, front dan rear sudah terdefinisi }
{F.S: Menampilkan seluruh isi antrian}
var
x,y,bantu : integer;
begin
if (kosong(rear)) then
begin
gotoxy (19,5); writeln ('Tabel isi Antrian');
gotoxy (19,6); writeln ('----------------------------------------');
gotoxy (19,7); write ('Antrian Kosong! ');
gotoxy (19,15);writeln ('----------------------------------------');
gotoxy (19,16);write ('Tekan (y) untuk kembali : '); readln(menu);
end
else
begin
x:=10;
y:=7;
bantu:=front;
clrscr;
gotoxy (10,3); writeln ('Daftar Isi Antrian');
gotoxy (10,4); writeln ('------------------------------------------------------------------');
gotoxy (10,5); writeln ('| NIM | Nama | Kota | Lama Sewa | Tipe Mobil |');
gotoxy (10,6); writeln ('------------------------------------------------------------------');
while ((not kosong(rear)) and (bantu<>rear+1)) do
begin
gotoxy (x,y); writeln ('| ',Queue[bantu].nim);
gotoxy (x+12,y); writeln ('| ',Queue[bantu].nama);
gotoxy (x+26,y); writeln ('| ',Queue[bantu].kota);
gotoxy (x+38,y); writeln ('| ',Queue[bantu].lama,' hari');
gotoxy (x+50,y); writeln ('| ',Queue[bantu].tipe);
gotoxy (x+65,y); writeln ('|');
y:=y+1;
bantu:=bantu+1;
end;
gotoxy (x,y);writeln ('------------------------------------------------------------------');
gotoxy (x,y+1);write('Tekan (y) untuk kembali : '); readln(menu);
end;
end;
Procedure MenuQueue (var menu:char);
{I.S: menu dibaca dari piranti masukan}
{F.S: menampilkan daftar menu ke program utama }
begin
gotoxy(1,0);writeln ('Queue by @hadiPranoto_ ');
gotoxy(25,5);writeln ('=================================');
gotoxy(25,6);writeln (' Program Antrian Penyewaan Mobil ');
gotoxy(25,7);writeln ('=================================');
gotoxy(25,8);writeln (' Isi Antrian : ', N_antrian);
gotoxy(25,9);writeln (' 1. EnQueue');
gotoxy(25,10);writeln (' 2. DeQueue');
gotoxy(25,11);writeln (' 3. Pencarian NIM');
gotoxy(25,12);writeln (' 4. Pencarian Nama');
gotoxy(25,13);writeln (' 5. Menampilkan Isi Antrian');
gotoxy(25,14);writeln (' 0. Exit');
gotoxy(25,15);writeln ('=================================');
gotoxy(25,16);write (' Input Menu : ');readln (menu);
case menu of
'1': begin
clrscr;
EnQueue(Queue,Front,Rear,Elemen);
gotoxy (26,15);write (' Tekan (y) untuk kembali : ');readln (lagi);
end;
'2': begin
clrscr;
DeQueue(Queue,Front,Rear,Elemen);
gotoxy (26,15);write (' Tekan (y) untuk kembali : ');readln (lagi);
end;
'3': begin
clrscr;
Pencarian_nim(Queue,Front,Rear,carinim);
end;
'4': begin
clrscr;
Pencarian_nama(Queue,Front,Rear,carinama);
end;
'5': begin
clrscr;
TampilQueue (Queue,Front,Rear);
end;
end;
end;
begin
Inisialisasi(Front,Rear);
N_antrian:=0;
Repeat
begin
clrscr;
MenuQueue(menu);
end
Until ((lagi='t') or (lagi='T')) or (menu='0');
end.