Record

Pada contoh program untuk menentukan hari lahir, ada beberapa variabel yang sebenarnya merupakan satu kesatuan informasi. Variabel yang menyimpan informasi tanggal, bulan, dan tahun, sebenarnya merupakan variabel-variabel yang membentuk satu kesatuan informasi. Kita bisa menyusun variabel seperti itu menjadi sebuah variabel dengan tipe record. Variabel dengan tipe record adalah variabel yang di dalamnya terdapat beberapa variabel lagi.

Untuk membuat variabel dengan tipe record, kita harus mendefinisikan tipenya dengan cara seperti contoh berikut:

type 
   TTanggal = record
     Tanggal:integer;
     Bulan:TNamaBulan;
     Tahun:integer;
   end;

Kita asumsikan bahwa TNamaBulan adalah tipe data yang sudah didefinisikan sebelumnya.

Untuk mengacu variabel-variabel di dalam variabel tipe record, kita mengacunya dengan menyebut nama variabel record tersebut diikuti dengan titik diikuti variabel di dalam record yang akan diacu. Sebagai contoh:

var TglLahir:TTanggal;
...
TglLahir.Tanggal:=13;
TglLahir.Bulan:=Oktober;
TglLahir.Tahun:=2006;

Kita juga bisa mengacu variabel di dalam record dengan menggunakan with seperti contoh berikut:

with TglLahir do
begin
  Tanggal:=13;
  Bulan:=Oktober;
  Tahun:=2006;
end;

Acuan menggunakan with lebih efisien jika variabel di dalam record yang diacu cukup banyak. Jika variabel yang akan diacu cuma satu, maka penggunaan titik lebih cepat.

Tipe data record bisa bertingkat. Artinya di dalam record bisa berisi variabel dengan tipe record yang lain. Sebagai contoh, kita akan membuat tipe data untuk menyimpan informasi karyawan yang isinya nama, alamat, gaji, dan tanggal masuk. Nama dan alamat tentu saja menggunakan tipe string, gaji menggunakan Longword atau currency, sedangkan tanggal masuk menggunakan TTanggal. Jika Anda akan mengacu variabel tanggal masuk, maka Anda bisa mengacu dengan cara seperti berikut:

var Karyawan:TKaryawan;
...
Karyawan.TanggalMasuk.Tanggal:=13;

Menentukan tanggal lahir dengan record

Kita akan menulis ulang program HariLahir menggunakan record sebagai berikut:

program HariLahir2;
{$APPTYPE CONSOLE}
type
  TNamaHari=(Minggu, Senin, Selasa, Rabu,
            Kamis, Jumat, Sabtu);
  TNamaBulan=(Januari=1, Pebruari, Maret, April,
              Mei, Juni, Juli, Agustus, September,
              Oktober, Nopember, Desember);
  TTanggal=record
    Tanggal:integer;
    Bulan:TNamaBulan;
    Tahun:integer;
  end;
