Вы находитесь на странице: 1из 11

program radix_sort ;

uses crt ;

const
maks_array = 100 ;

type
tanggal = record
hari, bulan, tahun : integer ;
end ;
barang = record
nama, status : string ;
kode, stok, jenis: integer ;
lama : longint ;
harga : real ;
masuk, kadaluwarsa, periode : tanggal ;
end ;
larik_brg = array[1..maks_array] of barang ;

var
brg : larik_brg ;
i, j, n, digit_max, x, y : integer ;
sekarang : tanggal ;
kunci : boolean ;

procedure create(var brg : larik_brg) ; //var i/o


begin
for i := 1 to maks_array do
begin
//pembuatan array of record "barang"
brg[i].nama := '/' ;
brg[i].stok := 0 ;
brg[i].harga := 0 ;
brg[i].jenis := 0 ;
brg[i].masuk.hari := 0 ;
brg[i].masuk.bulan := 0 ;
brg[i].masuk.tahun := 0 ;
brg[i].kadaluwarsa.hari := 0 ;
brg[i].kadaluwarsa.bulan := 0 ;
brg[i].kadaluwarsa.tahun := 0 ;
end ;
end ; //endprocedure

procedure destroy(var brg : larik_brg) ; //var i/o


begin
for i := 1 to maks_array do
begin
brg[i].nama := '/' ;
brg[i].stok := 0 ;
brg[i].harga := 0 ;
brg[i].jenis := 0 ;
brg[i].masuk.hari := 0 ;
brg[i].masuk.bulan := 0 ;
brg[i].masuk.tahun := 0 ;
brg[i].kadaluwarsa.hari := 0 ;
brg[i].kadaluwarsa.bulan := 0 ;
brg[i].kadaluwarsa.tahun := 0 ;
end ;
end ;

function pangkat(nilai, pemangkat : integer) : integer ;


begin
if (pemangkat = 0)
then
pangkat := 1
else
pangkat := nilai * pangkat(nilai,pemangkat-1) ;
end ; //endfunction

procedure cari_digit_maks(brg : larik_brg ; n : integer ; var digit_max : integer )


;
var
penampung, temp : integer ;
begin
penampung := 0 ;
digit_max := 0 ;
temp := 0 ;
for i := 1 to n do
begin
penampung := brg[i].kode ;
while (penampung <> 0) do
begin
penampung := penampung div 10 ;
temp := temp + 1 ;
end ;
if (temp >= digit_max)
then
begin
digit_max := temp ;
temp := 0 ;
end ;
end ;
end ; //endprocedure

procedure radix(var brg : larik_brg ; n, digit_max : integer) ;


var
grup, pencacah, brgs, x : integer ;
larik_temp : larik_brg ;
begin
for brgs := 1 to digit_max do
begin
pencacah := 0 ;
for grup := 0 to 9 do
begin
for j := 1 to n do
begin
x := (brg[j].kode div pangkat(10,brgs-1)) mod 10 ;
if (x = grup)
then
begin
pencacah := pencacah + 1 ;
larik_temp[pencacah] := brg[j] ;
end ;
end ;
end ;
for i := 1 to n do
begin
brg[i] := larik_temp[i] ;
end ;
end ;
end ; //endprocedure

function kabisat(t : tanggal) : boolean ;


begin
kabisat := false ;
if ((t.tahun mod 4 = 0) and (t.tahun mod 100 <> 0) or (t.tahun mod 400 = 0))
then
kabisat := true ; //endif
end ; //endfunction

function total_hari(t : tanggal) : integer ;


var
hari, hari_kabisat, x : integer ;
begin
hari_kabisat := 0 ;
for x := 1 to t.tahun do
begin
if ((x mod 4 = 0) and (x mod 100 <> 0) or (x mod 400 = 0))
then
begin
hari_kabisat := hari_kabisat + 1 ;
end ;
end ;
case (t.bulan) of
1 : hari := 0 ;
2 : hari := 31 ;
3 : hari := 59 ;
4 : hari := 90 ;
5 : hari := 120 ;
6 : hari := 151 ;
7 : hari := 181 ;
8 : hari := 212 ;
9 : hari := 243 ;
10 : hari := 273 ;
11 : hari := 303 ;
12 : hari := 334 ;
end ; //endcase
if (kabisat(t) = true) and (t.bulan > 2)
then
hari := hari + 1 ; //endif
total_hari := t.tahun * 365 + hari_kabisat + hari + t.hari ;
end ; //endfunction

