Seri Tutorial Bahasa C – Bagian 3: Menetapkan Nilai-nilai Konstanta

Bagian ini menunjukkan bagaimana membuat dan mengutilisasi nilai-nilai dan tipe-tipe konstanta dalam program-program C.


Mendeklarasikan Konstanta-konstanta Program

Ketika sebuah program perlu menggunakan sebuah nilai data tertentu yang tidak akan pernah berubah atau nilainya selalu tetap maka ia sebaiknya dideklarasikan dalam cara yang sama seperti halnya variabel namun dengan menyertakan kata kunci const. Sebagai contoh, sebuah konstanta mewakili nilai bilangan bulat (int) yang tidak berubah yaitu satu juta dapat dideklarasikan dan diinisialisasikan seperti berikut:

const int JUTA = 1000000 ;

Deklarasi konstanta harus selalu menginisialisasi obyek konstanta dengan nilai data yang mereka miliki. Program tidak pernah akan dapat mengubah nilai sebuah konstanta dari nilai awalnya. Ini menjaga nilai konstanta dari pengubahan secara tak sengaja karena compiler akan melaporkan sebuah kesalahan jika program mencoba untuk mengganti nilai inisialisasinya.

Nama konstanta memiliki aturan yang sama seperti konvensi penamaan variabel, namun merupakan sebuah tradisi untuk menggunakan karakter huruf kapital untuk penamaan konstanta — untuk mempermudah pembedaannya dengan nama-nama variabel ketika membaca kode sumber (source code).

Kata kunci const bisa juga digunakan dalam deklarasi sebuah larik apabila nilai anggotanya tidak pernah diubah oleh program.

  1. Mulailah sebuah program baru dengan sebuah instruksi prapemroses untuk mengikutsertakan fungsi pustaka masukan/keluaran standar.

    #include <stdio.h>
    
  2. Tambahkan sebuah fungsi main() yang mendeklarasikan sebuah nilai konstanta pendekatan nilai matematis untuk Pi.

    int main() {
        const float PI = 3.141593 ;
    }
  3. Selanjutnya dalam blok fungsi main(), masukkan pernyataan yang mendeklarasikan empat buah variabel.

    float vDiameter ;
    float varJejari ;
    float varKeliling ;
    float varLuas ;
    
  4. Sekarang masukkan pernyataan yang meminta masukan pengguna dengan menggunakan fungsi scanf() dan nantinya nilai masukan tersebut akan disematkan ke sebuah variabel (varDiameter).

    printf( "Masukkan diameter sebuah lingkaran dalam milimeter: " ) ;
    scanf( "%f", &varDiameter ) ;
    
  5. Kemudian tambahkan pernyataan-pernyataan untuk menghitung nilai tiga variabel lainnya menggunakan nilai konstanta dan masukan pengguna.

    varKeliling = PI * varDiameter ;
    varJejari = varDiameter / 2 ;
    varLuas = PI * ( varJejari * varJejari ) ;
  6. Sekarang masukkan pernyataan untuk mengeluarkan nilai-nilai yang dihitung dengan format dua desimal.

    printf( "\n\tKelilingnya adalah %.2f mm" , vKeliling ) ;
    printf( "\n\tDan luasnya adalah %.2f mm.persegi\n" , vLuas ) ;
    
  7. Pada akhir blok fungsi main() keluarkan sebuah nilai nol seperti yang disyaratkan oleh deklarasi fungsi.

    return 0 ;
    
  8. Simpanlah berkas program kemudian kompilasi dan eksekusi program, masukkan data ketika ada permintaan, untuk melihat keluaran perhitungan.

Nilai-nilai Konstanta Enumerasi

Kata kunci enum menyediakan cara yang berguna untuk membuat sebuah deret konstanta bilangan bulat dalam cara yang ringkas. Apabila diinginkan, pendeklarasian dapat mengikutsertakan sebuah nama untuk deret yang ingin dibuat setelah kata kunci enum. Nama-nama konstanta berupa sebuah daftar yang anggotanya dipisahkan oleh tanda koma dalam sebuah kurung kurawal.

