Sunday, October 8, 2017

Kuliah 11 C++: Namespace dan Direktif


BAB 11.
Namespace dan Direktif Praprosesor






11.1 Pengantar
Konsep namespace merupakan fitur penting pada C++. Kebutuhan fitur ini dirasakan setelah tahun 1990 ketika C++ telah cukup populer dan sejumlah organisasi mulai menawarkan program-program yang dapat didaur-ulang. Telah diduga akan terjadi permasalahan benturan atau tubrukan nama ketika satu program dibeli dari satu vendor dan program lain dibeli dari vendor lain. Benturan nama terjadi ketika nama sama dipakai untuk variabel yang berbeda. Permasalahan yang sama juga bisa terjadi ketika sejumlah programer terlibat dalam pengembangan program besar. Pada kasus itu, adalah sangat mungkin bahwa nama sama akan dipakai untuk variabel, konstanta, atau fungsi yang berbeda. Solusi dari permasalahan ini adalah: (i) mengubah nama-nama sama tersebut atau (ii) menyekat nama-nama di dalam namespace-namespace yang berbeda. Opsi pertama merupakan pekerjaan yang melelahkan. Opsi kedua melibatkan penempatan nama-nama di dalam namespace-namespace yang berbeda. Konsep namespace diintroduksi di dalam C++ pada tahun 1995.

Untuk mengilustrasikan konsep ini, dimisalkan bahwa terdapat beberapa keranjang buah yang memuat nama-nama buah yang sama. Katakanlah, semua keranjang buah memuat buah apel. Jika Anda mengatakan apel, itu berarti bisa mengacu pada apel yang dimuat di keranjang mana saja. Namun, jika Anda menomori atau memberikan nama pada tiap keranjang, katakanlah, keranjang1, keranjang2, keranjang3, dan seterusnya, maka Anda dapat lebih mudah membedakan apel-apel yang ada di keranjang1 dari apel-apel yang ada di keranjang3, dan seterusnya. Dalam C++, kode yang diperlukan adalah:

keranjang1 :: apel; //ini mengacu ke apel-epel di dalam keranjang1
keranjang1 :: apel; //ini mengacu ke apel-epel di dalam keranjang3

Pada dua atau lebih subprogram, jika apel adalah nama sama untuk variabel-variabel yang berbeda dan keranjang1, keranjang2, dan keranjang3 adalah nama-nama dari namespace yang dideklarasikan di dalam program, maka setiap variabel yang berbeda itu (meski memiliki nama sama) dapat dengan mudah diidentifikasi dengan bantuan operator resolusi skop dan pengenal (nama) namespace.



11.2 Aplikasi Namespace
Anda pertama-tama perlu mendeklarasikan namespace pada skop file untuk sebuah program atau subprogram. Ini sama dengan memberikan nama untuk tiap keranjang, seperti yang telah didiskusikan sebelumnya. Namespace dapat dideklarasikan sebagai berikut:

namespace NS1 {deklarasi_variabel;}

Kata pertama adalah katakunci namespace, yang diikuti dengan pengenal NS1, yang kemudian diikuti oleh kurung kurawal {} dimana di dalamnya nama dari sejumlah variabel dideklarasikan. Untuk memanggil variabel di dalam program, Anda perlu menggunakan operator resolusi skop seperti yang telah diberikan pada kasus apel dan keranjang.

Program berikut mengilustrasikan konsep ini. Anda mendeklarasikan beberapa variabel di dalam namespace S1. Nama-nama sama akan dipakai untuk variabel-variabel yang berbeda di dalam namespace lain, S2. Kompiler dapat mengidentifikasi nama-nama mana yang ada di dalam namespace tertentu. Kapanpun Anda menggunakan variabel tertentu, Anda perlu lebih dahulu menuliskan pengenal namespace yang diikuti dengan operator resolusi skop (::) dan kemudian nama variabel.

Program 11.1 Mengilustrasikan aplikasi dari namespace

#include <iostream>
using namespace std;

