Anda di halaman 1dari 8

unit UTugas;

interface

uses

Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,

Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Grids, Vcl.StdCtrls;

const

maxelemen =10;

type

TMahasiswa = record

Npm : String;

Nama, Prodi : String;

end;

TAntrian = record

Data : Array[1..MaxElemen] of String;

Depan, Belakang : 0..MaxElemen;

end;

TForm1 = class(TForm)

Label1: TLabel;

Label2: TLabel;

Label3: TLabel;

Button1: TButton;

Button2: TButton;

Button3: TButton;

Button4: TButton;

Edit1: TEdit;
Edit2: TEdit;

Edit3: TEdit;

StringGrid1: TStringGrid;

Labelinfo: TLabel;

Button5: TButton;

procedure tampilkandata;

procedure insert(X,Y,Z : String);

procedure Button4Click(Sender: TObject);

procedure FormCreate(Sender: TObject);

procedure Button1Click(Sender: TObject);

procedure Button3Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

function Find(Dicari: integer): integer;

procedure Button5Click(Sender: TObject);

private

{ Private declarations }

Angka:array[1..maxelemen]of string ;

Antrian : TAntrian;

Mahasiswa : array[1..MaxElemen] of TMahasiswa;

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

var

Luar, Dalam, H: Longint;

Tmp : Integer;

temp1, temp2 : string;

begin

H := 1;

while H < Antrian.Belakang div 3 do

H := 3 * H + 1;

//Proses sampai H=1

while H > 0 do

begin

for Luar := H+1 to Antrian.Belakang do

begin

Tmp := StrToInt(Mahasiswa[Luar].Npm);

Temp1 := Mahasiswa[Luar].Nama;

Temp2 := Mahasiswa[Luar].prodi;

Dalam := Luar;

while (Dalam >= H + 1) and (StrToInt(Mahasiswa[Dalam-H].Npm) >= Tmp)do

begin

Mahasiswa[Dalam].Npm := Mahasiswa[Dalam-H].Npm;

Dalam := Dalam - H;

end;

Mahasiswa[Dalam].Npm := IntToStr(Tmp);

Mahasiswa[Dalam].Nama := Temp1;

Mahasiswa[Dalam].Prodi := Temp2;

end;
H := (H - 1) div 3;

end;

tampilkandata;

end;

procedure TForm1.Button2Click(Sender: TObject);

var

hasil : string;

begin

Hasil := Hasil + 'Data : '+ Edit2.Text +' Ada Pada Posisi : ' + IntToStr(Find(strtoint(Edit2.Text))) + #13#10;

LabelInfo.Caption := Hasil;

end;

function TForm1.Find(Dicari: integer): integer;

var

Bawah, Atas, Tengah, K, Posisi : Longint;

begin

Bawah := 1;

Atas := Antrian.Belakang;

Posisi := -1; //Artinya Data Tidak Ditemukan

while Atas >= Bawah do

begin

Tengah := (Atas + Bawah) div 2;

if Dicari > strtoint(Mahasiswa[Tengah].Npm) then

//Kemungkinan berada di Bawah/Kanan

Bawah := Tengah + 1

else

if Dicari < strtoint(Mahasiswa[Tengah].Npm) then

//Kemungkinan Data berada di Atas/Kiri


Atas := Tengah - 1

else

begin //Ketemu

Posisi := Tengah;

Bawah := Atas + 1;

end;

end;

Find := Posisi;

end;

procedure TForm1.Button3Click(Sender: TObject);

begin

Close;

end;

procedure TForm1.Button4Click(Sender: TObject);

begin

//Periksa Inputan Kosong

if trim(Edit1.Text) = '' then

begin

ShowMessage('Data Harus ada');

Exit;

end;

Insert(Edit2.Text,Edit1.Text,Edit3.Text);

TampilkanData;

end;

procedure TForm1.Button5Click(Sender: TObject);

begin
Edit1.Clear;

Edit2.Clear;

Edit3.Clear;

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

StringGrid1.Cells[0,0] := 'NPM';

StringGrid1.Cells[1,0] := 'Nama';

StringGrid1.Cells[2,0] := 'Prodi';

end;

procedure TForm1.Insert(X,Y,Z: String);

var

PosisiBelakang : 1..MaxElemen;

begin

//Geser Belakang ke Posisi Selanjutnya

if Antrian.Belakang = MaxElemen then

PosisiBelakang := 1

else

PosisiBelakang := Antrian.Belakang + 1;

//Cek Posisi belakang sama depan

if PosisiBelakang = Antrian.Depan then

ShowMessage('Antrian Penuh')

else

begin

Antrian.Belakang := PosisiBelakang;

//Insert Data ke Antrian


Mahasiswa[Antrian.Belakang].Npm := x;

Mahasiswa[Antrian.Belakang].Nama := y;

Mahasiswa[Antrian.Belakang].Prodi := z;

end;

end;

procedure TForm1.tampilkanData;

var

I, JumData, Nomor : Integer;

begin

//Hitung Jumlah Data

if Antrian.Depan = Antrian.Belakang then

JumData := 0

else //Jika Tidak Nol

if (Antrian.Depan < Antrian.Belakang) then

JumData := Antrian.Belakang - Antrian.Depan

else

JumData := MaxElemen - Antrian.Depan + Antrian.Belakang;

StringGrid1.RowCount := JumData+1;

//Salin Data ke String Grid dari Depan ke Belakang

if Antrian.Depan = Antrian.Belakang then

for I := 0 to MaxElemen do

StringGrid1.Cells[0,I] := ''

else

if (Antrian.Depan < Antrian.Belakang) then

begin

Nomor := 1;

for I := Antrian.Depan + 1 to Antrian.Belakang do

begin
StringGrid1.Cells[0,Nomor] := Mahasiswa[I].Npm;

StringGrid1.Cells[1,Nomor] := Mahasiswa[I].Nama;

StringGrid1.Cells[2,Nomor] := Mahasiswa[I].Prodi;

Nomor := Nomor + 1

end

end

else

begin

Nomor := 1;

for I := Antrian.Depan + 1 to MaxElemen do

begin

StringGrid1.Cells[0,Nomor] := Antrian.Data[I];

Nomor := Nomor + 1

end;

for I := 1 to Antrian.Belakang do

begin

StringGrid1.Cells[0,Nomor] := Antrian.Data[I];

Nomor := Nomor + 1

end;

end;

end;

end.

Anda mungkin juga menyukai