Masing-masing konstanta akan secara bawaan memiliki sebuah nilai yang lebih besar daripada konstanta yang ada di dalam daftar. Terkecuali sudah ditentukan, konstanta pertama akan memiliki sebuah nilai nol, selanjutnya sebuah nilai 1, dan begitu seterusnya. Sebagai contoh, konstanta nama-nama hari dalam seminggu dapat dijabarkan dalam sebuah deret bilangan bulat yang dimulai dari nilai nol berupa enum {SENIN, SELASA, RABU, KAMIS, JUMAT} ; — dalam kasus ini konstanta RABU memiliki sebuah nilai bilangan bulat 2.

Konstanta-konstanta dapat disematkan sembarang nilai bilangan bulat dalam deklarasi namun konstanta selanjutnya di dalam daftar akan selalu nilainya bertambah satu, kecuali ia disematkan sebuah nilai. Sebagai contoh, untuk memulai deret yang nilai awalnya satu, sematkan nilai satu pada konstanta pertama berupa enum {SENIN=1, SELASA, RABU, KAMIS, JUMAT} ; — dalam kasus ini konstanta RABU memiliki nilai bilangan bulat 3.

Daftar konstanta bernilai juga dikenal sebagai sebuah “himpunan enumerasi” dan boleh jadi mengandung duplikat nilai-nilai konstanta. Sebagai contoh, nilai nol dapat disematkan ke konstanta bernama NIL dan NONE.

Dalam contoh berikut, himpunan enumerasi mewakili nilai peraihan skor dalam permainan bola biliar, dan mengikutsertakan sebuah nama opsional, yang muncul dalam bentuk huruf kapital seperti halnya konstanta.

  1. Mulailah sebuah program baru dengan sebuah instruksi prapemroses untuk mengikutsertakan fungsi-fungsi pustaka masukan/keluaran standar.

    #include <stdio.h>
    
  2. Tambahkan sebuah fungsi main() yang mendeklarasikan dan menginisialisasikan sebuah konstanta himpunan enumerasi yang berawal dari nilai 1.

    int main() {
        enum BOLA_BILIAR { MERAH=1, KUNING, HIJAU, COKLAT, BIRU, MERAH_MUDA, HITAM } ;
    }
    
  3. Selanjutnya dalam blok fungsi main(), deklarasikan sebuah variabel bilangan bulat untuk menyimpan hasil penjumlahan beberapa nilai konstanta.

    int varTotal ;
    
  4. Sekarang masukkan pernyataan untuk menampilkan nilai beberapa konstanta enumerasi.

    printf( "\nSaya memasukkan sebuah bola merah senilai %d\n" , MERAH ) ;
    printf( "Kemudian sebuah bola hitam senilai %d\n" , HITAM ) ;
    printf( "Diikuti dengan bola merah lain senilai %d\n" , MERAH ) ;
    printf( "Dan terakhir sebuah bola biru senilai %d\n" , BLUE ) ;
    
  5. Selanjutnya tambahkan sebuah pernyataan untuk menghitung penjumlahan total nilai-nilai konstanta yang ditampilkan pada langkah sebelumnya.

    varTotal = MERAH + HITAM + MERAH + BIRU ;
    
  6. Sekarang tambahkan sebuah pernyataan untuk mengeluarkan total perhitungan nilai-nilai yang ditampilkan.

    printf( "\nTotal skor saya %d\n" , varTotal ) ;
    
  7. Pada baris terakhir blok fungsi main() keluarkan sebuah nilai bilangan bulat nol seperti yang disyaratkan oleh deklarasi fungsi.

    return 0 ;
    
  8. Simpanlah berkas program kemudian kompilasi dan eksekusi program untuk melihat nilai-nilai konstanta terenumerasi dan total perhitungan dalam keluaran.

Membuat Tipe Sebuah Konstanta

Sekali sebuah deret enumerasi dideklarasikan maka ia dapat dianggap sebagai sebuah tipe data baru, dengan sifat-sifat nama-nama konstanta yang telah ditentukan dan nilai-nilanya yang bersesuaian.

Variabel bertipe data enum ini dapat dideklarasikan dalam cara yang sama seperti variabel-variabel dideklarasikan untuk jenis data lainnya — menggunakan sintaks berikut:

tipe-data nama-variabel ;

Contoh pada bagian sebelumnya, Anda membuat sebuah deret enumerasi bernama BOLA_BILIAR, yang dapat dianggap sebagai sebuah tipe data enum BOLA_BILIAR. Sehingga, sebuah variabel bernama “vPasangan” bertipe data tersebut bisa dibuat dengan deklarasi enum BOLA_BILIAR vPasangan ; dan dapat menyimpan nilai-nilai himpunan enumerasi yang terdefinisi oleh tipe tersebut.