namespace S1  // name namespace S1
{
   int a = 8;        //variabel int yang didefinisikan di dalam namespace S1.
   char ch = 'X';
   double b = 10.5;  //variabel double yang didefinisikan di dalam namespace S1.
   char E[] = "John";
}

namespace S2
{
   double a = 5.4;         //'a' sekarang double di dalam namespace S2
   char ch = 'Y';          //ch sekarang 'Y' di dalam namespace S2
   int E = 5;              //E sekarang int, sebelumnya string di dalam namespace S1
   char b[] = "Kristof";   //b sekarang string, sebelumnya double di dalam namespace S1
}

void main ()
{
   double A = S1::a * S2::a;      //resolusi skopr mengidentifikasi
                           //apakah a milik dari S1 atau S2
   double B = S1:: b + S2::E ;

   cout<<"A = "<<A<<", "<<"B = "<<B<< endl;
   cout<<S1::ch<<", "<<S2::ch<<endl;
   cout<<S1::E<<" "<<S2::b<< endl;
}
KELUARAN
A = 43.2, B = 15.5
X, Y
John Kristof

Anda telah sering menggunakan deklarasi using namespace std; untuk menyederhanakan penulisan std::cout menjadi hanya cout, dan lain sebagainya. File-file header dan fungsi-fungsi dituliskan di dalam namespace std.



11.3 Direktif using dan using namespace
Pada program sebelumnya, Anda telah menggunakan operator resolusi skop (::) yang diawali dengan pengenal namespace untuk mengakses variabel yang diinginkan. Ini bisa juga dilakukan dengan menggunakan katakunci using yang diikuti dengan pengenal namespace dan operator resolusi skop untuk mengakses variabel atau fungsi. Jika beberapa nama yang dideklarasikan di dalam suatu namespace akan digunakan pada bagian tertentu di dalam program, Anda bisa menggunakan direktif berikut:

using namespace pengenal_namespace;

Program berikut mengilustrasikan hal tersebut.

Program 11.2 Mengilustrasikan aplikasi dari penggunaan direktif using

#include <iostream>
using namespace std;

namespace boneka     //boneka adalah pengenal untuk namespace
{
   int a = 8;
   char E[] = "John";
}

namespace bola             //bola adalah pengenal untuk namespace
{
   double b = 4.5;
   char E[] = "Pergi ke sekolah!";
}

void main ()
{
   using namespace boneka; //aplikasi dari direktif using
   cout<<a*a<< endl;       //sekarang operasi resolusi skop tidak diperlukan
                           //untuk variabel-variabel dari namespace boneka, tetapi
                           //diperlukan untuk variabel-variabel dari namespace bola

   cout<<E<<" "<<bola::E<<endl;
   //menggunakan operator resolusi skop untuk E
}
KELUARAN
64
John Pergi ke sekolah!


Program berikut mengilustrasikan aplikasi dari katakunci using untuk nama dari satu variabel.

Program 11.3 Mengilustrasikan aplikasi dari penggunaan katakunci using

#include <iostream>
using namespace std;

namespace NS1
{
   int n = 3;
   float m = 2.5;
}

namespace NS2
{
   float n = 4.0;
   int m = 2;
}

namespace NS1
{
   int k = 2;
   double R = n*m*k;
}

namespace NS2
{
   double k = 3.0 ;
   double R = n*m*k;
}

int main()
{
   using NS1::R;     //aplikasi dari using
   cout<<"R dari NS1 = "<<R<<endl;

   using NS1::k;     //aplikasi dari using
   cout<<"k dari NS1 = "<<k<< endl;
   cout<<"m dari NS2 = "<<NS2::m<< endl;

   using NS1::m;     //aplikasi dari using
   cout<<"m dari NS1 = "<<m<<endl;
   cout<<"R dari NS2 = "<<NS2::R<< endl;

   return 0 ;
}
KELUARAN
R dari NS1 = 15
k dari NS1 = 2
m dari NS2 = 2
m dari NS1 = 2.5
R dari NS2 = 24