var
  TglLahir,TglSkr:TTanggal;
  HariL,HariSkr:integer;

  procedure AmbilTanggal(var Tgl:TTanggal);
  var tmp:integer;
  begin
    Write('Tanggal ?: ');
    Readln(Tgl.Tanggal);
    Write('Bulan ?  : ');
    Readln(tmp);
    Tgl.Bulan:=TNamaBulan(tmp);
    Write('Tahun ?  : ');
    Readln(Tgl.Tahun);
  end;

  procedure AmbilData;
  begin
    Writeln('**Semua data dalam angka**'#13#10);
    Writeln('Masukkan data tanggal lahir');
    AmbilTanggal(TglLahir);
    Writeln('Masukkan data tanggal sekarang');
    AmbilTanggal(TglSkr); 
    Writeln('Hari apakah sekarang?');
    Write('Minggu=0, Senin=1, ..Sabtu=6: ');
    Readln(HariSkr);
  end;

  function IsKabisat(Y:integer):boolean;
  begin
    result:=((Y mod 4=0)and(Y mod 100<>0))
            or(Y mod 400=0);
  end;

  function JumlahHari(Tgl:TTanggal):integer;
    function HariDlmBulan(B:TNamaBulan):integer;
    begin
      case B of
      Januari,Maret,Mei,Juli,Agustus,
      Oktober,Desember:result:=31;
      April,Juni,September,Nopember:result:=30;
      Pebruari:if IsKabisat(Tgl.Tahun)
                then result:=29 else result:=28;
      end;
    end;
  var i:TNamaBulan;
  begin
    result:=0;
    for i:=Januari to Pred(Tgl.Bulan)do
      result:=result+HariDlmBulan(i);
    result:=result+Tgl.Tanggal;
  end;   

  function HitungHari:integer;
  var i:integer;
  begin
    //Hitung hari dalam tahun
    result:=0;
    for i:=TglLahir.Tahun to TglSkr.Tahun-1 do
      if IsKabisat(i)then result:=result+366
         else result:=result+365;
    //tambahkan dengan jumlah hari tahun skr
    result:=result+JumlahHari(TglSkr);
    //kurangi dengan jumlah  hari tahun lahir
    result:=result-JumlahHari(TglLahir);
  end;

  procedure DisplayHari(H:integer);
  begin
    case TNamaHari(H) of
    Minggu:Writeln('Anda lahir hari Minggu');
    Senin:Writeln('Anda lahir hari Senin');
    Selasa:Writeln('Anda lahir hari Selasa');
    Rabu:Writeln('Anda lahir hari Rabu');
    Kamis:Writeln('Anda lahir hari Kamis');
    Jumat:Writeln('Anda lahir hari Jumat');
    Sabtu:Writeln('Anda lahir hari Sabtu');
    end;
  end;

begin
  AmbilData;
  HariL:=HitungHari mod 7;
  HariL:=(HariSkr-HariL+7)mod 7;
  DisplayHari(HariL);
  Writeln('Tekan Enter');
  Readln;
end.

Pada prosedur AmbilTanggal, kita tidak bisa secara langsung menempatkan variabel Bulan sebagai parameter bagi prosedur Readln. Oleh karena itu, kita membutuhkan variabel sementara. Dari variabel sementara ini kemudian kita isikan ke dalam variabel Bulan menggunakan type casting.

Pada prosedur JumlahHari, kita tidak bisa menggunakan:

for i:=Januari to Tgl.Bulan-1 do

karena 1 bukan bagian dari anggota tipe TNamaBulan. Sebagai gantinya kita menggunakan fungsi Pred yang berarti menggunakan nilai ordinal di bawah nilai yang diberikan kepada Pred tersebut. Fungsi yang bekerja kebalikan dari Pred, yaitu mendapatkan nilai ordinal dari nilai yang diberikan sebagai parameternya adalah fungsi Succ.Fungsi Pred dan Succ bisa diberikan kepada semua tipe data ordinal (semua tipe bilangan bulat dan karakter, string tidak termasuk ordinal karena string adalah untaian karakter, bukan karakter).

Program ini menunjukkan bahwa penggunaan record akan membuat program menjadi lebih manis. Di program ini Anda juga menemukan bahwa di dalam fungsi atau prosedur boleh berisi fungsi atau prosedur yang lain.

Apakah Anda menyukai post ini? Mengapa tidak memberikan komentar di bawah dan melanjutkan perbincangan, atau berlangganan my feed dan dapatkan artikel semacam ini yang dikirm secara otomatis feed reader Anda.
Harap diperhatikan bahwa komentar atau pertanyaan yang disampaikan haruslah sesuai dengan topik yang sedang dibahas. Komentar atau pertanyaan yang tidak sesuai dengan topik akan kami hapus :!:

Tinggalkan komentar

Sebelum membuat komentar, pastikan Anda telah membaca komentar-komentar sebelumnya. Jangan membuat pertanyaan yang telah ditanyakan. Perhatikan pula link-link dalam artikel. Lihatlah link tersebut sebelum membuat pertanyaan, karena mungkin penjelasan dari pertanyaan Anda telah di jawab dalam link tersebut.

Komentar yang tidak mengikuti aturan ini akan dihapus!

(wajib)

(wajib)


Time limit is exhausted. Please reload the CAPTCHA.