procedure perioda(awal, akhir : tanggal ; var lama : tanggal ; var total_hr :


integer ) ;
var
temp : integer ;
begin
total_hr := total_hari(akhir) - total_hari(awal) ;
lama.tahun:= total_hr div 365 ;
temp := total_hr mod 365 ;
lama.bulan := temp div 30 ;
lama.hari := temp mod 30 ;
end ;

function valid_tanggal(t : tanggal) : boolean ;


begin
valid_tanggal := true ;
if (t.tahun < 1)
then
valid_tanggal := false ;
if (t.bulan < 1) or (t.bulan > 12)
then
valid_tanggal := false ;
case (t.bulan) of
1,3,5,7,8,10,12 : begin
if (t.hari < 1) or (t.hari > 31)
then
valid_tanggal := false ;
end ;
2 : begin
if ((t.tahun mod 4 = 0) and (t.tahun mod 100 <> 0)) or (t.tahun
mod 400 = 0)
then
begin
if (t.hari < 1) or (t.hari > 29)
then
valid_tanggal := false ;
end
else
begin
if (t.hari < 1) or (t.hari > 28)
then
valid_tanggal := false ;
end ;
end ;
4,6,9,11 : begin
if (t.hari < 1) or (t.hari > 30)
then
valid_tanggal := false ;
end ;
end ; //endcase
end ; //endfunction

procedure validasi_tanggal(tam1, tam2, tam3 : integer ; var tgl : tanggal) ;


var
a : integer ;
keluar : boolean ;
begin
keluar := valid_tanggal(tgl) ;
while (keluar = false) do
begin
textcolor(12) ;
gotoxy(tam1,tam2+2) ; write('Tanggal yang Anda masukkan tidak ada.') ;
gotoxy(tam1,tam2+3) ; write('Silakan tekan enter untuk mencoba kembali.') ;
readln ;
gotoxy(tam1,tam2+2) ; clreol ;
gotoxy(tam1,tam2+3) ; clreol ;
for a := 1 to 3 do
begin
gotoxy(tam3,tam2) ; write(' ') ;
tam3 := tam3 + 12 ;
end ; //endfor
tam3 := tam3 - 36 ;
textcolor(15) ;
gotoxy(tam3,tam2) ; readln(tgl.hari) ;
tam3 := tam3 + 12 ;
gotoxy(tam3,tam2) ; readln(tgl.bulan) ;
tam3 := tam3 + 12 ;
gotoxy(tam3,tam2) ; readln(tgl.tahun) ;
tam3 := tam3 - 24 ;
keluar := valid_tanggal(tgl) ;
end ;
end ; //endprocedure

procedure tambah_bulan(akhir_bulan : integer ; var exp : tanggal) ; //var i/o


begin
if (exp.hari > akhir_bulan)
then
begin
exp.hari := exp.hari - akhir_bulan ;
exp.bulan := exp.bulan + 1 ;
if (exp.bulan > 12)
then
begin
exp.bulan := exp.bulan - 12 ;
exp.tahun := exp.tahun + 1 ;
end ;
end ;
end ; //endprocedure

procedure expired(lama : integer ; t : tanggal ; var exp : tanggal) ; //var i/o


begin
exp.hari := t.hari + lama ;
exp.bulan := t.bulan ;
exp.tahun := t.tahun ;
case (t.bulan) of
1,3,5,7,8,10,12 : tambah_bulan(31,exp) ;
2 : begin
if (kabisat(exp))
then
tambah_bulan(29,exp)
else
tambah_bulan(28,exp) ;
end ;
4,6,9 : begin
tambah_bulan(30,exp) ;
end ;
end ;
end ;

function bulan(nomor : integer) : string ;