11.4 Nama Alias dari Namespace
Nama alias (samaran atau pengganti) untuk pengenal namespace dapat digunakan kapanpun hal itu diperlukan. Dengan nama yang lebih pendek, ada kemungkinan terjadi benturan penamaan. Jadi, adalah lebih baik untuk memilih nama panjang untuk pengenal namespace dan kemudian mendeklarasikan nama pendek sebagai nama aliasnya. Ini diilustrasikan pada program berikut.

Program 11.4 Mengilustrasikan  penggunaan alias untuk namespace

#include <iostream>
using namespace std;

namespace namespace_programKu
{
   int n = 3;
   float m = 2.5;
   int k = 2;
   double R = n*m*k;
}

namespace namespaceKu
{
   float n = 4.0;
   int m = 2 ;
   double k = 3.0 ;
   double R = n*m*k;
}

int main()
{
   namespace NS1= namespace_programKu ;
   //NS1 adalah alias untuk namespace_programKu

   namespace NS2 = namespaceKu ; // NS2 adalah alias untuk namespaceKu

   cout<<"R di dalam namespace_programKu = "<<NS1::R<<", \tn di dalam NS1 = "<<NS1::n<<endl;
   cout<<"R di dalam namespaceKu = "<<NS2::R<<", \tn di dalam NS2 = "<<NS2::n <<endl;
   cout<<"m di dalam namespace_programKu = "<<NS1::m<<", \tm di dalam NS2 = "<<NS2::m<<endl;

   return 0 ;
}
KELUARAN
R di dalam namespace_programKu = 15,    n di dalam NS1 = 3
R di dalam namespaceKu = 24,    n di dalam NS2 = 4
m di dalam namespace_programKu = 2.5,   m di dalam NS2 = 2


Program berikut juga contoh lain dari alias untuk namespace.

Program 11.5 Mengilustrasikan  penggunaan lain dari alias untuk namespace

#include <iostream>
using namespace std;

namespace NS1
{
   int n = 3;
   float m = 2.5;
}

namespace NS2
{
   float n = 4.0;
   int m = 2 ;
}

namespace NS1
{
   int k = 2;
   double R = n*m*k;
}

namespace NS2
{
   double k = 3.0;
   double R = n*m*k;
}

namespace ruangKu = NS1;
namespace Ruang = NS2;

int main()
{
   cout<<"R dari ruangKu = "<<ruangKu:: R<<endl;
   cout<<"k dari ruangKu = "<<ruangKu::k<<endl;

   cout<<"k dari namespace NS2 = "<<NS2::k<<endl;
   cout<<"m dari Ruang = "<<Ruang::m<<endl;

   cout<<"m dari ruangKu = "<<ruangKu::m<<endl;
   cout<<"R dari Ruang = "<<Ruang::R<<endl;

   return 0 ;
}
KELUARAN
R dari ruangKu = 15
k dari ruangKu = 2
k dari namespace NS2 = 3
m dari Ruang = 2
m dari ruangKu = 2.5
R dari Ruang = 24



11.5 Perluasan Namespace
Namespace dapat diperluas atau dikembangkan di bagian-bagian tertentu di dalam program yang sama atau di dalam beberapa file yang berbeda. Program berikut merupakan ilustrasi dari perluasan atau pengembangan namespace di dalam program yang sama.

Program 11.6 Mengilustrasikan  pengembangan atau perluasan namespace

#include <iostream>
using namespace std;

namespace NS1
{
   int n = 3;
   float m = 2.5;
}

namespace NS2
{
   float n = 4.0;
   int m = 2 ;
}

namespace NS1 //menggunakan NS1 kembali
{
   int k = 2;
   double R = n*m*k;
}

namespace NS2 //menggunakan NS2 kembali
{
   double k = 3.0 ;
   double R = n*m*k;
}

int main()
{
   cout<<"R dari NS1 = "<<NS1:: R<<endl;
   cout<<"k dari NS1 = "<<NS1::k<< endl;

   cout<<"m dari NS2 = "<<NS2::m<< endl;
   cout<<"m dari NS1 = "<< NS1 ::m<<endl;

   cout<<"R dari NS2 = "<<NS2::R<<endl;

   return 0 ;
}
KELUARAN
R dari NS1 = 15
k dari NS1 = 2
m dari NS2 = 2
m dari NS1 = 2.5
R dari NS2 = 24