Untuk secara eksplisit menyematkan sebuah nilai bilangan bulat ke sebuah variabel yang bertipe data enumerasi, standar C merekomendasikan bahwa sebuah cast digunakan untuk mengkonversi tipe data int menjadi tipe data enum, seperti berikut:

vPasangan = ( enum BOLA_BILIAR ) 7 ;

Dalam prakteknya, hal ini tidaklah dibutuhkan mengingat nilai-nilai enumerasi selalu berupa bilangan bulat sehingga ekuivalen dengan tipe data int.

Deklarasi sebuah enum bisa juga membuat sebuah variabel dengan menentukan sebuah nama variabel setelah kurung kurawal akhir. Sebagai contoh, deklarasi enum BOOLEAN { FALSE, TRUE } vTanda ; menjelaskan sebuah tipe data enum dan membuat sebuah variabel bernama “vTanda” dengan tipe data tersebut.

Tipe data tersuai (custom) dapat didefinisikan menggunakan kata kunci typedef dan sintaks berikut:

typedef definisi nama-tipe

Deklarasi tipe data tersuai dapat membantu membuat kode program lebih ringkas. Sebagai contoh, bila ada sebuah program menggunakan beberapa variabel unsigned short int, maka akan sangat berguna untuk pertama kali membuat sebuah tipe data tersuai dengan pengubah tersebut, deklarasinya sebagai berikut:

typedef unsigned short int USINT ;

Setiap deklarasi variabel unsigned short int selanjutnya bisa disederhanakan menggunakan nama tipe data tersuai USINT untuk menggantikan unsigned short int.

Mendefinisikan Konstanta

Direktif prapemroses #define dapat digunakan untuk menentukan nilai-nilai konstanta teks yang bisa digunakan dalam sebuah program dengan sintaks berikut:

#define NAMA-KONSTANTA "kalimat-teks"

Seperti direktif #include maka ia diletakkan di awal kode program. Kemunculan-kemunculan nama konstanta yang telah ditentukan dalam kode program akan digantikan untuk teks kalimat yang terasosiasi oleh prapemroses sebelum kompilasi.

Sebuah direktif prapemroses kondisional #ifdef bisa juga digunakan untuk mengevaluasi apakah sebuah definisi saat ini sudah ada. Bergantung pada hasil evaluasi, itu mungkin diikuti dengan sebuah direktif #define untuk menentukan sebuah nilai teks konstanta. Rutin prapemroses ini dikenal sebagai sebuah “macro” dan setiap macro harus diakhiri dengan direktif #endif

Definisi-definisi Debugging

Alternatif-alternatif alur program dapat diberikan melalui direktif prapemroses #if, #else dan #elif (else if). Kesemuanya mengijinkan pencabangan kondisional untuk mengeksekusi bagian-bagian kode berdasarkan hasil sebuah evaluasi.

Sebuah konstanta didefinisikan di awal oleh sebuah direktif prapemroses #define yang dapat juga tidak didefinisikan dengan menggunakan direktif #undef. Sebuah evaluasi juga bisa dibuat untuk menilai apakah sebuah konstanta tidak didefinisikan dengan menggunakan direktif prapemroses #ifndef (if not defined).