begin
case (nomor) of
1 : bulan := 'JAN' ;
2 : bulan := 'FEB' ;
3 : bulan := 'MAR' ;
4 : bulan := 'APR' ;
5 : bulan := 'MEI' ;
6 : bulan := 'JUN' ;
7 : bulan := 'JUL' ;
8 : bulan := 'AGU' ;
9 : bulan := 'SEP' ;
10 : bulan := 'OKT' ;
11 : bulan := 'NOV' ;
12 : bulan := 'DES' ;
end ;
end ;

procedure hitung(stock, jenis : integer ; var harga : real ; t : tanggal ; var exp
: tanggal ) ; //var exp & harga - i/o
var
discount : real ;
begin
case (stock) of
1..70 : discount := 0.1 ;
71..120 : discount := 0.25 ;
121..200 : discount := 0.3 ;
end ;
harga := harga - harga * discount ;
case (jenis) of
1 : begin
expired(12,t,exp) ;
end ;
2 : begin
expired(7,t,exp) ;
end ;
3 : begin
expired(4,t,exp) ;
end ;
end ;
end ; //endprocedure

function j_barang(nomor : integer) : string ;


begin
case (nomor) of
1 : j_barang := 'Sayuran' ;
2 : j_barang := 'Buah' ;
3 : j_barang := 'Daging' ;
end ; //endcase
end ; //endprocedure

procedure isi_max_data(var n : integer) ;


begin
textcolor(15) ;
//memasukkan banyaknya data
write('Banyaknya Data Barang : ') ; readln(n) ;
end ; // endprocedure

procedure input_tanggal(var sekarang : tanggal) ;