11.6 Namespace Bersarang
Namespace bisa bersarang di dalam namespace lain. Sebagai contoh, berikut adalah ilustrasi dari namespace bersarang:

namespace NS1
{
   namespace NS2 //namespace NS2 dideklarasikan di dalam NS1
   {
      int x = 2;
   }
}

Dengan deklarasi tersebut, variabel x diakses dengan:

NS1::NS2::x;

Program berikut mengilustrasikan namespace bersarang.

Program 11.7 Mengilustrasikan  namespace bersarang

#include <iostream>
using namespace std;

namespace NS1
{
   int n = 3;
   float m = 2.5;

   namespace NS2 // NS2 dideklarasikan di dalam NS1
   {
      float n = 4.0;
      int m = 2;
   }
}

namespace NS3
{
   int k = 2;
   double R = NS1::NS2::n * NS1::m * NS3::k;    //menggunakan variabel-variabel dari
                                            //namespace-namespace berbeda
   namespace NS4 //NS4 dideklarasikan di dalam NS3
   {
      double k = 3.0;
   }
}

int main()
{
   cout<<"R dari NS1 = "<<NS3::R<<endl;
   cout<<"k dari NS4 = "<<NS3::NS4::k<<endl;

   cout<<"m dari NS2 = "<<NS1::NS2::m<<endl;
   cout<<"m dari NS1 = "<<NS1::m<<endl;

   return 0 ;
}
KELUARAN
R dari NS1 = 20
k dari NS4 = 3
m dari NS2 = 2
m dari NS1 = 2.5



11.7 namespace std
Sejumlah file header dan nama di dalam C++ sekarang dideklarasikan di bawah namespace std. Seperti didiskusikan sebelumnya, namespace, secara umum, dapat dimodifikasi dengan deklarasi-deklarasi dan definisi-definisi tambahan, namun, ini tidak berlaku untuk namespace std. Anda perlu mengingat bahwa namespace std tidak dapat dimodifikasi. Sesuai dengan konvensi, file header ditulis dengan ekstensi (.h) seperti <iostream.h>. Sekarang, di bawah namespace std, file header yang sama ditulis dengan <iostream>, namun Anda perlu mencantumkan using namespace std; di dalam program di atas main().

File header standar C yang sebelumnya dituliskan dengan ekstensi (.h) seperti <xxxx.h> sekarang ditulis dengan <cxxxx> di bawah namespace std. Ekstensi h diabaikan dan c ditambahkan di depan nama header file. Sebagai contoh, nama <assert.h> sekarang dituliskan sebagai <cassert>. Kompiler mendukung kedua konvensi ini. Contoh-contoh lain diberikan berikut ini.

TABEL 11.1 Sejumlah file header yang perlu Anda ketahui
Nama sebelumnya
Nama di bawah namespace std
Sejumlah file header C++
<algorithm.h>
<algorithm>
<bitset.h>
<bitset>
<iomanip.h>
<iomanip>
<set.h>
<set>
Sejumlah file header ANSI C
<assert.h>
<cassert>
<float.h>
<cfloat>
<limits.h>
<climit>
<math.h>
<cmath>
<stdio.h>
<cstdio>
<stdlib.h>
<cstdlib>
<time.h>
<ctime>



11.8 Direktif Praprosesor
Ada sejumlah direktif praprosesor yang diwarisi C++ dari C. Direktif ini dapat dipakai untuk mendefinisikan konstanta simbolis, makro, dan direktif kondisional. Anda telah mengetahui #include dan #define. Sejumlah direktif praprosesor diberikan pada Tabel 11.2. Semua direktif praprosesor diawali dengan simbol #.