Semua evaluasi dapat dibuat di dalam sebuah blok fungsi, bercampur dengan pernyataan-pernyataan C biasa, dan bisa jadi bersarang di dalam yang lainnya. Macro-macro macam tersebut secara khusus berguna untuk men-debug kode-sumber sementara semua bagian kode dapat dengan mudah disembunyikan atau diungkapkan dengan mengubah status sebuah macro DEBUG.

  1. Mulailah sebuah program dengan sebuah instruksi prapemroses untuk mengikutsertakan fungsi-fungsi dalam pustaka masukan/keluaran standar.

    #include <stdio.h>	
    
  2. Tambahkan sebuah direktif prapemroses lebih lanjut untuk membuat sebuah macro.

    #define DEBUG 1
  3. Selanjutnya tambahkan sebuah fungsi main() yang berisi direktif prapemroses untuk mengevaluasi dan melaporkan status macro.

    #if DEBUG == 1
        printf( "Status debug adalah 1 \n" ) ;
    #elif DEBUG == 2
        printf( "Status debug adalah 2 \n" ) ;
    #else
        #ifdef DEBUG
            printf( "Debug sudah didefinisikan! \n" ) ;
        #endif
    
        #ifndef DEBUG
            printf( "Debug belum didefinisikan! \n" ) ;
        #endif
    #endif
  4. Pada bagian akhir blok fungsi main() keluarkan sebuah nilai bilangan bulat nol seperti yang disyaratkan dalam deklarasi fungsi.

    return 0 ;
  5. Simpanlah berkas program kemudian kompilasi dan eksekusi program untuk melihat laporan status macro.

    GAMBAR

  6. Ubahlah nilai macro kemudian simpan, kompilasi ulang, dan eksekusi kembali program untuk melihat laporan status macro yang baru.

    #define DEBUG 2
  7. Modifikasi sekali lagi nilai macro kemudian simpan, kompilasi ulang, dan eksekusi kembali program untuk melihat perubahan.

    #define DEBUG 3
  8. Masukkan direktif prapemroses lain pada awal blok fungsi kemudian simpan, kompilasi ulang, dan eksekusi kembali program untuk melihat laporan status macro.

    #undef DEBUG

Ringkasan

  • Sebuah nilai data tetap yang tidak akan pernah berubah dapat disimpan sebagai sebuah konstanta, dideklarasikan dengan kata-kunci const.
  • Ketika mendeklarasikan sebuah konstanta maka deklarasi tersebut selalu diinisialisasi dengan sebuah nilai data tetap.
  • Kata-kunci enum digunakan untuk membuat sebuah deret penomoran bilangan bulat yang berurut, dan secara bawaan dimulai dari nol.
  • Konstanta apa pun yang berada di dalam sebuah deret bernomor dapat secara eksplisit diberikan sebuah nilai bilangan bulat dan konstanta dalam deret tersebut nilainya akan meningkat secara berurut.
  • Sebuah deret konstanta bernomor dapat dianggap sebagai sebuah tipe data baru sehingga darinya variabel-variabel dapat dibuat untuk menyimpan nilai-nilai himpunan enumerasi yang didefinisikan oleh tipe tersebut.
  • Sebuah tipe data tersuai (custom) dapat didefinisikan menggunakan kata-kunci typedef. Variabel-variabel tipe tersebut dapat dibuat dengan menggunakan sintaks yang sama seperti yang digunakan untuk mendeklarasikan variabel-variabel biasa.
  • Sebuah direktif prapemroses #define dapat digunakan untuk menentukan sebuah nilai teks konstan yang nantinya disubstitusikan sebelum kompilasi.
  • Direktif prapemroses kondisional #ifdef mengevaluasi apakah sebuah definisi eksis atau tidak.
  • Sebuah macro merupakan sebuah rutin prapemroses yang harus diakhiri dengan sebuah direktif #endif.
  • Konstanta-konstanta yang didefinisikan oleh compiler seperti misalnya _WIN32 dan linux dapat digunakan untuk menentukan sistem operasi induk.
  • Alternatif-alternatif macro bisa diberikan melalui penggunaan direktif prapemroses #if, #else, dan #elif.
  • Definisi-definisi konstanta macro dapat tidak didefinisikan dengan menggunakan direktif #undef dan dievaluasi sebagai tidak terdefinisi dengan menggunakan direktif #ifndef.
  • Macro-macro bisa berguna untuk membantu men-debug kode-sumber secara mudah dengan menyembunyikan atau mengungkap bagian-bagian kode tertentu.

Daftar Pustaka

  1. Kernighan, Brian W. & Ritchie, Dennis M. (1988). The C Programming Language. New Jersey: Prentice Hall.
  2. Griffiths, David & Griffiths, Dawn (2012). Head First C. California: O’Reilly.
  3. McGarth, Mike (2012). C Programming: Grasp the Nuts and Bolts of Programming. Warwickshire: In Easy Steps Ltd.
  4. Stevanovic, Milan (2014). Advanced C and C++ Compiling: An Engineering Guide to Compiling, Linking, and Libraries using C and C++. California: Apress.
FacebooktwitterredditpinterestlinkedinmailFacebooktwitterredditpinterestlinkedinmail