begin
gotoxy(18,10) ; writeln('Tanggal hari ini Tanggal : Bulan : Tahun :
') ;
gotoxy(48,10) ; readln(sekarang.hari) ; gotoxy(60,10) ; readln(sekarang.bulan) ;
gotoxy(72,10) ; readln(sekarang.tahun) ;
validasi_tanggal(18,10,48,sekarang) ;
kunci := true ;
end ;

procedure form_data(n, i : integer ; var brg : larik_brg ; tujuan : string ;


sekarang : tanggal) ;
begin
clrscr ;
textcolor(15) ;
if (tujuan = 'isi')
then
begin
gotoxy(18,1) ; write('Pengisian data barang ke ',i,' dari ',n) ;
end
else
begin
gotoxy(18,1) ; write('Pengeditan data barang dengan kode ',brg[i].kode) ;
end ;
gotoxy(29,3) ; writeln('Pengisian Data Barang per tanggal
',sekarang.hari,'-',bulan(sekarang.bulan),'-',sekarang.tahun) ;
gotoxy(29,4) ; writeln('=============================================') ;
gotoxy(18,6) ; writeln('Kode Barang : ') ; gotoxy(38,6) ;
readln(brg[i].kode) ;
gotoxy(18,7) ; writeln('Nama Barang : ') ; gotoxy(38,7) ;
readln(brg[i].nama) ;
gotoxy(18,8) ; writeln('Harga Barang / kg : ') ; gotoxy(38,8) ;
readln(brg[i].harga) ;
gotoxy(18,9) ; writeln('Stok Barang (kg) : ') ; gotoxy(38,9) ;
readln(brg[i].stok) ;
gotoxy(18,10) ; writeln('Tanggal masuk : Tanggal : Bulan : Tahun :
') ;
gotoxy(48,10) ; readln(brg[i].masuk.hari) ; gotoxy(60,10) ;
readln(brg[i].masuk.bulan) ; gotoxy(72,10) ; readln(brg[i].masuk.tahun) ;
validasi_tanggal(18,10,48,brg[i].masuk) ;
while (total_hari(brg[i].masuk) > total_hari(sekarang)) do
begin
textcolor(12) ;
gotoxy(18,12) ; write('Tanggal masuk tidak boleh lebih dari tanggal sekarang') ;
gotoxy(18,13) ; write('Silakan tekan enter untuk coba lagi') ;
readln ;
gotoxy(18,12) ; clreol ;
gotoxy(18,13) ; clreol ;
textcolor(15) ;
gotoxy(18,10) ; writeln('Tanggal masuk : Tanggal : Bulan : Tahun :
') ;
gotoxy(48,10) ; readln(brg[i].masuk.hari) ; gotoxy(60,10) ;
readln(brg[i].masuk.bulan) ; gotoxy(72,10) ; readln(brg[i].masuk.tahun) ;
validasi_tanggal(18,10,48,brg[i].masuk) ;
end ;
gotoxy(18,15) ; write('Daftar Jenis Barang') ;
gotoxy(18,16) ; write('-------------') ;
gotoxy(18,17) ; write('1. Sayuran') ;
gotoxy(18,18) ; write('2. Buah') ;
gotoxy(18,19) ; write('3. Daging') ;
gotoxy(18,21) ; write('Silakan masukkan pilihan jenis Barang : ') ;
readln(brg[i].jenis) ;

//proses penghitungan
hitung(brg[i].stok,brg[i].jenis,brg[i].harga,brg[i].masuk,brg[i].kadaluwarsa) ;
perioda(sekarang,brg[i].kadaluwarsa,brg[i].periode,brg[i].lama) ;
if (brg[i].lama > 0)
then
brg[i].status := 'baik'
else
brg[i].status := 'basi' ;
gotoxy(18,23) ; write('Jenis Barang :
',j_barang(brg[i].jenis)) ;
gotoxy(18,24) ; write('Harga Bersih Barang :
',brg[i].harga:0:0) ;
gotoxy(18,25) ; write('Tanggal kadaluwarsa :
',brg[i].kadaluwarsa.hari,'-',bulan(brg[i].kadaluwarsa.bulan),'-',brg[i].kadaluwars
a.tahun) ;
if (brg[i].lama < 0)
then
begin
gotoxy(18,26) ; writeln('Telah kadaluarsa selama :
',abs(brg[i].periode.hari),' hari ',abs(brg[i].periode.bulan),' bulan
',abs(brg[i].periode.tahun),' tahun') ;
end
else
if (brg[i].lama = 0)
then
begin
gotoxy(18,26) ; writeln('Kadaluarsa hari ini') ;
end
else
begin
gotoxy(18,26) ; writeln('Akan kadaluarsa pada :
',brg[i].periode.hari,' hari ',brg[i].periode.bulan,' bulan
',brg[i].periode.tahun,' tahun') ;
end ;
gotoxy(18,28) ; writeln('Silakan tekan enter untuk kembali ke menu utama') ;
gotoxy(65,28) ; readln;
end ; //endprocedure

procedure tampil(n : integer ; brg : larik_brg) ;


begin
gotoxy(44,1) ; write('DAFTAR BARANG PER TANGGAL
',sekarang.hari,'-',bulan(sekarang.bulan),'-',sekarang.tahun) ;
gotoxy(44,2) ; write('=====================================') ;
gotoxy(1,3) ;
write('============================================================================
=====================================') ;
gotoxy(1,4) ; write('| No | Kode | Nama | Jenis | Stok | Masuk |
Kadaluarsa | Status | Perioda | Harga |') ;
gotoxy(1,5) ;
write('============================================================================
=====================================') ;
for i := 1 to n do
begin
gotoxy(1,i+5) ;
write('| | | | | | |
| | hari | Rp. |') ;
gotoxy(3,i+5) ; write(i) ;
gotoxy(8,i+5) ; write(brg[i].kode) ;
gotoxy(15,i+5) ; write(brg[i].nama) ;
gotoxy(28,i+5) ; write(j_barang(brg[i].jenis)) ;
gotoxy(40,i+5) ; write(brg[i].stok) ;
gotoxy(46,i+5) ;
write(brg[i].masuk.hari,'-',bulan(brg[i].masuk.bulan),'-',brg[i].masuk.tahun) ;
gotoxy(60,i+5) ;
write(brg[i].kadaluwarsa.hari,'-',bulan(brg[i].kadaluwarsa.bulan),'-',brg[i].kadalu
warsa.tahun) ;
gotoxy(76,i+5) ; write(brg[i].status) ;
gotoxy(87,i+5) ; write(brg[i].lama) ;
gotoxy(104,i+5) ; write(brg[i].harga:0:0) ;
end ;
writeln ;

writeln('==========================================================================
=======================================') ;
end ; //endprocedure

procedure carikode(n :integer ; brg : larik_brg ) ;

var
kodecari : integer ;
ketemu : boolean ;

begin
clrscr ;
write('Kode yang dicari : ') ; readln(KodeCari) ;
clrscr ;
i := 1 ;
Ketemu := False ;
while (Not Ketemu) and (i <= N) do
begin
if (Brg[i].kode = KodeCari)
then
Ketemu := true
else
i := i + 1;
end; //endwhile

if (Ketemu)
then
begin
write(brg[i].kode) ;
write(brg[i].nama) ;
write(j_barang(brg[i].jenis)) ;
write(brg[i].stok) ;

write(brg[i].masuk.hari,'-',bulan(brg[i].masuk.bulan),'-',brg[i].masuk.tahun) ;

write(brg[i].kadaluwarsa.hari,'-',bulan(brg[i].kadaluwarsa.bulan),'-',brg[i].kadalu
warsa.tahun) ;
write(brg[i].status) ;
write(brg[i].lama) ;
write(brg[i].harga:0:0) ;
end
else
writeln('Kode ',KodeCari, 'Tidak ditemukan!');
end ; //endprocedure

procedure edit(n : integer ; brg : larik_brg) ;


var
x, y, edit_cari : integer ;
ada : boolean ;
begin
tampil(n,brg) ;
textcolor(15) ;
x := 14 ;
y := n*2+6 ;
gotoxy(x,y) ; write('Kode yang akan diedit : ') ;
gotoxy(x+24,y) ; readln(edit_cari) ;
i := 1 ;
ada := False ;
while (not ada) and (i <= n) do
begin
if (brg[i].kode = edit_cari)
then
ada := true
else
i := i + 1;
end ; //endwhile
if(ada)
then
begin
clrscr ;
form_data(n,i,brg,'edit',sekarang) ;
tampil(n,brg) ;
end
else
begin
gotoxy(x,y) ; clreol ; writeln('Kode ',edit_cari,' tidak ditemukan.') ;
end ;
end ; //endprocedure

procedure menu_pilihan(sekarang : tanggal) ;


var
menu : integer ;
begin
clrscr ;
while (kunci = true) do
begin
x := 53 ;
y := 8 ;
clrscr ;
gotoxy(x+1,y) ; write('Menu Pilihan') ;
gotoxy(x+1,y+1) ; write('============') ;
gotoxy(x,y+3) ; write('1. Isi Data') ;
gotoxy(x,y+4) ; write('2. Tampil Data') ;
gotoxy(x,y+5) ; write('3. Urut Berdasar Kode (Radix Sort Ascending)') ;
gotoxy(x,y+6) ; write('4. Cari') ;
gotoxy(x,y+7) ; write('5. Edit') ;
gotoxy(x,y+8) ; write('6. Reset (Destroy Array) ') ;
gotoxy(x,y+10) ; write('0. Keluar') ;
gotoxy(x,y+12) ; write('Masukkan menu pilihan Anda : ') ; readln(menu) ;
case (menu) of
1 : begin
clrscr ;
create(brg) ;
isi_max_data(n) ;
for i := 1 to n do
begin
form_data(n,i,brg,'isi',sekarang) ;
end ;
end ;
2 : begin
clrscr ;
tampil(n,brg) ;
writeln ;
write('Silakan tekan enter untuk kembali ke menu utama') ;
readln ;
end ;
3 : begin
clrscr ;
cari_digit_maks(brg,n,digit_max) ;
radix(brg,n,digit_max) ;
tampil(n,brg) ;
write('Silakan tekan enter untuk kembali ke menu utama.') ;
readln ;
end ;
4 : begin
clrscr ;
carikode(n,brg) ;
end ;
5 : begin
clrscr ;
edit(n,brg) ;
end ;
6 : begin
clrscr ;
destroy(brg) ;
end ;
0 : begin
clrscr ;
writeln('Anda telah keluar, terimakasih telah menggunakan program.') ;
readln ;
kunci := false ;
end ;
end ; //endcase
end ; //endwhile
end ; //endprocedure

begin

input_tanggal(sekarang) ;
menu_pilihan(sekarang) ;
readln ;
end.

Вам также может понравиться