TABEL 11.2 Sejumlah direktif praprosesor
Direktif praprosesor
Penjelasan
#
direktif null.
#define
Dipakai untuk mendefinisikan konstanta simbolis atau makro.
##
Dipakai dengan #define, untuk menggabungkan dua item.
#error
Menghentikan kompilasi dan menampilkan pesan error.
#include
Mencantumkan nama file di dalam kurung siku <> atau di dalam kutip ganda “” pada kode sumber. Anda telah menggunakan direktif ini di semua program.
#line
Dipakai untuk menetapkan nomor baris pada sebuah file. Dikode sebaga
#line nomor_baris<“nama_file”>.
#pragma
Direktif sepesifik untuk implementasi.
#undef
Menggagalkan apa yang sebelumnya didefinisikan.

DIREKTIF #define
Direktif praprosesor #define dipakai untuk menciptakan makro dan konstanta simbolis. Penggunaan direktif #define diilustrasikan sebagai berikut:

#define Pi 3.14159

Perhatikan bahwa tidak ada semikolon (titik-koma) di akhir baris dan terdapat satu spasi antara define dan Pi dan antara Pi dan nilai 3.14159. Di dalam program yang menggunakan kode tersebut, di mana pun Pi digunakan, nilai 3.14159 akan disubstitusi. Pada dasarnya, deklarasi tersebut ekivalen dengan statemen berikut:

const double Pi = 3.14159 ;

Makro dapat pula diciptakan dengan #define. Sebagai contoh, lihat kode berikut:





Pada deklarasi tersebut, direktif #define menciptakan sebuah makro, yaitu sebuah fungsi untuk mendapatkan nilai maks dari dua nilai. Nilai-nilai dapat berupa nilai integar atau nilai titik-mengambang, atau karakter. Tidak ada pemeriksaan tipe. Perhatikan bahwa pada definisi tidak ada spasi antara maks dan kurung kiri ‘(‘. Hal ini diilustrasikan pada program berikut.

Program 11.8 Mengilustrasikan  diretif praprosesor #define

#include<iostream>
using namespace std;

#define maks(x,y) (x >y ? x : y)         //definisi makro

int main()
{
   float x,y;
   char ch, kh;
   int A, B;

   cout<<"Masukkan dua nilai integer: "; cin>>A>>B;
   cout<<"Masukkan dua nilai titik mengambang: "; cin>>x>>y;
   cout<<"Masukkan dua karakter: "; cin>>ch>>kh;

   cout<<"Terbesar dari dua int = "<<maks(A, B)<< endl;
   cout<<"Terbesar dari dua float = "<<maks(x, y)<<endl;
   cout<<"Terbesar dari dua char = "<<maks(ch, kh)<<endl;

   return 0;
}
KELUARAN
Masukkan dua nilai integer: 35 65
Masukkan dua nilai titik mengambang: 45.65 54.66
Masukkan dua karakter: v f
Terbesar dari dua int = 65
Terbesar dari dua float = 54.66
Terbesar dari dua char = v


Program berikut merupakan ilustrasi lain dari pendefinisian makro dengan praprosesor #define. Perhatikan bahwa keduanya, panjang dan lebar, diapit di dalam kurung. Hal ini untuk mengeliminasi error yang mungkin terjadi, misalnya, panjang = 2 + 3 dan lebar = 2 + 2, dimana pada kasus itu akan dihitung sebagai 2 + 3 * 2 + 2 = 10, bukan 20. Ini karena operator * memiliki keutamaan lebih tinggi dari +.

Program 11.9 Mengilustrasikan  definisi fungsi lain dengan #define

#include<iostream>
using namespace std;

#define luas ((panjang)*(lebar))
// the macro defines area of a rectangle.

int main()
{
   int panjang, lebar;

   cout<<"Tuliskan panjang dan lebar dari sebuah persegi-panjang: ";
   cin>>lebar>>panjang;

   cout<<"Luas = "<<luas<<endl;

   return 0;
}
KELUARAN
Tuliskan panjang dan lebar dari sebuah persegi-panjang: 23 56
Luas = 1288



OPERATOR # dan ##
Sebuah # pada satu baris akan diabaikan oleh kompiler. Jadi,

