Bagian ini menunjukkan bagaimana membuat dan memanfaatkan nilai-nilai dan tipe-tipe konstanta dalam program-program C.
- 3.1. Mendeklarasikan Konstanta-konstanta Program [ video ]
- 3.2. Enumerasi Nilai-nilai Konstanta [ video ]
- 3.3. Membuat Sebuah Tipe Konstanta [ video ]
- 3.4. Mendefinisikan Konstanta [ video ]
- 3.5. Definisi-definisi Debugging [ video ]
- 3.6. Ringkasan
Catatan:
- Silahkan Anda mengeklik icon menu untuk berpindah subbagian.
- Video pelengkap dalam tutorial ini akan lebih jelas dilihat dengan resolusi 720p dan mode Full screen.
3.1. 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 dengan cara yang sama seperti halnya variabel biasa 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 halnya aturan penamaan variabel. Para pemrogram memiliki tradisi tersendiri dalam penamaan sebuah konstanta yaitu semua karakternya ditulis menggunakan huruf kapital. Itu tiada lain bertujuan untuk mempermudah dalam mengenali dan membedakannya dengan nama-nama variabel saat membaca kode sumber (source code).
Kata kunci const
bisa juga digunakan dalam deklarasi sebuah larik apabila nilai anggotanya tidak pernah diubah oleh program.
-
Mulailah sebuah program baru dengan sebuah instruksi prapemroses untuk mengikutsertakan fungsi pustaka masukan/keluaran standar. Penulis memberi nama berkas program:
kode-1_bab-3.c
.#include <stdio.h>
-
Tambahkan sebuah fungsi
main()
yang mendeklarasikan sebuah nilai konstanta pendekatan nilai matematis untukPi
.int main() { const float PI = 3.141593 ; }
-
Selanjutnya dalam blok fungsi
main()
, masukkan pernyataan yang mendeklarasikan empat buah variabel.float v__diameter ; float v__jejari ; float v__keliling ; float v__luas ;
-
Sekarang masukkan pernyataan yang meminta masukan pengguna dengan menggunakan fungsi
scanf()
dan nantinya nilai masukan tersebut akan disematkan ke sebuah variabel (v__diameter
).printf( "Masukkan diameter sebuah lingkaran dalam satuan cm: " ) ; scanf( "%f", &v__diameter ) ;
-
Kemudian tambahkan pernyataan-pernyataan untuk menghitung nilai tiga variabel lainnya menggunakan nilai konstanta dan masukan pengguna.
v__keliling = PI * v__diameter ; v__jejari = v__diameter / 2 ; v__luas = PI * ( v__jejari * v__jejari ) ;
-
Sekarang masukkan pernyataan untuk mengeluarkan nilai-nilai yang dihitung dengan format dua desimal.
printf( "\nLingkaran berjejari %.2f cm memiliki:\n" , v__jejari ) ; printf( "-- keliling: %.2f cm\n" , v__keliling ) ; printf( "-- luas: %.2f cm persegi\n\n" , v__luas ) ;
-
Pada akhir blok fungsi
main()
keluarkan sebuah nilai nol seperti yang disyaratkan oleh deklarasi fungsi.return 0 ;
-
Simpanlah berkas program kemudian kompilasi dan eksekusi program, masukkan data ketika ada permintaan, untuk melihat keluaran perhitungan.
Secara keseluruhan, Anda dapat melihat langkah-langkah tersebut dalam Video 3.1 (silahkan Anda pilih mode Full screen dan resolusi 720p untuk tampilan video yang lebih jelas):
3.2. Enumerasi Nilai-nilai Konstanta
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, secara bawaan akan 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.
-
Mulailah sebuah program baru dengan sebuah instruksi prapemroses untuk mengikutsertakan fungsi-fungsi pustaka masukan/keluaran standar. Penulis memberi nama berkas program:
kode-2_bab-3.c
.#include <stdio.h>
-
Tambahkan sebuah fungsi
main()
yang mendeklarasikan dan menginisialisasikan sebuah konstanta himpunan enumerasi yang berawal dari nilai1
.int main() { enum BOLA_BILIAR { MERAH = 1, KUNING, HIJAU, COKELAT, BIRU, MERAH_MUDA, HITAM } ; }
-
Selanjutnya dalam blok fungsi
main()
, deklarasikan sebuah variabel bilangan bulat untuk menyimpan hasil penjumlahan beberapa nilai konstanta.int v__total_skor ;
-
Sekarang masukkan pernyataan untuk menampilkan nilai beberapa konstanta enumerasi.
printf( "\nSaya memasukkan sebuah bola merah bernilai %d\n" , MERAH ) ; printf( "kemudian sebuah bola hitam bernilai %d\n" , HITAM ) ; printf( "diikuti dengan bola merah lain bernilai %d\n" , MERAH ) ; printf( "dan terakhir sebuah bola biru bernilai %d\n" , BIRU ) ;
-
Selanjutnya tambahkan sebuah pernyataan untuk menghitung penjumlahan total nilai-nilai konstanta yang ditampilkan pada langkah sebelumnya.
v__total_skor = MERAH + HITAM + MERAH + BIRU ;
-
Sekarang tambahkan sebuah pernyataan untuk mengeluarkan total perhitungan nilai-nilai yang ditampilkan.
printf( "\nTotal skor saya %d\n" , v__total_skor ) ;
-
Pada baris terakhir blok fungsi
main()
keluarkan sebuah nilai bilangan bulat nol seperti yang disyaratkan oleh deklarasi fungsi.return 0 ;
-
Simpanlah berkas program kemudian kompilasi dan eksekusi program untuk melihat nilai-nilai konstanta terenumerasi dan total perhitungan dalam keluaran.
Secara keseluruhan, Anda dapat melihat langkah-langkah tersebut dalam Video 3.2 (silahkan Anda pilih mode Full screen dan resolusi 720p untuk tampilan video yang lebih jelas):
3.3. Membuat Sebuah Tipe Konstanta
Sekali sebuah deret enumerasi dideklarasikan maka ia dapat dianggap sebagai sebuah tipe data baru, dengan sifat-sifat nama konstanta yang telah ditentukan dan nilai-nilainya yang bersesuaian.
Variabel bertipe data enum
ini dapat dideklarasikan dengan 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 “v__pasangan
” bertipe data tersebut bisa dibuat dengan deklarasi enum BOLA_BILIAR v__pasangan ;
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:
v__pasangan = ( enum BOLA_BILIAR ) 7 ;
Dalam praktiknya, 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 } v__tanda ;
menjelaskan sebuah tipe data enum
dan membuat sebuah variabel bernama “v__tanda
” 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
.
-
Mulailah sebuah program baru dengan sebuah instruksi prapemroses untuk mengikutsertakan fungsi-fungsi pustaka masukan/keluaran standar. Penulis memberi nama berkas program:
kode-3_bab-3.c
.#include <stdio.h>
-
Tambahkan sebuah fungsi
main()
yang mendeklarasikan dan menginisialisasikan sebuah konstanta himpunan enumerasi yang berawal dari nilai1
.int main() { enum BOLA_BILIAR { HIJAU = 1, MERAH, KUNING, COKELAT, BIRU, MERAH_MUDA, HITAM } ; }
-
Selanjutnya dalam blok fungsi
main()
, deklarasikan dan inisialisasikan sebuah variabel tipeenum
, kemudian tampilkan nilai-nilainya.enum BOLA_BILIAR v__pasangan = HIJAU + HITAM ; printf( "Nilai pasangan: %d\n" , v__pasangan ) ;
-
Sekarang tambahkan sebuah pernyataan untuk membuat suatu tipe data tersuai
typedef unsigned short int USINT ;
-
Kemudian deklarasikan sebuah variabel tipe data tersuai dan tampilkan nilainya.
USINT v__nilai = 15 ; printf( "Nilai unsigned short int: %d\n" , v__nilai ) ;
-
Pada baris terakhir blok fungsi
main()
keluarkan sebuah nilai bilangan bulat nol seperti yang disyaratkan oleh deklarasi fungsi.return 0 ;
-
Simpanlah berkas program kemudian kompilasi dan eksekusi program untuk melihat nilai yang disematkan pada variabel tipe enumerasi dan tipe data tersuai.
Secara keseluruhan, Anda dapat melihat langkah-langkah tersebut dalam Video 3.3 (silahkan Anda pilih mode Full screen dan resolusi 720p untuk tampilan video yang lebih jelas):
3.4. 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
Sebuah pemroses macro dapat memeriksa konstanta-konstanta yang didefinisikan oleh compiler untuk menentukan jenis sistem operasi. Hal tersebut akan bervariasi dari mesin ke mesin namun pada platform Windows terdapat sebuah konstanta bernama _WIN32
dan pada linux terdapat sebuah konstanta linux
. Sebuah direktif prapemroses #ifdef
bisa menggunakan untaian kata yang bersesuaian untuk mengidentifikasi platform induk.
-
Mulailah sebuah program baru dengan sebuah instruksi prapemroses untuk mengikutsertakan fungsi-fungsi pustaka masukan/keluaran standar. Penulis memberi nama berkas program:
kode-4_bab-3.c
.#include <stdio.h>
-
Tambahkan tiga direktif prapemroses berupa untaian kata untuk keperluan substitusi dalam kode sumber.
#define GARIS "_________________________" #define JUDUL "PEMROGRAMAN BAHASA C" #define PENULIS "Dennis Ritchie"
-
Selanjutnya, tambahkan sebuah macro kondisional yang menentukan sebuah untaian kata untuk mengidentifikasi platform induk , yaitu Linux.
#ifdef linux #define SISTEM_OS "Linux" #endif
-
Sekarang tambahkan sebuah macro kondisional yang menentukan sebuah untaian kata untuk mengidentifikasi platform Windows.
#ifdef _WIN32 #define SISTEM_OS "Windows" #endif
-
Kemudian, tambahkan sebuah fungsi
main()
untuk mengeluarkan nilai untaian kata yang telah disubstitusi oleh prapemroses.int main() { printf( "\n \t %s \n\n \t %s \n" , GARIS , JUDUL ) ; printf( "\t Penulis: %s \n \t %s \n\n" , PENULIS , GARIS ) ; printf( "\t Sistem Operasi: %s \n\n" , SISTEM_OS ) ; }
-
Pada baris terakhir blok fungsi
main()
keluarkan sebuah nilai bilangan bulat nol seperti yang disyaratkan oleh deklarasi fungsi.return 0 ;
-
Simpanlah berkas program kemudian kompilasi dan eksekusi program untuk melihat nilai yang disematkan pada variabel tipe enumerasi dan tipe data tersuai.
Secara keseluruhan, Anda dapat melihat langkah-langkah tersebut dalam Video 3.4 (silahkan Anda pilih mode Full screen dan resolusi 720p untuk tampilan video yang lebih jelas):
3.5. Definisi-definisi Debugging
Alternatif-alternatif alur program dapat diberikan melalui direktif prapemroses #if
, #else
dan #elif
(else if). Kesemuanya mengizinkan 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 diungkap dengan mengubah status sebuah macro DEBUG.
-
Mulailah sebuah program dengan sebuah instruksi prapemroses untuk mengikutsertakan fungsi-fungsi dalam pustaka masukan/keluaran standar. Penulis memberi nama berkas program:
kode-5_bab-3.c
.#include <stdio.h>
-
Tambahkan sebuah direktif prapemroses lebih lanjut untuk membuat sebuah macro.
#define DEBUG 1
-
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
-
Pada bagian akhir blok fungsi
main()
keluarkan sebuah nilai bilangan bulat nol seperti yang disyaratkan dalam deklarasi fungsi.return 0 ;
-
Simpanlah berkas program kemudian kompilasi dan eksekusi program untuk melihat laporan status macro.
-
Ubahlah nilai macro kemudian simpan, kompilasi ulang, dan eksekusi kembali program untuk melihat laporan status macro yang baru.
#define DEBUG 2
-
Modifikasi sekali lagi nilai macro kemudian simpan, kompilasi ulang, dan eksekusi kembali program untuk melihat perubahan.
#define DEBUG 3
-
Masukkan direktif prapemroses lain pada awal blok fungsi kemudian simpan, kompilasi ulang, dan eksekusi kembali program untuk melihat laporan status macro.
#undef DEBUG
Secara keseluruhan, Anda dapat melihat langkah-langkah tersebut dalam Video 3.5 (silahkan Anda pilih mode Full screen dan resolusi 720p untuk tampilan video yang lebih jelas):
3.6. 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 ada atau tidak. - Sebuah macro merupakan sebuah rutin prapemroses yang harus diakhiri dengan sebuah direktif
#endif
. - Konstanta-konstanta yang didefinisikan oleh compiler seperti misalnya
_WIN32
danlinux
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 melakukan proses debug kode sumber secara mudah dengan menyembunyikan atau mengungkap bagian-bagian kode tertentu.
Daftar Pustaka
- Kernighan, Brian W. & Ritchie, Dennis M. (1988). The C Programming Language. New Jersey: Prentice Hall.
- Griffiths, David & Griffiths, Dawn (2012). Head First C. California: O’Reilly.
- McGarth, Mike (2012). C Programming: Grasp the Nuts and Bolts of Programming. Warwickshire: In Easy Steps Ltd.
- Stevanovic, Milan (2014). Advanced C and C++ Compiling: An Engineering Guide to Compiling, Linking, and Libraries using C and C++. California: Apress.