Tidak semua data di dalam program mengalami perubahan nilai. Data-data yang bisa dipastikan tidak akan mengalami perubahan nilai bisa kita sebut sebagai konstanta. Sebagai contoh, jika kita membuat perhitungan yang melibatkan lingkaran, maka kita membutuhkan data yang memang tidak akan berubah nilainya yaitu pi. Pi, dari dulu hingga nanti akan selalu sama yaitu 3,14.

Cara untuk membuat konstanta adalah seperti contoh-contoh berikut:

const 
  //konstanta umum
  HariKabisat=366;
  //konstanta bertipe
  BukanKabisat:integer=365;
  HariPertama:TNamaHari=Minggu;
  //konstanta array
  KonstArray:array[0..3]of integer=(0,1,2,3);
  //konstanta record
  TanggalPertama:TTanggal=
     (Tanggal:1;Bulan:Januari;Tahun:0);

HariLahir dengan Konstanta

Contoh penggunaan konstanta dalam program adalah sebagai berikut:

program HariLahir3;
{$APPTYPE CONSOLE}
type
  TNamaBulan=(Januari=1, Pebruari, Maret, April,
              Mei, Juni, Juli, Agustus, September,
              Oktober, Nopember, Desember);
  TTanggal=record
    Tanggal:integer;
    Bulan:TNamaBulan;
    Tahun:integer;
  end;
const
  Hari:array[0..6]of string=
        ('Minggu','Senin','Selasa','Rabu',
        'Kamis','Jumat','Sabtu');
  HariPertama=5;
  HariKabisat:array[Januari..Desember]of integer=
    (0,31,60,91,121,152,182,213,244,274,305,335);
  BukanKabisat:array[Januari..Desember]of integer=
    (0,31,59,90,120,151,181,212,243,273,304,334);
var
  TglLahir: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);
  end;

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

  function HariDalamTahun(Tgl:TTanggal):integer;
  begin
    if IsKabisat(Tgl.Tahun)then
      Result:=HariKabisat[Tgl.Bulan]else
      Result:=BukanKabisat[Tgl.Bulan];
    Result:=Result+Tgl.Tanggal;
  end;   

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

  procedure DisplayHari(H:integer);
  begin
    Writeln('Anda lahir hari ',Hari[H]);
  end;

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

Dengan menggunakan program sebelumnya, kita bisa menghitung bahwa tanggal 1 Januari tahun 0 jatuh pada hari Sabtu. Oleh karena itu sebenarnya kita tidak perlu menanyakan tanggal dan hari sekarang. Kita cukup menghitung hari pertama ditambah jumlah hari sampai tanggal lahir, kemudian diambil sisa baginya.

Hari Sabtu jika dihitung dari Minggu sebagai 0 adalah 6. Tetapi karena tanggal pertama bukan tanggal 0, melainkan tanggal 1, maka kita perlu mengurangi nilai untuk hari pertama menjadi 5. Saya tidak benar-benar tahu bahwa tanggal 1 Januari tahun 0 (apakah ada tahun 0? Saya juga tidak tahu) itu jatuh pada hari Sabtu. Saya tidak tahu apakah aturan tahun kabisat dan abad kabisat telah ditetapkan sejak tahun 0 atau tidak. Jika tidak, perhitungan program menjadi tidak tepat.

Dengan menggunakan konstanta Hari yang berisi nama-nama hari, pembuatan prosedur DisplayHari menjadi lebih sederhana. Demikian juga dalam menghitung jumlah hari dalam suatu tahun yang dilakukan tanpa perulangan karena kita menggunakan array konstanta yang langsung menentukan jumlah hari sampai bulan tertentu.

Time limit is exhausted. Please reload the CAPTCHA.

Beritahu saya melalui email jika ada balasan komentar di artikel ini. Anda juga dapat berlangganan tanpa harus memberi komentar.