#

tidak memiliki konsekuensi apapun. Ketika digunakan dengan suatu variabel seperti #x di dalam sebuah statemen #define, operator # akan menjadi token pengganti, yaitu ia mengganti nilai di manapun x muncul di dalam program. Penggantian dikonversi menjadi sebuah string dengan kutip ganda. Sebagai contoh, lihat kode berikut:

#define F(x) cout<<“Selamat Pagi” #x

Ketika fungsi F(x) dipanggil dengan F(Pak), kode tersebut akan ekivalen dengan statemen berikut:

cout<<“Selamat Pagi Pak”;

Operator praprosesor ## dipakai dengan #define untuk menyambung dua token. Sebagai contoh, kode berikut:

#define sambung(m, n) m ## n

akan menghasilkan keluaran mn. Lihat program berikut untuk ilustrasi.


Program 11.10 Mengilustrasikan  penggunaan praprosesor operator ##

#include<iostream>
using namespace std;

#define Fungsi(y) cout<<"Selamat Pagi" #y<<endl;
#define SAMBUNG(a, b) a ## b

void main()
{
   Fungsi(Pak!);

   cout<<SAMBUNG(5, 7)<<endl;
   cout<<SAMBUNG("O", "K")<<endl;
   cout<<SAMBUNG("Selamat", " Pagi Kristof!")<<endl;
}
KELUARAN
Selamat PagiPak!
57
OK
Selamat Pagi Kristof!


DIREKTIF #undef
Praprosesor #undef dipakai untuk membuang atau menggagalkan konstanta simbolis dan makro yang diciptakan oleh #define. Jadi, skop dari makro dan konstanta simbolis diawali dari titik definisi sampai titik di mana ia digagalkan oleh #undef atau sampai akhir dari file bila #undef tidak diberikan. Tidak ada pembatasan pada pendefinisian-ulang makro atau konstanta yang sama oleh #define. Hal ini diilustrasikan oleh program berikut.

Program 11.11 Mengilustrasikan  penggunaan #define dan #undef

#include<iostream>
#define Panjang 40   //Pendefinisian pertama harus sebelum main()
using namespace std;

int main()
{
   cout<<"Panjang awal = "<<Panjang<<endl;
   #undef Panjang

   #define Panjang 60
   cout<<"Panjang baru = "<<Panjang<<endl;

   return 0;
}
KELUARAN
Panjang awal = 40
Panjang baru = 60



11.9 Direktif Praprosesor Kondisional
Direktif-direktif praprosesor kondisional disediakan untuk mengendalikan aksi dari praprosesor dan untuk mengendalikan kompilasi program. Hal ini dicantumkan pada Tabel 11.3 dengan penjelasan untuk tiap kasus. Perhatikan bahwa jika #if digunakan, maka ia harus diakhiri dengan #endif. Program 11.11 mengilustrasikan aplikasi dari beberapa direktif kondisional ini.

TABEL 11.3 Direktif-direktif praprosesor kondisional
Direktif praprosesor
Penjelasan
#if
Direktif kondisional if, yang harus diakhir dengan #endif
#elif
direktif kondisional else if
#endif
akhir dari if
#else
else
#ifdef
jika didefinisikan
#ifndef
jika tidak didefinisikan

Program 11.12 Mengilustrasikan  penggunaan #if, #elif, #define, dan #undef

#include<iostream>
using namespace std;

#define lebar 40
   #define luas (panjang*lebar)
#if 0
   #if panjang > 2*lebar
   #undef lebar                   //membuang definisi sebelumnya dari lebar
   #define lebar panjang/2
#elif panjang < lebar      //sama dengan else if
#endif
#undef lebar
#define lebar panjang/4 //pendefinisian-ulang. Tidak ada semikolon di akhir
#endif

int main()
{
   int panjang ;

   cout<<"Tuliskan panjang dari sebuah persegi-panjang: ";
   cin>>panjang;

   cout<<"panjang = "<<panjang<<"\t lebar = "<<lebar<<endl;
   cout<<"luas = "<<luas<<endl;

   return 0;
}
KELUARAN
Tuliskan panjang dari sebuah persegi-panjang: 100
panjang = 100    lebar = 40
luas = 4000

