Parkir Mobil Menggunakan Antrian

membuat parkir mobil menggunakan antrian langsung saja ini codingnya:
 
program antrian_mobil;
uses crt;
const
     MAX=5;
     NULL=0;
type
    tipedata=string;
    antrian = record
            data:array[1..MAX]of tipedata;
            rear:integer;
    end;

{procedure untuk memberikan nilai awal antrian kosong}
procedure inisialisasi(var Q:antrian);
var x:integer;
begin
     Q.rear:=Null;
     for x:=1 to MAX do Q.data[x]:='        ';
end;

{procedure untuk melakukan proses delay}
procedure delayed;
var delayTime:integer;
begin
     for delayTime:=1 to 100 do delay(500);
end;

{function untuk memeriksa apakah antrian masih ada ruang kosong}
function kosong(Q:antrian):boolean;
begin
     kosong:=((Q.rear=NULL)or(Q.rear<MAX));
end;

{procedure untuk mencetak tampilan simulasi}
procedure SimScreen(var Q:antrian;status:string);
var
   x,posX:integer;
begin
     clrscr;
     writeln('------------------------------');
     writeln('| Antrian Pada Parkir Mobil  |');
     writeln('------------------------------');writeln;
     writeln('Status: ',status);writeln;writeln;
     if Q.rear=Null then
     begin
          writeln;writeln;
     end
     else
     begin
          writeln('    |Front');
          writeln('    v');
     end;
     writeln('========================================================');
     for x:=1 to MAX do write('\ ',Q.data[x],' ');
     writeln('<');
     writeln('========================================================');
     posX:=5;
     if Q.rear>1 then for x:=2 to Q.rear do posX:=posX+11;
     if Q.rear<>null then
     begin
          gotoxy(posx,13);write('^');
          gotoxy(posx,14);write('|Rear');
     end;
end;

{fungsi untuk memeriksa data ada pada antrian}
function exist(Q:antrian;data:tipedata):boolean;
var
   x:integer;
begin
     exist:=false;
     for x:=1 to MAX do
     if Q.data[x]=data then
     begin
          exist:=true;
     end;
end;

{procedure untuk menambahkan data pada akhir antrian}
procedure Enqueue(var Q:antrian; data:tipedata);
begin
     if kosong(Q) then
     begin
          Q.rear:=Q.rear+1;
          Q.data[Q.rear]:=data;
     end;
end;

{procedure melakukan perulangan sampai ditemukan data yang cocok pada antrian pertama dan selanjutnya dihapus}
procedure Dequeue(var Q:antrian; data:tipedata);
var
   temp:tipedata;
   x,y,rear_temp:integer;
   hapus:boolean;
begin
     if exist(Q,data) then
     begin
          rear_temp:=Q.rear;
          for x:=1 to rear_temp do
          begin
               hapus:=false;
               if Q.data[1]=data then
               begin
                    Q.data[1]:='        ';
                    Q.rear:=Q.rear-1;
                    hapus:=true;
               end;
               if hapus then
               begin
                    temp:=Q.data[1];
                    for y:=1 to Q.rear do
                        Q.data[y]:=Q.data[y+1];
                    Q.data[rear_temp]:=temp;
                    rear_temp:=rear_temp-1;
               end
               else
               begin
                    temp:=Q.data[1];
                    for y:=1 to rear_temp-1 do
                    begin
                         Q.data[y]:=Q.data[y+1];
                    end;
                    Q.data[y+1]:=temp;
               end;
               SimScreen(Q,'Mengganti posisi.');
               delayed;
          end;
     end;
end;

{Procedure Untuk menampilkan menu}
procedure ShowMenu(var Q:antrian;var pil:char);
var
   inputMobil:string;
   x:integer;
begin
     if kosong(Q) then
     begin
          gotoxy(1,16);
          write('1. Mobil Masuk');
          gotoxy(1,17);
          write('2. Mobil Keluar');
     end
     else
     begin
          gotoxy(1,17);
          write('2. Mobil Keluar');
     end;
     gotoxy(1,18);
     write('3. Exit');
     gotoxy(1,19);
     write('Pilihan: ');pil:=readkey;
     if (pil='1')or(pil='2') then
     begin
          SimScreen(Q,'Sukses! Menunggu input...');
          gotoxy(1,16);
          write('No. Kendaraan: ');
          readln(inputMobil);
          for x:=1 to length(inputMobil) do inputMobil[x]:=upcase(inputMobil[x]);
          if pil='1' then
          begin
               Enqueue(Q,inputMobil);
               SimScreen(Q,'Sukses! Data telah masuk.');
          end
          else if pil='2' then
          begin
               Dequeue(Q,inputMobil);
               SimScreen(Q,'Sukses! Data telah dihapus.');
          end;
     end;
end;

{Program Utama}
var
   Q:antrian;
   pil:char;
begin
     inisialisasi(Q);
     SimScreen(Q,'Inisialisasi...');
     delayed;
     SimScreen(Q,'Sukses! Menunggu input...');
     repeat
     ShowMenu(Q,pil);
     until pil='3';
end.

0 komentar: