TEMPLATE
Soal & Penyelesaian
1.
Tulislah sebuah template fungsi sederhana untuk
membandingkan dua nilai.
Penyelesaian:
1
2
3
4
5
6
7
|
// maks.cpp
template <typename T>
inline T const& maks
(T const& a, T const& b)
{
// jika a < b maka gunakan b
sebaliknya gunakan a
return
a<b?b:a;
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
#include <iostream>
#include <string>
#include <conio.h>
#include "maks.cpp"
int main()
{
int
i = 42;
std::cout << "maks(7,i): " <<
::maks(7,i) << std::endl;
double
f1 = 3.4;
double
f2 = -6.7;
std::cout << "maks(f1,f2): " <<
::maks(f1,f2) << std::endl;
std::string s1 = "matematika";
std::string s2 = "martina";
std::cout << "maks(s1,s2): " <<
::maks(s1,s2) << std::endl;
getch();
}
|
maks(7,i): 42
maks(f1,f2): 3.4
maks(s1,s2): matematika
2.
Tulislah sebuah program C++ untuk mengilustrasikan
penggunaan overload dari fungsi template.
Penyelesaian:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
#include <conio.h>
#include <iostream>
#include <string>
// templateOverload.cpp
// maksimum dari dua nilai
int
inline int const& maks (int const& a, int const& b)
{
return
a<b?b:a;
}
//maksimum dari dua nilai
sembarang tipe
template <typename T>
inline T const&
maks (T const& a, T const& b)
{
return
a<b?b:a;
}
// maksimum dari tiga
nilai sembarang tipe
template <typename T>
inline T const&
maks (T const& a, T const& b, T const& c)
{
return
maks (maks(a,b), c);
}
int main()
{
// memanggil template untuk tiga argumen
std::cout << "maks(7, 42, 68): " <<
::maks(7, 42, 68)<< std::endl;
// memanggil maks<double>
std::cout << "maks(7.0, 42.0): " <<
::maks(7.0, 42.0)<< std::endl;
// memanggil maks<char>
std::cout << "maks('a', 'b'): " <<
::maks('a', 'b')<< std::endl;
// memanggil fungsi tak-template
std::cout << "maks(7, 42): " <<
::maks(7, 42)<< std::endl;
// memanggil maks<int>
std::cout << "maks<>(7, 42): " <<
::maks<>(7, 42)<< std::endl;
// memanggil maks<double>
std::cout << "maks<double>(7, 42): "
<< ::maks<double>(7, 42)<< std::endl;
// memanggil fungsi tak-template untuk
dua int
std::cout << "maks('a', 42.7): " <<
::maks('a', 42.7)<< std::endl;
getch();
}
|
maks(7, 42, 68): 68
maks(7.0, 42.0): 42
maks('a', 'b'): b
maks(7, 42): 42
maks<>(7, 42): 42
maks<double>(7, 42): 42
maks('a', 42.7): 97
3.
Tulislah sebuah program C++ untuk mengoverload fungsi
template maksimum untuk pointer dan string-C.
Penyelesaian:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
// templatePointer.cpp
#include
<iostream>
#include
<cstring>
#include
<string>
#include
<conio.h>
// maksimum dari dua nilai sembarang tipe
template <typename T>
inline T const& maks (T const&
a, T const& b)
{
return a < b ? b : a;
}
// maksimum dari dua pointer
template <typename T>
inline T* const& maks (T* const&
a, T* const& b)
{
return *a < *b ? b : a;
}
//maksimum dari dua string-C
inline char const* const& maks (char const* const& a, char const* const&
b)
{
return std::strcmp(a,b) < 0 ? b :
a;
}
int main ()
{
int a=7;
int b=42;
// maks() untuk
dua nilai bertipe int
std::cout
<< "maks(a,b): "
<< ::maks(a,b)<< std::endl;
std::string
s="hai";
std::string
t="sayang";
// maks() untuk
dua nilai bertipe std::string
std::cout
<< "maks(s,t): "
<< ::maks(s,t)<< std::endl;
int* p1 = &b;
int* p2 = &a;
// maks() untuk
dua pointer
std::cout
<< "maks(p1,p2): "
<< ::maks(p1,p2)<< std::endl;
char const* s1 = "David";
char const* s2 = "Niko";
// maks() untuk
dua string-C
std::cout
<< "maks(s1,s2): "
<< ::maks(s1,s2)<< std::endl;
getch();
}
|
maks(a,b): 42
maks(s,t): sayang
maks(p1,p2): 0034F728
maks(s1,s2): Niko
4.
Tulislah sebuah program C++ untuk mendemonstrasikan
suatu template fungsi.
Penyelesaian:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
//templateFungsi.cpp
#include <iostream>
#include <conio.h>
using namespace std;
//Menukar nilai variabel1
dan variabel2.
template<class T>
void tukar_nilai(T& variabel1, T& variabel2)
{
T temp;
temp = variabel1;
variabel1 = variabel2;
variabel2 = temp;
}
int main( )
{
int
integer1 = 1, integer2 = 2;
cout << "Nilai-nilai integer yang asli adalah "
<< integer1 << "
" << integer2 << endl;
tukar_nilai(integer1, integer2);
cout << "Nilai-nilai integer hasil penukaran adalah "
<< integer1 << "
" << integer2 << endl;
char
simbol1 = 'A', simbol2 = 'B';
cout << "Nilai-nilai karakter yang asli adalah "
<< simbol1 << "
" << simbol2 << endl;
tukar_nilai(simbol1, simbol2);
cout << "Nilai-nilai karakter hasil penukaran adalah "
<< simbol1 << "
" << simbol2 << endl;
getch();
return
0;
}
|
Nilai-nilai integer yang asli adalah 1 2
Nilai-nilai integer hasil penukaran adalah 2 1
Nilai-nilai karakter yang asli adalah A B
Nilai-nilai karakter hasil penukaran adalah B A
5.
Tulislah sebuah program C++ untuk mendemonstrasikan
suatu fungsi pengurutan generik.
Penyelesaian:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
|
//templateFungsiPengurutan.cpp
//Mendemonstrasikan sebuah fungsi pengurutan generik.
#include
<iostream>
#include
<conio.h>
using namespace std;
template<class T>
void tukar_nilai(T& variabel1, T&
variabel2)
{
T temp;
temp = variabel1;
variabel1 =
variabel2;
variabel2 = temp;
}
template<class BaseType>
int indeks_terkecil(const BaseType a[], int indeks_awal, int jumlah_digunakan)
{
BaseType min = a[indeks_awal];
int indeks_min = indeks_awal;
for (int indeks = indeks_awal + 1; indeks < jumlah_digunakan;
indeks++)
if (a[indeks] < min)
{
min =
a[indeks];
indeks_min = indeks;
//min adalah
yang terkecil dari a[indeks_awal] sampai a[indeks]
}
return indeks_min;
}
template<class BaseType>
void urut(BaseType a[], int
jumlah_digunakan)
{
int indeks_dekat_terkecil;
for(int indeks = 0; indeks < jumlah_digunakan - 1; indeks++)
{//Menempatkan
nilai yang tepat pada a[indeks]:
indeks_dekat_terkecil =
indeks_terkecil(a, indeks, jumlah_digunakan);
tukar_nilai(a[indeks],
a[indeks_dekat_terkecil]);
}
}
int main( )
{
int i;
int a[10] = {9, 8, 7, 6, 5, 1, 2, 3,
0, 4};
cout <<
"Integer-integer tak-terurut:\n";
for (i = 0; i < 10; i++)
cout <<
a[i] << " ";
cout <<
endl;
urut(a, 10);
cout <<
"Dalam tatanan terurut,
integer-integer tersebut menjadi:\n";
for (i = 0; i < 10; i++)
cout <<
a[i] << " ";
cout <<
endl;
double b[5] = {5.5, 4.4, 1.1, 3.3,
2.2};
cout <<
"Double-double tak-terurut:\n";
for (i = 0; i < 5; i++)
cout <<
b[i] << " ";
cout <<
endl;
urut(b, 5);
cout <<
"Dalam tatanan terurut,
double-double tersebut menjadi:\n";
for (i = 0; i < 5; i++)
cout <<
b[i] << " ";
cout <<
endl;
char c[7] = {'G', 'E', 'N', 'E', 'R',
'I', 'K'};
cout <<
"Karakter-karakter tak-terurut:\n";
for (i = 0; i < 7; i++)
cout <<
c[i] << " ";
cout <<
endl;
urut(c, 7);
cout <<
"Dalam tatanan terurut,
karakter-karakter tersebut menjadi:\n";
for (i = 0; i < 7; i++)
cout <<
c[i] << " ";
cout <<
endl;
getch();
return 0;
}
|
Integer-integer tak-terurut:
9 8 7 6 5 1 2 3 0 4
Dalam tatanan terurut, integer-integer tersebut
menjadi:
0 1 2 3 4 5 6 7 8 9
Double-double tak-terurut:
5.5 4.4 1.1 3.3 2.2
Dalam tatanan terurut, double-double tersebut
menjadi:
1.1 2.2 3.3 4.4 5.5
Karakter-karakter tak-terurut:
G E N E R I K
Dalam tatanan terurut, karakter-karakter
tersebut menjadi:
E E G I K N R
6.
Tulislah sebuah
program C++ untuk mendemonstrasikan template array.
Penyelesaian:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
|
// templateArray.cpp
#include
<iostream>
#include
<conio.h>
const int
UkuranDefault = 10;
// mendeklarasikan kelas Binatang sederhana sehingga Anda
// menciptakan sebuah array yang memuat bianatang-binatang
class Binatang
{
public:
Binatang(int);
Binatang();
~Binatang() {}
int GetBerat() const { return
beratNya; }
void Tampil() const { std::cout << beratNya; }
private:
int beratNya;
};
Binatang::Binatang(int
berat):beratNya(berat)
{}
Binatang::Binatang():beratNya(0)
{}
template <class T> // mendeklarasikan array dan parameter
class Array // kelas yang sedang
diparameterisasi
{
public:
// konstruktor
Array(int ukuranNya = UkuranDefault);
Array(const Array &rhs);
~Array() { delete [] pType; }
// operator
Array&
operator=(const Array&);
T&
operator[](int offSet) { return pType[offSet]; }
const T& operator[](int offSet) const
{ return pType[offSet]; }
// aksesor
int GetUkuran() const { return
ukuranNya; }
private:
T *pType;
int ukuranNya;
};
// mengimplementasikan konstruktor
template <class T>
Array<T>::Array(int
ukuran):ukuranNya(ukuran)
{
pType = new T[ukuran];
// konstruktor
dari tipe yang Anda ciptakan
// harus
menetapkan nilai default
}
// konstruktor penyalin
template <class T>
Array<T>::Array(const
Array &rhs)
{
ukuranNya =
rhs.GetUkuran();
pType = new T[ukuranNya];
for (int i = 0; i<ukuranNya; i++)
pType[i] =
rhs[i];
}
// operator=
template <class T>
Array<T>& Array<T>::operator=(const Array &rhs)
{
if (this == &rhs)
return *this;
delete [] pType;
ukuranNya =
rhs.GetUkuran();
pType = new T[ukuranNya];
for (int i = 0; i<ukuranNya; i++)
pType[i] =
rhs[i];
return *this;
}
// program penguji
int main()
{
Array<int> arrayKu; // sebuah array yang
memuat integer-integer
Array<Binatang> kebunBinatang; // sebuah array yang memuat
Binatang-Binatang
Binatang
*pBinatang;
// mengisi array
for (int i = 0; i < arrayKu.GetUkuran(); i++)
{
arrayKu[i] =
i*2;
pBinatang = new Binatang(i*3);
kebunBinatang[i] = *pBinatang;
delete pBinatang;
}
// menampilkan
isi array
for (int j = 0; j < arrayKu.GetUkuran(); j++)
{
std::cout
<< "arrayKu["
<< j << "]:\t";
std::cout
<< arrayKu[j] <<
"\t\t";
std::cout
<< "kebunBinatang["
<< j << "]:\t";
kebunBinatang[j].Tampil();
std::cout
<< std::endl;
}
getch();
return 0;
}
|
arrayKu[0]:
0
kebunBinatang[0]: 0
arrayKu[1]:
2
kebunBinatang[1]: 3
arrayKu[2]:
4 kebunBinatang[2]: 6
arrayKu[3]:
6
kebunBinatang[3]: 9
arrayKu[4]:
8
kebunBinatang[4]: 12
arrayKu[5]:
10
kebunBinatang[5]: 15
arrayKu[6]:
12
kebunBinatang[6]: 18
arrayKu[7]:
14
kebunBinatang[7]: 21
arrayKu[8]:
16
kebunBinatang[8]: 24
arrayKu[9]:
18
kebunBinatang[9]: 27
7.
Adalah memungkinkan
untuk mendeklarasikan sembarang kelas atau fungsi yang menjadi friend dari
kelas template Anda. Setiap instans (objek) dari kelas tersebut akan
memperlakukan friend dengan sepantasnya, sama seperti pertemanan pada kehidupan
nyata. Tambahkanlah sebuah fungsi friend, CampurTangan(),
pada definisi template pada kelas Array pada soal nomor 6 tersebut.
Penyelesaian:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
// templateKelasFriend.cpp
#include
<iostream>
#include
<conio.h>
using namespace std;
const int
UkuranDefault = 10;
// mendeklarasikan kelas Binatang sederhana sehingga Anda
// menciptakan sebuah array yang memuat bianatang-binatang
class Binatang
{
public:
Binatang(int);
Binatang();
~Binatang() {}
int GetBerat() const { return
beratNya; }
void Tampil() const { std::cout << beratNya; }
private:
int beratNya;
};
Binatang::Binatang(int
berat):beratNya(berat)
{}
Binatang::Binatang():beratNya(0)
{}
template <class T> // mendeklarasikan array dan parameter
class Array // kelas yang sedang
diparameterisasi
{
public:
// konstruktor
Array(int ukuranNya = UkuranDefault);
Array(const Array &rhs);
~Array() { delete [] pType; }
// operator
Array&
operator=(const Array&);
T&
operator[](int offSet) { return pType[offSet]; }
const T& operator[](int offSet) const
{ return pType[offSet]; }
// aksesor
int GetUkuran() const { return
ukuranNya; }
// fungsi friend
friend void CampurTangan(Array<int>);
private:
T *pType;
int ukuranNya;
};
// fungsi friend. Tidak berupa fungsi template. Jadi, ia
hanya dapat dipakai
// dengan array int!.
void CampurTangan(Array<int> arrayMu)
{
cout <<
endl << "*** CampurTangan
***" << endl;
for (int i = 0; i < arrayMu.ukuranNya; i++)
cout <<
"i: " << arrayMu.pType[i] << endl;
cout <<
endl;
}
// mengimplementasikan konstruktor
template <class T>
Array<T>::Array(int
ukuran):ukuranNya(ukuran)
{
pType = new T[ukuran];
// konstruktor
dari tipe yang Anda ciptakan
// harus
menetapkan nilai default
}
// konstruktor penyalin
template <class T>
Array<T>::Array(const
Array &rhs)
{
ukuranNya =
rhs.GetUkuran();
pType = new T[ukuranNya];
for (int i = 0; i<ukuranNya; i++)
pType[i] =
rhs[i];
}
// operator=
template <class T>
Array<T>& Array<T>::operator=(const Array &rhs)
{
if (this == &rhs)
return *this;
delete [] pType;
ukuranNya =
rhs.GetUkuran();
pType = new T[ukuranNya];
for (int i = 0; i<ukuranNya; i++)
pType[i] =
rhs[i];
return *this;
}
// program penguji
int main()
{
Array<int> arrayKu; // sebuah array yang
memuat integer-integer
Array<Binatang> kebunBinatang; // sebuah array yang memuat
Binatang-Binatang
Binatang
*pBinatang;
// mengisi array
for (int i = 0; i < arrayKu.GetUkuran(); i++)
{
arrayKu[i] =
i*2;
pBinatang = new Binatang(i*3);
kebunBinatang[i] = *pBinatang;
}
int j;
for (j = 0; j
< arrayKu.GetUkuran(); j++)
{
cout <<
"kebunBinatang[" << j
<< "]:\t";
kebunBinatang[j].Tampil();
cout <<
endl;
}
cout <<
"Sekarang menggunakan fungsi
friend untuk";
cout <<
"mencari anggota-anggota dari
Array<int>";
CampurTangan(arrayKu);
cout <<
endl <<"Selesai."
<< endl;
getch();
return 0;
}
|
kebunBinatang[0]: 0
kebunBinatang[1]: 3
kebunBinatang[2]: 6
kebunBinatang[3]: 9
kebunBinatang[4]: 12
kebunBinatang[5]: 15
kebunBinatang[6]: 18
kebunBinatang[7]: 21
kebunBinatang[8]: 24
kebunBinatang[9]: 27
Sekarang menggunakan fungsi friend untukmencari
anggota-anggota dari Array<int>
*** CampurTangan ***
i: 0
i: 2
i: 4
i: 6
i: 8
i: 10
i: 12
i: 14
i: 16
i: 18
Selesai.
8.
Tambahkanlah fungsi
friend operator<< pada soal nomor 6 dan ujilah program tersebut.
Penyelesaian:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
// templateFriendOperator.cpp
#include
<iostream>
#include
<conio.h>
using namespace
std;
const int
UkuranDefault = 10;
// mendeklarasikan kelas Binatang sederhana sehingga Anda
// menciptakan sebuah array yang memuat bianatang-binatang
class Binatang
{
public:
Binatang(int);
Binatang();
~Binatang() {}
int GetBerat() const { return
beratNya; }
void Tampil() const { cout << beratNya; }
private:
int beratNya;
};
Binatang::Binatang(int
berat):beratNya(berat)
{}
Binatang::Binatang():beratNya(0)
{}
template <class T> // mendeklarasikan array dan parameter
class Array // kelas yang sedang
diparameterisasi
{
public:
// konstruktor
Array(int ukuranNya = UkuranDefault);
Array(const Array &rhs);
~Array() { delete [] pType; }
// operator
Array&
operator=(const Array&);
T&
operator[](int offSet) { return
pType[offSet]; }
const T& operator[](int offSet) const
{ return pType[offSet]; }
// aksesor
int GetUkuran() const { return
ukuranNya; }
template <class T>
friend ostream& operator<<
(ostream&, Array<T>&);
private:
T *pType;
int ukuranNya;
};
template <class T>
ostream& operator<< (ostream& keluaran, Array<T>& arrayMu)
{
for (int i = 0; i < arrayMu.ukuranNya; i++)
keluaran
<< "[" << i << "] " << arrayMu[i]
<< endl;
return keluaran;
}
// mengimplementasikan konstruktor
template <class T>
Array<T>::Array(int
ukuran):ukuranNya(ukuran)
{
pType = new T[ukuran];
for (int i = 0; i < ukuran; i++)
pType[i] = 0;
}
// konstruktor penyalin
template <class T>
Array<T>::Array(const
Array &rhs)
{
ukuranNya =
rhs.GetUkuran();
pType = new T[ukuranNya];
for (int i = 0; i<ukuranNya; i++)
pType[i] =
rhs[i];
}
// operator=
template <class T>
Array<T>& Array<T>::operator=(const Array &rhs)
{
if (this == &rhs)
return *this;
delete [] pType;
ukuranNya =
rhs.GetUkuran();
pType = new T[ukuranNya];
for (int i = 0; i<ukuranNya; i++)
pType[i] =
rhs[i];
return *this;
}
// program penguji
int main()
{
bool Berhenti = false; // bendera untuk loop
int offset, nilai;
Array<int>
arrayKu;
while (Berhenti == false)
{
cout <<
"Masukkan sebuah offset (0-9)
";
cout <<
"dan sebuah nilai. (-1 untuk
berhenti): ";
cin >>
offset >> nilai;
if (offset < 0)
break;
if (offset > 9)
{
cout
<< "***Gunakan nilai antara
0 dan 9.***\n";
continue;
}
arrayKu[offset] = nilai;
}
cout <<
"\nBerikut adalah isi array:\n";
cout <<
arrayKu << endl;
getch();
return 0;
}
|
Masukkan sebuah offset (0-9) dan sebuah nilai.
(-1 untuk berhenti): 1 10
Masukkan sebuah offset (0-9) dan sebuah nilai.
(-1 untuk berhenti): 2 20
Masukkan sebuah offset (0-9) dan sebuah nilai.
(-1 untuk berhenti): 3 30
Masukkan sebuah offset (0-9) dan sebuah nilai.
(-1 untuk berhenti): 4 40
Masukkan sebuah offset (0-9) dan sebuah nilai.
(-1 untuk berhenti): 5 50
Masukkan sebuah offset (0-9) dan sebuah nilai.
(-1 untuk berhenti): 6 60
Masukkan sebuah offset (0-9) dan sebuah nilai.
(-1 untuk berhenti): 7 70
Masukkan sebuah offset (0-9) dan sebuah nilai.
(-1 untuk berhenti): 8 80
Masukkan sebuah offset (0-9) dan sebuah nilai.
(-1 untuk berhenti): 9 90
Masukkan sebuah offset (0-9) dan sebuah nilai.
(-1 untuk berhenti): 10 10
***Gunakan nilai antara 0 dan 9.***
Masukkan sebuah offset (0-9) dan sebuah nilai.
(-1 untuk berhenti): -1 -1
Berikut adalah isi array:
[0] 0
[1] 10
[2] 20
[3] 30
[4] 40
[5] 50
[6] 60
[7] 70
[8] 80
[9] 90
9.
Anda dapat memperlakukan item-item template
seperti tipe lainnya. Anda dapat melewatkannya sebagai parameter, baik dengan
referensi atau dengan nilai, dan Anda dapat menjadikannya sebagai nilai balik
dari fungsi baik dengan nilai atau dengan referensi. Demonstrasikanlah hal ini.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
|
// templatePelewatanItem.cpp
#include
<iostream>
#include
<conio.h>
using namespace std;
const int
UkuranDefault = 10;
// mendeklarasikan kelas Binatang sederhana sehingga Anda
// menciptakan sebuah array yang memuat bianatang-binatang
class Binatang
{
public:
// konstruktor
Binatang(int);
Binatang();
~Binatang();
// aksesor
int GetBerat() const { return
beratNya; }
void SetBerat(int berat) { beratNya = berat; }
// operator frien
friend ostream& operator<<
(ostream&, const
Binatang&);
private:
int beratNya;
};
// operator ekstraksi untuk menampilkan binatang
ostream& operator<<
(ostream& aliran, const
Binatang& binatangKu)
{
aliran <<
binatangKu.GetBerat();
return aliran;
}
Binatang::Binatang(int
berat): beratNya(berat)
{
// cout <<
"Binatang(int)" << endl;
}
Binatang::Binatang(): beratNya(0)
{
// cout <<
"Binatang()" << endl;
}
Binatang::~Binatang()
{
// cout << "Menghancurkan sebuah
binatang..." << endl;
}
template <class T> // mendeklarasikan array dan parameter
class Array // kelas yang sedang
diparameterisasi
{
public:
// konstruktor
Array(int ukuranNya = UkuranDefault);
Array(const Array &rhs);
~Array() { delete
[] pType; }
// operator
Array&
operator=(const Array&);
T&
operator[](int offSet) { return pType[offSet]; }
const T& operator[](int offSet) const
{ return pType[offSet]; }
// aksesor
int GetUkuran() const { return
ukuranNya; }
template <class T>
friend ostream& operator<<
(ostream&, Array<T>&);
private:
T *pType;
int ukuranNya;
};
template <class T>
ostream& operator<< (ostream& keluaran,
Array<T>& arrayMu)
{
for (int i = 0; i < arrayMu.ukuranNya; i++)
keluaran
<< "[" << i << "] " << arrayMu[i]
<< endl;
return keluaran;
}
// mengimplementasikan konstruktor
template <class T>
Array<T>::Array(int
ukuran):ukuranNya(ukuran)
{
pType = new T[ukuran];
for (int i = 0; i < ukuran; i++)
pType[i] = 0;
}
// konstruktor penyalin
template <class T>
Array<T>::Array(const
Array &rhs)
{
ukuranNya =
rhs.GetUkuran();
pType = new T[ukuranNya];
for (int i = 0; i<ukuranNya; i++)
pType[i] = rhs[i];
}
// operator=
template <class T>
Array<T>& Array<T>::operator=(const Array
&rhs)
{
if (this == &rhs)
return *this;
delete [] pType;
ukuranNya =
rhs.GetUkuran();
pType = new T[ukuranNya];
for (int i = 0; i<ukuranNya; i++)
pType[i] =
rhs[i];
return *this;
}
void FungsiIsiInt(Array<int>& arrayKu);
void
FungsiIsiBinatang(Array<Binatang>& arrayKu);
// program penguji
int main()
{
Array<int> arrayInt;
Array<Binatang> arrayBinatang;
FungsiIsiInt(arrayInt);
FungsiIsiBinatang(arrayBinatang);
cout <<
"arrayInt...\n" <<
arrayInt;
cout <<
"\narrayBinatang...\n"
<< arrayBinatang << endl;
getch();
return 0;
}
void FungsiIsiInt(Array<int>& arrayKu)
{
bool Berhenti = false; // bendera untuk loop
int offset, nilai;
while (Berhenti == false)
{
cout <<
"Masukkan sebuah offset (0-9)
";
cout <<
"dan sebuah nilai. (-1 untuk
berhenti): ";
cin >>
offset >> nilai;
if (offset < 0)
break;
if (offset > 9)
{
cout
<< "***Gunakan nilai antara
0 dan 9.***\n";
continue;
}
arrayKu[offset] = nilai;
}
}
void
FungsiIsiBinatang(Array<Binatang>& arrayKu)
{
Binatang *
pBinatang;
for (int i = 0; i < arrayKu.GetUkuran(); i++)
{
pBinatang = new Binatang;
pBinatang->SetBerat(i*100);
arrayKu[i] =
*pBinatang;
delete pBinatang; // sebuah salinan
ditaruh ke dalam array
}
}
|
Masukkan sebuah offset (0-9) dan sebuah nilai.
(-1 untuk berhenti): 1 10
Masukkan sebuah offset (0-9) dan sebuah nilai.
(-1 untuk berhenti): 2 20
Masukkan sebuah offset (0-9) dan sebuah nilai.
(-1 untuk berhenti): 3 30
Masukkan sebuah offset (0-9) dan sebuah nilai.
(-1 untuk berhenti): 4 40
Masukkan sebuah offset (0-9) dan sebuah nilai.
(-1 untuk berhenti): 5 50
Masukkan sebuah offset (0-9) dan sebuah nilai.
(-1 untuk berhenti): 6 60
Masukkan sebuah offset (0-9) dan sebuah nilai.
(-1 untuk berhenti): 7 70
Masukkan sebuah offset (0-9) dan sebuah nilai.
(-1 untuk berhenti): 8 80
Masukkan sebuah offset (0-9) dan sebuah nilai.
(-1 untuk berhenti): 9 90
Masukkan sebuah offset (0-9) dan sebuah nilai.
(-1 untuk berhenti): 10 10
***Gunakan nilai antara 0 dan 9.***
Masukkan sebuah offset (0-9) dan sebuah nilai.
(-1 untuk berhenti): -1 -1
arrayInt...
[0] 0
[1] 10
[2] 20
[3] 30
[4] 40
[5] 50
[6] 60
[7] 70
[8] 80
[9] 90
arrayBinatang...
[0] 0
[1] 100
[2] 200
[3] 300
[4] 400
[5] 500
[6] 600
[7] 700
[8] 800
[9] 900
10.
Sediakanlah
implementasi eksplisit untuk kelas Binatang untuk menciptakan sebuah
spesialisasi atas template.
Penyelesaian:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
|
// templateSpesialisasi.cpp
#include
<iostream>
#include
<conio.h>
using namespace std;
const int
UkuranDefault = 3;
// mendeklarasikan kelas Binatang sederhana sehingga Anda
// menciptakan sebuah array yang memuat bianatang-binatang
class Binatang
{
public:
// konstruktor
Binatang(int);
Binatang();
~Binatang();
// aksesor
int GetBerat() const { return beratNya; }
void SetBerat(int berat) { beratNya = berat; }
// operator friend
friend ostream& operator<<
(ostream&, const
Binatang&);
private:
int beratNya;
};
// operator ekstraksi untuk menampilkan binatang
ostream& operator<<
(ostream& aliran, const
Binatang& binatangKu)
{
aliran <<
binatangKu.GetBerat();
return aliran;
}
Binatang::Binatang(int
berat): beratNya(berat)
{
cout <<
"Binatang(int)" <<
endl;
}
Binatang::Binatang(): beratNya(0)
{
cout <<
"Binatang()" <<
endl;
}
Binatang::~Binatang()
{
cout <<
"Menghancurkan sebuah binatang..."
<< endl;
}
template <class T> // mendeklarasikan array dan parameter
class Array // kelas yang sedang
diparameterisasi
{
public:
// konstruktor
Array(int ukuranNya = UkuranDefault);
Array(const Array &rhs);
~Array() { delete [] pType; }
// operator
Array& operator=(const Array&);
T&
operator[](int offSet) { return pType[offSet]; }
const T& operator[](int offSet) const
{ return pType[offSet]; }
// aksesor
int GetUkuran() const { return
ukuranNya; }
template <class T>
friend ostream& operator<<
(ostream&, Array<T>&);
private:
T *pType;
int ukuranNya;
};
template <class T>
Array<T>::Array(int
ukuran = UkuranDefault):
ukuranNya(ukuran)
{
pType = new T[ukuran];
for (int i = 0; i < ukuran; i++)
pType[i] =
(T)0;
}
// operator=
template <class T>
Array<T>& Array<T>::operator=(const Array &rhs)
{
if (this == &rhs)
return *this;
delete [] pType;
ukuranNya =
rhs.GetUkuran();
pType = new T[ukuranNya];
for (int i = 0; i<ukuranNya; i++)
pType[i] =
rhs[i];
return *this;
}
// konstruktor penyalin
template <class T>
Array<T>::Array(const
Array &rhs)
{
ukuranNya =
rhs.GetUkuran();
pType = new T[ukuranNya];
for (int i = 0; i<ukuranNya; i++)
pType[i] =
rhs[i];
}
template <class T>
ostream& operator<< (ostream& keluaran,
Array<T>& arrayMu)
{
for (int i = 0; i < arrayMu.ukuranNya; i++)
keluaran
<< "[" << i << "] " << arrayMu[i]
<< endl;
return keluaran;
}
Array<Binatang>::Array(int UkuranArrayBinatang):
ukuranNya(UkuranArrayBinatang)
{
pType = new Binatang[UkuranArrayBinatang];
}
void FungsiIsiInt(Array<int>& arrayKu);
void
FungsiIsiBinatang(Array<Binatang>& arrayKu);
// program penguji
int main()
{
Array<int> arrayInt;
Array<Binatang> arrayBinatang;
FungsiIsiInt(arrayInt);
FungsiIsiBinatang(arrayBinatang);
cout <<
"arrayInt...\n" <<
arrayInt;
cout <<
"\narrayBinatang...\n"
<< arrayBinatang << endl;
getch();
return 0;
}
void FungsiIsiInt(Array<int>& arrayKu)
{
bool Berhenti = false; // bendera untuk loop
int offset, nilai;
while (Berhenti == false)
{
cout <<
"Masukkan sebuah offset (0-9)
";
cout <<
"dan sebuah nilai. (-1 untuk
berhenti): ";
cin >>
offset >> nilai;
if (offset < 0)
break;
if (offset > 9)
{
cout
<< "***Gunakan nilai antara
0 dan 9.***\n";
continue;
}
arrayKu[offset] = nilai;
}
}
void
FungsiIsiBinatang(Array<Binatang>& arrayKu)
{
Binatang *
pBinatang;
for (int i = 0; i < arrayKu.GetUkuran(); i++)
{
pBinatang = new Binatang;
pBinatang->SetBerat(i*100);
arrayKu[i] =
*pBinatang;
delete pBinatang; // sebuah salinan
ditaruh ke dalam array
}
}
|
Binatang()
Binatang()
Binatang()
Masukkan sebuah offset (0-9) dan sebuah nilai.
(-1 untuk berhenti): 0 0
Masukkan sebuah offset (0-9) dan sebuah nilai.
(-1 untuk berhenti): 0 1
Masukkan sebuah offset (0-9) dan sebuah nilai.
(-1 untuk berhenti): 1 2
Masukkan sebuah offset (0-9) dan sebuah nilai.
(-1 untuk berhenti): 2 3
Masukkan sebuah offset (0-9) dan sebuah nilai.
(-1 untuk berhenti): -1 -1
Binatang()
Menghancurkan sebuah binatang...
Binatang()
Menghancurkan sebuah binatang...
Binatang()
Menghancurkan sebuah binatang...
arrayInt...
[0] 1
[1] 2
[2] 3
arrayBinatang...
[0] 0
[1] 100
[2] 200
11.
Template dapat mendeklarasikan anggota data
statis. Jika Anda menambahkan sebuah anggota statis pada kelas Array (misalnya,
sebuah kounter untuk menjejak berapa banyak array telah diciptakan), maka Anda
akan memiliki satu anggota statis untuk semua array Binatang dan satu lagi
untuk semua array integer. Demonstrasikanlah hal ini.
Penyelesaian:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
|
// templateAnggotaStatis.cpp
#include
<iostream>
#include
<conio.h>
using namespace std;
const int
UkuranDefault = 3;
// mendeklarasikan kelas Binatang sederhana sehingga Anda
// menciptakan sebuah array yang memuat bianatang-binatang
class Binatang
{
public:
// konstruktor
Binatang(int);
Binatang();
~Binatang();
// aksesor
int GetBerat() const { return
beratNya; }
void SetBerat(int berat) { beratNya = berat; }
// operator
friend
friend ostream& operator<<
(ostream&, const Binatang&);
private:
int beratNya;
};
// operator ekstraksi untuk menampilkan binatang
ostream& operator<<
(ostream& aliran, const
Binatang& binatangKu)
{
aliran <<
binatangKu.GetBerat();
return aliran;
}
Binatang::Binatang(int
berat): beratNya(berat)
{
cout <<
"Binatang(int)" <<
endl;
}
Binatang::Binatang(): beratNya(0)
{
cout <<
"Binatang()" <<
endl;
}
Binatang::~Binatang()
{
cout <<
"Menghancurkan sebuah binatang..."
<< endl;
}
template <class T> // mendeklarasikan array dan parameter
class Array // kelas yang sedang
diparameterisasi
{
public:
// konstruktor
Array(int ukuranNya = UkuranDefault);
Array(const Array &rhs);
~Array() { delete [] pType; }
// operator
Array&
operator=(const Array&);
T&
operator[](int offSet) { return pType[offSet]; }
const T& operator[](int offSet) const
{ return pType[offSet]; }
// aksesor
int GetUkuran() const { return
ukuranNya; }
static int GetJumlahArray() { return jumlahArrayNya; }
template <class T>
friend ostream& operator<<
(ostream&, Array<T>&);
private:
T *pType;
int ukuranNya;
static int jumlahArrayNya;
};
template <class T>
int Array<T>::jumlahArrayNya = 0;
template <class T>
Array<T>::Array(int
ukuran = UkuranDefault):
ukuranNya(ukuran)
{
pType = new T[ukuran];
for (int i = 0; i < ukuran; i++)
pType[i] =
(T)0;
jumlahArrayNya++;
}
// operator=
template <class T>
Array<T>& Array<T>::operator=(const Array &rhs)
{
if (this == &rhs)
return *this;
delete [] pType;
ukuranNya =
rhs.GetUkuran();
pType = new T[ukuranNya];
for (int i = 0; i<ukuranNya; i++)
pType[i] =
rhs[i];
return *this;
}
// konstruktor penyalin
template <class T>
Array<T>::Array(const
Array &rhs)
{
ukuranNya =
rhs.GetUkuran();
pType = new T[ukuranNya];
for (int i = 0; i<ukuranNya; i++)
pType[i] =
rhs[i];
jumlahArrayNya++;
}
template <class T>
ostream& operator<< (ostream& keluaran,
Array<T>& arrayMu)
{
for (int i = 0; i < arrayMu.ukuranNya; i++)
keluaran
<< "[" << i << "] " << arrayMu[i]
<< endl;
return keluaran;
}
// program penguji
int main()
{
cout <<
Array<int>::GetJumlahArray()
<< " array integer\n";
cout <<
Array<Binatang>::GetJumlahArray();
cout <<
" array binatang" << endl << endl;
Array<int> arrayInt;
Array<Binatang> arrayBinatang;
cout <<
arrayInt.GetJumlahArray() << " array integer\n";
cout <<
arrayBinatang.GetJumlahArray();
cout <<
" array binatang" << endl << endl;
Array<int>
*pArrayInt = new Array<int>;
cout <<
Array<int>::GetJumlahArray()
<< " array integer\n";
cout <<
Array<Binatang>::GetJumlahArray();
cout <<
" array binatang" << endl << endl;
delete pArrayInt;
cout <<
Array<int>::GetJumlahArray()
<< " array integer\n";
cout <<
Array<Binatang>::GetJumlahArray();
cout <<
" array binatang" << endl << endl;
getch();
return 0;
}
|
0 array integer
0 array binatang
Binatang()
Binatang()
Binatang()
Binatang(int)
Menghancurkan sebuah binatang...
Binatang(int)
Menghancurkan sebuah binatang...
Binatang(int)
Menghancurkan sebuah binatang...
1 array integer
1 array binatang
2 array integer
1 array binatang
2 array integer
1 array binatang
No comments:
Post a Comment