Program 11.13 Mengilustrasikan  penggunaan #error, #if, #endif, dan #else

#include<iostream>
using namespace std;

#define luas (panjang*lebar)
#define panjang 10
#if (panjang>50)
   #error 1- Tidak sesuai dengan rencana
#else
#endif

int main()
{
   int lebar;

   cout<<"Tuliskan lebar dari persegi-panjang: ";
   cin>>lebar;

   cout<<"luas= "<<lebar*panjang<<endl;

   return 0;
}
KELUARAN
Tuliskan lebar dari persegi-panjang: 25
luas= 250

Jika ditetapkan panjang = 100
#error :  1- Tidak sesuai dengan rencana


FUNGSI assert()
Fungsi assert() didefinisikan di dalam file header <cassert>, yang dipakai untuk menguji sebuah nilai. Sebagai contoh,

assert(k>0);

Dengan statemen semacam itu, jika k bernilai 0 atau kurang dari 0, maka program akan diaborsi atau dibatalkan dan pesan error akan mengidentifikasi baris mana di dalamnya error terjadi. Ini diilustrasikan pada program berikut.

Program 11.14 Mengilustrasikan  penggunaan  dari fungsi assert()

#include<iostream>
#include<cassert>
using namespace std;

void main()
{
   int A, B;
   cout<<"Masukkan dua integer: ";
   cin>>A>>B;

   assert(B>0);

   double C = A/B;

   cout <<"C = "<<C<<endl;
}
KELUARAN
Masukkan dua integer: 5 0
Assertion failed: B>0, file E:\Program\program11.14.cpp, line 11



11.10 Makro Pustaka
Ada enam makro pustaka di dalam C++, yang diberikan pada Tabel 11.4. Tabel itu juga menjelaskan keluaran dari tiap makro. Program 11.15 mengilustrasikan aplikasi dari beberapa makro pustaka.

TABEL 11.4 Sejumlah makro pustaka di dalam C++
Nama makro
Penjelasan
_cplusplus
Program c++
_DATE
Tanggal (mmm dd yyyy)
mmm = tiga karakter untuk nama, contoh Oct.
_FILE_
Nama file dari kode sumber.
_LINE_
Nomor baris.
_STDC_
ANSI.
_TIME_
Waktu kompilasi ( hh: mm : ss).

Program 11.15 Mengilustrasikan  penggunaan  sejumlah makro pustaka

#include <iostream>
using namespace std;

int main()
{
   int jum = 0;

   for (int i = 0 ; i<6; i++)
      jum +=i;

   cout<<"jum = "<<jum<<endl;

   cout<<"Nomor baris = "<<__LINE__ <<endl;

   cout<<"Tanggal penulisan program: "<<__DATE__<<endl;
   cout<<"Waktu kompilasi: "<<__TIME__<< endl;

   cout<<"Nama file = "<< __FILE__<<endl;
   cout<<"Nilai dari cplusplus "<<__cplusplus<<endl;

   return 0;
}
KELUARAN
jum = 15
Nomor baris = 13
Tanggal penulisan program: Jul  2 2015
Waktu kompilasi: 17:30:23
Nama file = E:\Program\program11.15.cpp
Nilai dari cplusplus 1



LATIHAN
1.       Apa itu makro?
2.       Bagaimana Anda mendefinisikan makro dan membatalkan definisi makro tersebut?
3.       Apa itu konstanta simbolis?
4.       Apa yang dilakukan fungsi assert()? Tuliskan sebuah program untuk mengilustrasikan penggunaannya.
5.       Definisikan sebuah makro untuk mencari nilai terbesar dari dua nilai.
6.       Definisikan sebuah makro untuk mencari nilai terbesar dari tiga nilai yang dimasukkan oleh user.
7.       Definisikan sebuah makro untuk menentukan luas segitiga dimana ketiga sisi dari segitiga disediakan oleh user.






No comments: